[llvm] [InstCombine] Decompose more icmps into masks (PR #110836)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 08:55:49 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()) {
----------------
goldsteinn wrote:
Missing test for this case?
https://github.com/llvm/llvm-project/pull/110836
More information about the llvm-commits
mailing list