Index: lib/Transforms/IPO/GlobalOpt.cpp |
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp |
index 6cab6ed0ffa82e7d3b266b5f7d07357b75f659f9..70b066d64bf486ef4414d2b4a820a7371124f09c 100644 |
--- a/lib/Transforms/IPO/GlobalOpt.cpp |
+++ b/lib/Transforms/IPO/GlobalOpt.cpp |
@@ -3062,105 +3062,6 @@ bool GlobalOpt::OptimizeGlobalCtorsList(GlobalVariable *&GCL) { |
return true; |
} |
-static Value::use_iterator getFirst(Value *V, SmallPtrSet<Use*, 8> &Tried) { |
- for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { |
- Use *U = &I.getUse(); |
- if (Tried.count(U)) |
- continue; |
- |
- User *Usr = *I; |
- GlobalVariable *GV = dyn_cast<GlobalVariable>(Usr); |
- if (!GV || !GV->hasName()) { |
- Tried.insert(U); |
- return I; |
- } |
- |
- StringRef Name = GV->getName(); |
- if (Name != "llvm.used" && Name != "llvm.compiler_used") { |
- Tried.insert(U); |
- return I; |
- } |
- } |
- return V->use_end(); |
-} |
- |
-static bool replaceAllNonLLVMUsedUsesWith(Constant *Old, Constant *New); |
- |
-static bool replaceUsesOfWithOnConstant(ConstantArray *CA, Value *From, |
- Value *ToV, Use *U) { |
- Constant *To = cast<Constant>(ToV); |
- |
- SmallVector<Constant*, 8> NewOps; |
- for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) { |
- Constant *Op = CA->getOperand(i); |
- NewOps.push_back(Op == From ? To : Op); |
- } |
- |
- Constant *Replacement = ConstantArray::get(CA->getType(), NewOps); |
- assert(Replacement != CA && "CA didn't contain From!"); |
- |
- bool Ret = replaceAllNonLLVMUsedUsesWith(CA, Replacement); |
- if (Replacement->use_empty()) |
- Replacement->destroyConstant(); |
- if (CA->use_empty()) |
- CA->destroyConstant(); |
- return Ret; |
-} |
- |
-static bool replaceUsesOfWithOnConstant(ConstantExpr *CE, Value *From, |
- Value *ToV, Use *U) { |
- Constant *To = cast<Constant>(ToV); |
- SmallVector<Constant*, 8> NewOps; |
- for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) { |
- Constant *Op = CE->getOperand(i); |
- NewOps.push_back(Op == From ? To : Op); |
- } |
- |
- Constant *Replacement = CE->getWithOperands(NewOps); |
- assert(Replacement != CE && "CE didn't contain From!"); |
- |
- bool Ret = replaceAllNonLLVMUsedUsesWith(CE, Replacement); |
- if (Replacement->use_empty()) |
- Replacement->destroyConstant(); |
- if (CE->use_empty()) |
- CE->destroyConstant(); |
- return Ret; |
-} |
- |
-static bool replaceUsesOfWithOnConstant(Constant *C, Value *From, Value *To, |
- Use *U) { |
- if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) |
- return replaceUsesOfWithOnConstant(CA, From, To, U); |
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) |
- return replaceUsesOfWithOnConstant(CE, From, To, U); |
- C->replaceUsesOfWithOnConstant(From, To, U); |
- return true; |
-} |
- |
-static bool replaceAllNonLLVMUsedUsesWith(Constant *Old, Constant *New) { |
- SmallPtrSet<Use*, 8> Tried; |
- bool Ret = false; |
- for (;;) { |
- Value::use_iterator I = getFirst(Old, Tried); |
- if (I == Old->use_end()) |
- break; |
- Use &U = I.getUse(); |
- |
- // Must handle Constants specially, we cannot call replaceUsesOfWith on a |
- // constant because they are uniqued. |
- if (Constant *C = dyn_cast<Constant>(U.getUser())) { |
- if (!isa<GlobalValue>(C)) { |
- Ret |= replaceUsesOfWithOnConstant(C, Old, New, &U); |
- continue; |
- } |
- } |
- |
- U.set(New); |
- Ret = true; |
- } |
- return Ret; |
-} |
- |
bool GlobalOpt::OptimizeGlobalAliases(Module &M) { |
bool Changed = false; |
@@ -3180,12 +3081,11 @@ bool GlobalOpt::OptimizeGlobalAliases(Module &M) { |
bool hasOneUse = Target->hasOneUse() && Aliasee->hasOneUse(); |
// Make all users of the alias use the aliasee instead. |
- if (replaceAllNonLLVMUsedUsesWith(J, Aliasee)) { |
+ if (!J->use_empty()) { |
+ J->replaceAllUsesWith(Aliasee); |
++NumAliasesResolved; |
Changed = true; |
} |
- if (!J->use_empty()) |
- continue; |
// If the alias is externally visible, we may still be able to simplify it. |
if (!J->hasLocalLinkage()) { |