aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Scalar/Reassociate.cpp
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@codeaurora.org>2014-11-14 17:05:59 +0000
committerChad Rosier <mcrosier@codeaurora.org>2014-11-14 17:05:59 +0000
commitf8b55f1bc5aa5278716a77bcd02915e0d1e757ab (patch)
tree19f9b35dcb7805e471d6805d3a50375dae1f3509 /llvm/lib/Transforms/Scalar/Reassociate.cpp
parent477e42a6fb199f61c6299851064ef18f15b86815 (diff)
downloadllvm-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.cpp29
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.