Skip to content

Commit a09e32e

Browse files
committed
[InstSimplify] Respect UseInstrInfo in more folds
Some folds using m_NUW, m_NSW style matchers were missed, make sure they respect UseInstrInfo. This is part of #53218, but not a complete fix for the issue.
1 parent 78c7201 commit a09e32e

File tree

3 files changed

+42
-35
lines changed

3 files changed

+42
-35
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,7 @@ static Value *simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact,
14631463

14641464
// (X << A) >> A -> X
14651465
Value *X;
1466-
if (match(Op0, m_NUWShl(m_Value(X), m_Specific(Op1))))
1466+
if (Q.IIQ.UseInstrInfo && match(Op0, m_NUWShl(m_Value(X), m_Specific(Op1))))
14671467
return X;
14681468

14691469
// ((X << A) | Y) >> A -> X if effective width of Y is not larger than A.
@@ -1473,7 +1473,7 @@ static Value *simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact,
14731473
// optimizers by supporting a simple but common case in InstSimplify.
14741474
Value *Y;
14751475
const APInt *ShRAmt, *ShLAmt;
1476-
if (match(Op1, m_APInt(ShRAmt)) &&
1476+
if (Q.IIQ.UseInstrInfo && match(Op1, m_APInt(ShRAmt)) &&
14771477
match(Op0, m_c_Or(m_NUWShl(m_Value(X), m_APInt(ShLAmt)), m_Value(Y))) &&
14781478
*ShRAmt == *ShLAmt) {
14791479
const KnownBits YKnown = computeKnownBits(Y, Q.DL, 0, Q.AC, Q.CxtI, Q.DT);
@@ -2210,7 +2210,7 @@ static Value *simplifyAndInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
22102210
// SimplifyDemandedBits in InstCombine can optimize the general case.
22112211
// This pattern aims to help other passes for a common case.
22122212
Value *XShifted;
2213-
if (match(Op1, m_APInt(Mask)) &&
2213+
if (Q.IIQ.UseInstrInfo && match(Op1, m_APInt(Mask)) &&
22142214
match(Op0, m_c_Or(m_CombineAnd(m_NUWShl(m_Value(X), m_APInt(ShAmt)),
22152215
m_Value(XShifted)),
22162216
m_Value(Y)))) {
@@ -3092,7 +3092,7 @@ static Value *simplifyICmpWithConstant(CmpInst::Predicate Pred, Value *LHS,
30923092
// (mul nuw/nsw X, MulC) != C --> true (if C is not a multiple of MulC)
30933093
// (mul nuw/nsw X, MulC) == C --> false (if C is not a multiple of MulC)
30943094
const APInt *MulC;
3095-
if (ICmpInst::isEquality(Pred) &&
3095+
if (IIQ.UseInstrInfo && ICmpInst::isEquality(Pred) &&
30963096
((match(LHS, m_NUWMul(m_Value(), m_APIntAllowUndef(MulC))) &&
30973097
*MulC != 0 && C->urem(*MulC) != 0) ||
30983098
(match(LHS, m_NSWMul(m_Value(), m_APIntAllowUndef(MulC))) &&
@@ -3260,9 +3260,9 @@ static Value *simplifyICmpWithBinOpOnLHS(CmpInst::Predicate Pred,
32603260
// *) C2 < C1 && C1 <= 0.
32613261
//
32623262
static bool trySimplifyICmpWithAdds(CmpInst::Predicate Pred, Value *LHS,
3263-
Value *RHS) {
3263+
Value *RHS, const InstrInfoQuery &IIQ) {
32643264
// TODO: only support icmp slt for now.
3265-
if (Pred != CmpInst::ICMP_SLT)
3265+
if (Pred != CmpInst::ICMP_SLT || !IIQ.UseInstrInfo)
32663266
return false;
32673267

32683268
// Canonicalize nsw add as RHS.
@@ -3331,7 +3331,7 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
33313331

33323332
// icmp (X+Y), (X+Z) -> icmp Y,Z for equalities or if there is no overflow.
33333333
bool CanSimplify = (NoLHSWrapProblem && NoRHSWrapProblem) ||
3334-
trySimplifyICmpWithAdds(Pred, LHS, RHS);
3334+
trySimplifyICmpWithAdds(Pred, LHS, RHS, Q.IIQ);
33353335
if (A && C && (A == C || A == D || B == C || B == D) && CanSimplify) {
33363336
// Determine Y and Z in the form icmp (X+Y), (X+Z).
33373337
Value *Y, *Z;

llvm/test/Transforms/NewGVN/flags-simplify.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ define i64 @lshr_lsh_nuw(i64 %tmp) {
4747
; CHECK-NEXT: entry:
4848
; CHECK-NEXT: [[CONV3:%.*]] = shl i64 [[TMP:%.*]], 32
4949
; CHECK-NEXT: store i64 [[CONV3]], ptr @f, align 8
50-
; CHECK-NEXT: ret i64 [[TMP]]
50+
; CHECK-NEXT: [[LSHR:%.*]] = lshr i64 [[CONV3]], 32
51+
; CHECK-NEXT: ret i64 [[LSHR]]
5152
;
5253
entry:
5354
%conv3 = shl nuw i64 %tmp, 32

llvm/test/Transforms/NewGVN/pair_jumpthread.ll

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ define signext i32 @testBI(i32 signext %v) {
3434
; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I]], [[TMP0]]
3535
; CHECK-NEXT: br label [[_ZL6CALLEEI_EXIT]]
3636
; CHECK: _ZL6calleei.exit:
37-
; CHECK-NEXT: [[PHIOFOPS1:%.*]] = phi i64 [ [[RETVAL_SROA_22_0_INSERT_EXT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]], [[IF_ELSE_I]] ]
38-
; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i64 [ 1, [[IF_THEN_I]] ], [ [[TMP0]], [[IF_ELSE_I]] ]
3937
; CHECK-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi i64 [ [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I]], [[IF_ELSE_I]] ]
40-
; CHECK-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[PHIOFOPS1]] to i32
41-
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
38+
; CHECK-NEXT: [[RC_SROA_43_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[RETVAL_SROA_0_0_I]], 32
39+
; CHECK-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RC_SROA_43_0_EXTRACT_SHIFT]] to i32
40+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 1
41+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
4242
; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
4343
; CHECK: if.then:
4444
; CHECK-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
@@ -50,27 +50,32 @@ define signext i32 @testBI(i32 signext %v) {
5050
; CHECK-JT-NEXT: entry:
5151
; CHECK-JT-NEXT: [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
5252
; CHECK-JT-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
53-
; CHECK-JT-NEXT: br i1 [[TOBOOL_I]], label [[_ZL6CALLEEI_EXIT:%.*]], label [[_ZL6CALLEEI_EXIT_THREAD:%.*]]
54-
; CHECK-JT: _ZL6calleei.exit.thread:
53+
; CHECK-JT-NEXT: br i1 [[TOBOOL_I]], label [[IF_ELSE_I:%.*]], label [[IF_THEN_I:%.*]]
54+
; CHECK-JT: if.then.i:
5555
; CHECK-JT-NEXT: [[CALL2_I:%.*]] = call signext i32 @dummy(i32 signext [[CALL_I]])
5656
; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL2_I]] to i64
57-
; CHECK-JT-NEXT: br label [[IF_THEN:%.*]]
58-
; CHECK-JT: _ZL6calleei.exit:
57+
; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_SHIFT_I_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I_I]], 32
58+
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I_I]], 1
59+
; CHECK-JT-NEXT: br label [[_ZL6CALLEEI_EXIT:%.*]]
60+
; CHECK-JT: if.else.i:
5961
; CHECK-JT-NEXT: [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
6062
; CHECK-JT-NEXT: [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
6163
; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_EXT_I8_I:%.*]] = zext i32 [[V]] to i64
6264
; CHECK-JT-NEXT: [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]], 32
6365
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I]], [[TMP0]]
64-
; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]] to i32
65-
; CHECK-JT-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP0]], 0
66-
; CHECK-JT-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN]]
66+
; CHECK-JT-NEXT: br label [[_ZL6CALLEEI_EXIT]]
67+
; CHECK-JT: _ZL6calleei.exit:
68+
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi i64 [ [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I]], [[IF_ELSE_I]] ]
69+
; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[RETVAL_SROA_0_0_I]], 32
70+
; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RC_SROA_43_0_EXTRACT_SHIFT]] to i32
71+
; CHECK-JT-NEXT: [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 1
72+
; CHECK-JT-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
73+
; CHECK-JT-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
6774
; CHECK-JT: if.then:
68-
; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC7:%.*]] = phi i32 [ [[CALL2_I]], [[_ZL6CALLEEI_EXIT_THREAD]] ], [ [[RC_SROA_43_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
6975
; CHECK-JT-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
7076
; CHECK-JT-NEXT: br label [[IF_END]]
7177
; CHECK-JT: if.end:
72-
; CHECK-JT-NEXT: [[RC_SROA_43_0_EXTRACT_TRUNC8:%.*]] = phi i32 [ [[RC_SROA_43_0_EXTRACT_TRUNC7]], [[IF_THEN]] ], [ [[RC_SROA_43_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
73-
; CHECK-JT-NEXT: ret i32 [[RC_SROA_43_0_EXTRACT_TRUNC8]]
78+
; CHECK-JT-NEXT: ret i32 [[RC_SROA_43_0_EXTRACT_TRUNC]]
7479
;
7580

7681
entry:
@@ -141,10 +146,10 @@ define signext i32 @testIB(i32 signext %v) {
141146
; CHECK-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I:%.*]] = or i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[RETVAL_SROA_0_0_INSERT_EXT_I9_I]]
142147
; CHECK-NEXT: br label [[_ZL6CALLEEI_EXIT]]
143148
; CHECK: _ZL6calleei.exit:
144-
; CHECK-NEXT: [[PHIOFOPS:%.*]] = phi i64 [ 4294967296, [[IF_THEN_I]] ], [ [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[IF_ELSE_I]] ]
145149
; CHECK-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi i64 [ [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I]], [[IF_ELSE_I]] ]
146150
; CHECK-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_I]] to i32
147-
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
151+
; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 4294967296
152+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
148153
; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
149154
; CHECK: if.then:
150155
; CHECK-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
@@ -156,29 +161,30 @@ define signext i32 @testIB(i32 signext %v) {
156161
; CHECK-JT-NEXT: entry:
157162
; CHECK-JT-NEXT: [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
158163
; CHECK-JT-NEXT: [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
159-
; CHECK-JT-NEXT: br i1 [[TOBOOL_I]], label [[_ZL6CALLEEI_EXIT:%.*]], label [[_ZL6CALLEEI_EXIT_THREAD:%.*]]
160-
; CHECK-JT: _ZL6calleei.exit.thread:
164+
; CHECK-JT-NEXT: br i1 [[TOBOOL_I]], label [[IF_ELSE_I:%.*]], label [[IF_THEN_I:%.*]]
165+
; CHECK-JT: if.then.i:
161166
; CHECK-JT-NEXT: [[CALL1_I:%.*]] = call signext i32 @dummy(i32 signext [[V]])
162167
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL1_I]] to i64
163168
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_EXT_I_I]], 4294967296
164-
; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC3:%.*]] = trunc i64 [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]] to i32
165-
; CHECK-JT-NEXT: br label [[IF_THEN:%.*]]
166-
; CHECK-JT: _ZL6calleei.exit:
169+
; CHECK-JT-NEXT: br label [[_ZL6CALLEEI_EXIT:%.*]]
170+
; CHECK-JT: if.else.i:
167171
; CHECK-JT-NEXT: [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
168172
; CHECK-JT-NEXT: [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
169173
; CHECK-JT-NEXT: [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I:%.*]] = shl nuw nsw i64 [[TMP0]], 32
170174
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_EXT_I9_I:%.*]] = zext i32 [[V]] to i64
171175
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I:%.*]] = or i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[RETVAL_SROA_0_0_INSERT_EXT_I9_I]]
172-
; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I]] to i32
173-
; CHECK-JT-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], 0
174-
; CHECK-JT-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN]]
176+
; CHECK-JT-NEXT: br label [[_ZL6CALLEEI_EXIT]]
177+
; CHECK-JT: _ZL6calleei.exit:
178+
; CHECK-JT-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi i64 [ [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]], [[IF_THEN_I]] ], [ [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I]], [[IF_ELSE_I]] ]
179+
; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_I]] to i32
180+
; CHECK-JT-NEXT: [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 4294967296
181+
; CHECK-JT-NEXT: [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
182+
; CHECK-JT-NEXT: br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
175183
; CHECK-JT: if.then:
176-
; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC5:%.*]] = phi i32 [ [[RC_SROA_0_0_EXTRACT_TRUNC3]], [[_ZL6CALLEEI_EXIT_THREAD]] ], [ [[RC_SROA_0_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
177184
; CHECK-JT-NEXT: [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
178185
; CHECK-JT-NEXT: br label [[IF_END]]
179186
; CHECK-JT: if.end:
180-
; CHECK-JT-NEXT: [[RC_SROA_0_0_EXTRACT_TRUNC6:%.*]] = phi i32 [ [[RC_SROA_0_0_EXTRACT_TRUNC5]], [[IF_THEN]] ], [ [[RC_SROA_0_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
181-
; CHECK-JT-NEXT: ret i32 [[RC_SROA_0_0_EXTRACT_TRUNC6]]
187+
; CHECK-JT-NEXT: ret i32 [[RC_SROA_0_0_EXTRACT_TRUNC]]
182188
;
183189

184190
entry:

0 commit comments

Comments
 (0)