[llvm] 8ea31db - [CodeGenPrepare] Use MapVector to stabilize iteration order

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 18 17:19:55 PDT 2024


Author: Fangrui Song
Date: 2024-06-18T17:19:51-07:00
New Revision: 8ea31db27211ed0c8207b4b4b0839e5cbe780c73

URL: https://github.com/llvm/llvm-project/commit/8ea31db27211ed0c8207b4b4b0839e5cbe780c73
DIFF: https://github.com/llvm/llvm-project/commit/8ea31db27211ed0c8207b4b4b0839e5cbe780c73.diff

LOG: [CodeGenPrepare] Use MapVector to stabilize iteration order

DenseMap iteration order is not guaranteed to be deterministic.

Without the change,
llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll would
fail when `combineHashValue` changes (#95970).

Fixes: dba7329ebb0dbe1fabb3faaedfd31da3b8bd611d

Added: 
    

Modified: 
    llvm/lib/CodeGen/CodeGenPrepare.cpp
    llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index aee9935d7a9c2..f8fdba2e35dd7 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -1194,12 +1194,12 @@ void CodeGenPrepare::eliminateMostlyEmptyBlock(BasicBlock *BB) {
 // derived pointer relocation instructions given a vector of all relocate calls
 static void computeBaseDerivedRelocateMap(
     const SmallVectorImpl<GCRelocateInst *> &AllRelocateCalls,
-    DenseMap<GCRelocateInst *, SmallVector<GCRelocateInst *, 2>>
+    MapVector<GCRelocateInst *, SmallVector<GCRelocateInst *, 0>>
         &RelocateInstMap) {
   // Collect information in two maps: one primarily for locating the base object
   // while filling the second map; the second map is the final structure holding
   // a mapping between Base and corresponding Derived relocate calls
-  DenseMap<std::pair<unsigned, unsigned>, GCRelocateInst *> RelocateIdxMap;
+  MapVector<std::pair<unsigned, unsigned>, GCRelocateInst *> RelocateIdxMap;
   for (auto *ThisRelocate : AllRelocateCalls) {
     auto K = std::make_pair(ThisRelocate->getBasePtrIndex(),
                             ThisRelocate->getDerivedPtrIndex());
@@ -1375,7 +1375,7 @@ bool CodeGenPrepare::simplifyOffsetableRelocate(GCStatepointInst &I) {
 
   // RelocateInstMap is a mapping from the base relocate instruction to the
   // corresponding derived relocate instructions
-  DenseMap<GCRelocateInst *, SmallVector<GCRelocateInst *, 2>> RelocateInstMap;
+  MapVector<GCRelocateInst *, SmallVector<GCRelocateInst *, 0>> RelocateInstMap;
   computeBaseDerivedRelocateMap(AllRelocateCalls, RelocateInstMap);
   if (RelocateInstMap.empty())
     return false;

diff  --git a/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll b/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll
index babaa08a959b3..fbcb40e72577e 100644
--- a/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll
+++ b/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll
@@ -18,10 +18,11 @@ entry:
 }
 
 define i32 @test_sor_two_derived(ptr addrspace(1) %base) gc "statepoint-example" {
+; CHECK-LABEL: @test_sor_two_derived(
 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 15
 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 12
-; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 12
 ; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 15
+; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 12
 entry:
        %ptr = getelementptr i32, ptr addrspace(1) %base, i32 15
        %ptr2 = getelementptr i32, ptr addrspace(1) %base, i32 12
@@ -34,6 +35,7 @@ entry:
 }
 
 define i32 @test_sor_ooo(ptr addrspace(1) %base) gc "statepoint-example" {
+; CHECK-LABEL: @test_sor_ooo(
 ; CHECK: getelementptr i32, ptr addrspace(1) %base, i32 15
 ; CHECK: getelementptr i32, ptr addrspace(1) %base-new, i32 15
 entry:


        


More information about the llvm-commits mailing list