@@ -79,13 +79,19 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred,
79
79
using namespace PatternMatch ;
80
80
81
81
const APInt *C;
82
- if (!match (RHS, m_APIntAllowPoison (C)))
82
+ if (!ICmpInst::isRelational (Pred) || ! match (RHS, m_APIntAllowPoison (C)))
83
83
return std::nullopt;
84
84
85
+ bool Inverted = false ;
86
+ if (ICmpInst::isGT (Pred) || ICmpInst::isGE (Pred)) {
87
+ Inverted = true ;
88
+ Pred = ICmpInst::getInversePredicate (Pred);
89
+ }
90
+
85
91
DecomposedBitTest Result;
86
92
switch (Pred) {
87
93
default :
88
- return std::nullopt ;
94
+ llvm_unreachable ( " Unexpected predicate " ) ;
89
95
case ICmpInst::ICMP_SLT:
90
96
// X < 0 is equivalent to (X & SignMask) != 0.
91
97
if (!C->isZero ())
@@ -100,20 +106,6 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred,
100
106
Result.Mask = APInt::getSignMask (C->getBitWidth ());
101
107
Result.Pred = ICmpInst::ICMP_NE;
102
108
break ;
103
- case ICmpInst::ICMP_SGT:
104
- // X > -1 is equivalent to (X & SignMask) == 0.
105
- if (!C->isAllOnes ())
106
- return std::nullopt;
107
- Result.Mask = APInt::getSignMask (C->getBitWidth ());
108
- Result.Pred = ICmpInst::ICMP_EQ;
109
- break ;
110
- case ICmpInst::ICMP_SGE:
111
- // X >= 0 is equivalent to (X & SignMask) == 0.
112
- if (!C->isZero ())
113
- return std::nullopt;
114
- Result.Mask = APInt::getSignMask (C->getBitWidth ());
115
- Result.Pred = ICmpInst::ICMP_EQ;
116
- break ;
117
109
case ICmpInst::ICMP_ULT:
118
110
// X <u 2^n is equivalent to (X & ~(2^n-1)) == 0.
119
111
if (!C->isPowerOf2 ())
@@ -128,22 +120,11 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred,
128
120
Result.Mask = ~*C;
129
121
Result.Pred = ICmpInst::ICMP_EQ;
130
122
break ;
131
- case ICmpInst::ICMP_UGT:
132
- // X >u 2^n-1 is equivalent to (X & ~(2^n-1)) != 0.
133
- if (!(*C + 1 ).isPowerOf2 ())
134
- return std::nullopt;
135
- Result.Mask = ~*C;
136
- Result.Pred = ICmpInst::ICMP_NE;
137
- break ;
138
- case ICmpInst::ICMP_UGE:
139
- // X >=u 2^n is equivalent to (X & ~(2^n-1)) != 0.
140
- if (!C->isPowerOf2 ())
141
- return std::nullopt;
142
- Result.Mask = -*C;
143
- Result.Pred = ICmpInst::ICMP_NE;
144
- break ;
145
123
}
146
124
125
+ if (Inverted)
126
+ Result.Pred = ICmpInst::getInversePredicate (Result.Pred );
127
+
147
128
Value *X;
148
129
if (LookThruTrunc && match (LHS, m_Trunc (m_Value (X)))) {
149
130
Result.X = X;
0 commit comments