Mercurial > hg > Members > tobaru > cbc > CbC_llvm
comparison test/CodeGen/AMDGPU/setcc-fneg-constant.ll @ 121:803732b1fca8
LLVM 5.0
author | kono |
---|---|
date | Fri, 27 Oct 2017 17:07:41 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
120:1172e4bd9c6f | 121:803732b1fca8 |
---|---|
1 ; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=GCN -check-prefix=FUNC %s | |
2 | |
3 ; Test fcmp pred (fneg x), c -> fcmp (swapped pred) x, -c combine. | |
4 | |
5 ; GCN-LABEL: {{^}}multi_use_fneg_src: | |
6 ; GCN: buffer_load_dword [[A:v[0-9]+]] | |
7 ; GCN: buffer_load_dword [[B:v[0-9]+]] | |
8 ; GCN: buffer_load_dword [[C:v[0-9]+]] | |
9 | |
10 ; GCN: v_mul_f32_e32 [[MUL:v[0-9]+]], [[A]], [[B]] | |
11 ; GCN: v_cmp_eq_f32_e32 vcc, -4.0, [[MUL]] | |
12 ; GCN: buffer_store_dword [[MUL]] | |
13 define amdgpu_kernel void @multi_use_fneg_src() #0 { | |
14 %a = load volatile float, float addrspace(1)* undef | |
15 %b = load volatile float, float addrspace(1)* undef | |
16 %x = load volatile i32, i32 addrspace(1)* undef | |
17 %y = load volatile i32, i32 addrspace(1)* undef | |
18 | |
19 %mul = fmul float %a, %b | |
20 %neg.mul = fsub float -0.0, %mul | |
21 %cmp = fcmp oeq float %neg.mul, 4.0 | |
22 %select = select i1 %cmp, i32 %x, i32 %y | |
23 store volatile i32 %select, i32 addrspace(1)* undef | |
24 store volatile float %mul, float addrspace(1)* undef | |
25 ret void | |
26 } | |
27 | |
28 ; GCN-LABEL: {{^}}multi_foldable_use_fneg_src: | |
29 ; GCN: buffer_load_dword [[A:v[0-9]+]] | |
30 ; GCN: buffer_load_dword [[B:v[0-9]+]] | |
31 ; GCN: buffer_load_dword [[C:v[0-9]+]] | |
32 | |
33 ; GCN: v_mul_f32_e32 [[MUL:v[0-9]+]], [[A]], [[B]] | |
34 ; GCN: v_cmp_eq_f32_e32 vcc, -4.0, [[A]] | |
35 ; GCN: v_mul_f32_e64 [[USE1:v[0-9]+]], [[MUL]], -[[MUL]] | |
36 define amdgpu_kernel void @multi_foldable_use_fneg_src() #0 { | |
37 %a = load volatile float, float addrspace(1)* undef | |
38 %b = load volatile float, float addrspace(1)* undef | |
39 %x = load volatile i32, i32 addrspace(1)* undef | |
40 %y = load volatile i32, i32 addrspace(1)* undef | |
41 | |
42 %mul = fmul float %a, %b | |
43 %neg.mul = fsub float -0.0, %mul | |
44 %use1 = fmul float %mul, %neg.mul | |
45 %cmp = fcmp oeq float %neg.mul, 4.0 | |
46 %select = select i1 %cmp, i32 %x, i32 %y | |
47 | |
48 store volatile i32 %select, i32 addrspace(1)* undef | |
49 store volatile float %use1, float addrspace(1)* undef | |
50 ret void | |
51 } | |
52 | |
53 ; GCN-LABEL: {{^}}multi_use_fneg: | |
54 ; GCN: buffer_load_dword [[A:v[0-9]+]] | |
55 ; GCN: buffer_load_dword [[B:v[0-9]+]] | |
56 ; GCN: buffer_load_dword [[C:v[0-9]+]] | |
57 | |
58 ; GCN: v_mul_f32_e64 [[MUL:v[0-9]+]], [[A]], -[[B]] | |
59 ; GCN-NEXT: v_cmp_eq_f32_e32 vcc, 4.0, [[MUL]] | |
60 ; GCN-NOT: xor | |
61 ; GCN: buffer_store_dword [[MUL]] | |
62 define amdgpu_kernel void @multi_use_fneg() #0 { | |
63 %a = load volatile float, float addrspace(1)* undef | |
64 %b = load volatile float, float addrspace(1)* undef | |
65 %x = load volatile i32, i32 addrspace(1)* undef | |
66 %y = load volatile i32, i32 addrspace(1)* undef | |
67 | |
68 %mul = fmul float %a, %b | |
69 %neg.mul = fsub float -0.0, %mul | |
70 %cmp = fcmp oeq float %neg.mul, 4.0 | |
71 %select = select i1 %cmp, i32 %x, i32 %y | |
72 store volatile i32 %select, i32 addrspace(1)* undef | |
73 store volatile float %neg.mul, float addrspace(1)* undef | |
74 ret void | |
75 } | |
76 | |
77 ; GCN-LABEL: {{^}}multi_foldable_use_fneg: | |
78 ; GCN: buffer_load_dword [[A:v[0-9]+]] | |
79 ; GCN: buffer_load_dword [[B:v[0-9]+]] | |
80 | |
81 ; GCN: v_mul_f32_e32 [[MUL0:v[0-9]+]], [[A]], [[B]] | |
82 ; GCN: v_cmp_eq_f32_e32 vcc, -4.0, [[MUL0]] | |
83 ; GCN: v_mul_f32_e64 [[MUL1:v[0-9]+]], -[[MUL0]], [[MUL0]] | |
84 ; GCN: buffer_store_dword [[MUL1]] | |
85 define amdgpu_kernel void @multi_foldable_use_fneg() #0 { | |
86 %a = load volatile float, float addrspace(1)* undef | |
87 %b = load volatile float, float addrspace(1)* undef | |
88 %x = load volatile i32, i32 addrspace(1)* undef | |
89 %y = load volatile i32, i32 addrspace(1)* undef | |
90 %z = load volatile i32, i32 addrspace(1)* undef | |
91 | |
92 %mul = fmul float %a, %b | |
93 %neg.mul = fsub float -0.0, %mul | |
94 %cmp = fcmp oeq float %neg.mul, 4.0 | |
95 %select = select i1 %cmp, i32 %x, i32 %y | |
96 %use1 = fmul float %neg.mul, %mul | |
97 store volatile i32 %select, i32 addrspace(1)* undef | |
98 store volatile float %use1, float addrspace(1)* undef | |
99 ret void | |
100 } | |
101 | |
102 ; GCN-LABEL: {{^}}test_setcc_fneg_oeq_posk_f32: | |
103 ; GCN: v_cmp_eq_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
104 define amdgpu_kernel void @test_setcc_fneg_oeq_posk_f32() #0 { | |
105 %a = load volatile float, float addrspace(1)* undef | |
106 %x = load volatile i32, i32 addrspace(1)* undef | |
107 %y = load volatile i32, i32 addrspace(1)* undef | |
108 %neg.a = fsub float -0.0, %a | |
109 %cmp = fcmp oeq float %neg.a, 4.0 | |
110 %select = select i1 %cmp, i32 %x, i32 %y | |
111 store volatile i32 %select, i32 addrspace(1)* undef | |
112 ret void | |
113 } | |
114 | |
115 ; GCN-LABEL: {{^}}test_setcc_fneg_ogt_posk_f32: | |
116 ; GCN: v_cmp_gt_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
117 define amdgpu_kernel void @test_setcc_fneg_ogt_posk_f32() #0 { | |
118 %a = load volatile float, float addrspace(1)* undef | |
119 %x = load volatile i32, i32 addrspace(1)* undef | |
120 %y = load volatile i32, i32 addrspace(1)* undef | |
121 %neg.a = fsub float -0.0, %a | |
122 %cmp = fcmp ogt float %neg.a, 4.0 | |
123 %select = select i1 %cmp, i32 %x, i32 %y | |
124 store volatile i32 %select, i32 addrspace(1)* undef | |
125 ret void | |
126 } | |
127 | |
128 ; GCN-LABEL: {{^}}test_setcc_fneg_oge_posk_f32: | |
129 ; GCN: v_cmp_ge_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
130 define amdgpu_kernel void @test_setcc_fneg_oge_posk_f32() #0 { | |
131 %a = load volatile float, float addrspace(1)* undef | |
132 %x = load volatile i32, i32 addrspace(1)* undef | |
133 %y = load volatile i32, i32 addrspace(1)* undef | |
134 %neg.a = fsub float -0.0, %a | |
135 %cmp = fcmp oge float %neg.a, 4.0 | |
136 %select = select i1 %cmp, i32 %x, i32 %y | |
137 store volatile i32 %select, i32 addrspace(1)* undef | |
138 ret void | |
139 } | |
140 | |
141 ; GCN-LABEL: {{^}}test_setcc_fneg_olt_posk_f32: | |
142 ; GCN: v_cmp_lt_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
143 define amdgpu_kernel void @test_setcc_fneg_olt_posk_f32() #0 { | |
144 %a = load volatile float, float addrspace(1)* undef | |
145 %x = load volatile i32, i32 addrspace(1)* undef | |
146 %y = load volatile i32, i32 addrspace(1)* undef | |
147 %neg.a = fsub float -0.0, %a | |
148 %cmp = fcmp olt float %neg.a, 4.0 | |
149 %select = select i1 %cmp, i32 %x, i32 %y | |
150 store volatile i32 %select, i32 addrspace(1)* undef | |
151 ret void | |
152 } | |
153 | |
154 ; GCN-LABEL: {{^}}test_setcc_fneg_ole_posk_f32: | |
155 ; GCN: v_cmp_le_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
156 define amdgpu_kernel void @test_setcc_fneg_ole_posk_f32() #0 { | |
157 %a = load volatile float, float addrspace(1)* undef | |
158 %x = load volatile i32, i32 addrspace(1)* undef | |
159 %y = load volatile i32, i32 addrspace(1)* undef | |
160 %neg.a = fsub float -0.0, %a | |
161 %cmp = fcmp ole float %neg.a, 4.0 | |
162 %select = select i1 %cmp, i32 %x, i32 %y | |
163 store volatile i32 %select, i32 addrspace(1)* undef | |
164 ret void | |
165 } | |
166 | |
167 ; GCN-LABEL: {{^}}test_setcc_fneg_one_posk_f32: | |
168 ; GCN: v_cmp_lg_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
169 define amdgpu_kernel void @test_setcc_fneg_one_posk_f32() #0 { | |
170 %a = load volatile float, float addrspace(1)* undef | |
171 %x = load volatile i32, i32 addrspace(1)* undef | |
172 %y = load volatile i32, i32 addrspace(1)* undef | |
173 %neg.a = fsub float -0.0, %a | |
174 %cmp = fcmp one float %neg.a, 4.0 | |
175 %select = select i1 %cmp, i32 %x, i32 %y | |
176 store volatile i32 %select, i32 addrspace(1)* undef | |
177 ret void | |
178 } | |
179 | |
180 ; GCN-LABEL: {{^}}test_setcc_fneg_ueq_posk_f32: | |
181 ; GCN: v_cmp_nlg_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
182 define amdgpu_kernel void @test_setcc_fneg_ueq_posk_f32() #0 { | |
183 %a = load volatile float, float addrspace(1)* undef | |
184 %x = load volatile i32, i32 addrspace(1)* undef | |
185 %y = load volatile i32, i32 addrspace(1)* undef | |
186 %neg.a = fsub float -0.0, %a | |
187 %cmp = fcmp ueq float %neg.a, 4.0 | |
188 %select = select i1 %cmp, i32 %x, i32 %y | |
189 store volatile i32 %select, i32 addrspace(1)* undef | |
190 ret void | |
191 } | |
192 | |
193 ; GCN-LABEL: {{^}}test_setcc_fneg_ugt_posk_f32: | |
194 ; GCN: v_cmp_nle_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
195 define amdgpu_kernel void @test_setcc_fneg_ugt_posk_f32() #0 { | |
196 %a = load volatile float, float addrspace(1)* undef | |
197 %x = load volatile i32, i32 addrspace(1)* undef | |
198 %y = load volatile i32, i32 addrspace(1)* undef | |
199 %neg.a = fsub float -0.0, %a | |
200 %cmp = fcmp ugt float %neg.a, 4.0 | |
201 %select = select i1 %cmp, i32 %x, i32 %y | |
202 store volatile i32 %select, i32 addrspace(1)* undef | |
203 ret void | |
204 } | |
205 | |
206 ; GCN-LABEL: {{^}}test_setcc_fneg_uge_posk_f32: | |
207 ; GCN: v_cmp_nlt_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
208 define amdgpu_kernel void @test_setcc_fneg_uge_posk_f32() #0 { | |
209 %a = load volatile float, float addrspace(1)* undef | |
210 %x = load volatile i32, i32 addrspace(1)* undef | |
211 %y = load volatile i32, i32 addrspace(1)* undef | |
212 %neg.a = fsub float -0.0, %a | |
213 %cmp = fcmp uge float %neg.a, 4.0 | |
214 %select = select i1 %cmp, i32 %x, i32 %y | |
215 store volatile i32 %select, i32 addrspace(1)* undef | |
216 ret void | |
217 } | |
218 | |
219 ; GCN-LABEL: {{^}}test_setcc_fneg_ult_posk_f32: | |
220 ; GCN: v_cmp_nge_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
221 define amdgpu_kernel void @test_setcc_fneg_ult_posk_f32() #0 { | |
222 %a = load volatile float, float addrspace(1)* undef | |
223 %x = load volatile i32, i32 addrspace(1)* undef | |
224 %y = load volatile i32, i32 addrspace(1)* undef | |
225 %neg.a = fsub float -0.0, %a | |
226 %cmp = fcmp ult float %neg.a, 4.0 | |
227 %select = select i1 %cmp, i32 %x, i32 %y | |
228 store volatile i32 %select, i32 addrspace(1)* undef | |
229 ret void | |
230 } | |
231 | |
232 ; GCN-LABEL: {{^}}test_setcc_fneg_ule_posk_f32: | |
233 ; GCN: v_cmp_ngt_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
234 define amdgpu_kernel void @test_setcc_fneg_ule_posk_f32() #0 { | |
235 %a = load volatile float, float addrspace(1)* undef | |
236 %x = load volatile i32, i32 addrspace(1)* undef | |
237 %y = load volatile i32, i32 addrspace(1)* undef | |
238 %neg.a = fsub float -0.0, %a | |
239 %cmp = fcmp ule float %neg.a, 4.0 | |
240 %select = select i1 %cmp, i32 %x, i32 %y | |
241 store volatile i32 %select, i32 addrspace(1)* undef | |
242 ret void | |
243 } | |
244 | |
245 ; GCN-LABEL: {{^}}test_setcc_fneg_une_posk_f32: | |
246 ; GCN: v_cmp_neq_f32_e32 vcc, -4.0, v{{[0-9]+}} | |
247 define amdgpu_kernel void @test_setcc_fneg_une_posk_f32() #0 { | |
248 %a = load volatile float, float addrspace(1)* undef | |
249 %x = load volatile i32, i32 addrspace(1)* undef | |
250 %y = load volatile i32, i32 addrspace(1)* undef | |
251 %neg.a = fsub float -0.0, %a | |
252 %cmp = fcmp une float %neg.a, 4.0 | |
253 %select = select i1 %cmp, i32 %x, i32 %y | |
254 store volatile i32 %select, i32 addrspace(1)* undef | |
255 ret void | |
256 } | |
257 | |
258 attributes #0 = { nounwind } |