PHITransAddr.cpp revision 43678f41a37c077f28517c2e4889cca88cada6ce
1210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//===- PHITransAddr.cpp - PHI Translation for Addresses -------------------===//
2210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//
3210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//                     The LLVM Compiler Infrastructure
4210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//
5210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner// This file is distributed under the University of Illinois Open Source
6210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner// License. See LICENSE.TXT for details.
7210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//
8210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//===----------------------------------------------------------------------===//
9210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//
10210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner// This file implements the PHITransAddr class.
11210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//
12210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner//===----------------------------------------------------------------------===//
13210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
14210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner#include "llvm/Analysis/PHITransAddr.h"
15210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner#include "llvm/Analysis/Dominators.h"
169a8641201b2db8427be2a6531c043f384562c081Chris Lattner#include "llvm/Analysis/InstructionSimplify.h"
17210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattnerusing namespace llvm;
18210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
196fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattnerstatic bool CanPHITrans(Instruction *Inst) {
209a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (isa<PHINode>(Inst) ||
219a8641201b2db8427be2a6531c043f384562c081Chris Lattner      isa<BitCastInst>(Inst) ||
226fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      isa<GetElementPtrInst>(Inst))
239a8641201b2db8427be2a6531c043f384562c081Chris Lattner    return true;
246fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
2534f849098bfb8850fa34fbd115ba9b2e55c85a32Chris Lattner  if (Inst->getOpcode() == Instruction::Add &&
266fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      isa<ConstantInt>(Inst->getOperand(1)))
276fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    return true;
286fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
299a8641201b2db8427be2a6531c043f384562c081Chris Lattner  //   cerr << "MEMDEP: Could not PHI translate: " << *Pointer;
309a8641201b2db8427be2a6531c043f384562c081Chris Lattner  //   if (isa<BitCastInst>(PtrInst) || isa<GetElementPtrInst>(PtrInst))
319a8641201b2db8427be2a6531c043f384562c081Chris Lattner  //     cerr << "OP:\t\t\t\t" << *PtrInst->getOperand(0);
329a8641201b2db8427be2a6531c043f384562c081Chris Lattner  return false;
33210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner}
34210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
356fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner/// IsPotentiallyPHITranslatable - If this needs PHI translation, return true
366fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner/// if we have some hope of doing it.  This should be used as a filter to
376fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner/// avoid calling PHITranslateValue in hopeless situations.
386fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattnerbool PHITransAddr::IsPotentiallyPHITranslatable() const {
396fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // If the input value is not an instruction, or if it is not defined in CurBB,
406fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // then we don't need to phi translate it.
416fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  Instruction *Inst = dyn_cast<Instruction>(Addr);
426fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  return Inst == 0 || CanPHITrans(Inst);
436fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner}
446fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
459a8641201b2db8427be2a6531c043f384562c081Chris Lattner
4643678f41a37c077f28517c2e4889cca88cada6ceChris Lattnerstatic void RemoveInstInputs(Instruction *I,
4743678f41a37c077f28517c2e4889cca88cada6ceChris Lattner                             SmallVectorImpl<Instruction*> &InstInputs) {
4843678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  // If the instruction is in the InstInputs list, remove it.
4943678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  SmallVectorImpl<Instruction*>::iterator Entry =
5043678f41a37c077f28517c2e4889cca88cada6ceChris Lattner    std::find(InstInputs.begin(), InstInputs.end(), I);
5143678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  if (Entry != InstInputs.end()) {
5243678f41a37c077f28517c2e4889cca88cada6ceChris Lattner    InstInputs.erase(Entry);
5343678f41a37c077f28517c2e4889cca88cada6ceChris Lattner    return;
5443678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  }
5543678f41a37c077f28517c2e4889cca88cada6ceChris Lattner
5643678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  // Otherwise, it must have instruction inputs itself.  Zap them recursively.
5743678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  bool HadInstInputs = false;
5843678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
5943678f41a37c077f28517c2e4889cca88cada6ceChris Lattner    if (Instruction *Op = dyn_cast<Instruction>(I->getOperand(i))) {
6043678f41a37c077f28517c2e4889cca88cada6ceChris Lattner      RemoveInstInputs(Op, InstInputs);
6143678f41a37c077f28517c2e4889cca88cada6ceChris Lattner      HadInstInputs = true;
6243678f41a37c077f28517c2e4889cca88cada6ceChris Lattner    }
6343678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  }
6443678f41a37c077f28517c2e4889cca88cada6ceChris Lattner
6543678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  // This instruction had to have operands in the instinputs list or it should
6643678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  // have been in the list itself.  If not, the list is broken.
6743678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  assert(HadInstInputs && "InstInputs list inconsistent!");
6843678f41a37c077f28517c2e4889cca88cada6ceChris Lattner}
6943678f41a37c077f28517c2e4889cca88cada6ceChris Lattner
7043678f41a37c077f28517c2e4889cca88cada6ceChris Lattner/// ReplaceInstWithValue - Remove any instruction inputs in the InstInputs
7143678f41a37c077f28517c2e4889cca88cada6ceChris Lattner/// array that are due to the specified instruction that is about to be
7243678f41a37c077f28517c2e4889cca88cada6ceChris Lattner/// removed from the address, and add any corresponding to V.  This returns V.
7343678f41a37c077f28517c2e4889cca88cada6ceChris LattnerValue *PHITransAddr::ReplaceInstWithValue(Instruction *I, Value *V) {
7443678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  // Remove the old instruction from InstInputs.
7543678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  RemoveInstInputs(I, InstInputs);
7643678f41a37c077f28517c2e4889cca88cada6ceChris Lattner
7743678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  // If V is an instruction, it is now an input.
7843678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  if (Instruction *VI = dyn_cast<Instruction>(V))
7943678f41a37c077f28517c2e4889cca88cada6ceChris Lattner    InstInputs.push_back(VI);
8043678f41a37c077f28517c2e4889cca88cada6ceChris Lattner  return V;
8143678f41a37c077f28517c2e4889cca88cada6ceChris Lattner}
8243678f41a37c077f28517c2e4889cca88cada6ceChris Lattner
8343678f41a37c077f28517c2e4889cca88cada6ceChris Lattner
849a8641201b2db8427be2a6531c043f384562c081Chris LattnerValue *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
859a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                         BasicBlock *PredBB) {
869a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // If this is a non-instruction value, it can't require PHI translation.
879a8641201b2db8427be2a6531c043f384562c081Chris Lattner  Instruction *Inst = dyn_cast<Instruction>(V);
889a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (Inst == 0) return V;
899a8641201b2db8427be2a6531c043f384562c081Chris Lattner
906fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // If 'Inst' is defined in this block, it must be an input that needs to be
916fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // phi translated or an intermediate expression that needs to be incorporated
926fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // into the expression.
936fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  if (Inst->getParent() == CurBB) {
946fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    assert(std::count(InstInputs.begin(), InstInputs.end(), Inst) &&
956fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner           "Not an input?");
966fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
976fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // If this is a PHI, go ahead and translate it.
986fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (PHINode *PN = dyn_cast<PHINode>(Inst))
996fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      return PN->getIncomingValueForBlock(PredBB);
1006fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1016fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1026fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // If this is a non-phi value, and it is analyzable, we can incorporate it
1036fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // into the expression by making all instruction operands be inputs.
1046fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (!CanPHITrans(Inst))
1056fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      return 0;
1066fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1076fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Okay, we can incorporate it, this instruction is no longer an input.
1086fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    InstInputs.erase(std::find(InstInputs.begin(), InstInputs.end(), Inst));
1096fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1106fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // All instruction operands are now inputs (and of course, they may also be
1116fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // defined in this block, so they may need to be phi translated themselves.
1126fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
1136fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      if (Instruction *Op = dyn_cast<Instruction>(Inst->getOperand(i)))
1146fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        InstInputs.push_back(Op);
1156fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1166fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  } else {
1176fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Determine whether 'Inst' is an input to our PHI translatable expression.
1186fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    bool isInput = std::count(InstInputs.begin(), InstInputs.end(), Inst);
1196fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1206fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // If it is an input defined in a different block, then it remains an input.
1219a8641201b2db8427be2a6531c043f384562c081Chris Lattner    if (isInput)
1229a8641201b2db8427be2a6531c043f384562c081Chris Lattner      return Inst;
1236fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  }
1246fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1256fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // Ok, it must be an intermediate result (either because it started that way
1266fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // or because we just incorporated it into the expression).  See if its
1276fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // operands need to be phi translated, and if so, reconstruct it.
1289a8641201b2db8427be2a6531c043f384562c081Chris Lattner
1296fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  if (BitCastInst *BC = dyn_cast<BitCastInst>(Inst)) {
1306fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    Value *PHIIn = PHITranslateSubExpr(BC->getOperand(0), CurBB, PredBB);
1316fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (PHIIn == 0) return 0;
1326fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (PHIIn == BC->getOperand(0))
1336fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      return BC;
1346fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1356fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Find an available version of this cast.
1366fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1376fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Constants are trivial to find.
1386fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (Constant *C = dyn_cast<Constant>(PHIIn))
13943678f41a37c077f28517c2e4889cca88cada6ceChris Lattner      return ReplaceInstWithValue(BC, ConstantExpr::getBitCast(C,
14043678f41a37c077f28517c2e4889cca88cada6ceChris Lattner                                                               BC->getType()));
1416fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1426fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Otherwise we have to see if a bitcasted version of the incoming pointer
1436fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // is available.  If so, we can use it, otherwise we have to fail.
1446fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    for (Value::use_iterator UI = PHIIn->use_begin(), E = PHIIn->use_end();
1456fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner         UI != E; ++UI) {
1466fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      if (BitCastInst *BCI = dyn_cast<BitCastInst>(*UI))
1476fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        if (BCI->getType() == BC->getType())
1486fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          return BCI;
1496fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    }
1506fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    return 0;
1516fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  }
1526fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1536fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // Handle getelementptr with at least one PHI translatable operand.
1546fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Inst)) {
1556fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    SmallVector<Value*, 8> GEPOps;
1566fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    BasicBlock *CurBB = GEP->getParent();
1576fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    bool AnyChanged = false;
1586fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {
1596fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      Value *GEPOp = PHITranslateSubExpr(GEP->getOperand(i), CurBB, PredBB);
1606fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      if (GEPOp == 0) return 0;
1619a8641201b2db8427be2a6531c043f384562c081Chris Lattner
1626045417fcc21b1c0663120b9f24ec822f5d17cfeChris Lattner      AnyChanged |= GEPOp != GEP->getOperand(i);
1636fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      GEPOps.push_back(GEPOp);
1649a8641201b2db8427be2a6531c043f384562c081Chris Lattner    }
1659a8641201b2db8427be2a6531c043f384562c081Chris Lattner
1666fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (!AnyChanged)
1676fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      return GEP;
1686fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1696fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Simplify the GEP to handle 'gep x, 0' -> x etc.
1706fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (Value *V = SimplifyGEPInst(&GEPOps[0], GEPOps.size(), TD))
17143678f41a37c077f28517c2e4889cca88cada6ceChris Lattner      return ReplaceInstWithValue(GEP, V);
1726fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1736fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Scan to see if we have this GEP available.
1746fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    Value *APHIOp = GEPOps[0];
1756fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    for (Value::use_iterator UI = APHIOp->use_begin(), E = APHIOp->use_end();
1766fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner         UI != E; ++UI) {
1776fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(*UI))
1786fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        if (GEPI->getType() == GEP->getType() &&
1796fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner            GEPI->getNumOperands() == GEPOps.size() &&
1806fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner            GEPI->getParent()->getParent() == CurBB->getParent()) {
1816fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          bool Mismatch = false;
1826fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          for (unsigned i = 0, e = GEPOps.size(); i != e; ++i)
1836fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner            if (GEPI->getOperand(i) != GEPOps[i]) {
1846fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner              Mismatch = true;
1856fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner              break;
1866fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner            }
1876fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          if (!Mismatch)
1886fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner            return GEPI;
1896fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        }
1909a8641201b2db8427be2a6531c043f384562c081Chris Lattner    }
1916fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    return 0;
1926fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  }
1936fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
1946fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // Handle add with a constant RHS.
1956fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  if (Inst->getOpcode() == Instruction::Add &&
1966fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      isa<ConstantInt>(Inst->getOperand(1))) {
1976fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // PHI translate the LHS.
1986fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    Constant *RHS = cast<ConstantInt>(Inst->getOperand(1));
1996fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    bool isNSW = cast<BinaryOperator>(Inst)->hasNoSignedWrap();
2006fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    bool isNUW = cast<BinaryOperator>(Inst)->hasNoUnsignedWrap();
2019a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2026fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    Value *LHS = PHITranslateSubExpr(Inst->getOperand(0), CurBB, PredBB);
2036fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (LHS == 0) return 0;
2046fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
2056fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // If the PHI translated LHS is an add of a constant, fold the immediates.
2066fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (BinaryOperator *BOp = dyn_cast<BinaryOperator>(LHS))
2076fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      if (BOp->getOpcode() == Instruction::Add)
2086fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        if (ConstantInt *CI = dyn_cast<ConstantInt>(BOp->getOperand(1))) {
2096fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          LHS = BOp->getOperand(0);
2106fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          RHS = ConstantExpr::getAdd(RHS, CI);
2116fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          isNSW = isNUW = false;
2126fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        }
2136fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
2146fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // See if the add simplifies away.
2156fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    if (Value *Res = SimplifyAddInst(LHS, RHS, isNSW, isNUW, TD))
21643678f41a37c077f28517c2e4889cca88cada6ceChris Lattner      return ReplaceInstWithValue(Inst, Res);
2176fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner
2186fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    // Otherwise, see if we have this add available somewhere.
2196fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner    for (Value::use_iterator UI = LHS->use_begin(), E = LHS->use_end();
2206fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner         UI != E; ++UI) {
2216fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner      if (BinaryOperator *BO = dyn_cast<BinaryOperator>(*UI))
2226fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner        if (BO->getOperand(0) == LHS && BO->getOperand(1) == RHS &&
2236fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner            BO->getParent()->getParent() == CurBB->getParent())
2246fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner          return BO;
2259a8641201b2db8427be2a6531c043f384562c081Chris Lattner    }
2269a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2279a8641201b2db8427be2a6531c043f384562c081Chris Lattner    return 0;
2289a8641201b2db8427be2a6531c043f384562c081Chris Lattner  }
2299a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2306fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  // Otherwise, we failed.
2316fcca1cc874c2b374b05399be92c5c1ea2086cc0Chris Lattner  return 0;
232210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner}
233210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
2349a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2359a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// PHITranslateValue - PHI translate the current address up the CFG from
2369a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// CurBB to Pred, updating our state the reflect any needed changes.  This
237e05a188cd630448cc25143ee8e69a36ab2e69544Chris Lattner/// returns true on failure and sets Addr to null.
2389a8641201b2db8427be2a6531c043f384562c081Chris Lattnerbool PHITransAddr::PHITranslateValue(BasicBlock *CurBB, BasicBlock *PredBB) {
2399a8641201b2db8427be2a6531c043f384562c081Chris Lattner  Addr = PHITranslateSubExpr(Addr, CurBB, PredBB);
2409a8641201b2db8427be2a6531c043f384562c081Chris Lattner  return Addr == 0;
2419a8641201b2db8427be2a6531c043f384562c081Chris Lattner}
2429a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2439a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// GetAvailablePHITranslatedSubExpr - Return the value computed by
2449a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// PHITranslateSubExpr if it dominates PredBB, otherwise return null.
245210e45af3a579beeefb001c8f13c94e80407aad5Chris LattnerValue *PHITransAddr::
2469a8641201b2db8427be2a6531c043f384562c081Chris LattnerGetAvailablePHITranslatedSubExpr(Value *V, BasicBlock *CurBB,BasicBlock *PredBB,
24734f849098bfb8850fa34fbd115ba9b2e55c85a32Chris Lattner                                 const DominatorTree &DT) const {
24834f849098bfb8850fa34fbd115ba9b2e55c85a32Chris Lattner  PHITransAddr Tmp(V, TD);
24934f849098bfb8850fa34fbd115ba9b2e55c85a32Chris Lattner  Tmp.PHITranslateValue(CurBB, PredBB);
25034f849098bfb8850fa34fbd115ba9b2e55c85a32Chris Lattner
251210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner  // See if PHI translation succeeds.
25234f849098bfb8850fa34fbd115ba9b2e55c85a32Chris Lattner  V = Tmp.getAddr();
253210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
254210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner  // Make sure the value is live in the predecessor.
255210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner  if (Instruction *Inst = dyn_cast_or_null<Instruction>(V))
256210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner    if (!DT.dominates(Inst->getParent(), PredBB))
257210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner      return 0;
258210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner  return V;
259210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner}
260210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
2619a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2629a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// PHITranslateWithInsertion - PHI translate this value into the specified
2639a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// predecessor block, inserting a computation of the value if it is
2649a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// unavailable.
2659a8641201b2db8427be2a6531c043f384562c081Chris Lattner///
2669a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// All newly created instructions are added to the NewInsts list.  This
2679a8641201b2db8427be2a6531c043f384562c081Chris Lattner/// returns null on failure.
2689a8641201b2db8427be2a6531c043f384562c081Chris Lattner///
2699a8641201b2db8427be2a6531c043f384562c081Chris LattnerValue *PHITransAddr::
2709a8641201b2db8427be2a6531c043f384562c081Chris LattnerPHITranslateWithInsertion(BasicBlock *CurBB, BasicBlock *PredBB,
2719a8641201b2db8427be2a6531c043f384562c081Chris Lattner                          const DominatorTree &DT,
2729a8641201b2db8427be2a6531c043f384562c081Chris Lattner                          SmallVectorImpl<Instruction*> &NewInsts) {
2739a8641201b2db8427be2a6531c043f384562c081Chris Lattner  unsigned NISize = NewInsts.size();
2749a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2759a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // Attempt to PHI translate with insertion.
2769a8641201b2db8427be2a6531c043f384562c081Chris Lattner  Addr = InsertPHITranslatedSubExpr(Addr, CurBB, PredBB, DT, NewInsts);
2779a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2789a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // If successful, return the new value.
2799a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (Addr) return Addr;
2809a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2819a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // If not, destroy any intermediate instructions inserted.
2829a8641201b2db8427be2a6531c043f384562c081Chris Lattner  while (NewInsts.size() != NISize)
2839a8641201b2db8427be2a6531c043f384562c081Chris Lattner    NewInsts.pop_back_val()->eraseFromParent();
2849a8641201b2db8427be2a6531c043f384562c081Chris Lattner  return 0;
2859a8641201b2db8427be2a6531c043f384562c081Chris Lattner}
2869a8641201b2db8427be2a6531c043f384562c081Chris Lattner
2879a8641201b2db8427be2a6531c043f384562c081Chris Lattner
288210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner/// InsertPHITranslatedPointer - Insert a computation of the PHI translated
289210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner/// version of 'V' for the edge PredBB->CurBB into the end of the PredBB
290210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner/// block.  All newly created instructions are added to the NewInsts list.
291210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner/// This returns null on failure.
292210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner///
293210e45af3a579beeefb001c8f13c94e80407aad5Chris LattnerValue *PHITransAddr::
2949a8641201b2db8427be2a6531c043f384562c081Chris LattnerInsertPHITranslatedSubExpr(Value *InVal, BasicBlock *CurBB,
2959a8641201b2db8427be2a6531c043f384562c081Chris Lattner                           BasicBlock *PredBB, const DominatorTree &DT,
2969a8641201b2db8427be2a6531c043f384562c081Chris Lattner                           SmallVectorImpl<Instruction*> &NewInsts) {
297210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner  // See if we have a version of this value already available and dominating
2989a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // PredBB.  If so, there is no need to insert a new instance of it.
2999a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (Value *Res = GetAvailablePHITranslatedSubExpr(InVal, CurBB, PredBB, DT))
300210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner    return Res;
301210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner
3029a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // If we don't have an available version of this value, it must be an
3039a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // instruction.
3049a8641201b2db8427be2a6531c043f384562c081Chris Lattner  Instruction *Inst = cast<Instruction>(InVal);
3059a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3069a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // Handle bitcast of PHI translatable value.
3079a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (BitCastInst *BC = dyn_cast<BitCastInst>(Inst)) {
3089a8641201b2db8427be2a6531c043f384562c081Chris Lattner    Value *OpVal = InsertPHITranslatedSubExpr(BC->getOperand(0),
3099a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                              CurBB, PredBB, DT, NewInsts);
3109a8641201b2db8427be2a6531c043f384562c081Chris Lattner    if (OpVal == 0) return 0;
3119a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3129a8641201b2db8427be2a6531c043f384562c081Chris Lattner    // Otherwise insert a bitcast at the end of PredBB.
3139a8641201b2db8427be2a6531c043f384562c081Chris Lattner    BitCastInst *New = new BitCastInst(OpVal, InVal->getType(),
3149a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                       InVal->getName()+".phi.trans.insert",
3159a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                       PredBB->getTerminator());
3169a8641201b2db8427be2a6531c043f384562c081Chris Lattner    NewInsts.push_back(New);
3179a8641201b2db8427be2a6531c043f384562c081Chris Lattner    return New;
3189a8641201b2db8427be2a6531c043f384562c081Chris Lattner  }
3199a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3209a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // Handle getelementptr with at least one PHI operand.
3219a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Inst)) {
3229a8641201b2db8427be2a6531c043f384562c081Chris Lattner    SmallVector<Value*, 8> GEPOps;
3239a8641201b2db8427be2a6531c043f384562c081Chris Lattner    BasicBlock *CurBB = GEP->getParent();
3249a8641201b2db8427be2a6531c043f384562c081Chris Lattner    for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {
3259a8641201b2db8427be2a6531c043f384562c081Chris Lattner      Value *OpVal = InsertPHITranslatedSubExpr(GEP->getOperand(i),
3269a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                                CurBB, PredBB, DT, NewInsts);
3279a8641201b2db8427be2a6531c043f384562c081Chris Lattner      if (OpVal == 0) return 0;
3289a8641201b2db8427be2a6531c043f384562c081Chris Lattner      GEPOps.push_back(OpVal);
3299a8641201b2db8427be2a6531c043f384562c081Chris Lattner    }
3309a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3319a8641201b2db8427be2a6531c043f384562c081Chris Lattner    GetElementPtrInst *Result =
3329a8641201b2db8427be2a6531c043f384562c081Chris Lattner    GetElementPtrInst::Create(GEPOps[0], GEPOps.begin()+1, GEPOps.end(),
3339a8641201b2db8427be2a6531c043f384562c081Chris Lattner                              InVal->getName()+".phi.trans.insert",
3349a8641201b2db8427be2a6531c043f384562c081Chris Lattner                              PredBB->getTerminator());
3359a8641201b2db8427be2a6531c043f384562c081Chris Lattner    Result->setIsInBounds(GEP->isInBounds());
3369a8641201b2db8427be2a6531c043f384562c081Chris Lattner    NewInsts.push_back(Result);
3379a8641201b2db8427be2a6531c043f384562c081Chris Lattner    return Result;
3389a8641201b2db8427be2a6531c043f384562c081Chris Lattner  }
3399a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3409a8641201b2db8427be2a6531c043f384562c081Chris Lattner#if 0
3419a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // FIXME: This code works, but it is unclear that we actually want to insert
3429a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // a big chain of computation in order to make a value available in a block.
3439a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // This needs to be evaluated carefully to consider its cost trade offs.
3449a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3459a8641201b2db8427be2a6531c043f384562c081Chris Lattner  // Handle add with a constant RHS.
3469a8641201b2db8427be2a6531c043f384562c081Chris Lattner  if (Inst->getOpcode() == Instruction::Add &&
3479a8641201b2db8427be2a6531c043f384562c081Chris Lattner      isa<ConstantInt>(Inst->getOperand(1))) {
3489a8641201b2db8427be2a6531c043f384562c081Chris Lattner    // PHI translate the LHS.
3499a8641201b2db8427be2a6531c043f384562c081Chris Lattner    Value *OpVal = InsertPHITranslatedSubExpr(Inst->getOperand(0),
3509a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                              CurBB, PredBB, DT, NewInsts);
3519a8641201b2db8427be2a6531c043f384562c081Chris Lattner    if (OpVal == 0) return 0;
3529a8641201b2db8427be2a6531c043f384562c081Chris Lattner
3539a8641201b2db8427be2a6531c043f384562c081Chris Lattner    BinaryOperator *Res = BinaryOperator::CreateAdd(OpVal, Inst->getOperand(1),
3549a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                           InVal->getName()+".phi.trans.insert",
3559a8641201b2db8427be2a6531c043f384562c081Chris Lattner                                                    PredBB->getTerminator());
3569a8641201b2db8427be2a6531c043f384562c081Chris Lattner    Res->setHasNoSignedWrap(cast<BinaryOperator>(Inst)->hasNoSignedWrap());
3579a8641201b2db8427be2a6531c043f384562c081Chris Lattner    Res->setHasNoUnsignedWrap(cast<BinaryOperator>(Inst)->hasNoUnsignedWrap());
3589a8641201b2db8427be2a6531c043f384562c081Chris Lattner    NewInsts.push_back(Res);
3599a8641201b2db8427be2a6531c043f384562c081Chris Lattner    return Res;
3609a8641201b2db8427be2a6531c043f384562c081Chris Lattner  }
3619a8641201b2db8427be2a6531c043f384562c081Chris Lattner#endif
3629a8641201b2db8427be2a6531c043f384562c081Chris Lattner
363210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner  return 0;
364210e45af3a579beeefb001c8f13c94e80407aad5Chris Lattner}
365