112 lines · plain
1; RUN: llc < %s -mtriple=armv7 | FileCheck %s2 3declare i16 @ret16(i16 returned)4declare i32 @ret32(i32 returned)5 6define i32 @test1(i32 %val) {7; CHECK-LABEL: test1:8; CHECK: bl {{_?}}ret169 %in = trunc i32 %val to i1610 tail call i16 @ret16(i16 returned %in)11 ret i32 %val12}13 14define i16 @test2(i32 %val) {15; CHECK-LABEL: test2:16; CHECK: b {{_?}}ret1617 %in = trunc i32 %val to i1618 tail call i16 @ret16(i16 returned %in)19 ret i16 %in20}21 22declare {i32, i8} @take_i32_i8({i32, i8} returned)23define { i8, i8 } @test_nocommon_value({i32, i32} %in) {24; CHECK-LABEL: test_nocommon_value:25; CHECK: b {{_?}}take_i32_i826 27 %first = extractvalue {i32, i32} %in, 028 %first.trunc = trunc i32 %first to i829 30 %second = extractvalue {i32, i32} %in, 131 %second.trunc = trunc i32 %second to i832 33 %tmp = insertvalue {i32, i8} undef, i32 %first, 034 %callval = insertvalue {i32, i8} %tmp, i8 %second.trunc, 135 tail call {i32, i8} @take_i32_i8({i32, i8} returned %callval)36 37 %restmp = insertvalue {i8, i8} undef, i8 %first.trunc, 038 %res = insertvalue {i8, i8} %restmp, i8 %second.trunc, 139 ret {i8, i8} %res40}41 42declare {i32, {i32, i32}} @give_i32_i32_i32()43define {{i32, i32}, i32} @test_structs_different_shape() {44; CHECK-LABEL: test_structs_different_shape:45; CHECK: b {{_?}}give_i32_i32_i3246 %val = tail call {i32, {i32, i32}} @give_i32_i32_i32()47 48 %first = extractvalue {i32, {i32, i32}} %val, 049 %second = extractvalue {i32, {i32, i32}} %val, 1, 050 %third = extractvalue {i32, {i32, i32}} %val, 1, 151 52 %restmp = insertvalue {{i32, i32}, i32} undef, i32 %first, 0, 053 %reseventmper = insertvalue {{i32, i32}, i32} %restmp, i32 %second, 0, 154 %res = insertvalue {{i32, i32}, i32} %reseventmper, i32 %third, 155 56 ret {{i32, i32}, i32} %res57}58 59define i32 @test_undef_asymmetry() {60; CHECK: test_undef_asymmetry:61; CHECK: bl {{_?}}ret3262; CHECK-NOT: jmp63 tail call i32 @ret32(i32 returned undef)64 ret i32 265}66 67define {{}, {{}, i32, {}}, [1 x i32]} @evil_empty_aggregates() {68; CHECK-LABEL: evil_empty_aggregates:69; CHECK: b {{_?}}give_i32_i32_i3270 %agg = tail call {i32, {i32, i32}} @give_i32_i32_i32()71 72 %first = extractvalue {i32, {i32, i32}} %agg, 073 %second = extractvalue {i32, {i32, i32}} %agg, 1, 074 75 %restmp = insertvalue {{}, {{}, i32, {}}, [1 x i32]} undef, i32 %first, 1, 176 %res = insertvalue {{}, {{}, i32, {}}, [1 x i32]} %restmp, i32 %second, 2, 077 ret {{}, {{}, i32, {}}, [1 x i32]} %res78}79 80define i32 @structure_is_unimportant() {81; CHECK-LABEL: structure_is_unimportant:82; CHECK: b {{_?}}give_i32_i32_i3283 %val = tail call {i32, {i32, i32}} @give_i32_i32_i32()84 85 %res = extractvalue {i32, {i32, i32}} %val, 086 ret i32 %res87}88 89declare i64 @give_i64()90define i64 @direct_i64_ok() {91; CHECK-LABEL: direct_i64_ok:92; CHECK: b {{_?}}give_i6493 %val = tail call i64 @give_i64()94 ret i64 %val95}96 97declare {i64, i32} @give_i64_i32()98define {i32, i32} @trunc_i64_not_ok() {99; CHECK-LABEL: trunc_i64_not_ok:100; CHECK: bl {{_?}}give_i64_i32101 %agg = tail call {i64, i32} @give_i64_i32()102 103 %first = extractvalue {i64, i32} %agg, 0104 %second = extractvalue {i64, i32} %agg, 1105 %first.trunc = trunc i64 %first to i32106 107 %tmp = insertvalue {i32, i32} undef, i32 %first.trunc, 0108 %ret = insertvalue {i32, i32} %tmp, i32 %second, 1109 110 ret {i32, i32} %ret111}112