[llvm] a09e32e - [InstSimplify] Respect UseInstrInfo in more folds

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 26 04:54:16 PDT 2023


Author: Nikita Popov
Date: 2023-09-26T13:54:03+02:00
New Revision: a09e32e5fe13e3b64bef1defddf71a9e83022e76

URL: https://github.com/llvm/llvm-project/commit/a09e32e5fe13e3b64bef1defddf71a9e83022e76
DIFF: https://github.com/llvm/llvm-project/commit/a09e32e5fe13e3b64bef1defddf71a9e83022e76.diff

LOG: [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.

Added: 
    

Modified: 
    llvm/lib/Analysis/InstructionSimplify.cpp
    llvm/test/Transforms/NewGVN/flags-simplify.ll
    llvm/test/Transforms/NewGVN/pair_jumpthread.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 552c0824713139a..2a1218a683ca83e 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -1463,7 +1463,7 @@ static Value *simplifyLShrInst(Value *Op0, Value *Op1, bool IsExact,
 
   // (X << A) >> A -> X
   Value *X;
-  if (match(Op0, m_NUWShl(m_Value(X), m_Specific(Op1))))
+  if (Q.IIQ.UseInstrInfo && match(Op0, m_NUWShl(m_Value(X), m_Specific(Op1))))
     return X;
 
   // ((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,
   // optimizers by supporting a simple but common case in InstSimplify.
   Value *Y;
   const APInt *ShRAmt, *ShLAmt;
-  if (match(Op1, m_APInt(ShRAmt)) &&
+  if (Q.IIQ.UseInstrInfo && match(Op1, m_APInt(ShRAmt)) &&
       match(Op0, m_c_Or(m_NUWShl(m_Value(X), m_APInt(ShLAmt)), m_Value(Y))) &&
       *ShRAmt == *ShLAmt) {
     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,
   // SimplifyDemandedBits in InstCombine can optimize the general case.
   // This pattern aims to help other passes for a common case.
   Value *XShifted;
-  if (match(Op1, m_APInt(Mask)) &&
+  if (Q.IIQ.UseInstrInfo && match(Op1, m_APInt(Mask)) &&
       match(Op0, m_c_Or(m_CombineAnd(m_NUWShl(m_Value(X), m_APInt(ShAmt)),
                                      m_Value(XShifted)),
                         m_Value(Y)))) {
@@ -3092,7 +3092,7 @@ static Value *simplifyICmpWithConstant(CmpInst::Predicate Pred, Value *LHS,
   // (mul nuw/nsw X, MulC) != C --> true  (if C is not a multiple of MulC)
   // (mul nuw/nsw X, MulC) == C --> false (if C is not a multiple of MulC)
   const APInt *MulC;
-  if (ICmpInst::isEquality(Pred) &&
+  if (IIQ.UseInstrInfo && ICmpInst::isEquality(Pred) &&
       ((match(LHS, m_NUWMul(m_Value(), m_APIntAllowUndef(MulC))) &&
         *MulC != 0 && C->urem(*MulC) != 0) ||
        (match(LHS, m_NSWMul(m_Value(), m_APIntAllowUndef(MulC))) &&
@@ -3260,9 +3260,9 @@ static Value *simplifyICmpWithBinOpOnLHS(CmpInst::Predicate Pred,
 // *) C2 < C1 && C1 <= 0.
 //
 static bool trySimplifyICmpWithAdds(CmpInst::Predicate Pred, Value *LHS,
-                                    Value *RHS) {
+                                    Value *RHS, const InstrInfoQuery &IIQ) {
   // TODO: only support icmp slt for now.
-  if (Pred != CmpInst::ICMP_SLT)
+  if (Pred != CmpInst::ICMP_SLT || !IIQ.UseInstrInfo)
     return false;
 
   // Canonicalize nsw add as RHS.
@@ -3331,7 +3331,7 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
 
     // icmp (X+Y), (X+Z) -> icmp Y,Z for equalities or if there is no overflow.
     bool CanSimplify = (NoLHSWrapProblem && NoRHSWrapProblem) ||
-                       trySimplifyICmpWithAdds(Pred, LHS, RHS);
+                       trySimplifyICmpWithAdds(Pred, LHS, RHS, Q.IIQ);
     if (A && C && (A == C || A == D || B == C || B == D) && CanSimplify) {
       // Determine Y and Z in the form icmp (X+Y), (X+Z).
       Value *Y, *Z;

diff  --git a/llvm/test/Transforms/NewGVN/flags-simplify.ll b/llvm/test/Transforms/NewGVN/flags-simplify.ll
index b6de00e4a8c1d3f..ac0815d48d17af7 100644
--- a/llvm/test/Transforms/NewGVN/flags-simplify.ll
+++ b/llvm/test/Transforms/NewGVN/flags-simplify.ll
@@ -47,7 +47,8 @@ define i64 @lshr_lsh_nuw(i64 %tmp) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CONV3:%.*]] = shl i64 [[TMP:%.*]], 32
 ; CHECK-NEXT:    store i64 [[CONV3]], ptr @f, align 8
-; CHECK-NEXT:    ret i64 [[TMP]]
+; CHECK-NEXT:    [[LSHR:%.*]] = lshr i64 [[CONV3]], 32
+; CHECK-NEXT:    ret i64 [[LSHR]]
 ;
 entry:
   %conv3 = shl nuw i64 %tmp, 32

diff  --git a/llvm/test/Transforms/NewGVN/pair_jumpthread.ll b/llvm/test/Transforms/NewGVN/pair_jumpthread.ll
index b6894912698e129..7e6b39b6b049882 100644
--- a/llvm/test/Transforms/NewGVN/pair_jumpthread.ll
+++ b/llvm/test/Transforms/NewGVN/pair_jumpthread.ll
@@ -34,11 +34,11 @@ define signext i32 @testBI(i32 signext %v) {
 ; CHECK-NEXT:    [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I]], [[TMP0]]
 ; CHECK-NEXT:    br label [[_ZL6CALLEEI_EXIT]]
 ; CHECK:       _ZL6calleei.exit:
-; 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]] ]
-; CHECK-NEXT:    [[PHIOFOPS:%.*]] = phi i64 [ 1, [[IF_THEN_I]] ], [ [[TMP0]], [[IF_ELSE_I]] ]
 ; 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]] ]
-; CHECK-NEXT:    [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[PHIOFOPS1]] to i32
-; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
+; CHECK-NEXT:    [[RC_SROA_43_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[RETVAL_SROA_0_0_I]], 32
+; CHECK-NEXT:    [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RC_SROA_43_0_EXTRACT_SHIFT]] to i32
+; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 1
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
@@ -50,27 +50,32 @@ define signext i32 @testBI(i32 signext %v) {
 ; CHECK-JT-NEXT:  entry:
 ; CHECK-JT-NEXT:    [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
 ; CHECK-JT-NEXT:    [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
-; CHECK-JT-NEXT:    br i1 [[TOBOOL_I]], label [[_ZL6CALLEEI_EXIT:%.*]], label [[_ZL6CALLEEI_EXIT_THREAD:%.*]]
-; CHECK-JT:       _ZL6calleei.exit.thread:
+; CHECK-JT-NEXT:    br i1 [[TOBOOL_I]], label [[IF_ELSE_I:%.*]], label [[IF_THEN_I:%.*]]
+; CHECK-JT:       if.then.i:
 ; CHECK-JT-NEXT:    [[CALL2_I:%.*]] = call signext i32 @dummy(i32 signext [[CALL_I]])
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_22_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL2_I]] to i64
-; CHECK-JT-NEXT:    br label [[IF_THEN:%.*]]
-; CHECK-JT:       _ZL6calleei.exit:
+; CHECK-JT-NEXT:    [[RETVAL_SROA_22_0_INSERT_SHIFT_I_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I_I]], 32
+; CHECK-JT-NEXT:    [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I_I]], 1
+; CHECK-JT-NEXT:    br label [[_ZL6CALLEEI_EXIT:%.*]]
+; CHECK-JT:       if.else.i:
 ; CHECK-JT-NEXT:    [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
 ; CHECK-JT-NEXT:    [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_22_0_INSERT_EXT_I8_I:%.*]] = zext i32 [[V]] to i64
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I:%.*]] = shl nuw i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]], 32
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_0_0_INSERT_INSERT_I11_I:%.*]] = or i64 [[RETVAL_SROA_22_0_INSERT_SHIFT_I9_I]], [[TMP0]]
-; CHECK-JT-NEXT:    [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_22_0_INSERT_EXT_I8_I]] to i32
-; CHECK-JT-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP0]], 0
-; CHECK-JT-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN]]
+; CHECK-JT-NEXT:    br label [[_ZL6CALLEEI_EXIT]]
+; CHECK-JT:       _ZL6calleei.exit:
+; 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]] ]
+; CHECK-JT-NEXT:    [[RC_SROA_43_0_EXTRACT_SHIFT:%.*]] = lshr i64 [[RETVAL_SROA_0_0_I]], 32
+; CHECK-JT-NEXT:    [[RC_SROA_43_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RC_SROA_43_0_EXTRACT_SHIFT]] to i32
+; CHECK-JT-NEXT:    [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 1
+; CHECK-JT-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
+; CHECK-JT-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
 ; CHECK-JT:       if.then:
-; CHECK-JT-NEXT:    [[RC_SROA_43_0_EXTRACT_TRUNC7:%.*]] = phi i32 [ [[CALL2_I]], [[_ZL6CALLEEI_EXIT_THREAD]] ], [ [[RC_SROA_43_0_EXTRACT_TRUNC]], [[_ZL6CALLEEI_EXIT]] ]
 ; CHECK-JT-NEXT:    [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
 ; CHECK-JT-NEXT:    br label [[IF_END]]
 ; CHECK-JT:       if.end:
-; 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]] ]
-; CHECK-JT-NEXT:    ret i32 [[RC_SROA_43_0_EXTRACT_TRUNC8]]
+; CHECK-JT-NEXT:    ret i32 [[RC_SROA_43_0_EXTRACT_TRUNC]]
 ;
 
 entry:
@@ -141,10 +146,10 @@ define signext i32 @testIB(i32 signext %v) {
 ; 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]]
 ; CHECK-NEXT:    br label [[_ZL6CALLEEI_EXIT]]
 ; CHECK:       _ZL6calleei.exit:
-; CHECK-NEXT:    [[PHIOFOPS:%.*]] = phi i64 [ 4294967296, [[IF_THEN_I]] ], [ [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], [[IF_ELSE_I]] ]
 ; 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]] ]
 ; CHECK-NEXT:    [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_I]] to i32
-; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[PHIOFOPS]], 0
+; CHECK-NEXT:    [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 4294967296
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
 ; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
 ; CHECK:       if.then:
 ; CHECK-NEXT:    [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
@@ -156,29 +161,30 @@ define signext i32 @testIB(i32 signext %v) {
 ; CHECK-JT-NEXT:  entry:
 ; CHECK-JT-NEXT:    [[CALL_I:%.*]] = call signext i32 @dummy(i32 signext [[V:%.*]])
 ; CHECK-JT-NEXT:    [[TOBOOL_I:%.*]] = icmp eq i32 [[CALL_I]], 0
-; CHECK-JT-NEXT:    br i1 [[TOBOOL_I]], label [[_ZL6CALLEEI_EXIT:%.*]], label [[_ZL6CALLEEI_EXIT_THREAD:%.*]]
-; CHECK-JT:       _ZL6calleei.exit.thread:
+; CHECK-JT-NEXT:    br i1 [[TOBOOL_I]], label [[IF_ELSE_I:%.*]], label [[IF_THEN_I:%.*]]
+; CHECK-JT:       if.then.i:
 ; CHECK-JT-NEXT:    [[CALL1_I:%.*]] = call signext i32 @dummy(i32 signext [[V]])
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_0_0_INSERT_EXT_I_I:%.*]] = zext i32 [[CALL1_I]] to i64
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_0_0_INSERT_INSERT_I_I:%.*]] = or i64 [[RETVAL_SROA_0_0_INSERT_EXT_I_I]], 4294967296
-; CHECK-JT-NEXT:    [[RC_SROA_0_0_EXTRACT_TRUNC3:%.*]] = trunc i64 [[RETVAL_SROA_0_0_INSERT_INSERT_I_I]] to i32
-; CHECK-JT-NEXT:    br label [[IF_THEN:%.*]]
-; CHECK-JT:       _ZL6calleei.exit:
+; CHECK-JT-NEXT:    br label [[_ZL6CALLEEI_EXIT:%.*]]
+; CHECK-JT:       if.else.i:
 ; CHECK-JT-NEXT:    [[DOTLOBIT_I:%.*]] = lshr i32 [[V]], 31
 ; CHECK-JT-NEXT:    [[TMP0:%.*]] = zext i32 [[DOTLOBIT_I]] to i64
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I:%.*]] = shl nuw nsw i64 [[TMP0]], 32
 ; CHECK-JT-NEXT:    [[RETVAL_SROA_0_0_INSERT_EXT_I9_I:%.*]] = zext i32 [[V]] to i64
 ; 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]]
-; CHECK-JT-NEXT:    [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_INSERT_INSERT_I10_I]] to i32
-; CHECK-JT-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[RETVAL_SROA_2_0_INSERT_SHIFT_I8_I]], 0
-; CHECK-JT-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN]]
+; CHECK-JT-NEXT:    br label [[_ZL6CALLEEI_EXIT]]
+; CHECK-JT:       _ZL6calleei.exit:
+; 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]] ]
+; CHECK-JT-NEXT:    [[RC_SROA_0_0_EXTRACT_TRUNC:%.*]] = trunc i64 [[RETVAL_SROA_0_0_I]] to i32
+; CHECK-JT-NEXT:    [[TMP1:%.*]] = and i64 [[RETVAL_SROA_0_0_I]], 4294967296
+; CHECK-JT-NEXT:    [[TOBOOL:%.*]] = icmp eq i64 [[TMP1]], 0
+; CHECK-JT-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
 ; CHECK-JT:       if.then:
-; 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]] ]
 ; CHECK-JT-NEXT:    [[CALL1:%.*]] = call signext i32 @dummy(i32 signext 0)
 ; CHECK-JT-NEXT:    br label [[IF_END]]
 ; CHECK-JT:       if.end:
-; 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]] ]
-; CHECK-JT-NEXT:    ret i32 [[RC_SROA_0_0_EXTRACT_TRUNC6]]
+; CHECK-JT-NEXT:    ret i32 [[RC_SROA_0_0_EXTRACT_TRUNC]]
 ;
 
 entry:


        


More information about the llvm-commits mailing list