18d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//===- InstCombineLoadStoreAlloca.cpp -------------------------------------===//
28d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//
38d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//                     The LLVM Compiler Infrastructure
48d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//
58d9b8d717e665945b31b0742b901561fb433ceceChris Lattner// This file is distributed under the University of Illinois Open Source
68d9b8d717e665945b31b0742b901561fb433ceceChris Lattner// License. See LICENSE.TXT for details.
78d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//
88d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//===----------------------------------------------------------------------===//
98d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//
108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner// This file implements the visit functions for load, store and alloca.
118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//
128d9b8d717e665945b31b0742b901561fb433ceceChris Lattner//===----------------------------------------------------------------------===//
138d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
148d9b8d717e665945b31b0742b901561fb433ceceChris Lattner#include "InstCombine.h"
158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner#include "llvm/IntrinsicInst.h"
16dd9344f3face8f1978a7f9f393c31b628144d1f6Dan Gohman#include "llvm/Analysis/Loads.h"
178d9b8d717e665945b31b0742b901561fb433ceceChris Lattner#include "llvm/Target/TargetData.h"
188d9b8d717e665945b31b0742b901561fb433ceceChris Lattner#include "llvm/Transforms/Utils/BasicBlockUtils.h"
198d9b8d717e665945b31b0742b901561fb433ceceChris Lattner#include "llvm/Transforms/Utils/Local.h"
208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner#include "llvm/ADT/Statistic.h"
218d9b8d717e665945b31b0742b901561fb433ceceChris Lattnerusing namespace llvm;
228d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
23ec68f552f2a5c1df10813a80929995185eb98243Chandler CarruthSTATISTIC(NumDeadStore,    "Number of dead stores eliminated");
24ec68f552f2a5c1df10813a80929995185eb98243Chandler CarruthSTATISTIC(NumGlobalCopies, "Number of allocas copied from constant global");
25ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
26ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// pointsToConstantGlobal - Return true if V (possibly indirectly) points to
27ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// some part of a constant global variable.  This intentionally only accepts
28ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// constant expressions because we can't rewrite arbitrary instructions.
29ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruthstatic bool pointsToConstantGlobal(Value *V) {
30ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
31ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    return GV->isConstant();
32ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
33ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (CE->getOpcode() == Instruction::BitCast ||
34ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        CE->getOpcode() == Instruction::GetElementPtr)
35ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      return pointsToConstantGlobal(CE->getOperand(0));
36ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  return false;
37ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth}
38ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
39ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// isOnlyCopiedFromConstantGlobal - Recursively walk the uses of a (derived)
40ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// pointer to an alloca.  Ignore any reads of the pointer, return false if we
41ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// see any stores or other unknown uses.  If we see pointer arithmetic, keep
42ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// track of whether it moves the pointer (with IsOffset) but otherwise traverse
43ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// the uses.  If we see a memcpy/memmove that targets an unoffseted pointer to
44ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// the alloca, and if the source pointer is a pointer to a constant global, we
45ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// can optimize this.
46ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruthstatic bool
47ec68f552f2a5c1df10813a80929995185eb98243Chandler CarruthisOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
48ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth                               SmallVectorImpl<Instruction *> &ToDelete,
49ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth                               bool IsOffset = false) {
50ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // We track lifetime intrinsics as we encounter them.  If we decide to go
51ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // ahead and replace the value with the global, this lets the caller quickly
52ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // eliminate the markers.
53ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
54ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
55ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    User *U = cast<Instruction>(*UI);
56ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
57ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (LoadInst *LI = dyn_cast<LoadInst>(U)) {
58ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // Ignore non-volatile loads, they are always ok.
59ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (!LI->isSimple()) return false;
60ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      continue;
61ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
62ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
63ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (BitCastInst *BCI = dyn_cast<BitCastInst>(U)) {
64ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // If uses of the bitcast are ok, we are ok.
65ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (!isOnlyCopiedFromConstantGlobal(BCI, TheCopy, ToDelete, IsOffset))
66ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        return false;
67ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      continue;
68ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
69ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) {
70ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // If the GEP has all zero indices, it doesn't offset the pointer.  If it
71ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // doesn't, it does.
72ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (!isOnlyCopiedFromConstantGlobal(GEP, TheCopy, ToDelete,
73ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth                                          IsOffset || !GEP->hasAllZeroIndices()))
74ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        return false;
75ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      continue;
76ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
77ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
78ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (CallSite CS = U) {
79ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // If this is the function being called then we treat it like a load and
80ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // ignore it.
81ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (CS.isCallee(UI))
82ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        continue;
83ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
84ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // If this is a readonly/readnone call site, then we know it is just a
85ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // load (but one that potentially returns the value itself), so we can
86ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // ignore it if we know that the value isn't captured.
87ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      unsigned ArgNo = CS.getArgumentNo(UI);
88ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (CS.onlyReadsMemory() &&
89ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth          (CS.getInstruction()->use_empty() || CS.doesNotCapture(ArgNo)))
90ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        continue;
91ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
92ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // If this is being passed as a byval argument, the caller is making a
93ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      // copy, so it is only a read of the alloca.
94ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (CS.isByValArgument(ArgNo))
95ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        continue;
96ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
97ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
98ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // Lifetime intrinsics can be handled by the caller.
99ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
100ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (II->getIntrinsicID() == Intrinsic::lifetime_start ||
101ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth          II->getIntrinsicID() == Intrinsic::lifetime_end) {
102ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        assert(II->use_empty() && "Lifetime markers have no result to use!");
103ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        ToDelete.push_back(II);
104ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        continue;
105ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      }
106ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
107ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
108ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // If this is isn't our memcpy/memmove, reject it as something we can't
109ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // handle.
110ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    MemTransferInst *MI = dyn_cast<MemTransferInst>(U);
111ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (MI == 0)
112ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      return false;
113ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
114ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // If the transfer is using the alloca as a source of the transfer, then
115ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // ignore it since it is a load (unless the transfer is volatile).
116ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (UI.getOperandNo() == 1) {
117ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      if (MI->isVolatile()) return false;
118ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      continue;
119ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
120ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
121ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // If we already have seen a copy, reject the second one.
122ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (TheCopy) return false;
123ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
124ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // If the pointer has been offset from the start of the alloca, we can't
125ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // safely handle this.
126ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (IsOffset) return false;
127ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
128ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // If the memintrinsic isn't using the alloca as the dest, reject it.
129ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (UI.getOperandNo() != 0) return false;
130ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
131ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // If the source of the memcpy/move is not a constant global, reject it.
132ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (!pointsToConstantGlobal(MI->getSource()))
133ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      return false;
134ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
135ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    // Otherwise, the transform is safe.  Remember the copy instruction.
136ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    TheCopy = MI;
137ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  }
138ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  return true;
139ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth}
140ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
141ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// isOnlyCopiedFromConstantGlobal - Return true if the specified alloca is only
142ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// modified by a copy from a constant global.  If we can prove this, we can
143ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// replace any uses of the alloca with uses of the global directly.
144ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruthstatic MemTransferInst *
145ec68f552f2a5c1df10813a80929995185eb98243Chandler CarruthisOnlyCopiedFromConstantGlobal(AllocaInst *AI,
146ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth                               SmallVectorImpl<Instruction *> &ToDelete) {
147ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  MemTransferInst *TheCopy = 0;
148ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (isOnlyCopiedFromConstantGlobal(AI, TheCopy, ToDelete))
149ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    return TheCopy;
150ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  return 0;
151ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth}
152ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
153ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// getPointeeAlignment - Compute the minimum alignment of the value pointed
154ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth/// to by the given pointer.
155ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruthstatic unsigned getPointeeAlignment(Value *V, const TargetData &TD) {
156ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
157ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (CE->getOpcode() == Instruction::BitCast ||
158ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        (CE->getOpcode() == Instruction::GetElementPtr &&
159ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth         cast<GEPOperator>(CE)->hasAllZeroIndices()))
160ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      return getPointeeAlignment(CE->getOperand(0), TD);
161ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
162ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
163ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (!GV->isDeclaration())
164ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      return TD.getPreferredAlignment(GV);
165ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
166ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (PointerType *PT = dyn_cast<PointerType>(V->getType()))
167ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    return TD.getABITypeAlignment(PT->getElementType());
168ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
169ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  return 0;
170ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth}
1718d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
1728d9b8d717e665945b31b0742b901561fb433ceceChris LattnerInstruction *InstCombiner::visitAllocaInst(AllocaInst &AI) {
17305d62537276197b3351d9887f4967590b6a3b901Dan Gohman  // Ensure that the alloca array size argument has type intptr_t, so that
17405d62537276197b3351d9887f4967590b6a3b901Dan Gohman  // any casting is exposed early.
17505d62537276197b3351d9887f4967590b6a3b901Dan Gohman  if (TD) {
176db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    Type *IntPtrTy = TD->getIntPtrType(AI.getContext());
17705d62537276197b3351d9887f4967590b6a3b901Dan Gohman    if (AI.getArraySize()->getType() != IntPtrTy) {
17805d62537276197b3351d9887f4967590b6a3b901Dan Gohman      Value *V = Builder->CreateIntCast(AI.getArraySize(),
17905d62537276197b3351d9887f4967590b6a3b901Dan Gohman                                        IntPtrTy, false);
18005d62537276197b3351d9887f4967590b6a3b901Dan Gohman      AI.setOperand(0, V);
18105d62537276197b3351d9887f4967590b6a3b901Dan Gohman      return &AI;
18205d62537276197b3351d9887f4967590b6a3b901Dan Gohman    }
18305d62537276197b3351d9887f4967590b6a3b901Dan Gohman  }
18405d62537276197b3351d9887f4967590b6a3b901Dan Gohman
1858d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Convert: alloca Ty, C - where C is a constant != 1 into: alloca [C x Ty], 1
1868d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (AI.isArrayAllocation()) {  // Check C != 1
1878d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (const ConstantInt *C = dyn_cast<ConstantInt>(AI.getArraySize())) {
188db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      Type *NewTy =
1898d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        ArrayType::get(AI.getAllocatedType(), C->getZExtValue());
1908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      AllocaInst *New = Builder->CreateAlloca(NewTy, 0, AI.getName());
1918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      New->setAlignment(AI.getAlignment());
1928d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
1938d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Scan to the end of the allocation instructions, to skip over a block of
1948d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // allocas if possible...also skip interleaved debug info
1958d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      //
1968d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      BasicBlock::iterator It = New;
1978d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      while (isa<AllocaInst>(*It) || isa<DbgInfoIntrinsic>(*It)) ++It;
1988d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
1998d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Now that I is pointing to the first non-allocation-inst in the block,
2008d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // insert our getelementptr instruction...
2018d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      //
2028d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      Value *NullIdx =Constant::getNullValue(Type::getInt32Ty(AI.getContext()));
2038d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      Value *Idx[2];
2048d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      Idx[0] = NullIdx;
2058d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      Idx[1] = NullIdx;
206e6f364b6c44eda14cd4ad54366ea5cc7246b9500Eli Friedman      Instruction *GEP =
207a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad           GetElementPtrInst::CreateInBounds(New, Idx, New->getName()+".sub");
208e6f364b6c44eda14cd4ad54366ea5cc7246b9500Eli Friedman      InsertNewInstBefore(GEP, *It);
2098d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
2108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Now make everything use the getelementptr instead of the original
2118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // allocation.
212e6f364b6c44eda14cd4ad54366ea5cc7246b9500Eli Friedman      return ReplaceInstUsesWith(AI, GEP);
2138d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    } else if (isa<UndefValue>(AI.getArraySize())) {
2148d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return ReplaceInstUsesWith(AI, Constant::getNullValue(AI.getType()));
2158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
2168d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
2178d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
21891fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands  if (TD && AI.getAllocatedType()->isSized()) {
2198d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // If the alignment is 0 (unspecified), assign it the preferred alignment.
2208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (AI.getAlignment() == 0)
2218d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      AI.setAlignment(TD->getPrefTypeAlignment(AI.getAllocatedType()));
22291fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands
22391fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands    // Move all alloca's of zero byte objects to the entry block and merge them
22491fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands    // together.  Note that we only do this for alloca's, because malloc should
22591fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands    // allocate and return a unique pointer, even for a zero byte allocation.
22691fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands    if (TD->getTypeAllocSize(AI.getAllocatedType()) == 0) {
22791fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      // For a zero sized alloca there is no point in doing an array allocation.
22891fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      // This is helpful if the array size is a complicated expression not used
22991fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      // elsewhere.
23091fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      if (AI.isArrayAllocation()) {
23191fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        AI.setOperand(0, ConstantInt::get(AI.getArraySize()->getType(), 1));
23291fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        return &AI;
23391fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      }
23491fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands
23591fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      // Get the first instruction in the entry block.
23691fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      BasicBlock &EntryBlock = AI.getParent()->getParent()->getEntryBlock();
23791fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      Instruction *FirstInst = EntryBlock.getFirstNonPHIOrDbg();
23891fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      if (FirstInst != &AI) {
23991fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        // If the entry block doesn't start with a zero-size alloca then move
24091fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        // this one to the start of the entry block.  There is no problem with
24191fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        // dominance as the array size was forced to a constant earlier already.
24291fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        AllocaInst *EntryAI = dyn_cast<AllocaInst>(FirstInst);
24391fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        if (!EntryAI || !EntryAI->getAllocatedType()->isSized() ||
24491fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands            TD->getTypeAllocSize(EntryAI->getAllocatedType()) != 0) {
24591fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands          AI.moveBefore(FirstInst);
24691fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands          return &AI;
24791fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        }
24891fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands
24991fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        // Replace this zero-sized alloca with the one at the start of the entry
25091fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        // block after ensuring that the address will be aligned enough for both
25191fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        // types.
25291fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        unsigned MaxAlign =
25391fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands          std::max(TD->getPrefTypeAlignment(EntryAI->getAllocatedType()),
25491fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands                   TD->getPrefTypeAlignment(AI.getAllocatedType()));
25591fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        EntryAI->setAlignment(MaxAlign);
25691fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        if (AI.getType() != EntryAI->getType())
25791fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands          return new BitCastInst(EntryAI, AI.getType());
25891fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands        return ReplaceInstUsesWith(AI, EntryAI);
25991fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands      }
260ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    }
261ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  }
262ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth
263ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // Check to see if this allocation is only modified by a memcpy/memmove from
264ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // a constant global whose alignment is equal to or exceeds that of the
265ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // allocation.  If this is the case, we can change all users to use
266ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // the constant global instead.  This is commonly produced by the CFE by
267ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
268ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  // is only subsequently read.
269ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  SmallVector<Instruction *, 4> ToDelete;
270ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth  if (MemTransferInst *Copy = isOnlyCopiedFromConstantGlobal(&AI, ToDelete)) {
271ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth    if (AI.getAlignment() <= getPointeeAlignment(Copy->getSource(), *TD)) {
272ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      DEBUG(dbgs() << "Found alloca equal to global: " << AI << '\n');
273ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      DEBUG(dbgs() << "  memcpy = " << *Copy << '\n');
274ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      for (unsigned i = 0, e = ToDelete.size(); i != e; ++i)
275ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        EraseInstFromFunction(*ToDelete[i]);
276ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      Constant *TheSrc = cast<Constant>(Copy->getSource());
277ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      Instruction *NewI
278ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth        = ReplaceInstUsesWith(AI, ConstantExpr::getBitCast(TheSrc,
279ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth                                                           AI.getType()));
280ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      EraseInstFromFunction(*Copy);
281ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      ++NumGlobalCopies;
282ec68f552f2a5c1df10813a80929995185eb98243Chandler Carruth      return NewI;
28391fa1da2f73ce77d386cacb1a69f38dcdf7cd60cDuncan Sands    }
2848d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
2858d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
28678f8ef42173a3a9867ed789073d4ddc652fb7ff2Nuno Lopes  // At last, use the generic allocation site handler to aggressively remove
28778f8ef42173a3a9867ed789073d4ddc652fb7ff2Nuno Lopes  // unused allocas.
28878f8ef42173a3a9867ed789073d4ddc652fb7ff2Nuno Lopes  return visitAllocSite(AI);
2898d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
2908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
2918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
2928d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// InstCombineLoadCast - Fold 'load (cast P)' -> cast (load P)' when possible.
2938d9b8d717e665945b31b0742b901561fb433ceceChris Lattnerstatic Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI,
2948d9b8d717e665945b31b0742b901561fb433ceceChris Lattner                                        const TargetData *TD) {
2958d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  User *CI = cast<User>(LI.getOperand(0));
2968d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *CastOp = CI->getOperand(0);
2978d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
298db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  PointerType *DestTy = cast<PointerType>(CI->getType());
299db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *DestPTy = DestTy->getElementType();
300db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  if (PointerType *SrcTy = dyn_cast<PointerType>(CastOp->getType())) {
3018d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3028d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // If the address spaces don't match, don't eliminate the cast.
3038d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (DestTy->getAddressSpace() != SrcTy->getAddressSpace())
3048d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return 0;
3058d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
306db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    Type *SrcPTy = SrcTy->getElementType();
3078d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3081df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands    if (DestPTy->isIntegerTy() || DestPTy->isPointerTy() ||
3091df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands         DestPTy->isVectorTy()) {
3108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // If the source is an array, the code below will not succeed.  Check to
3118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // see if a trivial 'gep P, 0, 0' will help matters.  Only do this for
3128d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // constants.
313db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      if (ArrayType *ASrcTy = dyn_cast<ArrayType>(SrcPTy))
3148d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        if (Constant *CSrc = dyn_cast<Constant>(CastOp))
3158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          if (ASrcTy->getNumElements() != 0) {
3168d9b8d717e665945b31b0742b901561fb433ceceChris Lattner            Value *Idxs[2];
3178d9b8d717e665945b31b0742b901561fb433ceceChris Lattner            Idxs[0] = Constant::getNullValue(Type::getInt32Ty(LI.getContext()));
3188d9b8d717e665945b31b0742b901561fb433ceceChris Lattner            Idxs[1] = Idxs[0];
3198908ff207d8dc0daccde3dc5710dc805ec98e1faJay Foad            CastOp = ConstantExpr::getGetElementPtr(CSrc, Idxs);
3208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner            SrcTy = cast<PointerType>(CastOp->getType());
3218d9b8d717e665945b31b0742b901561fb433ceceChris Lattner            SrcPTy = SrcTy->getElementType();
3228d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          }
3238d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3248d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (IC.getTargetData() &&
3251df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands          (SrcPTy->isIntegerTy() || SrcPTy->isPointerTy() ||
3261df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands            SrcPTy->isVectorTy()) &&
3278d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          // Do not allow turning this into a load of an integer, which is then
3288d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          // casted to a pointer, this pessimizes pointer analysis a lot.
3291df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands          (SrcPTy->isPointerTy() == LI.getType()->isPointerTy()) &&
3308d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          IC.getTargetData()->getTypeSizeInBits(SrcPTy) ==
3318d9b8d717e665945b31b0742b901561fb433ceceChris Lattner               IC.getTargetData()->getTypeSizeInBits(DestPTy)) {
3328d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3338d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        // Okay, we are casting from one integer or pointer type to another of
3348d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        // the same size.  Instead of casting the pointer before the load, cast
3358d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        // the result of the loaded value.
3366ecfccfd55274187368b86d7f2e65f77d1921c36Bob Wilson        LoadInst *NewLoad =
3378d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          IC.Builder->CreateLoad(CastOp, LI.isVolatile(), CI->getName());
3386ecfccfd55274187368b86d7f2e65f77d1921c36Bob Wilson        NewLoad->setAlignment(LI.getAlignment());
339cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman        NewLoad->setAtomic(LI.getOrdering(), LI.getSynchScope());
3408d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        // Now cast the result of the load.
3418d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return new BitCastInst(NewLoad, LI.getType());
3428d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      }
3438d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
3448d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
3458d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  return 0;
3468d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
3478d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3488d9b8d717e665945b31b0742b901561fb433ceceChris LattnerInstruction *InstCombiner::visitLoadInst(LoadInst &LI) {
3498d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *Op = LI.getOperand(0);
3508d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3518d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Attempt to improve the alignment.
3528d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (TD) {
3538d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    unsigned KnownAlign =
354687140c818ba4b896329a83324714140b6580ef8Chris Lattner      getOrEnforceKnownAlignment(Op, TD->getPrefTypeAlignment(LI.getType()),TD);
3550fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman    unsigned LoadAlign = LI.getAlignment();
3560fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman    unsigned EffectiveLoadAlign = LoadAlign != 0 ? LoadAlign :
3570fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman      TD->getABITypeAlignment(LI.getType());
3580fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman
3590fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman    if (KnownAlign > EffectiveLoadAlign)
3608d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      LI.setAlignment(KnownAlign);
3610fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman    else if (LoadAlign == 0)
3620fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman      LI.setAlignment(EffectiveLoadAlign);
3638d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
3648d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3658d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // load (cast X) --> cast (load X) iff safe.
3668d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (isa<CastInst>(Op))
3678d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (Instruction *Res = InstCombineLoadCast(*this, LI, TD))
3688d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return Res;
3698d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
370cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  // None of the following transforms are legal for volatile/atomic loads.
371cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  // FIXME: Some of it is okay for atomic loads; needs refactoring.
372cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  if (!LI.isSimple()) return 0;
3738d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3748d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Do really simple store-to-load forwarding and load CSE, to catch cases
375ab4c366274a582dd8146b2820c6b999cad5fce36Duncan Sands  // where there are several consecutive memory accesses to the same location,
3768d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // separated by a few arithmetic operations.
3778d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BasicBlock::iterator BBI = &LI;
3788d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,6))
3798d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return ReplaceInstUsesWith(LI, AvailableVal);
3808d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3818d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // load(gep null, ...) -> unreachable
3828d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
3838d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    const Value *GEPI0 = GEPI->getOperand(0);
3848d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // TODO: Consider a target hook for valid address spaces for this xform.
3858d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (isa<ConstantPointerNull>(GEPI0) && GEPI->getPointerAddressSpace() == 0){
3868d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Insert a new store to null instruction before the load to indicate
3878d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // that this code is not reachable.  We do this instead of inserting
3888d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // an unreachable instruction directly because we cannot modify the
3898d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // CFG.
3908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      new StoreInst(UndefValue::get(LI.getType()),
3918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner                    Constant::getNullValue(Op->getType()), &LI);
3928d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType()));
3938d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
3948d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
3958d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
3968d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // load null/undef -> unreachable
3978d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // TODO: Consider a target hook for valid address spaces for this xform.
3988d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (isa<UndefValue>(Op) ||
3998d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      (isa<ConstantPointerNull>(Op) && LI.getPointerAddressSpace() == 0)) {
4008d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Insert a new store to null instruction before the load to indicate that
4018d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // this code is not reachable.  We do this instead of inserting an
4028d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // unreachable instruction directly because we cannot modify the CFG.
4038d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    new StoreInst(UndefValue::get(LI.getType()),
4048d9b8d717e665945b31b0742b901561fb433ceceChris Lattner                  Constant::getNullValue(Op->getType()), &LI);
4058d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return ReplaceInstUsesWith(LI, UndefValue::get(LI.getType()));
4068d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
4078d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4088d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Instcombine load (constantexpr_cast global) -> cast (load global)
4098d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Op))
4108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (CE->isCast())
4118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (Instruction *Res = InstCombineLoadCast(*this, LI, TD))
4128d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return Res;
4138d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4148d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (Op->hasOneUse()) {
4158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Change select and PHI nodes to select values instead of addresses: this
4168d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // helps alias analysis out a lot, allows many others simplifications, and
4178d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // exposes redundancy in the code.
4188d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    //
4198d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Note that we cannot do the transformation unless we know that the
4208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // introduced loads cannot trap!  Something like this is valid as long as
4218d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // the condition is always false: load (select bool %C, int* null, int* %G),
4228d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // but it would not be valid if we transformed it to load from null
4238d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // unconditionally.
4248d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    //
4258d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (SelectInst *SI = dyn_cast<SelectInst>(Op)) {
4268d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // load (select (Cond, &V1, &V2))  --> select(Cond, load &V1, load &V2).
42749db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson      unsigned Align = LI.getAlignment();
42849db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson      if (isSafeToLoadUnconditionally(SI->getOperand(1), SI, Align, TD) &&
42949db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson          isSafeToLoadUnconditionally(SI->getOperand(2), SI, Align, TD)) {
4306ecfccfd55274187368b86d7f2e65f77d1921c36Bob Wilson        LoadInst *V1 = Builder->CreateLoad(SI->getOperand(1),
43149db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson                                           SI->getOperand(1)->getName()+".val");
4326ecfccfd55274187368b86d7f2e65f77d1921c36Bob Wilson        LoadInst *V2 = Builder->CreateLoad(SI->getOperand(2),
43349db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson                                           SI->getOperand(2)->getName()+".val");
43449db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson        V1->setAlignment(Align);
43549db68fba01722ca032dc5170f8248a9d25f0199Bob Wilson        V2->setAlignment(Align);
4368d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return SelectInst::Create(SI->getCondition(), V1, V2);
4378d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      }
4388d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4398d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // load (select (cond, null, P)) -> load P
4408d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (Constant *C = dyn_cast<Constant>(SI->getOperand(1)))
4418d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        if (C->isNullValue()) {
4428d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          LI.setOperand(0, SI->getOperand(2));
4438d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          return &LI;
4448d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        }
4458d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4468d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // load (select (cond, P, null)) -> load P
4478d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (Constant *C = dyn_cast<Constant>(SI->getOperand(2)))
4488d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        if (C->isNullValue()) {
4498d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          LI.setOperand(0, SI->getOperand(1));
4508d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          return &LI;
4518d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        }
4528d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
4538d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
4548d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  return 0;
4558d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
4568d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4578d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// InstCombineStoreToCast - Fold store V, (cast P) -> store (cast V), P
4588d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// when possible.  This makes it generally easy to do alias analysis and/or
4598d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// SROA/mem2reg of the memory object.
4608d9b8d717e665945b31b0742b901561fb433ceceChris Lattnerstatic Instruction *InstCombineStoreToCast(InstCombiner &IC, StoreInst &SI) {
4618d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  User *CI = cast<User>(SI.getOperand(1));
4628d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *CastOp = CI->getOperand(0);
4638d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
464db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *DestPTy = cast<PointerType>(CI->getType())->getElementType();
465db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  PointerType *SrcTy = dyn_cast<PointerType>(CastOp->getType());
4668d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (SrcTy == 0) return 0;
4678d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
468db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type *SrcPTy = SrcTy->getElementType();
4698d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4701df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands  if (!DestPTy->isIntegerTy() && !DestPTy->isPointerTy())
4718d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return 0;
4728d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4738d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  /// NewGEPIndices - If SrcPTy is an aggregate type, we can emit a "noop gep"
4748d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  /// to its first element.  This allows us to handle things like:
4758d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  ///   store i32 xxx, (bitcast {foo*, float}* %P to i32*)
4768d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  /// on 32-bit hosts.
4778d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  SmallVector<Value*, 4> NewGEPIndices;
4788d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4798d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // If the source is an array, the code below will not succeed.  Check to
4808d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // see if a trivial 'gep P, 0, 0' will help matters.  Only do this for
4818d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // constants.
4821df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands  if (SrcPTy->isArrayTy() || SrcPTy->isStructTy()) {
4838d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Index through pointer.
4848d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    Constant *Zero = Constant::getNullValue(Type::getInt32Ty(SI.getContext()));
4858d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    NewGEPIndices.push_back(Zero);
4868d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
4878d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    while (1) {
488db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      if (StructType *STy = dyn_cast<StructType>(SrcPTy)) {
4898d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        if (!STy->getNumElements()) /* Struct can be empty {} */
4908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          break;
4918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        NewGEPIndices.push_back(Zero);
4928d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        SrcPTy = STy->getElementType(0);
493db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      } else if (ArrayType *ATy = dyn_cast<ArrayType>(SrcPTy)) {
4948d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        NewGEPIndices.push_back(Zero);
4958d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        SrcPTy = ATy->getElementType();
4968d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      } else {
4978d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        break;
4988d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      }
4998d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
5008d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5018d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    SrcTy = PointerType::get(SrcPTy, SrcTy->getAddressSpace());
5028d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
5038d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5041df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands  if (!SrcPTy->isIntegerTy() && !SrcPTy->isPointerTy())
5058d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return 0;
5068d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5078d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // If the pointers point into different address spaces or if they point to
5088d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // values with different sizes, we can't do the transformation.
5098d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (!IC.getTargetData() ||
5108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      SrcTy->getAddressSpace() !=
5118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        cast<PointerType>(CI->getType())->getAddressSpace() ||
5128d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      IC.getTargetData()->getTypeSizeInBits(SrcPTy) !=
5138d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      IC.getTargetData()->getTypeSizeInBits(DestPTy))
5148d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return 0;
5158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5168d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Okay, we are casting from one integer or pointer type to another of
5178d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // the same size.  Instead of casting the pointer before
5188d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // the store, cast the value to be stored.
5198d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *NewCast;
5208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *SIOp0 = SI.getOperand(0);
5218d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Instruction::CastOps opcode = Instruction::BitCast;
522db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* CastSrcTy = SIOp0->getType();
523db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* CastDstTy = SrcPTy;
5241df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands  if (CastDstTy->isPointerTy()) {
525b0bc6c361da9009e8414efde317d9bbff755f6c0Duncan Sands    if (CastSrcTy->isIntegerTy())
5268d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      opcode = Instruction::IntToPtr;
5271df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands  } else if (CastDstTy->isIntegerTy()) {
5281df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands    if (SIOp0->getType()->isPointerTy())
5298d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      opcode = Instruction::PtrToInt;
5308d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
5318d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5328d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // SIOp0 is a pointer to aggregate and this is a store to the first field,
5338d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // emit a GEP to index into its first field.
5348d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (!NewGEPIndices.empty())
5350a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad    CastOp = IC.Builder->CreateInBoundsGEP(CastOp, NewGEPIndices);
5368d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5378d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  NewCast = IC.Builder->CreateCast(opcode, SIOp0, CastDstTy,
5388d9b8d717e665945b31b0742b901561fb433ceceChris Lattner                                   SIOp0->getName()+".c");
53917a0bf996fb61cdd43cec2cfc7db53145bbc767aDan Gohman  SI.setOperand(0, NewCast);
54017a0bf996fb61cdd43cec2cfc7db53145bbc767aDan Gohman  SI.setOperand(1, CastOp);
54117a0bf996fb61cdd43cec2cfc7db53145bbc767aDan Gohman  return &SI;
5428d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
5438d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5448d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// equivalentAddressValues - Test if A and B will obviously have the same
5458d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// value. This includes recognizing that %t0 and %t1 will have the same
5468d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// value in code like this:
5478d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///   %t0 = getelementptr \@a, 0, 3
5488d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///   store i32 0, i32* %t0
5498d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///   %t1 = getelementptr \@a, 0, 3
5508d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///   %t2 = load i32* %t1
5518d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///
5528d9b8d717e665945b31b0742b901561fb433ceceChris Lattnerstatic bool equivalentAddressValues(Value *A, Value *B) {
5538d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Test if the values are trivially equivalent.
5548d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (A == B) return true;
5558d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5568d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Test if the values come form identical arithmetic instructions.
5578d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // This uses isIdenticalToWhenDefined instead of isIdenticalTo because
5588d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // its only used to compare two uses within the same basic block, which
5598d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // means that they'll always either have the same value or one of them
5608d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // will have an undefined value.
5618d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (isa<BinaryOperator>(A) ||
5628d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      isa<CastInst>(A) ||
5638d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      isa<PHINode>(A) ||
5648d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      isa<GetElementPtrInst>(A))
5658d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (Instruction *BI = dyn_cast<Instruction>(B))
5668d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (cast<Instruction>(A)->isIdenticalToWhenDefined(BI))
5678d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return true;
5688d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5698d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Otherwise they may not be equivalent.
5708d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  return false;
5718d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
5728d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5738d9b8d717e665945b31b0742b901561fb433ceceChris LattnerInstruction *InstCombiner::visitStoreInst(StoreInst &SI) {
5748d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *Val = SI.getOperand(0);
5758d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *Ptr = SI.getOperand(1);
5768d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
5778d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Attempt to improve the alignment.
5788d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (TD) {
5798d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    unsigned KnownAlign =
580687140c818ba4b896329a83324714140b6580ef8Chris Lattner      getOrEnforceKnownAlignment(Ptr, TD->getPrefTypeAlignment(Val->getType()),
581687140c818ba4b896329a83324714140b6580ef8Chris Lattner                                 TD);
5820fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman    unsigned StoreAlign = SI.getAlignment();
5830fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman    unsigned EffectiveStoreAlign = StoreAlign != 0 ? StoreAlign :
5840fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman      TD->getABITypeAlignment(Val->getType());
5850fd353376b2741fc477c5fe05a5f18ae3abc4f60Dan Gohman
5860ccae0b1f6b95e4500adb45649472389a1f111a7Bill Wendling    if (KnownAlign > EffectiveStoreAlign)
5878d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      SI.setAlignment(KnownAlign);
5880ccae0b1f6b95e4500adb45649472389a1f111a7Bill Wendling    else if (StoreAlign == 0)
5890ccae0b1f6b95e4500adb45649472389a1f111a7Bill Wendling      SI.setAlignment(EffectiveStoreAlign);
5908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
5918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
592cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  // Don't hack volatile/atomic stores.
593cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  // FIXME: Some bits are legal for atomic stores; needs refactoring.
594cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  if (!SI.isSimple()) return 0;
595cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman
596cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  // If the RHS is an alloca with a single use, zapify the store, making the
597cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  // alloca dead.
598cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  if (Ptr->hasOneUse()) {
599cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman    if (isa<AllocaInst>(Ptr))
600cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman      return EraseInstFromFunction(SI);
601cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr)) {
602cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman      if (isa<AllocaInst>(GEP->getOperand(0))) {
603cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman        if (GEP->getOperand(0)->hasOneUse())
604cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman          return EraseInstFromFunction(SI);
605cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman      }
606cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman    }
607cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman  }
608cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman
6098d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Do really simple DSE, to catch cases where there are several consecutive
6108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // stores to the same location, separated by a few arithmetic operations. This
6118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // situation often occurs with bitfield accesses.
6128d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BasicBlock::iterator BBI = &SI;
6138d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  for (unsigned ScanInsts = 6; BBI != SI.getParent()->begin() && ScanInsts;
6148d9b8d717e665945b31b0742b901561fb433ceceChris Lattner       --ScanInsts) {
6158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    --BBI;
61629fa5e98863332eb808a6f5c1e29138ca6fd7f5cVictor Hernandez    // Don't count debug info directives, lest they affect codegen,
61729fa5e98863332eb808a6f5c1e29138ca6fd7f5cVictor Hernandez    // and we skip pointer-to-pointer bitcasts, which are NOPs.
61829fa5e98863332eb808a6f5c1e29138ca6fd7f5cVictor Hernandez    if (isa<DbgInfoIntrinsic>(BBI) ||
6191df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands        (isa<BitCastInst>(BBI) && BBI->getType()->isPointerTy())) {
6208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      ScanInsts++;
6218d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      continue;
6228d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
6238d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6248d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (StoreInst *PrevSI = dyn_cast<StoreInst>(BBI)) {
6258d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Prev store isn't volatile, and stores to the same location?
626cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman      if (PrevSI->isSimple() && equivalentAddressValues(PrevSI->getOperand(1),
627cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman                                                        SI.getOperand(1))) {
6288d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        ++NumDeadStore;
6298d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        ++BBI;
6308d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        EraseInstFromFunction(*PrevSI);
6318d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        continue;
6328d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      }
6338d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      break;
6348d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
6358d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6368d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // If this is a load, we have to stop.  However, if the loaded value is from
6378d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // the pointer we're loading and is producing the pointer we're storing,
6388d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // then *this* store is dead (X = load P; store X -> P).
6398d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(BBI)) {
640948d9e7ec7c4f8da50d2640d3564b01d40ffd4b1Jin-Gu Kang      if (LI == Val && equivalentAddressValues(LI->getOperand(0), Ptr) &&
641cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman          LI->isSimple())
642948d9e7ec7c4f8da50d2640d3564b01d40ffd4b1Jin-Gu Kang        return EraseInstFromFunction(SI);
6438d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6448d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Otherwise, this is a load from some other location.  Stores before it
6458d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // may not be dead.
6468d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      break;
6478d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
6488d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6498d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Don't skip over loads or things that can modify memory.
6508d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (BBI->mayWriteToMemory() || BBI->mayReadFromMemory())
6518d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      break;
6528d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
6538d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6548d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // store X, null    -> turns into 'unreachable' in SimplifyCFG
6558d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (isa<ConstantPointerNull>(Ptr) && SI.getPointerAddressSpace() == 0) {
6568d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (!isa<UndefValue>(Val)) {
6578d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      SI.setOperand(0, UndefValue::get(Val->getType()));
6588d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (Instruction *U = dyn_cast<Instruction>(Val))
6598d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        Worklist.Add(U);  // Dropped a use.
6608d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
6618d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return 0;  // Do not modify these!
6628d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
6638d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6648d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // store undef, Ptr -> noop
6658d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (isa<UndefValue>(Val))
6668d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return EraseInstFromFunction(SI);
6678d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6688d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // If the pointer destination is a cast, see if we can fold the cast into the
6698d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // source instead.
6708d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (isa<CastInst>(Ptr))
6718d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (Instruction *Res = InstCombineStoreToCast(*this, SI))
6728d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return Res;
6738d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr))
6748d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (CE->isCast())
6758d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (Instruction *Res = InstCombineStoreToCast(*this, SI))
6768d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return Res;
6778d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6788d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6798d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // If this store is the last instruction in the basic block (possibly
680a4c77622f7f9f7546f0eae7c171ab56df125dc9aVictor Hernandez  // excepting debug info instructions), and if the block ends with an
681a4c77622f7f9f7546f0eae7c171ab56df125dc9aVictor Hernandez  // unconditional branch, try to move it to the successor block.
6828d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BBI = &SI;
6838d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  do {
6848d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    ++BBI;
68529fa5e98863332eb808a6f5c1e29138ca6fd7f5cVictor Hernandez  } while (isa<DbgInfoIntrinsic>(BBI) ||
6861df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands           (isa<BitCastInst>(BBI) && BBI->getType()->isPointerTy()));
6878d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (BranchInst *BI = dyn_cast<BranchInst>(BBI))
6888d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (BI->isUnconditional())
6898d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (SimplifyStoreAtEndOfBlock(SI))
6908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return 0;  // xform done!
6918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6928d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  return 0;
6938d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
6948d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
6958d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// SimplifyStoreAtEndOfBlock - Turn things like:
6968d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///   if () { *P = v1; } else { *P = v2 }
6978d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// into a phi node with a store in the successor.
6988d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///
6998d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// Simplify things like:
7008d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///   *P = v1; if () { *P = v2; }
7018d9b8d717e665945b31b0742b901561fb433ceceChris Lattner/// into a phi node with a store in the successor.
7028d9b8d717e665945b31b0742b901561fb433ceceChris Lattner///
7038d9b8d717e665945b31b0742b901561fb433ceceChris Lattnerbool InstCombiner::SimplifyStoreAtEndOfBlock(StoreInst &SI) {
7048d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BasicBlock *StoreBB = SI.getParent();
7058d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7068d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Check to see if the successor block has exactly two incoming edges.  If
7078d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // so, see if the other predecessor contains a store to the same location.
7088d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // if so, insert a PHI node (if needed) and move the stores down.
7098d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BasicBlock *DestBB = StoreBB->getTerminator()->getSuccessor(0);
7108d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7118d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Determine whether Dest has exactly two predecessors and, if so, compute
7128d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // the other predecessor.
7138d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  pred_iterator PI = pred_begin(DestBB);
714a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif  BasicBlock *P = *PI;
7158d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BasicBlock *OtherBB = 0;
716a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif
717a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif  if (P != StoreBB)
718a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif    OtherBB = P;
719a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif
720a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif  if (++PI == pred_end(DestBB))
7218d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return false;
7228d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
723a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif  P = *PI;
724a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif  if (P != StoreBB) {
7258d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (OtherBB)
7268d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return false;
727a9b8338bfa126de7ad6d57ca417b39d5c6a979ffGabor Greif    OtherBB = P;
7288d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
7298d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (++PI != pred_end(DestBB))
7308d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return false;
7318d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7328d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Bail out if all the relevant blocks aren't distinct (this can happen,
7338d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // for example, if SI is in an infinite loop)
7348d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (StoreBB == DestBB || OtherBB == DestBB)
7358d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return false;
7368d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7378d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Verify that the other block ends in a branch and is not otherwise empty.
7388d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BasicBlock::iterator BBI = OtherBB->getTerminator();
7398d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  BranchInst *OtherBr = dyn_cast<BranchInst>(BBI);
7408d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (!OtherBr || BBI == OtherBB->begin())
7418d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    return false;
7428d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7438d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // If the other block ends in an unconditional branch, check for the 'if then
7448d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // else' case.  there is an instruction before the branch.
7458d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  StoreInst *OtherStore = 0;
7468d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (OtherBr->isUnconditional()) {
7478d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    --BBI;
7488d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Skip over debugging info.
74929fa5e98863332eb808a6f5c1e29138ca6fd7f5cVictor Hernandez    while (isa<DbgInfoIntrinsic>(BBI) ||
7501df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands           (isa<BitCastInst>(BBI) && BBI->getType()->isPointerTy())) {
7518d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (BBI==OtherBB->begin())
7528d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return false;
7538d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      --BBI;
7548d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
755cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman    // If this isn't a store, isn't a store to the same location, or is not the
756cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman    // right kind of store, bail out.
7578d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    OtherStore = dyn_cast<StoreInst>(BBI);
7588d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (!OtherStore || OtherStore->getOperand(1) != SI.getOperand(1) ||
759cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman        !SI.isSameOperationAs(OtherStore))
7608d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return false;
7618d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  } else {
7628d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Otherwise, the other block ended with a conditional branch. If one of the
7638d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // destinations is StoreBB, then we have the if/then case.
7648d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    if (OtherBr->getSuccessor(0) != StoreBB &&
7658d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        OtherBr->getSuccessor(1) != StoreBB)
7668d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      return false;
7678d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7688d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // Okay, we know that OtherBr now goes to Dest and StoreBB, so this is an
7698d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // if/then triangle.  See if there is a store to the same ptr as SI that
7708d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // lives in OtherBB.
7718d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    for (;; --BBI) {
7728d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // Check to see if we find the matching store.
7738d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if ((OtherStore = dyn_cast<StoreInst>(BBI))) {
7748d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        if (OtherStore->getOperand(1) != SI.getOperand(1) ||
775cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman            !SI.isSameOperationAs(OtherStore))
7768d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          return false;
7778d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        break;
7788d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      }
7798d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // If we find something that may be using or overwriting the stored
7808d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // value, or if we run out of instructions, we can't do the xform.
7818d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (BBI->mayReadFromMemory() || BBI->mayWriteToMemory() ||
7828d9b8d717e665945b31b0742b901561fb433ceceChris Lattner          BBI == OtherBB->begin())
7838d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return false;
7848d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
7858d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7868d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // In order to eliminate the store in OtherBr, we have to
7878d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // make sure nothing reads or overwrites the stored value in
7888d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    // StoreBB.
7898d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    for (BasicBlock::iterator I = StoreBB->begin(); &*I != &SI; ++I) {
7908d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      // FIXME: This should really be AA driven.
7918d9b8d717e665945b31b0742b901561fb433ceceChris Lattner      if (I->mayReadFromMemory() || I->mayWriteToMemory())
7928d9b8d717e665945b31b0742b901561fb433ceceChris Lattner        return false;
7938d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    }
7948d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
7958d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
7968d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Insert a PHI node now if we need it.
7978d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  Value *MergedVal = OtherStore->getOperand(0);
7988d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  if (MergedVal != SI.getOperand(0)) {
7993ecfc861b4365f341c5c969b40e1afccde676e6fJay Foad    PHINode *PN = PHINode::Create(MergedVal->getType(), 2, "storemerge");
8008d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    PN->addIncoming(SI.getOperand(0), SI.getParent());
8018d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    PN->addIncoming(OtherStore->getOperand(0), OtherBB);
8028d9b8d717e665945b31b0742b901561fb433ceceChris Lattner    MergedVal = InsertNewInstBefore(PN, DestBB->front());
8038d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  }
8048d9b8d717e665945b31b0742b901561fb433ceceChris Lattner
8058d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Advance to a place where it is safe to insert the new store and
8068d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // insert it.
8075b6f42f57e730c2d968c313a27fa505a3c3e5efaBill Wendling  BBI = DestBB->getFirstInsertionPt();
808a311c34d2af7c750f016ef5e4c41bee77a1dfac7Eli Friedman  StoreInst *NewSI = new StoreInst(MergedVal, SI.getOperand(1),
809cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman                                   SI.isVolatile(),
810cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman                                   SI.getAlignment(),
811cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman                                   SI.getOrdering(),
812cc4a0435b7ee34af2c64a6f7ee63642f56096d1bEli Friedman                                   SI.getSynchScope());
813a311c34d2af7c750f016ef5e4c41bee77a1dfac7Eli Friedman  InsertNewInstBefore(NewSI, *BBI);
814a311c34d2af7c750f016ef5e4c41bee77a1dfac7Eli Friedman  NewSI->setDebugLoc(OtherStore->getDebugLoc());
815a311c34d2af7c750f016ef5e4c41bee77a1dfac7Eli Friedman
8168d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  // Nuke the old stores.
8178d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  EraseInstFromFunction(SI);
8188d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  EraseInstFromFunction(*OtherStore);
8198d9b8d717e665945b31b0742b901561fb433ceceChris Lattner  return true;
8208d9b8d717e665945b31b0742b901561fb433ceceChris Lattner}
821