[clang] [llvm] [llvm] Create() functions for ConvergenceControlInst (PR #125627)
Sameer Sahasrabuddhe via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 3 20:59:58 PST 2025
https://github.com/ssahasra created https://github.com/llvm/llvm-project/pull/125627
None
>From 5d6d4fbbfabf5e33ec366ea113a0e6c93ba46bf4 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 | 4 ++++
llvm/lib/IR/IntrinsicInst.cpp | 23 +++++++++++++++++++++++
3 files changed, 31 insertions(+), 21 deletions(-)
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);
+}
More information about the cfe-commits
mailing list