mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
cache result of operator*
llvm-svn: 108146
This commit is contained in:
parent
bf2470e6e9
commit
b2b6867582
@ -360,19 +360,20 @@ bool ArgPromotion::isSafeToPromoteArgument(Argument *Arg, bool isByVal) const {
|
||||
IndicesVector Operands;
|
||||
for (Value::use_iterator UI = Arg->use_begin(), E = Arg->use_end();
|
||||
UI != E; ++UI) {
|
||||
User *U = *UI;
|
||||
Operands.clear();
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(*UI)) {
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(U)) {
|
||||
if (LI->isVolatile()) return false; // Don't hack volatile loads
|
||||
Loads.push_back(LI);
|
||||
// Direct loads are equivalent to a GEP with a zero index and then a load.
|
||||
Operands.push_back(0);
|
||||
} else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(*UI)) {
|
||||
} else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) {
|
||||
if (GEP->use_empty()) {
|
||||
// Dead GEP's cause trouble later. Just remove them if we run into
|
||||
// them.
|
||||
getAnalysis<AliasAnalysis>().deleteValue(GEP);
|
||||
GEP->eraseFromParent();
|
||||
// TODO: This runs the above loop over and over again for dead GEPS
|
||||
// TODO: This runs the above loop over and over again for dead GEPs
|
||||
// Couldn't we just do increment the UI iterator earlier and erase the
|
||||
// use?
|
||||
return isSafeToPromoteArgument(Arg, isByVal);
|
||||
@ -452,12 +453,14 @@ bool ArgPromotion::isSafeToPromoteArgument(Argument *Arg, bool isByVal) const {
|
||||
// Now check every path from the entry block to the load for transparency.
|
||||
// To do this, we perform a depth first search on the inverse CFG from the
|
||||
// loading block.
|
||||
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
||||
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
|
||||
BasicBlock *P = *PI;
|
||||
for (idf_ext_iterator<BasicBlock*, SmallPtrSet<BasicBlock*, 16> >
|
||||
I = idf_ext_begin(*PI, TranspBlocks),
|
||||
E = idf_ext_end(*PI, TranspBlocks); I != E; ++I)
|
||||
I = idf_ext_begin(P, TranspBlocks),
|
||||
E = idf_ext_end(P, TranspBlocks); I != E; ++I)
|
||||
if (AA.canBasicBlockModify(**I, Arg, LoadSize))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If the path from the entry of the function to each load is free of
|
||||
|
Loading…
Reference in New Issue
Block a user