1*b720a6baSSaleem Abdulrasool; RUN: llc < %s -mtriple=armv7 | FileCheck %s 2cc2e903bSTim Northover 3cc2e903bSTim Northoverdeclare i16 @ret16(i16 returned) 4cc2e903bSTim Northoverdeclare i32 @ret32(i32 returned) 5cc2e903bSTim Northover 6cc2e903bSTim Northoverdefine i32 @test1(i32 %val) { 7cc2e903bSTim Northover; CHECK-LABEL: test1: 8cc2e903bSTim Northover; CHECK: bl {{_?}}ret16 9cc2e903bSTim Northover %in = trunc i32 %val to i16 10cc2e903bSTim Northover tail call i16 @ret16(i16 returned %in) 11cc2e903bSTim Northover ret i32 %val 12cc2e903bSTim Northover} 13cc2e903bSTim Northover 14cc2e903bSTim Northoverdefine i16 @test2(i32 %val) { 15cc2e903bSTim Northover; CHECK-LABEL: test2: 16cc2e903bSTim Northover; CHECK: b {{_?}}ret16 17cc2e903bSTim Northover %in = trunc i32 %val to i16 18cc2e903bSTim Northover tail call i16 @ret16(i16 returned %in) 19cc2e903bSTim Northover ret i16 %in 20cc2e903bSTim Northover} 21cc2e903bSTim Northover 22cc2e903bSTim Northoverdeclare {i32, i8} @take_i32_i8({i32, i8} returned) 23cc2e903bSTim Northoverdefine { i8, i8 } @test_nocommon_value({i32, i32} %in) { 24cc2e903bSTim Northover; CHECK-LABEL: test_nocommon_value: 25cc2e903bSTim Northover; CHECK: b {{_?}}take_i32_i8 26cc2e903bSTim Northover 27cc2e903bSTim Northover %first = extractvalue {i32, i32} %in, 0 28cc2e903bSTim Northover %first.trunc = trunc i32 %first to i8 29cc2e903bSTim Northover 30cc2e903bSTim Northover %second = extractvalue {i32, i32} %in, 1 31cc2e903bSTim Northover %second.trunc = trunc i32 %second to i8 32cc2e903bSTim Northover 33cc2e903bSTim Northover %tmp = insertvalue {i32, i8} undef, i32 %first, 0 34cc2e903bSTim Northover %callval = insertvalue {i32, i8} %tmp, i8 %second.trunc, 1 35cc2e903bSTim Northover tail call {i32, i8} @take_i32_i8({i32, i8} returned %callval) 36cc2e903bSTim Northover 37cc2e903bSTim Northover %restmp = insertvalue {i8, i8} undef, i8 %first.trunc, 0 38cc2e903bSTim Northover %res = insertvalue {i8, i8} %restmp, i8 %second.trunc, 1 39cc2e903bSTim Northover ret {i8, i8} %res 40cc2e903bSTim Northover} 41cc2e903bSTim Northover 42cc2e903bSTim Northoverdeclare {i32, {i32, i32}} @give_i32_i32_i32() 43cc2e903bSTim Northoverdefine {{i32, i32}, i32} @test_structs_different_shape() { 44cc2e903bSTim Northover; CHECK-LABEL: test_structs_different_shape: 45cc2e903bSTim Northover; CHECK: b {{_?}}give_i32_i32_i32 46cc2e903bSTim Northover %val = tail call {i32, {i32, i32}} @give_i32_i32_i32() 47cc2e903bSTim Northover 48cc2e903bSTim Northover %first = extractvalue {i32, {i32, i32}} %val, 0 49cc2e903bSTim Northover %second = extractvalue {i32, {i32, i32}} %val, 1, 0 50cc2e903bSTim Northover %third = extractvalue {i32, {i32, i32}} %val, 1, 1 51cc2e903bSTim Northover 52cc2e903bSTim Northover %restmp = insertvalue {{i32, i32}, i32} undef, i32 %first, 0, 0 53cc2e903bSTim Northover %reseventmper = insertvalue {{i32, i32}, i32} %restmp, i32 %second, 0, 1 54cc2e903bSTim Northover %res = insertvalue {{i32, i32}, i32} %reseventmper, i32 %third, 1 55cc2e903bSTim Northover 56cc2e903bSTim Northover ret {{i32, i32}, i32} %res 57cc2e903bSTim Northover} 58cc2e903bSTim Northover 59cc2e903bSTim Northoverdefine i32 @test_undef_asymmetry() { 60cc2e903bSTim Northover; CHECK: test_undef_asymmetry: 61cc2e903bSTim Northover; CHECK: bl {{_?}}ret32 62cc2e903bSTim Northover; CHECK-NOT: jmp 63cc2e903bSTim Northover tail call i32 @ret32(i32 returned undef) 64cc2e903bSTim Northover ret i32 2 65cc2e903bSTim Northover} 66cc2e903bSTim Northover 67cc2e903bSTim Northoverdefine {{}, {{}, i32, {}}, [1 x i32]} @evil_empty_aggregates() { 68cc2e903bSTim Northover; CHECK-LABEL: evil_empty_aggregates: 69cc2e903bSTim Northover; CHECK: b {{_?}}give_i32_i32_i32 70cc2e903bSTim Northover %agg = tail call {i32, {i32, i32}} @give_i32_i32_i32() 71cc2e903bSTim Northover 72cc2e903bSTim Northover %first = extractvalue {i32, {i32, i32}} %agg, 0 73cc2e903bSTim Northover %second = extractvalue {i32, {i32, i32}} %agg, 1, 0 74cc2e903bSTim Northover 75cc2e903bSTim Northover %restmp = insertvalue {{}, {{}, i32, {}}, [1 x i32]} undef, i32 %first, 1, 1 76cc2e903bSTim Northover %res = insertvalue {{}, {{}, i32, {}}, [1 x i32]} %restmp, i32 %second, 2, 0 77cc2e903bSTim Northover ret {{}, {{}, i32, {}}, [1 x i32]} %res 78cc2e903bSTim Northover} 79cc2e903bSTim Northover 80cc2e903bSTim Northoverdefine i32 @structure_is_unimportant() { 81cc2e903bSTim Northover; CHECK-LABEL: structure_is_unimportant: 82cc2e903bSTim Northover; CHECK: b {{_?}}give_i32_i32_i32 83cc2e903bSTim Northover %val = tail call {i32, {i32, i32}} @give_i32_i32_i32() 84cc2e903bSTim Northover 85cc2e903bSTim Northover %res = extractvalue {i32, {i32, i32}} %val, 0 86cc2e903bSTim Northover ret i32 %res 87cc2e903bSTim Northover} 88cc2e903bSTim Northover 89cc2e903bSTim Northoverdeclare i64 @give_i64() 90cc2e903bSTim Northoverdefine i64 @direct_i64_ok() { 91cc2e903bSTim Northover; CHECK-LABEL: direct_i64_ok: 92cc2e903bSTim Northover; CHECK: b {{_?}}give_i64 93cc2e903bSTim Northover %val = tail call i64 @give_i64() 94cc2e903bSTim Northover ret i64 %val 95cc2e903bSTim Northover} 96cc2e903bSTim Northover 97cc2e903bSTim Northoverdeclare {i64, i32} @give_i64_i32() 98cc2e903bSTim Northoverdefine {i32, i32} @trunc_i64_not_ok() { 99cc2e903bSTim Northover; CHECK-LABEL: trunc_i64_not_ok: 100cc2e903bSTim Northover; CHECK: bl {{_?}}give_i64_i32 101cc2e903bSTim Northover %agg = tail call {i64, i32} @give_i64_i32() 102cc2e903bSTim Northover 103cc2e903bSTim Northover %first = extractvalue {i64, i32} %agg, 0 104cc2e903bSTim Northover %second = extractvalue {i64, i32} %agg, 1 105cc2e903bSTim Northover %first.trunc = trunc i64 %first to i32 106cc2e903bSTim Northover 107cc2e903bSTim Northover %tmp = insertvalue {i32, i32} undef, i32 %first.trunc, 0 108cc2e903bSTim Northover %ret = insertvalue {i32, i32} %tmp, i32 %second, 1 109cc2e903bSTim Northover 110cc2e903bSTim Northover ret {i32, i32} %ret 111cc2e903bSTim Northover} 112