ScalarReplAggregates.cpp revision 88e6dc8bf14e8a98888f62173a6581386b8d29a0
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}
128ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
129844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar SROA::ID = 0;
130844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<SROA> X("scalarrepl", "Scalar Replacement of Aggregates");
131844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
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
181963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner/// getNumSAElements - Return the number of elements in the specific struct or
182963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner/// array.
183963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattnerstatic uint64_t getNumSAElements(const Type *T) {
184963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner  if (const StructType *ST = dyn_cast<StructType>(T))
185963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner    return ST->getNumElements();
186963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner  return cast<ArrayType>(T)->getNumElements();
187963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner}
188963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner
18938aec325604635380421a27e39ab06d55ed2458dChris Lattner// performScalarRepl - This algorithm is a simple worklist driven algorithm,
19038aec325604635380421a27e39ab06d55ed2458dChris Lattner// which runs on all of the malloc/alloca instructions in the function, removing
19138aec325604635380421a27e39ab06d55ed2458dChris Lattner// them if they are only used by getelementptr instructions.
19238aec325604635380421a27e39ab06d55ed2458dChris Lattner//
19338aec325604635380421a27e39ab06d55ed2458dChris Lattnerbool SROA::performScalarRepl(Function &F) {
194ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  std::vector<AllocationInst*> WorkList;
195ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
196ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  // Scan the entry basic block, adding any alloca's and mallocs to the worklist
19702a3be020a6b4eedb4b489959997d23a22cdf22eChris Lattner  BasicBlock &BB = F.getEntryBlock();
198ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I)
199ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    if (AllocationInst *A = dyn_cast<AllocationInst>(I))
200ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner      WorkList.push_back(A);
201ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
2027139406707eb3869183fd6a3329fe4a77d309692Chris Lattner  const TargetData &TD = getAnalysis<TargetData>();
2037139406707eb3869183fd6a3329fe4a77d309692Chris Lattner
204ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  // Process the worklist
205ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  bool Changed = false;
206ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  while (!WorkList.empty()) {
207ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    AllocationInst *AI = WorkList.back();
208ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    WorkList.pop_back();
209a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
210add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    // Handle dead allocas trivially.  These can be formed by SROA'ing arrays
211add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    // with unused elements.
212add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    if (AI->use_empty()) {
213add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner      AI->eraseFromParent();
214add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner      continue;
215add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    }
216add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner
217a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // If we can turn this aggregate value (potentially with casts) into a
218a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // simple scalar value that can be mem2reg'd into a register value.
219a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    bool IsNotTrivial = false;
220a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (const Type *ActualType = CanConvertToScalar(AI, IsNotTrivial))
221df4f226cdcbe853984ddda10aa0d53590d35b97eChris Lattner      if (IsNotTrivial && ActualType != Type::VoidTy) {
222a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        ConvertToScalar(AI, ActualType);
223a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        Changed = true;
224a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        continue;
225a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
226ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
22779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Check to see if we can perform the core SROA transformation.  We cannot
22879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // transform the allocation instruction if it is an array allocation
22979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // (allocations OF arrays are ok though), and an allocation of a scalar
23079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // value cannot be decomposed at all.
231a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (!AI->isArrayAllocation() &&
232a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        (isa<StructType>(AI->getAllocatedType()) ||
2337139406707eb3869183fd6a3329fe4a77d309692Chris Lattner         isa<ArrayType>(AI->getAllocatedType())) &&
2347139406707eb3869183fd6a3329fe4a77d309692Chris Lattner        AI->getAllocatedType()->isSized() &&
235963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        // Do not promote any struct whose size is larger than "128" bytes.
236963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        TD.getABITypeSize(AI->getAllocatedType()) < SRThreshold &&
237963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        // Do not promote any struct into more than "32" separate vars.
238963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        getNumSAElements(AI->getAllocatedType()) < SRThreshold/4) {
239a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // Check that all of the users of the allocation are capable of being
240a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // transformed.
241a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      switch (isSafeAllocaToScalarRepl(AI)) {
242a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      default: assert(0 && "Unexpected value!");
243a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 0:  // Not safe to scalar replace.
244a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        break;
245a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 1:  // Safe, but requires cleanup/canonicalizations first
246a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        CanonicalizeAllocaUsers(AI);
247a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        // FALL THROUGH.
248a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 3:  // Safe to scalar replace.
249a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        DoScalarReplacement(AI, WorkList);
250a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        Changed = true;
251a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        continue;
252a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      }
253f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
25479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
25579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Check to see if this allocation is only modified by a memcpy/memmove from
25679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // a constant global.  If this is the case, we can change all users to use
25779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // the constant global instead.  This is commonly produced by the CFE by
25879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
25979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // is only subsequently read.
26079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (Instruction *TheCopy = isOnlyCopiedFromConstantGlobal(AI)) {
26179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      DOUT << "Found alloca equal to global: " << *AI;
26279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      DOUT << "  memcpy = " << *TheCopy;
26379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      Constant *TheSrc = cast<Constant>(TheCopy->getOperand(2));
26479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      AI->replaceAllUsesWith(ConstantExpr::getBitCast(TheSrc, AI->getType()));
26579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      TheCopy->eraseFromParent();  // Don't mutate the global.
26679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      AI->eraseFromParent();
26779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      ++NumGlobals;
26879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      Changed = true;
26979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
27079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
271a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
272a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Otherwise, couldn't process this.
273a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  }
274ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
275a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  return Changed;
276a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner}
277fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
278a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner/// DoScalarReplacement - This alloca satisfied the isSafeAllocaToScalarRepl
279a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner/// predicate, do SROA now.
280a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattnervoid SROA::DoScalarReplacement(AllocationInst *AI,
281a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                               std::vector<AllocationInst*> &WorkList) {
28279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  DOUT << "Found inst to SROA: " << *AI;
283a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  SmallVector<AllocaInst*, 32> ElementAllocas;
284a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  if (const StructType *ST = dyn_cast<StructType>(AI->getAllocatedType())) {
285a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    ElementAllocas.reserve(ST->getNumContainedTypes());
286a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    for (unsigned i = 0, e = ST->getNumContainedTypes(); i != e; ++i) {
287a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      AllocaInst *NA = new AllocaInst(ST->getContainedType(i), 0,
288a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getAlignment(),
289a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getName() + "." + utostr(i), AI);
290a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      ElementAllocas.push_back(NA);
291a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      WorkList.push_back(NA);  // Add to worklist for recursive processing
292a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
293a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  } else {
294a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    const ArrayType *AT = cast<ArrayType>(AI->getAllocatedType());
295a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    ElementAllocas.reserve(AT->getNumElements());
296a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    const Type *ElTy = AT->getElementType();
297a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    for (unsigned i = 0, e = AT->getNumElements(); i != e; ++i) {
298a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      AllocaInst *NA = new AllocaInst(ElTy, 0, AI->getAlignment(),
299a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getName() + "." + utostr(i), AI);
300a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      ElementAllocas.push_back(NA);
301a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      WorkList.push_back(NA);  // Add to worklist for recursive processing
302ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    }
303a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  }
304fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
305a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // Now that we have created the alloca instructions that we want to use,
306a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // expand the getelementptr instructions to use them.
307a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  //
308a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  while (!AI->use_empty()) {
309a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    Instruction *User = cast<Instruction>(AI->use_back());
310a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (BitCastInst *BCInst = dyn_cast<BitCastInst>(User)) {
311a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RewriteBitCastUserOfAlloca(BCInst, AI, ElementAllocas);
312a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      BCInst->eraseFromParent();
313a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      continue;
314a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
315a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
3162a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // Replace:
3172a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %res = load { i32, i32 }* %alloc
3182a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // with:
3192a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %load.0 = load i32* %alloc.0
3202a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %insert.0 insertvalue { i32, i32 } zeroinitializer, i32 %load.0, 0
3212a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %load.1 = load i32* %alloc.1
3222a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %insert = insertvalue { i32, i32 } %insert.0, i32 %load.1, 1
32302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    // (Also works for arrays instead of structs)
32402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
32502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      Value *Insert = UndefValue::get(LI->getType());
32602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      for (unsigned i = 0, e = ElementAllocas.size(); i != e; ++i) {
32702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        Value *Load = new LoadInst(ElementAllocas[i], "load", LI);
32802518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        Insert = InsertValueInst::Create(Insert, Load, i, "insert", LI);
32902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      }
33002518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      LI->replaceAllUsesWith(Insert);
33102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      LI->eraseFromParent();
33202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      continue;
33302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    }
33402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
3352a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // Replace:
3362a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   store { i32, i32 } %val, { i32, i32 }* %alloc
3372a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // with:
3382a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %val.0 = extractvalue { i32, i32 } %val, 0
3392a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   store i32 %val.0, i32* %alloc.0
3402a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %val.1 = extractvalue { i32, i32 } %val, 1
3412a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   store i32 %val.1, i32* %alloc.1
34202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    // (Also works for arrays instead of structs)
34302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
34402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      Value *Val = SI->getOperand(0);
34502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      for (unsigned i = 0, e = ElementAllocas.size(); i != e; ++i) {
34602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        Value *Extract = ExtractValueInst::Create(Val, i, Val->getName(), SI);
34702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        new StoreInst(Extract, ElementAllocas[i], SI);
34802518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      }
34902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      SI->eraseFromParent();
35002518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      continue;
35102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    }
35202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
353a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GetElementPtrInst *GEPI = cast<GetElementPtrInst>(User);
354a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // We now know that the GEP is of the form: GEP <ptr>, 0, <cst>
355a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    unsigned Idx =
356a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner       (unsigned)cast<ConstantInt>(GEPI->getOperand(2))->getZExtValue();
357a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
358a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    assert(Idx < ElementAllocas.size() && "Index out of range?");
359a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    AllocaInst *AllocaToUse = ElementAllocas[Idx];
360a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
361a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    Value *RepValue;
362a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (GEPI->getNumOperands() == 3) {
363a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // Do not insert a new getelementptr instruction with zero indices, only
364a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // to have it optimized out later.
365a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RepValue = AllocaToUse;
366a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    } else {
367a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // We are indexing deeply into the structure, so we still need a
368a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // getelement ptr instruction to finish the indexing.  This may be
369a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // expanded itself once the worklist is rerun.
370a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      //
371a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      SmallVector<Value*, 8> NewArgs;
372a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      NewArgs.push_back(Constant::getNullValue(Type::Int32Ty));
373a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      NewArgs.append(GEPI->op_begin()+3, GEPI->op_end());
374051a950000e21935165db56695e35bade668193bGabor Greif      RepValue = GetElementPtrInst::Create(AllocaToUse, NewArgs.begin(),
375051a950000e21935165db56695e35bade668193bGabor Greif                                           NewArgs.end(), "", GEPI);
376a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RepValue->takeName(GEPI);
377a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
378a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
379a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // If this GEP is to the start of the aggregate, check for memcpys.
380a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (Idx == 0) {
381a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      bool IsStartOfAggregateGEP = true;
382a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      for (unsigned i = 3, e = GEPI->getNumOperands(); i != e; ++i) {
383a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        if (!isa<ConstantInt>(GEPI->getOperand(i))) {
384a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          IsStartOfAggregateGEP = false;
385a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          break;
386a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        }
387a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        if (!cast<ConstantInt>(GEPI->getOperand(i))->isZero()) {
388a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          IsStartOfAggregateGEP = false;
389a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner          break;
3908bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        }
3918bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      }
3928bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
393a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      if (IsStartOfAggregateGEP)
394a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        RewriteBitCastUserOfAlloca(GEPI, AI, ElementAllocas);
395ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    }
396a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
397ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
398a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Move all of the users over to the new GEP.
399a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GEPI->replaceAllUsesWith(RepValue);
400a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Delete the old GEP
401a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GEPI->eraseFromParent();
402ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  }
403ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
404a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // Finally, delete the Alloca instruction
405a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  AI->eraseFromParent();
406a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  NumReplaced++;
407ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner}
4085e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
4095e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
410f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// isSafeElementUse - Check to see if this use is an allowed use for a
4118bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// getelementptr instruction of an array aggregate allocation.  isFirstElt
4128bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// indicates whether Ptr is known to the start of the aggregate.
413f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner///
41439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeElementUse(Value *Ptr, bool isFirstElt, AllocationInst *AI,
41539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                            AllocaInfo &Info) {
416f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  for (Value::use_iterator I = Ptr->use_begin(), E = Ptr->use_end();
417f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner       I != E; ++I) {
418f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    Instruction *User = cast<Instruction>(*I);
419f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    switch (User->getOpcode()) {
420f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::Load:  break;
421f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::Store:
422f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      // Store is ok if storing INTO the pointer, not storing the pointer
42339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (User->getOperand(0) == Ptr) return MarkUnsafe(Info);
424f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      break;
425f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::GetElementPtr: {
426f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      GetElementPtrInst *GEP = cast<GetElementPtrInst>(User);
4278bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      bool AreAllZeroIndices = isFirstElt;
428f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      if (GEP->getNumOperands() > 1) {
4298bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        if (!isa<ConstantInt>(GEP->getOperand(1)) ||
4308bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            !cast<ConstantInt>(GEP->getOperand(1))->isZero())
43139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          // Using pointer arithmetic to navigate the array.
43239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return MarkUnsafe(Info);
4338bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
4348bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        if (AreAllZeroIndices) {
4358bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          for (unsigned i = 2, e = GEP->getNumOperands(); i != e; ++i) {
4368bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            if (!isa<ConstantInt>(GEP->getOperand(i)) ||
4378bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner                !cast<ConstantInt>(GEP->getOperand(i))->isZero()) {
4388bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner              AreAllZeroIndices = false;
4398bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner              break;
4408bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            }
4418bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          }
4428bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        }
443f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      }
44439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeElementUse(GEP, AreAllZeroIndices, AI, Info);
44539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (Info.isUnsafe) return;
446f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      break;
447f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
4488bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    case Instruction::BitCast:
44939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (isFirstElt) {
45039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        isSafeUseOfBitCastedAllocation(cast<BitCastInst>(User), AI, Info);
45139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (Info.isUnsafe) return;
4528bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        break;
45339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
4548bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      DOUT << "  Transformation preventing inst: " << *User;
45539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
4568bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    case Instruction::Call:
4578bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(User)) {
45839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (isFirstElt) {
45939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          isSafeMemIntrinsicOnAllocation(MI, AI, I.getOperandNo(), Info);
46039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          if (Info.isUnsafe) return;
4618bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          break;
46239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        }
4638bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      }
4648bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      DOUT << "  Transformation preventing inst: " << *User;
46539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
466f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    default:
467b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling      DOUT << "  Transformation preventing inst: " << *User;
46839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
469f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
470f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  }
47139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return;  // All users look ok :)
472f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner}
473f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner
474d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner/// AllUsersAreLoads - Return true if all users of this value are loads.
475d878ecd904e4469344a2274f9784422c2c68b81cChris Lattnerstatic bool AllUsersAreLoads(Value *Ptr) {
476d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  for (Value::use_iterator I = Ptr->use_begin(), E = Ptr->use_end();
477d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner       I != E; ++I)
478d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    if (cast<Instruction>(*I)->getOpcode() != Instruction::Load)
479d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      return false;
480fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  return true;
481d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner}
482d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
4835e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner/// isSafeUseOfAllocation - Check to see if this user is an allowed use for an
4845e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner/// aggregate allocation.
4855e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner///
48639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
48739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                 AllocaInfo &Info) {
488372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  if (BitCastInst *C = dyn_cast<BitCastInst>(User))
48939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return isSafeUseOfBitCastedAllocation(C, AI, Info);
49039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
49102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman  if (isa<LoadInst>(User))
49202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    return; // Loads (returning a first class aggregrate) are always rewritable
49302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
49402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman  if (isa<StoreInst>(User) && User->getOperand(0) != AI)
49502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    return; // Store is ok if storing INTO the pointer, not storing the pointer
49602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
49739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(User);
49839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (GEPI == 0)
49939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
500546fc40d69ce4051b48112aafedd1e41f4a13195Chris Lattner
501be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  gep_type_iterator I = gep_type_begin(GEPI), E = gep_type_end(GEPI);
502be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
50325de486263abc1882498a8701e3eb29ee0804c4eChris Lattner  // The GEP is not safe to transform if not of the form "GEP <ptr>, 0, <cst>".
504be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  if (I == E ||
50539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      I.getOperand() != Constant::getNullValue(I.getOperand()->getType())) {
50639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
50739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
508be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
509be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  ++I;
51039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (I == E) return MarkUnsafe(Info);  // ran out of GEP indices??
511546fc40d69ce4051b48112aafedd1e41f4a13195Chris Lattner
5128bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  bool IsAllZeroIndices = true;
5138bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
51488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // If the first index is a non-constant index into an array, see if we can
51588e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // handle it as a special case.
516be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
51788e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (!isa<ConstantInt>(I.getOperand())) {
5188bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      IsAllZeroIndices = 0;
51988e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner      uint64_t NumElements = AT->getNumElements();
5208bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
521d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // If this is an array index and the index is not constant, we cannot
522d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // promote... that is unless the array has exactly one or two elements in
523d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // it, in which case we CAN promote it, but we have to canonicalize this
524d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // out if this is the only problem.
52525de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      if ((NumElements == 1 || NumElements == 2) &&
52639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          AllUsersAreLoads(GEPI)) {
52739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        Info.needsCanon = true;
52839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return;  // Canonicalization required!
52939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
53039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
531d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    }
5325e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  }
53388e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
53488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
53588e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // Walk through the GEP type indices, checking the types that this indexes
53688e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // into.
53788e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  for (; I != E; ++I) {
53888e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // Ignore struct elements, no extra checking needed for these.
53988e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (isa<StructType>(*I))
54088e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner      continue;
54188e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
54288e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // Don't SROA pointers into vectors.
54388e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (isa<VectorType>(*I))
54488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner      return MarkUnsafe(Info);
54588e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
54688e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // Otherwise, we must have an index into an array type.  Verify that this is
54788e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // an in-range constant integer.  Specifically, consider A[0][i].  We
54888e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // cannot know that the user isn't doing invalid things like allowing i to
54988e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // index an out-of-range subscript that accesses A[1].  Because of this, we
55088e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // have to reject SROA of any accesses into structs where any of the
55188e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // components are variables.
55288e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    ConstantInt *IdxVal = dyn_cast<ConstantInt>(I.getOperand());
55388e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (!IdxVal) return MarkUnsafe(Info);
55488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (IdxVal->getZExtValue() >= cast<ArrayType>(*I)->getNumElements())
55588e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner      return MarkUnsafe(Info);
55688e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
55788e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    IsAllZeroIndices &= IdxVal->isZero();
55888e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  }
55988e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
560be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // If there are any non-simple uses of this getelementptr, make sure to reject
561be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // them.
56239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return isSafeElementUse(GEPI, IsAllZeroIndices, AI, Info);
5638bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner}
5648bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5658bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// isSafeMemIntrinsicOnAllocation - Return true if the specified memory
5668bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// intrinsic can be promoted by SROA.  At this point, we know that the operand
5678bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// of the memintrinsic is a pointer to the beginning of the allocation.
56839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeMemIntrinsicOnAllocation(MemIntrinsic *MI, AllocationInst *AI,
56939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                          unsigned OpNo, AllocaInfo &Info) {
5708bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // If not constant length, give up.
5718bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  ConstantInt *Length = dyn_cast<ConstantInt>(MI->getLength());
57239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (!Length) return MarkUnsafe(Info);
5738bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5748bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // If not the whole aggregate, give up.
5758bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  const TargetData &TD = getAnalysis<TargetData>();
5763cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands  if (Length->getZExtValue() !=
5773cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      TD.getABITypeSize(AI->getType()->getElementType()))
57839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
5798bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5808bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // We only know about memcpy/memset/memmove.
5818bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  if (!isa<MemCpyInst>(MI) && !isa<MemSetInst>(MI) && !isa<MemMoveInst>(MI))
58239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
58339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
58439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // Otherwise, we can transform it.  Determine whether this is a memcpy/set
58539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // into or out of the aggregate.
58639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (OpNo == 1)
58739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    Info.isMemCpyDst = true;
58839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  else {
58939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    assert(OpNo == 2);
59039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    Info.isMemCpySrc = true;
59139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
5925e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner}
5935e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
594372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner/// isSafeUseOfBitCastedAllocation - Return true if all users of this bitcast
595372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner/// are
59639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeUseOfBitCastedAllocation(BitCastInst *BC, AllocationInst *AI,
59739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                          AllocaInfo &Info) {
598372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  for (Value::use_iterator UI = BC->use_begin(), E = BC->use_end();
599372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner       UI != E; ++UI) {
600372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (BitCastInst *BCU = dyn_cast<BitCastInst>(UI)) {
60139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeUseOfBitCastedAllocation(BCU, AI, Info);
602372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(UI)) {
60339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeMemIntrinsicOnAllocation(MI, AI, UI.getOperandNo(), Info);
604372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else {
60539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
606372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
60739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (Info.isUnsafe) return;
608372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  }
609372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner}
610372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
6118bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// RewriteBitCastUserOfAlloca - BCInst (transitively) bitcasts AI, or indexes
6128bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// to its first element.  Transform users of the cast to use the new values
6138bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// instead.
6148bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattnervoid SROA::RewriteBitCastUserOfAlloca(Instruction *BCInst, AllocationInst *AI,
615372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                      SmallVector<AllocaInst*, 32> &NewElts) {
616372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  Constant *Zero = Constant::getNullValue(Type::Int32Ty);
617372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  const TargetData &TD = getAnalysis<TargetData>();
6188bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
6198bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  Value::use_iterator UI = BCInst->use_begin(), UE = BCInst->use_end();
6208bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  while (UI != UE) {
6218bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    if (BitCastInst *BCU = dyn_cast<BitCastInst>(*UI)) {
622372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      RewriteBitCastUserOfAlloca(BCU, AI, NewElts);
6238bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      ++UI;
6248bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      BCU->eraseFromParent();
625372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      continue;
626372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
627372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
628372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // Otherwise, must be memcpy/memmove/memset of the entire aggregate.  Split
629372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // into one per element.
6308bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    MemIntrinsic *MI = dyn_cast<MemIntrinsic>(*UI);
6318bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
6328bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    // If it's not a mem intrinsic, it must be some other user of a gep of the
6338bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    // first pointer.  Just leave these alone.
6348bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    if (!MI) {
6358bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      ++UI;
6368bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      continue;
6378bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    }
638372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
639372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // If this is a memcpy/memmove, construct the other pointer as the
640372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // appropriate type.
641372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    Value *OtherPtr = 0;
642372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(MI)) {
643372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (BCInst == MCI->getRawDest())
644372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MCI->getRawSource();
645372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      else {
646372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        assert(BCInst == MCI->getRawSource());
647372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MCI->getRawDest();
648372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
649372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else if (MemMoveInst *MMI = dyn_cast<MemMoveInst>(MI)) {
650372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (BCInst == MMI->getRawDest())
651372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MMI->getRawSource();
652372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      else {
653372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        assert(BCInst == MMI->getRawSource());
654372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = MMI->getRawDest();
655372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
656372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
657372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
658372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // If there is an other pointer, we want to convert it to the same pointer
659372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // type as AI has, so we can GEP through it.
660372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (OtherPtr) {
661372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // It is likely that OtherPtr is a bitcast, if so, remove it.
662372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (BitCastInst *BC = dyn_cast<BitCastInst>(OtherPtr))
663372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = BC->getOperand(0);
664372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (ConstantExpr *BCE = dyn_cast<ConstantExpr>(OtherPtr))
665372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        if (BCE->getOpcode() == Instruction::BitCast)
666372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          OtherPtr = BCE->getOperand(0);
667372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
668372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // If the pointer is not the right type, insert a bitcast to the right
669372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // type.
670372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (OtherPtr->getType() != AI->getType())
671372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        OtherPtr = new BitCastInst(OtherPtr, AI->getType(), OtherPtr->getName(),
672372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                   MI);
673372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
674372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
675372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // Process each element of the aggregate.
676372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    Value *TheFn = MI->getOperand(0);
677372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    const Type *BytePtrTy = MI->getRawDest()->getType();
678372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    bool SROADest = MI->getRawDest() == BCInst;
679372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
680372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    for (unsigned i = 0, e = NewElts.size(); i != e; ++i) {
681372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // If this is a memcpy/memmove, emit a GEP of the other element address.
682372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      Value *OtherElt = 0;
683372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (OtherPtr) {
684963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        Value *Idx[2] = { Zero, ConstantInt::get(Type::Int32Ty, i) };
685051a950000e21935165db56695e35bade668193bGabor Greif        OtherElt = GetElementPtrInst::Create(OtherPtr, Idx, Idx + 2,
686963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner                                           OtherPtr->getNameStr()+"."+utostr(i),
687051a950000e21935165db56695e35bade668193bGabor Greif                                             MI);
688372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
689372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
690372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      Value *EltPtr = NewElts[i];
691c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      const Type *EltTy =cast<PointerType>(EltPtr->getType())->getElementType();
692c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
693c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      // If we got down to a scalar, insert a load or store as appropriate.
69431e5bdccf29f0ce6172f0f0bbb43a9a736b1ef0cDan Gohman      if (EltTy->isSingleValueType()) {
695c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        if (isa<MemCpyInst>(MI) || isa<MemMoveInst>(MI)) {
696c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          Value *Elt = new LoadInst(SROADest ? OtherElt : EltPtr, "tmp",
697c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                                    MI);
698c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          new StoreInst(Elt, SROADest ? EltPtr : OtherElt, MI);
699c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          continue;
700c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        } else {
701c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          assert(isa<MemSetInst>(MI));
702c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
703c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // If the stored element is zero (common case), just store a null
704c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // constant.
705c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          Constant *StoreVal;
706c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          if (ConstantInt *CI = dyn_cast<ConstantInt>(MI->getOperand(2))) {
707c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            if (CI->isZero()) {
708c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              StoreVal = Constant::getNullValue(EltTy);  // 0.0, null, 0, <0,0>
709c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            } else {
71007a96765daedf180a7102d39fe56c499878312b7Dan Gohman              // If EltTy is a vector type, get the element type.
711c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              const Type *ValTy = EltTy;
712c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              if (const VectorType *VTy = dyn_cast<VectorType>(ValTy))
713c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                ValTy = VTy->getElementType();
7143cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
715c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // Construct an integer with the right value.
7163cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands              unsigned EltSize = TD.getTypeSizeInBits(ValTy);
7173cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands              APInt OneVal(EltSize, CI->getZExtValue());
718c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              APInt TotalVal(OneVal);
719c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // Set each byte.
7203cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands              for (unsigned i = 0; 8*i < EltSize; ++i) {
721c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                TotalVal = TotalVal.shl(8);
722c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                TotalVal |= OneVal;
723c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              }
7243cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
725c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // Convert the integer value to the appropriate type.
726c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              StoreVal = ConstantInt::get(TotalVal);
727c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              if (isa<PointerType>(ValTy))
728c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                StoreVal = ConstantExpr::getIntToPtr(StoreVal, ValTy);
729c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              else if (ValTy->isFloatingPoint())
730c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                StoreVal = ConstantExpr::getBitCast(StoreVal, ValTy);
731c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              assert(StoreVal->getType() == ValTy && "Type mismatch!");
732c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
733c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              // If the requested value was a vector constant, create it.
734c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              if (EltTy != ValTy) {
735c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                unsigned NumElts = cast<VectorType>(ValTy)->getNumElements();
736c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                SmallVector<Constant*, 16> Elts(NumElts, StoreVal);
737c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                StoreVal = ConstantVector::get(&Elts[0], NumElts);
738c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner              }
739c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            }
740c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            new StoreInst(StoreVal, EltPtr, MI);
741c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner            continue;
742c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          }
743c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // Otherwise, if we're storing a byte variable, use a memset call for
744c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          // this element.
745c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        }
746c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      }
747372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
748372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // Cast the element pointer to BytePtrTy.
749372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (EltPtr->getType() != BytePtrTy)
750372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        EltPtr = new BitCastInst(EltPtr, BytePtrTy, EltPtr->getNameStr(), MI);
751c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
752c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      // Cast the other pointer (if we have one) to BytePtrTy.
753c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      if (OtherElt && OtherElt->getType() != BytePtrTy)
754c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        OtherElt = new BitCastInst(OtherElt, BytePtrTy,OtherElt->getNameStr(),
755c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner                                   MI);
756c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
7573cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned EltSize = TD.getABITypeSize(EltTy);
758c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
759372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      // Finally, insert the meminst for this element.
760372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      if (isa<MemCpyInst>(MI) || isa<MemMoveInst>(MI)) {
761372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        Value *Ops[] = {
762372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          SROADest ? EltPtr : OtherElt,  // Dest ptr
763372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          SROADest ? OtherElt : EltPtr,  // Src ptr
764372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          ConstantInt::get(MI->getOperand(3)->getType(), EltSize), // Size
765372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          Zero  // Align
766372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        };
767051a950000e21935165db56695e35bade668193bGabor Greif        CallInst::Create(TheFn, Ops, Ops + 4, "", MI);
768c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      } else {
769c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        assert(isa<MemSetInst>(MI));
770372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        Value *Ops[] = {
771372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          EltPtr, MI->getOperand(2),  // Dest, Value,
772372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          ConstantInt::get(MI->getOperand(3)->getType(), EltSize), // Size
773372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner          Zero  // Align
774372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner        };
775051a950000e21935165db56695e35bade668193bGabor Greif        CallInst::Create(TheFn, Ops, Ops + 4, "", MI);
776372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
777c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner    }
778372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
779372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // Finally, MI is now dead, as we've modified its actions to occur on all of
780372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    // the elements of the aggregate.
7818bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    ++UI;
782372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    MI->eraseFromParent();
783372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  }
784372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner}
785372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
7863cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// HasPadding - Return true if the specified type has any structure or
7873cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// alignment padding, false otherwise.
788a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sandsstatic bool HasPadding(const Type *Ty, const TargetData &TD) {
78939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (const StructType *STy = dyn_cast<StructType>(Ty)) {
79039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    const StructLayout *SL = TD.getStructLayout(STy);
79139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    unsigned PrevFieldBitOffset = 0;
79239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
7933cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned FieldBitOffset = SL->getElementOffsetInBits(i);
7943cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
79539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // Padding in sub-elements?
796a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands      if (HasPadding(STy->getElementType(i), TD))
79739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return true;
7983cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
79939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // Check to see if there is any padding between this element and the
80039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // previous one.
80139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (i) {
8023cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        unsigned PrevFieldEnd =
80339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        PrevFieldBitOffset+TD.getTypeSizeInBits(STy->getElementType(i-1));
80439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (PrevFieldEnd < FieldBitOffset)
80539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return true;
80639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
8073cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
80839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      PrevFieldBitOffset = FieldBitOffset;
80939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    }
8103cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
81139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    //  Check for tail padding.
81239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (unsigned EltCount = STy->getNumElements()) {
81339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      unsigned PrevFieldEnd = PrevFieldBitOffset +
81439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                   TD.getTypeSizeInBits(STy->getElementType(EltCount-1));
8153cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      if (PrevFieldEnd < SL->getSizeInBits())
81639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return true;
81739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    }
81839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
81939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
820a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands    return HasPadding(ATy->getElementType(), TD);
8213cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands  } else if (const VectorType *VTy = dyn_cast<VectorType>(Ty)) {
822a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands    return HasPadding(VTy->getElementType(), TD);
82339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
824a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands  return TD.getTypeSizeInBits(Ty) != TD.getABITypeSizeInBits(Ty);
82539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner}
826372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
827f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// isSafeStructAllocaToScalarRepl - Check to see if the specified allocation of
828f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// an aggregate can be broken down into elements.  Return 0 if not, 3 if safe,
829f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// or 1 if safe after canonicalization has been performed.
8305e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner///
831f5990edc877c4e63503c589928a00ec6ec751830Chris Lattnerint SROA::isSafeAllocaToScalarRepl(AllocationInst *AI) {
8325e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  // Loop over the use list of the alloca.  We can only transform it if all of
8335e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  // the users are safe to transform.
83439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  AllocaInfo Info;
83539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8365e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  for (Value::use_iterator I = AI->use_begin(), E = AI->use_end();
837f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner       I != E; ++I) {
83839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    isSafeUseOfAllocation(cast<Instruction>(*I), AI, Info);
83939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (Info.isUnsafe) {
840b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling      DOUT << "Cannot transform: " << *AI << "  due to user: " << **I;
841f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      return 0;
8425e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner    }
843f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  }
84439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
84539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // Okay, we know all the users are promotable.  If the aggregate is a memcpy
84639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // source and destination, we have to be careful.  In particular, the memcpy
84739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // could be moving around elements that live in structure padding of the LLVM
84839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // types, but may actually be used.  In these cases, we refuse to promote the
84939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // struct.
85039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (Info.isMemCpySrc && Info.isMemCpyDst &&
8513cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      HasPadding(AI->getType()->getElementType(), getAnalysis<TargetData>()))
85239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return 0;
8533cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
85439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // If we require cleanup, return 1, otherwise return 3.
85539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return Info.needsCanon ? 1 : 3;
856f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner}
857f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner
858f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// CanonicalizeAllocaUsers - If SROA reported that it can promote the specified
859f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// allocation, but only if cleaned up, perform the cleanups required.
860f5990edc877c4e63503c589928a00ec6ec751830Chris Lattnervoid SROA::CanonicalizeAllocaUsers(AllocationInst *AI) {
861d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // At this point, we know that the end result will be SROA'd and promoted, so
862d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // we can insert ugly code if required so long as sroa+mem2reg will clean it
863d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // up.
864d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end();
865d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner       UI != E; ) {
866a9d1a843fc74a9d877e105744e710496863f7580Chris Lattner    GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(*UI++);
867a9d1a843fc74a9d877e105744e710496863f7580Chris Lattner    if (!GEPI) continue;
86896326f9d312585532c95dcc31626f45f16cd5dd8Reid Spencer    gep_type_iterator I = gep_type_begin(GEPI);
869d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    ++I;
870d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
871d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
872d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      uint64_t NumElements = AT->getNumElements();
873fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
874d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      if (!isa<ConstantInt>(I.getOperand())) {
875d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        if (NumElements == 1) {
876c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          GEPI->setOperand(2, Constant::getNullValue(Type::Int32Ty));
877d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        } else {
878d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          assert(NumElements == 2 && "Unhandled case!");
879d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // All users of the GEP must be loads.  At each use of the GEP, insert
880d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // two loads of the appropriate indexed GEP and select between them.
881e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer          Value *IsOne = new ICmpInst(ICmpInst::ICMP_NE, I.getOperand(),
882d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner                              Constant::getNullValue(I.getOperand()->getType()),
883e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer             "isone", GEPI);
884d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // Insert the new GEP instructions, which are properly indexed.
8851ccd185cb49d81465a2901622e58ceae046d1d83Chris Lattner          SmallVector<Value*, 8> Indices(GEPI->op_begin()+1, GEPI->op_end());
886c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          Indices[1] = Constant::getNullValue(Type::Int32Ty);
887051a950000e21935165db56695e35bade668193bGabor Greif          Value *ZeroIdx = GetElementPtrInst::Create(GEPI->getOperand(0),
888051a950000e21935165db56695e35bade668193bGabor Greif                                                     Indices.begin(),
889051a950000e21935165db56695e35bade668193bGabor Greif                                                     Indices.end(),
890051a950000e21935165db56695e35bade668193bGabor Greif                                                     GEPI->getName()+".0", GEPI);
891c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          Indices[1] = ConstantInt::get(Type::Int32Ty, 1);
892051a950000e21935165db56695e35bade668193bGabor Greif          Value *OneIdx = GetElementPtrInst::Create(GEPI->getOperand(0),
893051a950000e21935165db56695e35bade668193bGabor Greif                                                    Indices.begin(),
894051a950000e21935165db56695e35bade668193bGabor Greif                                                    Indices.end(),
895051a950000e21935165db56695e35bade668193bGabor Greif                                                    GEPI->getName()+".1", GEPI);
896d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // Replace all loads of the variable index GEP with loads from both
897d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // indexes and a select.
898d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          while (!GEPI->use_empty()) {
899d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LoadInst *LI = cast<LoadInst>(GEPI->use_back());
900d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *Zero = new LoadInst(ZeroIdx, LI->getName()+".0", LI);
901d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *One  = new LoadInst(OneIdx , LI->getName()+".1", LI);
902051a950000e21935165db56695e35bade668193bGabor Greif            Value *R = SelectInst::Create(IsOne, One, Zero, LI->getName(), LI);
903d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LI->replaceAllUsesWith(R);
904d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LI->eraseFromParent();
905d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          }
906d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          GEPI->eraseFromParent();
907d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        }
908d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      }
909d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    }
910d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  }
9115e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner}
912a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
913a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// MergeInType - Add the 'In' type to the accumulated type so far.  If the
914a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// types are incompatible, return true, otherwise update Accum and return
915a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// false.
916de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///
917d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner/// There are three cases we handle here:
918d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   1) An effectively-integer union, where the pieces are stored into as
919de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///      smaller integers (common with byte swap and other idioms).
920d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   2) A union of vector types of the same size and potentially its elements.
921d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      Here we turn element accesses into insert/extract element operations.
922d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   3) A union of scalar types, such as int/float or int/pointer.  Here we
923d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      merge together into integers, allowing the xform to work with #1 as
924d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      well.
9255b121cc688eacf41b1b773244882d206199dc105Chris Lattnerstatic bool MergeInType(const Type *In, const Type *&Accum,
9265b121cc688eacf41b1b773244882d206199dc105Chris Lattner                        const TargetData &TD) {
927a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  // If this is our first type, just use it.
9289d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer  const VectorType *PTy;
929de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner  if (Accum == Type::VoidTy || In == Accum) {
930a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Accum = In;
931d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner  } else if (In == Type::VoidTy) {
932d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    // Noop.
93342a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner  } else if (In->isInteger() && Accum->isInteger()) {   // integer union.
934a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // Otherwise pick whichever type is larger.
935a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer    if (cast<IntegerType>(In)->getBitWidth() >
936a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer        cast<IntegerType>(Accum)->getBitWidth())
937a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      Accum = In;
9385b121cc688eacf41b1b773244882d206199dc105Chris Lattner  } else if (isa<PointerType>(In) && isa<PointerType>(Accum)) {
939c836333c3b0a18c398436ae00667a8fb5e476129Chris Lattner    // Pointer unions just stay as one of the pointers.
9409d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer  } else if (isa<VectorType>(In) || isa<VectorType>(Accum)) {
9419d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    if ((PTy = dyn_cast<VectorType>(Accum)) &&
942d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner        PTy->getElementType() == In) {
943d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Accum is a vector, and we are accessing an element: ok.
9449d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    } else if ((PTy = dyn_cast<VectorType>(In)) &&
945d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner               PTy->getElementType() == Accum) {
946d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // In is a vector, and accum is an element: ok, remember In.
947d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      Accum = In;
9489d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    } else if ((PTy = dyn_cast<VectorType>(In)) && isa<VectorType>(Accum) &&
9499d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer               PTy->getBitWidth() == cast<VectorType>(Accum)->getBitWidth()) {
950d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Two vectors of the same size: keep Accum.
951d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    } else {
952d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Cannot insert an short into a <4 x int> or handle
953d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // <2 x int> -> <4 x int>
954d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      return true;
955d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
95621c362d3240d0ba9ff98b7f36e54f25936d1a201Chris Lattner  } else {
957d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    // Pointer/FP/Integer unions merge together as integers.
958d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    switch (Accum->getTypeID()) {
959d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    case Type::PointerTyID: Accum = TD.getIntPtrType(); break;
960c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::FloatTyID:   Accum = Type::Int32Ty; break;
961c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::DoubleTyID:  Accum = Type::Int64Ty; break;
962ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::X86_FP80TyID:  return true;
963ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::FP128TyID: return true;
964ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::PPC_FP128TyID: return true;
965d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    default:
96642a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner      assert(Accum->isInteger() && "Unknown FP type!");
967d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      break;
968d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
969d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner
970d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    switch (In->getTypeID()) {
971d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    case Type::PointerTyID: In = TD.getIntPtrType(); break;
972c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::FloatTyID:   In = Type::Int32Ty; break;
973c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::DoubleTyID:  In = Type::Int64Ty; break;
974ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::X86_FP80TyID:  return true;
975ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::FP128TyID: return true;
976ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::PPC_FP128TyID: return true;
977d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    default:
97842a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner      assert(In->isInteger() && "Unknown FP type!");
979d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      break;
980d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
981d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    return MergeInType(In, Accum, TD);
982a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
983a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  return false;
984a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
985a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
9863cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// getUIntAtLeastAsBigAs - Return an unsigned integer type that is at least
987a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// as big as the specified type.  If there is no suitable type, this returns
988a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// null.
9893cb3650a278e37aa6378127c51e407d2823139b4Duncan Sandsconst Type *getUIntAtLeastAsBigAs(unsigned NumBits) {
990a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  if (NumBits > 64) return 0;
991c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 32) return Type::Int64Ty;
992c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 16) return Type::Int32Ty;
993c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 8) return Type::Int16Ty;
994c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  return Type::Int8Ty;
995a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
996a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
997a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// CanConvertToScalar - V is a pointer.  If we can convert the pointee to a
998a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// single scalar integer type, return that type.  Further, if the use is not
999a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// a completely trivial use that mem2reg could promote, set IsNotTrivial.  If
1000a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// there are no uses of this pointer, return Type::VoidTy to differentiate from
1001a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// failure.
1002a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner///
1003a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnerconst Type *SROA::CanConvertToScalar(Value *V, bool &IsNotTrivial) {
1004a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const Type *UsedType = Type::VoidTy; // No uses, no forced type.
1005a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const TargetData &TD = getAnalysis<TargetData>();
1006a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const PointerType *PTy = cast<PointerType>(V->getType());
1007a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1008a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
1009a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Instruction *User = cast<Instruction>(*UI);
1010a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1011a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
101202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // FIXME: Loads of a first class aggregrate value could be converted to a
101302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // series of loads and insertvalues
101402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      if (!LI->getType()->isSingleValueType())
101502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        return 0;
101602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
10175b121cc688eacf41b1b773244882d206199dc105Chris Lattner      if (MergeInType(LI->getType(), UsedType, TD))
1018a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        return 0;
1019a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1020a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
102124d6da5fedcf39891f7d8c5b031c01324b3db545Reid Spencer      // Storing the pointer, not into the value?
1022a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (SI->getOperand(0) == V) return 0;
102302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
102402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // FIXME: Stores of a first class aggregrate value could be converted to a
102502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // series of extractvalues and stores
102602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      if (!SI->getOperand(0)->getType()->isSingleValueType())
102702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        return 0;
1028a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1029de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner      // NOTE: We could handle storing of FP imms into integers here!
1030a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
10315b121cc688eacf41b1b773244882d206199dc105Chris Lattner      if (MergeInType(SI->getOperand(0)->getType(), UsedType, TD))
1032a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        return 0;
1033d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    } else if (BitCastInst *CI = dyn_cast<BitCastInst>(User)) {
1034a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      IsNotTrivial = true;
1035a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const Type *SubTy = CanConvertToScalar(CI, IsNotTrivial);
10365b121cc688eacf41b1b773244882d206199dc105Chris Lattner      if (!SubTy || MergeInType(SubTy, UsedType, TD)) return 0;
1037a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(User)) {
1038a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Check to see if this is stepping over an element: GEP Ptr, int C
1039a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (GEP->getNumOperands() == 2 && isa<ConstantInt>(GEP->getOperand(1))) {
1040b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(1))->getZExtValue();
10413cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        unsigned ElSize = TD.getABITypeSize(PTy->getElementType());
1042a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        unsigned BitOffset = Idx*ElSize*8;
1043a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (BitOffset > 64 || !isPowerOf2_32(ElSize)) return 0;
1044a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1045a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        IsNotTrivial = true;
1046a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *SubElt = CanConvertToScalar(GEP, IsNotTrivial);
1047a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (SubElt == 0) return 0;
104842a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner        if (SubElt != Type::VoidTy && SubElt->isInteger()) {
1049a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          const Type *NewTy =
10503cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands            getUIntAtLeastAsBigAs(TD.getABITypeSizeInBits(SubElt)+BitOffset);
10515b121cc688eacf41b1b773244882d206199dc105Chris Lattner          if (NewTy == 0 || MergeInType(NewTy, UsedType, TD)) return 0;
1052a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          continue;
1053a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
1054a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else if (GEP->getNumOperands() == 3 &&
1055a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner                 isa<ConstantInt>(GEP->getOperand(1)) &&
1056a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner                 isa<ConstantInt>(GEP->getOperand(2)) &&
1057843f0767acd05baed952d39e77ea89b438430a4fZhou Sheng                 cast<ConstantInt>(GEP->getOperand(1))->isZero()) {
1058a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // We are stepping into an element, e.g. a structure or an array:
1059a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // GEP Ptr, int 0, uint C
1060a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *AggTy = PTy->getElementType();
1061b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(2))->getZExtValue();
1062a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1063a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (const ArrayType *ATy = dyn_cast<ArrayType>(AggTy)) {
1064a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          if (Idx >= ATy->getNumElements()) return 0;  // Out of range.
1065ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer        } else if (const VectorType *VectorTy = dyn_cast<VectorType>(AggTy)) {
106607a96765daedf180a7102d39fe56c499878312b7Dan Gohman          // Getting an element of the vector.
1067ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          if (Idx >= VectorTy->getNumElements()) return 0;  // Out of range.
1068de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1069ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          // Merge in the vector type.
1070ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          if (MergeInType(VectorTy, UsedType, TD)) return 0;
1071de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1072de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial);
1073de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          if (SubTy == 0) return 0;
1074de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
10755b121cc688eacf41b1b773244882d206199dc105Chris Lattner          if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType, TD))
1076de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner            return 0;
1077de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1078de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          // We'll need to change this to an insert/extract element operation.
1079de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          IsNotTrivial = true;
1080de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          continue;    // Everything looks ok
1081de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1082a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else if (isa<StructType>(AggTy)) {
1083a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          // Structs are always ok.
1084a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else {
1085a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          return 0;
1086a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
10873cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        const Type *NTy = getUIntAtLeastAsBigAs(TD.getABITypeSizeInBits(AggTy));
10885b121cc688eacf41b1b773244882d206199dc105Chris Lattner        if (NTy == 0 || MergeInType(NTy, UsedType, TD)) return 0;
1089a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial);
1090a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (SubTy == 0) return 0;
10915b121cc688eacf41b1b773244882d206199dc105Chris Lattner        if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType, TD))
1092a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          return 0;
1093a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        continue;    // Everything looks ok
1094a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
1095a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      return 0;
1096a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else {
1097a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Cannot handle this!
1098a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      return 0;
1099a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    }
1100a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
1101a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1102a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  return UsedType;
1103a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
1104a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1105a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// ConvertToScalar - The specified alloca passes the CanConvertToScalar
1106a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// predicate and is non-trivial.  Convert it to something that can be trivially
1107a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// promoted into a register by mem2reg.
1108a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnervoid SROA::ConvertToScalar(AllocationInst *AI, const Type *ActualTy) {
1109b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling  DOUT << "CONVERT TO SCALAR: " << *AI << "  TYPE = "
1110b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling       << *ActualTy << "\n";
1111a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  ++NumConverted;
1112a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1113a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  BasicBlock *EntryBlock = AI->getParent();
1114ecb7a77885b174cf4d001a9b48533b3979e7810dDan Gohman  assert(EntryBlock == &EntryBlock->getParent()->getEntryBlock() &&
1115a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner         "Not in the entry block!");
1116a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  EntryBlock->getInstList().remove(AI);  // Take the alloca out of the program.
1117a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1118a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  // Create and insert the alloca.
1119de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner  AllocaInst *NewAI = new AllocaInst(ActualTy, 0, AI->getName(),
1120de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner                                     EntryBlock->begin());
1121a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  ConvertUsesToScalar(AI, NewAI, 0);
1122a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  delete AI;
1123a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
1124a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1125a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1126a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// ConvertUsesToScalar - Convert all of the users of Ptr to use the new alloca
1127de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// directly.  This happens when we are converting an "integer union" to a
1128de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1129de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// vector with insert/extractelement instructions.
1130de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///
1131de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1132de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1133a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnervoid SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset) {
1134a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  while (!Ptr->use_empty()) {
1135a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Instruction *User = cast<Instruction>(Ptr->use_back());
1136a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1137a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
1138800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Value *NV = ConvertUsesOfLoadToScalar(LI, NewAI, Offset);
1139a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      LI->replaceAllUsesWith(NV);
1140a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      LI->eraseFromParent();
1141a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
1142a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      assert(SI->getOperand(0) != Ptr && "Consistency error!");
1143a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1144800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Value *SV = ConvertUsesOfStoreToScalar(SI, NewAI, Offset);
1145a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      new StoreInst(SV, NewAI, SI);
1146a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      SI->eraseFromParent();
1147a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1148f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner    } else if (BitCastInst *CI = dyn_cast<BitCastInst>(User)) {
1149b10e0da065fc2c18b5bee9011eb249e223a23108Chris Lattner      ConvertUsesToScalar(CI, NewAI, Offset);
1150a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      CI->eraseFromParent();
1151a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(User)) {
1152a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const PointerType *AggPtrTy =
1153a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        cast<PointerType>(GEP->getOperand(0)->getType());
1154a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const TargetData &TD = getAnalysis<TargetData>();
11553cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned AggSizeInBits =
11563cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        TD.getABITypeSizeInBits(AggPtrTy->getElementType());
11573cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
1158a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Check to see if this is stepping over an element: GEP Ptr, int C
1159a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      unsigned NewOffset = Offset;
1160a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (GEP->getNumOperands() == 2) {
1161b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(1))->getZExtValue();
1162a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        unsigned BitOffset = Idx*AggSizeInBits;
1163a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1164f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner        NewOffset += BitOffset;
1165a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else if (GEP->getNumOperands() == 3) {
1166a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // We know that operand #2 is zero.
1167b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(2))->getZExtValue();
1168a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *AggTy = AggPtrTy->getElementType();
1169a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (const SequentialType *SeqTy = dyn_cast<SequentialType>(AggTy)) {
11703cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands          unsigned ElSizeBits =
11713cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands            TD.getABITypeSizeInBits(SeqTy->getElementType());
1172a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1173f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner          NewOffset += ElSizeBits*Idx;
1174a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else if (const StructType *STy = dyn_cast<StructType>(AggTy)) {
1175b1919e2f08ecb37140af676fd2916f8d5ed7df3dChris Lattner          unsigned EltBitOffset =
11763cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands            TD.getStructLayout(STy)->getElementOffsetInBits(Idx);
1177a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1178f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner          NewOffset += EltBitOffset;
1179a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else {
1180a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          assert(0 && "Unsupported operation!");
1181a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          abort();
1182a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
1183a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else {
1184a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        assert(0 && "Unsupported operation!");
1185a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        abort();
1186a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
1187a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      ConvertUsesToScalar(GEP, NewAI, NewOffset);
1188a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      GEP->eraseFromParent();
1189a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    } else {
1190a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      assert(0 && "Unsupported operation!");
1191a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      abort();
1192a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    }
1193a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
1194a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
119579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
1196800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// ConvertUsesOfLoadToScalar - Convert all of the users the specified load to
1197800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// use the new alloca directly, returning the value that should replace the
1198800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// load.  This happens when we are converting an "integer union" to a
1199800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1200800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// vector with insert/extractelement instructions.
1201800de31776356910eb877e71df9f32b0a6215324Chris Lattner///
1202800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1203800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1204800de31776356910eb877e71df9f32b0a6215324Chris LattnerValue *SROA::ConvertUsesOfLoadToScalar(LoadInst *LI, AllocaInst *NewAI,
1205800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                       unsigned Offset) {
1206800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // The load is a bit extract from NewAI shifted right by Offset bits.
1207800de31776356910eb877e71df9f32b0a6215324Chris Lattner  Value *NV = new LoadInst(NewAI, LI->getName(), LI);
1208800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1209800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (NV->getType() == LI->getType() && Offset == 0) {
1210800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We win, no conversion needed.
1211800de31776356910eb877e71df9f32b0a6215324Chris Lattner    return NV;
1212800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
12139d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12149d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // If the result type of the 'union' is a pointer, then this must be ptr->ptr
12159d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // cast.  Anything else would result in NV being an integer.
12169d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (isa<PointerType>(NV->getType())) {
12179d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    assert(isa<PointerType>(LI->getType()));
12189d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    return new BitCastInst(NV, LI->getType(), LI->getName(), LI);
12199d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  }
1220800de31776356910eb877e71df9f32b0a6215324Chris Lattner
12219d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (const VectorType *VTy = dyn_cast<VectorType>(NV->getType())) {
1222800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result alloca is a vector type, this is either an element
1223800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // access or a bitcast to another vector type.
12249d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    if (isa<VectorType>(LI->getType()))
12259d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      return new BitCastInst(NV, LI->getType(), LI->getName(), LI);
12269d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12279d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Otherwise it must be an element access.
1228800de31776356910eb877e71df9f32b0a6215324Chris Lattner    const TargetData &TD = getAnalysis<TargetData>();
12299d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    unsigned Elt = 0;
12309d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    if (Offset) {
12319d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      unsigned EltSize = TD.getABITypeSizeInBits(VTy->getElementType());
12329d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      Elt = Offset/EltSize;
12339d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      Offset -= EltSize*Elt;
1234800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
12359d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new ExtractElementInst(NV, ConstantInt::get(Type::Int32Ty, Elt),
12369d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                "tmp", LI);
1237800de31776356910eb877e71df9f32b0a6215324Chris Lattner
12389d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // If we're done, return this element.
12399d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    if (NV->getType() == LI->getType() && Offset == 0)
12409d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      return NV;
12419d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  }
12429d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12439d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  const IntegerType *NTy = cast<IntegerType>(NV->getType());
12449d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12459d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // If this is a big-endian system and the load is narrower than the
12469d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // full alloca type, we need to do a shift to get the right bits.
12479d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  int ShAmt = 0;
12489d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  const TargetData &TD = getAnalysis<TargetData>();
12499d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (TD.isBigEndian()) {
12509d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // On big-endian machines, the lowest bit is stored at the bit offset
12519d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // from the pointer given by getTypeStoreSizeInBits.  This matters for
12529d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // integers with a bitwidth that is not a multiple of 8.
12539d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    ShAmt = TD.getTypeStoreSizeInBits(NTy) -
12549d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    TD.getTypeStoreSizeInBits(LI->getType()) - Offset;
12559d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  } else {
12569d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    ShAmt = Offset;
12579d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  }
12589d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12599d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // Note: we support negative bitwidths (with shl) which are not defined.
12609d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // We do this to support (f.e.) loads off the end of a structure where
12619d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // only some bits are used.
12629d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (ShAmt > 0 && (unsigned)ShAmt < NTy->getBitWidth())
12637cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif    NV = BinaryOperator::CreateLShr(NV,
12649d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                    ConstantInt::get(NV->getType(),ShAmt),
12659d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                    LI->getName(), LI);
12669d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  else if (ShAmt < 0 && (unsigned)-ShAmt < NTy->getBitWidth())
12677cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif    NV = BinaryOperator::CreateShl(NV,
12689d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                   ConstantInt::get(NV->getType(),-ShAmt),
12699d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                   LI->getName(), LI);
12709d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12719d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // Finally, unconditionally truncate the integer to the right width.
12729d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  unsigned LIBitWidth = TD.getTypeSizeInBits(LI->getType());
12739d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (LIBitWidth < NTy->getBitWidth())
12749d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new TruncInst(NV, IntegerType::get(LIBitWidth),
12759d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                       LI->getName(), LI);
12769d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12779d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // If the result is an integer, this is a trunc or bitcast.
12789d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (isa<IntegerType>(LI->getType())) {
12799d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Should be done.
12809d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  } else if (LI->getType()->isFloatingPoint()) {
12819d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Just do a bitcast, we know the sizes match up.
12829d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new BitCastInst(NV, LI->getType(), LI->getName(), LI);
12839d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  } else {
12849d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Otherwise must be a pointer.
12859d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new IntToPtrInst(NV, LI->getType(), LI->getName(), LI);
1286800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
12879d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  assert(NV->getType() == LI->getType() && "Didn't convert right?");
1288800de31776356910eb877e71df9f32b0a6215324Chris Lattner  return NV;
1289800de31776356910eb877e71df9f32b0a6215324Chris Lattner}
1290800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1291800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1292800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// ConvertUsesOfStoreToScalar - Convert the specified store to a load+store
1293800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// pair of the new alloca directly, returning the value that should be stored
1294800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// to the alloca.  This happens when we are converting an "integer union" to a
1295800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1296800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// vector with insert/extractelement instructions.
1297800de31776356910eb877e71df9f32b0a6215324Chris Lattner///
1298800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1299800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1300800de31776356910eb877e71df9f32b0a6215324Chris LattnerValue *SROA::ConvertUsesOfStoreToScalar(StoreInst *SI, AllocaInst *NewAI,
1301800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                        unsigned Offset) {
1302800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1303800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // Convert the stored type to the actual type, shift it left to insert
1304800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // then 'or' into place.
1305800de31776356910eb877e71df9f32b0a6215324Chris Lattner  Value *SV = SI->getOperand(0);
1306800de31776356910eb877e71df9f32b0a6215324Chris Lattner  const Type *AllocaType = NewAI->getType()->getElementType();
1307800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (SV->getType() == AllocaType && Offset == 0) {
1308800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // All is well.
1309800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (const VectorType *PTy = dyn_cast<VectorType>(AllocaType)) {
1310800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI);
1311800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1312800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result alloca is a vector type, this is either an element
1313800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // access or a bitcast to another vector type.
1314800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (isa<VectorType>(SV->getType())) {
1315800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, AllocaType, SV->getName(), SI);
1316800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1317800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // Must be an element insertion.
1318800de31776356910eb877e71df9f32b0a6215324Chris Lattner      const TargetData &TD = getAnalysis<TargetData>();
1319800de31776356910eb877e71df9f32b0a6215324Chris Lattner      unsigned Elt = Offset/TD.getABITypeSizeInBits(PTy->getElementType());
1320051a950000e21935165db56695e35bade668193bGabor Greif      SV = InsertElementInst::Create(Old, SV,
1321051a950000e21935165db56695e35bade668193bGabor Greif                                     ConstantInt::get(Type::Int32Ty, Elt),
1322051a950000e21935165db56695e35bade668193bGabor Greif                                     "tmp", SI);
1323800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1324800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (isa<PointerType>(AllocaType)) {
1325800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the alloca type is a pointer, then all the elements must be
1326800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // pointers.
1327800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType() != AllocaType)
1328800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, AllocaType, SV->getName(), SI);
1329800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else {
1330800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI);
1331800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1332800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If SV is a float, convert it to the appropriate integer type.
1333800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If it is a pointer, do the same, and also handle ptr->ptr casts
1334800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // here.
1335800de31776356910eb877e71df9f32b0a6215324Chris Lattner    const TargetData &TD = getAnalysis<TargetData>();
1336800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned SrcWidth = TD.getTypeSizeInBits(SV->getType());
1337800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned DestWidth = TD.getTypeSizeInBits(AllocaType);
1338800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned SrcStoreWidth = TD.getTypeStoreSizeInBits(SV->getType());
1339800de31776356910eb877e71df9f32b0a6215324Chris Lattner    unsigned DestStoreWidth = TD.getTypeStoreSizeInBits(AllocaType);
1340800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType()->isFloatingPoint())
1341800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, IntegerType::get(SrcWidth),
1342800de31776356910eb877e71df9f32b0a6215324Chris Lattner                           SV->getName(), SI);
1343800de31776356910eb877e71df9f32b0a6215324Chris Lattner    else if (isa<PointerType>(SV->getType()))
1344800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new PtrToIntInst(SV, TD.getIntPtrType(), SV->getName(), SI);
1345800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1346800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Always zero extend the value if needed.
1347800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType() != AllocaType)
1348800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new ZExtInst(SV, AllocaType, SV->getName(), SI);
1349800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1350800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If this is a big-endian system and the store is narrower than the
1351800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // full alloca type, we need to do a shift to get the right bits.
1352800de31776356910eb877e71df9f32b0a6215324Chris Lattner    int ShAmt = 0;
1353800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (TD.isBigEndian()) {
1354800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // On big-endian machines, the lowest bit is stored at the bit offset
1355800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // from the pointer given by getTypeStoreSizeInBits.  This matters for
1356800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // integers with a bitwidth that is not a multiple of 8.
1357800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = DestStoreWidth - SrcStoreWidth - Offset;
1358800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1359800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = Offset;
1360800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1361800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1362800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Note: we support negative bitwidths (with shr) which are not defined.
1363800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We do this to support (f.e.) stores off the end of a structure where
1364800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // only some bits in the structure are set.
1365800de31776356910eb877e71df9f32b0a6215324Chris Lattner    APInt Mask(APInt::getLowBitsSet(DestWidth, SrcWidth));
1366800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (ShAmt > 0 && (unsigned)ShAmt < DestWidth) {
13677cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      SV = BinaryOperator::CreateShl(SV,
1368800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     ConstantInt::get(SV->getType(), ShAmt),
1369800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     SV->getName(), SI);
1370800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Mask <<= ShAmt;
1371800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else if (ShAmt < 0 && (unsigned)-ShAmt < DestWidth) {
13727cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      SV = BinaryOperator::CreateLShr(SV,
1373800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      ConstantInt::get(SV->getType(),-ShAmt),
1374800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      SV->getName(), SI);
1375800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Mask = Mask.lshr(ShAmt);
1376800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1377800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1378800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Mask out the bits we are about to insert from the old value, and or
1379800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // in the new bits.
1380800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SrcWidth != DestWidth) {
1381800de31776356910eb877e71df9f32b0a6215324Chris Lattner      assert(DestWidth > SrcWidth);
13827cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      Old = BinaryOperator::CreateAnd(Old, ConstantInt::get(~Mask),
1383800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      Old->getName()+".mask", SI);
13847cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      SV = BinaryOperator::CreateOr(Old, SV, SV->getName()+".ins", SI);
1385800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1386800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
1387800de31776356910eb877e71df9f32b0a6215324Chris Lattner  return SV;
1388800de31776356910eb877e71df9f32b0a6215324Chris Lattner}
1389800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1390800de31776356910eb877e71df9f32b0a6215324Chris Lattner
139179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
139279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// PointsToConstantGlobal - Return true if V (possibly indirectly) points to
139379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// some part of a constant global variable.  This intentionally only accepts
139479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// constant expressions because we don't can't rewrite arbitrary instructions.
139579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattnerstatic bool PointsToConstantGlobal(Value *V) {
139679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
139779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    return GV->isConstant();
139879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
139979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (CE->getOpcode() == Instruction::BitCast ||
140079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        CE->getOpcode() == Instruction::GetElementPtr)
140179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return PointsToConstantGlobal(CE->getOperand(0));
140279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return false;
140379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
140479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
140579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// isOnlyCopiedFromConstantGlobal - Recursively walk the uses of a (derived)
140679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// pointer to an alloca.  Ignore any reads of the pointer, return false if we
140779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// see any stores or other unknown uses.  If we see pointer arithmetic, keep
140879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// track of whether it moves the pointer (with isOffset) but otherwise traverse
140979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// the uses.  If we see a memcpy/memmove that targets an unoffseted pointer to
141079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// the alloca, and if the source pointer is a pointer to a constant  global, we
141179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// can optimize this.
141279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattnerstatic bool isOnlyCopiedFromConstantGlobal(Value *V, Instruction *&TheCopy,
141379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner                                           bool isOffset) {
141479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
141579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (isa<LoadInst>(*UI)) {
141679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // Ignore loads, they are always ok.
141779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
141879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
141979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (BitCastInst *BCI = dyn_cast<BitCastInst>(*UI)) {
142079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // If uses of the bitcast are ok, we are ok.
142179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      if (!isOnlyCopiedFromConstantGlobal(BCI, TheCopy, isOffset))
142279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        return false;
142379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
142479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
142579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(*UI)) {
142679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // If the GEP has all zero indices, it doesn't offset the pointer.  If it
142779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // doesn't, it does.
142879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      if (!isOnlyCopiedFromConstantGlobal(GEP, TheCopy,
142979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner                                         isOffset || !GEP->hasAllZeroIndices()))
143079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        return false;
143179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
143279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
143379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
143479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If this is isn't our memcpy/memmove, reject it as something we can't
143579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // handle.
143679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (!isa<MemCpyInst>(*UI) && !isa<MemMoveInst>(*UI))
143779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return false;
143879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
143979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If we already have seen a copy, reject the second one.
144079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (TheCopy) return false;
144179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
144279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the pointer has been offset from the start of the alloca, we can't
144379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // safely handle this.
144479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (isOffset) return false;
144579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
144679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the memintrinsic isn't using the alloca as the dest, reject it.
144779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (UI.getOperandNo() != 1) return false;
144879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
144979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    MemIntrinsic *MI = cast<MemIntrinsic>(*UI);
145079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
145179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the source of the memcpy/move is not a constant global, reject it.
145279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (!PointsToConstantGlobal(MI->getOperand(2)))
145379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return false;
145479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
145579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Otherwise, the transform is safe.  Remember the copy instruction.
145679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    TheCopy = MI;
145779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  }
145879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return true;
145979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
146079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
146179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// isOnlyCopiedFromConstantGlobal - Return true if the specified alloca is only
146279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// modified by a copy from a constant global.  If we can prove this, we can
146379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// replace any uses of the alloca with uses of the global directly.
146479b3bd395dc3303cde65e18e0524ed2f70268c99Chris LattnerInstruction *SROA::isOnlyCopiedFromConstantGlobal(AllocationInst *AI) {
146579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  Instruction *TheCopy = 0;
146679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (::isOnlyCopiedFromConstantGlobal(AI, TheCopy, false))
146779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    return TheCopy;
146879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return 0;
146979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
1470