Reassociate.cpp revision 9d6565a5b1fbc4286d6ee638d8f47a3171a9ed7e
1//===- Reassociate.cpp - Reassociate binary expressions -------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This pass reassociates commutative expressions in an order that is designed
11// to promote better constant propagation, GCSE, LICM, PRE...
12//
13// For example: 4 + (x + 5) -> x + (4 + 5)
14//
15// In the implementation of this algorithm, constants are assigned rank = 0,
16// function arguments are rank = 1, and other values are assigned ranks
17// corresponding to the reverse post order traversal of current function
18// (starting at 2), which effectively gives values in deep loops higher rank
19// than values not in loops.
20//
21//===----------------------------------------------------------------------===//
22
23#define DEBUG_TYPE "reassociate"
24#include "llvm/Transforms/Scalar.h"
25#include "llvm/Constants.h"
26#include "llvm/DerivedTypes.h"
27#include "llvm/Function.h"
28#include "llvm/Instructions.h"
29#include "llvm/Pass.h"
30#include "llvm/Assembly/Writer.h"
31#include "llvm/Support/CFG.h"
32#include "llvm/Support/Compiler.h"
33#include "llvm/Support/Debug.h"
34#include "llvm/ADT/PostOrderIterator.h"
35#include "llvm/ADT/Statistic.h"
36#include <algorithm>
37using namespace llvm;
38
39STATISTIC(NumLinear , "Number of insts linearized");
40STATISTIC(NumChanged, "Number of insts reassociated");
41STATISTIC(NumAnnihil, "Number of expr tree annihilated");
42STATISTIC(NumFactor , "Number of multiplies factored");
43
44namespace {
45  struct VISIBILITY_HIDDEN ValueEntry {
46    unsigned Rank;
47    Value *Op;
48    ValueEntry(unsigned R, Value *O) : Rank(R), Op(O) {}
49  };
50  inline bool operator<(const ValueEntry &LHS, const ValueEntry &RHS) {
51    return LHS.Rank > RHS.Rank;   // Sort so that highest rank goes to start.
52  }
53}
54
55/// PrintOps - Print out the expression identified in the Ops list.
56///
57static void PrintOps(Instruction *I, const std::vector<ValueEntry> &Ops) {
58  Module *M = I->getParent()->getParent()->getParent();
59  cerr << Instruction::getOpcodeName(I->getOpcode()) << " "
60  << *Ops[0].Op->getType();
61  for (unsigned i = 0, e = Ops.size(); i != e; ++i)
62    WriteAsOperand(*cerr.stream() << " ", Ops[i].Op, false, M)
63      << "," << Ops[i].Rank;
64}
65
66namespace {
67  class VISIBILITY_HIDDEN Reassociate : public FunctionPass {
68    std::map<BasicBlock*, unsigned> RankMap;
69    std::map<Value*, unsigned> ValueRankMap;
70    bool MadeChange;
71  public:
72    bool runOnFunction(Function &F);
73
74    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
75      AU.setPreservesCFG();
76    }
77  private:
78    void BuildRankMap(Function &F);
79    unsigned getRank(Value *V);
80    void ReassociateExpression(BinaryOperator *I);
81    void RewriteExprTree(BinaryOperator *I, std::vector<ValueEntry> &Ops,
82                         unsigned Idx = 0);
83    Value *OptimizeExpression(BinaryOperator *I, std::vector<ValueEntry> &Ops);
84    void LinearizeExprTree(BinaryOperator *I, std::vector<ValueEntry> &Ops);
85    void LinearizeExpr(BinaryOperator *I);
86    Value *RemoveFactorFromExpression(Value *V, Value *Factor);
87    void ReassociateBB(BasicBlock *BB);
88
89    void RemoveDeadBinaryOp(Value *V);
90  };
91
92  RegisterPass<Reassociate> X("reassociate", "Reassociate expressions");
93}
94
95// Public interface to the Reassociate pass
96FunctionPass *llvm::createReassociatePass() { return new Reassociate(); }
97
98void Reassociate::RemoveDeadBinaryOp(Value *V) {
99  Instruction *Op = dyn_cast<Instruction>(V);
100  if (!Op || !isa<BinaryOperator>(Op) || !isa<CmpInst>(Op) || !Op->use_empty())
101    return;
102
103  Value *LHS = Op->getOperand(0), *RHS = Op->getOperand(1);
104  RemoveDeadBinaryOp(LHS);
105  RemoveDeadBinaryOp(RHS);
106}
107
108
109static bool isUnmovableInstruction(Instruction *I) {
110  if (I->getOpcode() == Instruction::PHI ||
111      I->getOpcode() == Instruction::Alloca ||
112      I->getOpcode() == Instruction::Load ||
113      I->getOpcode() == Instruction::Malloc ||
114      I->getOpcode() == Instruction::Invoke ||
115      I->getOpcode() == Instruction::Call ||
116      I->getOpcode() == Instruction::UDiv ||
117      I->getOpcode() == Instruction::SDiv ||
118      I->getOpcode() == Instruction::FDiv ||
119      I->getOpcode() == Instruction::URem ||
120      I->getOpcode() == Instruction::SRem ||
121      I->getOpcode() == Instruction::FRem)
122    return true;
123  return false;
124}
125
126void Reassociate::BuildRankMap(Function &F) {
127  unsigned i = 2;
128
129  // Assign distinct ranks to function arguments
130  for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I)
131    ValueRankMap[I] = ++i;
132
133  ReversePostOrderTraversal<Function*> RPOT(&F);
134  for (ReversePostOrderTraversal<Function*>::rpo_iterator I = RPOT.begin(),
135         E = RPOT.end(); I != E; ++I) {
136    BasicBlock *BB = *I;
137    unsigned BBRank = RankMap[BB] = ++i << 16;
138
139    // Walk the basic block, adding precomputed ranks for any instructions that
140    // we cannot move.  This ensures that the ranks for these instructions are
141    // all different in the block.
142    for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
143      if (isUnmovableInstruction(I))
144        ValueRankMap[I] = ++BBRank;
145  }
146}
147
148unsigned Reassociate::getRank(Value *V) {
149  if (isa<Argument>(V)) return ValueRankMap[V];   // Function argument...
150
151  Instruction *I = dyn_cast<Instruction>(V);
152  if (I == 0) return 0;  // Otherwise it's a global or constant, rank 0.
153
154  unsigned &CachedRank = ValueRankMap[I];
155  if (CachedRank) return CachedRank;    // Rank already known?
156
157  // If this is an expression, return the 1+MAX(rank(LHS), rank(RHS)) so that
158  // we can reassociate expressions for code motion!  Since we do not recurse
159  // for PHI nodes, we cannot have infinite recursion here, because there
160  // cannot be loops in the value graph that do not go through PHI nodes.
161  unsigned Rank = 0, MaxRank = RankMap[I->getParent()];
162  for (unsigned i = 0, e = I->getNumOperands();
163       i != e && Rank != MaxRank; ++i)
164    Rank = std::max(Rank, getRank(I->getOperand(i)));
165
166  // If this is a not or neg instruction, do not count it for rank.  This
167  // assures us that X and ~X will have the same rank.
168  if (!I->getType()->isInteger() ||
169      (!BinaryOperator::isNot(I) && !BinaryOperator::isNeg(I)))
170    ++Rank;
171
172  //DOUT << "Calculated Rank[" << V->getName() << "] = "
173  //     << Rank << "\n";
174
175  return CachedRank = Rank;
176}
177
178/// isReassociableOp - Return true if V is an instruction of the specified
179/// opcode and if it only has one use.
180static BinaryOperator *isReassociableOp(Value *V, unsigned Opcode) {
181  if ((V->hasOneUse() || V->use_empty()) && isa<Instruction>(V) &&
182      cast<Instruction>(V)->getOpcode() == Opcode)
183    return cast<BinaryOperator>(V);
184  return 0;
185}
186
187/// LowerNegateToMultiply - Replace 0-X with X*-1.
188///
189static Instruction *LowerNegateToMultiply(Instruction *Neg) {
190  Constant *Cst = ConstantInt::getAllOnesValue(Neg->getType());
191
192  Instruction *Res = BinaryOperator::createMul(Neg->getOperand(1), Cst, "",Neg);
193  Res->takeName(Neg);
194  Neg->replaceAllUsesWith(Res);
195  Neg->eraseFromParent();
196  return Res;
197}
198
199// Given an expression of the form '(A+B)+(D+C)', turn it into '(((A+B)+C)+D)'.
200// Note that if D is also part of the expression tree that we recurse to
201// linearize it as well.  Besides that case, this does not recurse into A,B, or
202// C.
203void Reassociate::LinearizeExpr(BinaryOperator *I) {
204  BinaryOperator *LHS = cast<BinaryOperator>(I->getOperand(0));
205  BinaryOperator *RHS = cast<BinaryOperator>(I->getOperand(1));
206  assert(isReassociableOp(LHS, I->getOpcode()) &&
207         isReassociableOp(RHS, I->getOpcode()) &&
208         "Not an expression that needs linearization?");
209
210  DOUT << "Linear" << *LHS << *RHS << *I;
211
212  // Move the RHS instruction to live immediately before I, avoiding breaking
213  // dominator properties.
214  RHS->moveBefore(I);
215
216  // Move operands around to do the linearization.
217  I->setOperand(1, RHS->getOperand(0));
218  RHS->setOperand(0, LHS);
219  I->setOperand(0, RHS);
220
221  ++NumLinear;
222  MadeChange = true;
223  DOUT << "Linearized: " << *I;
224
225  // If D is part of this expression tree, tail recurse.
226  if (isReassociableOp(I->getOperand(1), I->getOpcode()))
227    LinearizeExpr(I);
228}
229
230
231/// LinearizeExprTree - Given an associative binary expression tree, traverse
232/// all of the uses putting it into canonical form.  This forces a left-linear
233/// form of the the expression (((a+b)+c)+d), and collects information about the
234/// rank of the non-tree operands.
235///
236/// NOTE: These intentionally destroys the expression tree operands (turning
237/// them into undef values) to reduce #uses of the values.  This means that the
238/// caller MUST use something like RewriteExprTree to put the values back in.
239///
240void Reassociate::LinearizeExprTree(BinaryOperator *I,
241                                    std::vector<ValueEntry> &Ops) {
242  Value *LHS = I->getOperand(0), *RHS = I->getOperand(1);
243  unsigned Opcode = I->getOpcode();
244
245  // First step, linearize the expression if it is in ((A+B)+(C+D)) form.
246  BinaryOperator *LHSBO = isReassociableOp(LHS, Opcode);
247  BinaryOperator *RHSBO = isReassociableOp(RHS, Opcode);
248
249  // If this is a multiply expression tree and it contains internal negations,
250  // transform them into multiplies by -1 so they can be reassociated.
251  if (I->getOpcode() == Instruction::Mul) {
252    if (!LHSBO && LHS->hasOneUse() && BinaryOperator::isNeg(LHS)) {
253      LHS = LowerNegateToMultiply(cast<Instruction>(LHS));
254      LHSBO = isReassociableOp(LHS, Opcode);
255    }
256    if (!RHSBO && RHS->hasOneUse() && BinaryOperator::isNeg(RHS)) {
257      RHS = LowerNegateToMultiply(cast<Instruction>(RHS));
258      RHSBO = isReassociableOp(RHS, Opcode);
259    }
260  }
261
262  if (!LHSBO) {
263    if (!RHSBO) {
264      // Neither the LHS or RHS as part of the tree, thus this is a leaf.  As
265      // such, just remember these operands and their rank.
266      Ops.push_back(ValueEntry(getRank(LHS), LHS));
267      Ops.push_back(ValueEntry(getRank(RHS), RHS));
268
269      // Clear the leaves out.
270      I->setOperand(0, UndefValue::get(I->getType()));
271      I->setOperand(1, UndefValue::get(I->getType()));
272      return;
273    } else {
274      // Turn X+(Y+Z) -> (Y+Z)+X
275      std::swap(LHSBO, RHSBO);
276      std::swap(LHS, RHS);
277      bool Success = !I->swapOperands();
278      assert(Success && "swapOperands failed");
279      MadeChange = true;
280    }
281  } else if (RHSBO) {
282    // Turn (A+B)+(C+D) -> (((A+B)+C)+D).  This guarantees the the RHS is not
283    // part of the expression tree.
284    LinearizeExpr(I);
285    LHS = LHSBO = cast<BinaryOperator>(I->getOperand(0));
286    RHS = I->getOperand(1);
287    RHSBO = 0;
288  }
289
290  // Okay, now we know that the LHS is a nested expression and that the RHS is
291  // not.  Perform reassociation.
292  assert(!isReassociableOp(RHS, Opcode) && "LinearizeExpr failed!");
293
294  // Move LHS right before I to make sure that the tree expression dominates all
295  // values.
296  LHSBO->moveBefore(I);
297
298  // Linearize the expression tree on the LHS.
299  LinearizeExprTree(LHSBO, Ops);
300
301  // Remember the RHS operand and its rank.
302  Ops.push_back(ValueEntry(getRank(RHS), RHS));
303
304  // Clear the RHS leaf out.
305  I->setOperand(1, UndefValue::get(I->getType()));
306}
307
308// RewriteExprTree - Now that the operands for this expression tree are
309// linearized and optimized, emit them in-order.  This function is written to be
310// tail recursive.
311void Reassociate::RewriteExprTree(BinaryOperator *I,
312                                  std::vector<ValueEntry> &Ops,
313                                  unsigned i) {
314  if (i+2 == Ops.size()) {
315    if (I->getOperand(0) != Ops[i].Op ||
316        I->getOperand(1) != Ops[i+1].Op) {
317      Value *OldLHS = I->getOperand(0);
318      DOUT << "RA: " << *I;
319      I->setOperand(0, Ops[i].Op);
320      I->setOperand(1, Ops[i+1].Op);
321      DOUT << "TO: " << *I;
322      MadeChange = true;
323      ++NumChanged;
324
325      // If we reassociated a tree to fewer operands (e.g. (1+a+2) -> (a+3)
326      // delete the extra, now dead, nodes.
327      RemoveDeadBinaryOp(OldLHS);
328    }
329    return;
330  }
331  assert(i+2 < Ops.size() && "Ops index out of range!");
332
333  if (I->getOperand(1) != Ops[i].Op) {
334    DOUT << "RA: " << *I;
335    I->setOperand(1, Ops[i].Op);
336    DOUT << "TO: " << *I;
337    MadeChange = true;
338    ++NumChanged;
339  }
340
341  BinaryOperator *LHS = cast<BinaryOperator>(I->getOperand(0));
342  assert(LHS->getOpcode() == I->getOpcode() &&
343         "Improper expression tree!");
344
345  // Compactify the tree instructions together with each other to guarantee
346  // that the expression tree is dominated by all of Ops.
347  LHS->moveBefore(I);
348  RewriteExprTree(LHS, Ops, i+1);
349}
350
351
352
353// NegateValue - Insert instructions before the instruction pointed to by BI,
354// that computes the negative version of the value specified.  The negative
355// version of the value is returned, and BI is left pointing at the instruction
356// that should be processed next by the reassociation pass.
357//
358static Value *NegateValue(Value *V, Instruction *BI) {
359  // We are trying to expose opportunity for reassociation.  One of the things
360  // that we want to do to achieve this is to push a negation as deep into an
361  // expression chain as possible, to expose the add instructions.  In practice,
362  // this means that we turn this:
363  //   X = -(A+12+C+D)   into    X = -A + -12 + -C + -D = -12 + -A + -C + -D
364  // so that later, a: Y = 12+X could get reassociated with the -12 to eliminate
365  // the constants.  We assume that instcombine will clean up the mess later if
366  // we introduce tons of unnecessary negation instructions...
367  //
368  if (Instruction *I = dyn_cast<Instruction>(V))
369    if (I->getOpcode() == Instruction::Add && I->hasOneUse()) {
370      // Push the negates through the add.
371      I->setOperand(0, NegateValue(I->getOperand(0), BI));
372      I->setOperand(1, NegateValue(I->getOperand(1), BI));
373
374      // We must move the add instruction here, because the neg instructions do
375      // not dominate the old add instruction in general.  By moving it, we are
376      // assured that the neg instructions we just inserted dominate the
377      // instruction we are about to insert after them.
378      //
379      I->moveBefore(BI);
380      I->setName(I->getName()+".neg");
381      return I;
382    }
383
384  // Insert a 'neg' instruction that subtracts the value from zero to get the
385  // negation.
386  //
387  return BinaryOperator::createNeg(V, V->getName() + ".neg", BI);
388}
389
390/// BreakUpSubtract - If we have (X-Y), and if either X is an add, or if this is
391/// only used by an add, transform this into (X+(0-Y)) to promote better
392/// reassociation.
393static Instruction *BreakUpSubtract(Instruction *Sub) {
394  // Don't bother to break this up unless either the LHS is an associable add or
395  // if this is only used by one.
396  if (!isReassociableOp(Sub->getOperand(0), Instruction::Add) &&
397      !isReassociableOp(Sub->getOperand(1), Instruction::Add) &&
398      !(Sub->hasOneUse() &&isReassociableOp(Sub->use_back(), Instruction::Add)))
399    return 0;
400
401  // Convert a subtract into an add and a neg instruction... so that sub
402  // instructions can be commuted with other add instructions...
403  //
404  // Calculate the negative value of Operand 1 of the sub instruction...
405  // and set it as the RHS of the add instruction we just made...
406  //
407  Value *NegVal = NegateValue(Sub->getOperand(1), Sub);
408  Instruction *New =
409    BinaryOperator::createAdd(Sub->getOperand(0), NegVal, "", Sub);
410  New->takeName(Sub);
411
412  // Everyone now refers to the add instruction.
413  Sub->replaceAllUsesWith(New);
414  Sub->eraseFromParent();
415
416  DOUT << "Negated: " << *New;
417  return New;
418}
419
420/// ConvertShiftToMul - If this is a shift of a reassociable multiply or is used
421/// by one, change this into a multiply by a constant to assist with further
422/// reassociation.
423static Instruction *ConvertShiftToMul(Instruction *Shl) {
424  // If an operand of this shift is a reassociable multiply, or if the shift
425  // is used by a reassociable multiply or add, turn into a multiply.
426  if (isReassociableOp(Shl->getOperand(0), Instruction::Mul) ||
427      (Shl->hasOneUse() &&
428       (isReassociableOp(Shl->use_back(), Instruction::Mul) ||
429        isReassociableOp(Shl->use_back(), Instruction::Add)))) {
430    Constant *MulCst = ConstantInt::get(Shl->getType(), 1);
431    MulCst = ConstantExpr::getShl(MulCst, cast<Constant>(Shl->getOperand(1)));
432
433    Instruction *Mul = BinaryOperator::createMul(Shl->getOperand(0), MulCst,
434                                                 "", Shl);
435    Mul->takeName(Shl);
436    Shl->replaceAllUsesWith(Mul);
437    Shl->eraseFromParent();
438    return Mul;
439  }
440  return 0;
441}
442
443// Scan backwards and forwards among values with the same rank as element i to
444// see if X exists.  If X does not exist, return i.
445static unsigned FindInOperandList(std::vector<ValueEntry> &Ops, unsigned i,
446                                  Value *X) {
447  unsigned XRank = Ops[i].Rank;
448  unsigned e = Ops.size();
449  for (unsigned j = i+1; j != e && Ops[j].Rank == XRank; ++j)
450    if (Ops[j].Op == X)
451      return j;
452  // Scan backwards
453  for (unsigned j = i-1; j != ~0U && Ops[j].Rank == XRank; --j)
454    if (Ops[j].Op == X)
455      return j;
456  return i;
457}
458
459/// EmitAddTreeOfValues - Emit a tree of add instructions, summing Ops together
460/// and returning the result.  Insert the tree before I.
461static Value *EmitAddTreeOfValues(Instruction *I, std::vector<Value*> &Ops) {
462  if (Ops.size() == 1) return Ops.back();
463
464  Value *V1 = Ops.back();
465  Ops.pop_back();
466  Value *V2 = EmitAddTreeOfValues(I, Ops);
467  return BinaryOperator::createAdd(V2, V1, "tmp", I);
468}
469
470/// RemoveFactorFromExpression - If V is an expression tree that is a
471/// multiplication sequence, and if this sequence contains a multiply by Factor,
472/// remove Factor from the tree and return the new tree.
473Value *Reassociate::RemoveFactorFromExpression(Value *V, Value *Factor) {
474  BinaryOperator *BO = isReassociableOp(V, Instruction::Mul);
475  if (!BO) return 0;
476
477  std::vector<ValueEntry> Factors;
478  LinearizeExprTree(BO, Factors);
479
480  bool FoundFactor = false;
481  for (unsigned i = 0, e = Factors.size(); i != e; ++i)
482    if (Factors[i].Op == Factor) {
483      FoundFactor = true;
484      Factors.erase(Factors.begin()+i);
485      break;
486    }
487  if (!FoundFactor) {
488    // Make sure to restore the operands to the expression tree.
489    RewriteExprTree(BO, Factors);
490    return 0;
491  }
492
493  if (Factors.size() == 1) return Factors[0].Op;
494
495  RewriteExprTree(BO, Factors);
496  return BO;
497}
498
499/// FindSingleUseMultiplyFactors - If V is a single-use multiply, recursively
500/// add its operands as factors, otherwise add V to the list of factors.
501static void FindSingleUseMultiplyFactors(Value *V,
502                                         std::vector<Value*> &Factors) {
503  BinaryOperator *BO;
504  if ((!V->hasOneUse() && !V->use_empty()) ||
505      !(BO = dyn_cast<BinaryOperator>(V)) ||
506      BO->getOpcode() != Instruction::Mul) {
507    Factors.push_back(V);
508    return;
509  }
510
511  // Otherwise, add the LHS and RHS to the list of factors.
512  FindSingleUseMultiplyFactors(BO->getOperand(1), Factors);
513  FindSingleUseMultiplyFactors(BO->getOperand(0), Factors);
514}
515
516
517
518Value *Reassociate::OptimizeExpression(BinaryOperator *I,
519                                       std::vector<ValueEntry> &Ops) {
520  // Now that we have the linearized expression tree, try to optimize it.
521  // Start by folding any constants that we found.
522  bool IterateOptimization = false;
523  if (Ops.size() == 1) return Ops[0].Op;
524
525  unsigned Opcode = I->getOpcode();
526
527  if (Constant *V1 = dyn_cast<Constant>(Ops[Ops.size()-2].Op))
528    if (Constant *V2 = dyn_cast<Constant>(Ops.back().Op)) {
529      Ops.pop_back();
530      Ops.back().Op = ConstantExpr::get(Opcode, V1, V2);
531      return OptimizeExpression(I, Ops);
532    }
533
534  // Check for destructive annihilation due to a constant being used.
535  if (ConstantInt *CstVal = dyn_cast<ConstantInt>(Ops.back().Op))
536    switch (Opcode) {
537    default: break;
538    case Instruction::And:
539      if (CstVal->isNullValue()) {           // ... & 0 -> 0
540        ++NumAnnihil;
541        return CstVal;
542      } else if (CstVal->isAllOnesValue()) { // ... & -1 -> ...
543        Ops.pop_back();
544      }
545      break;
546    case Instruction::Mul:
547      if (CstVal->isNullValue()) {           // ... * 0 -> 0
548        ++NumAnnihil;
549        return CstVal;
550      } else if (cast<ConstantInt>(CstVal)->getZExtValue() == 1) {
551        Ops.pop_back();                      // ... * 1 -> ...
552      }
553      break;
554    case Instruction::Or:
555      if (CstVal->isAllOnesValue()) {        // ... | -1 -> -1
556        ++NumAnnihil;
557        return CstVal;
558      }
559      // FALLTHROUGH!
560    case Instruction::Add:
561    case Instruction::Xor:
562      if (CstVal->isNullValue())             // ... [|^+] 0 -> ...
563        Ops.pop_back();
564      break;
565    }
566  if (Ops.size() == 1) return Ops[0].Op;
567
568  // Handle destructive annihilation do to identities between elements in the
569  // argument list here.
570  switch (Opcode) {
571  default: break;
572  case Instruction::And:
573  case Instruction::Or:
574  case Instruction::Xor:
575    // Scan the operand lists looking for X and ~X pairs, along with X,X pairs.
576    // If we find any, we can simplify the expression. X&~X == 0, X|~X == -1.
577    for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
578      // First, check for X and ~X in the operand list.
579      assert(i < Ops.size());
580      if (BinaryOperator::isNot(Ops[i].Op)) {    // Cannot occur for ^.
581        Value *X = BinaryOperator::getNotArgument(Ops[i].Op);
582        unsigned FoundX = FindInOperandList(Ops, i, X);
583        if (FoundX != i) {
584          if (Opcode == Instruction::And) {   // ...&X&~X = 0
585            ++NumAnnihil;
586            return Constant::getNullValue(X->getType());
587          } else if (Opcode == Instruction::Or) {   // ...|X|~X = -1
588            ++NumAnnihil;
589            return ConstantInt::getAllOnesValue(X->getType());
590          }
591        }
592      }
593
594      // Next, check for duplicate pairs of values, which we assume are next to
595      // each other, due to our sorting criteria.
596      assert(i < Ops.size());
597      if (i+1 != Ops.size() && Ops[i+1].Op == Ops[i].Op) {
598        if (Opcode == Instruction::And || Opcode == Instruction::Or) {
599          // Drop duplicate values.
600          Ops.erase(Ops.begin()+i);
601          --i; --e;
602          IterateOptimization = true;
603          ++NumAnnihil;
604        } else {
605          assert(Opcode == Instruction::Xor);
606          if (e == 2) {
607            ++NumAnnihil;
608            return Constant::getNullValue(Ops[0].Op->getType());
609          }
610          // ... X^X -> ...
611          Ops.erase(Ops.begin()+i, Ops.begin()+i+2);
612          i -= 1; e -= 2;
613          IterateOptimization = true;
614          ++NumAnnihil;
615        }
616      }
617    }
618    break;
619
620  case Instruction::Add:
621    // Scan the operand lists looking for X and -X pairs.  If we find any, we
622    // can simplify the expression. X+-X == 0.
623    for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
624      assert(i < Ops.size());
625      // Check for X and -X in the operand list.
626      if (BinaryOperator::isNeg(Ops[i].Op)) {
627        Value *X = BinaryOperator::getNegArgument(Ops[i].Op);
628        unsigned FoundX = FindInOperandList(Ops, i, X);
629        if (FoundX != i) {
630          // Remove X and -X from the operand list.
631          if (Ops.size() == 2) {
632            ++NumAnnihil;
633            return Constant::getNullValue(X->getType());
634          } else {
635            Ops.erase(Ops.begin()+i);
636            if (i < FoundX)
637              --FoundX;
638            else
639              --i;   // Need to back up an extra one.
640            Ops.erase(Ops.begin()+FoundX);
641            IterateOptimization = true;
642            ++NumAnnihil;
643            --i;     // Revisit element.
644            e -= 2;  // Removed two elements.
645          }
646        }
647      }
648    }
649
650
651    // Scan the operand list, checking to see if there are any common factors
652    // between operands.  Consider something like A*A+A*B*C+D.  We would like to
653    // reassociate this to A*(A+B*C)+D, which reduces the number of multiplies.
654    // To efficiently find this, we count the number of times a factor occurs
655    // for any ADD operands that are MULs.
656    std::map<Value*, unsigned> FactorOccurrences;
657    unsigned MaxOcc = 0;
658    Value *MaxOccVal = 0;
659    for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
660      if (BinaryOperator *BOp = dyn_cast<BinaryOperator>(Ops[i].Op)) {
661        if (BOp->getOpcode() == Instruction::Mul && BOp->use_empty()) {
662          // Compute all of the factors of this added value.
663          std::vector<Value*> Factors;
664          FindSingleUseMultiplyFactors(BOp, Factors);
665          assert(Factors.size() > 1 && "Bad linearize!");
666
667          // Add one to FactorOccurrences for each unique factor in this op.
668          if (Factors.size() == 2) {
669            unsigned Occ = ++FactorOccurrences[Factors[0]];
670            if (Occ > MaxOcc) { MaxOcc = Occ; MaxOccVal = Factors[0]; }
671            if (Factors[0] != Factors[1]) {   // Don't double count A*A.
672              Occ = ++FactorOccurrences[Factors[1]];
673              if (Occ > MaxOcc) { MaxOcc = Occ; MaxOccVal = Factors[1]; }
674            }
675          } else {
676            std::set<Value*> Duplicates;
677            for (unsigned i = 0, e = Factors.size(); i != e; ++i) {
678              if (Duplicates.insert(Factors[i]).second) {
679                unsigned Occ = ++FactorOccurrences[Factors[i]];
680                if (Occ > MaxOcc) { MaxOcc = Occ; MaxOccVal = Factors[i]; }
681              }
682            }
683          }
684        }
685      }
686    }
687
688    // If any factor occurred more than one time, we can pull it out.
689    if (MaxOcc > 1) {
690      DOUT << "\nFACTORING [" << MaxOcc << "]: " << *MaxOccVal << "\n";
691
692      // Create a new instruction that uses the MaxOccVal twice.  If we don't do
693      // this, we could otherwise run into situations where removing a factor
694      // from an expression will drop a use of maxocc, and this can cause
695      // RemoveFactorFromExpression on successive values to behave differently.
696      Instruction *DummyInst = BinaryOperator::createAdd(MaxOccVal, MaxOccVal);
697      std::vector<Value*> NewMulOps;
698      for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
699        if (Value *V = RemoveFactorFromExpression(Ops[i].Op, MaxOccVal)) {
700          NewMulOps.push_back(V);
701          Ops.erase(Ops.begin()+i);
702          --i; --e;
703        }
704      }
705
706      // No need for extra uses anymore.
707      delete DummyInst;
708
709      unsigned NumAddedValues = NewMulOps.size();
710      Value *V = EmitAddTreeOfValues(I, NewMulOps);
711      Value *V2 = BinaryOperator::createMul(V, MaxOccVal, "tmp", I);
712
713      // Now that we have inserted V and its sole use, optimize it. This allows
714      // us to handle cases that require multiple factoring steps, such as this:
715      // A*A*B + A*A*C   -->   A*(A*B+A*C)   -->   A*(A*(B+C))
716      if (NumAddedValues > 1)
717        ReassociateExpression(cast<BinaryOperator>(V));
718
719      ++NumFactor;
720
721      if (Ops.size() == 0)
722        return V2;
723
724      // Add the new value to the list of things being added.
725      Ops.insert(Ops.begin(), ValueEntry(getRank(V2), V2));
726
727      // Rewrite the tree so that there is now a use of V.
728      RewriteExprTree(I, Ops);
729      return OptimizeExpression(I, Ops);
730    }
731    break;
732  //case Instruction::Mul:
733  }
734
735  if (IterateOptimization)
736    return OptimizeExpression(I, Ops);
737  return 0;
738}
739
740
741/// ReassociateBB - Inspect all of the instructions in this basic block,
742/// reassociating them as we go.
743void Reassociate::ReassociateBB(BasicBlock *BB) {
744  for (BasicBlock::iterator BBI = BB->begin(); BBI != BB->end(); ) {
745    Instruction *BI = BBI++;
746    if (BI->getOpcode() == Instruction::Shl &&
747        isa<ConstantInt>(BI->getOperand(1)))
748      if (Instruction *NI = ConvertShiftToMul(BI)) {
749        MadeChange = true;
750        BI = NI;
751      }
752
753    // Reject cases where it is pointless to do this.
754    if (!isa<BinaryOperator>(BI) || BI->getType()->isFloatingPoint() ||
755        isa<VectorType>(BI->getType()))
756      continue;  // Floating point ops are not associative.
757
758    // If this is a subtract instruction which is not already in negate form,
759    // see if we can convert it to X+-Y.
760    if (BI->getOpcode() == Instruction::Sub) {
761      if (!BinaryOperator::isNeg(BI)) {
762        if (Instruction *NI = BreakUpSubtract(BI)) {
763          MadeChange = true;
764          BI = NI;
765        }
766      } else {
767        // Otherwise, this is a negation.  See if the operand is a multiply tree
768        // and if this is not an inner node of a multiply tree.
769        if (isReassociableOp(BI->getOperand(1), Instruction::Mul) &&
770            (!BI->hasOneUse() ||
771             !isReassociableOp(BI->use_back(), Instruction::Mul))) {
772          BI = LowerNegateToMultiply(BI);
773          MadeChange = true;
774        }
775      }
776    }
777
778    // If this instruction is a commutative binary operator, process it.
779    if (!BI->isAssociative()) continue;
780    BinaryOperator *I = cast<BinaryOperator>(BI);
781
782    // If this is an interior node of a reassociable tree, ignore it until we
783    // get to the root of the tree, to avoid N^2 analysis.
784    if (I->hasOneUse() && isReassociableOp(I->use_back(), I->getOpcode()))
785      continue;
786
787    // If this is an add tree that is used by a sub instruction, ignore it
788    // until we process the subtract.
789    if (I->hasOneUse() && I->getOpcode() == Instruction::Add &&
790        cast<Instruction>(I->use_back())->getOpcode() == Instruction::Sub)
791      continue;
792
793    ReassociateExpression(I);
794  }
795}
796
797void Reassociate::ReassociateExpression(BinaryOperator *I) {
798
799  // First, walk the expression tree, linearizing the tree, collecting
800  std::vector<ValueEntry> Ops;
801  LinearizeExprTree(I, Ops);
802
803  DOUT << "RAIn:\t"; DEBUG(PrintOps(I, Ops)); DOUT << "\n";
804
805  // Now that we have linearized the tree to a list and have gathered all of
806  // the operands and their ranks, sort the operands by their rank.  Use a
807  // stable_sort so that values with equal ranks will have their relative
808  // positions maintained (and so the compiler is deterministic).  Note that
809  // this sorts so that the highest ranking values end up at the beginning of
810  // the vector.
811  std::stable_sort(Ops.begin(), Ops.end());
812
813  // OptimizeExpression - Now that we have the expression tree in a convenient
814  // sorted form, optimize it globally if possible.
815  if (Value *V = OptimizeExpression(I, Ops)) {
816    // This expression tree simplified to something that isn't a tree,
817    // eliminate it.
818    DOUT << "Reassoc to scalar: " << *V << "\n";
819    I->replaceAllUsesWith(V);
820    RemoveDeadBinaryOp(I);
821    return;
822  }
823
824  // We want to sink immediates as deeply as possible except in the case where
825  // this is a multiply tree used only by an add, and the immediate is a -1.
826  // In this case we reassociate to put the negation on the outside so that we
827  // can fold the negation into the add: (-X)*Y + Z -> Z-X*Y
828  if (I->getOpcode() == Instruction::Mul && I->hasOneUse() &&
829      cast<Instruction>(I->use_back())->getOpcode() == Instruction::Add &&
830      isa<ConstantInt>(Ops.back().Op) &&
831      cast<ConstantInt>(Ops.back().Op)->isAllOnesValue()) {
832    Ops.insert(Ops.begin(), Ops.back());
833    Ops.pop_back();
834  }
835
836  DOUT << "RAOut:\t"; DEBUG(PrintOps(I, Ops)); DOUT << "\n";
837
838  if (Ops.size() == 1) {
839    // This expression tree simplified to something that isn't a tree,
840    // eliminate it.
841    I->replaceAllUsesWith(Ops[0].Op);
842    RemoveDeadBinaryOp(I);
843  } else {
844    // Now that we ordered and optimized the expressions, splat them back into
845    // the expression tree, removing any unneeded nodes.
846    RewriteExprTree(I, Ops);
847  }
848}
849
850
851bool Reassociate::runOnFunction(Function &F) {
852  // Recalculate the rank map for F
853  BuildRankMap(F);
854
855  MadeChange = false;
856  for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
857    ReassociateBB(FI);
858
859  // We are done with the rank map...
860  RankMap.clear();
861  ValueRankMap.clear();
862  return MadeChange;
863}
864
865