https://github.com/ssahasra updated https://github.com/llvm/llvm-project/pull/125627
>From eb432f46aa1033432930e94f7db4ffc708a6f2a9 Mon Sep 17 00:00:00 2001 From: Sameer Sahasrabuddhe <sameer.sahasrabud...@amd.com> Date: Thu, 9 Jan 2025 13:36:20 +0530 Subject: [PATCH] [llvm] Create() functions for ConvergenceControlInst --- clang/lib/CodeGen/CGStmt.cpp | 25 ++++--------------------- llvm/include/llvm/IR/IntrinsicInst.h | 5 +++++ llvm/lib/IR/IntrinsicInst.cpp | 28 ++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index e2ae1046c084a8e..c96301c306d4123 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -3305,18 +3305,9 @@ CodeGenFunction::addConvergenceControlToken(llvm::CallBase *Input) { llvm::ConvergenceControlInst * CodeGenFunction::emitConvergenceLoopToken(llvm::BasicBlock *BB) { - CGBuilderTy::InsertPoint IP = Builder.saveIP(); - if (BB->empty()) - Builder.SetInsertPoint(BB); - else - Builder.SetInsertPoint(BB->getFirstInsertionPt()); - - llvm::CallBase *CB = Builder.CreateIntrinsic( - llvm::Intrinsic::experimental_convergence_loop, {}, {}); - Builder.restoreIP(IP); - - CB = addConvergenceControlToken(CB); - return cast<llvm::ConvergenceControlInst>(CB); + llvm::ConvergenceControlInst *ParentToken = ConvergenceTokenStack.back(); + assert(ParentToken); + return llvm::ConvergenceControlInst::CreateLoop(*BB, ParentToken); } llvm::ConvergenceControlInst * @@ -3329,13 +3320,5 @@ CodeGenFunction::getOrEmitConvergenceEntryToken(llvm::Function *F) { // Adding a convergence token requires the function to be marked as // convergent. F->setConvergent(); - - CGBuilderTy::InsertPoint IP = Builder.saveIP(); - Builder.SetInsertPoint(&BB->front()); - llvm::CallBase *I = Builder.CreateIntrinsic( - llvm::Intrinsic::experimental_convergence_entry, {}, {}); - assert(isa<llvm::IntrinsicInst>(I)); - Builder.restoreIP(IP); - - return cast<llvm::ConvergenceControlInst>(I); + return llvm::ConvergenceControlInst::CreateEntry(*BB); } diff --git a/llvm/include/llvm/IR/IntrinsicInst.h b/llvm/include/llvm/IR/IntrinsicInst.h index 6ccbb6b185c7d96..93750d6e3845efd 100644 --- a/llvm/include/llvm/IR/IntrinsicInst.h +++ b/llvm/include/llvm/IR/IntrinsicInst.h @@ -1882,6 +1882,11 @@ class ConvergenceControlInst : public IntrinsicInst { bool isLoop() const { return getIntrinsicID() == Intrinsic::experimental_convergence_loop; } + + static ConvergenceControlInst *CreateAnchor(BasicBlock &BB); + static ConvergenceControlInst *CreateEntry(BasicBlock &BB); + static ConvergenceControlInst *CreateLoop(BasicBlock &BB, + ConvergenceControlInst *Parent); }; } // end namespace llvm diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp index ad174b1487a6435..256bce1abe71fad 100644 --- a/llvm/lib/IR/IntrinsicInst.cpp +++ b/llvm/lib/IR/IntrinsicInst.cpp @@ -885,3 +885,31 @@ Value *GCRelocateInst::getDerivedPtr() const { return *(Opt->Inputs.begin() + getDerivedPtrIndex()); return *(GCInst->arg_begin() + getDerivedPtrIndex()); } + +ConvergenceControlInst *ConvergenceControlInst::CreateAnchor(BasicBlock &BB) { + Module *M = BB.getModule(); + Function *Fn = Intrinsic::getOrInsertDeclaration( + M, llvm::Intrinsic::experimental_convergence_anchor); + auto *Call = CallInst::Create(Fn, "", BB.getFirstInsertionPt()); + return cast<ConvergenceControlInst>(Call); +} + +ConvergenceControlInst *ConvergenceControlInst::CreateEntry(BasicBlock &BB) { + Module *M = BB.getModule(); + Function *Fn = Intrinsic::getOrInsertDeclaration( + M, llvm::Intrinsic::experimental_convergence_entry); + auto *Call = CallInst::Create(Fn, "", BB.getFirstInsertionPt()); + return cast<ConvergenceControlInst>(Call); +} + +ConvergenceControlInst * +ConvergenceControlInst::CreateLoop(BasicBlock &BB, + ConvergenceControlInst *ParentToken) { + Module *M = BB.getModule(); + Function *Fn = Intrinsic::getOrInsertDeclaration( + M, llvm::Intrinsic::experimental_convergence_loop); + llvm::Value *BundleArgs[] = {ParentToken}; + llvm::OperandBundleDef OB("convergencectrl", BundleArgs); + auto *Call = CallInst::Create(Fn, {}, {OB}, "", BB.getFirstInsertionPt()); + return cast<ConvergenceControlInst>(Call); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits