[llvm] 58d7a6e - [GlobalMerge] Use MapVector to stabilize iteration order

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 19 10:19:39 PDT 2024


Author: Fangrui Song
Date: 2024-06-19T10:19:35-07:00
New Revision: 58d7a6e0e6361871442df956bb88798ce602b09d

URL: https://github.com/llvm/llvm-project/commit/58d7a6e0e6361871442df956bb88798ce602b09d
DIFF: https://github.com/llvm/llvm-project/commit/58d7a6e0e6361871442df956bb88798ce602b09d.diff

LOG: [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).

Added: 
    

Modified: 
    llvm/lib/CodeGen/GlobalMerge.cpp
    llvm/test/Transforms/GlobalMerge/basic.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index c39555a9c18ae..65bf7161441ba 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -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);

diff  --git a/llvm/test/Transforms/GlobalMerge/basic.ll b/llvm/test/Transforms/GlobalMerge/basic.ll
index 67e2b70220a78..2df4b34ed2099 100644
--- a/llvm/test/Transforms/GlobalMerge/basic.ll
+++ b/llvm/test/Transforms/GlobalMerge/basic.ll
@@ -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)
+  ; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
   %y = load i32, ptr @b
-  ; CHECK: load i32, ptr @_MergedGlobals
+  ; CHECK: load i32, ptr @_MergedGlobals.1
   %z1 = load i32, ptr @c
-  ; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals, i32 0, i32 1)
+  ; CHECK: load i32, ptr getelementptr inbounds (<{ i32, i32 }>, ptr @_MergedGlobals.1, i32 0, i32 1)
   %z2 = load i32, ptr @d
   ret void
 }


        


More information about the llvm-commits mailing list