[llvm] r217455 - Merge alignment of common GlobalValue.

Rafael Espindola rafael.espindola at gmail.com
Tue Sep 9 10:48:19 PDT 2014


Author: rafael
Date: Tue Sep  9 12:48:18 2014
New Revision: 217455

URL: http://llvm.org/viewvc/llvm-project?rev=217455&view=rev
Log:
Merge alignment of common GlobalValue.

Fixes pr20882.

Modified:
    llvm/trunk/lib/Linker/LinkModules.cpp
    llvm/trunk/test/Linker/Inputs/linkage2.ll
    llvm/trunk/test/Linker/linkage2.ll

Modified: llvm/trunk/lib/Linker/LinkModules.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=217455&r1=217454&r2=217455&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Tue Sep  9 12:48:18 2014
@@ -1001,6 +1001,7 @@ bool ModuleLinker::linkGlobalProto(Globa
   GlobalValue *DGV = getLinkedToGlobal(SGV);
   llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility;
   bool HasUnnamedAddr = SGV->hasUnnamedAddr();
+  unsigned Alignment = SGV->getAlignment();
 
   bool LinkFromSrc = false;
   Comdat *DC = nullptr;
@@ -1025,15 +1026,22 @@ bool ModuleLinker::linkGlobalProto(Globa
         return true;
       NewVisibility = NV;
       HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr();
+      if (DGV->hasCommonLinkage() && SGV->hasCommonLinkage())
+        Alignment = std::max(Alignment, DGV->getAlignment());
+      else if (!LinkFromSrc)
+        Alignment = DGV->getAlignment();
 
       // If we're not linking from the source, then keep the definition that we
       // have.
       if (!LinkFromSrc) {
         // Special case for const propagation.
-        if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV))
+        if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV)) {
+          DGVar->setAlignment(Alignment);
+
           if (DGVar->isDeclaration() && SGV->isConstant() &&
               !DGVar->isConstant())
             DGVar->setConstant(true);
+        }
 
         // Set calculated linkage, visibility and unnamed_addr.
         DGV->setLinkage(NewLinkage);
@@ -1071,6 +1079,7 @@ bool ModuleLinker::linkGlobalProto(Globa
                        SGV->getType()->getAddressSpace());
   // Propagate alignment, visibility and section info.
   copyGVAttributes(NewDGV, SGV);
+  NewDGV->setAlignment(Alignment);
   if (NewVisibility)
     NewDGV->setVisibility(*NewVisibility);
   NewDGV->setUnnamedAddr(HasUnnamedAddr);

Modified: llvm/trunk/test/Linker/Inputs/linkage2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/linkage2.ll?rev=217455&r1=217454&r2=217455&view=diff
==============================================================================
--- llvm/trunk/test/Linker/Inputs/linkage2.ll (original)
+++ llvm/trunk/test/Linker/Inputs/linkage2.ll Tue Sep  9 12:48:18 2014
@@ -3,3 +3,5 @@
 @test2_a = external dllimport global i8
 
 @test3_a = common global i16 0
+
+ at test4_a = common global i16 0, align 4

Modified: llvm/trunk/test/Linker/linkage2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/linkage2.ll?rev=217455&r1=217454&r2=217455&view=diff
==============================================================================
--- llvm/trunk/test/Linker/linkage2.ll (original)
+++ llvm/trunk/test/Linker/linkage2.ll Tue Sep  9 12:48:18 2014
@@ -9,3 +9,6 @@
 
 @test3_a = common global i8 0
 ; CHECK-DAG: @test3_a = common global i16 0
+
+ at test4_a = common global i8 0, align 8
+; CHECK-DAG: @test4_a = common global i16 0, align 8





More information about the llvm-commits mailing list