[clang] [llvm] [llvm] Create() functions for ConvergenceControlInst (PR #125627)
Sameer Sahasrabuddhe via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 4 21:15:31 PST 2025
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.sahasrabuddhe at 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);
+}
More information about the cfe-commits
mailing list