@@ -790,7 +790,9 @@ void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
790
790
791
791
if (Q.DC && Q.DT ) {
792
792
// Handle dominating conditions.
793
- for (BranchInst *BI : Q.DC ->conditionsFor (V)) {
793
+ for (auto [BI, Flag] : Q.DC ->conditionsFor (V)) {
794
+ if (!any (Flag & DomConditionFlag::KnownBits))
795
+ continue ;
794
796
BasicBlockEdge Edge0 (BI->getParent (), BI->getSuccessor (0 ));
795
797
if (Q.DT ->dominates (Edge0, Q.CxtI ->getParent ()))
796
798
computeKnownBitsFromCond (V, BI->getCondition (), Known, Depth, Q,
@@ -2299,7 +2301,9 @@ bool llvm::isKnownToBeAPowerOfTwo(const Value *V, bool OrZero, unsigned Depth,
2299
2301
2300
2302
// Handle dominating conditions.
2301
2303
if (Q.DC && Q.CxtI && Q.DT ) {
2302
- for (BranchInst *BI : Q.DC ->conditionsFor (V)) {
2304
+ for (auto [BI, Flag] : Q.DC ->conditionsFor (V)) {
2305
+ if (!any (Flag & DomConditionFlag::PowerOfTwo))
2306
+ continue ;
2303
2307
Value *Cond = BI->getCondition ();
2304
2308
2305
2309
BasicBlockEdge Edge0 (BI->getParent (), BI->getSuccessor (0 ));
@@ -4930,7 +4934,9 @@ static KnownFPClass computeKnownFPClassFromContext(const Value *V,
4930
4934
4931
4935
if (Q.DC && Q.DT ) {
4932
4936
// Handle dominating conditions.
4933
- for (BranchInst *BI : Q.DC ->conditionsFor (V)) {
4937
+ for (auto [BI, Flag] : Q.DC ->conditionsFor (V)) {
4938
+ if (!any (Flag & DomConditionFlag::KnownFPClass))
4939
+ continue ;
4934
4940
Value *Cond = BI->getCondition ();
4935
4941
4936
4942
BasicBlockEdge Edge0 (BI->getParent (), BI->getSuccessor (0 ));
@@ -10014,36 +10020,38 @@ ConstantRange llvm::computeConstantRange(const Value *V, bool ForSigned,
10014
10020
return CR;
10015
10021
}
10016
10022
10017
- static void
10018
- addValueAffectedByCondition ( Value *V,
10019
- function_ref< void (Value *)> InsertAffected ) {
10023
+ static void addValueAffectedByCondition (
10024
+ Value *V, function_ref< void (Value *, DomConditionFlag)> InsertAffected ,
10025
+ DomConditionFlag Flags ) {
10020
10026
assert (V != nullptr );
10021
10027
if (isa<Argument>(V) || isa<GlobalValue>(V)) {
10022
- InsertAffected (V);
10028
+ InsertAffected (V, Flags );
10023
10029
} else if (auto *I = dyn_cast<Instruction>(V)) {
10024
- InsertAffected (V);
10030
+ InsertAffected (V, Flags );
10025
10031
10026
10032
// Peek through unary operators to find the source of the condition.
10027
10033
Value *Op;
10028
10034
if (match (I, m_CombineOr (m_PtrToInt (m_Value (Op)), m_Trunc (m_Value (Op))))) {
10029
10035
if (isa<Instruction>(Op) || isa<Argument>(Op))
10030
- InsertAffected (Op);
10036
+ InsertAffected (Op, Flags );
10031
10037
}
10032
10038
}
10033
10039
}
10034
10040
10035
10041
void llvm::findValuesAffectedByCondition (
10036
- Value *Cond, bool IsAssume, function_ref<void (Value *)> InsertAffected) {
10037
- auto AddAffected = [&InsertAffected](Value *V) {
10038
- addValueAffectedByCondition (V, InsertAffected);
10042
+ Value *Cond, bool IsAssume,
10043
+ function_ref<void (Value *, DomConditionFlag)> InsertAffected) {
10044
+ auto AddAffected = [&InsertAffected](Value *V, DomConditionFlag Flags) {
10045
+ addValueAffectedByCondition (V, InsertAffected, Flags);
10039
10046
};
10040
10047
10041
- auto AddCmpOperands = [&AddAffected, IsAssume](Value *LHS, Value *RHS) {
10048
+ auto AddCmpOperands = [&AddAffected, IsAssume](Value *LHS, Value *RHS,
10049
+ DomConditionFlag Flags) {
10042
10050
if (IsAssume) {
10043
- AddAffected (LHS);
10044
- AddAffected (RHS);
10051
+ AddAffected (LHS, Flags );
10052
+ AddAffected (RHS, Flags );
10045
10053
} else if (match (RHS, m_Constant ()))
10046
- AddAffected (LHS);
10054
+ AddAffected (LHS, Flags );
10047
10055
};
10048
10056
10049
10057
SmallVector<Value *, 8 > Worklist;
@@ -10058,9 +10066,9 @@ void llvm::findValuesAffectedByCondition(
10058
10066
Value *A, *B, *X;
10059
10067
10060
10068
if (IsAssume) {
10061
- AddAffected (V);
10069
+ AddAffected (V, DomConditionFlag::KnownBits );
10062
10070
if (match (V, m_Not (m_Value (X))))
10063
- AddAffected (X);
10071
+ AddAffected (X, DomConditionFlag::KnownBits );
10064
10072
}
10065
10073
10066
10074
if (match (V, m_LogicalOp (m_Value (A), m_Value (B)))) {
@@ -10074,7 +10082,8 @@ void llvm::findValuesAffectedByCondition(
10074
10082
Worklist.push_back (B);
10075
10083
}
10076
10084
} else if (match (V, m_ICmp (Pred, m_Value (A), m_Value (B)))) {
10077
- AddCmpOperands (A, B);
10085
+ AddCmpOperands (A, B,
10086
+ DomConditionFlag::KnownBits | DomConditionFlag::ICmp);
10078
10087
10079
10088
bool HasRHSC = match (B, m_ConstantInt ());
10080
10089
if (ICmpInst::isEquality (Pred)) {
@@ -10084,19 +10093,19 @@ void llvm::findValuesAffectedByCondition(
10084
10093
// (X << C) or (X >>_s C) or (X >>_u C).
10085
10094
if (match (A, m_BitwiseLogic (m_Value (X), m_ConstantInt ())) ||
10086
10095
match (A, m_Shift (m_Value (X), m_ConstantInt ())))
10087
- AddAffected (X);
10096
+ AddAffected (X, DomConditionFlag::KnownBits );
10088
10097
else if (match (A, m_And (m_Value (X), m_Value (Y))) ||
10089
10098
match (A, m_Or (m_Value (X), m_Value (Y)))) {
10090
- AddAffected (X);
10091
- AddAffected (Y);
10099
+ AddAffected (X, DomConditionFlag::KnownBits );
10100
+ AddAffected (Y, DomConditionFlag::KnownBits );
10092
10101
}
10093
10102
}
10094
10103
} else {
10095
10104
if (HasRHSC) {
10096
10105
// Handle (A + C1) u< C2, which is the canonical form of
10097
10106
// A > C3 && A < C4.
10098
10107
if (match (A, m_AddLike (m_Value (X), m_ConstantInt ())))
10099
- AddAffected (X);
10108
+ AddAffected (X, DomConditionFlag::KnownBits );
10100
10109
10101
10110
if (ICmpInst::isUnsigned (Pred)) {
10102
10111
Value *Y;
@@ -10106,42 +10115,42 @@ void llvm::findValuesAffectedByCondition(
10106
10115
if (match (A, m_And (m_Value (X), m_Value (Y))) ||
10107
10116
match (A, m_Or (m_Value (X), m_Value (Y))) ||
10108
10117
match (A, m_NUWAdd (m_Value (X), m_Value (Y)))) {
10109
- AddAffected (X);
10110
- AddAffected (Y);
10118
+ AddAffected (X, DomConditionFlag::KnownBits );
10119
+ AddAffected (Y, DomConditionFlag::KnownBits );
10111
10120
}
10112
10121
// X nuw- Y u> C -> X u> C
10113
10122
if (match (A, m_NUWSub (m_Value (X), m_Value ())))
10114
- AddAffected (X);
10123
+ AddAffected (X, DomConditionFlag::KnownBits );
10115
10124
}
10116
10125
}
10117
10126
10118
10127
// Handle icmp slt/sgt (bitcast X to int), 0/-1, which is supported
10119
10128
// by computeKnownFPClass().
10120
10129
if (match (A, m_ElementWiseBitCast (m_Value (X)))) {
10121
10130
if (Pred == ICmpInst::ICMP_SLT && match (B, m_Zero ()))
10122
- InsertAffected (X);
10131
+ InsertAffected (X, DomConditionFlag::KnownFPClass );
10123
10132
else if (Pred == ICmpInst::ICMP_SGT && match (B, m_AllOnes ()))
10124
- InsertAffected (X);
10133
+ InsertAffected (X, DomConditionFlag::KnownFPClass );
10125
10134
}
10126
10135
}
10127
10136
10128
10137
if (HasRHSC && match (A, m_Intrinsic<Intrinsic::ctpop>(m_Value (X))))
10129
- AddAffected (X);
10138
+ AddAffected (X, DomConditionFlag::PowerOfTwo );
10130
10139
} else if (match (V, m_FCmp (Pred, m_Value (A), m_Value (B)))) {
10131
- AddCmpOperands (A, B);
10140
+ AddCmpOperands (A, B, DomConditionFlag::KnownFPClass );
10132
10141
10133
10142
// fcmp fneg(x), y
10134
10143
// fcmp fabs(x), y
10135
10144
// fcmp fneg(fabs(x)), y
10136
10145
if (match (A, m_FNeg (m_Value (A))))
10137
- AddAffected (A);
10146
+ AddAffected (A, DomConditionFlag::KnownFPClass );
10138
10147
if (match (A, m_FAbs (m_Value (A))))
10139
- AddAffected (A);
10148
+ AddAffected (A, DomConditionFlag::KnownFPClass );
10140
10149
10141
10150
} else if (match (V, m_Intrinsic<Intrinsic::is_fpclass>(m_Value (A),
10142
10151
m_Value ()))) {
10143
10152
// Handle patterns that computeKnownFPClass() support.
10144
- AddAffected (A);
10153
+ AddAffected (A, DomConditionFlag::KnownFPClass );
10145
10154
}
10146
10155
}
10147
10156
}
0 commit comments