[llvm] c4c7500 - [InstCombine] fold mul of signbit directly to X < 0 ? Y : 0
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Thu May 26 13:19:38 PDT 2022
Author: Sanjay Patel
Date: 2022-05-26T16:19:15-04:00
New Revision: c4c750058f3e3b85c24a9e3ad356b76290e7c259
URL: https://github.com/llvm/llvm-project/commit/c4c750058f3e3b85c24a9e3ad356b76290e7c259
DIFF: https://github.com/llvm/llvm-project/commit/c4c750058f3e3b85c24a9e3ad356b76290e7c259.diff
LOG: [InstCombine] fold mul of signbit directly to X < 0 ? Y : 0
This is effectively NFC (intentionally no test diffs)
because we already have the related fold that converts
the 'and' pattern to select. So this is just an efficiency
improvement.
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
index ea40f088c130..0441203e249a 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
@@ -363,17 +363,15 @@ Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) {
return SelectInst::Create(X, NegC, ConstantInt::getNullValue(I.getType()));
}
- // (lshr X, 31) * Y --> (ashr X, 31) & Y
- // Y * (lshr X, 31) --> (ashr X, 31) & Y
+ // (lshr X, 31) * Y --> (X < 0) ? Y : 0
// TODO: We are not checking one-use because the elimination of the multiply
// is better for analysis?
- // TODO: Should we canonicalize to '(X < 0) ? Y : 0' instead? That would be
- // more similar to what we're doing above.
const APInt *C;
- if (match(Op0, m_LShr(m_Value(X), m_APInt(C))) && *C == C->getBitWidth() - 1)
- return BinaryOperator::CreateAnd(Builder.CreateAShr(X, *C), Op1);
- if (match(Op1, m_LShr(m_Value(X), m_APInt(C))) && *C == C->getBitWidth() - 1)
- return BinaryOperator::CreateAnd(Builder.CreateAShr(X, *C), Op0);
+ if (match(&I, m_c_Mul(m_LShr(m_Value(X), m_APInt(C)), m_Value(Y))) &&
+ *C == C->getBitWidth() - 1) {
+ Value *IsNeg = Builder.CreateIsNeg(X, "isneg");
+ return SelectInst::Create(IsNeg, Y, ConstantInt::getNullValue(I.getType()));
+ }
// ((ashr X, 31) | 1) * X --> abs(X)
// X * ((ashr X, 31) | 1) --> abs(X)
More information about the llvm-commits
mailing list