1 ; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s 2 3 declare i32 @ret32(i32 returned) 4 declare i64 @ret64(i64 returned) 5 6 define i64 @test1(i64 %val) { 7 ; CHECK-LABEL: test1: 8 ; CHECK-NOT: jmp 9 ; CHECK: callq 10 %in = trunc i64 %val to i32 11 tail call i32 @ret32(i32 returned %in) 12 ret i64 %val 13 } 14 15 define i32 @test2(i64 %val) { 16 ; CHECK-LABEL: test2: 17 ; CHECK: jmp 18 ; CHECK-NOT: callq 19 %in = trunc i64 %val to i32 20 tail call i64 @ret64(i64 returned %val) 21 ret i32 %in 22 } 23 24 define i32 @test3(i64 %in) { 25 ; CHECK-LABEL: test3: 26 ; CHECK: jmp 27 ; CHECK-NOT: callq 28 %small = trunc i64 %in to i32 29 tail call i32 @ret32(i32 returned %small) 30 ret i32 %small 31 } 32 33 declare {i32, i8} @take_i32_i8({i32, i8} returned) 34 define { i8, i8 } @test_nocommon_value({i32, i32} %in) { 35 ; CHECK-LABEL: test_nocommon_value 36 ; CHECK: jmp 37 38 %first = extractvalue {i32, i32} %in, 0 39 %first.trunc = trunc i32 %first to i8 40 41 %second = extractvalue {i32, i32} %in, 1 42 %second.trunc = trunc i32 %second to i8 43 44 %tmp = insertvalue {i32, i8} undef, i32 %first, 0 45 %callval = insertvalue {i32, i8} %tmp, i8 %second.trunc, 1 46 tail call {i32, i8} @take_i32_i8({i32, i8} returned %callval) 47 48 %restmp = insertvalue {i8, i8} undef, i8 %first.trunc, 0 49 %res = insertvalue {i8, i8} %restmp, i8 %second.trunc, 1 50 ret {i8, i8} %res 51 } 52 53 declare {i32, {i32, i32}} @give_i32_i32_i32() 54 define {{i32, i32}, i32} @test_structs_different_shape() { 55 ; CHECK-LABEL: test_structs_different_shape 56 ; CHECK: jmp 57 %val = tail call {i32, {i32, i32}} @give_i32_i32_i32() 58 59 %first = extractvalue {i32, {i32, i32}} %val, 0 60 %second = extractvalue {i32, {i32, i32}} %val, 1, 0 61 %third = extractvalue {i32, {i32, i32}} %val, 1, 1 62 63 %restmp = insertvalue {{i32, i32}, i32} undef, i32 %first, 0, 0 64 %reseventmper = insertvalue {{i32, i32}, i32} %restmp, i32 %second, 0, 1 65 %res = insertvalue {{i32, i32}, i32} %reseventmper, i32 %third, 1 66 67 ret {{i32, i32}, i32} %res 68 } 69 70 define i64 @test_undef_asymmetry() { 71 ; CHECK: test_undef_asymmetry 72 ; CHECK-NOT: jmp 73 tail call i64 @ret64(i64 returned undef) 74 ret i64 2 75 } 76 77 define {{}, {{}, i32, {}}, [1 x i32]} @evil_empty_aggregates() { 78 ; CHECK-LABEL: evil_empty_aggregates 79 ; CHECK: jmp 80 %agg = tail call {i32, {i32, i32}} @give_i32_i32_i32() 81 82 %first = extractvalue {i32, {i32, i32}} %agg, 0 83 %second = extractvalue {i32, {i32, i32}} %agg, 1, 0 84 85 %restmp = insertvalue {{}, {{}, i32, {}}, [1 x i32]} undef, i32 %first, 1, 1 86 %res = insertvalue {{}, {{}, i32, {}}, [1 x i32]} %restmp, i32 %second, 2, 0 87 ret {{}, {{}, i32, {}}, [1 x i32]} %res 88 } 89 90 define i32 @structure_is_unimportant() { 91 ; CHECK-LABEL: structure_is_unimportant 92 ; CHECK: jmp 93 %val = tail call {i32, {i32, i32}} @give_i32_i32_i32() 94 95 %res = extractvalue {i32, {i32, i32}} %val, 0 96 ret i32 %res 97 } 98