@@ -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-
32623255llvm::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 *
32923286CodeGenFunction::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}
0 commit comments