From: Dan Gohman Date: Fri, 2 Apr 2010 00:14:16 +0000 (+0000) Subject: Make globalopt refine global variable alignment. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c9ae19e46520c1051b828171205b379b5a0bb6ad;p=oota-llvm.git Make globalopt refine global variable alignment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100160 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index ddff5ef8b36..c09e78e2693 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(); 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(GV->getInitializer())) { - TargetData *TD = getAnalysisIfAvailable(); 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 00000000000..f99e8a68450 --- /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 ]