Skip to content

Commit 6bc3659

Browse files
author
Nimit Sachdeva
committed
add oneUse checks for usub & or
1 parent 587ada3 commit 6bc3659

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2014,10 +2014,10 @@ static Instruction *foldICmpUSubSatWithAndForMostSignificantBitCmp(
20142014
const APInt *Constant1, *Constant2;
20152015
if (!match(SI.getCondition(),
20162016
m_ICmp(Pred,
2017-
m_Or(m_Intrinsic<Intrinsic::usub_sat>(m_Value(A),
2018-
m_APInt(Constant1)),
2019-
m_Intrinsic<Intrinsic::usub_sat>(m_Value(B),
2020-
m_APInt(Constant2))),
2017+
m_OneUse(m_Or(m_OneUse(m_Intrinsic<Intrinsic::usub_sat>(
2018+
m_Value(A), m_APInt(Constant1))),
2019+
m_OneUse(m_Intrinsic<Intrinsic::usub_sat>(
2020+
m_Value(B), m_APInt(Constant2))))),
20212021
m_Zero())))
20222022
return nullptr;
20232023

llvm/test/Transforms/InstCombine/usub_sat_to_msb_mask.ll

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,3 +252,64 @@ define i32 @multi_use_select(i32 %a, i32 %b) {
252252
}
253253

254254

255+
define i8 @no_fold_usub_extra_use(i8 %a, i8 %b) {
256+
; CHECK-LABEL: define i8 @no_fold_usub_extra_use(
257+
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
258+
; CHECK-NEXT: [[A_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A]], i8 -33)
259+
; CHECK-NEXT: [[B_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[B]], i8 -17)
260+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[A_SUB]], [[B_SUB]]
261+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
262+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 0, i8 -128
263+
; CHECK-NEXT: call void @use(i8 [[A_SUB]])
264+
; CHECK-NEXT: ret i8 [[RES]]
265+
;
266+
%a_sub = call i8 @llvm.usub.sat.i8(i8 %a, i8 223)
267+
%b_sub = call i8 @llvm.usub.sat.i8(i8 %b, i8 239)
268+
%or = or i8 %a_sub, %b_sub
269+
%cmp = icmp eq i8 %or, 0
270+
%res = select i1 %cmp, i8 0, i8 128
271+
call void @use(i8 %a_sub)
272+
ret i8 %res
273+
}
274+
275+
define i8 @no_fold_or_extra_use(i8 %a, i8 %b) {
276+
; CHECK-LABEL: define i8 @no_fold_or_extra_use(
277+
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
278+
; CHECK-NEXT: [[A_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A]], i8 -33)
279+
; CHECK-NEXT: [[B_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[B]], i8 -17)
280+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[A_SUB]], [[B_SUB]]
281+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
282+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 0, i8 -128
283+
; CHECK-NEXT: call void @use(i8 [[OR]])
284+
; CHECK-NEXT: ret i8 [[RES]]
285+
;
286+
%a_sub = call i8 @llvm.usub.sat.i8(i8 %a, i8 223)
287+
%b_sub = call i8 @llvm.usub.sat.i8(i8 %b, i8 239)
288+
%or = or i8 %a_sub, %b_sub
289+
%cmp = icmp eq i8 %or, 0
290+
%res = select i1 %cmp, i8 0, i8 128
291+
call void @use(i8 %or)
292+
ret i8 %res
293+
}
294+
295+
define i8 @no_fold_usub_b_extra_use(i8 %a, i8 %b) {
296+
; CHECK-LABEL: define i8 @no_fold_usub_b_extra_use(
297+
; CHECK-SAME: i8 [[A:%.*]], i8 [[B:%.*]]) {
298+
; CHECK-NEXT: [[A_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A]], i8 -33)
299+
; CHECK-NEXT: [[B_SUB:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[B]], i8 -17)
300+
; CHECK-NEXT: [[OR:%.*]] = or i8 [[A_SUB]], [[B_SUB]]
301+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[OR]], 0
302+
; CHECK-NEXT: [[RES:%.*]] = select i1 [[CMP]], i8 0, i8 -128
303+
; CHECK-NEXT: call void @use(i8 [[B_SUB]])
304+
; CHECK-NEXT: ret i8 [[RES]]
305+
;
306+
%a_sub = call i8 @llvm.usub.sat.i8(i8 %a, i8 223)
307+
%b_sub = call i8 @llvm.usub.sat.i8(i8 %b, i8 239)
308+
%or = or i8 %a_sub, %b_sub
309+
%cmp = icmp eq i8 %or, 0
310+
%res = select i1 %cmp, i8 0, i8 128
311+
call void @use(i8 %b_sub)
312+
ret i8 %res
313+
}
314+
315+
declare void @use(i8)

0 commit comments

Comments
 (0)