diff --git a/llvm/lib/Transforms/IPO/ConstantMerge.cpp b/llvm/lib/Transforms/IPO/ConstantMerge.cpp --- a/llvm/lib/Transforms/IPO/ConstantMerge.cpp +++ b/llvm/lib/Transforms/IPO/ConstantMerge.cpp @@ -101,7 +101,7 @@ enum class CanMerge { No, Yes }; static CanMerge makeMergeable(GlobalVariable *Old, GlobalVariable *New) { - if (!Old->hasGlobalUnnamedAddr() && !New->hasGlobalUnnamedAddr()) + if (!Old->hasGlobalUnnamedAddr() || !New->hasGlobalUnnamedAddr()) return CanMerge::No; if (hasMetadataOtherThanDebugLoc(Old)) return CanMerge::No; diff --git a/llvm/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll b/llvm/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll --- a/llvm/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll +++ b/llvm/test/Transforms/ConstantMerge/2011-01-15-EitherOrder.ll @@ -6,7 +6,7 @@ %struct.foobar = type { i32 } ; CHECK: bar.d @bar.d = unnamed_addr constant %struct.foobar zeroinitializer, align 4 -; CHECK-NOT: foo.d +; CHECK: foo.d @foo.d = internal constant %struct.foobar zeroinitializer, align 4 define i32 @main() nounwind ssp { entry: diff --git a/llvm/test/Transforms/ConstantMerge/merge-both.ll b/llvm/test/Transforms/ConstantMerge/merge-both.ll --- a/llvm/test/Transforms/ConstantMerge/merge-both.ll +++ b/llvm/test/Transforms/ConstantMerge/merge-both.ll @@ -1,20 +1,21 @@ ; RUN: opt -S < %s -passes=constmerge | FileCheck %s -; Test that in one run var3 is merged into var2 and var1 into var4. -; Test that we merge @var5 and @var6 into one with the higher alignment +; Test that in one run var2 is merged into var4 and var6 is merged into var8. +; Test that we merge @var6 and @var8 into one with the higher alignment declare void @zed(ptr, ptr) %struct.foobar = type { i32 } @var1 = internal constant %struct.foobar { i32 2 } -@var2 = unnamed_addr constant %struct.foobar { i32 2 } +@var2 = private unnamed_addr constant %struct.foobar { i32 2 } @var3 = internal constant %struct.foobar { i32 2 } -@var4 = unnamed_addr constant %struct.foobar { i32 2 } +@var4 = private unnamed_addr constant %struct.foobar { i32 2 } ; CHECK: %struct.foobar = type { i32 } ; CHECK-NOT: @ -; CHECK: @var2 = constant %struct.foobar { i32 2 } -; CHECK-NEXT: @var4 = constant %struct.foobar { i32 2 } +; CHECK: @var1 = internal constant %struct.foobar { i32 2 } +; CHECK-NEXT: @var3 = internal constant %struct.foobar { i32 2 } +; CHECK-NEXT: @var4 = private unnamed_addr constant %struct.foobar { i32 2 } declare void @helper(ptr) @var5 = internal constant [16 x i8] c"foo1bar2foo3bar\00", align 16 @@ -22,8 +23,9 @@ @var7 = internal constant [16 x i8] c"foo1bar2foo3bar\00" @var8 = private unnamed_addr constant [16 x i8] c"foo1bar2foo3bar\00" +; CHECK: @var5 = internal constant [16 x i8] c"foo1bar2foo3bar\00", align 16 ; CHECK-NEXT: @var7 = internal constant [16 x i8] c"foo1bar2foo3bar\00" -; CHECK-NEXT: @var8 = private constant [16 x i8] c"foo1bar2foo3bar\00", align 16 +; CHECK-NEXT: @var8 = private unnamed_addr constant [16 x i8] c"foo1bar2foo3bar\00", align 1 @var4a = alias %struct.foobar, ptr @var4 @llvm.used = appending global [1 x ptr] [ptr @var4a], section "llvm.metadata" @@ -38,4 +40,3 @@ call void @helper(ptr @var8) ret i32 0 } - diff --git a/llvm/test/Transforms/ConstantMerge/merge-dbg.ll b/llvm/test/Transforms/ConstantMerge/merge-dbg.ll --- a/llvm/test/Transforms/ConstantMerge/merge-dbg.ll +++ b/llvm/test/Transforms/ConstantMerge/merge-dbg.ll @@ -1,8 +1,8 @@ ; RUN: opt < %s -passes=constmerge -S | FileCheck %s -; CHECK: = constant i32 1, !dbg [[A:![0-9]+]], !dbg [[B:![0-9]+]] -@a = internal constant i32 1, !dbg !0 -@b = unnamed_addr constant i32 1, !dbg !9 +; CHECK: = private unnamed_addr constant i32 1, !dbg [[A:![0-9]+]], !dbg [[B:![0-9]+]] +@a = private unnamed_addr constant i32 1, !dbg !0 +@b = private unnamed_addr constant i32 1, !dbg !9 define void @test1(ptr %P1, ptr %P2) { store ptr @a, ptr %P1 diff --git a/llvm/test/Transforms/ConstantMerge/unnamed-addr.ll b/llvm/test/Transforms/ConstantMerge/unnamed-addr.ll --- a/llvm/test/Transforms/ConstantMerge/unnamed-addr.ll +++ b/llvm/test/Transforms/ConstantMerge/unnamed-addr.ll @@ -1,6 +1,6 @@ ; RUN: opt -passes=constmerge -S < %s | FileCheck %s -; Test which corresponding x and y are merged and that unnamed_addr -; is correctly set. +; Test which corresponding x and y are merged when they both are marked with +; unnamed_addr attribute. declare void @zed(ptr, ptr) @@ -23,7 +23,9 @@ ; CHECK-NOT: @ ; CHECK: @test1.x = internal constant %struct.foobar { i32 1 } ; CHECK-NEXT: @test1.y = constant %struct.foobar { i32 1 } -; CHECK-NEXT: @test2.y = constant %struct.foobar { i32 2 } +; CHECK-NEXT: @test2.x = internal constant %struct.foobar { i32 2 } +; CHECK-NEXT: @test2.y = unnamed_addr constant %struct.foobar { i32 2 } +; CHECK-NEXT: @test3.x = internal unnamed_addr constant %struct.foobar { i32 3 } ; CHECK-NEXT: @test3.y = constant %struct.foobar { i32 3 } ; CHECK-NEXT: @test4.y = unnamed_addr constant %struct.foobar { i32 4 } ; CHECK-NOT: @