[Mlir-commits] [flang] [llvm] [mlir] [mlir][llvm][OpenMP] Hoist __atomic_load alloca (PR #132888)

Tom Eccles llvmlistbot at llvm.org
Wed Mar 26 04:50:35 PDT 2025


================
@@ -118,8 +118,14 @@ AtomicInfo::EmitAtomicLoadLibcall(AtomicOrdering AO) {
   Value *PtrVal = getAtomicPointer();
   PtrVal = Builder->CreateAddrSpaceCast(PtrVal, PointerType::getUnqual(Ctx));
   Args.push_back(PtrVal);
+
+  auto CurrentIP = Builder->saveIP();
+  BasicBlock &InsertBB =
+      Builder->GetInsertBlock()->getParent()->getEntryBlock();
----------------
tblah wrote:

Posting the diff for #120724 to make the above explanation clearer:
```diff
--- /tmp/old.ll	2025-03-26 11:04:27.390461691 +0000
+++ /tmp/new.ll	2025-03-26 11:36:09.594270400 +0000
@@ -13,7 +13,8 @@
 @2 = private unnamed_addr constant %struct.ident_t { i32 0, i32 66, i32 0, i32 22, ptr @0 }, align 8
 
 define void @_QQmain() {
-  %structArg = alloca { ptr }, align 8
+  %structArg = alloca { ptr, ptr }, align 8
+  %atomic.temp.load = alloca { float, float }, align 8
   %1 = alloca i32, i64 1, align 4
   %2 = alloca { float, float }, i64 1, align 8
   %3 = alloca i32, i64 1, align 4
@@ -27,8 +28,10 @@
   br label %omp_parallel
 
 omp_parallel:                                     ; preds = %entry
-  %gep_ = getelementptr { ptr }, ptr %structArg, i32 0, i32 0
+  %gep_ = getelementptr { ptr, ptr }, ptr %structArg, i32 0, i32 0
   store ptr %2, ptr %gep_, align 8
+  %gep_atomic.temp.load = getelementptr { ptr, ptr }, ptr %structArg, i32 0, i32 1
+  store ptr %atomic.temp.load, ptr %gep_atomic.temp.load, align 8
   call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 1, ptr @_QQmain..omp_par, ptr %structArg)
   br label %omp.par.exit
 
@@ -45,8 +48,10 @@
 ; Function Attrs: nounwind
 define internal void @_QQmain..omp_par(ptr noalias %tid.addr, ptr noalias %zero.addr, ptr %0) #0 {
 omp.par.entry:
-  %gep_ = getelementptr { ptr }, ptr %0, i32 0, i32 0
+  %gep_ = getelementptr { ptr, ptr }, ptr %0, i32 0, i32 0
   %loadgep_ = load ptr, ptr %gep_, align 8
+  %gep_atomic.temp.load = getelementptr { ptr, ptr }, ptr %0, i32 0, i32 1
+  %loadgep_atomic.temp.load = load ptr, ptr %gep_atomic.temp.load, align 8
   %p.lastiter = alloca i32, align 4
   %p.lowerbound = alloca i32, align 4
   %p.upperbound = alloca i32, align 4
@@ -123,9 +128,8 @@
 
 omp.loop_nest.region:                             ; preds = %omp_loop.body
   store i32 %8, ptr %omp.private.alloc, align 4
-  %atomic.temp.load = alloca { float, float }, align 8
-  call void @__atomic_load(i64 8, ptr %loadgep_, ptr %atomic.temp.load, i32 0)
-  %9 = load { float, float }, ptr %atomic.temp.load, align 8
+  call void @__atomic_load(i64 8, ptr %loadgep_, ptr %loadgep_atomic.temp.load, i32 0)
+  %9 = load { float, float }, ptr %loadgep_atomic.temp.load, align 8
   br label %.atomic.cont
 
 .atomic.cont:                                     ; preds = %.atomic.cont, %omp.loop_nest.region
@@ -137,8 +141,8 @@
   %15 = insertvalue { float, float } undef, float %13, 0
   %16 = insertvalue { float, float } %15, float %14, 1
   store { float, float } %16, ptr %x.new.val, align 4
-  %17 = call i1 @__atomic_compare_exchange(i64 8, ptr %loadgep_, ptr %atomic.temp.load, ptr %x.new.val, i32 2, i32 2)
-  %18 = load { float, float }, ptr %atomic.temp.load, align 4
+  %17 = call i1 @__atomic_compare_exchange(i64 8, ptr %loadgep_, ptr %loadgep_atomic.temp.load, ptr %x.new.val, i32 2, i32 2)
+  %18 = load { float, float }, ptr %loadgep_atomic.temp.load, align 4
   br i1 %17, label %.atomic.exit, label %.atomic.cont
 
 .atomic.exit:                                     ; preds = %.atomic.cont
@@ -203,6 +207,6 @@
 
 !0 = !{i32 7, !"openmp", i32 11}
 !1 = !{i32 2, !"Debug Info Version", i32 3}
-!2 = !{!"flang version 21.0.0 (git at github.com:llvm/llvm-project.git 7967a6c7792af8fb7b8fe8957235e517839c4a96)"}
+!2 = !{!"flang version 21.0.0 (git at github.com:NimishMishra/f18-llvm-project.git 5753d49b7b989b0079b321c38576a1fc98ac6cbe)"}
 !3 = !{!4}
 !4 = !{i64 2, i64 -1, i64 -1, i1 true}

```

https://github.com/llvm/llvm-project/pull/132888


More information about the Mlir-commits mailing list