-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[llvm] Create() functions for ConvergenceControlInst #125627
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Sameer Sahasrabuddhe (ssahasra) ChangesFull diff: https://github.com/llvm/llvm-project/pull/125627.diff 3 Files Affected:
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);
+}
|
@llvm/pr-subscribers-clang-codegen Author: Sameer Sahasrabuddhe (ssahasra) ChangesFull diff: https://github.com/llvm/llvm-project/pull/125627.diff 3 Files Affected:
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);
+}
|
@llvm/pr-subscribers-llvm-ir Author: Sameer Sahasrabuddhe (ssahasra) ChangesFull diff: https://github.com/llvm/llvm-project/pull/125627.diff 3 Files Affected:
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 7c944fe85a352d..f7aea9da9177a4 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 6ccbb6b185c7d9..ba7a0219ebcaef 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 ad174b1487a643..eb358b9fdea1e1 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);
+}
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
0dd249c
to
eb432f4
Compare
No description provided.