[llvm] [InstCombine] Fold (X << Y) / (X << Z) -> (1 << Y) / (1 << Z) (PR #68863)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 12 02:16:42 PDT 2023
================
@@ -980,6 +980,28 @@ static Instruction *foldIDivShl(BinaryOperator &I,
Ret = BinaryOperator::CreateSDiv(X, Y);
}
+ // If X << Y and X << Z does not overflow, then:
+ // (X << Y) / (X << Z) -> (1 << Y) / (1 << Z)
+ // Ignore it when X == 1, to avoid infinite loop.
+ if (match(Op0, m_Shl(m_Value(X), m_Value(Y))) &&
+ match(Op1, m_Shl(m_Specific(X), m_Value(Z))) && !match(X, m_One()) &&
+ (Op0->hasOneUse() || Op1->hasOneUse())) {
----------------
dtcxzyw wrote:
Please add some comments here and add test `sdiv_shl_pair_multi_use`.
https://github.com/llvm/llvm-project/pull/68863
More information about the llvm-commits
mailing list