From 93f8455d73858c418ee7371b8e89094716df8fc7 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Mon, 22 Nov 2010 20:31:27 +0000 Subject: [PATCH] InstCombine: Implement X - A*-B -> X + A*B. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119984 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/README.txt | 16 --------------- .../InstCombine/InstCombineAddSub.cpp | 9 +++++++++ test/Transforms/InstCombine/sub.ll | 20 +++++++++++++++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 1ec4cdf4ba9..4d5b17ab367 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -1736,22 +1736,6 @@ Another similar case involves truncations on 64-bit targets: ... %367 = icmp eq i32 %362, 0 ; [#uses=1] - -//===---------------------------------------------------------------------===// - -Missed instcombine/dagcombine transformation: -define i32 @a(i32 %x, i32 %y) nounwind readnone { -entry: - %mul = mul i32 %y, -8 - %sub = sub i32 %x, %mul - ret i32 %sub -} - -Should compile to something like x+y*8, but currently compiles to an -inefficient result. Testcase derived from gcc. C testcase: - -int a(int x, int y) { return y-x*-8; } - //===---------------------------------------------------------------------===// Missed instcombine/dagcombine transformation: diff --git a/lib/Transforms/InstCombine/InstCombineAddSub.cpp b/lib/Transforms/InstCombine/InstCombineAddSub.cpp index 9b72eb924ac..c04a6b2a627 100644 --- a/lib/Transforms/InstCombine/InstCombineAddSub.cpp +++ b/lib/Transforms/InstCombine/InstCombineAddSub.cpp @@ -675,6 +675,15 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) { C2); return BinaryOperator::CreateMul(Op0, CP1); } + + // X - A*-B -> X + A*B + // X - -A*B -> X + A*B + Value *A, *B; + if (match(Op1I, m_Mul(m_Value(A), m_Neg(m_Value(B)))) || + match(Op1I, m_Mul(m_Neg(m_Value(A)), m_Value(B)))) { + Value *NewMul = Builder->CreateMul(A, B); + return BinaryOperator::CreateAdd(Op0, NewMul); + } } } diff --git a/test/Transforms/InstCombine/sub.ll b/test/Transforms/InstCombine/sub.ll index 29bd7be2ff8..d88860056a1 100644 --- a/test/Transforms/InstCombine/sub.ll +++ b/test/Transforms/InstCombine/sub.ll @@ -281,3 +281,23 @@ define i32 @test26(i32 %x) { ; CHECK-NEXT: ret i32 } +define i32 @test27(i32 %x, i32 %y) { + %mul = mul i32 %y, -8 + %sub = sub i32 %x, %mul + ret i32 %sub +; CHECK: @test27 +; CHECK-NEXT: shl i32 %y, 3 +; CHECK-NEXT: add i32 +; CHECK-NEXT: ret i32 +} + +define i32 @test28(i32 %x, i32 %y, i32 %z) { + %neg = sub i32 0, %z + %mul = mul i32 %neg, %y + %sub = sub i32 %x, %mul + ret i32 %sub +; CHECK: @test28 +; CHECK-NEXT: mul i32 %z, %y +; CHECK-NEXT: add i32 +; CHECK-NEXT: ret i32 +}