diff options
-rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 8 | ||||
-rw-r--r-- | test/Transforms/GlobalOpt/gv-align.ll | 6 |
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index ddff5ef8b3..c09e78e269 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -1880,6 +1880,7 @@ bool GlobalOpt::OptimizeFunctions(Module &M) { bool GlobalOpt::OptimizeGlobalVars(Module &M) { bool Changed = false; + TargetData *TD = getAnalysisIfAvailable<TargetData>(); for (Module::global_iterator GVI = M.global_begin(), E = M.global_end(); GVI != E; ) { GlobalVariable *GV = GVI++; @@ -1889,11 +1890,16 @@ bool GlobalOpt::OptimizeGlobalVars(Module &M) { // Simplify the initializer. if (GV->hasInitializer()) if (ConstantExpr *CE = dyn_cast<ConstantExpr>(GV->getInitializer())) { - TargetData *TD = getAnalysisIfAvailable<TargetData>(); Constant *New = ConstantFoldConstantExpression(CE, TD); if (New && New != CE) GV->setInitializer(New); } + // Refine the alignment value. + if (TD && GV->hasDefinitiveInitializer()) { + unsigned Align = TD->getPreferredAlignment(GV); + if (Align > GV->getAlignment()) + GV->setAlignment(Align); + } // Do more involved optimizations if the global is internal. if (!GV->isConstant() && GV->hasLocalLinkage() && GV->hasInitializer()) diff --git a/test/Transforms/GlobalOpt/gv-align.ll b/test/Transforms/GlobalOpt/gv-align.ll new file mode 100644 index 0000000000..f99e8a6845 --- /dev/null +++ b/test/Transforms/GlobalOpt/gv-align.ll @@ -0,0 +1,6 @@ +; RUN: opt -globalopt -S < %s | grep {, align 16} + +; Globalopt should refine the alignment for global variables. + +target datalayout = "e-p:64:64:64" +@a = global [4 x i32] [i32 2, i32 3, i32 4, i32 5 ] |