OLD | NEW |
1 //===- GlobalOpt.cpp - Optimize Global Variables --------------------------===// | 1 //===- GlobalOpt.cpp - Optimize Global Variables --------------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This pass transforms simple global variables that never have their address | 10 // This pass transforms simple global variables that never have their address |
(...skipping 3044 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3055 continue; | 3055 continue; |
3056 } | 3056 } |
3057 } | 3057 } |
3058 | 3058 |
3059 if (!MadeChange) return false; | 3059 if (!MadeChange) return false; |
3060 | 3060 |
3061 GCL = InstallGlobalCtors(GCL, Ctors); | 3061 GCL = InstallGlobalCtors(GCL, Ctors); |
3062 return true; | 3062 return true; |
3063 } | 3063 } |
3064 | 3064 |
3065 static Value::use_iterator getFirst(Value *V, SmallPtrSet<Use*, 8> &Tried) { | |
3066 for (Value::use_iterator I = V->use_begin(), E = V->use_end(); I != E; ++I) { | |
3067 Use *U = &I.getUse(); | |
3068 if (Tried.count(U)) | |
3069 continue; | |
3070 | |
3071 User *Usr = *I; | |
3072 GlobalVariable *GV = dyn_cast<GlobalVariable>(Usr); | |
3073 if (!GV || !GV->hasName()) { | |
3074 Tried.insert(U); | |
3075 return I; | |
3076 } | |
3077 | |
3078 StringRef Name = GV->getName(); | |
3079 if (Name != "llvm.used" && Name != "llvm.compiler_used") { | |
3080 Tried.insert(U); | |
3081 return I; | |
3082 } | |
3083 } | |
3084 return V->use_end(); | |
3085 } | |
3086 | |
3087 static bool replaceAllNonLLVMUsedUsesWith(Constant *Old, Constant *New); | |
3088 | |
3089 static bool replaceUsesOfWithOnConstant(ConstantArray *CA, Value *From, | |
3090 Value *ToV, Use *U) { | |
3091 Constant *To = cast<Constant>(ToV); | |
3092 | |
3093 SmallVector<Constant*, 8> NewOps; | |
3094 for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) { | |
3095 Constant *Op = CA->getOperand(i); | |
3096 NewOps.push_back(Op == From ? To : Op); | |
3097 } | |
3098 | |
3099 Constant *Replacement = ConstantArray::get(CA->getType(), NewOps); | |
3100 assert(Replacement != CA && "CA didn't contain From!"); | |
3101 | |
3102 bool Ret = replaceAllNonLLVMUsedUsesWith(CA, Replacement); | |
3103 if (Replacement->use_empty()) | |
3104 Replacement->destroyConstant(); | |
3105 if (CA->use_empty()) | |
3106 CA->destroyConstant(); | |
3107 return Ret; | |
3108 } | |
3109 | |
3110 static bool replaceUsesOfWithOnConstant(ConstantExpr *CE, Value *From, | |
3111 Value *ToV, Use *U) { | |
3112 Constant *To = cast<Constant>(ToV); | |
3113 SmallVector<Constant*, 8> NewOps; | |
3114 for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) { | |
3115 Constant *Op = CE->getOperand(i); | |
3116 NewOps.push_back(Op == From ? To : Op); | |
3117 } | |
3118 | |
3119 Constant *Replacement = CE->getWithOperands(NewOps); | |
3120 assert(Replacement != CE && "CE didn't contain From!"); | |
3121 | |
3122 bool Ret = replaceAllNonLLVMUsedUsesWith(CE, Replacement); | |
3123 if (Replacement->use_empty()) | |
3124 Replacement->destroyConstant(); | |
3125 if (CE->use_empty()) | |
3126 CE->destroyConstant(); | |
3127 return Ret; | |
3128 } | |
3129 | |
3130 static bool replaceUsesOfWithOnConstant(Constant *C, Value *From, Value *To, | |
3131 Use *U) { | |
3132 if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) | |
3133 return replaceUsesOfWithOnConstant(CA, From, To, U); | |
3134 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) | |
3135 return replaceUsesOfWithOnConstant(CE, From, To, U); | |
3136 C->replaceUsesOfWithOnConstant(From, To, U); | |
3137 return true; | |
3138 } | |
3139 | |
3140 static bool replaceAllNonLLVMUsedUsesWith(Constant *Old, Constant *New) { | |
3141 SmallPtrSet<Use*, 8> Tried; | |
3142 bool Ret = false; | |
3143 for (;;) { | |
3144 Value::use_iterator I = getFirst(Old, Tried); | |
3145 if (I == Old->use_end()) | |
3146 break; | |
3147 Use &U = I.getUse(); | |
3148 | |
3149 // Must handle Constants specially, we cannot call replaceUsesOfWith on a | |
3150 // constant because they are uniqued. | |
3151 if (Constant *C = dyn_cast<Constant>(U.getUser())) { | |
3152 if (!isa<GlobalValue>(C)) { | |
3153 Ret |= replaceUsesOfWithOnConstant(C, Old, New, &U); | |
3154 continue; | |
3155 } | |
3156 } | |
3157 | |
3158 U.set(New); | |
3159 Ret = true; | |
3160 } | |
3161 return Ret; | |
3162 } | |
3163 | |
3164 bool GlobalOpt::OptimizeGlobalAliases(Module &M) { | 3065 bool GlobalOpt::OptimizeGlobalAliases(Module &M) { |
3165 bool Changed = false; | 3066 bool Changed = false; |
3166 | 3067 |
3167 for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); | 3068 for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); |
3168 I != E;) { | 3069 I != E;) { |
3169 Module::alias_iterator J = I++; | 3070 Module::alias_iterator J = I++; |
3170 // Aliases without names cannot be referenced outside this module. | 3071 // Aliases without names cannot be referenced outside this module. |
3171 if (!J->hasName() && !J->isDeclaration()) | 3072 if (!J->hasName() && !J->isDeclaration()) |
3172 J->setLinkage(GlobalValue::InternalLinkage); | 3073 J->setLinkage(GlobalValue::InternalLinkage); |
3173 // If the aliasee may change at link time, nothing can be done - bail out. | 3074 // If the aliasee may change at link time, nothing can be done - bail out. |
3174 if (J->mayBeOverridden()) | 3075 if (J->mayBeOverridden()) |
3175 continue; | 3076 continue; |
3176 | 3077 |
3177 Constant *Aliasee = J->getAliasee(); | 3078 Constant *Aliasee = J->getAliasee(); |
3178 GlobalValue *Target = cast<GlobalValue>(Aliasee->stripPointerCasts()); | 3079 GlobalValue *Target = cast<GlobalValue>(Aliasee->stripPointerCasts()); |
3179 Target->removeDeadConstantUsers(); | 3080 Target->removeDeadConstantUsers(); |
3180 bool hasOneUse = Target->hasOneUse() && Aliasee->hasOneUse(); | 3081 bool hasOneUse = Target->hasOneUse() && Aliasee->hasOneUse(); |
3181 | 3082 |
3182 // Make all users of the alias use the aliasee instead. | 3083 // Make all users of the alias use the aliasee instead. |
3183 if (replaceAllNonLLVMUsedUsesWith(J, Aliasee)) { | 3084 if (!J->use_empty()) { |
| 3085 J->replaceAllUsesWith(Aliasee); |
3184 ++NumAliasesResolved; | 3086 ++NumAliasesResolved; |
3185 Changed = true; | 3087 Changed = true; |
3186 } | 3088 } |
3187 if (!J->use_empty()) | |
3188 continue; | |
3189 | 3089 |
3190 // If the alias is externally visible, we may still be able to simplify it. | 3090 // If the alias is externally visible, we may still be able to simplify it. |
3191 if (!J->hasLocalLinkage()) { | 3091 if (!J->hasLocalLinkage()) { |
3192 // If the aliasee has internal linkage, give it the name and linkage | 3092 // If the aliasee has internal linkage, give it the name and linkage |
3193 // of the alias, and delete the alias. This turns: | 3093 // of the alias, and delete the alias. This turns: |
3194 // define internal ... @f(...) | 3094 // define internal ... @f(...) |
3195 // @a = alias ... @f | 3095 // @a = alias ... @f |
3196 // into: | 3096 // into: |
3197 // define ... @a(...) | 3097 // define ... @a(...) |
3198 if (!Target->hasLocalLinkage()) | 3098 if (!Target->hasLocalLinkage()) |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3368 LocalChange |= OptimizeEmptyGlobalCXXDtors(CXAAtExitFn); | 3268 LocalChange |= OptimizeEmptyGlobalCXXDtors(CXAAtExitFn); |
3369 | 3269 |
3370 Changed |= LocalChange; | 3270 Changed |= LocalChange; |
3371 } | 3271 } |
3372 | 3272 |
3373 // TODO: Move all global ctors functions to the end of the module for code | 3273 // TODO: Move all global ctors functions to the end of the module for code |
3374 // layout. | 3274 // layout. |
3375 | 3275 |
3376 return Changed; | 3276 return Changed; |
3377 } | 3277 } |
OLD | NEW |