~louis/ubuntu/trusty/clamav/lp799623_fix_logrotate

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Scott Kitterman
  • Date: 2010-03-12 11:30:04 UTC
  • mfrom: (0.41.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20100312113004-b0fop4bkycszdd0z
Tags: 0.96~rc1+dfsg-0ubuntu1
* New upstream RC - FFE (LP: #537636):
  - Add OfficialDatabaseOnly option to clamav-base.postinst.in
  - Add LocalSocketGroup option to clamav-base.postinst.in
  - Add LocalSocketMode option to clamav-base.postinst.in
  - Add CrossFilesystems option to clamav-base.postinst.in
  - Add ClamukoScannerCount option to clamav-base.postinst.in
  - Add BytecodeSecurity opiton to clamav-base.postinst.in
  - Add DetectionStatsHostID option to clamav-freshclam.postinst.in
  - Add Bytecode option to clamav-freshclam.postinst.in
  - Add MilterSocketGroup option to clamav-milter.postinst.in
  - Add MilterSocketMode option to clamav-milter.postinst.in
  - Add ReportHostname option to clamav-milter.postinst.in
  - Bump libclamav SO version to 6.1.0 in libclamav6.install
  - Drop clamdmon from clamav.examples (no longer shipped by upstream)
  - Drop libclamav.a from libclamav-dev.install (not built by upstream)
  - Update SO version for lintian override for libclamav6
  - Add new Bytecode Testing Tool, usr/bin/clambc, to clamav.install
  - Add build-depends on python and python-setuptools for new test suite
  - Update debian/copyright for the embedded copy of llvm (using the system
    llvm is not currently feasible)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//===-- ArgumentPromotion.cpp - Promote by-reference arguments ------------===//
 
2
//
 
3
//                     The LLVM Compiler Infrastructure
 
4
//
 
5
// This file is distributed under the University of Illinois Open Source
 
6
// License. See LICENSE.TXT for details.
 
7
//
 
8
//===----------------------------------------------------------------------===//
 
9
//
 
10
// This pass promotes "by reference" arguments to be "by value" arguments.  In
 
11
// practice, this means looking for internal functions that have pointer
 
12
// arguments.  If it can prove, through the use of alias analysis, that an
 
13
// argument is *only* loaded, then it can pass the value into the function
 
14
// instead of the address of the value.  This can cause recursive simplification
 
15
// of code and lead to the elimination of allocas (especially in C++ template
 
16
// code like the STL).
 
17
//
 
18
// This pass also handles aggregate arguments that are passed into a function,
 
19
// scalarizing them if the elements of the aggregate are only loaded.  Note that
 
20
// by default it refuses to scalarize aggregates which would require passing in
 
21
// more than three operands to the function, because passing thousands of
 
22
// operands for a large array or structure is unprofitable! This limit can be
 
23
// configured or disabled, however.
 
24
//
 
25
// Note that this transformation could also be done for arguments that are only
 
26
// stored to (returning the value instead), but does not currently.  This case
 
27
// would be best handled when and if LLVM begins supporting multiple return
 
28
// values from functions.
 
29
//
 
30
//===----------------------------------------------------------------------===//
 
31
 
 
32
#define DEBUG_TYPE "argpromotion"
 
33
#include "llvm/Transforms/IPO.h"
 
34
#include "llvm/Constants.h"
 
35
#include "llvm/DerivedTypes.h"
 
36
#include "llvm/Module.h"
 
37
#include "llvm/CallGraphSCCPass.h"
 
38
#include "llvm/Instructions.h"
 
39
#include "llvm/LLVMContext.h"
 
40
#include "llvm/Analysis/AliasAnalysis.h"
 
41
#include "llvm/Analysis/CallGraph.h"
 
42
#include "llvm/Target/TargetData.h"
 
43
#include "llvm/Support/CallSite.h"
 
44
#include "llvm/Support/CFG.h"
 
45
#include "llvm/Support/Debug.h"
 
46
#include "llvm/Support/raw_ostream.h"
 
47
#include "llvm/ADT/DepthFirstIterator.h"
 
48
#include "llvm/ADT/Statistic.h"
 
49
#include "llvm/ADT/StringExtras.h"
 
50
#include <set>
 
51
using namespace llvm;
 
52
 
 
53
STATISTIC(NumArgumentsPromoted , "Number of pointer arguments promoted");
 
54
STATISTIC(NumAggregatesPromoted, "Number of aggregate arguments promoted");
 
55
STATISTIC(NumByValArgsPromoted , "Number of byval arguments promoted");
 
56
STATISTIC(NumArgumentsDead     , "Number of dead pointer args eliminated");
 
57
 
 
58
namespace {
 
59
  /// ArgPromotion - The 'by reference' to 'by value' argument promotion pass.
 
60
  ///
 
61
  struct ArgPromotion : public CallGraphSCCPass {
 
62
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
 
63
      AU.addRequired<AliasAnalysis>();
 
64
      CallGraphSCCPass::getAnalysisUsage(AU);
 
65
    }
 
66
 
 
67
    virtual bool runOnSCC(std::vector<CallGraphNode *> &SCC);
 
68
    static char ID; // Pass identification, replacement for typeid
 
69
    explicit ArgPromotion(unsigned maxElements = 3)
 
70
      : CallGraphSCCPass(&ID), maxElements(maxElements) {}
 
71
 
 
72
    /// A vector used to hold the indices of a single GEP instruction
 
73
    typedef std::vector<uint64_t> IndicesVector;
 
74
 
 
75
  private:
 
76
    CallGraphNode *PromoteArguments(CallGraphNode *CGN);
 
77
    bool isSafeToPromoteArgument(Argument *Arg, bool isByVal) const;
 
78
    CallGraphNode *DoPromotion(Function *F,
 
79
                               SmallPtrSet<Argument*, 8> &ArgsToPromote,
 
80
                               SmallPtrSet<Argument*, 8> &ByValArgsToTransform);
 
81
    /// The maximum number of elements to expand, or 0 for unlimited.
 
82
    unsigned maxElements;
 
83
  };
 
84
}
 
85
 
 
86
char ArgPromotion::ID = 0;
 
87
static RegisterPass<ArgPromotion>
 
88
X("argpromotion", "Promote 'by reference' arguments to scalars");
 
89
 
 
90
Pass *llvm::createArgumentPromotionPass(unsigned maxElements) {
 
91
  return new ArgPromotion(maxElements);
 
92
}
 
93
 
 
94
bool ArgPromotion::runOnSCC(std::vector<CallGraphNode *> &SCC) {
 
95
  bool Changed = false, LocalChange;
 
96
 
 
97
  do {  // Iterate until we stop promoting from this SCC.
 
98
    LocalChange = false;
 
99
    // Attempt to promote arguments from all functions in this SCC.
 
100
    for (unsigned i = 0, e = SCC.size(); i != e; ++i)
 
101
      if (CallGraphNode *CGN = PromoteArguments(SCC[i])) {
 
102
        LocalChange = true;
 
103
        SCC[i] = CGN;
 
104
      }
 
105
    Changed |= LocalChange;               // Remember that we changed something.
 
106
  } while (LocalChange);
 
107
 
 
108
  return Changed;
 
109
}
 
110
 
 
111
/// PromoteArguments - This method checks the specified function to see if there
 
112
/// are any promotable arguments and if it is safe to promote the function (for
 
113
/// example, all callers are direct).  If safe to promote some arguments, it
 
114
/// calls the DoPromotion method.
 
115
///
 
116
CallGraphNode *ArgPromotion::PromoteArguments(CallGraphNode *CGN) {
 
117
  Function *F = CGN->getFunction();
 
118
 
 
119
  // Make sure that it is local to this module.
 
120
  if (!F || !F->hasLocalLinkage()) return 0;
 
121
 
 
122
  // First check: see if there are any pointer arguments!  If not, quick exit.
 
123
  SmallVector<std::pair<Argument*, unsigned>, 16> PointerArgs;
 
124
  unsigned ArgNo = 0;
 
125
  for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end();
 
126
       I != E; ++I, ++ArgNo)
 
127
    if (I->getType()->isPointerTy())
 
128
      PointerArgs.push_back(std::pair<Argument*, unsigned>(I, ArgNo));
 
129
  if (PointerArgs.empty()) return 0;
 
130
 
 
131
  // Second check: make sure that all callers are direct callers.  We can't
 
132
  // transform functions that have indirect callers.
 
133
  if (F->hasAddressTaken())
 
134
    return 0;
 
135
 
 
136
  // Check to see which arguments are promotable.  If an argument is promotable,
 
137
  // add it to ArgsToPromote.
 
138
  SmallPtrSet<Argument*, 8> ArgsToPromote;
 
139
  SmallPtrSet<Argument*, 8> ByValArgsToTransform;
 
140
  for (unsigned i = 0; i != PointerArgs.size(); ++i) {
 
141
    bool isByVal = F->paramHasAttr(PointerArgs[i].second+1, Attribute::ByVal);
 
142
 
 
143
    // If this is a byval argument, and if the aggregate type is small, just
 
144
    // pass the elements, which is always safe.
 
145
    Argument *PtrArg = PointerArgs[i].first;
 
146
    if (isByVal) {
 
147
      const Type *AgTy = cast<PointerType>(PtrArg->getType())->getElementType();
 
148
      if (const StructType *STy = dyn_cast<StructType>(AgTy)) {
 
149
        if (maxElements > 0 && STy->getNumElements() > maxElements) {
 
150
          DEBUG(dbgs() << "argpromotion disable promoting argument '"
 
151
                << PtrArg->getName() << "' because it would require adding more"
 
152
                << " than " << maxElements << " arguments to the function.\n");
 
153
        } else {
 
154
          // If all the elements are single-value types, we can promote it.
 
155
          bool AllSimple = true;
 
156
          for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
 
157
            if (!STy->getElementType(i)->isSingleValueType()) {
 
158
              AllSimple = false;
 
159
              break;
 
160
            }
 
161
 
 
162
          // Safe to transform, don't even bother trying to "promote" it.
 
163
          // Passing the elements as a scalar will allow scalarrepl to hack on
 
164
          // the new alloca we introduce.
 
165
          if (AllSimple) {
 
166
            ByValArgsToTransform.insert(PtrArg);
 
167
            continue;
 
168
          }
 
169
        }
 
170
      }
 
171
    }
 
172
 
 
173
    // Otherwise, see if we can promote the pointer to its value.
 
174
    if (isSafeToPromoteArgument(PtrArg, isByVal))
 
175
      ArgsToPromote.insert(PtrArg);
 
176
  }
 
177
 
 
178
  // No promotable pointer arguments.
 
179
  if (ArgsToPromote.empty() && ByValArgsToTransform.empty()) 
 
180
    return 0;
 
181
 
 
182
  return DoPromotion(F, ArgsToPromote, ByValArgsToTransform);
 
183
}
 
184
 
 
185
/// IsAlwaysValidPointer - Return true if the specified pointer is always legal
 
186
/// to load.
 
187
static bool IsAlwaysValidPointer(Value *V) {
 
188
  if (isa<AllocaInst>(V) || isa<GlobalVariable>(V)) return true;
 
189
  if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V))
 
190
    return IsAlwaysValidPointer(GEP->getOperand(0));
 
191
  if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
 
192
    if (CE->getOpcode() == Instruction::GetElementPtr)
 
193
      return IsAlwaysValidPointer(CE->getOperand(0));
 
194
 
 
195
  return false;
 
196
}
 
197
 
 
198
/// AllCalleesPassInValidPointerForArgument - Return true if we can prove that
 
199
/// all callees pass in a valid pointer for the specified function argument.
 
200
static bool AllCalleesPassInValidPointerForArgument(Argument *Arg) {
 
201
  Function *Callee = Arg->getParent();
 
202
 
 
203
  unsigned ArgNo = std::distance(Callee->arg_begin(),
 
204
                                 Function::arg_iterator(Arg));
 
205
 
 
206
  // Look at all call sites of the function.  At this pointer we know we only
 
207
  // have direct callees.
 
208
  for (Value::use_iterator UI = Callee->use_begin(), E = Callee->use_end();
 
209
       UI != E; ++UI) {
 
210
    CallSite CS = CallSite::get(*UI);
 
211
    assert(CS.getInstruction() && "Should only have direct calls!");
 
212
 
 
213
    if (!IsAlwaysValidPointer(CS.getArgument(ArgNo)))
 
214
      return false;
 
215
  }
 
216
  return true;
 
217
}
 
218
 
 
219
/// Returns true if Prefix is a prefix of longer. That means, Longer has a size
 
220
/// that is greater than or equal to the size of prefix, and each of the
 
221
/// elements in Prefix is the same as the corresponding elements in Longer.
 
222
///
 
223
/// This means it also returns true when Prefix and Longer are equal!
 
224
static bool IsPrefix(const ArgPromotion::IndicesVector &Prefix,
 
225
                     const ArgPromotion::IndicesVector &Longer) {
 
226
  if (Prefix.size() > Longer.size())
 
227
    return false;
 
228
  for (unsigned i = 0, e = Prefix.size(); i != e; ++i)
 
229
    if (Prefix[i] != Longer[i])
 
230
      return false;
 
231
  return true;
 
232
}
 
233
 
 
234
 
 
235
/// Checks if Indices, or a prefix of Indices, is in Set.
 
236
static bool PrefixIn(const ArgPromotion::IndicesVector &Indices,
 
237
                     std::set<ArgPromotion::IndicesVector> &Set) {
 
238
    std::set<ArgPromotion::IndicesVector>::iterator Low;
 
239
    Low = Set.upper_bound(Indices);
 
240
    if (Low != Set.begin())
 
241
      Low--;
 
242
    // Low is now the last element smaller than or equal to Indices. This means
 
243
    // it points to a prefix of Indices (possibly Indices itself), if such
 
244
    // prefix exists.
 
245
    //
 
246
    // This load is safe if any prefix of its operands is safe to load.
 
247
    return Low != Set.end() && IsPrefix(*Low, Indices);
 
248
}
 
249
 
 
250
/// Mark the given indices (ToMark) as safe in the given set of indices
 
251
/// (Safe). Marking safe usually means adding ToMark to Safe. However, if there
 
252
/// is already a prefix of Indices in Safe, Indices are implicitely marked safe
 
253
/// already. Furthermore, any indices that Indices is itself a prefix of, are
 
254
/// removed from Safe (since they are implicitely safe because of Indices now).
 
255
static void MarkIndicesSafe(const ArgPromotion::IndicesVector &ToMark,
 
256
                            std::set<ArgPromotion::IndicesVector> &Safe) {
 
257
  std::set<ArgPromotion::IndicesVector>::iterator Low;
 
258
  Low = Safe.upper_bound(ToMark);
 
259
  // Guard against the case where Safe is empty
 
260
  if (Low != Safe.begin())
 
261
    Low--;
 
262
  // Low is now the last element smaller than or equal to Indices. This
 
263
  // means it points to a prefix of Indices (possibly Indices itself), if
 
264
  // such prefix exists.
 
265
  if (Low != Safe.end()) {
 
266
    if (IsPrefix(*Low, ToMark))
 
267
      // If there is already a prefix of these indices (or exactly these
 
268
      // indices) marked a safe, don't bother adding these indices
 
269
      return;
 
270
 
 
271
    // Increment Low, so we can use it as a "insert before" hint
 
272
    ++Low;
 
273
  }
 
274
  // Insert
 
275
  Low = Safe.insert(Low, ToMark);
 
276
  ++Low;
 
277
  // If there we're a prefix of longer index list(s), remove those
 
278
  std::set<ArgPromotion::IndicesVector>::iterator End = Safe.end();
 
279
  while (Low != End && IsPrefix(ToMark, *Low)) {
 
280
    std::set<ArgPromotion::IndicesVector>::iterator Remove = Low;
 
281
    ++Low;
 
282
    Safe.erase(Remove);
 
283
  }
 
284
}
 
285
 
 
286
/// isSafeToPromoteArgument - As you might guess from the name of this method,
 
287
/// it checks to see if it is both safe and useful to promote the argument.
 
288
/// This method limits promotion of aggregates to only promote up to three
 
289
/// elements of the aggregate in order to avoid exploding the number of
 
290
/// arguments passed in.
 
291
bool ArgPromotion::isSafeToPromoteArgument(Argument *Arg, bool isByVal) const {
 
292
  typedef std::set<IndicesVector> GEPIndicesSet;
 
293
 
 
294
  // Quick exit for unused arguments
 
295
  if (Arg->use_empty())
 
296
    return true;
 
297
 
 
298
  // We can only promote this argument if all of the uses are loads, or are GEP
 
299
  // instructions (with constant indices) that are subsequently loaded.
 
300
  //
 
301
  // Promoting the argument causes it to be loaded in the caller
 
302
  // unconditionally. This is only safe if we can prove that either the load
 
303
  // would have happened in the callee anyway (ie, there is a load in the entry
 
304
  // block) or the pointer passed in at every call site is guaranteed to be
 
305
  // valid.
 
306
  // In the former case, invalid loads can happen, but would have happened
 
307
  // anyway, in the latter case, invalid loads won't happen. This prevents us
 
308
  // from introducing an invalid load that wouldn't have happened in the
 
309
  // original code.
 
310
  //
 
311
  // This set will contain all sets of indices that are loaded in the entry
 
312
  // block, and thus are safe to unconditionally load in the caller.
 
313
  GEPIndicesSet SafeToUnconditionallyLoad;
 
314
 
 
315
  // This set contains all the sets of indices that we are planning to promote.
 
316
  // This makes it possible to limit the number of arguments added.
 
317
  GEPIndicesSet ToPromote;
 
318
 
 
319
  // If the pointer is always valid, any load with first index 0 is valid.
 
320
  if (isByVal || AllCalleesPassInValidPointerForArgument(Arg))
 
321
    SafeToUnconditionallyLoad.insert(IndicesVector(1, 0));
 
322
 
 
323
  // First, iterate the entry block and mark loads of (geps of) arguments as
 
324
  // safe.
 
325
  BasicBlock *EntryBlock = Arg->getParent()->begin();
 
326
  // Declare this here so we can reuse it
 
327
  IndicesVector Indices;
 
328
  for (BasicBlock::iterator I = EntryBlock->begin(), E = EntryBlock->end();
 
329
       I != E; ++I)
 
330
    if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
 
331
      Value *V = LI->getPointerOperand();
 
332
      if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V)) {
 
333
        V = GEP->getPointerOperand();
 
334
        if (V == Arg) {
 
335
          // This load actually loads (part of) Arg? Check the indices then.
 
336
          Indices.reserve(GEP->getNumIndices());
 
337
          for (User::op_iterator II = GEP->idx_begin(), IE = GEP->idx_end();
 
338
               II != IE; ++II)
 
339
            if (ConstantInt *CI = dyn_cast<ConstantInt>(*II))
 
340
              Indices.push_back(CI->getSExtValue());
 
341
            else
 
342
              // We found a non-constant GEP index for this argument? Bail out
 
343
              // right away, can't promote this argument at all.
 
344
              return false;
 
345
 
 
346
          // Indices checked out, mark them as safe
 
347
          MarkIndicesSafe(Indices, SafeToUnconditionallyLoad);
 
348
          Indices.clear();
 
349
        }
 
350
      } else if (V == Arg) {
 
351
        // Direct loads are equivalent to a GEP with a single 0 index.
 
352
        MarkIndicesSafe(IndicesVector(1, 0), SafeToUnconditionallyLoad);
 
353
      }
 
354
    }
 
355
 
 
356
  // Now, iterate all uses of the argument to see if there are any uses that are
 
357
  // not (GEP+)loads, or any (GEP+)loads that are not safe to promote.
 
358
  SmallVector<LoadInst*, 16> Loads;
 
359
  IndicesVector Operands;
 
360
  for (Value::use_iterator UI = Arg->use_begin(), E = Arg->use_end();
 
361
       UI != E; ++UI) {
 
362
    Operands.clear();
 
363
    if (LoadInst *LI = dyn_cast<LoadInst>(*UI)) {
 
364
      if (LI->isVolatile()) return false;  // Don't hack volatile loads
 
365
      Loads.push_back(LI);
 
366
      // Direct loads are equivalent to a GEP with a zero index and then a load.
 
367
      Operands.push_back(0);
 
368
    } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(*UI)) {
 
369
      if (GEP->use_empty()) {
 
370
        // Dead GEP's cause trouble later.  Just remove them if we run into
 
371
        // them.
 
372
        getAnalysis<AliasAnalysis>().deleteValue(GEP);
 
373
        GEP->eraseFromParent();
 
374
        // TODO: This runs the above loop over and over again for dead GEPS
 
375
        // Couldn't we just do increment the UI iterator earlier and erase the
 
376
        // use?
 
377
        return isSafeToPromoteArgument(Arg, isByVal);
 
378
      }
 
379
 
 
380
      // Ensure that all of the indices are constants.
 
381
      for (User::op_iterator i = GEP->idx_begin(), e = GEP->idx_end();
 
382
        i != e; ++i)
 
383
        if (ConstantInt *C = dyn_cast<ConstantInt>(*i))
 
384
          Operands.push_back(C->getSExtValue());
 
385
        else
 
386
          return false;  // Not a constant operand GEP!
 
387
 
 
388
      // Ensure that the only users of the GEP are load instructions.
 
389
      for (Value::use_iterator UI = GEP->use_begin(), E = GEP->use_end();
 
390
           UI != E; ++UI)
 
391
        if (LoadInst *LI = dyn_cast<LoadInst>(*UI)) {
 
392
          if (LI->isVolatile()) return false;  // Don't hack volatile loads
 
393
          Loads.push_back(LI);
 
394
        } else {
 
395
          // Other uses than load?
 
396
          return false;
 
397
        }
 
398
    } else {
 
399
      return false;  // Not a load or a GEP.
 
400
    }
 
401
 
 
402
    // Now, see if it is safe to promote this load / loads of this GEP. Loading
 
403
    // is safe if Operands, or a prefix of Operands, is marked as safe.
 
404
    if (!PrefixIn(Operands, SafeToUnconditionallyLoad))
 
405
      return false;
 
406
 
 
407
    // See if we are already promoting a load with these indices. If not, check
 
408
    // to make sure that we aren't promoting too many elements.  If so, nothing
 
409
    // to do.
 
410
    if (ToPromote.find(Operands) == ToPromote.end()) {
 
411
      if (maxElements > 0 && ToPromote.size() == maxElements) {
 
412
        DEBUG(dbgs() << "argpromotion not promoting argument '"
 
413
              << Arg->getName() << "' because it would require adding more "
 
414
              << "than " << maxElements << " arguments to the function.\n");
 
415
        // We limit aggregate promotion to only promoting up to a fixed number
 
416
        // of elements of the aggregate.
 
417
        return false;
 
418
      }
 
419
      ToPromote.insert(Operands);
 
420
    }
 
421
  }
 
422
 
 
423
  if (Loads.empty()) return true;  // No users, this is a dead argument.
 
424
 
 
425
  // Okay, now we know that the argument is only used by load instructions and
 
426
  // it is safe to unconditionally perform all of them. Use alias analysis to
 
427
  // check to see if the pointer is guaranteed to not be modified from entry of
 
428
  // the function to each of the load instructions.
 
429
 
 
430
  // Because there could be several/many load instructions, remember which
 
431
  // blocks we know to be transparent to the load.
 
432
  SmallPtrSet<BasicBlock*, 16> TranspBlocks;
 
433
 
 
434
  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
 
435
  TargetData *TD = getAnalysisIfAvailable<TargetData>();
 
436
  if (!TD) return false; // Without TargetData, assume the worst.
 
437
 
 
438
  for (unsigned i = 0, e = Loads.size(); i != e; ++i) {
 
439
    // Check to see if the load is invalidated from the start of the block to
 
440
    // the load itself.
 
441
    LoadInst *Load = Loads[i];
 
442
    BasicBlock *BB = Load->getParent();
 
443
 
 
444
    const PointerType *LoadTy =
 
445
      cast<PointerType>(Load->getPointerOperand()->getType());
 
446
    unsigned LoadSize =(unsigned)TD->getTypeStoreSize(LoadTy->getElementType());
 
447
 
 
448
    if (AA.canInstructionRangeModify(BB->front(), *Load, Arg, LoadSize))
 
449
      return false;  // Pointer is invalidated!
 
450
 
 
451
    // Now check every path from the entry block to the load for transparency.
 
452
    // To do this, we perform a depth first search on the inverse CFG from the
 
453
    // loading block.
 
454
    for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
 
455
      for (idf_ext_iterator<BasicBlock*, SmallPtrSet<BasicBlock*, 16> >
 
456
             I = idf_ext_begin(*PI, TranspBlocks),
 
457
             E = idf_ext_end(*PI, TranspBlocks); I != E; ++I)
 
458
        if (AA.canBasicBlockModify(**I, Arg, LoadSize))
 
459
          return false;
 
460
  }
 
461
 
 
462
  // If the path from the entry of the function to each load is free of
 
463
  // instructions that potentially invalidate the load, we can make the
 
464
  // transformation!
 
465
  return true;
 
466
}
 
467
 
 
468
/// DoPromotion - This method actually performs the promotion of the specified
 
469
/// arguments, and returns the new function.  At this point, we know that it's
 
470
/// safe to do so.
 
471
CallGraphNode *ArgPromotion::DoPromotion(Function *F,
 
472
                               SmallPtrSet<Argument*, 8> &ArgsToPromote,
 
473
                              SmallPtrSet<Argument*, 8> &ByValArgsToTransform) {
 
474
 
 
475
  // Start by computing a new prototype for the function, which is the same as
 
476
  // the old function, but has modified arguments.
 
477
  const FunctionType *FTy = F->getFunctionType();
 
478
  std::vector<const Type*> Params;
 
479
 
 
480
  typedef std::set<IndicesVector> ScalarizeTable;
 
481
 
 
482
  // ScalarizedElements - If we are promoting a pointer that has elements
 
483
  // accessed out of it, keep track of which elements are accessed so that we
 
484
  // can add one argument for each.
 
485
  //
 
486
  // Arguments that are directly loaded will have a zero element value here, to
 
487
  // handle cases where there are both a direct load and GEP accesses.
 
488
  //
 
489
  std::map<Argument*, ScalarizeTable> ScalarizedElements;
 
490
 
 
491
  // OriginalLoads - Keep track of a representative load instruction from the
 
492
  // original function so that we can tell the alias analysis implementation
 
493
  // what the new GEP/Load instructions we are inserting look like.
 
494
  std::map<IndicesVector, LoadInst*> OriginalLoads;
 
495
 
 
496
  // Attributes - Keep track of the parameter attributes for the arguments
 
497
  // that we are *not* promoting. For the ones that we do promote, the parameter
 
498
  // attributes are lost
 
499
  SmallVector<AttributeWithIndex, 8> AttributesVec;
 
500
  const AttrListPtr &PAL = F->getAttributes();
 
501
 
 
502
  // Add any return attributes.
 
503
  if (Attributes attrs = PAL.getRetAttributes())
 
504
    AttributesVec.push_back(AttributeWithIndex::get(0, attrs));
 
505
 
 
506
  // First, determine the new argument list
 
507
  unsigned ArgIndex = 1;
 
508
  for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
 
509
       ++I, ++ArgIndex) {
 
510
    if (ByValArgsToTransform.count(I)) {
 
511
      // Simple byval argument? Just add all the struct element types.
 
512
      const Type *AgTy = cast<PointerType>(I->getType())->getElementType();
 
513
      const StructType *STy = cast<StructType>(AgTy);
 
514
      for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i)
 
515
        Params.push_back(STy->getElementType(i));
 
516
      ++NumByValArgsPromoted;
 
517
    } else if (!ArgsToPromote.count(I)) {
 
518
      // Unchanged argument
 
519
      Params.push_back(I->getType());
 
520
      if (Attributes attrs = PAL.getParamAttributes(ArgIndex))
 
521
        AttributesVec.push_back(AttributeWithIndex::get(Params.size(), attrs));
 
522
    } else if (I->use_empty()) {
 
523
      // Dead argument (which are always marked as promotable)
 
524
      ++NumArgumentsDead;
 
525
    } else {
 
526
      // Okay, this is being promoted. This means that the only uses are loads
 
527
      // or GEPs which are only used by loads
 
528
 
 
529
      // In this table, we will track which indices are loaded from the argument
 
530
      // (where direct loads are tracked as no indices).
 
531
      ScalarizeTable &ArgIndices = ScalarizedElements[I];
 
532
      for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E;
 
533
           ++UI) {
 
534
        Instruction *User = cast<Instruction>(*UI);
 
535
        assert(isa<LoadInst>(User) || isa<GetElementPtrInst>(User));
 
536
        IndicesVector Indices;
 
537
        Indices.reserve(User->getNumOperands() - 1);
 
538
        // Since loads will only have a single operand, and GEPs only a single
 
539
        // non-index operand, this will record direct loads without any indices,
 
540
        // and gep+loads with the GEP indices.
 
541
        for (User::op_iterator II = User->op_begin() + 1, IE = User->op_end();
 
542
             II != IE; ++II)
 
543
          Indices.push_back(cast<ConstantInt>(*II)->getSExtValue());
 
544
        // GEPs with a single 0 index can be merged with direct loads
 
545
        if (Indices.size() == 1 && Indices.front() == 0)
 
546
          Indices.clear();
 
547
        ArgIndices.insert(Indices);
 
548
        LoadInst *OrigLoad;
 
549
        if (LoadInst *L = dyn_cast<LoadInst>(User))
 
550
          OrigLoad = L;
 
551
        else
 
552
          // Take any load, we will use it only to update Alias Analysis
 
553
          OrigLoad = cast<LoadInst>(User->use_back());
 
554
        OriginalLoads[Indices] = OrigLoad;
 
555
      }
 
556
 
 
557
      // Add a parameter to the function for each element passed in.
 
558
      for (ScalarizeTable::iterator SI = ArgIndices.begin(),
 
559
             E = ArgIndices.end(); SI != E; ++SI) {
 
560
        // not allowed to dereference ->begin() if size() is 0
 
561
        Params.push_back(GetElementPtrInst::getIndexedType(I->getType(),
 
562
                                                           SI->begin(),
 
563
                                                           SI->end()));
 
564
        assert(Params.back());
 
565
      }
 
566
 
 
567
      if (ArgIndices.size() == 1 && ArgIndices.begin()->empty())
 
568
        ++NumArgumentsPromoted;
 
569
      else
 
570
        ++NumAggregatesPromoted;
 
571
    }
 
572
  }
 
573
 
 
574
  // Add any function attributes.
 
575
  if (Attributes attrs = PAL.getFnAttributes())
 
576
    AttributesVec.push_back(AttributeWithIndex::get(~0, attrs));
 
577
 
 
578
  const Type *RetTy = FTy->getReturnType();
 
579
 
 
580
  // Work around LLVM bug PR56: the CWriter cannot emit varargs functions which
 
581
  // have zero fixed arguments.
 
582
  bool ExtraArgHack = false;
 
583
  if (Params.empty() && FTy->isVarArg()) {
 
584
    ExtraArgHack = true;
 
585
    Params.push_back(Type::getInt32Ty(F->getContext()));
 
586
  }
 
587
 
 
588
  // Construct the new function type using the new arguments.
 
589
  FunctionType *NFTy = FunctionType::get(RetTy, Params, FTy->isVarArg());
 
590
 
 
591
  // Create the new function body and insert it into the module.
 
592
  Function *NF = Function::Create(NFTy, F->getLinkage(), F->getName());
 
593
  NF->copyAttributesFrom(F);
 
594
 
 
595
  
 
596
  DEBUG(dbgs() << "ARG PROMOTION:  Promoting to:" << *NF << "\n"
 
597
        << "From: " << *F);
 
598
  
 
599
  // Recompute the parameter attributes list based on the new arguments for
 
600
  // the function.
 
601
  NF->setAttributes(AttrListPtr::get(AttributesVec.begin(),
 
602
                                     AttributesVec.end()));
 
603
  AttributesVec.clear();
 
604
 
 
605
  F->getParent()->getFunctionList().insert(F, NF);
 
606
  NF->takeName(F);
 
607
 
 
608
  // Get the alias analysis information that we need to update to reflect our
 
609
  // changes.
 
610
  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
 
611
 
 
612
  // Get the callgraph information that we need to update to reflect our
 
613
  // changes.
 
614
  CallGraph &CG = getAnalysis<CallGraph>();
 
615
  
 
616
  // Get a new callgraph node for NF.
 
617
  CallGraphNode *NF_CGN = CG.getOrInsertFunction(NF);
 
618
  
 
619
 
 
620
  // Loop over all of the callers of the function, transforming the call sites
 
621
  // to pass in the loaded pointers.
 
622
  //
 
623
  SmallVector<Value*, 16> Args;
 
624
  while (!F->use_empty()) {
 
625
    CallSite CS = CallSite::get(F->use_back());
 
626
    Instruction *Call = CS.getInstruction();
 
627
    const AttrListPtr &CallPAL = CS.getAttributes();
 
628
 
 
629
    // Add any return attributes.
 
630
    if (Attributes attrs = CallPAL.getRetAttributes())
 
631
      AttributesVec.push_back(AttributeWithIndex::get(0, attrs));
 
632
 
 
633
    // Loop over the operands, inserting GEP and loads in the caller as
 
634
    // appropriate.
 
635
    CallSite::arg_iterator AI = CS.arg_begin();
 
636
    ArgIndex = 1;
 
637
    for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end();
 
638
         I != E; ++I, ++AI, ++ArgIndex)
 
639
      if (!ArgsToPromote.count(I) && !ByValArgsToTransform.count(I)) {
 
640
        Args.push_back(*AI);          // Unmodified argument
 
641
 
 
642
        if (Attributes Attrs = CallPAL.getParamAttributes(ArgIndex))
 
643
          AttributesVec.push_back(AttributeWithIndex::get(Args.size(), Attrs));
 
644
 
 
645
      } else if (ByValArgsToTransform.count(I)) {
 
646
        // Emit a GEP and load for each element of the struct.
 
647
        const Type *AgTy = cast<PointerType>(I->getType())->getElementType();
 
648
        const StructType *STy = cast<StructType>(AgTy);
 
649
        Value *Idxs[2] = {
 
650
              ConstantInt::get(Type::getInt32Ty(F->getContext()), 0), 0 };
 
651
        for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
 
652
          Idxs[1] = ConstantInt::get(Type::getInt32Ty(F->getContext()), i);
 
653
          Value *Idx = GetElementPtrInst::Create(*AI, Idxs, Idxs+2,
 
654
                                                 (*AI)->getName()+"."+utostr(i),
 
655
                                                 Call);
 
656
          // TODO: Tell AA about the new values?
 
657
          Args.push_back(new LoadInst(Idx, Idx->getName()+".val", Call));
 
658
        }
 
659
      } else if (!I->use_empty()) {
 
660
        // Non-dead argument: insert GEPs and loads as appropriate.
 
661
        ScalarizeTable &ArgIndices = ScalarizedElements[I];
 
662
        // Store the Value* version of the indices in here, but declare it now
 
663
        // for reuse
 
664
        std::vector<Value*> Ops;
 
665
        for (ScalarizeTable::iterator SI = ArgIndices.begin(),
 
666
               E = ArgIndices.end(); SI != E; ++SI) {
 
667
          Value *V = *AI;
 
668
          LoadInst *OrigLoad = OriginalLoads[*SI];
 
669
          if (!SI->empty()) {
 
670
            Ops.reserve(SI->size());
 
671
            const Type *ElTy = V->getType();
 
672
            for (IndicesVector::const_iterator II = SI->begin(),
 
673
                 IE = SI->end(); II != IE; ++II) {
 
674
              // Use i32 to index structs, and i64 for others (pointers/arrays).
 
675
              // This satisfies GEP constraints.
 
676
              const Type *IdxTy = (ElTy->isStructTy() ?
 
677
                    Type::getInt32Ty(F->getContext()) : 
 
678
                    Type::getInt64Ty(F->getContext()));
 
679
              Ops.push_back(ConstantInt::get(IdxTy, *II));
 
680
              // Keep track of the type we're currently indexing
 
681
              ElTy = cast<CompositeType>(ElTy)->getTypeAtIndex(*II);
 
682
            }
 
683
            // And create a GEP to extract those indices
 
684
            V = GetElementPtrInst::Create(V, Ops.begin(), Ops.end(),
 
685
                                          V->getName()+".idx", Call);
 
686
            Ops.clear();
 
687
            AA.copyValue(OrigLoad->getOperand(0), V);
 
688
          }
 
689
          Args.push_back(new LoadInst(V, V->getName()+".val", Call));
 
690
          AA.copyValue(OrigLoad, Args.back());
 
691
        }
 
692
      }
 
693
 
 
694
    if (ExtraArgHack)
 
695
      Args.push_back(Constant::getNullValue(Type::getInt32Ty(F->getContext())));
 
696
 
 
697
    // Push any varargs arguments on the list
 
698
    for (; AI != CS.arg_end(); ++AI, ++ArgIndex) {
 
699
      Args.push_back(*AI);
 
700
      if (Attributes Attrs = CallPAL.getParamAttributes(ArgIndex))
 
701
        AttributesVec.push_back(AttributeWithIndex::get(Args.size(), Attrs));
 
702
    }
 
703
 
 
704
    // Add any function attributes.
 
705
    if (Attributes attrs = CallPAL.getFnAttributes())
 
706
      AttributesVec.push_back(AttributeWithIndex::get(~0, attrs));
 
707
 
 
708
    Instruction *New;
 
709
    if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
 
710
      New = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
 
711
                               Args.begin(), Args.end(), "", Call);
 
712
      cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
 
713
      cast<InvokeInst>(New)->setAttributes(AttrListPtr::get(AttributesVec.begin(),
 
714
                                                          AttributesVec.end()));
 
715
    } else {
 
716
      New = CallInst::Create(NF, Args.begin(), Args.end(), "", Call);
 
717
      cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
 
718
      cast<CallInst>(New)->setAttributes(AttrListPtr::get(AttributesVec.begin(),
 
719
                                                        AttributesVec.end()));
 
720
      if (cast<CallInst>(Call)->isTailCall())
 
721
        cast<CallInst>(New)->setTailCall();
 
722
    }
 
723
    Args.clear();
 
724
    AttributesVec.clear();
 
725
 
 
726
    // Update the alias analysis implementation to know that we are replacing
 
727
    // the old call with a new one.
 
728
    AA.replaceWithNewValue(Call, New);
 
729
 
 
730
    // Update the callgraph to know that the callsite has been transformed.
 
731
    CallGraphNode *CalleeNode = CG[Call->getParent()->getParent()];
 
732
    CalleeNode->replaceCallEdge(Call, New, NF_CGN);
 
733
 
 
734
    if (!Call->use_empty()) {
 
735
      Call->replaceAllUsesWith(New);
 
736
      New->takeName(Call);
 
737
    }
 
738
 
 
739
    // Finally, remove the old call from the program, reducing the use-count of
 
740
    // F.
 
741
    Call->eraseFromParent();
 
742
  }
 
743
 
 
744
  // Since we have now created the new function, splice the body of the old
 
745
  // function right into the new function, leaving the old rotting hulk of the
 
746
  // function empty.
 
747
  NF->getBasicBlockList().splice(NF->begin(), F->getBasicBlockList());
 
748
 
 
749
  // Loop over the argument list, transfering uses of the old arguments over to
 
750
  // the new arguments, also transfering over the names as well.
 
751
  //
 
752
  for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(),
 
753
       I2 = NF->arg_begin(); I != E; ++I) {
 
754
    if (!ArgsToPromote.count(I) && !ByValArgsToTransform.count(I)) {
 
755
      // If this is an unmodified argument, move the name and users over to the
 
756
      // new version.
 
757
      I->replaceAllUsesWith(I2);
 
758
      I2->takeName(I);
 
759
      AA.replaceWithNewValue(I, I2);
 
760
      ++I2;
 
761
      continue;
 
762
    }
 
763
 
 
764
    if (ByValArgsToTransform.count(I)) {
 
765
      // In the callee, we create an alloca, and store each of the new incoming
 
766
      // arguments into the alloca.
 
767
      Instruction *InsertPt = NF->begin()->begin();
 
768
 
 
769
      // Just add all the struct element types.
 
770
      const Type *AgTy = cast<PointerType>(I->getType())->getElementType();
 
771
      Value *TheAlloca = new AllocaInst(AgTy, 0, "", InsertPt);
 
772
      const StructType *STy = cast<StructType>(AgTy);
 
773
      Value *Idxs[2] = {
 
774
            ConstantInt::get(Type::getInt32Ty(F->getContext()), 0), 0 };
 
775
 
 
776
      for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
 
777
        Idxs[1] = ConstantInt::get(Type::getInt32Ty(F->getContext()), i);
 
778
        Value *Idx = 
 
779
          GetElementPtrInst::Create(TheAlloca, Idxs, Idxs+2,
 
780
                                    TheAlloca->getName()+"."+Twine(i), 
 
781
                                    InsertPt);
 
782
        I2->setName(I->getName()+"."+Twine(i));
 
783
        new StoreInst(I2++, Idx, InsertPt);
 
784
      }
 
785
 
 
786
      // Anything that used the arg should now use the alloca.
 
787
      I->replaceAllUsesWith(TheAlloca);
 
788
      TheAlloca->takeName(I);
 
789
      AA.replaceWithNewValue(I, TheAlloca);
 
790
      continue;
 
791
    }
 
792
 
 
793
    if (I->use_empty()) {
 
794
      AA.deleteValue(I);
 
795
      continue;
 
796
    }
 
797
 
 
798
    // Otherwise, if we promoted this argument, then all users are load
 
799
    // instructions (or GEPs with only load users), and all loads should be
 
800
    // using the new argument that we added.
 
801
    ScalarizeTable &ArgIndices = ScalarizedElements[I];
 
802
 
 
803
    while (!I->use_empty()) {
 
804
      if (LoadInst *LI = dyn_cast<LoadInst>(I->use_back())) {
 
805
        assert(ArgIndices.begin()->empty() &&
 
806
               "Load element should sort to front!");
 
807
        I2->setName(I->getName()+".val");
 
808
        LI->replaceAllUsesWith(I2);
 
809
        AA.replaceWithNewValue(LI, I2);
 
810
        LI->eraseFromParent();
 
811
        DEBUG(dbgs() << "*** Promoted load of argument '" << I->getName()
 
812
              << "' in function '" << F->getName() << "'\n");
 
813
      } else {
 
814
        GetElementPtrInst *GEP = cast<GetElementPtrInst>(I->use_back());
 
815
        IndicesVector Operands;
 
816
        Operands.reserve(GEP->getNumIndices());
 
817
        for (User::op_iterator II = GEP->idx_begin(), IE = GEP->idx_end();
 
818
             II != IE; ++II)
 
819
          Operands.push_back(cast<ConstantInt>(*II)->getSExtValue());
 
820
 
 
821
        // GEPs with a single 0 index can be merged with direct loads
 
822
        if (Operands.size() == 1 && Operands.front() == 0)
 
823
          Operands.clear();
 
824
 
 
825
        Function::arg_iterator TheArg = I2;
 
826
        for (ScalarizeTable::iterator It = ArgIndices.begin();
 
827
             *It != Operands; ++It, ++TheArg) {
 
828
          assert(It != ArgIndices.end() && "GEP not handled??");
 
829
        }
 
830
 
 
831
        std::string NewName = I->getName();
 
832
        for (unsigned i = 0, e = Operands.size(); i != e; ++i) {
 
833
            NewName += "." + utostr(Operands[i]);
 
834
        }
 
835
        NewName += ".val";
 
836
        TheArg->setName(NewName);
 
837
 
 
838
        DEBUG(dbgs() << "*** Promoted agg argument '" << TheArg->getName()
 
839
              << "' of function '" << NF->getName() << "'\n");
 
840
 
 
841
        // All of the uses must be load instructions.  Replace them all with
 
842
        // the argument specified by ArgNo.
 
843
        while (!GEP->use_empty()) {
 
844
          LoadInst *L = cast<LoadInst>(GEP->use_back());
 
845
          L->replaceAllUsesWith(TheArg);
 
846
          AA.replaceWithNewValue(L, TheArg);
 
847
          L->eraseFromParent();
 
848
        }
 
849
        AA.deleteValue(GEP);
 
850
        GEP->eraseFromParent();
 
851
      }
 
852
    }
 
853
 
 
854
    // Increment I2 past all of the arguments added for this promoted pointer.
 
855
    for (unsigned i = 0, e = ArgIndices.size(); i != e; ++i)
 
856
      ++I2;
 
857
  }
 
858
 
 
859
  // Notify the alias analysis implementation that we inserted a new argument.
 
860
  if (ExtraArgHack)
 
861
    AA.copyValue(Constant::getNullValue(Type::getInt32Ty(F->getContext())), 
 
862
                 NF->arg_begin());
 
863
 
 
864
 
 
865
  // Tell the alias analysis that the old function is about to disappear.
 
866
  AA.replaceWithNewValue(F, NF);
 
867
 
 
868
  
 
869
  NF_CGN->stealCalledFunctionsFrom(CG[F]);
 
870
  
 
871
  // Now that the old function is dead, delete it.
 
872
  delete CG.removeFunctionFromModule(F);
 
873
  
 
874
  return NF_CGN;
 
875
}