Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / combine-add-zext-xor.ll
blob48a57ac9d6ebd6860d370c52c30833f1149d4c14
1 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs < %s | FileCheck %s
3 ; Test that unused lanes in the s_xor result are masked out with v_cndmask.
5 ; CHECK-LABEL: combine_add_zext_xor:
6 ; CHECK: s_xor_b32 [[RESULT:s[0-9]+]]
7 ; CHECK: v_cndmask_b32_e64 [[ARG:v[0-9]+]], 0, 1, [[RESULT]]
8 ; CHECK: v_add_nc_u32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[ARG]]
9 define i32 @combine_add_zext_xor() {
10 .entry:
11   br label %.a
13 .a:                                               ; preds = %bb9, %.entry
14   %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
15   br i1 undef, label %bb9, label %bb
17 bb:                                               ; preds = %.a
18   %.i3 = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> undef, i32 %.2, i32 64, i32 1)
19   %i5 = icmp eq i32 %.i3, 0
20   br label %bb9
22 bb9:                                              ; preds = %bb, %.a
23   %.2.0.in.in = phi i1 [ %i5, %bb ], [ undef, %.a ]
24   %.2.0.in = xor i1 %.2.0.in.in, true
25   %.2.0 = zext i1 %.2.0.in to i32
26   %i11 = add i32 %.2, %.2.0
27   %i12 = icmp sgt i32 %.2, -1050
28   br i1 %i12, label %.a, label %.exit
30 .exit:                                            ; preds = %bb9
31   ret i32 %.2.0
34 ; Test that unused lanes in the s_xor result are masked out with v_cndmask.
36 ; CHECK-LABEL: combine_sub_zext_xor:
37 ; CHECK: s_xor_b32 [[RESULT:s[0-9]+]]
38 ; CHECK: v_cndmask_b32_e64 [[ARG:v[0-9]+]], 0, 1, [[RESULT]]
39 ; CHECK: v_sub_nc_u32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[ARG]]
41 define i32 @combine_sub_zext_xor() {
42 .entry:
43   br label %.a
45 .a:                                               ; preds = %bb9, %.entry
46   %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
47   br i1 undef, label %bb9, label %bb
49 bb:                                               ; preds = %.a
50   %.i3 = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> undef, i32 %.2, i32 64, i32 1)
51   %i5 = icmp eq i32 %.i3, 0
52   br label %bb9
54 bb9:                                              ; preds = %bb, %.a
55   %.2.0.in.in = phi i1 [ %i5, %bb ], [ undef, %.a ]
56   %.2.0.in = xor i1 %.2.0.in.in, true
57   %.2.0 = zext i1 %.2.0.in to i32
58   %i11 = sub i32 %.2, %.2.0
59   %i12 = icmp sgt i32 %.2, -1050
60   br i1 %i12, label %.a, label %.exit
62 .exit:                                            ; preds = %bb9
63   ret i32 %.2.0
66 ; Test that unused lanes in the s_or result are masked out with v_cndmask.
68 ; CHECK-LABEL: combine_add_zext_or:
69 ; CHECK: s_or_b32 [[RESULT:s[0-9]+]]
70 ; CHECK: v_cndmask_b32_e64 [[ARG:v[0-9]+]], 0, 1, [[RESULT]]
71 ; CHECK: v_add_nc_u32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[ARG]]
73 define i32 @combine_add_zext_or() {
74 .entry:
75   br label %.a
77 .a:                                               ; preds = %bb9, %.entry
78   %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
79   br i1 undef, label %bb9, label %bb
81 bb:                                               ; preds = %.a
82   %.i3 = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> undef, i32 %.2, i32 64, i32 1)
83   %i5 = icmp eq i32 %.i3, 0
84   br label %bb9
86 bb9:                                              ; preds = %bb, %.a
87   %.2.0.in.in = phi i1 [ %i5, %bb ], [ undef, %.a ]
88   %t = icmp sgt i32 %.2, -1050
89   %.2.0.in = or i1 %.2.0.in.in, %t
90   %.2.0 = zext i1 %.2.0.in to i32
91   %i11 = add i32 %.2, %.2.0
92   %i12 = icmp sgt i32 %.2, -1050
93   br i1 %i12, label %.a, label %.exit
95 .exit:                                            ; preds = %bb9
96   ret i32 %.2.0
99 ; Test that unused lanes in the s_or result are masked out with v_cndmask.
101 ; CHECK-LABEL: combine_sub_zext_or:
102 ; CHECK: s_or_b32 [[RESULT:s[0-9]+]]
103 ; CHECK: v_cndmask_b32_e64 [[ARG:v[0-9]+]], 0, 1, [[RESULT]]
104 ; CHECK: v_sub_nc_u32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[ARG]]
106 define i32 @combine_sub_zext_or() {
107 .entry:
108   br label %.a
110 .a:                                               ; preds = %bb9, %.entry
111   %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
112   br i1 undef, label %bb9, label %bb
114 bb:                                               ; preds = %.a
115   %.i3 = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> undef, i32 %.2, i32 64, i32 1)
116   %i5 = icmp eq i32 %.i3, 0
117   br label %bb9
119 bb9:                                              ; preds = %bb, %.a
120   %.2.0.in.in = phi i1 [ %i5, %bb ], [ undef, %.a ]
121   %t = icmp sgt i32 %.2, -1050
122   %.2.0.in = or i1 %.2.0.in.in, %t
123   %.2.0 = zext i1 %.2.0.in to i32
124   %i11 = sub i32 %.2, %.2.0
125   %i12 = icmp sgt i32 %.2, -1050
126   br i1 %i12, label %.a, label %.exit
128 .exit:                                            ; preds = %bb9
129   ret i32 %.2.0
132 ; Test that unused lanes in the s_and result are masked out with v_cndmask.
134 ; CHECK-LABEL: combine_add_zext_and:
135 ; CHECK: s_and_b32 [[RESULT:s[0-9]+]]
136 ; CHECK: v_cndmask_b32_e64 [[ARG:v[0-9]+]], 0, 1, [[RESULT]]
137 ; CHECK: v_add_nc_u32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[ARG]]
139 define i32 @combine_add_zext_and() {
140 .entry:
141   br label %.a
143 .a:                                               ; preds = %bb9, %.entry
144   %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
145   br i1 undef, label %bb9, label %bb
147 bb:                                               ; preds = %.a
148   %.i3 = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> undef, i32 %.2, i32 64, i32 1)
149   %i5 = icmp eq i32 %.i3, 0
150   br label %bb9
152 bb9:                                              ; preds = %bb, %.a
153   %.2.0.in.in = phi i1 [ %i5, %bb ], [ undef, %.a ]
154   %t = icmp sgt i32 %.2, -1050
155   %.2.0.in = and i1 %.2.0.in.in, %t
156   %.2.0 = zext i1 %.2.0.in to i32
157   %i11 = add i32 %.2, %.2.0
158   %i12 = icmp sgt i32 %.2, -1050
159   br i1 %i12, label %.a, label %.exit
161 .exit:                                            ; preds = %bb9
162   ret i32 %.2.0
165 ; Test that unused lanes in the s_and result are masked out with v_cndmask.
167 ; CHECK-LABEL: combine_sub_zext_and:
168 ; CHECK: s_and_b32 [[RESULT:s[0-9]+]]
169 ; CHECK: v_cndmask_b32_e64 [[ARG:v[0-9]+]], 0, 1, [[RESULT]]
170 ; CHECK: v_sub_nc_u32_e32 v{{[0-9]+}}, v{{[0-9]+}}, [[ARG]]
172 define i32 @combine_sub_zext_and() {
173 .entry:
174   br label %.a
176 .a:                                               ; preds = %bb9, %.entry
177   %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
178   br i1 undef, label %bb9, label %bb
180 bb:                                               ; preds = %.a
181   %.i3 = call i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32> undef, i32 %.2, i32 64, i32 1)
182   %i5 = icmp eq i32 %.i3, 0
183   br label %bb9
185 bb9:                                              ; preds = %bb, %.a
186   %.2.0.in.in = phi i1 [ %i5, %bb ], [ undef, %.a ]
187   %t = icmp sgt i32 %.2, -1050
188   %.2.0.in = and i1 %.2.0.in.in, %t
189   %.2.0 = zext i1 %.2.0.in to i32
190   %i11 = sub i32 %.2, %.2.0
191   %i12 = icmp sgt i32 %.2, -1050
192   br i1 %i12, label %.a, label %.exit
194 .exit:                                            ; preds = %bb9
195   ret i32 %.2.0
199 ; Function Attrs: nounwind readonly willreturn
200 declare i32 @llvm.amdgcn.raw.buffer.load.i32(<4 x i32>, i32, i32, i32 immarg) #0
202 attributes #0 = { nounwind readonly willreturn }