Skip to content

Commit df67e37

Browse files
authored
[clang][NFC] clean up the handling of convergence control tokens (#121738)
1 parent 4ebfd43 commit df67e37

File tree

3 files changed

+29
-44
lines changed

3 files changed

+29
-44
lines changed

clang/lib/CodeGen/CGCall.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4871,7 +4871,7 @@ llvm::CallInst *CodeGenFunction::EmitRuntimeCall(llvm::FunctionCallee callee,
48714871
call->setCallingConv(getRuntimeCC());
48724872

48734873
if (CGM.shouldEmitConvergenceTokens() && call->isConvergent())
4874-
return addControlledConvergenceToken(call);
4874+
return cast<llvm::CallInst>(addConvergenceControlToken(call));
48754875
return call;
48764876
}
48774877

@@ -5787,7 +5787,7 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
57875787
CI->setName("call");
57885788

57895789
if (CGM.shouldEmitConvergenceTokens() && CI->isConvergent())
5790-
CI = addControlledConvergenceToken(CI);
5790+
CI = addConvergenceControlToken(CI);
57915791

57925792
// Update largest vector width from the return type.
57935793
LargestVectorWidth =

clang/lib/CodeGen/CGStmt.cpp

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,8 +1024,8 @@ void CodeGenFunction::EmitWhileStmt(const WhileStmt &S,
10241024
EmitBlock(LoopHeader.getBlock());
10251025

10261026
if (CGM.shouldEmitConvergenceTokens())
1027-
ConvergenceTokenStack.push_back(emitConvergenceLoopToken(
1028-
LoopHeader.getBlock(), ConvergenceTokenStack.back()));
1027+
ConvergenceTokenStack.push_back(
1028+
emitConvergenceLoopToken(LoopHeader.getBlock()));
10291029

10301030
// Create an exit block for when the condition fails, which will
10311031
// also become the break target.
@@ -1152,8 +1152,7 @@ void CodeGenFunction::EmitDoStmt(const DoStmt &S,
11521152
EmitBlockWithFallThrough(LoopBody, &S);
11531153

11541154
if (CGM.shouldEmitConvergenceTokens())
1155-
ConvergenceTokenStack.push_back(
1156-
emitConvergenceLoopToken(LoopBody, ConvergenceTokenStack.back()));
1155+
ConvergenceTokenStack.push_back(emitConvergenceLoopToken(LoopBody));
11571156

11581157
{
11591158
RunCleanupsScope BodyScope(*this);
@@ -1231,8 +1230,7 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S,
12311230
EmitBlock(CondBlock);
12321231

12331232
if (CGM.shouldEmitConvergenceTokens())
1234-
ConvergenceTokenStack.push_back(
1235-
emitConvergenceLoopToken(CondBlock, ConvergenceTokenStack.back()));
1233+
ConvergenceTokenStack.push_back(emitConvergenceLoopToken(CondBlock));
12361234

12371235
const SourceRange &R = S.getSourceRange();
12381236
LoopStack.push(CondBlock, CGM.getContext(), CGM.getCodeGenOpts(), ForAttrs,
@@ -1369,8 +1367,7 @@ CodeGenFunction::EmitCXXForRangeStmt(const CXXForRangeStmt &S,
13691367
EmitBlock(CondBlock);
13701368

13711369
if (CGM.shouldEmitConvergenceTokens())
1372-
ConvergenceTokenStack.push_back(
1373-
emitConvergenceLoopToken(CondBlock, ConvergenceTokenStack.back()));
1370+
ConvergenceTokenStack.push_back(emitConvergenceLoopToken(CondBlock));
13741371

13751372
const SourceRange &R = S.getSourceRange();
13761373
LoopStack.push(CondBlock, CGM.getContext(), CGM.getCodeGenOpts(), ForAttrs,
@@ -3245,35 +3242,32 @@ CodeGenFunction::GenerateCapturedStmtFunction(const CapturedStmt &S) {
32453242
return F;
32463243
}
32473244

3248-
namespace {
32493245
// Returns the first convergence entry/loop/anchor instruction found in |BB|.
32503246
// std::nullptr otherwise.
3251-
llvm::IntrinsicInst *getConvergenceToken(llvm::BasicBlock *BB) {
3247+
static llvm::ConvergenceControlInst *getConvergenceToken(llvm::BasicBlock *BB) {
32523248
for (auto &I : *BB) {
3253-
auto *II = dyn_cast<llvm::IntrinsicInst>(&I);
3254-
if (II && llvm::isConvergenceControlIntrinsic(II->getIntrinsicID()))
3255-
return II;
3249+
if (auto *CI = dyn_cast<llvm::ConvergenceControlInst>(&I))
3250+
return CI;
32563251
}
32573252
return nullptr;
32583253
}
32593254

3260-
} // namespace
3261-
32623255
llvm::CallBase *
3263-
CodeGenFunction::addConvergenceControlToken(llvm::CallBase *Input,
3264-
llvm::Value *ParentToken) {
3256+
CodeGenFunction::addConvergenceControlToken(llvm::CallBase *Input) {
3257+
llvm::ConvergenceControlInst *ParentToken = ConvergenceTokenStack.back();
3258+
assert(ParentToken);
3259+
32653260
llvm::Value *bundleArgs[] = {ParentToken};
32663261
llvm::OperandBundleDef OB("convergencectrl", bundleArgs);
3267-
auto Output = llvm::CallBase::addOperandBundle(
3262+
auto *Output = llvm::CallBase::addOperandBundle(
32683263
Input, llvm::LLVMContext::OB_convergencectrl, OB, Input->getIterator());
32693264
Input->replaceAllUsesWith(Output);
32703265
Input->eraseFromParent();
32713266
return Output;
32723267
}
32733268

3274-
llvm::IntrinsicInst *
3275-
CodeGenFunction::emitConvergenceLoopToken(llvm::BasicBlock *BB,
3276-
llvm::Value *ParentToken) {
3269+
llvm::ConvergenceControlInst *
3270+
CodeGenFunction::emitConvergenceLoopToken(llvm::BasicBlock *BB) {
32773271
CGBuilderTy::InsertPoint IP = Builder.saveIP();
32783272
if (BB->empty())
32793273
Builder.SetInsertPoint(BB);
@@ -3284,14 +3278,14 @@ CodeGenFunction::emitConvergenceLoopToken(llvm::BasicBlock *BB,
32843278
llvm::Intrinsic::experimental_convergence_loop, {}, {});
32853279
Builder.restoreIP(IP);
32863280

3287-
llvm::CallBase *I = addConvergenceControlToken(CB, ParentToken);
3288-
return cast<llvm::IntrinsicInst>(I);
3281+
CB = addConvergenceControlToken(CB);
3282+
return cast<llvm::ConvergenceControlInst>(CB);
32893283
}
32903284

3291-
llvm::IntrinsicInst *
3285+
llvm::ConvergenceControlInst *
32923286
CodeGenFunction::getOrEmitConvergenceEntryToken(llvm::Function *F) {
32933287
llvm::BasicBlock *BB = &F->getEntryBlock();
3294-
llvm::IntrinsicInst *Token = getConvergenceToken(BB);
3288+
llvm::ConvergenceControlInst *Token = getConvergenceToken(BB);
32953289
if (Token)
32963290
return Token;
32973291

@@ -3306,5 +3300,5 @@ CodeGenFunction::getOrEmitConvergenceEntryToken(llvm::Function *F) {
33063300
assert(isa<llvm::IntrinsicInst>(I));
33073301
Builder.restoreIP(IP);
33083302

3309-
return cast<llvm::IntrinsicInst>(I);
3303+
return cast<llvm::ConvergenceControlInst>(I);
33103304
}

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ class CodeGenFunction : public CodeGenTypeCache {
315315
SmallVector<const BinaryOperator *, 16> MCDCLogOpStack;
316316

317317
/// Stack to track the controlled convergence tokens.
318-
SmallVector<llvm::IntrinsicInst *, 4> ConvergenceTokenStack;
318+
SmallVector<llvm::ConvergenceControlInst *, 4> ConvergenceTokenStack;
319319

320320
/// Number of nested loop to be consumed by the last surrounding
321321
/// loop-associated directive.
@@ -5234,29 +5234,20 @@ class CodeGenFunction : public CodeGenTypeCache {
52345234
llvm::Value *emitBoolVecConversion(llvm::Value *SrcVec,
52355235
unsigned NumElementsDst,
52365236
const llvm::Twine &Name = "");
5237-
// Adds a convergence_ctrl token to |Input| and emits the required parent
5238-
// convergence instructions.
5239-
template <typename CallType>
5240-
CallType *addControlledConvergenceToken(CallType *Input) {
5241-
return cast<CallType>(
5242-
addConvergenceControlToken(Input, ConvergenceTokenStack.back()));
5243-
}
52445237

52455238
private:
52465239
// Emits a convergence_loop instruction for the given |BB|, with |ParentToken|
52475240
// as it's parent convergence instr.
5248-
llvm::IntrinsicInst *emitConvergenceLoopToken(llvm::BasicBlock *BB,
5249-
llvm::Value *ParentToken);
5241+
llvm::ConvergenceControlInst *emitConvergenceLoopToken(llvm::BasicBlock *BB);
5242+
52505243
// Adds a convergence_ctrl token with |ParentToken| as parent convergence
52515244
// instr to the call |Input|.
5252-
llvm::CallBase *addConvergenceControlToken(llvm::CallBase *Input,
5253-
llvm::Value *ParentToken);
5245+
llvm::CallBase *addConvergenceControlToken(llvm::CallBase *Input);
5246+
52545247
// Find the convergence_entry instruction |F|, or emits ones if none exists.
52555248
// Returns the convergence instruction.
5256-
llvm::IntrinsicInst *getOrEmitConvergenceEntryToken(llvm::Function *F);
5257-
// Find the convergence_loop instruction for the loop defined by |LI|, or
5258-
// emits one if none exists. Returns the convergence instruction.
5259-
llvm::IntrinsicInst *getOrEmitConvergenceLoopToken(const LoopInfo *LI);
5249+
llvm::ConvergenceControlInst *
5250+
getOrEmitConvergenceEntryToken(llvm::Function *F);
52605251

52615252
private:
52625253
llvm::MDNode *getRangeForLoadFromType(QualType Ty);

0 commit comments

Comments
 (0)