diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-12-22 20:43:30 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-12-22 20:43:30 +0000 |
| commit | 10d9a033db633ec8072a86c58047e695cda62ecb (patch) | |
| tree | c51d837dad00524809c219c27b02c357866b0826 /llvm/lib/Transforms | |
| parent | 9c05cc5670f8d77fd71d10fb6ba60b9939aa498a (diff) | |
| download | bcm5719-llvm-10d9a033db633ec8072a86c58047e695cda62ecb.tar.gz bcm5719-llvm-10d9a033db633ec8072a86c58047e695cda62ecb.zip | |
Also add unnamed_addr to functions.
llvm-svn: 256281
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 2873ee72169..fd7736905fe 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -83,7 +83,7 @@ namespace { bool OptimizeGlobalVars(Module &M); bool OptimizeGlobalAliases(Module &M); bool deleteIfDead(GlobalValue &GV); - bool processGlobal(GlobalVariable *GV); + bool processGlobal(GlobalValue &GV); bool processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS); bool OptimizeEmptyGlobalCXXDtors(Function *CXAAtExitFn); @@ -1705,28 +1705,31 @@ bool GlobalOpt::deleteIfDead(GlobalValue &GV) { /// Analyze the specified global variable and optimize it if possible. If we /// make a change, return true. -bool GlobalOpt::processGlobal(GlobalVariable *GV) { - if (deleteIfDead(*GV)) - return true; - +bool GlobalOpt::processGlobal(GlobalValue &GV) { // Do more involved optimizations if the global is internal. - if (!GV->hasLocalLinkage()) + if (!GV.hasLocalLinkage()) return false; GlobalStatus GS; - if (GlobalStatus::analyzeGlobal(GV, GS)) + if (GlobalStatus::analyzeGlobal(&GV, GS)) return false; - if (!GS.IsCompared && !GV->hasUnnamedAddr()) { - GV->setUnnamedAddr(true); + bool Changed = false; + if (!GS.IsCompared && !GV.hasUnnamedAddr()) { + GV.setUnnamedAddr(true); NumUnnamed++; + Changed = true; } - if (GV->isConstant() || !GV->hasInitializer()) - return false; + auto *GVar = dyn_cast<GlobalVariable>(&GV); + if (!GVar) + return Changed; + + if (GVar->isConstant() || !GVar->hasInitializer()) + return Changed; - return processInternalGlobal(GV, GS); + return processInternalGlobal(GVar, GS) || Changed; } bool GlobalOpt::isPointerValueDeadOnEntryToFunction(const Function *F, GlobalValue *GV) { @@ -2044,6 +2047,9 @@ bool GlobalOpt::OptimizeFunctions(Module &M) { Changed = true; continue; } + + Changed |= processGlobal(*F); + if (!F->hasLocalLinkage()) continue; if (isProfitableToMakeFastCC(F) && !F->isVarArg() && @@ -2087,7 +2093,12 @@ bool GlobalOpt::OptimizeGlobalVars(Module &M) { GV->setInitializer(New); } - Changed |= processGlobal(GV); + if (deleteIfDead(*GV)) { + Changed = true; + continue; + } + + Changed |= processGlobal(*GV); } return Changed; } |

