@@ -9124,6 +9124,14 @@ void llvm::findValuesAffectedByCondition(
91249124 addValueAffectedByCondition (V, InsertAffected);
91259125 };
91269126
9127+ auto AddCmpOperands = [&AddAffected, IsAssume](Value *LHS, Value *RHS) {
9128+ if (IsAssume) {
9129+ AddAffected (LHS);
9130+ AddAffected (RHS);
9131+ } else if (match (RHS, m_Constant ()))
9132+ AddAffected (LHS);
9133+ };
9134+
91279135 SmallVector<Value *, 8 > Worklist;
91289136 SmallPtrSet<Value *, 8 > Visited;
91299137 Worklist.push_back (Cond);
@@ -9135,65 +9143,62 @@ void llvm::findValuesAffectedByCondition(
91359143 CmpInst::Predicate Pred;
91369144 Value *A, *B, *X;
91379145
9138- if (IsAssume)
9146+ if (IsAssume) {
91399147 AddAffected (V);
9148+ if (match (V, m_Not (m_Value (X))))
9149+ AddAffected (X);
9150+ }
9151+
9152+ if (match (V, m_LogicalOp (m_Value (A), m_Value (B)))) {
9153+ // assume(A && B) is split to -> assume(A); assume(B);
9154+ // assume(!(A || B)) is split to -> assume(!A); assume(!B);
9155+ // Finally, assume(A || B) / assume(!(A && B)) generally don't provide
9156+ // enough information to be worth handling (intersection of information as
9157+ // opposed to union).
9158+ if (!IsAssume) {
9159+ Worklist.push_back (A);
9160+ Worklist.push_back (B);
9161+ }
9162+ } else if (match (V, m_ICmp (Pred, m_Value (A), m_Value (B)))) {
9163+ AddCmpOperands (A, B);
9164+
9165+ if (ICmpInst::isEquality (Pred)) {
9166+ if (match (B, m_ConstantInt ())) {
9167+ // (X & C) or (X | C) or (X ^ C).
9168+ // (X << C) or (X >>_s C) or (X >>_u C).
9169+ if (match (A, m_BitwiseLogic (m_Value (X), m_ConstantInt ())) ||
9170+ match (A, m_Shift (m_Value (X), m_ConstantInt ())))
9171+ AddAffected (X);
9172+ }
9173+ } else {
9174+ // Handle (A + C1) u< C2, which is the canonical form of
9175+ // A > C3 && A < C4.
9176+ if (match (A, m_Add (m_Value (X), m_ConstantInt ())) &&
9177+ match (B, m_ConstantInt ()))
9178+ AddAffected (X);
9179+
9180+ // Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
9181+ // by computeKnownFPClass().
9182+ if (match (A, m_ElementWiseBitCast (m_Value (X)))) {
9183+ if (Pred == ICmpInst::ICMP_SLT && match (B, m_Zero ()))
9184+ InsertAffected (X);
9185+ else if (Pred == ICmpInst::ICMP_SGT && match (B, m_AllOnes ()))
9186+ InsertAffected (X);
9187+ }
9188+ }
9189+ } else if (match (Cond, m_FCmp (Pred, m_Value (A), m_Value (B)))) {
9190+ AddCmpOperands (A, B);
91409191
9141- if (IsAssume && match (V, m_Not (m_Value (X))))
9142- AddAffected (X);
9143- if (!IsAssume && match (V, m_LogicalOp (m_Value (A), m_Value (B)))) {
9144- Worklist.push_back (A);
9145- Worklist.push_back (B);
9146- } else if (match (V, m_Cmp (Pred, m_Value (A), m_Value (B))) &&
9147- (IsAssume || isa<ICmpInst>(V))) {
9148- if (IsAssume || match (B, m_Constant ())) {
9192+ // fcmp fneg(x), y
9193+ // fcmp fabs(x), y
9194+ // fcmp fneg(fabs(x)), y
9195+ if (match (A, m_FNeg (m_Value (A))))
9196+ AddAffected (A);
9197+ if (match (A, m_FAbs (m_Value (A))))
91499198 AddAffected (A);
9150- if (IsAssume)
9151- AddAffected (B);
9152-
9153- if (IsAssume ? (Pred == ICmpInst::ICMP_EQ)
9154- : ICmpInst::isEquality (Pred)) {
9155- if (match (B, m_ConstantInt ())) {
9156- // (X & C) or (X | C) or (X ^ C).
9157- // (X << C) or (X >>_s C) or (X >>_u C).
9158- if (match (A, m_BitwiseLogic (m_Value (X), m_ConstantInt ())) ||
9159- match (A, m_Shift (m_Value (X), m_ConstantInt ())))
9160- AddAffected (X);
9161- }
9162- } else {
9163- if (Pred == ICmpInst::ICMP_NE)
9164- if (match (A, m_And (m_Value (X), m_Power2 ())) && match (B, m_Zero ()))
9165- AddAffected (X);
9166-
9167- if (!IsAssume || Pred == ICmpInst::ICMP_ULT) {
9168- // Handle (A + C1) u< C2, which is the canonical form of
9169- // A > C3 && A < C4.
9170- if (match (A, m_Add (m_Value (X), m_ConstantInt ())) &&
9171- match (B, m_ConstantInt ()))
9172- AddAffected (X);
9173- }
9174- if (!IsAssume) {
9175- // Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
9176- // by computeKnownFPClass().
9177- if ((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_SGT) &&
9178- match (A, m_ElementWiseBitCast (m_Value (X))))
9179- InsertAffected (X);
9180- }
91819199
9182- if (IsAssume && CmpInst::isFPPredicate (Pred)) {
9183- // fcmp fneg(x), y
9184- // fcmp fabs(x), y
9185- // fcmp fneg(fabs(x)), y
9186- if (match (A, m_FNeg (m_Value (A))))
9187- AddAffected (A);
9188- if (match (A, m_FAbs (m_Value (A))))
9189- AddAffected (A);
9190- }
9191- }
9192- }
9193- } else if ((!IsAssume &&
9194- match (Cond, m_FCmp (Pred, m_Value (A), m_Constant ()))) ||
9195- match (Cond, m_Intrinsic<Intrinsic::is_fpclass>(m_Value (A),
9196- m_Value (B)))) {
9200+ } else if (match (V, m_Intrinsic<Intrinsic::is_fpclass>(m_Value (A),
9201+ m_Value ()))) {
91979202 // Handle patterns that computeKnownFPClass() support.
91989203 AddAffected (A);
91999204 }
0 commit comments