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() {
13 .a: ; preds = %bb9, %.entry
14 %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
15 br i1 undef, label %bb9, label %bb
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
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
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() {
45 .a: ; preds = %bb9, %.entry
46 %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
47 br i1 undef, label %bb9, label %bb
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
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
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() {
77 .a: ; preds = %bb9, %.entry
78 %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
79 br i1 undef, label %bb9, label %bb
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
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
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() {
110 .a: ; preds = %bb9, %.entry
111 %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
112 br i1 undef, label %bb9, label %bb
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
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
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() {
143 .a: ; preds = %bb9, %.entry
144 %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
145 br i1 undef, label %bb9, label %bb
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
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
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() {
176 .a: ; preds = %bb9, %.entry
177 %.2 = phi i32 [ 0, %.entry ], [ %i11, %bb9 ]
178 br i1 undef, label %bb9, label %bb
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
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
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 }