@@ -9124,6 +9124,14 @@ void llvm::findValuesAffectedByCondition(
9124
9124
addValueAffectedByCondition (V, InsertAffected);
9125
9125
};
9126
9126
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
+
9127
9135
SmallVector<Value *, 8 > Worklist;
9128
9136
SmallPtrSet<Value *, 8 > Visited;
9129
9137
Worklist.push_back (Cond);
@@ -9135,65 +9143,62 @@ void llvm::findValuesAffectedByCondition(
9135
9143
CmpInst::Predicate Pred;
9136
9144
Value *A, *B, *X;
9137
9145
9138
- if (IsAssume)
9146
+ if (IsAssume) {
9139
9147
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);
9140
9191
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))))
9149
9198
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
- }
9181
9199
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 ()))) {
9197
9202
// Handle patterns that computeKnownFPClass() support.
9198
9203
AddAffected (A);
9199
9204
}
0 commit comments