Skip to content

Commit 5753d49

Browse files
committed
[mlir][llvm][OpenMP] Hoist __atomic_load allocas
1 parent 9ee950b commit 5753d49

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

flang/test/Integration/OpenMP/atomic-capture-complex.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
!RUN: %if x86-registered-target %{ %flang_fc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fopenmp %s -o - | FileCheck --check-prefixes=CHECK,X86 %s %}
1010
!RUN: %if aarch64-registerd-target %{ %flang_fc1 -triple aarch64-unknown-linux-gnu -emit-llvm -fopenmp %s -o - | FileCheck --check-prefixes=CHECK,AARCH64 %s %}
1111

12+
!CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
1213
!CHECK: %[[X_NEW_VAL:.*]] = alloca { float, float }, align 8
1314
!CHECK: %[[VAL_1:.*]] = alloca { float, float }, i64 1, align 8
1415
!CHECK: %[[ORIG_VAL:.*]] = alloca { float, float }, i64 1, align 8
1516
!CHECK: store { float, float } { float 2.000000e+00, float 2.000000e+00 }, ptr %[[ORIG_VAL]], align 4
1617
!CHECK: br label %entry
1718

1819
!CHECK: entry:
19-
!CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
2020
!CHECK: call void @__atomic_load(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
2121
!CHECK: %[[PHI_NODE_ENTRY_1:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 8
2222
!CHECK: br label %.atomic.cont

llvm/lib/Frontend/Atomic/Atomic.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,14 @@ AtomicInfo::EmitAtomicLoadLibcall(AtomicOrdering AO) {
118118
Value *PtrVal = getAtomicPointer();
119119
PtrVal = Builder->CreateAddrSpaceCast(PtrVal, PointerType::getUnqual(Ctx));
120120
Args.push_back(PtrVal);
121+
122+
auto CurrentIP = Builder->saveIP();
123+
BasicBlock &InsertBB =
124+
Builder->GetInsertBlock()->getParent()->getEntryBlock();
125+
Builder->SetInsertPoint(&InsertBB, InsertBB.getFirstInsertionPt());
121126
AllocaInst *AllocaResult =
122127
CreateAlloca(Ty, getAtomicPointer()->getName() + "atomic.temp.load");
128+
Builder->restoreIP(CurrentIP);
123129
const Align AllocaAlignment = DL.getPrefTypeAlign(SizedIntTy);
124130
AllocaResult->setAlignment(AllocaAlignment);
125131
Args.push_back(AllocaResult);

mlir/test/Target/LLVMIR/openmp-llvm.mlir

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,7 @@ llvm.func @omp_atomic_read(%arg0 : !llvm.ptr, %arg1 : !llvm.ptr) -> () {
13681368

13691369
// CHECK-LABEL: @omp_atomic_read_implicit_cast
13701370
llvm.func @omp_atomic_read_implicit_cast () {
1371+
//CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = alloca { float, float }, align 8
13711372
//CHECK: %[[Z:.*]] = alloca float, i64 1, align 4
13721373
//CHECK: %[[Y:.*]] = alloca double, i64 1, align 8
13731374
//CHECK: %[[X:.*]] = alloca [2 x { float, float }], i64 1, align 8
@@ -1392,7 +1393,6 @@ llvm.func @omp_atomic_read_implicit_cast () {
13921393
%16 = llvm.mul %10, %9 overflow<nsw> : i64
13931394
%17 = llvm.getelementptr %5[%15] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(f32, f32)>
13941395

1395-
//CHECK: %[[ATOMIC_LOAD_TEMP:.*]] = alloca { float, float }, align 8
13961396
//CHECK: call void @__atomic_load(i64 8, ptr %[[X_ELEMENT]], ptr %[[ATOMIC_LOAD_TEMP]], i32 0)
13971397
//CHECK: %[[LOAD:.*]] = load { float, float }, ptr %[[ATOMIC_LOAD_TEMP]], align 8
13981398
//CHECK: %[[EXT:.*]] = extractvalue { float, float } %[[LOAD]], 0
@@ -1480,14 +1480,14 @@ llvm.func @omp_atomic_update(%x:!llvm.ptr, %expr: i32, %xbool: !llvm.ptr, %exprb
14801480

14811481
// -----
14821482

1483+
//CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
14831484
//CHECK: %[[X_NEW_VAL:.*]] = alloca { float, float }, align 8
14841485
//CHECK: {{.*}} = alloca { float, float }, i64 1, align 8
14851486
//CHECK: %[[ORIG_VAL:.*]] = alloca { float, float }, i64 1, align 8
14861487

14871488
//CHECK: br label %entry
14881489

14891490
//CHECK: entry:
1490-
//CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
14911491
//CHECK: call void @__atomic_load(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
14921492
//CHECK: %[[PHI_NODE_ENTRY_1:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 8
14931493
//CHECK: br label %.atomic.cont
@@ -1532,14 +1532,14 @@ llvm.func @_QPomp_atomic_update_complex() {
15321532

15331533
// -----
15341534

1535+
//CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
15351536
//CHECK: %[[X_NEW_VAL:.*]] = alloca { float, float }, align 8
15361537
//CHECK: %[[VAL_1:.*]] = alloca { float, float }, i64 1, align 8
15371538
//CHECK: %[[ORIG_VAL:.*]] = alloca { float, float }, i64 1, align 8
15381539
//CHECK: store { float, float } { float 2.000000e+00, float 2.000000e+00 }, ptr %[[ORIG_VAL]], align 4
15391540
//CHECK: br label %entry
15401541

15411542
//CHECK: entry: ; preds = %0
1542-
//CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
15431543
//CHECK: call void @__atomic_load(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
15441544
//CHECK: %[[PHI_NODE_ENTRY_1:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 8
15451545
//CHECK: br label %.atomic.cont
@@ -1597,9 +1597,9 @@ llvm.func @_QPomp_atomic_capture_complex() {
15971597
// CHECK-LABEL: define void @omp_atomic_read_complex() {
15981598
llvm.func @omp_atomic_read_complex(){
15991599

1600+
// CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
16001601
// CHECK: %[[a:.*]] = alloca { float, float }, i64 1, align 8
16011602
// CHECK: %[[b:.*]] = alloca { float, float }, i64 1, align 8
1602-
// CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
16031603
// CHECK: call void @__atomic_load(i64 8, ptr %[[b]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
16041604
// CHECK: %[[LOADED_VAL:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 8
16051605
// CHECK: store { float, float } %[[LOADED_VAL]], ptr %[[a]], align 4

0 commit comments

Comments
 (0)