mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-15 22:28:18 +00:00
InstCombine: Propagate NSW/NUW for X*(1<<Y) -> X<<Y
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222613 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -295,10 +295,23 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
|
|||||||
// (1 << Y)*X --> X << Y
|
// (1 << Y)*X --> X << Y
|
||||||
{
|
{
|
||||||
Value *Y;
|
Value *Y;
|
||||||
if (match(Op0, m_Shl(m_One(), m_Value(Y))))
|
BinaryOperator *BO = nullptr;
|
||||||
return BinaryOperator::CreateShl(Op1, Y);
|
bool ShlNSW = false;
|
||||||
if (match(Op1, m_Shl(m_One(), m_Value(Y))))
|
if (match(Op0, m_Shl(m_One(), m_Value(Y)))) {
|
||||||
return BinaryOperator::CreateShl(Op0, Y);
|
BO = BinaryOperator::CreateShl(Op1, Y);
|
||||||
|
ShlNSW = cast<BinaryOperator>(Op0)->hasNoSignedWrap();
|
||||||
|
}
|
||||||
|
if (match(Op1, m_Shl(m_One(), m_Value(Y)))) {
|
||||||
|
BO = BinaryOperator::CreateShl(Op0, Y);
|
||||||
|
ShlNSW = cast<BinaryOperator>(Op1)->hasNoSignedWrap();
|
||||||
|
}
|
||||||
|
if (BO) {
|
||||||
|
if (I.hasNoUnsignedWrap())
|
||||||
|
BO->setHasNoUnsignedWrap();
|
||||||
|
if (I.hasNoSignedWrap() && ShlNSW)
|
||||||
|
BO->setHasNoSignedWrap();
|
||||||
|
return BO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If one of the operands of the multiply is a cast from a boolean value, then
|
// If one of the operands of the multiply is a cast from a boolean value, then
|
||||||
|
@@ -229,3 +229,19 @@ define i32 @test25(i32 %A, i32 %B) {
|
|||||||
ret i32 %E
|
ret i32 %E
|
||||||
; CHECK: mul nsw i32 %A, %B
|
; CHECK: mul nsw i32 %A, %B
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i32 @test26(i32 %A, i32 %B) {
|
||||||
|
; CHECK-LABEL: @test26(
|
||||||
|
%C = shl nsw i32 1, %B
|
||||||
|
%D = mul nsw i32 %A, %C
|
||||||
|
ret i32 %D
|
||||||
|
; CHECK: shl nsw i32 %A, %B
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @test27(i32 %A, i32 %B) {
|
||||||
|
; CHECK-LABEL: @test27(
|
||||||
|
%C = shl i32 1, %B
|
||||||
|
%D = mul nuw i32 %A, %C
|
||||||
|
ret i32 %D
|
||||||
|
; CHECK: shl nuw i32 %A, %B
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user