@@ -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