Skip to content

Commit 0b65525

Browse files
MaskRayAlexisPerry
authored andcommitted
[GlobalMerge] Use MapVector to stabilize iteration order
DenseMap iteration order is not guaranteed to be deterministic. Without the change, llvm/test/Transforms/GlobalMerge/basic.ll could fail when `combineHashValue` changes (llvm#95970).
1 parent fd5d2be commit 0b65525

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

llvm/lib/CodeGen/GlobalMerge.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#include "llvm/CodeGen/GlobalMerge.h"
6464
#include "llvm/ADT/BitVector.h"
6565
#include "llvm/ADT/DenseMap.h"
66+
#include "llvm/ADT/MapVector.h"
6667
#include "llvm/ADT/SetVector.h"
6768
#include "llvm/ADT/SmallVector.h"
6869
#include "llvm/ADT/Statistic.h"
@@ -641,7 +642,7 @@ bool GlobalMergeImpl::run(Module &M) {
641642
IsMachO = Triple(M.getTargetTriple()).isOSBinFormatMachO();
642643

643644
auto &DL = M.getDataLayout();
644-
DenseMap<std::pair<unsigned, StringRef>, SmallVector<GlobalVariable *, 16>>
645+
MapVector<std::pair<unsigned, StringRef>, SmallVector<GlobalVariable *, 0>>
645646
Globals, ConstGlobals, BSSGlobals;
646647
bool Changed = false;
647648
setMustKeepGlobalVariables(M);

llvm/test/Transforms/GlobalMerge/basic.ll

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,29 @@
44
target datalayout = "e-p:64:64"
55
target triple = "x86_64-unknown-linux-gnu"
66

7-
; CHECK: @_MergedGlobals = private global <{ i32, i32 }> <{ i32 3, i32 4 }>, section "foo", align 4
8-
; CHECK: @_MergedGlobals.1 = private global <{ i32, i32 }> <{ i32 1, i32 2 }>, align 4
7+
; CHECK: @_MergedGlobals = private global <{ i32, i32 }> <{ i32 1, i32 2 }>, align 4
8+
; CHECK: @_MergedGlobals.1 = private global <{ i32, i32 }> <{ i32 3, i32 4 }>, section "foo", align 4
99

10-
; CHECK-DAG: @a = internal alias i32, ptr @_MergedGlobals.1
10+
; CHECK-DAG: @a = internal alias i32, ptr @_MergedGlobals{{$}}
1111
@a = internal global i32 1
1212

13-
; CHECK-DAG: @b = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
13+
; CHECK-DAG: @b = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
1414
@b = internal global i32 2
1515

16-
; CHECK-DAG: @c = internal alias i32, ptr @_MergedGlobals
16+
; CHECK-DAG: @c = internal alias i32, ptr @_MergedGlobals.1{{$}}
1717
@c = internal global i32 3, section "foo"
1818

19-
; CHECK-DAG: @d = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
19+
; CHECK-DAG: @d = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
2020
@d = internal global i32 4, section "foo"
2121

2222
define void @use() {
23-
; CHECK: load i32, ptr @_MergedGlobals.1
23+
; CHECK: load i32, ptr @_MergedGlobals,
2424
%x = load i32, ptr @a
25-
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
25+
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
2626
%y = load i32, ptr @b
27-
; CHECK: load i32, ptr @_MergedGlobals
27+
; CHECK: load i32, ptr @_MergedGlobals.1
2828
%z1 = load i32, ptr @c
29-
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
29+
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
3030
%z2 = load i32, ptr @d
3131
ret void
3232
}

0 commit comments

Comments
 (0)