xref: /llvm-project/llvm/test/CodeGen/ARM/fp16-return-pr60510.ll (revision eeb4fe093dbd9a990c957fe1e4ab3b62689885e0)
1c3146671SArchibald Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "(\.v?save|push|pop)"
2c3146671SArchibald Elliott
3c3146671SArchibald Elliott; No FP16/BF16
4c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT
5c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT
6c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT
7c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-SOFT
8c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-HARD
9c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8.2-a,+fp-armv8,-fullfp16,-bf16,-neon %s -o - | FileCheck %s --check-prefixes=NO-FP16-HARD
10c3146671SArchibald Elliott
11c3146671SArchibald Elliott; FP16/BF16
12c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT
13c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -float-abi=soft -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT
14c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabi -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT
15c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabi -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-SOFT
16c3146671SArchibald Elliott; RUN: llc -mtriple=arm-none-eabihf -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-HARD
17c3146671SArchibald Elliott; RUN: llc -mtriple=thumb-none-eabihf -mattr=+armv8.2-a,+fp-armv8,+fullfp16,+bf16,-neon %s -o - | FileCheck %s --check-prefixes=FP16-HARD
18c3146671SArchibald Elliott
19c3146671SArchibald Elliott; PR60510 showed a bug where the return from `*_inner` was getting "lost" by an
20c3146671SArchibald Elliott; optimisation, and a garbage value was being left in `s0`.
21c3146671SArchibald Elliott
22c3146671SArchibald Elliottdeclare dso_local float @other(float) nounwind
23c3146671SArchibald Elliottdeclare dso_local void @fp16_sink(half) nounwind
24c3146671SArchibald Elliottdeclare dso_local void @bf16_sink(bfloat) nounwind
25c3146671SArchibald Elliott
26*eeb4fe09SArchibald Elliottdeclare dso_local half @fp16_inner() nounwind
27c3146671SArchibald Elliottdeclare dso_local bfloat @bf_inner() nounwind
28c3146671SArchibald Elliott
29c3146671SArchibald Elliottdefine half @fp16_out_call_oneuse(float %arg) nounwind {
30c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: fp16_out_call_oneuse:
31c3146671SArchibald Elliott; NO-FP16-SOFT:  @ %bb.0:
32c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r4, r0
33c3146671SArchibald Elliott; NO-FP16-SOFT:    bl fp16_inner
34c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r5, r0
35c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r4
36c3146671SArchibald Elliott; NO-FP16-SOFT:    bl other
37c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r5
38c3146671SArchibald Elliott;
39c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: fp16_out_call_oneuse:
40c3146671SArchibald Elliott; NO-FP16-HARD:  @ %bb.0:
41c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s16, s0
42c3146671SArchibald Elliott; NO-FP16-HARD:    bl fp16_inner
43c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s18, s0
44c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s16
45c3146671SArchibald Elliott; NO-FP16-HARD:    bl other
46c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s18
47c3146671SArchibald Elliott;
48c3146671SArchibald Elliott; FP16-SOFT-LABEL: fp16_out_call_oneuse:
49c3146671SArchibald Elliott; FP16-SOFT:  @ %bb.0:
50c3146671SArchibald Elliott; FP16-SOFT:    mov r4, r0
51c3146671SArchibald Elliott; FP16-SOFT:    bl fp16_inner
52c3146671SArchibald Elliott; FP16-SOFT:    mov r5, r0
53c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r4
54c3146671SArchibald Elliott; FP16-SOFT:    bl other
55c3146671SArchibald Elliott; FP16-SOFT:    vmov.f16 s0, r5
56c3146671SArchibald Elliott; FP16-SOFT:    vmov r0, s0
57c3146671SArchibald Elliott;
58c3146671SArchibald Elliott; FP16-HARD-LABEL: fp16_out_call_oneuse:
59c3146671SArchibald Elliott; FP16-HARD:  @ %bb.0:
60c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s16, s0
61c3146671SArchibald Elliott; FP16-HARD:    bl fp16_inner
62b189218dSArchibald Elliott; FP16-HARD:    vmov.f32 s18, s0
63c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s16
64c3146671SArchibald Elliott; FP16-HARD:    bl other
65b189218dSArchibald Elliott; FP16-HARD:    vmov.f32 s0, s18
66c3146671SArchibald Elliott  %call = call half @fp16_inner()
67c3146671SArchibald Elliott  %call1 = call float @other(float %arg)
68c3146671SArchibald Elliott  ret half %call
69c3146671SArchibald Elliott}
70c3146671SArchibald Elliott
71c3146671SArchibald Elliottdefine half @fp16_out_call_multiuse(float %arg) nounwind {
72c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: fp16_out_call_multiuse:
73c3146671SArchibald Elliott; NO-FP16-SOFT:  @ %bb.0:
74c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r4, r0
75c3146671SArchibald Elliott; NO-FP16-SOFT:    bl fp16_inner
76c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r5, r0
77c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r4
78c3146671SArchibald Elliott; NO-FP16-SOFT:    bl other
79c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r5
80c3146671SArchibald Elliott; NO-FP16-SOFT:    bl fp16_sink
81c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r5
82c3146671SArchibald Elliott;
83c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: fp16_out_call_multiuse:
84c3146671SArchibald Elliott; NO-FP16-HARD:  @ %bb.0:
85c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s16, s0
86c3146671SArchibald Elliott; NO-FP16-HARD:    bl fp16_inner
87c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s18, s0
88c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s16
89c3146671SArchibald Elliott; NO-FP16-HARD:    bl other
90c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s18
91c3146671SArchibald Elliott; NO-FP16-HARD:    bl fp16_sink
92c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s18
93c3146671SArchibald Elliott;
94c3146671SArchibald Elliott; FP16-SOFT-LABEL: fp16_out_call_multiuse:
95c3146671SArchibald Elliott; FP16-SOFT:  @ %bb.0:
96c3146671SArchibald Elliott; FP16-SOFT:    mov r4, r0
97c3146671SArchibald Elliott; FP16-SOFT:    bl fp16_inner
98c3146671SArchibald Elliott; FP16-SOFT:    mov r5, r0
99c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r4
100c3146671SArchibald Elliott; FP16-SOFT:    bl other
101c3146671SArchibald Elliott; FP16-SOFT:    vmov.f16 s16, r5
102c3146671SArchibald Elliott; FP16-SOFT:    vmov.f16 r0, s16
103c3146671SArchibald Elliott; FP16-SOFT:    bl fp16_sink
104c3146671SArchibald Elliott; FP16-SOFT:    vmov r0, s16
105c3146671SArchibald Elliott;
106c3146671SArchibald Elliott; FP16-HARD-LABEL: fp16_out_call_multiuse:
107c3146671SArchibald Elliott; FP16-HARD:  @ %bb.0:
108c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s16, s0
109c3146671SArchibald Elliott; FP16-HARD:    bl fp16_inner
110b189218dSArchibald Elliott; FP16-HARD:    vmov.f32 s18, s0
111c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s16
112c3146671SArchibald Elliott; FP16-HARD:    bl other
113b189218dSArchibald Elliott; FP16-HARD:    vmov.f16 r0, s18
114c3146671SArchibald Elliott; FP16-HARD:    vmov s0, r0
115c3146671SArchibald Elliott; FP16-HARD:    bl fp16_sink
116b189218dSArchibald Elliott; FP16-HARD:    vmov.f32 s0, s18
117c3146671SArchibald Elliott  %call = call half @fp16_inner()
118c3146671SArchibald Elliott  %call1 = call float @other(float %arg)
119c3146671SArchibald Elliott  call void @fp16_sink(half %call)
120c3146671SArchibald Elliott  ret half %call
121c3146671SArchibald Elliott}
122c3146671SArchibald Elliott
123c3146671SArchibald Elliottdefine bfloat @bf_out_call_oneuse(float %arg) nounwind {
124c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: bf_out_call_oneuse:
125c3146671SArchibald Elliott; NO-FP16-SOFT:  @ %bb.0:
126c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r4, r0
127c3146671SArchibald Elliott; NO-FP16-SOFT:    bl bf_inner
128c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r5, r0
129c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r4
130c3146671SArchibald Elliott; NO-FP16-SOFT:    bl other
131c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r5
132c3146671SArchibald Elliott;
133c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: bf_out_call_oneuse:
134c3146671SArchibald Elliott; NO-FP16-HARD:  @ %bb.0:
135c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s16, s0
136c3146671SArchibald Elliott; NO-FP16-HARD:    bl bf_inner
137c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s18, s0
138c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s16
139c3146671SArchibald Elliott; NO-FP16-HARD:    bl other
140c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s18
141c3146671SArchibald Elliott;
142c3146671SArchibald Elliott; FP16-SOFT-LABEL: bf_out_call_oneuse:
143c3146671SArchibald Elliott; FP16-SOFT:  @ %bb.0:
144c3146671SArchibald Elliott; FP16-SOFT:    mov r4, r0
145c3146671SArchibald Elliott; FP16-SOFT:    bl bf_inner
146c3146671SArchibald Elliott; FP16-SOFT:    mov r5, r0
147c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r4
148c3146671SArchibald Elliott; FP16-SOFT:    bl other
149c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r5
150c3146671SArchibald Elliott;
151c3146671SArchibald Elliott; FP16-HARD-LABEL: bf_out_call_oneuse:
152c3146671SArchibald Elliott; FP16-HARD:  @ %bb.0:
153c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s16, s0
154c3146671SArchibald Elliott; FP16-HARD:    bl bf_inner
155c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s18, s0
156c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s16
157c3146671SArchibald Elliott; FP16-HARD:    bl other
158c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s18
159c3146671SArchibald Elliott  %call = call bfloat @bf_inner()
160c3146671SArchibald Elliott  %call1 = call float @other(float %arg)
161c3146671SArchibald Elliott  ret bfloat %call
162c3146671SArchibald Elliott}
163c3146671SArchibald Elliott
164c3146671SArchibald Elliottdefine bfloat @bf_out_call_multiuse(float %arg) nounwind {
165c3146671SArchibald Elliott; NO-FP16-SOFT-LABEL: bf_out_call_multiuse:
166c3146671SArchibald Elliott; NO-FP16-SOFT:  @ %bb.0:
167c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r4, r0
168c3146671SArchibald Elliott; NO-FP16-SOFT:    bl bf_inner
169c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r5, r0
170c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r4
171c3146671SArchibald Elliott; NO-FP16-SOFT:    bl other
172c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r5
173c3146671SArchibald Elliott; NO-FP16-SOFT:    bl bf16_sink
174c3146671SArchibald Elliott; NO-FP16-SOFT:    mov r0, r5
175c3146671SArchibald Elliott;
176c3146671SArchibald Elliott; NO-FP16-HARD-LABEL: bf_out_call_multiuse:
177c3146671SArchibald Elliott; NO-FP16-HARD:  @ %bb.0:
178c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s16, s0
179c3146671SArchibald Elliott; NO-FP16-HARD:    bl bf_inner
180c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s18, s0
181c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s16
182c3146671SArchibald Elliott; NO-FP16-HARD:    bl other
183c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s18
184c3146671SArchibald Elliott; NO-FP16-HARD:    bl bf16_sink
185c3146671SArchibald Elliott; NO-FP16-HARD:    vmov.f32 s0, s18
186c3146671SArchibald Elliott;
187c3146671SArchibald Elliott; FP16-SOFT-LABEL: bf_out_call_multiuse:
188c3146671SArchibald Elliott; FP16-SOFT:  @ %bb.0:
189c3146671SArchibald Elliott; FP16-SOFT:    mov r4, r0
190c3146671SArchibald Elliott; FP16-SOFT:    bl bf_inner
191c3146671SArchibald Elliott; FP16-SOFT:    mov r5, r0
192c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r4
193c3146671SArchibald Elliott; FP16-SOFT:    bl other
194c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r5
195c3146671SArchibald Elliott; FP16-SOFT:    bl bf16_sink
196c3146671SArchibald Elliott; FP16-SOFT:    mov r0, r5
197c3146671SArchibald Elliott;
198c3146671SArchibald Elliott; FP16-HARD-LABEL: bf_out_call_multiuse:
199c3146671SArchibald Elliott; FP16-HARD:  @ %bb.0:
200c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s16, s0
201c3146671SArchibald Elliott; FP16-HARD:    bl bf_inner
202c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s18, s0
203c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s16
204c3146671SArchibald Elliott; FP16-HARD:    bl other
205c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s18
206c3146671SArchibald Elliott; FP16-HARD:    bl bf16_sink
207c3146671SArchibald Elliott; FP16-HARD:    vmov.f32 s0, s18
208c3146671SArchibald Elliott  %call = call bfloat @bf_inner()
209c3146671SArchibald Elliott  %call1 = call float @other(float %arg)
210c3146671SArchibald Elliott  call void @bf16_sink(bfloat %call)
211c3146671SArchibald Elliott  ret bfloat %call
212c3146671SArchibald Elliott}
213