@@ -1024,8 +1024,8 @@ void CodeGenFunction::EmitWhileStmt(const WhileStmt &S,
1024
1024
EmitBlock (LoopHeader.getBlock ());
1025
1025
1026
1026
if (CGM.shouldEmitConvergenceTokens ())
1027
- ConvergenceTokenStack.push_back (emitConvergenceLoopToken (
1028
- LoopHeader.getBlock (), ConvergenceTokenStack. back ()));
1027
+ ConvergenceTokenStack.push_back (
1028
+ emitConvergenceLoopToken ( LoopHeader.getBlock ()));
1029
1029
1030
1030
// Create an exit block for when the condition fails, which will
1031
1031
// also become the break target.
@@ -1152,8 +1152,7 @@ void CodeGenFunction::EmitDoStmt(const DoStmt &S,
1152
1152
EmitBlockWithFallThrough (LoopBody, &S);
1153
1153
1154
1154
if (CGM.shouldEmitConvergenceTokens ())
1155
- ConvergenceTokenStack.push_back (
1156
- emitConvergenceLoopToken (LoopBody, ConvergenceTokenStack.back ()));
1155
+ ConvergenceTokenStack.push_back (emitConvergenceLoopToken (LoopBody));
1157
1156
1158
1157
{
1159
1158
RunCleanupsScope BodyScope (*this );
@@ -1231,8 +1230,7 @@ void CodeGenFunction::EmitForStmt(const ForStmt &S,
1231
1230
EmitBlock (CondBlock);
1232
1231
1233
1232
if (CGM.shouldEmitConvergenceTokens ())
1234
- ConvergenceTokenStack.push_back (
1235
- emitConvergenceLoopToken (CondBlock, ConvergenceTokenStack.back ()));
1233
+ ConvergenceTokenStack.push_back (emitConvergenceLoopToken (CondBlock));
1236
1234
1237
1235
const SourceRange &R = S.getSourceRange ();
1238
1236
LoopStack.push (CondBlock, CGM.getContext (), CGM.getCodeGenOpts (), ForAttrs,
@@ -1369,8 +1367,7 @@ CodeGenFunction::EmitCXXForRangeStmt(const CXXForRangeStmt &S,
1369
1367
EmitBlock (CondBlock);
1370
1368
1371
1369
if (CGM.shouldEmitConvergenceTokens ())
1372
- ConvergenceTokenStack.push_back (
1373
- emitConvergenceLoopToken (CondBlock, ConvergenceTokenStack.back ()));
1370
+ ConvergenceTokenStack.push_back (emitConvergenceLoopToken (CondBlock));
1374
1371
1375
1372
const SourceRange &R = S.getSourceRange ();
1376
1373
LoopStack.push (CondBlock, CGM.getContext (), CGM.getCodeGenOpts (), ForAttrs,
@@ -3245,35 +3242,32 @@ CodeGenFunction::GenerateCapturedStmtFunction(const CapturedStmt &S) {
3245
3242
return F;
3246
3243
}
3247
3244
3248
- namespace {
3249
3245
// Returns the first convergence entry/loop/anchor instruction found in |BB|.
3250
3246
// std::nullptr otherwise.
3251
- llvm::IntrinsicInst *getConvergenceToken (llvm::BasicBlock *BB) {
3247
+ static llvm::ConvergenceControlInst *getConvergenceToken (llvm::BasicBlock *BB) {
3252
3248
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;
3256
3251
}
3257
3252
return nullptr ;
3258
3253
}
3259
3254
3260
- } // namespace
3261
-
3262
3255
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
+
3265
3260
llvm::Value *bundleArgs[] = {ParentToken};
3266
3261
llvm::OperandBundleDef OB (" convergencectrl" , bundleArgs);
3267
- auto Output = llvm::CallBase::addOperandBundle (
3262
+ auto * Output = llvm::CallBase::addOperandBundle (
3268
3263
Input, llvm::LLVMContext::OB_convergencectrl, OB, Input->getIterator ());
3269
3264
Input->replaceAllUsesWith (Output);
3270
3265
Input->eraseFromParent ();
3271
3266
return Output;
3272
3267
}
3273
3268
3274
- llvm::IntrinsicInst *
3275
- CodeGenFunction::emitConvergenceLoopToken (llvm::BasicBlock *BB,
3276
- llvm::Value *ParentToken) {
3269
+ llvm::ConvergenceControlInst *
3270
+ CodeGenFunction::emitConvergenceLoopToken (llvm::BasicBlock *BB) {
3277
3271
CGBuilderTy::InsertPoint IP = Builder.saveIP ();
3278
3272
if (BB->empty ())
3279
3273
Builder.SetInsertPoint (BB);
@@ -3284,14 +3278,14 @@ CodeGenFunction::emitConvergenceLoopToken(llvm::BasicBlock *BB,
3284
3278
llvm::Intrinsic::experimental_convergence_loop, {}, {});
3285
3279
Builder.restoreIP (IP);
3286
3280
3287
- llvm::CallBase *I = addConvergenceControlToken (CB, ParentToken );
3288
- return cast<llvm::IntrinsicInst>(I );
3281
+ CB = addConvergenceControlToken (CB);
3282
+ return cast<llvm::ConvergenceControlInst>(CB );
3289
3283
}
3290
3284
3291
- llvm::IntrinsicInst *
3285
+ llvm::ConvergenceControlInst *
3292
3286
CodeGenFunction::getOrEmitConvergenceEntryToken (llvm::Function *F) {
3293
3287
llvm::BasicBlock *BB = &F->getEntryBlock ();
3294
- llvm::IntrinsicInst *Token = getConvergenceToken (BB);
3288
+ llvm::ConvergenceControlInst *Token = getConvergenceToken (BB);
3295
3289
if (Token)
3296
3290
return Token;
3297
3291
@@ -3306,5 +3300,5 @@ CodeGenFunction::getOrEmitConvergenceEntryToken(llvm::Function *F) {
3306
3300
assert (isa<llvm::IntrinsicInst>(I));
3307
3301
Builder.restoreIP (IP);
3308
3302
3309
- return cast<llvm::IntrinsicInst >(I);
3303
+ return cast<llvm::ConvergenceControlInst >(I);
3310
3304
}
0 commit comments