ScalarReplAggregates.cpp revision d93afec1dbbb1abb3df55e2e007b5f256d09f84a
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
51ae73dc1448d25b02cabc7c64c86c64371453dda8Dan Gohman    explicit SROA(signed T = -1) : FunctionPass(&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:
7356c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    TargetData *TD;
7456c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner
7539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    /// AllocaInfo - When analyzing uses of an alloca instruction, this captures
7639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    /// information about the uses.  All these fields are initialized to false
7739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    /// and set to true when something is learned.
7839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    struct AllocaInfo {
7939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// isUnsafe - This is set to true if the alloca cannot be SROA'd.
8039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool isUnsafe : 1;
8139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// needsCanon - This is set to true if there is some use of the alloca
8339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// that requires canonicalization.
8439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool needsCanon : 1;
8539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      /// isMemCpySrc - This is true if this aggregate is memcpy'd from.
8739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool isMemCpySrc : 1;
8839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8933b0b8d242de8d428f11e77ea734a08b47797216Zhou Sheng      /// isMemCpyDst - This is true if this aggregate is memcpy'd into.
9039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      bool isMemCpyDst : 1;
9139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
9239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      AllocaInfo()
9339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        : isUnsafe(false), needsCanon(false),
9439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          isMemCpySrc(false), isMemCpyDst(false) {}
9539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    };
9639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
97ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel    unsigned SRThreshold;
98ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel
9939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void MarkUnsafe(AllocaInfo &I) { I.isUnsafe = true; }
10039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
101f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    int isSafeAllocaToScalarRepl(AllocationInst *AI);
10239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
10339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
10439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                               AllocaInfo &Info);
10539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeElementUse(Value *Ptr, bool isFirstElt, AllocationInst *AI,
10639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                         AllocaInfo &Info);
10739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeMemIntrinsicOnAllocation(MemIntrinsic *MI, AllocationInst *AI,
10839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                        unsigned OpNo, AllocaInfo &Info);
10939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    void isSafeUseOfBitCastedAllocation(BitCastInst *User, AllocationInst *AI,
11039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                        AllocaInfo &Info);
11139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
112a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    void DoScalarReplacement(AllocationInst *AI,
113a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                             std::vector<AllocationInst*> &WorkList);
114f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    void CanonicalizeAllocaUsers(AllocationInst *AI);
115ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    AllocaInst *AddNewAlloca(Function &F, const Type *Ty, AllocationInst *Base);
116a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1178bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    void RewriteBitCastUserOfAlloca(Instruction *BCInst, AllocationInst *AI,
118372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                    SmallVector<AllocaInst*, 32> &NewElts);
119372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
120d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    void RewriteMemIntrinUserOfAlloca(MemIntrinsic *MI, Instruction *BCInst,
121d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                      AllocationInst *AI,
122d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                      SmallVector<AllocaInst*, 32> &NewElts);
123d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
124d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
125a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    const Type *CanConvertToScalar(Value *V, bool &IsNotTrivial);
126a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    void ConvertToScalar(AllocationInst *AI, const Type *Ty);
127a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    void ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset);
128800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *ConvertUsesOfLoadToScalar(LoadInst *LI, AllocaInst *NewAI,
129800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     unsigned Offset);
130800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *ConvertUsesOfStoreToScalar(StoreInst *SI, AllocaInst *NewAI,
131800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      unsigned Offset);
13279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    static Instruction *isOnlyCopiedFromConstantGlobal(AllocationInst *AI);
133ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  };
134ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner}
135ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
136844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar SROA::ID = 0;
137844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<SROA> X("scalarrepl", "Scalar Replacement of Aggregates");
138844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
139d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke// Public interface to the ScalarReplAggregates pass
140ff366850aa9956e167e78d4f5b57aae10d8c5779Devang PatelFunctionPass *llvm::createScalarReplAggregatesPass(signed int Threshold) {
141ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel  return new SROA(Threshold);
142ff366850aa9956e167e78d4f5b57aae10d8c5779Devang Patel}
143ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
144ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
145ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattnerbool SROA::runOnFunction(Function &F) {
14656c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner  TD = &getAnalysis<TargetData>();
14756c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner
148fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  bool Changed = performPromotion(F);
149fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  while (1) {
150fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    bool LocalChange = performScalarRepl(F);
151fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    if (!LocalChange) break;   // No need to repromote if no scalarrepl
152fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    Changed = true;
153fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    LocalChange = performPromotion(F);
154fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner    if (!LocalChange) break;   // No need to re-scalarrepl if no promotion
155fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  }
15638aec325604635380421a27e39ab06d55ed2458dChris Lattner
15738aec325604635380421a27e39ab06d55ed2458dChris Lattner  return Changed;
15838aec325604635380421a27e39ab06d55ed2458dChris Lattner}
15938aec325604635380421a27e39ab06d55ed2458dChris Lattner
16038aec325604635380421a27e39ab06d55ed2458dChris Lattner
16138aec325604635380421a27e39ab06d55ed2458dChris Lattnerbool SROA::performPromotion(Function &F) {
16238aec325604635380421a27e39ab06d55ed2458dChris Lattner  std::vector<AllocaInst*> Allocas;
163326821ef12c911af1d785e305e81dc3c07e456a5Devang Patel  DominatorTree         &DT = getAnalysis<DominatorTree>();
16443f820d1f7638656be2158efac7dd8f5b08b8b77Chris Lattner  DominanceFrontier &DF = getAnalysis<DominanceFrontier>();
16538aec325604635380421a27e39ab06d55ed2458dChris Lattner
16602a3be020a6b4eedb4b489959997d23a22cdf22eChris Lattner  BasicBlock &BB = F.getEntryBlock();  // Get the entry node for the function
16738aec325604635380421a27e39ab06d55ed2458dChris Lattner
168fe7ea0da17a1b5150aabbc2e82c5f4a0750dc23eChris Lattner  bool Changed = false;
169fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
17038aec325604635380421a27e39ab06d55ed2458dChris Lattner  while (1) {
17138aec325604635380421a27e39ab06d55ed2458dChris Lattner    Allocas.clear();
17238aec325604635380421a27e39ab06d55ed2458dChris Lattner
17338aec325604635380421a27e39ab06d55ed2458dChris Lattner    // Find allocas that are safe to promote, by looking at all instructions in
17438aec325604635380421a27e39ab06d55ed2458dChris Lattner    // the entry node
17538aec325604635380421a27e39ab06d55ed2458dChris Lattner    for (BasicBlock::iterator I = BB.begin(), E = --BB.end(); I != E; ++I)
17638aec325604635380421a27e39ab06d55ed2458dChris Lattner      if (AllocaInst *AI = dyn_cast<AllocaInst>(I))       // Is it an alloca?
17741968df51e11f581eb19c8f68a8cb2f4e8acc1c5Devang Patel        if (isAllocaPromotable(AI))
17838aec325604635380421a27e39ab06d55ed2458dChris Lattner          Allocas.push_back(AI);
17938aec325604635380421a27e39ab06d55ed2458dChris Lattner
18038aec325604635380421a27e39ab06d55ed2458dChris Lattner    if (Allocas.empty()) break;
18138aec325604635380421a27e39ab06d55ed2458dChris Lattner
182326821ef12c911af1d785e305e81dc3c07e456a5Devang Patel    PromoteMemToReg(Allocas, DT, DF);
18338aec325604635380421a27e39ab06d55ed2458dChris Lattner    NumPromoted += Allocas.size();
18438aec325604635380421a27e39ab06d55ed2458dChris Lattner    Changed = true;
18538aec325604635380421a27e39ab06d55ed2458dChris Lattner  }
18638aec325604635380421a27e39ab06d55ed2458dChris Lattner
18738aec325604635380421a27e39ab06d55ed2458dChris Lattner  return Changed;
18838aec325604635380421a27e39ab06d55ed2458dChris Lattner}
18938aec325604635380421a27e39ab06d55ed2458dChris Lattner
190963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner/// getNumSAElements - Return the number of elements in the specific struct or
191963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner/// array.
192963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattnerstatic uint64_t getNumSAElements(const Type *T) {
193963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner  if (const StructType *ST = dyn_cast<StructType>(T))
194963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner    return ST->getNumElements();
195963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner  return cast<ArrayType>(T)->getNumElements();
196963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner}
197963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner
19838aec325604635380421a27e39ab06d55ed2458dChris Lattner// performScalarRepl - This algorithm is a simple worklist driven algorithm,
19938aec325604635380421a27e39ab06d55ed2458dChris Lattner// which runs on all of the malloc/alloca instructions in the function, removing
20038aec325604635380421a27e39ab06d55ed2458dChris Lattner// them if they are only used by getelementptr instructions.
20138aec325604635380421a27e39ab06d55ed2458dChris Lattner//
20238aec325604635380421a27e39ab06d55ed2458dChris Lattnerbool SROA::performScalarRepl(Function &F) {
203ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  std::vector<AllocationInst*> WorkList;
204ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
205ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  // Scan the entry basic block, adding any alloca's and mallocs to the worklist
20602a3be020a6b4eedb4b489959997d23a22cdf22eChris Lattner  BasicBlock &BB = F.getEntryBlock();
207ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  for (BasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I)
208ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    if (AllocationInst *A = dyn_cast<AllocationInst>(I))
209ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner      WorkList.push_back(A);
210ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
211ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  // Process the worklist
212ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  bool Changed = false;
213ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  while (!WorkList.empty()) {
214ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    AllocationInst *AI = WorkList.back();
215ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    WorkList.pop_back();
216a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
217add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    // Handle dead allocas trivially.  These can be formed by SROA'ing arrays
218add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    // with unused elements.
219add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    if (AI->use_empty()) {
220add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner      AI->eraseFromParent();
221add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner      continue;
222add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner    }
223add2bd7f5941537a97a41e037ae2277fbeed0b4fChris Lattner
224a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // If we can turn this aggregate value (potentially with casts) into a
225a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // simple scalar value that can be mem2reg'd into a register value.
226a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    bool IsNotTrivial = false;
227a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (const Type *ActualType = CanConvertToScalar(AI, IsNotTrivial))
228df4f226cdcbe853984ddda10aa0d53590d35b97eChris Lattner      if (IsNotTrivial && ActualType != Type::VoidTy) {
229a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        ConvertToScalar(AI, ActualType);
230a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        Changed = true;
231a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        continue;
232a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
233ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
23479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Check to see if we can perform the core SROA transformation.  We cannot
23579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // transform the allocation instruction if it is an array allocation
23679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // (allocations OF arrays are ok though), and an allocation of a scalar
23779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // value cannot be decomposed at all.
238a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (!AI->isArrayAllocation() &&
239a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        (isa<StructType>(AI->getAllocatedType()) ||
2407139406707eb3869183fd6a3329fe4a77d309692Chris Lattner         isa<ArrayType>(AI->getAllocatedType())) &&
2417139406707eb3869183fd6a3329fe4a77d309692Chris Lattner        AI->getAllocatedType()->isSized() &&
242963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        // Do not promote any struct whose size is larger than "128" bytes.
24356c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner        TD->getABITypeSize(AI->getAllocatedType()) < SRThreshold &&
244963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        // Do not promote any struct into more than "32" separate vars.
245963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner        getNumSAElements(AI->getAllocatedType()) < SRThreshold/4) {
246a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // Check that all of the users of the allocation are capable of being
247a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // transformed.
248a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      switch (isSafeAllocaToScalarRepl(AI)) {
249a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      default: assert(0 && "Unexpected value!");
250a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 0:  // Not safe to scalar replace.
251a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        break;
252a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 1:  // Safe, but requires cleanup/canonicalizations first
253a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        CanonicalizeAllocaUsers(AI);
254a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        // FALL THROUGH.
255a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      case 3:  // Safe to scalar replace.
256a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        DoScalarReplacement(AI, WorkList);
257a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        Changed = true;
258a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner        continue;
259a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      }
260f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
26179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
26279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Check to see if this allocation is only modified by a memcpy/memmove from
26379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // a constant global.  If this is the case, we can change all users to use
26479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // the constant global instead.  This is commonly produced by the CFE by
26579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // constructs like "void foo() { int A[] = {1,2,3,4,5,6,7,8,9...}; }" if 'A'
26679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // is only subsequently read.
26779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (Instruction *TheCopy = isOnlyCopiedFromConstantGlobal(AI)) {
26879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      DOUT << "Found alloca equal to global: " << *AI;
26979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      DOUT << "  memcpy = " << *TheCopy;
27079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      Constant *TheSrc = cast<Constant>(TheCopy->getOperand(2));
27179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      AI->replaceAllUsesWith(ConstantExpr::getBitCast(TheSrc, AI->getType()));
27279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      TheCopy->eraseFromParent();  // Don't mutate the global.
27379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      AI->eraseFromParent();
27479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      ++NumGlobals;
27579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      Changed = true;
27679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
27779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
278a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
279a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Otherwise, couldn't process this.
280a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  }
281ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
282a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  return Changed;
283a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner}
284fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
285a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner/// DoScalarReplacement - This alloca satisfied the isSafeAllocaToScalarRepl
286a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner/// predicate, do SROA now.
287a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattnervoid SROA::DoScalarReplacement(AllocationInst *AI,
288a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                               std::vector<AllocationInst*> &WorkList) {
28979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  DOUT << "Found inst to SROA: " << *AI;
290a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  SmallVector<AllocaInst*, 32> ElementAllocas;
291a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  if (const StructType *ST = dyn_cast<StructType>(AI->getAllocatedType())) {
292a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    ElementAllocas.reserve(ST->getNumContainedTypes());
293a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    for (unsigned i = 0, e = ST->getNumContainedTypes(); i != e; ++i) {
294a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      AllocaInst *NA = new AllocaInst(ST->getContainedType(i), 0,
295a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getAlignment(),
296a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getName() + "." + utostr(i), AI);
297a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      ElementAllocas.push_back(NA);
298a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      WorkList.push_back(NA);  // Add to worklist for recursive processing
299a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
300a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  } else {
301a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    const ArrayType *AT = cast<ArrayType>(AI->getAllocatedType());
302a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    ElementAllocas.reserve(AT->getNumElements());
303a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    const Type *ElTy = AT->getElementType();
304a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    for (unsigned i = 0, e = AT->getNumElements(); i != e; ++i) {
305a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      AllocaInst *NA = new AllocaInst(ElTy, 0, AI->getAlignment(),
306a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner                                      AI->getName() + "." + utostr(i), AI);
307a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      ElementAllocas.push_back(NA);
308a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      WorkList.push_back(NA);  // Add to worklist for recursive processing
309ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner    }
310a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  }
311fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
312a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // Now that we have created the alloca instructions that we want to use,
313a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // expand the getelementptr instructions to use them.
314a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  //
315a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  while (!AI->use_empty()) {
316a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    Instruction *User = cast<Instruction>(AI->use_back());
317a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (BitCastInst *BCInst = dyn_cast<BitCastInst>(User)) {
318a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RewriteBitCastUserOfAlloca(BCInst, AI, ElementAllocas);
319a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      BCInst->eraseFromParent();
320a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      continue;
321a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
322a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
3232a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // Replace:
3242a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %res = load { i32, i32 }* %alloc
3252a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // with:
3262a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %load.0 = load i32* %alloc.0
3272a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %insert.0 insertvalue { i32, i32 } zeroinitializer, i32 %load.0, 0
3282a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %load.1 = load i32* %alloc.1
3292a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %insert = insertvalue { i32, i32 } %insert.0, i32 %load.1, 1
33002518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    // (Also works for arrays instead of structs)
33102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
33202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      Value *Insert = UndefValue::get(LI->getType());
33302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      for (unsigned i = 0, e = ElementAllocas.size(); i != e; ++i) {
33402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        Value *Load = new LoadInst(ElementAllocas[i], "load", LI);
33502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        Insert = InsertValueInst::Create(Insert, Load, i, "insert", LI);
33602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      }
33702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      LI->replaceAllUsesWith(Insert);
33802518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      LI->eraseFromParent();
33902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      continue;
34002518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    }
34102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
3422a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // Replace:
3432a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   store { i32, i32 } %val, { i32, i32 }* %alloc
3442a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    // with:
3452a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %val.0 = extractvalue { i32, i32 } %val, 0
3462a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   store i32 %val.0, i32* %alloc.0
3472a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   %val.1 = extractvalue { i32, i32 } %val, 1
3482a6a6457094e05e5f5ab34f90dbd25c13d61f8b5Chris Lattner    //   store i32 %val.1, i32* %alloc.1
34902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    // (Also works for arrays instead of structs)
35002518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
35102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      Value *Val = SI->getOperand(0);
35202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      for (unsigned i = 0, e = ElementAllocas.size(); i != e; ++i) {
35302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        Value *Extract = ExtractValueInst::Create(Val, i, Val->getName(), SI);
35402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        new StoreInst(Extract, ElementAllocas[i], SI);
35502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      }
35602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      SI->eraseFromParent();
35702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      continue;
35802518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    }
35902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
360a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GetElementPtrInst *GEPI = cast<GetElementPtrInst>(User);
361a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // We now know that the GEP is of the form: GEP <ptr>, 0, <cst>
362a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    unsigned Idx =
363a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner       (unsigned)cast<ConstantInt>(GEPI->getOperand(2))->getZExtValue();
364a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
365a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    assert(Idx < ElementAllocas.size() && "Index out of range?");
366a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    AllocaInst *AllocaToUse = ElementAllocas[Idx];
367a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
368a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    Value *RepValue;
369a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    if (GEPI->getNumOperands() == 3) {
370a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // Do not insert a new getelementptr instruction with zero indices, only
371a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // to have it optimized out later.
372a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RepValue = AllocaToUse;
373a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    } else {
374a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // We are indexing deeply into the structure, so we still need a
375a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // getelement ptr instruction to finish the indexing.  This may be
376a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      // expanded itself once the worklist is rerun.
377a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      //
378a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      SmallVector<Value*, 8> NewArgs;
379a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      NewArgs.push_back(Constant::getNullValue(Type::Int32Ty));
380a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      NewArgs.append(GEPI->op_begin()+3, GEPI->op_end());
381051a950000e21935165db56695e35bade668193bGabor Greif      RepValue = GetElementPtrInst::Create(AllocaToUse, NewArgs.begin(),
382051a950000e21935165db56695e35bade668193bGabor Greif                                           NewArgs.end(), "", GEPI);
383a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner      RepValue->takeName(GEPI);
384a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    }
385a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner
386a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // If this GEP is to the start of the aggregate, check for memcpys.
387d356a7ee0ed7744857dcf497cb20b0128770fb0fChris Lattner    if (Idx == 0 && GEPI->hasAllZeroIndices())
388d356a7ee0ed7744857dcf497cb20b0128770fb0fChris Lattner      RewriteBitCastUserOfAlloca(GEPI, AI, ElementAllocas);
389ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
390a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Move all of the users over to the new GEP.
391a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GEPI->replaceAllUsesWith(RepValue);
392a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    // Delete the old GEP
393a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner    GEPI->eraseFromParent();
394ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner  }
395ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner
396a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  // Finally, delete the Alloca instruction
397a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  AI->eraseFromParent();
398a10b29b84b63c448b7cb423598d3a38b0f55cddbChris Lattner  NumReplaced++;
399ed7b41ea90a17c826f195acbc456c4bb733113d6Chris Lattner}
4005e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
4015e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
402f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// isSafeElementUse - Check to see if this use is an allowed use for a
4038bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// getelementptr instruction of an array aggregate allocation.  isFirstElt
4048bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// indicates whether Ptr is known to the start of the aggregate.
405f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner///
40639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeElementUse(Value *Ptr, bool isFirstElt, AllocationInst *AI,
40739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                            AllocaInfo &Info) {
408f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  for (Value::use_iterator I = Ptr->use_begin(), E = Ptr->use_end();
409f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner       I != E; ++I) {
410f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    Instruction *User = cast<Instruction>(*I);
411f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    switch (User->getOpcode()) {
412f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::Load:  break;
413f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::Store:
414f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      // Store is ok if storing INTO the pointer, not storing the pointer
41539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (User->getOperand(0) == Ptr) return MarkUnsafe(Info);
416f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      break;
417f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    case Instruction::GetElementPtr: {
418f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      GetElementPtrInst *GEP = cast<GetElementPtrInst>(User);
4198bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      bool AreAllZeroIndices = isFirstElt;
420f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      if (GEP->getNumOperands() > 1) {
4218bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        if (!isa<ConstantInt>(GEP->getOperand(1)) ||
4228bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner            !cast<ConstantInt>(GEP->getOperand(1))->isZero())
42339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          // Using pointer arithmetic to navigate the array.
42439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return MarkUnsafe(Info);
4258bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
426d356a7ee0ed7744857dcf497cb20b0128770fb0fChris Lattner        if (AreAllZeroIndices)
427d356a7ee0ed7744857dcf497cb20b0128770fb0fChris Lattner          AreAllZeroIndices = GEP->hasAllZeroIndices();
428f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      }
42939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeElementUse(GEP, AreAllZeroIndices, AI, Info);
43039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (Info.isUnsafe) return;
431f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      break;
432f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
4338bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    case Instruction::BitCast:
43439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (isFirstElt) {
43539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        isSafeUseOfBitCastedAllocation(cast<BitCastInst>(User), AI, Info);
43639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (Info.isUnsafe) return;
4378bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner        break;
43839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
4398bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      DOUT << "  Transformation preventing inst: " << *User;
44039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
4418bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    case Instruction::Call:
4428bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(User)) {
44339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (isFirstElt) {
44439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          isSafeMemIntrinsicOnAllocation(MI, AI, I.getOperandNo(), Info);
44539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          if (Info.isUnsafe) return;
4468bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner          break;
44739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        }
4488bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      }
4498bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      DOUT << "  Transformation preventing inst: " << *User;
45039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
451f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    default:
452b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling      DOUT << "  Transformation preventing inst: " << *User;
45339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
454f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner    }
455f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  }
45639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return;  // All users look ok :)
457f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner}
458f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner
459d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner/// AllUsersAreLoads - Return true if all users of this value are loads.
460d878ecd904e4469344a2274f9784422c2c68b81cChris Lattnerstatic bool AllUsersAreLoads(Value *Ptr) {
461d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  for (Value::use_iterator I = Ptr->use_begin(), E = Ptr->use_end();
462d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner       I != E; ++I)
463d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    if (cast<Instruction>(*I)->getOpcode() != Instruction::Load)
464d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      return false;
465fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman  return true;
466d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner}
467d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
4685e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner/// isSafeUseOfAllocation - Check to see if this user is an allowed use for an
4695e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner/// aggregate allocation.
4705e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner///
47139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeUseOfAllocation(Instruction *User, AllocationInst *AI,
47239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                 AllocaInfo &Info) {
473372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  if (BitCastInst *C = dyn_cast<BitCastInst>(User))
47439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return isSafeUseOfBitCastedAllocation(C, AI, Info);
47539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
47602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman  if (isa<LoadInst>(User))
47702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    return; // Loads (returning a first class aggregrate) are always rewritable
47802518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
47902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman  if (isa<StoreInst>(User) && User->getOperand(0) != AI)
48002518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman    return; // Store is ok if storing INTO the pointer, not storing the pointer
48102518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
48239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(User);
48339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (GEPI == 0)
48439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
485546fc40d69ce4051b48112aafedd1e41f4a13195Chris Lattner
486be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  gep_type_iterator I = gep_type_begin(GEPI), E = gep_type_end(GEPI);
487be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
48825de486263abc1882498a8701e3eb29ee0804c4eChris Lattner  // The GEP is not safe to transform if not of the form "GEP <ptr>, 0, <cst>".
489be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  if (I == E ||
49039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      I.getOperand() != Constant::getNullValue(I.getOperand()->getType())) {
49139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
49239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
493be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner
494be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  ++I;
49539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (I == E) return MarkUnsafe(Info);  // ran out of GEP indices??
496546fc40d69ce4051b48112aafedd1e41f4a13195Chris Lattner
4978bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  bool IsAllZeroIndices = true;
4988bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
49988e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // If the first index is a non-constant index into an array, see if we can
50088e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // handle it as a special case.
501be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
50288e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (!isa<ConstantInt>(I.getOperand())) {
5038bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      IsAllZeroIndices = 0;
50488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner      uint64_t NumElements = AT->getNumElements();
5058bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
506d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // If this is an array index and the index is not constant, we cannot
507d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // promote... that is unless the array has exactly one or two elements in
508d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // it, in which case we CAN promote it, but we have to canonicalize this
509d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      // out if this is the only problem.
51025de486263abc1882498a8701e3eb29ee0804c4eChris Lattner      if ((NumElements == 1 || NumElements == 2) &&
51139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          AllUsersAreLoads(GEPI)) {
51239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        Info.needsCanon = true;
51339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return;  // Canonicalization required!
51439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
51539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
516d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    }
5175e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  }
5185fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman
51988e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // Walk through the GEP type indices, checking the types that this indexes
52088e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  // into.
52188e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  for (; I != E; ++I) {
52288e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    // Ignore struct elements, no extra checking needed for these.
52388e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (isa<StructType>(*I))
52488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner      continue;
52588e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
52688e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    ConstantInt *IdxVal = dyn_cast<ConstantInt>(I.getOperand());
52788e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    if (!IdxVal) return MarkUnsafe(Info);
5285fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman
5295fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman    // Are all indices still zero?
53088e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner    IsAllZeroIndices &= IdxVal->isZero();
5315fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman
5325fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman    if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
5335fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman      // This GEP indexes an array.  Verify that this is an in-range constant
5345fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman      // integer. Specifically, consider A[0][i]. We cannot know that the user
5355fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman      // isn't doing invalid things like allowing i to index an out-of-range
5365fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman      // subscript that accesses A[1].  Because of this, we have to reject SROA
537c0bc547c99bd97088e950b3074d917091abe3f51Dale Johannesen      // of any accesses into structs where any of the components are variables.
5385fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman      if (IdxVal->getZExtValue() >= AT->getNumElements())
5395fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman        return MarkUnsafe(Info);
540c0bc547c99bd97088e950b3074d917091abe3f51Dale Johannesen    } else if (const VectorType *VT = dyn_cast<VectorType>(*I)) {
541c0bc547c99bd97088e950b3074d917091abe3f51Dale Johannesen      if (IdxVal->getZExtValue() >= VT->getNumElements())
542c0bc547c99bd97088e950b3074d917091abe3f51Dale Johannesen        return MarkUnsafe(Info);
5435fac55fafb53fde5c548bcd08e07418e9d8e549fMatthijs Kooijman    }
54488e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner  }
54588e6dc8bf14e8a98888f62173a6581386b8d29a0Chris Lattner
546be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // If there are any non-simple uses of this getelementptr, make sure to reject
547be883a23ed64b83235d509ad0befc1d6aa6b0cd8Chris Lattner  // them.
54839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return isSafeElementUse(GEPI, IsAllZeroIndices, AI, Info);
5498bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner}
5508bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5518bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// isSafeMemIntrinsicOnAllocation - Return true if the specified memory
5528bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// intrinsic can be promoted by SROA.  At this point, we know that the operand
5538bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// of the memintrinsic is a pointer to the beginning of the allocation.
55439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeMemIntrinsicOnAllocation(MemIntrinsic *MI, AllocationInst *AI,
55539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                          unsigned OpNo, AllocaInfo &Info) {
5568bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // If not constant length, give up.
5578bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  ConstantInt *Length = dyn_cast<ConstantInt>(MI->getLength());
55839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (!Length) return MarkUnsafe(Info);
5598bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5608bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // If not the whole aggregate, give up.
5613cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands  if (Length->getZExtValue() !=
56256c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      TD->getABITypeSize(AI->getType()->getElementType()))
56339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
5648bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner
5658bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  // We only know about memcpy/memset/memmove.
5668bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  if (!isa<MemCpyInst>(MI) && !isa<MemSetInst>(MI) && !isa<MemMoveInst>(MI))
56739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return MarkUnsafe(Info);
56839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
56939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // Otherwise, we can transform it.  Determine whether this is a memcpy/set
57039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // into or out of the aggregate.
57139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (OpNo == 1)
57239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    Info.isMemCpyDst = true;
57339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  else {
57439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    assert(OpNo == 2);
57539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    Info.isMemCpySrc = true;
57639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
5775e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner}
5785e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner
579372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner/// isSafeUseOfBitCastedAllocation - Return true if all users of this bitcast
580372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner/// are
58139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattnervoid SROA::isSafeUseOfBitCastedAllocation(BitCastInst *BC, AllocationInst *AI,
58239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                                          AllocaInfo &Info) {
583372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  for (Value::use_iterator UI = BC->use_begin(), E = BC->use_end();
584372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner       UI != E; ++UI) {
585372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    if (BitCastInst *BCU = dyn_cast<BitCastInst>(UI)) {
58639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeUseOfBitCastedAllocation(BCU, AI, Info);
587372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(UI)) {
58839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      isSafeMemIntrinsicOnAllocation(MI, AI, UI.getOperandNo(), Info);
589372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    } else {
59039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      return MarkUnsafe(Info);
591372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
59239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (Info.isUnsafe) return;
593372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  }
594372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner}
595372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
5968bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// RewriteBitCastUserOfAlloca - BCInst (transitively) bitcasts AI, or indexes
5978bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// to its first element.  Transform users of the cast to use the new values
5988bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner/// instead.
5998bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattnervoid SROA::RewriteBitCastUserOfAlloca(Instruction *BCInst, AllocationInst *AI,
600372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner                                      SmallVector<AllocaInst*, 32> &NewElts) {
6018bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  Value::use_iterator UI = BCInst->use_begin(), UE = BCInst->use_end();
6028bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner  while (UI != UE) {
603d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    Instruction *User = cast<Instruction>(*UI++);
604d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (BitCastInst *BCU = dyn_cast<BitCastInst>(User)) {
605372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      RewriteBitCastUserOfAlloca(BCU, AI, NewElts);
6068bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner      BCU->eraseFromParent();
607372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      continue;
608372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
609372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
610d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(User)) {
611d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      // This must be memcpy/memmove/memset of the entire aggregate.
612d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      // Split into one per element.
613d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      RewriteMemIntrinUserOfAlloca(MI, BCInst, AI, NewElts);
614d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      MI->eraseFromParent();
615d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      continue;
616d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    }
617d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
6188bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    // If it's not a mem intrinsic, it must be some other user of a gep of the
6198bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    // first pointer.  Just leave these alone.
620d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    continue;
621d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  }
622d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner}
623d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
624d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner/// RewriteMemIntrinUserOfAlloca - MI is a memcpy/memset/memmove from or to AI.
625d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner/// Rewrite it to copy or set the elements of the scalarized memory.
626d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattnervoid SROA::RewriteMemIntrinUserOfAlloca(MemIntrinsic *MI, Instruction *BCInst,
627d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                        AllocationInst *AI,
628d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                        SmallVector<AllocaInst*, 32> &NewElts) {
629d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
630d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  // If this is a memcpy/memmove, construct the other pointer as the
631d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  // appropriate type.
632d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  Value *OtherPtr = 0;
633d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(MI)) {
634d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (BCInst == MCI->getRawDest())
635d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherPtr = MCI->getRawSource();
636d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    else {
637d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      assert(BCInst == MCI->getRawSource());
638d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherPtr = MCI->getRawDest();
6398bf991193245bb8b7e497e8c16545a206fbe5eefChris Lattner    }
640d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  } else if (MemMoveInst *MMI = dyn_cast<MemMoveInst>(MI)) {
641d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (BCInst == MMI->getRawDest())
642d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherPtr = MMI->getRawSource();
643d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    else {
644d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      assert(BCInst == MMI->getRawSource());
645d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherPtr = MMI->getRawDest();
646372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner    }
647d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  }
648d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
649d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  // If there is an other pointer, we want to convert it to the same pointer
650d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  // type as AI has, so we can GEP through it safely.
651d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  if (OtherPtr) {
652d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // It is likely that OtherPtr is a bitcast, if so, remove it.
653d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (BitCastInst *BC = dyn_cast<BitCastInst>(OtherPtr))
654d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherPtr = BC->getOperand(0);
655d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // All zero GEPs are effectively bitcasts.
656d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(OtherPtr))
657d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      if (GEP->hasAllZeroIndices())
658d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        OtherPtr = GEP->getOperand(0);
659372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
660d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (ConstantExpr *BCE = dyn_cast<ConstantExpr>(OtherPtr))
661d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      if (BCE->getOpcode() == Instruction::BitCast)
662d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        OtherPtr = BCE->getOperand(0);
663d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
664d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // If the pointer is not the right type, insert a bitcast to the right
665d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // type.
666d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (OtherPtr->getType() != AI->getType())
667d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherPtr = new BitCastInst(OtherPtr, AI->getType(), OtherPtr->getName(),
668d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                 MI);
669d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  }
670d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
671d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  // Process each element of the aggregate.
672d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  Value *TheFn = MI->getOperand(0);
673d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  const Type *BytePtrTy = MI->getRawDest()->getType();
674d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  bool SROADest = MI->getRawDest() == BCInst;
675d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
676d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  Constant *Zero = Constant::getNullValue(Type::Int32Ty);
677372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
678d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner  for (unsigned i = 0, e = NewElts.size(); i != e; ++i) {
679d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // If this is a memcpy/memmove, emit a GEP of the other element address.
680d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    Value *OtherElt = 0;
681d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (OtherPtr) {
682d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      Value *Idx[2] = { Zero, ConstantInt::get(Type::Int32Ty, i) };
683d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherElt = GetElementPtrInst::Create(OtherPtr, Idx, Idx + 2,
684963a97f1a365c8d09ca681e922371f9ec3473ee8Chris Lattner                                           OtherPtr->getNameStr()+"."+utostr(i),
685d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                           MI);
686d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    }
687d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
688d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    Value *EltPtr = NewElts[i];
689d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    const Type *EltTy =cast<PointerType>(EltPtr->getType())->getElementType();
690d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
691d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // If we got down to a scalar, insert a load or store as appropriate.
692d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (EltTy->isSingleValueType()) {
693d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      if (isa<MemCpyInst>(MI) || isa<MemMoveInst>(MI)) {
694d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        Value *Elt = new LoadInst(SROADest ? OtherElt : EltPtr, "tmp",
695d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                  MI);
696d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        new StoreInst(Elt, SROADest ? EltPtr : OtherElt, MI);
697d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        continue;
698372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner      }
699d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      assert(isa<MemSetInst>(MI));
700c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
701d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      // If the stored element is zero (common case), just store a null
702d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      // constant.
703d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      Constant *StoreVal;
704d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      if (ConstantInt *CI = dyn_cast<ConstantInt>(MI->getOperand(2))) {
705d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        if (CI->isZero()) {
706d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          StoreVal = Constant::getNullValue(EltTy);  // 0.0, null, 0, <0,0>
707c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        } else {
708d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          // If EltTy is a vector type, get the element type.
709d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          const Type *ValTy = EltTy;
710d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          if (const VectorType *VTy = dyn_cast<VectorType>(ValTy))
711d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            ValTy = VTy->getElementType();
712d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
713d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          // Construct an integer with the right value.
714d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          unsigned EltSize = TD->getTypeSizeInBits(ValTy);
715d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          APInt OneVal(EltSize, CI->getZExtValue());
716d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          APInt TotalVal(OneVal);
717d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          // Set each byte.
718d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          for (unsigned i = 0; 8*i < EltSize; ++i) {
719d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            TotalVal = TotalVal.shl(8);
720d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            TotalVal |= OneVal;
721d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          }
722d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
723d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          // Convert the integer value to the appropriate type.
724d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          StoreVal = ConstantInt::get(TotalVal);
725d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          if (isa<PointerType>(ValTy))
726d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            StoreVal = ConstantExpr::getIntToPtr(StoreVal, ValTy);
727d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          else if (ValTy->isFloatingPoint())
728d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            StoreVal = ConstantExpr::getBitCast(StoreVal, ValTy);
729d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          assert(StoreVal->getType() == ValTy && "Type mismatch!");
730d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
731d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          // If the requested value was a vector constant, create it.
732d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner          if (EltTy != ValTy) {
733d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            unsigned NumElts = cast<VectorType>(ValTy)->getNumElements();
734d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            SmallVector<Constant*, 16> Elts(NumElts, StoreVal);
735d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner            StoreVal = ConstantVector::get(&Elts[0], NumElts);
736c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner          }
737c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner        }
738d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        new StoreInst(StoreVal, EltPtr, MI);
739d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        continue;
740c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner      }
741d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      // Otherwise, if we're storing a byte variable, use a memset call for
742d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      // this element.
743d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    }
744c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
745d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // Cast the element pointer to BytePtrTy.
746d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (EltPtr->getType() != BytePtrTy)
747d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      EltPtr = new BitCastInst(EltPtr, BytePtrTy, EltPtr->getNameStr(), MI);
748c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner
749d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // Cast the other pointer (if we have one) to BytePtrTy.
750d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (OtherElt && OtherElt->getType() != BytePtrTy)
751d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      OtherElt = new BitCastInst(OtherElt, BytePtrTy,OtherElt->getNameStr(),
752d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner                                 MI);
753d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
754d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    unsigned EltSize = TD->getABITypeSize(EltTy);
755d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
756d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    // Finally, insert the meminst for this element.
757d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    if (isa<MemCpyInst>(MI) || isa<MemMoveInst>(MI)) {
758d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      Value *Ops[] = {
759d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        SROADest ? EltPtr : OtherElt,  // Dest ptr
760d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        SROADest ? OtherElt : EltPtr,  // Src ptr
761d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        ConstantInt::get(MI->getOperand(3)->getType(), EltSize), // Size
762d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        Zero  // Align
763d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      };
764d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      CallInst::Create(TheFn, Ops, Ops + 4, "", MI);
765d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner    } else {
766d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      assert(isa<MemSetInst>(MI));
767d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      Value *Ops[] = {
768d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        EltPtr, MI->getOperand(2),  // Dest, Value,
769d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        ConstantInt::get(MI->getOperand(3)->getType(), EltSize), // Size
770d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner        Zero  // Align
771d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      };
772d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner      CallInst::Create(TheFn, Ops, Ops + 4, "", MI);
773c14d3cac4bb5c798fbcc4b9cad87841ca087b017Chris Lattner    }
774372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner  }
775372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner}
776d93afec1dbbb1abb3df55e2e007b5f256d09f84aChris Lattner
777372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
7783cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// HasPadding - Return true if the specified type has any structure or
7793cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands/// alignment padding, false otherwise.
780a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sandsstatic bool HasPadding(const Type *Ty, const TargetData &TD) {
78139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (const StructType *STy = dyn_cast<StructType>(Ty)) {
78239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    const StructLayout *SL = TD.getStructLayout(STy);
78339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    unsigned PrevFieldBitOffset = 0;
78439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
7853cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned FieldBitOffset = SL->getElementOffsetInBits(i);
7863cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
78739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // Padding in sub-elements?
788a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands      if (HasPadding(STy->getElementType(i), TD))
78939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return true;
7903cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
79139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // Check to see if there is any padding between this element and the
79239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      // previous one.
79339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      if (i) {
7943cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands        unsigned PrevFieldEnd =
79539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        PrevFieldBitOffset+TD.getTypeSizeInBits(STy->getElementType(i-1));
79639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        if (PrevFieldEnd < FieldBitOffset)
79739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner          return true;
79839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      }
7993cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
80039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      PrevFieldBitOffset = FieldBitOffset;
80139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    }
8023cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
80339a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    //  Check for tail padding.
80439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (unsigned EltCount = STy->getNumElements()) {
80539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner      unsigned PrevFieldEnd = PrevFieldBitOffset +
80639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner                   TD.getTypeSizeInBits(STy->getElementType(EltCount-1));
8073cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      if (PrevFieldEnd < SL->getSizeInBits())
80839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner        return true;
80939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    }
81039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
81139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
812a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands    return HasPadding(ATy->getElementType(), TD);
8133cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands  } else if (const VectorType *VTy = dyn_cast<VectorType>(Ty)) {
814a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands    return HasPadding(VTy->getElementType(), TD);
81539a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  }
816a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands  return TD.getTypeSizeInBits(Ty) != TD.getABITypeSizeInBits(Ty);
81739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner}
818372dda8881c7a32a6f5ce0f76a713e3a9ef46ea1Chris Lattner
819f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// isSafeStructAllocaToScalarRepl - Check to see if the specified allocation of
820f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// an aggregate can be broken down into elements.  Return 0 if not, 3 if safe,
821f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// or 1 if safe after canonicalization has been performed.
8225e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner///
823f5990edc877c4e63503c589928a00ec6ec751830Chris Lattnerint SROA::isSafeAllocaToScalarRepl(AllocationInst *AI) {
8245e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  // Loop over the use list of the alloca.  We can only transform it if all of
8255e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  // the users are safe to transform.
82639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  AllocaInfo Info;
82739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
8285e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner  for (Value::use_iterator I = AI->use_begin(), E = AI->use_end();
829f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner       I != E; ++I) {
83039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    isSafeUseOfAllocation(cast<Instruction>(*I), AI, Info);
83139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    if (Info.isUnsafe) {
832b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling      DOUT << "Cannot transform: " << *AI << "  due to user: " << **I;
833f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner      return 0;
8345e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner    }
835f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner  }
83639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner
83739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // Okay, we know all the users are promotable.  If the aggregate is a memcpy
83839a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // source and destination, we have to be careful.  In particular, the memcpy
83939a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // could be moving around elements that live in structure padding of the LLVM
84039a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // types, but may actually be used.  In these cases, we refuse to promote the
84139a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // struct.
84239a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  if (Info.isMemCpySrc && Info.isMemCpyDst &&
84356c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      HasPadding(AI->getType()->getElementType(), *TD))
84439a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner    return 0;
8453cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
84639a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  // If we require cleanup, return 1, otherwise return 3.
84739a1c04323a5993d6b2993e615ec44c16e19aeeaChris Lattner  return Info.needsCanon ? 1 : 3;
848f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner}
849f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner
850f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// CanonicalizeAllocaUsers - If SROA reported that it can promote the specified
851f5990edc877c4e63503c589928a00ec6ec751830Chris Lattner/// allocation, but only if cleaned up, perform the cleanups required.
852f5990edc877c4e63503c589928a00ec6ec751830Chris Lattnervoid SROA::CanonicalizeAllocaUsers(AllocationInst *AI) {
853d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // At this point, we know that the end result will be SROA'd and promoted, so
854d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // we can insert ugly code if required so long as sroa+mem2reg will clean it
855d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  // up.
856d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end();
857d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner       UI != E; ) {
858a9d1a843fc74a9d877e105744e710496863f7580Chris Lattner    GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(*UI++);
859a9d1a843fc74a9d877e105744e710496863f7580Chris Lattner    if (!GEPI) continue;
86096326f9d312585532c95dcc31626f45f16cd5dd8Reid Spencer    gep_type_iterator I = gep_type_begin(GEPI);
861d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    ++I;
862d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner
863d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    if (const ArrayType *AT = dyn_cast<ArrayType>(*I)) {
864d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      uint64_t NumElements = AT->getNumElements();
865fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
866d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      if (!isa<ConstantInt>(I.getOperand())) {
867d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        if (NumElements == 1) {
868c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          GEPI->setOperand(2, Constant::getNullValue(Type::Int32Ty));
869d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        } else {
870d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          assert(NumElements == 2 && "Unhandled case!");
871d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // All users of the GEP must be loads.  At each use of the GEP, insert
872d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // two loads of the appropriate indexed GEP and select between them.
873e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer          Value *IsOne = new ICmpInst(ICmpInst::ICMP_NE, I.getOperand(),
874d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner                              Constant::getNullValue(I.getOperand()->getType()),
875e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer             "isone", GEPI);
876d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // Insert the new GEP instructions, which are properly indexed.
8771ccd185cb49d81465a2901622e58ceae046d1d83Chris Lattner          SmallVector<Value*, 8> Indices(GEPI->op_begin()+1, GEPI->op_end());
878c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          Indices[1] = Constant::getNullValue(Type::Int32Ty);
879051a950000e21935165db56695e35bade668193bGabor Greif          Value *ZeroIdx = GetElementPtrInst::Create(GEPI->getOperand(0),
880051a950000e21935165db56695e35bade668193bGabor Greif                                                     Indices.begin(),
881051a950000e21935165db56695e35bade668193bGabor Greif                                                     Indices.end(),
882051a950000e21935165db56695e35bade668193bGabor Greif                                                     GEPI->getName()+".0", GEPI);
883c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer          Indices[1] = ConstantInt::get(Type::Int32Ty, 1);
884051a950000e21935165db56695e35bade668193bGabor Greif          Value *OneIdx = GetElementPtrInst::Create(GEPI->getOperand(0),
885051a950000e21935165db56695e35bade668193bGabor Greif                                                    Indices.begin(),
886051a950000e21935165db56695e35bade668193bGabor Greif                                                    Indices.end(),
887051a950000e21935165db56695e35bade668193bGabor Greif                                                    GEPI->getName()+".1", GEPI);
888d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // Replace all loads of the variable index GEP with loads from both
889d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          // indexes and a select.
890d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          while (!GEPI->use_empty()) {
891d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LoadInst *LI = cast<LoadInst>(GEPI->use_back());
892d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *Zero = new LoadInst(ZeroIdx, LI->getName()+".0", LI);
893d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            Value *One  = new LoadInst(OneIdx , LI->getName()+".1", LI);
894051a950000e21935165db56695e35bade668193bGabor Greif            Value *R = SelectInst::Create(IsOne, One, Zero, LI->getName(), LI);
895d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LI->replaceAllUsesWith(R);
896d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner            LI->eraseFromParent();
897d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          }
898d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner          GEPI->eraseFromParent();
899d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner        }
900d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner      }
901d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner    }
902d878ecd904e4469344a2274f9784422c2c68b81cChris Lattner  }
9035e062a1eda2c4adffd428a35e737a431fc37f4e0Chris Lattner}
904a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
905a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// MergeInType - Add the 'In' type to the accumulated type so far.  If the
906a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// types are incompatible, return true, otherwise update Accum and return
907a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// false.
908de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///
909d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner/// There are three cases we handle here:
910d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   1) An effectively-integer union, where the pieces are stored into as
911de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///      smaller integers (common with byte swap and other idioms).
912d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   2) A union of vector types of the same size and potentially its elements.
913d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      Here we turn element accesses into insert/extract element operations.
914d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///   3) A union of scalar types, such as int/float or int/pointer.  Here we
915d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      merge together into integers, allowing the xform to work with #1 as
916d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner///      well.
9175b121cc688eacf41b1b773244882d206199dc105Chris Lattnerstatic bool MergeInType(const Type *In, const Type *&Accum,
9185b121cc688eacf41b1b773244882d206199dc105Chris Lattner                        const TargetData &TD) {
919a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  // If this is our first type, just use it.
9209d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer  const VectorType *PTy;
921de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner  if (Accum == Type::VoidTy || In == Accum) {
922a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Accum = In;
923d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner  } else if (In == Type::VoidTy) {
924d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    // Noop.
92542a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner  } else if (In->isInteger() && Accum->isInteger()) {   // integer union.
926a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    // Otherwise pick whichever type is larger.
927a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer    if (cast<IntegerType>(In)->getBitWidth() >
928a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer        cast<IntegerType>(Accum)->getBitWidth())
929a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      Accum = In;
9305b121cc688eacf41b1b773244882d206199dc105Chris Lattner  } else if (isa<PointerType>(In) && isa<PointerType>(Accum)) {
931c836333c3b0a18c398436ae00667a8fb5e476129Chris Lattner    // Pointer unions just stay as one of the pointers.
9329d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer  } else if (isa<VectorType>(In) || isa<VectorType>(Accum)) {
9339d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    if ((PTy = dyn_cast<VectorType>(Accum)) &&
934d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner        PTy->getElementType() == In) {
935d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Accum is a vector, and we are accessing an element: ok.
9369d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    } else if ((PTy = dyn_cast<VectorType>(In)) &&
937d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner               PTy->getElementType() == Accum) {
938d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // In is a vector, and accum is an element: ok, remember In.
939d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      Accum = In;
9409d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer    } else if ((PTy = dyn_cast<VectorType>(In)) && isa<VectorType>(Accum) &&
9419d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer               PTy->getBitWidth() == cast<VectorType>(Accum)->getBitWidth()) {
942d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Two vectors of the same size: keep Accum.
943d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    } else {
944d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // Cannot insert an short into a <4 x int> or handle
945d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      // <2 x int> -> <4 x int>
946d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      return true;
947d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
94821c362d3240d0ba9ff98b7f36e54f25936d1a201Chris Lattner  } else {
949d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    // Pointer/FP/Integer unions merge together as integers.
950d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    switch (Accum->getTypeID()) {
951d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    case Type::PointerTyID: Accum = TD.getIntPtrType(); break;
952c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::FloatTyID:   Accum = Type::Int32Ty; break;
953c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::DoubleTyID:  Accum = Type::Int64Ty; break;
954ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::X86_FP80TyID:  return true;
955ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::FP128TyID: return true;
956ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::PPC_FP128TyID: return true;
957d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    default:
95842a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner      assert(Accum->isInteger() && "Unknown FP type!");
959d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      break;
960d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
961d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner
962d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    switch (In->getTypeID()) {
963d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    case Type::PointerTyID: In = TD.getIntPtrType(); break;
964c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::FloatTyID:   In = Type::Int32Ty; break;
965c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer    case Type::DoubleTyID:  In = Type::Int64Ty; break;
966ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::X86_FP80TyID:  return true;
967ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::FP128TyID: return true;
968ef0ab932ef3b07016ffb827cd529d4787d7ed12eDale Johannesen    case Type::PPC_FP128TyID: return true;
969d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    default:
97042a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner      assert(In->isInteger() && "Unknown FP type!");
971d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner      break;
972d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    }
973d22dbdf60652536d44dc4a380059368bea75b5cdChris Lattner    return MergeInType(In, Accum, TD);
974a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
975a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  return false;
976a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
977a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
97856c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner/// getIntAtLeastAsBigAs - Return an integer type that is at least as big as the
97956c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner/// specified type.  If there is no suitable type, this returns null.
98056c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattnerconst Type *getIntAtLeastAsBigAs(unsigned NumBits) {
981a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  if (NumBits > 64) return 0;
982c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 32) return Type::Int64Ty;
983c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 16) return Type::Int32Ty;
984c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  if (NumBits > 8) return Type::Int16Ty;
985c5b206b6be61d0d933b98b6af5e22f42edd48ad1Reid Spencer  return Type::Int8Ty;
986a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
987a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
988a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// CanConvertToScalar - V is a pointer.  If we can convert the pointee to a
989a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// single scalar integer type, return that type.  Further, if the use is not
990a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// a completely trivial use that mem2reg could promote, set IsNotTrivial.  If
991a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// there are no uses of this pointer, return Type::VoidTy to differentiate from
992a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// failure.
993a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner///
994a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnerconst Type *SROA::CanConvertToScalar(Value *V, bool &IsNotTrivial) {
995a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const Type *UsedType = Type::VoidTy; // No uses, no forced type.
996a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  const PointerType *PTy = cast<PointerType>(V->getType());
997a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
998a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
999a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Instruction *User = cast<Instruction>(*UI);
1000a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1001a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
100202518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // FIXME: Loads of a first class aggregrate value could be converted to a
100302518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // series of loads and insertvalues
100402518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      if (!LI->getType()->isSingleValueType())
100502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        return 0;
100602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
100756c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      if (MergeInType(LI->getType(), UsedType, *TD))
1008a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        return 0;
1009cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1010cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    }
1011cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1012cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
101324d6da5fedcf39891f7d8c5b031c01324b3db545Reid Spencer      // Storing the pointer, not into the value?
1014a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (SI->getOperand(0) == V) return 0;
101502518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman
101602518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // FIXME: Stores of a first class aggregrate value could be converted to a
101702518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      // series of extractvalues and stores
101802518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman      if (!SI->getOperand(0)->getType()->isSingleValueType())
101902518140ac3310d0357c26a87b2372d85da9c2f4Matthijs Kooijman        return 0;
1020a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1021de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner      // NOTE: We could handle storing of FP imms into integers here!
1022a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
102356c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      if (MergeInType(SI->getOperand(0)->getType(), UsedType, *TD))
1024a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        return 0;
1025cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1026cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    }
1027cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    if (BitCastInst *CI = dyn_cast<BitCastInst>(User)) {
1028a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      IsNotTrivial = true;
1029a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const Type *SubTy = CanConvertToScalar(CI, IsNotTrivial);
103056c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      if (!SubTy || MergeInType(SubTy, UsedType, *TD)) return 0;
1031cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1032cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    }
1033cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1034cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(User)) {
1035a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Check to see if this is stepping over an element: GEP Ptr, int C
1036a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (GEP->getNumOperands() == 2 && isa<ConstantInt>(GEP->getOperand(1))) {
1037b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(1))->getZExtValue();
103856c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner        unsigned ElSize = TD->getABITypeSize(PTy->getElementType());
1039a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        unsigned BitOffset = Idx*ElSize*8;
1040a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (BitOffset > 64 || !isPowerOf2_32(ElSize)) return 0;
1041a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1042a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        IsNotTrivial = true;
1043a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *SubElt = CanConvertToScalar(GEP, IsNotTrivial);
1044a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (SubElt == 0) return 0;
104542a75517250017a52afb03a0ade03cbd49559fe5Chris Lattner        if (SubElt != Type::VoidTy && SubElt->isInteger()) {
1046a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          const Type *NewTy =
104756c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner            getIntAtLeastAsBigAs(TD->getABITypeSizeInBits(SubElt)+BitOffset);
104856c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner          if (NewTy == 0 || MergeInType(NewTy, UsedType, *TD)) return 0;
1049a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          continue;
1050a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
1051cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        // Cannot handle this!
1052cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        return 0;
1053cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      }
1054cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1055cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      if (GEP->getNumOperands() == 3 &&
1056cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner          isa<ConstantInt>(GEP->getOperand(1)) &&
1057cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner          isa<ConstantInt>(GEP->getOperand(2)) &&
1058cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner          cast<ConstantInt>(GEP->getOperand(1))->isZero()) {
1059a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        // We are stepping into an element, e.g. a structure or an array:
1060d356a7ee0ed7744857dcf497cb20b0128770fb0fChris Lattner        // GEP Ptr, i32 0, i32 Cst
1061a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *AggTy = PTy->getElementType();
1062b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(2))->getZExtValue();
1063a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1064a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (const ArrayType *ATy = dyn_cast<ArrayType>(AggTy)) {
1065a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          if (Idx >= ATy->getNumElements()) return 0;  // Out of range.
1066ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer        } else if (const VectorType *VectorTy = dyn_cast<VectorType>(AggTy)) {
106707a96765daedf180a7102d39fe56c499878312b7Dan Gohman          // Getting an element of the vector.
1068ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          if (Idx >= VectorTy->getNumElements()) return 0;  // Out of range.
1069de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1070ac9dcb94dde5f166ee29372385c0e3b695227ab4Reid Spencer          // Merge in the vector type.
107156c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner          if (MergeInType(VectorTy, UsedType, *TD)) return 0;
1072de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1073de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial);
1074de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          if (SubTy == 0) return 0;
1075de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
107656c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner          if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType, *TD))
1077de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner            return 0;
1078de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1079de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          // We'll need to change this to an insert/extract element operation.
1080de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          IsNotTrivial = true;
1081de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner          continue;    // Everything looks ok
1082de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner
1083a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else if (isa<StructType>(AggTy)) {
1084a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          // Structs are always ok.
1085a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        } else {
1086a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          return 0;
1087a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        }
108856c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner        const Type *NTy = getIntAtLeastAsBigAs(TD->getABITypeSizeInBits(AggTy));
108956c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner        if (NTy == 0 || MergeInType(NTy, UsedType, *TD)) return 0;
1090a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        const Type *SubTy = CanConvertToScalar(GEP, IsNotTrivial);
1091a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        if (SubTy == 0) return 0;
109256c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner        if (SubTy != Type::VoidTy && MergeInType(SubTy, UsedType, *TD))
1093a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner          return 0;
1094a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        continue;    // Everything looks ok
1095a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
1096a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      return 0;
1097a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    }
1098cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1099cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    // Cannot handle this!
1100cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    return 0;
1101a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
1102a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1103a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  return UsedType;
1104a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
1105a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1106a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// ConvertToScalar - The specified alloca passes the CanConvertToScalar
1107a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// predicate and is non-trivial.  Convert it to something that can be trivially
1108a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// promoted into a register by mem2reg.
1109a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnervoid SROA::ConvertToScalar(AllocationInst *AI, const Type *ActualTy) {
1110b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling  DOUT << "CONVERT TO SCALAR: " << *AI << "  TYPE = "
1111b7427031372337e6d67f9573ec6c722ab5ea913eBill Wendling       << *ActualTy << "\n";
1112a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  ++NumConverted;
1113a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1114a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  BasicBlock *EntryBlock = AI->getParent();
1115ecb7a77885b174cf4d001a9b48533b3979e7810dDan Gohman  assert(EntryBlock == &EntryBlock->getParent()->getEntryBlock() &&
1116a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner         "Not in the entry block!");
1117a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  EntryBlock->getInstList().remove(AI);  // Take the alloca out of the program.
1118a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1119a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  // Create and insert the alloca.
1120de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner  AllocaInst *NewAI = new AllocaInst(ActualTy, 0, AI->getName(),
1121de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner                                     EntryBlock->begin());
1122a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  ConvertUsesToScalar(AI, NewAI, 0);
1123a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  delete AI;
1124a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
1125a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1126a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1127a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner/// ConvertUsesToScalar - Convert all of the users of Ptr to use the new alloca
1128de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// directly.  This happens when we are converting an "integer union" to a
1129de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1130de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// vector with insert/extractelement instructions.
1131de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner///
1132de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1133de6df88529e20541dcfab7824af2eb0776194f01Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1134a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattnervoid SROA::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, unsigned Offset) {
1135a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  while (!Ptr->use_empty()) {
1136a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    Instruction *User = cast<Instruction>(Ptr->use_back());
1137a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1138a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    if (LoadInst *LI = dyn_cast<LoadInst>(User)) {
1139800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Value *NV = ConvertUsesOfLoadToScalar(LI, NewAI, Offset);
1140a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      LI->replaceAllUsesWith(NV);
1141a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      LI->eraseFromParent();
1142cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1143cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    }
1144cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1145cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    if (StoreInst *SI = dyn_cast<StoreInst>(User)) {
1146a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      assert(SI->getOperand(0) != Ptr && "Consistency error!");
1147a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1148800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Value *SV = ConvertUsesOfStoreToScalar(SI, NewAI, Offset);
1149a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      new StoreInst(SV, NewAI, SI);
1150a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      SI->eraseFromParent();
1151cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1152cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    }
1153cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1154cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    if (BitCastInst *CI = dyn_cast<BitCastInst>(User)) {
1155b10e0da065fc2c18b5bee9011eb249e223a23108Chris Lattner      ConvertUsesToScalar(CI, NewAI, Offset);
1156a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      CI->eraseFromParent();
1157cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1158cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    }
1159cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1160cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(User)) {
1161a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      const PointerType *AggPtrTy =
1162a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        cast<PointerType>(GEP->getOperand(0)->getType());
11633cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands      unsigned AggSizeInBits =
116456c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner        TD->getABITypeSizeInBits(AggPtrTy->getElementType());
11653cb3650a278e37aa6378127c51e407d2823139b4Duncan Sands
1166a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      // Check to see if this is stepping over an element: GEP Ptr, int C
1167a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      unsigned NewOffset = Offset;
1168a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      if (GEP->getNumOperands() == 2) {
1169b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        unsigned Idx = cast<ConstantInt>(GEP->getOperand(1))->getZExtValue();
1170a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner        unsigned BitOffset = Idx*AggSizeInBits;
1171a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner
1172f4b1818728fb5cb0740cf5362faf72dd66ccf3eaChris Lattner        NewOffset += BitOffset;
1173cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        ConvertUsesToScalar(GEP, NewAI, NewOffset);
1174cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        GEP->eraseFromParent();
1175cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        continue;
1176cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      }
1177cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1178cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      assert(GEP->getNumOperands() == 3 && "Unsupported operation");
1179cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1180cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      // We know that operand #2 is zero.
1181cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      unsigned Idx = cast<ConstantInt>(GEP->getOperand(2))->getZExtValue();
1182cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      const Type *AggTy = AggPtrTy->getElementType();
1183cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      if (const SequentialType *SeqTy = dyn_cast<SequentialType>(AggTy)) {
1184cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        unsigned ElSizeBits =
1185cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner          TD->getABITypeSizeInBits(SeqTy->getElementType());
1186cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1187cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        NewOffset += ElSizeBits*Idx;
1188a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      } else {
1189cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        const StructType *STy = cast<StructType>(AggTy);
1190cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        unsigned EltBitOffset =
1191cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner          TD->getStructLayout(STy)->getElementOffsetInBits(Idx);
1192cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1193cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner        NewOffset += EltBitOffset;
1194a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      }
1195a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      ConvertUsesToScalar(GEP, NewAI, NewOffset);
1196a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner      GEP->eraseFromParent();
1197cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner      continue;
1198a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner    }
1199cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner
1200cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    assert(0 && "Unsupported operation!");
1201cf3218640969175634b82e4e3fde1b9e680a5dc6Chris Lattner    abort();
1202a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner  }
1203a188894d67a3cc2516b25aae9b3cbdbff4b0babeChris Lattner}
120479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
1205800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// ConvertUsesOfLoadToScalar - Convert all of the users the specified load to
1206800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// use the new alloca directly, returning the value that should replace the
1207800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// load.  This happens when we are converting an "integer union" to a
1208800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1209800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// vector with insert/extractelement instructions.
1210800de31776356910eb877e71df9f32b0a6215324Chris Lattner///
1211800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1212800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1213800de31776356910eb877e71df9f32b0a6215324Chris LattnerValue *SROA::ConvertUsesOfLoadToScalar(LoadInst *LI, AllocaInst *NewAI,
1214800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                       unsigned Offset) {
1215800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // The load is a bit extract from NewAI shifted right by Offset bits.
1216800de31776356910eb877e71df9f32b0a6215324Chris Lattner  Value *NV = new LoadInst(NewAI, LI->getName(), LI);
1217800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1218800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (NV->getType() == LI->getType() && Offset == 0) {
1219800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We win, no conversion needed.
1220800de31776356910eb877e71df9f32b0a6215324Chris Lattner    return NV;
1221800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
12229d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12239d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // If the result type of the 'union' is a pointer, then this must be ptr->ptr
12249d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // cast.  Anything else would result in NV being an integer.
12259d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (isa<PointerType>(NV->getType())) {
12269d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    assert(isa<PointerType>(LI->getType()));
12279d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    return new BitCastInst(NV, LI->getType(), LI->getName(), LI);
12289d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  }
1229800de31776356910eb877e71df9f32b0a6215324Chris Lattner
12309d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (const VectorType *VTy = dyn_cast<VectorType>(NV->getType())) {
1231800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result alloca is a vector type, this is either an element
1232800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // access or a bitcast to another vector type.
12339d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    if (isa<VectorType>(LI->getType()))
12349d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      return new BitCastInst(NV, LI->getType(), LI->getName(), LI);
12359d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12369d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Otherwise it must be an element access.
12379d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    unsigned Elt = 0;
12389d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    if (Offset) {
123956c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      unsigned EltSize = TD->getABITypeSizeInBits(VTy->getElementType());
12409d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      Elt = Offset/EltSize;
12419d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      Offset -= EltSize*Elt;
1242800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
12439d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new ExtractElementInst(NV, ConstantInt::get(Type::Int32Ty, Elt),
12449d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                "tmp", LI);
1245800de31776356910eb877e71df9f32b0a6215324Chris Lattner
12469d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // If we're done, return this element.
12479d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    if (NV->getType() == LI->getType() && Offset == 0)
12489d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner      return NV;
12499d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  }
12509d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12519d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  const IntegerType *NTy = cast<IntegerType>(NV->getType());
12529d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12539d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // If this is a big-endian system and the load is narrower than the
12549d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // full alloca type, we need to do a shift to get the right bits.
12559d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  int ShAmt = 0;
125656c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner  if (TD->isBigEndian()) {
12579d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // On big-endian machines, the lowest bit is stored at the bit offset
12589d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // from the pointer given by getTypeStoreSizeInBits.  This matters for
12599d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // integers with a bitwidth that is not a multiple of 8.
126056c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    ShAmt = TD->getTypeStoreSizeInBits(NTy) -
126156c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner            TD->getTypeStoreSizeInBits(LI->getType()) - Offset;
12629d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  } else {
12639d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    ShAmt = Offset;
12649d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  }
12659d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12669d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // Note: we support negative bitwidths (with shl) which are not defined.
12679d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // We do this to support (f.e.) loads off the end of a structure where
12689d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // only some bits are used.
12699d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (ShAmt > 0 && (unsigned)ShAmt < NTy->getBitWidth())
12707cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif    NV = BinaryOperator::CreateLShr(NV,
12719d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                    ConstantInt::get(NV->getType(),ShAmt),
12729d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                    LI->getName(), LI);
12739d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  else if (ShAmt < 0 && (unsigned)-ShAmt < NTy->getBitWidth())
12747cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif    NV = BinaryOperator::CreateShl(NV,
12759d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                   ConstantInt::get(NV->getType(),-ShAmt),
12769d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                                   LI->getName(), LI);
12779d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12789d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // Finally, unconditionally truncate the integer to the right width.
127956c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner  unsigned LIBitWidth = TD->getTypeSizeInBits(LI->getType());
12809d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (LIBitWidth < NTy->getBitWidth())
12819d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new TruncInst(NV, IntegerType::get(LIBitWidth),
12829d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner                       LI->getName(), LI);
12839d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner
12849d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  // If the result is an integer, this is a trunc or bitcast.
12859d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  if (isa<IntegerType>(LI->getType())) {
12869d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Should be done.
12879d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  } else if (LI->getType()->isFloatingPoint()) {
12889d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Just do a bitcast, we know the sizes match up.
12899d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new BitCastInst(NV, LI->getType(), LI->getName(), LI);
12909d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  } else {
12919d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    // Otherwise must be a pointer.
12929d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner    NV = new IntToPtrInst(NV, LI->getType(), LI->getName(), LI);
1293800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
12949d34c4d678cfc836a59a114b7b2cf91e9dd5eac4Chris Lattner  assert(NV->getType() == LI->getType() && "Didn't convert right?");
1295800de31776356910eb877e71df9f32b0a6215324Chris Lattner  return NV;
1296800de31776356910eb877e71df9f32b0a6215324Chris Lattner}
1297800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1298800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1299800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// ConvertUsesOfStoreToScalar - Convert the specified store to a load+store
1300800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// pair of the new alloca directly, returning the value that should be stored
1301800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// to the alloca.  This happens when we are converting an "integer union" to a
1302800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// single integer scalar, or when we are converting a "vector union" to a
1303800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// vector with insert/extractelement instructions.
1304800de31776356910eb877e71df9f32b0a6215324Chris Lattner///
1305800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// Offset is an offset from the original alloca, in bits that need to be
1306800de31776356910eb877e71df9f32b0a6215324Chris Lattner/// shifted to the right.  By the end of this, there should be no uses of Ptr.
1307800de31776356910eb877e71df9f32b0a6215324Chris LattnerValue *SROA::ConvertUsesOfStoreToScalar(StoreInst *SI, AllocaInst *NewAI,
1308800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                        unsigned Offset) {
1309800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1310800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // Convert the stored type to the actual type, shift it left to insert
1311800de31776356910eb877e71df9f32b0a6215324Chris Lattner  // then 'or' into place.
1312800de31776356910eb877e71df9f32b0a6215324Chris Lattner  Value *SV = SI->getOperand(0);
1313800de31776356910eb877e71df9f32b0a6215324Chris Lattner  const Type *AllocaType = NewAI->getType()->getElementType();
1314800de31776356910eb877e71df9f32b0a6215324Chris Lattner  if (SV->getType() == AllocaType && Offset == 0) {
1315800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // All is well.
1316800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (const VectorType *PTy = dyn_cast<VectorType>(AllocaType)) {
1317800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI);
1318800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1319800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the result alloca is a vector type, this is either an element
1320800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // access or a bitcast to another vector type.
1321800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (isa<VectorType>(SV->getType())) {
1322800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, AllocaType, SV->getName(), SI);
1323800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1324800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // Must be an element insertion.
132556c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      unsigned Elt = Offset/TD->getABITypeSizeInBits(PTy->getElementType());
1326051a950000e21935165db56695e35bade668193bGabor Greif      SV = InsertElementInst::Create(Old, SV,
1327051a950000e21935165db56695e35bade668193bGabor Greif                                     ConstantInt::get(Type::Int32Ty, Elt),
1328051a950000e21935165db56695e35bade668193bGabor Greif                                     "tmp", SI);
1329800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1330800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else if (isa<PointerType>(AllocaType)) {
1331800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If the alloca type is a pointer, then all the elements must be
1332800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // pointers.
1333800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType() != AllocaType)
1334800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, AllocaType, SV->getName(), SI);
1335800de31776356910eb877e71df9f32b0a6215324Chris Lattner  } else {
1336800de31776356910eb877e71df9f32b0a6215324Chris Lattner    Value *Old = new LoadInst(NewAI, NewAI->getName()+".in", SI);
1337800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1338800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If SV is a float, convert it to the appropriate integer type.
1339800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If it is a pointer, do the same, and also handle ptr->ptr casts
1340800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // here.
134156c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    unsigned SrcWidth = TD->getTypeSizeInBits(SV->getType());
134256c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    unsigned DestWidth = TD->getTypeSizeInBits(AllocaType);
134356c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    unsigned SrcStoreWidth = TD->getTypeStoreSizeInBits(SV->getType());
134456c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    unsigned DestStoreWidth = TD->getTypeStoreSizeInBits(AllocaType);
1345800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType()->isFloatingPoint())
1346800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new BitCastInst(SV, IntegerType::get(SrcWidth),
1347800de31776356910eb877e71df9f32b0a6215324Chris Lattner                           SV->getName(), SI);
1348800de31776356910eb877e71df9f32b0a6215324Chris Lattner    else if (isa<PointerType>(SV->getType()))
134956c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner      SV = new PtrToIntInst(SV, TD->getIntPtrType(), SV->getName(), SI);
1350800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1351800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Always zero extend the value if needed.
1352800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SV->getType() != AllocaType)
1353800de31776356910eb877e71df9f32b0a6215324Chris Lattner      SV = new ZExtInst(SV, AllocaType, SV->getName(), SI);
1354800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1355800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // If this is a big-endian system and the store is narrower than the
1356800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // full alloca type, we need to do a shift to get the right bits.
1357800de31776356910eb877e71df9f32b0a6215324Chris Lattner    int ShAmt = 0;
135856c3852fb46b7754ad89b998b5968cff0c3937eeChris Lattner    if (TD->isBigEndian()) {
1359800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // On big-endian machines, the lowest bit is stored at the bit offset
1360800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // from the pointer given by getTypeStoreSizeInBits.  This matters for
1361800de31776356910eb877e71df9f32b0a6215324Chris Lattner      // integers with a bitwidth that is not a multiple of 8.
1362800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = DestStoreWidth - SrcStoreWidth - Offset;
1363800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else {
1364800de31776356910eb877e71df9f32b0a6215324Chris Lattner      ShAmt = Offset;
1365800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1366800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1367800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Note: we support negative bitwidths (with shr) which are not defined.
1368800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // We do this to support (f.e.) stores off the end of a structure where
1369800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // only some bits in the structure are set.
1370800de31776356910eb877e71df9f32b0a6215324Chris Lattner    APInt Mask(APInt::getLowBitsSet(DestWidth, SrcWidth));
1371800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (ShAmt > 0 && (unsigned)ShAmt < DestWidth) {
13727cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      SV = BinaryOperator::CreateShl(SV,
1373800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     ConstantInt::get(SV->getType(), ShAmt),
1374800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                     SV->getName(), SI);
1375800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Mask <<= ShAmt;
1376800de31776356910eb877e71df9f32b0a6215324Chris Lattner    } else if (ShAmt < 0 && (unsigned)-ShAmt < DestWidth) {
13777cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      SV = BinaryOperator::CreateLShr(SV,
1378800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      ConstantInt::get(SV->getType(),-ShAmt),
1379800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      SV->getName(), SI);
1380800de31776356910eb877e71df9f32b0a6215324Chris Lattner      Mask = Mask.lshr(ShAmt);
1381800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1382800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1383800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // Mask out the bits we are about to insert from the old value, and or
1384800de31776356910eb877e71df9f32b0a6215324Chris Lattner    // in the new bits.
1385800de31776356910eb877e71df9f32b0a6215324Chris Lattner    if (SrcWidth != DestWidth) {
1386800de31776356910eb877e71df9f32b0a6215324Chris Lattner      assert(DestWidth > SrcWidth);
13877cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      Old = BinaryOperator::CreateAnd(Old, ConstantInt::get(~Mask),
1388800de31776356910eb877e71df9f32b0a6215324Chris Lattner                                      Old->getName()+".mask", SI);
13897cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      SV = BinaryOperator::CreateOr(Old, SV, SV->getName()+".ins", SI);
1390800de31776356910eb877e71df9f32b0a6215324Chris Lattner    }
1391800de31776356910eb877e71df9f32b0a6215324Chris Lattner  }
1392800de31776356910eb877e71df9f32b0a6215324Chris Lattner  return SV;
1393800de31776356910eb877e71df9f32b0a6215324Chris Lattner}
1394800de31776356910eb877e71df9f32b0a6215324Chris Lattner
1395800de31776356910eb877e71df9f32b0a6215324Chris Lattner
139679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
139779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// PointsToConstantGlobal - Return true if V (possibly indirectly) points to
139879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// some part of a constant global variable.  This intentionally only accepts
139979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// constant expressions because we don't can't rewrite arbitrary instructions.
140079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattnerstatic bool PointsToConstantGlobal(Value *V) {
140179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
140279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    return GV->isConstant();
140379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
140479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (CE->getOpcode() == Instruction::BitCast ||
140579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        CE->getOpcode() == Instruction::GetElementPtr)
140679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return PointsToConstantGlobal(CE->getOperand(0));
140779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return false;
140879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
140979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
141079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// isOnlyCopiedFromConstantGlobal - Recursively walk the uses of a (derived)
141179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// pointer to an alloca.  Ignore any reads of the pointer, return false if we
141279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// see any stores or other unknown uses.  If we see pointer arithmetic, keep
141379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// track of whether it moves the pointer (with isOffset) but otherwise traverse
141479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// the uses.  If we see a memcpy/memmove that targets an unoffseted pointer to
141579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// the alloca, and if the source pointer is a pointer to a constant  global, we
141679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// can optimize this.
141779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattnerstatic bool isOnlyCopiedFromConstantGlobal(Value *V, Instruction *&TheCopy,
141879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner                                           bool isOffset) {
141979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {
142079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (isa<LoadInst>(*UI)) {
142179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // Ignore loads, they are always ok.
142279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
142379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
142479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (BitCastInst *BCI = dyn_cast<BitCastInst>(*UI)) {
142579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // If uses of the bitcast are ok, we are ok.
142679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      if (!isOnlyCopiedFromConstantGlobal(BCI, TheCopy, isOffset))
142779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        return false;
142879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
142979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
143079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(*UI)) {
143179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // If the GEP has all zero indices, it doesn't offset the pointer.  If it
143279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      // doesn't, it does.
143379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      if (!isOnlyCopiedFromConstantGlobal(GEP, TheCopy,
143479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner                                         isOffset || !GEP->hasAllZeroIndices()))
143579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner        return false;
143679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      continue;
143779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    }
143879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
143979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If this is isn't our memcpy/memmove, reject it as something we can't
144079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // handle.
144179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (!isa<MemCpyInst>(*UI) && !isa<MemMoveInst>(*UI))
144279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return false;
144379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
144479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If we already have seen a copy, reject the second one.
144579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (TheCopy) return false;
144679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
144779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the pointer has been offset from the start of the alloca, we can't
144879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // safely handle this.
144979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (isOffset) return false;
145079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
145179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the memintrinsic isn't using the alloca as the dest, reject it.
145279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (UI.getOperandNo() != 1) return false;
145379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
145479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    MemIntrinsic *MI = cast<MemIntrinsic>(*UI);
145579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
145679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // If the source of the memcpy/move is not a constant global, reject it.
145779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    if (!PointsToConstantGlobal(MI->getOperand(2)))
145879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner      return false;
145979b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
146079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    // Otherwise, the transform is safe.  Remember the copy instruction.
146179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    TheCopy = MI;
146279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  }
146379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return true;
146479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
146579b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner
146679b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// isOnlyCopiedFromConstantGlobal - Return true if the specified alloca is only
146779b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// modified by a copy from a constant global.  If we can prove this, we can
146879b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner/// replace any uses of the alloca with uses of the global directly.
146979b3bd395dc3303cde65e18e0524ed2f70268c99Chris LattnerInstruction *SROA::isOnlyCopiedFromConstantGlobal(AllocationInst *AI) {
147079b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  Instruction *TheCopy = 0;
147179b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  if (::isOnlyCopiedFromConstantGlobal(AI, TheCopy, false))
147279b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner    return TheCopy;
147379b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner  return 0;
147479b3bd395dc3303cde65e18e0524ed2f70268c99Chris Lattner}
1475