[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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user