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