[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