diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -1165,7 +1165,8 @@ /// For complex Operations: X = UpdateOp(X) => CmpExch X, old_X, UpdateOp(X) /// Only Scalar data types. /// - /// \param AllocIP Instruction to create AllocaInst before. + /// \param AllocaIP The insertion point to be used for alloca + /// instructions. /// \param X The target atomic pointer to be updated /// \param Expr The value to update X with. /// \param AO Atomic ordering of the generated atomic @@ -1183,7 +1184,7 @@ /// /// \returns A pair of the old value of X before the update, and the value /// used for the update. - std::pair emitAtomicUpdate(Instruction *AllocIP, Value *X, + std::pair emitAtomicUpdate(InsertPointTy AllocaIP, Value *X, Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp, @@ -1236,7 +1237,7 @@ /// Only Scalar data types. /// /// \param Loc The insert and source location description. - /// \param AllocIP Instruction to create AllocaInst before. + /// \param AllocaIP The insertion point to be used for alloca instructions. /// \param X The target atomic pointer to be updated /// \param Expr The value to update X with. /// \param AO Atomic ordering of the generated atomic instructions. @@ -1252,7 +1253,7 @@ /// /// \return Insertion point after generated atomic update IR. InsertPointTy createAtomicUpdate(const LocationDescription &Loc, - Instruction *AllocIP, AtomicOpValue &X, + InsertPointTy AllocaIP, AtomicOpValue &X, Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp, @@ -1267,7 +1268,7 @@ /// X = UpdateOp(X); V = X, /// /// \param Loc The insert and source location description. - /// \param AllocIP Instruction to create AllocaInst before. + /// \param AllocaIP The insertion point to be used for alloca instructions. /// \param X The target atomic pointer to be updated /// \param V Memory address where to store captured value /// \param Expr The value to update X with. @@ -1288,7 +1289,7 @@ /// /// \return Insertion point after generated atomic capture IR. InsertPointTy - createAtomicCapture(const LocationDescription &Loc, Instruction *AllocIP, + createAtomicCapture(const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X, AtomicOpValue &V, Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp, bool UpdateExpr, diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -3205,7 +3205,7 @@ } OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createAtomicUpdate( - const LocationDescription &Loc, Instruction *AllocIP, AtomicOpValue &X, + const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X, Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp, bool IsXBinopExpr) { if (!updateToLocation(Loc)) @@ -3224,7 +3224,7 @@ "OpenMP atomic does not support LT or GT operations"); }); - emitAtomicUpdate(AllocIP, X.Var, Expr, AO, RMWOp, UpdateOp, X.IsVolatile, + emitAtomicUpdate(AllocaIP, X.Var, Expr, AO, RMWOp, UpdateOp, X.IsVolatile, IsXBinopExpr); checkAndEmitFlushAfterAtomic(Loc, AO, AtomicKind::Update); return Builder.saveIP(); @@ -3259,7 +3259,7 @@ } std::pair -OpenMPIRBuilder::emitAtomicUpdate(Instruction *AllocIP, Value *X, Value *Expr, +OpenMPIRBuilder::emitAtomicUpdate(InsertPointTy AllocaIP, Value *X, Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp, bool VolatileX, bool IsXBinopExpr) { @@ -3301,9 +3301,10 @@ Builder.SetInsertPoint(ContBB); llvm::PHINode *PHI = Builder.CreatePHI(OldVal->getType(), 2); PHI->addIncoming(OldVal, CurBB); + Builder.restoreIP(AllocaIP); AllocaInst *NewAtomicAddr = Builder.CreateAlloca(XElemTy); NewAtomicAddr->setName(X->getName() + "x.new.val"); - NewAtomicAddr->moveBefore(AllocIP); + Builder.SetInsertPoint(ContBB); IntegerType *NewAtomicCastTy = IntegerType::get(M.getContext(), XElemTy->getScalarSizeInBits()); bool IsIntTy = XElemTy->isIntegerTy(); @@ -3357,7 +3358,7 @@ } OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createAtomicCapture( - const LocationDescription &Loc, Instruction *AllocIP, AtomicOpValue &X, + const LocationDescription &Loc, InsertPointTy AllocaIP, AtomicOpValue &X, AtomicOpValue &V, Value *Expr, AtomicOrdering AO, AtomicRMWInst::BinOp RMWOp, AtomicUpdateCallbackTy &UpdateOp, bool UpdateExpr, bool IsPostfixUpdate, bool IsXBinopExpr) { @@ -3379,8 +3380,9 @@ // If UpdateExpr is 'x' updated with some `expr` not based on 'x', // 'x' is simply atomically rewritten with 'expr'. AtomicRMWInst::BinOp AtomicOp = (UpdateExpr ? RMWOp : AtomicRMWInst::Xchg); - std::pair Result = emitAtomicUpdate( - AllocIP, X.Var, Expr, AO, AtomicOp, UpdateOp, X.IsVolatile, IsXBinopExpr); + std::pair Result = + emitAtomicUpdate(AllocaIP, X.Var, Expr, AO, AtomicOp, UpdateOp, + X.IsVolatile, IsXBinopExpr); Value *CapturedVal = (IsPostfixUpdate ? Result.first : Result.second); Builder.CreateStore(CapturedVal, V.Var, V.IsVolatile); diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -2935,7 +2935,8 @@ bool IsXLHSInRHSPart = false; BasicBlock *EntryBB = BB; - Instruction *AllocIP = EntryBB->getFirstNonPHI(); + OpenMPIRBuilder::InsertPointTy AllocaIP(EntryBB, + EntryBB->getFirstInsertionPt()); Value *Sub = nullptr; auto UpdateOp = [&](Value *Atomic, IRBuilder<> &IRB) { @@ -2943,7 +2944,7 @@ return Sub; }; Builder.restoreIP(OMPBuilder.createAtomicUpdate( - Builder, AllocIP, X, Expr, AO, RMWOp, UpdateOp, IsXLHSInRHSPart)); + Builder, AllocaIP, X, Expr, AO, RMWOp, UpdateOp, IsXLHSInRHSPart)); BasicBlock *ContBB = EntryBB->getSingleSuccessor(); BranchInst *ContTI = dyn_cast(ContBB->getTerminator()); EXPECT_NE(ContTI, nullptr); @@ -3008,13 +3009,14 @@ bool UpdateExpr = true; BasicBlock *EntryBB = BB; - Instruction *AllocIP = EntryBB->getFirstNonPHI(); + OpenMPIRBuilder::InsertPointTy AllocaIP(EntryBB, + EntryBB->getFirstInsertionPt()); // integer update - not used auto UpdateOp = [&](Value *Atomic, IRBuilder<> &IRB) { return nullptr; }; Builder.restoreIP(OMPBuilder.createAtomicCapture( - Builder, AllocIP, X, V, Expr, AO, RMWOp, UpdateOp, UpdateExpr, + Builder, AllocaIP, X, V, Expr, AO, RMWOp, UpdateOp, UpdateExpr, IsPostfixUpdate, IsXLHSInRHSPart)); EXPECT_EQ(EntryBB->getParent()->size(), 1U); AtomicRMWInst *ARWM = dyn_cast(Init->getNextNode());