[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 (#95970).
This commit is contained in:
Fangrui Song
2024-06-19 10:19:35 -07:00
parent 70ec8419dd
commit 58d7a6e0e6
2 changed files with 13 additions and 12 deletions

View File

@@ -63,6 +63,7 @@
#include "llvm/CodeGen/GlobalMerge.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
@@ -641,7 +642,7 @@ bool GlobalMergeImpl::run(Module &M) {
IsMachO = Triple(M.getTargetTriple()).isOSBinFormatMachO();
auto &DL = M.getDataLayout();
DenseMap<std::pair<unsigned, StringRef>, SmallVector<GlobalVariable *, 16>>
MapVector<std::pair<unsigned, StringRef>, SmallVector<GlobalVariable *, 0>>
Globals, ConstGlobals, BSSGlobals;
bool Changed = false;
setMustKeepGlobalVariables(M);

View File

@@ -4,29 +4,29 @@
target datalayout = "e-p:64:64"
target triple = "x86_64-unknown-linux-gnu"
; CHECK: @_MergedGlobals = private global <{ i32, i32 }> <{ i32 3, i32 4 }>, section "foo", align 4
; CHECK: @_MergedGlobals.1 = private global <{ i32, i32 }> <{ i32 1, i32 2 }>, align 4
; CHECK: @_MergedGlobals = private global <{ i32, i32 }> <{ i32 1, i32 2 }>, align 4
; CHECK: @_MergedGlobals.1 = private global <{ i32, i32 }> <{ i32 3, i32 4 }>, section "foo", align 4
; CHECK-DAG: @a = internal alias i32, ptr @_MergedGlobals.1
; CHECK-DAG: @a = internal alias i32, ptr @_MergedGlobals{{$}}
@a = internal global i32 1
; CHECK-DAG: @b = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
; CHECK-DAG: @b = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
@b = internal global i32 2
; CHECK-DAG: @c = internal alias i32, ptr @_MergedGlobals
; CHECK-DAG: @c = internal alias i32, ptr @_MergedGlobals.1{{$}}
@c = internal global i32 3, section "foo"
; CHECK-DAG: @d = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
; CHECK-DAG: @d = internal alias i32, getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
@d = internal global i32 4, section "foo"
define void @use() {
; CHECK: load i32, ptr @_MergedGlobals.1
; CHECK: load i32, ptr @_MergedGlobals,
%x = load i32, ptr @a
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
%y = load i32, ptr @b
; CHECK: load i32, ptr @_MergedGlobals
%z1 = load i32, ptr @c
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
%y = load i32, ptr @b
; CHECK: load i32, ptr @_MergedGlobals.1
%z1 = load i32, ptr @c
; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
%z2 = load i32, ptr @d
ret void
}