[llvm] [InstCombine] Decompose more icmps into masks (PR #110836)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 08:55:39 PDT 2024
================
@@ -100,29 +100,65 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred,
switch (Pred) {
default:
llvm_unreachable("Unexpected predicate");
- case ICmpInst::ICMP_SLT:
+ case ICmpInst::ICMP_SLT: {
// X < 0 is equivalent to (X & SignMask) != 0.
- if (!C.isZero())
- return std::nullopt;
- Result.Mask = APInt::getSignMask(C.getBitWidth());
- Result.Pred = ICmpInst::ICMP_NE;
- break;
+ if (C.isZero()) {
+ Result.Mask = APInt::getSignMask(C.getBitWidth());
+ Result.Cmp = APInt::getZero(C.getBitWidth());
+ Result.Pred = ICmpInst::ICMP_NE;
+ break;
+ }
+
+ APInt FlippedSign = C ^ APInt::getSignMask(C.getBitWidth());
+ if (FlippedSign.isPowerOf2()) {
+ // X s< 10000100 is equivalent to (X & 11111100 == 10000000)
+ Result.Mask = -FlippedSign;
+ Result.Cmp = APInt::getSignMask(C.getBitWidth());
+ Result.Pred = ICmpInst::ICMP_EQ;
+ break;
+ }
+
+ if (FlippedSign.isNegatedPowerOf2()) {
+ // X s< 01111100 is equivalent to (X & 11111100 != 01111100)
+ Result.Mask = FlippedSign;
+ Result.Cmp = C;
+ Result.Pred = ICmpInst::ICMP_NE;
+ break;
+ }
+
+ return std::nullopt;
+ }
case ICmpInst::ICMP_ULT:
// X <u 2^n is equivalent to (X & ~(2^n-1)) == 0.
- if (!C.isPowerOf2())
- return std::nullopt;
- Result.Mask = -C;
- Result.Pred = ICmpInst::ICMP_EQ;
- break;
+ if (C.isPowerOf2()) {
----------------
goldsteinn wrote:
Missing test for this case?
https://github.com/llvm/llvm-project/pull/110836
More information about the llvm-commits
mailing list