Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/ConstantMerge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ isUnmergeableGlobal(GlobalVariable *GV,

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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ declare i32 @zed(ptr, ptr)
%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:
Expand Down
17 changes: 9 additions & 8 deletions llvm/test/Transforms/ConstantMerge/merge-both.ll
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
; 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
@var6 = private unnamed_addr constant [16 x i8] c"foo1bar2foo3bar\00", align 1
@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"
Expand All @@ -38,4 +40,3 @@ entry:
call void @helper(ptr @var8)
ret i32 0
}

6 changes: 3 additions & 3 deletions llvm/test/Transforms/ConstantMerge/merge-dbg.ll
Original file line number Diff line number Diff line change
@@ -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
Expand Down
8 changes: 5 additions & 3 deletions llvm/test/Transforms/ConstantMerge/unnamed-addr.ll
Original file line number Diff line number Diff line change
@@ -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)

Expand All @@ -23,7 +23,9 @@ declare void @zed(ptr, ptr)
; 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: @
Expand Down
Loading