ScalarReplAggregates.cpp revision 800de31776356910eb877e71df9f32b0a6215324
1ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner//===- ScalarReplAggregates.cpp - Scalar Replacement of Aggregates --------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
9ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner//
10ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner// This transformation implements the well known scalar replacement of
11ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner// aggregates transformation.  This xform breaks up alloca instructions of
12ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner// aggregate type (structure or array) into individual alloca instructions for
1338aec325604635380421a27e39ab06d55ed2458dChris Lattner// each member (if possible).  Then, if possible, it transforms the individual
1438aec325604635380421a27e39ab06d55ed2458dChris Lattner// alloca instructions into nice clean scalar SSA form.
1538aec325604635380421a27e39ab06d55ed2458dChris Lattner//
1638aec325604635380421a27e39ab06d55ed2458dChris Lattner// This combines a simple SRoA algorithm with the Mem2Reg algorithm because
1738aec325604635380421a27e39ab06d55ed2458dChris Lattner// often interact, especially for C++ programs.  As such, iterating between
1838aec325604635380421a27e39ab06d55ed2458dChris Lattner// SRoA, then Mem2Reg until we run out of things to promote works well.
19ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner//
20ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner//===----------------------------------------------------------------------===//
21ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
220e5f499638c8d277b9dc4a4385712177c53b5681Chris Lattner#define DEBUG_TYPE "scalarrepl"
23ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner#include "llvm/Transforms/Scalar.h"
2438aec325604635380421a27e39ab06d55ed2458dChris Lattner#include "llvm/Constants.h"
2538aec325604635380421a27e39ab06d55ed2458dChris Lattner#include "llvm/DerivedTypes.h"
26ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner#include "llvm/Function.h"
2779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner#include "llvm/GlobalVariable.h"
28d8e1eea678833cc2b15e4ea69a5a403ba9c3b013Misha Brukman#include "llvm/Instructions.h"
29372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner#include "llvm/IntrinsicInst.h"
30372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner#include "llvm/Pass.h"
3138aec325604635380421a27e39ab06d55ed2458dChris Lattner#include "llvm/Analysis/Dominators.h"
3238aec325604635380421a27e39ab06d55ed2458dChris Lattner#include "llvm/Target/TargetData.h"
3338aec325604635380421a27e39ab06d55ed2458dChris Lattner#include "llvm/Transforms/Utils/PromoteMemToReg.h"
349525528a7dc5462b6374d38c81ba5c07b11741feChris Lattner#include "llvm/Support/Debug.h"
35a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner#include "llvm/Support/GetElementPtrTypeIterator.h"
36a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner#include "llvm/Support/MathExtras.h"
37a4f0b3a084d120cfc5b5bb06f64b222f5cb72740Chris Lattner#include "llvm/Support/Compiler.h"
381ccd185cb49d81465a2901622e58ceae046d1d83Chris Lattner#include "llvm/ADT/SmallVector.h"
39551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/Statistic.h"
40551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/StringExtras.h"
41d8664730942beb911327336d1f9db8e7efcd6813Chris Lattnerusing namespace llvm;
42d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
430e5f499638c8d277b9dc4a4385712177c53b5681Chris LattnerSTATISTIC(NumReplaced,  "Number of allocas broken up");
440e5f499638c8d277b9dc4a4385712177c53b5681Chris LattnerSTATISTIC(NumPromoted,  "Number of allocas promoted");
450e5f499638c8d277b9dc4a4385712177c53b5681Chris LattnerSTATISTIC(NumConverted, "Number of aggregates converted to scalar");
4679b3bd395dc3303cde65e18e0524ed2f70268c99Chris LattnerSTATISTIC(NumGlobals,   "Number of allocas copied from constant global");
47ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
480e5f499638c8d277b9dc4a4385712177c53b5681Chris Lattnernamespace {
499525528a7dc5462b6374d38c81ba5c07b11741feChris Lattner  struct VISIBILITY_HIDDEN SROA : public FunctionPass {
50ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky    static char ID; // Pass identification, replacement for typeid
51c2bbfc18e9adbbdcf5b3375d8d25e2452f7df7f1Dan Gohman    explicit SROA(signed T = -1) : FunctionPass((intptr_t)&ID) {
52ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel      if (T == -1)
53b0e71edb6b33f822e001500dac90acf95faacea8Chris Lattner        SRThreshold = 128;
54ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel      else
55ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel        SRThreshold = T;
56ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel    }
57794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel
58ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    bool runOnFunction(Function &F);
59ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
6038aec325604635380421a27e39ab06d55ed2458dChris Lattner    bool performScalarRepl(Function &F);
6138aec325604635380421a27e39ab06d55ed2458dChris Lattner    bool performPromotion(Function &F);
6238aec325604635380421a27e39ab06d55ed2458dChris Lattner
63a15854c9febcb60eb107048640b04abff8cc47e5Chris Lattner    // getAnalysisUsage - This pass does not require any passes, but we know it
64a15854c9febcb60eb107048640b04abff8cc47e5Chris Lattner    // will not alter the CFG, so say so.
65a15854c9febcb60eb107048640b04abff8cc47e5Chris Lattner    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
66326821ef12c911af1d785e305e81dc3c07e456a5Devang Patel      AU.addRequired<DominatorTree>();
6738aec325604635380421a27e39ab06d55ed2458dChris Lattner      AU.addRequired<DominanceFrontier>();
6838aec325604635380421a27e39ab06d55ed2458dChris Lattner      AU.addRequired<TargetData>();
69a15854c9febcb60eb107048640b04abff8cc47e5Chris Lattner      AU.setPreservesCFG();
70a15854c9febcb60eb107048640b04abff8cc47e5Chris Lattner    }
71a15854c9febcb60eb107048640b04abff8cc47e5Chris Lattner
72ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  private:
7339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    /// AllocaInfo - When analyzing uses of an alloca instruction, this captures
7439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    /// information about the uses.  All these fields are initialized to false
7539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    /// and set to true when something is learned.
7639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    struct AllocaInfo {
7739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// isUnsafe - This is set to true if the alloca cannot be SROA'd.
7839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool isUnsafe : 1;
7939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// needsCanon - This is set to true if there is some use of the alloca
8139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// that requires canonicalization.
8239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool needsCanon : 1;
8339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// isMemCpySrc - This is true if this aggregate is memcpy'd from.
8539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool isMemCpySrc : 1;
8639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8733b0b8d242de8d428f11e77ea734a08b47797216Zhou Sheng      /// isMemCpyDst - This is true if this aggregate is memcpy'd into.
8839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool isMemCpyDst : 1;
8939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
9039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      AllocaInfo()
9139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        : isUnsafe(false), needsCanon(false),
9239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          isMemCpySrc(false), isMemCpyDst(false) {}
9339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    };
9439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
95ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel    unsigned SRThreshold;
96ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel
9739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void MarkUnsafe(AllocaInfo &I) { I.isUnsafe = true; }
9839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
99f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    int isSafeAllocaToScalarRepl(AllocationInst *AI);
10039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
10139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
10239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                               AllocaInfo &Info);
10339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeElementUse(Value *Ptr, bool isFirstElt, AllocationInst *AI,
10439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                         AllocaInfo &Info);
10539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeMemIntrinsicOnAllocation(MemIntrinsic *MI, AllocationInst *AI,
10639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                        unsigned OpNo, AllocaInfo &Info);
10739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeUseOfBitCastedAllocation(BitCastInst *User, AllocationInst *AI,
10839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                        AllocaInfo &Info);
10939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
110a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    void DoScalarReplacement(AllocationInst *AI,
111a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                             std::vector<AllocationInst*> &WorkList);
112f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    void CanonicalizeAllocaUsers(AllocationInst *AI);
113ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    AllocaInst *AddNewAlloca(Function &F, const Type *Ty, AllocationInst *Base);
114a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1158bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    void RewriteBitCastUserOfAlloca(Instruction *BCInst, AllocationInst *AI,
116372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                    SmallVector<AllocaInst*, 32> &NewElts);
117372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
118a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    const Type *CanConvertToScalar(Value *V, bool &IsNotTrivial);
119a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    void ConvertToScalar(AllocationInst *AI, const Type *Ty);
120a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    void ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset);
121800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *ConvertUsesOfLoadToScalar(LoadInst *LI, AllocaInst *NewAI,
122800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     unsigned Offset);
123800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *ConvertUsesOfStoreToScalar(StoreInst *SI, AllocaInst *NewAI,
124800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      unsigned Offset);
12579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    static Instruction *isOnlyCopiedFromConstantGlobal(AllocationInst *AI);
126ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  };
127ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
1281997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel  char SROA::ID = 0;
1297f8897f22e88271cfa114998a4d6088e7c8e8e11Chris Lattner  RegisterPass<SROA> X("scalarrepl", "Scalar Replacement of Aggregates");
130ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner}
131ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
132d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke// Public interface to the ScalarReplAggregates pass
133ff366850aa9956e167e78d4f5b57aae10d8c5779Devang PatelFunctionPass *llvm::createScalarReplAggregatesPass(signed int Threshold) {
134ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel  return new SROA(Threshold);
135ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel}
136ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
137ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
138ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattnerbool SROA::runOnFunction(Function &F) {
139fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  bool Changed = performPromotion(F);
140fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  while (1) {
141fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    bool LocalChange = performScalarRepl(F);
142fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    if (!LocalChange) break;   // No need to repromote if no scalarrepl
143fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    Changed = true;
144fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    LocalChange = performPromotion(F);
145fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    if (!LocalChange) break;   // No need to re-scalarrepl if no promotion
146fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  }
14738aec325604635380421a27e39ab06d55ed2458dChris Lattner
14838aec325604635380421a27e39ab06d55ed2458dChris Lattner  return Changed;
14938aec325604635380421a27e39ab06d55ed2458dChris Lattner}
15038aec325604635380421a27e39ab06d55ed2458dChris Lattner
15138aec325604635380421a27e39ab06d55ed2458dChris Lattner
15238aec325604635380421a27e39ab06d55ed2458dChris Lattnerbool SROA::performPromotion(Function &F) {
15338aec325604635380421a27e39ab06d55ed2458dChris Lattner  std::vector<AllocaInst*> Allocas;
154326821ef12c911af1d785e305e81dc3c07e456a5Devang Patel  DominatorTree         &DT = getAnalysis<DominatorTree>();
15543f820d1f7638656be2158efac7dd8f5b08b8b77Chris Lattner  DominanceFrontier &DF = getAnalysis<DominanceFrontier>();
15638aec325604635380421a27e39ab06d55ed2458dChris Lattner
15702a3be020a6b4eedb4b489959997d23a22cdf22eChris Lattner  BasicBlock &BB = F.getEntryBlock();  // Get the entry node for the function
15838aec325604635380421a27e39ab06d55ed2458dChris Lattner
159fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  bool Changed = false;
160fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
16138aec325604635380421a27e39ab06d55ed2458dChris Lattner  while (1) {
16238aec325604635380421a27e39ab06d55ed2458dChris Lattner    Allocas.clear();
16338aec325604635380421a27e39ab06d55ed2458dChris Lattner
16438aec325604635380421a27e39ab06d55ed2458dChris Lattner    // Find allocas that are safe to promote, by looking at all instructions in
16538aec325604635380421a27e39ab06d55ed2458dChris Lattner    // the entry node
16638aec325604635380421a27e39ab06d55ed2458dChris Lattner    for (BasicBlock::iterator I = BB.begin(), E = --BB.end(); I != E; ++I)
16738aec325604635380421a27e39ab06d55ed2458dChris Lattner      if (AllocaInst *AI = dyn_cast<AllocaInst>(I))       // Is it an alloca?
16841968df51e11f581eb19c8f68a8cb2f4e8acc1c5Devang Patel        if (isAllocaPromotable(AI))
16938aec325604635380421a27e39ab06d55ed2458dChris Lattner          Allocas.push_back(AI);
17038aec325604635380421a27e39ab06d55ed2458dChris Lattner
17138aec325604635380421a27e39ab06d55ed2458dChris Lattner    if (Allocas.empty()) break;
17238aec325604635380421a27e39ab06d55ed2458dChris Lattner
173326821ef12c911af1d785e305e81dc3c07e456a5Devang Patel    PromoteMemToReg(Allocas, DT, DF);
17438aec325604635380421a27e39ab06d55ed2458dChris Lattner    NumPromoted += Allocas.size();
17538aec325604635380421a27e39ab06d55ed2458dChris Lattner    Changed = true;
17638aec325604635380421a27e39ab06d55ed2458dChris Lattner  }
17738aec325604635380421a27e39ab06d55ed2458dChris Lattner
17838aec325604635380421a27e39ab06d55ed2458dChris Lattner  return Changed;
17938aec325604635380421a27e39ab06d55ed2458dChris Lattner}
18038aec325604635380421a27e39ab06d55ed2458dChris Lattner
18138aec325604635380421a27e39ab06d55ed2458dChris Lattner// performScalarRepl - This algorithm is a simple worklist driven algorithm,
18238aec325604635380421a27e39ab06d55ed2458dChris Lattner// which runs on all of the malloc/alloca instructions in the function, removing
18338aec325604635380421a27e39ab06d55ed2458dChris Lattner// them if they are only used by getelementptr instructions.
18438aec325604635380421a27e39ab06d55ed2458dChris Lattner//
18538aec325604635380421a27e39ab06d55ed2458dChris Lattnerbool SROA::performScalarRepl(Function &F) {
186ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  std::vector<AllocationInst*> WorkList;
187ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
188ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  // Scan the entry basic block, adding any alloca's and mallocs to the worklist
18902a3be020a6b4eedb4b489959997d23a22cdf22eChris Lattner  BasicBlock &BB = F.getEntryBlock();
190ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I)
191ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    if (AllocationInst *A = dyn_cast<AllocationInst>(I))
192ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner      WorkList.push_back(A);
193ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
1947139406707eb3869183fd6a3329fe4a77d309692Chris Lattner  const TargetData &TD = getAnalysis<TargetData>();
1957139406707eb3869183fd6a3329fe4a77d309692Chris Lattner
196ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  // Process the worklist
197ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  bool Changed = false;
198ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  while (!WorkList.empty()) {
199ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    AllocationInst *AI = WorkList.back();
200ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    WorkList.pop_back();
201a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
202add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    // Handle dead allocas trivially.  These can be formed by SROA'ing arrays
203add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    // with unused elements.
204add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    if (AI->use_empty()) {
205add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner      AI->eraseFromParent();
206add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner      continue;
207add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    }
208add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner
209a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // If we can turn this aggregate value (potentially with casts) into a
210a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // simple scalar value that can be mem2reg'd into a register value.
211a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    bool IsNotTrivial = false;
212a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (const Type *ActualType = CanConvertToScalar(AI, IsNotTrivial))
213df4f226cdcbe853984ddda10aa0d53590d35b97eChris Lattner      if (IsNotTrivial && ActualType != Type::VoidTy) {
214a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        ConvertToScalar(AI, ActualType);
215a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        Changed = true;
216a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        continue;
217a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
218ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
21979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Check to see if we can perform the core SROA transformation.  We cannot
22079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // transform the allocation instruction if it is an array allocation
22179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // (allocations OF arrays are ok though), and an allocation of a scalar
22279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // value cannot be decomposed at all.
223a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (!AI->isArrayAllocation() &&
224a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        (isa<StructType>(AI->getAllocatedType()) ||
2257139406707eb3869183fd6a3329fe4a77d309692Chris Lattner         isa<ArrayType>(AI->getAllocatedType())) &&
2267139406707eb3869183fd6a3329fe4a77d309692Chris Lattner        AI->getAllocatedType()->isSized() &&
2273cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        TD.getABITypeSize(AI->getAllocatedType()) < SRThreshold) {
228a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // Check that all of the users of the allocation are capable of being
229a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // transformed.
230a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      switch (isSafeAllocaToScalarRepl(AI)) {
231a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      default: assert(0 && "Unexpected value!");
232a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 0:  // Not safe to scalar replace.
233a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        break;
234a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 1:  // Safe, but requires cleanup/canonicalizations first
235a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        CanonicalizeAllocaUsers(AI);
236a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        // FALL THROUGH.
237a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 3:  // Safe to scalar replace.
238a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        DoScalarReplacement(AI, WorkList);
239a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        Changed = true;
240a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        continue;
241a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      }
242f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
24379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
24479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Check to see if this allocation is only modified by a memcpy/memmove from
24579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // a constant global.  If this is the case, we can change all users to use
24679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // the constant global instead.  This is commonly produced by the CFE by
24779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
24879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // is only subsequently read.
24979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (Instruction *TheCopy = isOnlyCopiedFromConstantGlobal(AI)) {
25079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      DOUT << "Found alloca equal to global: " << *AI;
25179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      DOUT << "  memcpy = " << *TheCopy;
25279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      Constant *TheSrc = cast<Constant>(TheCopy->getOperand(2));
25379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      AI->replaceAllUsesWith(ConstantExpr::getBitCast(TheSrc, AI->getType()));
25479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      TheCopy->eraseFromParent();  // Don't mutate the global.
25579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      AI->eraseFromParent();
25679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      ++NumGlobals;
25779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      Changed = true;
25879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
25979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
260a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
261a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Otherwise, couldn't process this.
262a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  }
263ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
264a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  return Changed;
265a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner}
266fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
267a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner/// DoScalarReplacement - This alloca satisfied the isSafeAllocaToScalarRepl
268a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner/// predicate, do SROA now.
269a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattnervoid SROA::DoScalarReplacement(AllocationInst *AI,
270a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                               std::vector<AllocationInst*> &WorkList) {
27179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  DOUT << "Found inst to SROA: " << *AI;
272a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  SmallVector<AllocaInst*, 32> ElementAllocas;
273a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  if (const StructType *ST = dyn_cast<StructType>(AI->getAllocatedType())) {
274a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    ElementAllocas.reserve(ST->getNumContainedTypes());
275a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    for (unsigned i = 0, e = ST->getNumContainedTypes(); i != e; ++i) {
276a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      AllocaInst *NA = new AllocaInst(ST->getContainedType(i), 0,
277a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getAlignment(),
278a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getName() + "." + utostr(i), AI);
279a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      ElementAllocas.push_back(NA);
280a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      WorkList.push_back(NA);  // Add to worklist for recursive processing
281a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
282a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  } else {
283a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    const ArrayType *AT = cast<ArrayType>(AI->getAllocatedType());
284a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    ElementAllocas.reserve(AT->getNumElements());
285a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    const Type *ElTy = AT->getElementType();
286a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    for (unsigned i = 0, e = AT->getNumElements(); i != e; ++i) {
287a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      AllocaInst *NA = new AllocaInst(ElTy, 0, AI->getAlignment(),
288a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getName() + "." + utostr(i), AI);
289a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      ElementAllocas.push_back(NA);
290a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      WorkList.push_back(NA);  // Add to worklist for recursive processing
291ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    }
292a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  }
293fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
294a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // Now that we have created the alloca instructions that we want to use,
295a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // expand the getelementptr instructions to use them.
296a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  //
297a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  while (!AI->use_empty()) {
298a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    Instruction *User = cast<Instruction>(AI->use_back());
299a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (BitCastInst *BCInst = dyn_cast<BitCastInst>(User)) {
300a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RewriteBitCastUserOfAlloca(BCInst, AI, ElementAllocas);
301a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      BCInst->eraseFromParent();
302a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      continue;
303a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
304a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
305a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GetElementPtrInst *GEPI = cast<GetElementPtrInst>(User);
306a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // We now know that the GEP is of the form: GEP <ptr>, 0, <cst>
307a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    unsigned Idx =
308a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner       (unsigned)cast<ConstantInt>(GEPI->getOperand(2))->getZExtValue();
309a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
310a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    assert(Idx < ElementAllocas.size() && "Index out of range?");
311a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    AllocaInst *AllocaToUse = ElementAllocas[Idx];
312a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
313a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    Value *RepValue;
314a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (GEPI->getNumOperands() == 3) {
315a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // Do not insert a new getelementptr instruction with zero indices, only
316a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // to have it optimized out later.
317a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RepValue = AllocaToUse;
318a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    } else {
319a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // We are indexing deeply into the structure, so we still need a
320a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // getelement ptr instruction to finish the indexing.  This may be
321a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // expanded itself once the worklist is rerun.
322a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      //
323a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      SmallVector<Value*, 8> NewArgs;
324a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      NewArgs.push_back(Constant::getNullValue(Type::Int32Ty));
325a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      NewArgs.append(GEPI->op_begin()+3, GEPI->op_end());
326b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene      RepValue = new GetElementPtrInst(AllocaToUse, NewArgs.begin(),
327b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene                                       NewArgs.end(), "", GEPI);
328a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RepValue->takeName(GEPI);
329a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
330a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
331a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // If this GEP is to the start of the aggregate, check for memcpys.
332a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (Idx == 0) {
333a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      bool IsStartOfAggregateGEP = true;
334a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      for (unsigned i = 3, e = GEPI->getNumOperands(); i != e; ++i) {
335a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        if (!isa<ConstantInt>(GEPI->getOperand(i))) {
336a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          IsStartOfAggregateGEP = false;
337a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          break;
338a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        }
339a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        if (!cast<ConstantInt>(GEPI->getOperand(i))->isZero()) {
340a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          IsStartOfAggregateGEP = false;
341a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          break;
3428bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        }
3438bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      }
3448bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
345a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      if (IsStartOfAggregateGEP)
346a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        RewriteBitCastUserOfAlloca(GEPI, AI, ElementAllocas);
347ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    }
348a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
349ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
350a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Move all of the users over to the new GEP.
351a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GEPI->replaceAllUsesWith(RepValue);
352a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Delete the old GEP
353a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GEPI->eraseFromParent();
354ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  }
355ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
356a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // Finally, delete the Alloca instruction
357a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  AI->eraseFromParent();
358a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  NumReplaced++;
359ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner}
3605e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
3615e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
362f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// isSafeElementUse - Check to see if this use is an allowed use for a
3638bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// getelementptr instruction of an array aggregate allocation.  isFirstElt
3648bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// indicates whether Ptr is known to the start of the aggregate.
365f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner///
36639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeElementUse(Value *Ptr, bool isFirstElt, AllocationInst *AI,
36739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                            AllocaInfo &Info) {
368f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  for (Value::use_iterator I = Ptr->use_begin(), E = Ptr->use_end();
369f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner       I != E; ++I) {
370f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    Instruction *User = cast<Instruction>(*I);
371f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    switch (User->getOpcode()) {
372f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::Load:  break;
373f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::Store:
374f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      // Store is ok if storing INTO the pointer, not storing the pointer
37539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (User->getOperand(0) == Ptr) return MarkUnsafe(Info);
376f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      break;
377f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::GetElementPtr: {
378f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      GetElementPtrInst *GEP = cast<GetElementPtrInst>(User);
3798bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      bool AreAllZeroIndices = isFirstElt;
380f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      if (GEP->getNumOperands() > 1) {
3818bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        if (!isa<ConstantInt>(GEP->getOperand(1)) ||
3828bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            !cast<ConstantInt>(GEP->getOperand(1))->isZero())
38339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          // Using pointer arithmetic to navigate the array.
38439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return MarkUnsafe(Info);
3858bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
3868bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        if (AreAllZeroIndices) {
3878bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          for (unsigned i = 2, e = GEP->getNumOperands(); i != e; ++i) {
3888bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            if (!isa<ConstantInt>(GEP->getOperand(i)) ||
3898bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner                !cast<ConstantInt>(GEP->getOperand(i))->isZero()) {
3908bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner              AreAllZeroIndices = false;
3918bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner              break;
3928bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            }
3938bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          }
3948bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        }
395f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      }
39639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeElementUse(GEP, AreAllZeroIndices, AI, Info);
39739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (Info.isUnsafe) return;
398f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      break;
399f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
4008bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    case Instruction::BitCast:
40139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (isFirstElt) {
40239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        isSafeUseOfBitCastedAllocation(cast<BitCastInst>(User), AI, Info);
40339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (Info.isUnsafe) return;
4048bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        break;
40539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
4068bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      DOUT << "  Transformation preventing inst: " << *User;
40739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
4088bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    case Instruction::Call:
4098bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(User)) {
41039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (isFirstElt) {
41139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          isSafeMemIntrinsicOnAllocation(MI, AI, I.getOperandNo(), Info);
41239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          if (Info.isUnsafe) return;
4138bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          break;
41439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        }
4158bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      }
4168bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      DOUT << "  Transformation preventing inst: " << *User;
41739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
418f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    default:
419b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling      DOUT << "  Transformation preventing inst: " << *User;
42039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
421f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
422f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  }
42339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return;  // All users look ok :)
424f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner}
425f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner
426d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner/// AllUsersAreLoads - Return true if all users of this value are loads.
427d878ecd904e4469344a2274f9784422c2c68b81cChris Lattnerstatic bool AllUsersAreLoads(Value *Ptr) {
428d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  for (Value::use_iterator I = Ptr->use_begin(), E = Ptr->use_end();
429d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner       I != E; ++I)
430d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    if (cast<Instruction>(*I)->getOpcode() != Instruction::Load)
431d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      return false;
432fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  return true;
433d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner}
434d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
4355e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner/// isSafeUseOfAllocation - Check to see if this user is an allowed use for an
4365e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner/// aggregate allocation.
4375e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner///
43839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
43939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                 AllocaInfo &Info) {
440372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  if (BitCastInst *C = dyn_cast<BitCastInst>(User))
44139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return isSafeUseOfBitCastedAllocation(C, AI, Info);
44239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
44339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(User);
44439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (GEPI == 0)
44539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
446546fc40d69ce4051b48112aafedd1e41f4a13195Chris Lattner
447be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  gep_type_iterator I = gep_type_begin(GEPI), E = gep_type_end(GEPI);
448be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
44925de486263abc1882498a8701e3eb29ee0804c4eChris Lattner  // The GEP is not safe to transform if not of the form "GEP <ptr>, 0, <cst>".
450be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  if (I == E ||
45139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      I.getOperand() != Constant::getNullValue(I.getOperand()->getType())) {
45239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
45339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
454be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
455be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  ++I;
45639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (I == E) return MarkUnsafe(Info);  // ran out of GEP indices??
457546fc40d69ce4051b48112aafedd1e41f4a13195Chris Lattner
4588bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  bool IsAllZeroIndices = true;
4598bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
460be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // If this is a use of an array allocation, do a bit more checking for sanity.
461be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
462be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner    uint64_t NumElements = AT->getNumElements();
463d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
4648bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    if (ConstantInt *Idx = dyn_cast<ConstantInt>(I.getOperand())) {
4658bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      IsAllZeroIndices &= Idx->isZero();
4668bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
467d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // Check to make sure that index falls within the array.  If not,
468d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // something funny is going on, so we won't do the optimization.
469d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      //
4708bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      if (Idx->getZExtValue() >= NumElements)
47139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return MarkUnsafe(Info);
472fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
47325de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      // We cannot scalar repl this level of the array unless any array
47425de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      // sub-indices are in-range constants.  In particular, consider:
47525de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      // A[0][i].  We cannot know that the user isn't doing invalid things like
47625de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      // allowing i to index an out-of-range subscript that accesses A[1].
47725de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      //
47825de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      // Scalar replacing *just* the outer index of the array is probably not
47925de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      // going to be a win anyway, so just give up.
4809d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer      for (++I; I != E && (isa<ArrayType>(*I) || isa<VectorType>(*I)); ++I) {
481d92515034fc4157850b981f696702cc2f35733f0Chris Lattner        uint64_t NumElements;
482d92515034fc4157850b981f696702cc2f35733f0Chris Lattner        if (const ArrayType *SubArrayTy = dyn_cast<ArrayType>(*I))
483d92515034fc4157850b981f696702cc2f35733f0Chris Lattner          NumElements = SubArrayTy->getNumElements();
484d92515034fc4157850b981f696702cc2f35733f0Chris Lattner        else
4859d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer          NumElements = cast<VectorType>(*I)->getNumElements();
486d92515034fc4157850b981f696702cc2f35733f0Chris Lattner
4878bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        ConstantInt *IdxVal = dyn_cast<ConstantInt>(I.getOperand());
48839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (!IdxVal) return MarkUnsafe(Info);
4898bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        if (IdxVal->getZExtValue() >= NumElements)
49039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return MarkUnsafe(Info);
4918bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        IsAllZeroIndices &= IdxVal->isZero();
49225de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      }
49325de486263abc1882498a8701e3eb29ee0804c4eChris Lattner
494d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    } else {
4958bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      IsAllZeroIndices = 0;
4968bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
497d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // If this is an array index and the index is not constant, we cannot
498d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // promote... that is unless the array has exactly one or two elements in
499d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // it, in which case we CAN promote it, but we have to canonicalize this
500d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // out if this is the only problem.
50125de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      if ((NumElements == 1 || NumElements == 2) &&
50239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          AllUsersAreLoads(GEPI)) {
50339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        Info.needsCanon = true;
50439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return;  // Canonicalization required!
50539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
50639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
507d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    }
5085e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  }
509be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
510be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // If there are any non-simple uses of this getelementptr, make sure to reject
511be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // them.
51239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return isSafeElementUse(GEPI, IsAllZeroIndices, AI, Info);
5138bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner}
5148bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5158bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// isSafeMemIntrinsicOnAllocation - Return true if the specified memory
5168bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// intrinsic can be promoted by SROA.  At this point, we know that the operand
5178bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// of the memintrinsic is a pointer to the beginning of the allocation.
51839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeMemIntrinsicOnAllocation(MemIntrinsic *MI, AllocationInst *AI,
51939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                          unsigned OpNo, AllocaInfo &Info) {
5208bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // If not constant length, give up.
5218bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  ConstantInt *Length = dyn_cast<ConstantInt>(MI->getLength());
52239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (!Length) return MarkUnsafe(Info);
5238bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5248bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // If not the whole aggregate, give up.
5258bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  const TargetData &TD = getAnalysis<TargetData>();
5263cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands  if (Length->getZExtValue() !=
5273cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      TD.getABITypeSize(AI->getType()->getElementType()))
52839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
5298bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5308bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // We only know about memcpy/memset/memmove.
5318bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  if (!isa<MemCpyInst>(MI) && !isa<MemSetInst>(MI) && !isa<MemMoveInst>(MI))
53239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
53339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
53439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // Otherwise, we can transform it.  Determine whether this is a memcpy/set
53539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // into or out of the aggregate.
53639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (OpNo == 1)
53739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    Info.isMemCpyDst = true;
53839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  else {
53939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    assert(OpNo == 2);
54039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    Info.isMemCpySrc = true;
54139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
5425e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner}
5435e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
544372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner/// isSafeUseOfBitCastedAllocation - Return true if all users of this bitcast
545372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner/// are
54639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeUseOfBitCastedAllocation(BitCastInst *BC, AllocationInst *AI,
54739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                          AllocaInfo &Info) {
548372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  for (Value::use_iterator UI = BC->use_begin(), E = BC->use_end();
549372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner       UI != E; ++UI) {
550372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (BitCastInst *BCU = dyn_cast<BitCastInst>(UI)) {
55139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeUseOfBitCastedAllocation(BCU, AI, Info);
552372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(UI)) {
55339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeMemIntrinsicOnAllocation(MI, AI, UI.getOperandNo(), Info);
554372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else {
55539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
556372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
55739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (Info.isUnsafe) return;
558372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  }
559372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner}
560372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
5618bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// RewriteBitCastUserOfAlloca - BCInst (transitively) bitcasts AI, or indexes
5628bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// to its first element.  Transform users of the cast to use the new values
5638bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// instead.
5648bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattnervoid SROA::RewriteBitCastUserOfAlloca(Instruction *BCInst, AllocationInst *AI,
565372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                      SmallVector<AllocaInst*, 32> &NewElts) {
566372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  Constant *Zero = Constant::getNullValue(Type::Int32Ty);
567372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  const TargetData &TD = getAnalysis<TargetData>();
5688bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5698bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  Value::use_iterator UI = BCInst->use_begin(), UE = BCInst->use_end();
5708bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  while (UI != UE) {
5718bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    if (BitCastInst *BCU = dyn_cast<BitCastInst>(*UI)) {
572372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      RewriteBitCastUserOfAlloca(BCU, AI, NewElts);
5738bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      ++UI;
5748bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      BCU->eraseFromParent();
575372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      continue;
576372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
577372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
578372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // Otherwise, must be memcpy/memmove/memset of the entire aggregate.  Split
579372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // into one per element.
5808bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    MemIntrinsic *MI = dyn_cast<MemIntrinsic>(*UI);
5818bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5828bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    // If it's not a mem intrinsic, it must be some other user of a gep of the
5838bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    // first pointer.  Just leave these alone.
5848bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    if (!MI) {
5858bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      ++UI;
5868bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      continue;
5878bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    }
588372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
589372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // If this is a memcpy/memmove, construct the other pointer as the
590372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // appropriate type.
591372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    Value *OtherPtr = 0;
592372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(MI)) {
593372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (BCInst == MCI->getRawDest())
594372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MCI->getRawSource();
595372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      else {
596372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        assert(BCInst == MCI->getRawSource());
597372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MCI->getRawDest();
598372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
599372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else if (MemMoveInst *MMI = dyn_cast<MemMoveInst>(MI)) {
600372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (BCInst == MMI->getRawDest())
601372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MMI->getRawSource();
602372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      else {
603372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        assert(BCInst == MMI->getRawSource());
604372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MMI->getRawDest();
605372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
606372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
607372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
608372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // If there is an other pointer, we want to convert it to the same pointer
609372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // type as AI has, so we can GEP through it.
610372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (OtherPtr) {
611372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // It is likely that OtherPtr is a bitcast, if so, remove it.
612372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (BitCastInst *BC = dyn_cast<BitCastInst>(OtherPtr))
613372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = BC->getOperand(0);
614372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (ConstantExpr *BCE = dyn_cast<ConstantExpr>(OtherPtr))
615372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        if (BCE->getOpcode() == Instruction::BitCast)
616372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          OtherPtr = BCE->getOperand(0);
617372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
618372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // If the pointer is not the right type, insert a bitcast to the right
619372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // type.
620372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (OtherPtr->getType() != AI->getType())
621372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = new BitCastInst(OtherPtr, AI->getType(), OtherPtr->getName(),
622372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                   MI);
623372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
624372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
625372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // Process each element of the aggregate.
626372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    Value *TheFn = MI->getOperand(0);
627372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    const Type *BytePtrTy = MI->getRawDest()->getType();
628372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    bool SROADest = MI->getRawDest() == BCInst;
629372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
630372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    for (unsigned i = 0, e = NewElts.size(); i != e; ++i) {
631372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // If this is a memcpy/memmove, emit a GEP of the other element address.
632372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      Value *OtherElt = 0;
633372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (OtherPtr) {
634b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene        Value *Idx[2];
635b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene        Idx[0] = Zero;
636b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene        Idx[1] = ConstantInt::get(Type::Int32Ty, i);
637b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene        OtherElt = new GetElementPtrInst(OtherPtr, Idx, Idx + 2,
638372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                         OtherPtr->getNameStr()+"."+utostr(i),
639372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                         MI);
640372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
641372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
642372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      Value *EltPtr = NewElts[i];
643c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      const Type *EltTy =cast<PointerType>(EltPtr->getType())->getElementType();
644c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
645c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      // If we got down to a scalar, insert a load or store as appropriate.
646c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      if (EltTy->isFirstClassType()) {
647c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        if (isa<MemCpyInst>(MI) || isa<MemMoveInst>(MI)) {
648c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          Value *Elt = new LoadInst(SROADest ? OtherElt : EltPtr, "tmp",
649c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                                    MI);
650c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          new StoreInst(Elt, SROADest ? EltPtr : OtherElt, MI);
651c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          continue;
652c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        } else {
653c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          assert(isa<MemSetInst>(MI));
654c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
655c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // If the stored element is zero (common case), just store a null
656c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // constant.
657c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          Constant *StoreVal;
658c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          if (ConstantInt *CI = dyn_cast<ConstantInt>(MI->getOperand(2))) {
659c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            if (CI->isZero()) {
660c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              StoreVal = Constant::getNullValue(EltTy);  // 0.0, null, 0, <0,0>
661c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            } else {
66207a96765daedf180a7102d39fe56c499878312b7Dan Gohman              // If EltTy is a vector type, get the element type.
663c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              const Type *ValTy = EltTy;
664c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              if (const VectorType *VTy = dyn_cast<VectorType>(ValTy))
665c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                ValTy = VTy->getElementType();
6663cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
667c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // Construct an integer with the right value.
6683cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands              unsigned EltSize = TD.getTypeSizeInBits(ValTy);
6693cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands              APInt OneVal(EltSize, CI->getZExtValue());
670c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              APInt TotalVal(OneVal);
671c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // Set each byte.
6723cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands              for (unsigned i = 0; 8*i < EltSize; ++i) {
673c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                TotalVal = TotalVal.shl(8);
674c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                TotalVal |= OneVal;
675c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              }
6763cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
677c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // Convert the integer value to the appropriate type.
678c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              StoreVal = ConstantInt::get(TotalVal);
679c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              if (isa<PointerType>(ValTy))
680c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                StoreVal = ConstantExpr::getIntToPtr(StoreVal, ValTy);
681c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              else if (ValTy->isFloatingPoint())
682c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                StoreVal = ConstantExpr::getBitCast(StoreVal, ValTy);
683c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              assert(StoreVal->getType() == ValTy && "Type mismatch!");
684c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
685c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // If the requested value was a vector constant, create it.
686c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              if (EltTy != ValTy) {
687c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                unsigned NumElts = cast<VectorType>(ValTy)->getNumElements();
688c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                SmallVector<Constant*, 16> Elts(NumElts, StoreVal);
689c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                StoreVal = ConstantVector::get(&Elts[0], NumElts);
690c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              }
691c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            }
692c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            new StoreInst(StoreVal, EltPtr, MI);
693c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            continue;
694c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          }
695c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // Otherwise, if we're storing a byte variable, use a memset call for
696c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // this element.
697c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        }
698c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      }
699372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
700372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // Cast the element pointer to BytePtrTy.
701372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (EltPtr->getType() != BytePtrTy)
702372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        EltPtr = new BitCastInst(EltPtr, BytePtrTy, EltPtr->getNameStr(), MI);
703c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
704c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      // Cast the other pointer (if we have one) to BytePtrTy.
705c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      if (OtherElt && OtherElt->getType() != BytePtrTy)
706c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        OtherElt = new BitCastInst(OtherElt, BytePtrTy,OtherElt->getNameStr(),
707c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                                   MI);
708c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
7093cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned EltSize = TD.getABITypeSize(EltTy);
710c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
711372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // Finally, insert the meminst for this element.
712372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (isa<MemCpyInst>(MI) || isa<MemMoveInst>(MI)) {
713372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        Value *Ops[] = {
714372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          SROADest ? EltPtr : OtherElt,  // Dest ptr
715372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          SROADest ? OtherElt : EltPtr,  // Src ptr
716372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          ConstantInt::get(MI->getOperand(3)->getType(), EltSize), // Size
717372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          Zero  // Align
718372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        };
71952eec548206d0b135b55ba52dd0e82e978f15ae5David Greene        new CallInst(TheFn, Ops, Ops + 4, "", MI);
720c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      } else {
721c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        assert(isa<MemSetInst>(MI));
722372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        Value *Ops[] = {
723372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          EltPtr, MI->getOperand(2),  // Dest, Value,
724372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          ConstantInt::get(MI->getOperand(3)->getType(), EltSize), // Size
725372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          Zero  // Align
726372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        };
72752eec548206d0b135b55ba52dd0e82e978f15ae5David Greene        new CallInst(TheFn, Ops, Ops + 4, "", MI);
728372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
729c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner    }
730372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
731372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // Finally, MI is now dead, as we've modified its actions to occur on all of
732372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // the elements of the aggregate.
7338bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    ++UI;
734372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    MI->eraseFromParent();
735372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  }
736372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner}
737372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
7383cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// HasPadding - Return true if the specified type has any structure or
7393cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// alignment padding, false otherwise.
74018b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sandsstatic bool HasPadding(const Type *Ty, const TargetData &TD,
74118b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sands                       bool inPacked = false) {
74239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (const StructType *STy = dyn_cast<StructType>(Ty)) {
74339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    const StructLayout *SL = TD.getStructLayout(STy);
74439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    unsigned PrevFieldBitOffset = 0;
74539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
7463cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned FieldBitOffset = SL->getElementOffsetInBits(i);
7473cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
74839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // Padding in sub-elements?
74918b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sands      if (HasPadding(STy->getElementType(i), TD, STy->isPacked()))
75039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return true;
7513cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
75239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // Check to see if there is any padding between this element and the
75339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // previous one.
75439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (i) {
7553cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        unsigned PrevFieldEnd =
75639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        PrevFieldBitOffset+TD.getTypeSizeInBits(STy->getElementType(i-1));
75739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (PrevFieldEnd < FieldBitOffset)
75839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return true;
75939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
7603cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
76139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      PrevFieldBitOffset = FieldBitOffset;
76239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    }
7633cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
76439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    //  Check for tail padding.
76539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (unsigned EltCount = STy->getNumElements()) {
76639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      unsigned PrevFieldEnd = PrevFieldBitOffset +
76739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                   TD.getTypeSizeInBits(STy->getElementType(EltCount-1));
7683cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      if (PrevFieldEnd < SL->getSizeInBits())
76939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return true;
77039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    }
77139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
77239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
77318b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sands    return HasPadding(ATy->getElementType(), TD, false);
7743cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands  } else if (const VectorType *VTy = dyn_cast<VectorType>(Ty)) {
77518b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sands    return HasPadding(VTy->getElementType(), TD, false);
77639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
77718b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sands  return inPacked ?
77818b0ca854fbeebbc48cf1f4473daa428e68f748cDuncan Sands    false : TD.getTypeSizeInBits(Ty) != TD.getABITypeSizeInBits(Ty);
77939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner}
780372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
781f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// isSafeStructAllocaToScalarRepl - Check to see if the specified allocation of
782f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// an aggregate can be broken down into elements.  Return 0 if not, 3 if safe,
783f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// or 1 if safe after canonicalization has been performed.
7845e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner///
785f5990edc877c4e63503c589928a00ec6ec751830Chris Lattnerint SROA::isSafeAllocaToScalarRepl(AllocationInst *AI) {
7865e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  // Loop over the use list of the alloca.  We can only transform it if all of
7875e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  // the users are safe to transform.
78839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  AllocaInfo Info;
78939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
7905e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  for (Value::use_iterator I = AI->use_begin(), E = AI->use_end();
791f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner       I != E; ++I) {
79239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    isSafeUseOfAllocation(cast<Instruction>(*I), AI, Info);
79339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (Info.isUnsafe) {
794b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling      DOUT << "Cannot transform: " << *AI << "  due to user: " << **I;
795f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      return 0;
7965e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner    }
797f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  }
79839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
79939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // Okay, we know all the users are promotable.  If the aggregate is a memcpy
80039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // source and destination, we have to be careful.  In particular, the memcpy
80139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // could be moving around elements that live in structure padding of the LLVM
80239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // types, but may actually be used.  In these cases, we refuse to promote the
80339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // struct.
80439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (Info.isMemCpySrc && Info.isMemCpyDst &&
8053cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      HasPadding(AI->getType()->getElementType(), getAnalysis<TargetData>()))
80639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return 0;
8073cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
80839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // If we require cleanup, return 1, otherwise return 3.
80939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return Info.needsCanon ? 1 : 3;
810f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner}
811f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner
812f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// CanonicalizeAllocaUsers - If SROA reported that it can promote the specified
813f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// allocation, but only if cleaned up, perform the cleanups required.
814f5990edc877c4e63503c589928a00ec6ec751830Chris Lattnervoid SROA::CanonicalizeAllocaUsers(AllocationInst *AI) {
815d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // At this point, we know that the end result will be SROA'd and promoted, so
816d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // we can insert ugly code if required so long as sroa+mem2reg will clean it
817d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // up.
818d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end();
819d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner       UI != E; ) {
820a9d1a843fc74a9d877e105744e710496863f7580Chris Lattner    GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(*UI++);
821a9d1a843fc74a9d877e105744e710496863f7580Chris Lattner    if (!GEPI) continue;
82296326f9d312585532c95dcc31626f45f16cd5dd8Reid Spencer    gep_type_iterator I = gep_type_begin(GEPI);
823d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    ++I;
824d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
825d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
826d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      uint64_t NumElements = AT->getNumElements();
827fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
828d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      if (!isa<ConstantInt>(I.getOperand())) {
829d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        if (NumElements == 1) {
830c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          GEPI->setOperand(2, Constant::getNullValue(Type::Int32Ty));
831d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        } else {
832d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          assert(NumElements == 2 && "Unhandled case!");
833d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // All users of the GEP must be loads.  At each use of the GEP, insert
834d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // two loads of the appropriate indexed GEP and select between them.
835e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer          Value *IsOne = new ICmpInst(ICmpInst::ICMP_NE, I.getOperand(),
836d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner                              Constant::getNullValue(I.getOperand()->getType()),
837e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer             "isone", GEPI);
838d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // Insert the new GEP instructions, which are properly indexed.
8391ccd185cb49d81465a2901622e58ceae046d1d83Chris Lattner          SmallVector<Value*, 8> Indices(GEPI->op_begin()+1, GEPI->op_end());
840c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          Indices[1] = Constant::getNullValue(Type::Int32Ty);
8411ccd185cb49d81465a2901622e58ceae046d1d83Chris Lattner          Value *ZeroIdx = new GetElementPtrInst(GEPI->getOperand(0),
842b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene                                                 Indices.begin(),
843b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene                                                 Indices.end(),
844d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner                                                 GEPI->getName()+".0", GEPI);
845c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          Indices[1] = ConstantInt::get(Type::Int32Ty, 1);
8461ccd185cb49d81465a2901622e58ceae046d1d83Chris Lattner          Value *OneIdx = new GetElementPtrInst(GEPI->getOperand(0),
847b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene                                                Indices.begin(),
848b8f74793b9d161bc666fe27fc92fe112b6ec169bDavid Greene                                                Indices.end(),
849d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner                                                GEPI->getName()+".1", GEPI);
850d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // Replace all loads of the variable index GEP with loads from both
851d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // indexes and a select.
852d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          while (!GEPI->use_empty()) {
853d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LoadInst *LI = cast<LoadInst>(GEPI->use_back());
854d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *Zero = new LoadInst(ZeroIdx, LI->getName()+".0", LI);
855d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *One  = new LoadInst(OneIdx , LI->getName()+".1", LI);
856d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *R = new SelectInst(IsOne, One, Zero, LI->getName(), LI);
857d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LI->replaceAllUsesWith(R);
858d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LI->eraseFromParent();
859d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          }
860d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          GEPI->eraseFromParent();
861d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        }
862d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      }
863d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    }
864d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  }
8655e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner}
866a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
867a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// MergeInType - Add the 'In' type to the accumulated type so far.  If the
868a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// types are incompatible, return true, otherwise update Accum and return
869a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// false.
870de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///
871d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner/// There are three cases we handle here:
872d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   1) An effectively-integer union, where the pieces are stored into as
873de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///      smaller integers (common with byte swap and other idioms).
874d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   2) A union of vector types of the same size and potentially its elements.
875d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      Here we turn element accesses into insert/extract element operations.
876d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   3) A union of scalar types, such as int/float or int/pointer.  Here we
877d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      merge together into integers, allowing the xform to work with #1 as
878d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      well.
8795b121cc688eacf41b1b773244882d206199dc105Chris Lattnerstatic bool MergeInType(const Type *In, const Type *&Accum,
8805b121cc688eacf41b1b773244882d206199dc105Chris Lattner                        const TargetData &TD) {
881a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  // If this is our first type, just use it.
8829d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer  const VectorType *PTy;
883de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner  if (Accum == Type::VoidTy || In == Accum) {
884a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Accum = In;
885d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner  } else if (In == Type::VoidTy) {
886d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    // Noop.
88742a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner  } else if (In->isInteger() && Accum->isInteger()) {   // integer union.
888a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // Otherwise pick whichever type is larger.
889a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer    if (cast<IntegerType>(In)->getBitWidth() >
890a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer        cast<IntegerType>(Accum)->getBitWidth())
891a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      Accum = In;
8925b121cc688eacf41b1b773244882d206199dc105Chris Lattner  } else if (isa<PointerType>(In) && isa<PointerType>(Accum)) {
893c836333c3b0a18c398436ae00667a8fb5e476129Chris Lattner    // Pointer unions just stay as one of the pointers.
8949d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer  } else if (isa<VectorType>(In) || isa<VectorType>(Accum)) {
8959d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    if ((PTy = dyn_cast<VectorType>(Accum)) &&
896d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner        PTy->getElementType() == In) {
897d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Accum is a vector, and we are accessing an element: ok.
8989d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    } else if ((PTy = dyn_cast<VectorType>(In)) &&
899d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner               PTy->getElementType() == Accum) {
900d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // In is a vector, and accum is an element: ok, remember In.
901d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      Accum = In;
9029d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    } else if ((PTy = dyn_cast<VectorType>(In)) && isa<VectorType>(Accum) &&
9039d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer               PTy->getBitWidth() == cast<VectorType>(Accum)->getBitWidth()) {
904d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Two vectors of the same size: keep Accum.
905d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    } else {
906d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Cannot insert an short into a <4 x int> or handle
907d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // <2 x int> -> <4 x int>
908d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      return true;
909d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
91021c362d3240d0ba9ff98b7f36e54f25936d1a201Chris Lattner  } else {
911d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    // Pointer/FP/Integer unions merge together as integers.
912d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    switch (Accum->getTypeID()) {
913d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    case Type::PointerTyID: Accum = TD.getIntPtrType(); break;
914c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::FloatTyID:   Accum = Type::Int32Ty; break;
915c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::DoubleTyID:  Accum = Type::Int64Ty; break;
916ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::X86_FP80TyID:  return true;
917ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::FP128TyID: return true;
918ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::PPC_FP128TyID: return true;
919d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    default:
92042a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner      assert(Accum->isInteger() && "Unknown FP type!");
921d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      break;
922d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
923d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner
924d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    switch (In->getTypeID()) {
925d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    case Type::PointerTyID: In = TD.getIntPtrType(); break;
926c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::FloatTyID:   In = Type::Int32Ty; break;
927c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::DoubleTyID:  In = Type::Int64Ty; break;
928ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::X86_FP80TyID:  return true;
929ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::FP128TyID: return true;
930ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::PPC_FP128TyID: return true;
931d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    default:
93242a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner      assert(In->isInteger() && "Unknown FP type!");
933d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      break;
934d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
935d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    return MergeInType(In, Accum, TD);
936a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
937a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  return false;
938a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
939a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
9403cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// getUIntAtLeastAsBigAs - Return an unsigned integer type that is at least
941a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// as big as the specified type.  If there is no suitable type, this returns
942a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// null.
9433cb3650a278e37aa6378127c51e407d2823139b4Duncan Sandsconst Type *getUIntAtLeastAsBigAs(unsigned NumBits) {
944a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  if (NumBits > 64) return 0;
945c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 32) return Type::Int64Ty;
946c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 16) return Type::Int32Ty;
947c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 8) return Type::Int16Ty;
948c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  return Type::Int8Ty;
949a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
950a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
951a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// CanConvertToScalar - V is a pointer.  If we can convert the pointee to a
952a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// single scalar integer type, return that type.  Further, if the use is not
953a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// a completely trivial use that mem2reg could promote, set IsNotTrivial.  If
954a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// there are no uses of this pointer, return Type::VoidTy to differentiate from
955a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// failure.
956a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner///
957a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnerconst Type *SROA::CanConvertToScalar(Value *V, bool &IsNotTrivial) {
958a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const Type *UsedType = Type::VoidTy; // No uses, no forced type.
959a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const TargetData &TD = getAnalysis<TargetData>();
960a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const PointerType *PTy = cast<PointerType>(V->getType());
961a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
962a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
963a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Instruction *User = cast<Instruction>(*UI);
964a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
965a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
9665b121cc688eacf41b1b773244882d206199dc105Chris Lattner      if (MergeInType(LI->getType(), UsedType, TD))
967a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        return 0;
968a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
969a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
97024d6da5fedcf39891f7d8c5b031c01324b3db545Reid Spencer      // Storing the pointer, not into the value?
971a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (SI->getOperand(0) == V) return 0;
972a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
973de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner      // NOTE: We could handle storing of FP imms into integers here!
974a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
9755b121cc688eacf41b1b773244882d206199dc105Chris Lattner      if (MergeInType(SI->getOperand(0)->getType(), UsedType, TD))
976a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        return 0;
977d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    } else if (BitCastInst *CI = dyn_cast<BitCastInst>(User)) {
978a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      IsNotTrivial = true;
979a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const Type *SubTy = CanConvertToScalar(CI, IsNotTrivial);
9805b121cc688eacf41b1b773244882d206199dc105Chris Lattner      if (!SubTy || MergeInType(SubTy, UsedType, TD)) return 0;
981a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(User)) {
982a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Check to see if this is stepping over an element: GEP Ptr, int C
983a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (GEP->getNumOperands() == 2 && isa<ConstantInt>(GEP->getOperand(1))) {
984b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(1))->getZExtValue();
9853cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        unsigned ElSize = TD.getABITypeSize(PTy->getElementType());
986a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        unsigned BitOffset = Idx*ElSize*8;
987a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (BitOffset > 64 || !isPowerOf2_32(ElSize)) return 0;
988a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
989a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        IsNotTrivial = true;
990a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *SubElt = CanConvertToScalar(GEP, IsNotTrivial);
991a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (SubElt == 0) return 0;
99242a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner        if (SubElt != Type::VoidTy && SubElt->isInteger()) {
993a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          const Type *NewTy =
9943cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands            getUIntAtLeastAsBigAs(TD.getABITypeSizeInBits(SubElt)+BitOffset);
9955b121cc688eacf41b1b773244882d206199dc105Chris Lattner          if (NewTy == 0 || MergeInType(NewTy, UsedType, TD)) return 0;
996a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          continue;
997a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
998a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else if (GEP->getNumOperands() == 3 &&
999a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner                 isa<ConstantInt>(GEP->getOperand(1)) &&
1000a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner                 isa<ConstantInt>(GEP->getOperand(2)) &&
1001843f0767acd05baed952d39e77ea89b438430a4fZhou Sheng                 cast<ConstantInt>(GEP->getOperand(1))->isZero()) {
1002a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // We are stepping into an element, e.g. a structure or an array:
1003a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // GEP Ptr, int 0, uint C
1004a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *AggTy = PTy->getElementType();
1005b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(2))->getZExtValue();
1006a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1007a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (const ArrayType *ATy = dyn_cast<ArrayType>(AggTy)) {
1008a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          if (Idx >= ATy->getNumElements()) return 0;  // Out of range.
1009ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer        } else if (const VectorType *VectorTy = dyn_cast<VectorType>(AggTy)) {
101007a96765daedf180a7102d39fe56c499878312b7Dan Gohman          // Getting an element of the vector.
1011ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          if (Idx >= VectorTy->getNumElements()) return 0;  // Out of range.
1012de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1013ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          // Merge in the vector type.
1014ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          if (MergeInType(VectorTy, UsedType, TD)) return 0;
1015de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1016de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial);
1017de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          if (SubTy == 0) return 0;
1018de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
10195b121cc688eacf41b1b773244882d206199dc105Chris Lattner          if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType, TD))
1020de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner            return 0;
1021de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1022de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          // We'll need to change this to an insert/extract element operation.
1023de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          IsNotTrivial = true;
1024de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          continue;    // Everything looks ok
1025de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1026a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else if (isa<StructType>(AggTy)) {
1027a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          // Structs are always ok.
1028a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else {
1029a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          return 0;
1030a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
10313cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        const Type *NTy = getUIntAtLeastAsBigAs(TD.getABITypeSizeInBits(AggTy));
10325b121cc688eacf41b1b773244882d206199dc105Chris Lattner        if (NTy == 0 || MergeInType(NTy, UsedType, TD)) return 0;
1033a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial);
1034a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (SubTy == 0) return 0;
10355b121cc688eacf41b1b773244882d206199dc105Chris Lattner        if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType, TD))
1036a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          return 0;
1037a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        continue;    // Everything looks ok
1038a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
1039a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      return 0;
1040a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else {
1041a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Cannot handle this!
1042a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      return 0;
1043a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    }
1044a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
1045a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1046a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  return UsedType;
1047a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
1048a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1049a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// ConvertToScalar - The specified alloca passes the CanConvertToScalar
1050a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// predicate and is non-trivial.  Convert it to something that can be trivially
1051a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// promoted into a register by mem2reg.
1052a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnervoid SROA::ConvertToScalar(AllocationInst *AI, const Type *ActualTy) {
1053b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling  DOUT << "CONVERT TO SCALAR: " << *AI << "  TYPE = "
1054b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling       << *ActualTy << "\n";
1055a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  ++NumConverted;
1056a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1057a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  BasicBlock *EntryBlock = AI->getParent();
1058ecb7a77885b174cf4d001a9b48533b3979e7810dDan Gohman  assert(EntryBlock == &EntryBlock->getParent()->getEntryBlock() &&
1059a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner         "Not in the entry block!");
1060a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  EntryBlock->getInstList().remove(AI);  // Take the alloca out of the program.
1061a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1062a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  // Create and insert the alloca.
1063de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner  AllocaInst *NewAI = new AllocaInst(ActualTy, 0, AI->getName(),
1064de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner                                     EntryBlock->begin());
1065a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  ConvertUsesToScalar(AI, NewAI, 0);
1066a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  delete AI;
1067a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
1068a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1069a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1070a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// ConvertUsesToScalar - Convert all of the users of Ptr to use the new alloca
1071de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// directly.  This happens when we are converting an "integer union" to a
1072de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1073de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// vector with insert/extractelement instructions.
1074de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///
1075de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1076de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1077a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnervoid SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset) {
1078a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  while (!Ptr->use_empty()) {
1079a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Instruction *User = cast<Instruction>(Ptr->use_back());
1080a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1081a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
1082800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Value *NV = ConvertUsesOfLoadToScalar(LI, NewAI, Offset);
1083a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      LI->replaceAllUsesWith(NV);
1084a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      LI->eraseFromParent();
1085a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
1086a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      assert(SI->getOperand(0) != Ptr && "Consistency error!");
1087a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1088800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Value *SV = ConvertUsesOfStoreToScalar(SI, NewAI, Offset);
1089a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      new StoreInst(SV, NewAI, SI);
1090a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      SI->eraseFromParent();
1091a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1092f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner    } else if (BitCastInst *CI = dyn_cast<BitCastInst>(User)) {
1093b10e0da065fc2c18b5bee9011eb249e223a23108Chris Lattner      ConvertUsesToScalar(CI, NewAI, Offset);
1094a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      CI->eraseFromParent();
1095a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(User)) {
1096a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const PointerType *AggPtrTy =
1097a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        cast<PointerType>(GEP->getOperand(0)->getType());
1098a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const TargetData &TD = getAnalysis<TargetData>();
10993cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned AggSizeInBits =
11003cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        TD.getABITypeSizeInBits(AggPtrTy->getElementType());
11013cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
1102a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Check to see if this is stepping over an element: GEP Ptr, int C
1103a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      unsigned NewOffset = Offset;
1104a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (GEP->getNumOperands() == 2) {
1105b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(1))->getZExtValue();
1106a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        unsigned BitOffset = Idx*AggSizeInBits;
1107a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1108f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner        NewOffset += BitOffset;
1109a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else if (GEP->getNumOperands() == 3) {
1110a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // We know that operand #2 is zero.
1111b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(2))->getZExtValue();
1112a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *AggTy = AggPtrTy->getElementType();
1113a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (const SequentialType *SeqTy = dyn_cast<SequentialType>(AggTy)) {
11143cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands          unsigned ElSizeBits =
11153cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands            TD.getABITypeSizeInBits(SeqTy->getElementType());
1116a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1117f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner          NewOffset += ElSizeBits*Idx;
1118a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else if (const StructType *STy = dyn_cast<StructType>(AggTy)) {
1119b1919e2f08ecb37140af676fd2916f8d5ed7df3dChris Lattner          unsigned EltBitOffset =
11203cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands            TD.getStructLayout(STy)->getElementOffsetInBits(Idx);
1121a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1122f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner          NewOffset += EltBitOffset;
1123a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else {
1124a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          assert(0 && "Unsupported operation!");
1125a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          abort();
1126a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
1127a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else {
1128a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        assert(0 && "Unsupported operation!");
1129a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        abort();
1130a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
1131a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      ConvertUsesToScalar(GEP, NewAI, NewOffset);
1132a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      GEP->eraseFromParent();
1133a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else {
1134a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      assert(0 && "Unsupported operation!");
1135a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      abort();
1136a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    }
1137a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
1138a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
113979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
1140800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// ConvertUsesOfLoadToScalar - Convert all of the users the specified load to
1141800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// use the new alloca directly, returning the value that should replace the
1142800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// load.  This happens when we are converting an "integer union" to a
1143800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1144800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// vector with insert/extractelement instructions.
1145800de31776356910eb877e71df9f32b0a6215324Chris Lattner///
1146800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1147800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1148800de31776356910eb877e71df9f32b0a6215324Chris LattnerValue *SROA::ConvertUsesOfLoadToScalar(LoadInst *LI, AllocaInst *NewAI,
1149800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                       unsigned Offset) {
1150800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // The load is a bit extract from NewAI shifted right by Offset bits.
1151800de31776356910eb877e71df9f32b0a6215324Chris Lattner  Value *NV = new LoadInst(NewAI, LI->getName(), LI);
1152800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1153800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (NV->getType() == LI->getType() && Offset == 0) {
1154800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We win, no conversion needed.
1155800de31776356910eb877e71df9f32b0a6215324Chris Lattner    return NV;
1156800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
1157800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1158800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (const VectorType *PTy = dyn_cast<VectorType>(NV->getType())) {
1159800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result alloca is a vector type, this is either an element
1160800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // access or a bitcast to another vector type.
1161800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (isa<VectorType>(LI->getType())) {
1162800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = new BitCastInst(NV, LI->getType(), LI->getName(), LI);
1163800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1164800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // Must be an element access.
1165800de31776356910eb877e71df9f32b0a6215324Chris Lattner      const TargetData &TD = getAnalysis<TargetData>();
1166800de31776356910eb877e71df9f32b0a6215324Chris Lattner      unsigned Elt = Offset/TD.getABITypeSizeInBits(PTy->getElementType());
1167800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = new ExtractElementInst(NV, ConstantInt::get(Type::Int32Ty, Elt),
1168800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                  "tmp", LI);
1169800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1170800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (isa<PointerType>(NV->getType())) {
1171800de31776356910eb877e71df9f32b0a6215324Chris Lattner    assert(isa<PointerType>(LI->getType()));
1172800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Must be ptr->ptr cast.  Anything else would result in NV being
1173800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // an integer.
1174800de31776356910eb877e71df9f32b0a6215324Chris Lattner    NV = new BitCastInst(NV, LI->getType(), LI->getName(), LI);
1175800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else {
1176800de31776356910eb877e71df9f32b0a6215324Chris Lattner    const IntegerType *NTy = cast<IntegerType>(NV->getType());
1177800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1178800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If this is a big-endian system and the load is narrower than the
1179800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // full alloca type, we need to do a shift to get the right bits.
1180800de31776356910eb877e71df9f32b0a6215324Chris Lattner    int ShAmt = 0;
1181800de31776356910eb877e71df9f32b0a6215324Chris Lattner    const TargetData &TD = getAnalysis<TargetData>();
1182800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (TD.isBigEndian()) {
1183800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // On big-endian machines, the lowest bit is stored at the bit offset
1184800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // from the pointer given by getTypeStoreSizeInBits.  This matters for
1185800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // integers with a bitwidth that is not a multiple of 8.
1186800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = TD.getTypeStoreSizeInBits(NTy) -
1187800de31776356910eb877e71df9f32b0a6215324Chris Lattner      TD.getTypeStoreSizeInBits(LI->getType()) - Offset;
1188800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1189800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = Offset;
1190800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1191800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1192800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Note: we support negative bitwidths (with shl) which are not defined.
1193800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We do this to support (f.e.) loads off the end of a structure where
1194800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // only some bits are used.
1195800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (ShAmt > 0 && (unsigned)ShAmt < NTy->getBitWidth())
1196800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = BinaryOperator::createLShr(NV,
1197800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      ConstantInt::get(NV->getType(),ShAmt),
1198800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      LI->getName(), LI);
1199800de31776356910eb877e71df9f32b0a6215324Chris Lattner    else if (ShAmt < 0 && (unsigned)-ShAmt < NTy->getBitWidth())
1200800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = BinaryOperator::createShl(NV,
1201800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     ConstantInt::get(NV->getType(),-ShAmt),
1202800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     LI->getName(), LI);
1203800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1204800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Finally, unconditionally truncate the integer to the right width.
1205800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned LIBitWidth = TD.getTypeSizeInBits(LI->getType());
1206800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (LIBitWidth < NTy->getBitWidth())
1207800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = new TruncInst(NV, IntegerType::get(LIBitWidth),
1208800de31776356910eb877e71df9f32b0a6215324Chris Lattner                         LI->getName(), LI);
1209800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1210800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result is an integer, this is a trunc or bitcast.
1211800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (isa<IntegerType>(LI->getType())) {
1212800de31776356910eb877e71df9f32b0a6215324Chris Lattner      assert(NV->getType() == LI->getType() && "Truncate wasn't enough?");
1213800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else if (LI->getType()->isFloatingPoint()) {
1214800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // Just do a bitcast, we know the sizes match up.
1215800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = new BitCastInst(NV, LI->getType(), LI->getName(), LI);
1216800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1217800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // Otherwise must be a pointer.
1218800de31776356910eb877e71df9f32b0a6215324Chris Lattner      NV = new IntToPtrInst(NV, LI->getType(), LI->getName(), LI);
1219800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1220800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
1221800de31776356910eb877e71df9f32b0a6215324Chris Lattner  return NV;
1222800de31776356910eb877e71df9f32b0a6215324Chris Lattner}
1223800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1224800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1225800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// ConvertUsesOfStoreToScalar - Convert the specified store to a load+store
1226800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// pair of the new alloca directly, returning the value that should be stored
1227800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// to the alloca.  This happens when we are converting an "integer union" to a
1228800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1229800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// vector with insert/extractelement instructions.
1230800de31776356910eb877e71df9f32b0a6215324Chris Lattner///
1231800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1232800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1233800de31776356910eb877e71df9f32b0a6215324Chris LattnerValue *SROA::ConvertUsesOfStoreToScalar(StoreInst *SI, AllocaInst *NewAI,
1234800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                        unsigned Offset) {
1235800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1236800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // Convert the stored type to the actual type, shift it left to insert
1237800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // then 'or' into place.
1238800de31776356910eb877e71df9f32b0a6215324Chris Lattner  Value *SV = SI->getOperand(0);
1239800de31776356910eb877e71df9f32b0a6215324Chris Lattner  const Type *AllocaType = NewAI->getType()->getElementType();
1240800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (SV->getType() == AllocaType && Offset == 0) {
1241800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // All is well.
1242800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (const VectorType *PTy = dyn_cast<VectorType>(AllocaType)) {
1243800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI);
1244800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1245800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result alloca is a vector type, this is either an element
1246800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // access or a bitcast to another vector type.
1247800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (isa<VectorType>(SV->getType())) {
1248800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, AllocaType, SV->getName(), SI);
1249800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1250800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // Must be an element insertion.
1251800de31776356910eb877e71df9f32b0a6215324Chris Lattner      const TargetData &TD = getAnalysis<TargetData>();
1252800de31776356910eb877e71df9f32b0a6215324Chris Lattner      unsigned Elt = Offset/TD.getABITypeSizeInBits(PTy->getElementType());
1253800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new InsertElementInst(Old, SV,
1254800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                 ConstantInt::get(Type::Int32Ty, Elt),
1255800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                 "tmp", SI);
1256800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1257800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (isa<PointerType>(AllocaType)) {
1258800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the alloca type is a pointer, then all the elements must be
1259800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // pointers.
1260800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType() != AllocaType)
1261800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, AllocaType, SV->getName(), SI);
1262800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else {
1263800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI);
1264800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1265800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If SV is a float, convert it to the appropriate integer type.
1266800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If it is a pointer, do the same, and also handle ptr->ptr casts
1267800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // here.
1268800de31776356910eb877e71df9f32b0a6215324Chris Lattner    const TargetData &TD = getAnalysis<TargetData>();
1269800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned SrcWidth = TD.getTypeSizeInBits(SV->getType());
1270800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned DestWidth = TD.getTypeSizeInBits(AllocaType);
1271800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned SrcStoreWidth = TD.getTypeStoreSizeInBits(SV->getType());
1272800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned DestStoreWidth = TD.getTypeStoreSizeInBits(AllocaType);
1273800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType()->isFloatingPoint())
1274800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, IntegerType::get(SrcWidth),
1275800de31776356910eb877e71df9f32b0a6215324Chris Lattner                           SV->getName(), SI);
1276800de31776356910eb877e71df9f32b0a6215324Chris Lattner    else if (isa<PointerType>(SV->getType()))
1277800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new PtrToIntInst(SV, TD.getIntPtrType(), SV->getName(), SI);
1278800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1279800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Always zero extend the value if needed.
1280800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType() != AllocaType)
1281800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new ZExtInst(SV, AllocaType, SV->getName(), SI);
1282800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1283800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If this is a big-endian system and the store is narrower than the
1284800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // full alloca type, we need to do a shift to get the right bits.
1285800de31776356910eb877e71df9f32b0a6215324Chris Lattner    int ShAmt = 0;
1286800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (TD.isBigEndian()) {
1287800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // On big-endian machines, the lowest bit is stored at the bit offset
1288800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // from the pointer given by getTypeStoreSizeInBits.  This matters for
1289800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // integers with a bitwidth that is not a multiple of 8.
1290800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = DestStoreWidth - SrcStoreWidth - Offset;
1291800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1292800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = Offset;
1293800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1294800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1295800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Note: we support negative bitwidths (with shr) which are not defined.
1296800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We do this to support (f.e.) stores off the end of a structure where
1297800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // only some bits in the structure are set.
1298800de31776356910eb877e71df9f32b0a6215324Chris Lattner    APInt Mask(APInt::getLowBitsSet(DestWidth, SrcWidth));
1299800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (ShAmt > 0 && (unsigned)ShAmt < DestWidth) {
1300800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = BinaryOperator::createShl(SV,
1301800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     ConstantInt::get(SV->getType(), ShAmt),
1302800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     SV->getName(), SI);
1303800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Mask <<= ShAmt;
1304800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else if (ShAmt < 0 && (unsigned)-ShAmt < DestWidth) {
1305800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = BinaryOperator::createLShr(SV,
1306800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      ConstantInt::get(SV->getType(),-ShAmt),
1307800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      SV->getName(), SI);
1308800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Mask = Mask.lshr(ShAmt);
1309800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1310800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1311800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Mask out the bits we are about to insert from the old value, and or
1312800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // in the new bits.
1313800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SrcWidth != DestWidth) {
1314800de31776356910eb877e71df9f32b0a6215324Chris Lattner      assert(DestWidth > SrcWidth);
1315800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Old = BinaryOperator::createAnd(Old, ConstantInt::get(~Mask),
1316800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      Old->getName()+".mask", SI);
1317800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = BinaryOperator::createOr(Old, SV, SV->getName()+".ins", SI);
1318800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1319800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
1320800de31776356910eb877e71df9f32b0a6215324Chris Lattner  return SV;
1321800de31776356910eb877e71df9f32b0a6215324Chris Lattner}
1322800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1323800de31776356910eb877e71df9f32b0a6215324Chris Lattner
132479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
132579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// PointsToConstantGlobal - Return true if V (possibly indirectly) points to
132679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// some part of a constant global variable.  This intentionally only accepts
132779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// constant expressions because we don't can't rewrite arbitrary instructions.
132879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattnerstatic bool PointsToConstantGlobal(Value *V) {
132979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
133079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    return GV->isConstant();
133179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
133279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (CE->getOpcode() == Instruction::BitCast ||
133379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        CE->getOpcode() == Instruction::GetElementPtr)
133479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return PointsToConstantGlobal(CE->getOperand(0));
133579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return false;
133679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
133779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
133879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// isOnlyCopiedFromConstantGlobal - Recursively walk the uses of a (derived)
133979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// pointer to an alloca.  Ignore any reads of the pointer, return false if we
134079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// see any stores or other unknown uses.  If we see pointer arithmetic, keep
134179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// track of whether it moves the pointer (with isOffset) but otherwise traverse
134279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// the uses.  If we see a memcpy/memmove that targets an unoffseted pointer to
134379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// the alloca, and if the source pointer is a pointer to a constant  global, we
134479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// can optimize this.
134579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattnerstatic bool isOnlyCopiedFromConstantGlobal(Value *V, Instruction *&TheCopy,
134679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner                                           bool isOffset) {
134779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
134879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (isa<LoadInst>(*UI)) {
134979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // Ignore loads, they are always ok.
135079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
135179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
135279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (BitCastInst *BCI = dyn_cast<BitCastInst>(*UI)) {
135379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // If uses of the bitcast are ok, we are ok.
135479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      if (!isOnlyCopiedFromConstantGlobal(BCI, TheCopy, isOffset))
135579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        return false;
135679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
135779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
135879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(*UI)) {
135979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // If the GEP has all zero indices, it doesn't offset the pointer.  If it
136079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // doesn't, it does.
136179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      if (!isOnlyCopiedFromConstantGlobal(GEP, TheCopy,
136279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner                                         isOffset || !GEP->hasAllZeroIndices()))
136379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        return false;
136479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
136579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
136679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
136779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If this is isn't our memcpy/memmove, reject it as something we can't
136879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // handle.
136979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (!isa<MemCpyInst>(*UI) && !isa<MemMoveInst>(*UI))
137079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return false;
137179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
137279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If we already have seen a copy, reject the second one.
137379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (TheCopy) return false;
137479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
137579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the pointer has been offset from the start of the alloca, we can't
137679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // safely handle this.
137779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (isOffset) return false;
137879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
137979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the memintrinsic isn't using the alloca as the dest, reject it.
138079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (UI.getOperandNo() != 1) return false;
138179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
138279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    MemIntrinsic *MI = cast<MemIntrinsic>(*UI);
138379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
138479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the source of the memcpy/move is not a constant global, reject it.
138579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (!PointsToConstantGlobal(MI->getOperand(2)))
138679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return false;
138779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
138879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Otherwise, the transform is safe.  Remember the copy instruction.
138979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    TheCopy = MI;
139079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  }
139179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return true;
139279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
139379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
139479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// isOnlyCopiedFromConstantGlobal - Return true if the specified alloca is only
139579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// modified by a copy from a constant global.  If we can prove this, we can
139679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// replace any uses of the alloca with uses of the global directly.
139779b3bd395dc3303cde65e18e0524ed2f70268c99Chris LattnerInstruction *SROA::isOnlyCopiedFromConstantGlobal(AllocationInst *AI) {
139879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  Instruction *TheCopy = 0;
139979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (::isOnlyCopiedFromConstantGlobal(AI, TheCopy, false))
140079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    return TheCopy;
140179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return 0;
140279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
1403