@@ -8749,6 +8749,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
8749
8749
Res.second = emitRMWOpAsInstruction (Res.first , Expr, RMWOp);
8750
8750
} else if (RMWOp == llvm::AtomicRMWInst::BinOp::BAD_BINOP &&
8751
8751
XElemTy->isStructTy ()) {
8752
+ auto *StackSave = Builder.CreateStackSave ();
8752
8753
LoadInst *OldVal =
8753
8754
Builder.CreateLoad (XElemTy, X, X->getName () + " .atomic.load" );
8754
8755
OldVal->setAtomic (AO);
@@ -8760,6 +8761,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
8760
8761
&Builder, XElemTy, LoadSize * 8 , LoadSize * 8 , OldVal->getAlign (),
8761
8762
OldVal->getAlign (), true /* UseLibcall */ , X);
8762
8763
auto AtomicLoadRes = atomicInfo.EmitAtomicLoadLibcall (AO);
8764
+
8763
8765
BasicBlock *CurBB = Builder.GetInsertBlock ();
8764
8766
Instruction *CurBBTI = CurBB->getTerminator ();
8765
8767
CurBBTI = CurBBTI ? CurBBTI : Builder.CreateUnreachable ();
@@ -8785,6 +8787,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate(
8785
8787
auto Result = atomicInfo.EmitAtomicCompareExchangeLibcall (
8786
8788
AtomicLoadRes.second , NewAtomicAddr, AO, Failure);
8787
8789
LoadInst *PHILoad = Builder.CreateLoad (XElemTy, Result.first );
8790
+ Builder.CreateStackRestore (StackSave);
8788
8791
PHI->addIncoming (PHILoad, Builder.GetInsertBlock ());
8789
8792
Builder.CreateCondBr (Result.second , ExitBB, ContBB);
8790
8793
OldVal->eraseFromParent ();
0 commit comments