Skip to content

Commit 978e715

Browse files
committed
Emit stack save/restore for alloca in __atomic_load
1 parent 9ee950b commit 978e715

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
!CHECK: br label %entry
1717

1818
!CHECK: entry:
19+
!CHECK: %[[STACK_SAVE_PTR:.*]] = call ptr @llvm.stacksave.p0()
1920
!CHECK: %[[ATOMIC_TEMP_LOAD:.*]] = alloca { float, float }, align 8
2021
!CHECK: call void @__atomic_load(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], i32 0)
2122
!CHECK: %[[PHI_NODE_ENTRY_1:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 8
@@ -33,6 +34,7 @@
3334
!CHECK: %[[VAL_11:.*]] = call i1 @__atomic_compare_exchange(i64 8, ptr %[[ORIG_VAL]], ptr %[[ATOMIC_TEMP_LOAD]], ptr %[[X_NEW_VAL]],
3435
!i32 2, i32 2)
3536
!CHECK: %[[VAL_12:.*]] = load { float, float }, ptr %[[ATOMIC_TEMP_LOAD]], align 4
37+
!CHECK: call void @llvm.stackrestore.p0(ptr %[[STACK_SAVE_PTR]])
3638
!CHECK: br i1 %[[VAL_11]], label %.atomic.exit, label %.atomic.cont
3739

3840
!CHECK: .atomic.exit

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8749,6 +8749,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
87498749
Res.second = emitRMWOpAsInstruction(Res.first, Expr, RMWOp);
87508750
} else if (RMWOp == llvm::AtomicRMWInst::BinOp::BAD_BINOP &&
87518751
XElemTy->isStructTy()) {
8752+
auto *StackSave = Builder.CreateStackSave();
87528753
LoadInst *OldVal =
87538754
Builder.CreateLoad(XElemTy, X, X->getName() + ".atomic.load");
87548755
OldVal->setAtomic(AO);
@@ -8760,6 +8761,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
87608761
&Builder, XElemTy, LoadSize * 8, LoadSize * 8, OldVal->getAlign(),
87618762
OldVal->getAlign(), true /* UseLibcall */, X);
87628763
auto AtomicLoadRes = atomicInfo.EmitAtomicLoadLibcall(AO);
8764+
87638765
BasicBlock *CurBB = Builder.GetInsertBlock();
87648766
Instruction *CurBBTI = CurBB->getTerminator();
87658767
CurBBTI = CurBBTI ? CurBBTI : Builder.CreateUnreachable();
@@ -8785,6 +8787,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
87858787
auto Result = atomicInfo.EmitAtomicCompareExchangeLibcall(
87868788
AtomicLoadRes.second, NewAtomicAddr, AO, Failure);
87878789
LoadInst *PHILoad = Builder.CreateLoad(XElemTy, Result.first);
8790+
Builder.CreateStackRestore(StackSave);
87888791
PHI->addIncoming(PHILoad, Builder.GetInsertBlock());
87898792
Builder.CreateCondBr(Result.second, ExitBB, ContBB);
87908793
OldVal->eraseFromParent();

0 commit comments

Comments
 (0)