diff options
author | Chad Rosier <mcrosier@codeaurora.org> | 2014-11-14 17:05:59 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@codeaurora.org> | 2014-11-14 17:05:59 +0000 |
commit | f8b55f1bc5aa5278716a77bcd02915e0d1e757ab (patch) | |
tree | 19f9b35dcb7805e471d6805d3a50375dae1f3509 /llvm/lib/Transforms/Scalar/Reassociate.cpp | |
parent | 477e42a6fb199f61c6299851064ef18f15b86815 (diff) | |
download | llvm-f8b55f1bc5aa5278716a77bcd02915e0d1e757ab.zip llvm-f8b55f1bc5aa5278716a77bcd02915e0d1e757ab.tar.gz llvm-f8b55f1bc5aa5278716a77bcd02915e0d1e757ab.tar.bz2 |
[Reassociate] Canonicalize constants to RHS operand.
llvm-svn: 222005
Diffstat (limited to 'llvm/lib/Transforms/Scalar/Reassociate.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/Reassociate.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp index c86317d..42e7aac 100644 --- a/llvm/lib/Transforms/Scalar/Reassociate.cpp +++ b/llvm/lib/Transforms/Scalar/Reassociate.cpp @@ -176,6 +176,7 @@ namespace { private: void BuildRankMap(Function &F); unsigned getRank(Value *V); + void canonicalizeOperands(Instruction *I); void ReassociateExpression(BinaryOperator *I); void RewriteExprTree(BinaryOperator *I, SmallVectorImpl<ValueEntry> &Ops); Value *OptimizeExpression(BinaryOperator *I, @@ -331,6 +332,20 @@ unsigned Reassociate::getRank(Value *V) { return ValueRankMap[I] = Rank; } +void Reassociate::canonicalizeOperands(Instruction *I) { + assert(isa<BinaryOperator>(I) && "Expected binary operator."); + assert(I->isCommutative() && "Expected commutative operator."); + + Value *LHS = I->getOperand(0); + Value *RHS = I->getOperand(1); + unsigned LHSRank = getRank(LHS); + unsigned RHSRank = getRank(RHS); + + // Canonicalize constants to RHS. Otherwise, sort the operands by rank. + if (isa<Constant>(LHS) || RHSRank < LHSRank) + cast<BinaryOperator>(I)->swapOperands(); +} + static BinaryOperator *CreateAdd(Value *S1, Value *S2, const Twine &Name, Instruction *InsertBefore, Value *FlagsOp) { if (S1->getType()->isIntegerTy()) @@ -2070,18 +2085,8 @@ void Reassociate::OptimizeInst(Instruction *I) { // FAdd and FMul can be commuted. unsigned Opcode = I->getOpcode(); - if (Opcode == Instruction::FMul || Opcode == Instruction::FAdd) { - Value *LHS = I->getOperand(0); - Value *RHS = I->getOperand(1); - unsigned LHSRank = getRank(LHS); - unsigned RHSRank = getRank(RHS); - - // Sort the operands by rank. - if (RHSRank < LHSRank) { - I->setOperand(0, RHS); - I->setOperand(1, LHS); - } - } + if (Opcode == Instruction::FMul || Opcode == Instruction::FAdd) + canonicalizeOperands(I); // FIXME: We should commute vector instructions as well. However, this // requires further analysis to determine the effect on later passes. |