xref: /llvm-project/llvm/test/CodeGen/ARM/returned-trunc-tail-calls.ll (revision b720a6bab7b81705a8510d01ea2684234369200a)
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