@@ -197,3 +197,58 @@ define <4 x i32> @vector_ne_test(<4 x i32> %a, <4 x i32> %b) {
197197 <4 x i32 > splat (i32 -2147483648 )
198198 ret <4 x i32 > %res
199199}
200+
201+ declare i1 @id_i1 (i1 )
202+
203+
204+ define i1 @multi_use_icmp (i32 %a , i32 %b ) {
205+ ; CHECK-LABEL: define i1 @multi_use_icmp(
206+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
207+ ; CHECK-NEXT: [[A_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[A]], i32 5)
208+ ; CHECK-NEXT: [[B_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[B]], i32 7)
209+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[A_SUB]], [[B_SUB]]
210+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[OR]], 0
211+ ; CHECK-NEXT: [[CMP_OPAQUE:%.*]] = call i1 @id_i1(i1 [[CMP]])
212+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i32 0, i32 -2147483648
213+ ; CHECK-NEXT: [[EXTRA:%.*]] = xor i1 [[CMP_OPAQUE]], true
214+ ; CHECK-NEXT: [[SEL_OPAQUE:%.*]] = call i32 @id_i32(i32 [[SEL]])
215+ ; CHECK-NEXT: [[SEL_NZ:%.*]] = icmp ne i32 [[SEL_OPAQUE]], 0
216+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[SEL_NZ]], [[EXTRA]]
217+ ; CHECK-NEXT: ret i1 [[R]]
218+ ;
219+ %a_sub = call i32 @llvm.usub.sat.i32 (i32 %a , i32 5 )
220+ %b_sub = call i32 @llvm.usub.sat.i32 (i32 %b , i32 7 )
221+ %or = or i32 %a_sub , %b_sub
222+ %cmp = icmp eq i32 %or , 0
223+ %cmp_opaque = call i1 @id_i1 (i1 %cmp )
224+ %sel = select i1 %cmp , i32 0 , i32 -2147483648
225+ %extra = xor i1 %cmp_opaque , true
226+ %sel_opaque = call i32 @id_i32 (i32 %sel )
227+ %sel_is_nonzero = icmp ne i32 %sel_opaque , 0
228+ %r = and i1 %extra , %sel_is_nonzero
229+ ret i1 %r
230+ }
231+
232+
233+ declare i32 @id_i32 (i32 )
234+
235+ define i32 @multi_use_select (i32 %a , i32 %b ) {
236+ ; CHECK-LABEL: define i32 @multi_use_select(
237+ ; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
238+ ; CHECK-NEXT: [[A_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[A]], i32 224)
239+ ; CHECK-NEXT: [[B_SUB:%.*]] = call i32 @llvm.usub.sat.i32(i32 [[B]], i32 240)
240+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[A_SUB]], [[B_SUB]]
241+ ; CHECK-NEXT: [[SEL:%.*]] = and i32 [[OR]], -2147483648
242+ ; CHECK-NEXT: [[SEL_OPAQUE:%.*]] = call i32 @id_i32(i32 [[SEL]])
243+ ; CHECK-NEXT: ret i32 [[SEL_OPAQUE]]
244+ ;
245+ %a_sub = call i32 @llvm.usub.sat.i32 (i32 %a , i32 -2147483425 )
246+ %b_sub = call i32 @llvm.usub.sat.i32 (i32 %b , i32 -2147483409 )
247+ %or = or i32 %a_sub , %b_sub
248+ %cmp = icmp eq i32 %or , 0
249+ %sel = select i1 %cmp , i32 0 , i32 -2147483648
250+ %sel_opaque = call i32 @id_i32 (i32 %sel )
251+ ret i32 %sel_opaque
252+ }
253+
254+
0 commit comments