[llvm] [InstCombine] simplify `(X * C0) / (X * C1)` into `C0 / C1`. (PR #73204)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 22 20:31:35 PST 2023
================
@@ -1207,6 +1207,18 @@ Instruction *InstCombinerImpl::commonIDivTransforms(BinaryOperator &I) {
}
}
+ // (X * C0) / (X * C1) --> C0 / C1
+ Constant *C0, *C1;
+ if (match(Op0, m_c_Mul(m_Value(X), m_Constant(C0))) &&
+ match(Op1, m_c_Mul(m_Specific(X), m_Constant(C1)))) {
+ auto OB0HasNSW = cast<OverflowingBinaryOperator>(Op0)->hasNoSignedWrap();
+ auto OB0HasNUW = cast<OverflowingBinaryOperator>(Op0)->hasNoUnsignedWrap();
+ if ((IsSigned && OB0HasNSW) || (!IsSigned && OB0HasNUW)) {
+ replaceOperand(I, 0, C0);
+ replaceOperand(I, 1, C1);
+ return &I;
----------------
dtcxzyw wrote:
Please use `BinaryOperator::CreateUDiv` and `BinaryOperator::CreateSDiv`.
https://github.com/llvm/llvm-project/pull/73204
More information about the llvm-commits
mailing list