Split up subtracts into add+negate if they have a reassociable use or operand

that is also a subtract.  This implements PR2047 and Transforms/Reassociate/subtest2.ll 


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47241 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-02-17 20:51:26 +00:00
parent f06c3c29ac
commit 0b0803ae15
2 changed files with 21 additions and 5 deletions

View File

@ -399,13 +399,16 @@ static bool ShouldBreakUpSubtract(Instruction *Sub) {
return false;
// Don't bother to break this up unless either the LHS is an associable add or
// if this is only used by one.
if (isReassociableOp(Sub->getOperand(0), Instruction::Add))
// subtract or if this is only used by one.
if (isReassociableOp(Sub->getOperand(0), Instruction::Add) ||
isReassociableOp(Sub->getOperand(0), Instruction::Sub))
return true;
if (isReassociableOp(Sub->getOperand(1), Instruction::Add))
if (isReassociableOp(Sub->getOperand(1), Instruction::Add) ||
isReassociableOp(Sub->getOperand(0), Instruction::Sub))
return true;
if (Sub->hasOneUse() && isReassociableOp(Sub->use_back(), Instruction::Add))
if (Sub->hasOneUse() &&
(isReassociableOp(Sub->use_back(), Instruction::Add) ||
isReassociableOp(Sub->use_back(), Instruction::Sub)))
return true;
return false;

View File

@ -0,0 +1,13 @@
; With sub reassociation, constant folding can eliminate the uses of %a.
;
; RUN: llvm-as < %s | opt -reassociate -instcombine | llvm-dis | grep %a | count 1
; PR2047
define i32 @test(i32 %a, i32 %b, i32 %c) nounwind {
entry:
%tmp3 = sub i32 %a, %b ; <i32> [#uses=1]
%tmp5 = sub i32 %tmp3, %c ; <i32> [#uses=1]
%tmp7 = sub i32 %tmp5, %a ; <i32> [#uses=1]
ret i32 %tmp7
}