[clang] [llvm] [llvm] Create() functions for ConvergenceControlInst (PR #125627)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 3 21:00:29 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Sameer Sahasrabuddhe (ssahasra)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/125627.diff
3 Files Affected:
- (modified) clang/lib/CodeGen/CGStmt.cpp (+4-21)
- (modified) llvm/include/llvm/IR/IntrinsicInst.h (+4)
- (modified) llvm/lib/IR/IntrinsicInst.cpp (+23)
``````````diff
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 7c944fe85a352d5..f7aea9da9177a4a 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -3303,18 +3303,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 *
@@ -3327,13 +3318,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..ba7a0219ebcaefb 100644
--- a/llvm/include/llvm/IR/IntrinsicInst.h
+++ b/llvm/include/llvm/IR/IntrinsicInst.h
@@ -1882,6 +1882,10 @@ 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..eb358b9fdea1e1c 100644
--- a/llvm/lib/IR/IntrinsicInst.cpp
+++ b/llvm/lib/IR/IntrinsicInst.cpp
@@ -885,3 +885,26 @@ 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);
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/125627
More information about the cfe-commits
mailing list