@@ -404,6 +404,16 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
404
404
BasicBlock *BB = BasicBlock::Create (Ctx, " entry" , EntryFn);
405
405
IRBuilder<> B (BB);
406
406
llvm::SmallVector<Value *> Args;
407
+
408
+ SmallVector<OperandBundleDef, 1 > OB;
409
+ if (CGM.shouldEmitConvergenceTokens ()) {
410
+ assert (EntryFn->isConvergent ());
411
+ llvm::Value *I = B.CreateIntrinsic (
412
+ llvm::Intrinsic::experimental_convergence_entry, {}, {});
413
+ llvm::Value *bundleArgs[] = {I};
414
+ OB.emplace_back (" convergencectrl" , bundleArgs);
415
+ }
416
+
407
417
// FIXME: support struct parameters where semantics are on members.
408
418
// See: https://github.com/llvm/llvm-project/issues/57874
409
419
unsigned SRetOffset = 0 ;
@@ -419,7 +429,7 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
419
429
Args.push_back (emitInputSemantic (B, *PD, Param.getType ()));
420
430
}
421
431
422
- CallInst *CI = B.CreateCall (FunctionCallee (Fn), Args);
432
+ CallInst *CI = B.CreateCall (FunctionCallee (Fn), Args, OB );
423
433
CI->setCallingConv (Fn->getCallingConv ());
424
434
// FIXME: Handle codegen for return type semantics.
425
435
// See: https://github.com/llvm/llvm-project/issues/57875
@@ -474,14 +484,22 @@ void CGHLSLRuntime::generateGlobalCtorDtorCalls() {
474
484
for (auto &F : M.functions ()) {
475
485
if (!F.hasFnAttribute (" hlsl.shader" ))
476
486
continue ;
477
- IRBuilder<> B (&F.getEntryBlock (), F.getEntryBlock ().begin ());
487
+ auto *Token = getConvergenceToken (F.getEntryBlock ());
488
+ Instruction *IP = &*F.getEntryBlock ().begin ();
489
+ SmallVector<OperandBundleDef, 1 > OB;
490
+ if (Token) {
491
+ llvm::Value *bundleArgs[] = {Token};
492
+ OB.emplace_back (" convergencectrl" , bundleArgs);
493
+ IP = Token->getNextNode ();
494
+ }
495
+ IRBuilder<> B (IP);
478
496
for (auto *Fn : CtorFns)
479
- B.CreateCall (FunctionCallee (Fn));
497
+ B.CreateCall (FunctionCallee (Fn), {}, OB );
480
498
481
499
// Insert global dtors before the terminator of the last instruction
482
500
B.SetInsertPoint (F.back ().getTerminator ());
483
501
for (auto *Fn : DtorFns)
484
- B.CreateCall (FunctionCallee (Fn));
502
+ B.CreateCall (FunctionCallee (Fn), {}, OB );
485
503
}
486
504
487
505
// No need to keep global ctors/dtors for non-lib profile after call to
@@ -579,3 +597,18 @@ llvm::Function *CGHLSLRuntime::createResourceBindingInitFn() {
579
597
Builder.CreateRetVoid ();
580
598
return InitResBindingsFunc;
581
599
}
600
+
601
+ llvm::Instruction *CGHLSLRuntime::getConvergenceToken (BasicBlock &BB) {
602
+ if (!CGM.shouldEmitConvergenceTokens ())
603
+ return nullptr ;
604
+
605
+ auto E = BB.end ();
606
+ for (auto I = BB.begin (); I != E; ++I) {
607
+ auto *II = dyn_cast<llvm::IntrinsicInst>(&*I);
608
+ if (II && llvm::isConvergenceControlIntrinsic (II->getIntrinsicID ())) {
609
+ return II;
610
+ }
611
+ }
612
+ llvm_unreachable (" Convergence token should have been emitted." );
613
+ return nullptr ;
614
+ }
0 commit comments