================ @@ -1200,34 +1225,78 @@ bool AMDGPUCallLowering::lowerTailCall( if (!IsSibCall) CallSeqStart = MIRBuilder.buildInstr(AMDGPU::ADJCALLSTACKUP); - unsigned Opc = - getCallOpcode(MF, Info.Callee.isReg(), true, ST.isWave32(), CalleeCC); + bool IsChainCall = AMDGPU::isChainCC(Info.CallConv); + bool IsDynamicVGPRChainCall = false; + + if (IsChainCall) { + ArgInfo FlagsArg = Info.OrigArgs[ChainCallArgIdx::Flags]; + const APInt &FlagsValue = cast<ConstantInt>(FlagsArg.OrigValue)->getValue(); + if (FlagsValue.isZero()) { + if (Info.OrigArgs.size() != 5) { + LLVM_DEBUG(dbgs() << "No additional args allowed if flags == 0"); + return false; + } + } else if (FlagsValue.isOneBitSet(0)) { + IsDynamicVGPRChainCall = true; + + if (Info.OrigArgs.size() != 8) { + LLVM_DEBUG(dbgs() << "Expected 3 additional args"); + return false; + } + + // On GFX12, we can only change the VGPR allocation for wave32. + if (!ST.isWave32()) { + LLVM_DEBUG(dbgs() << "Dynamic VGPR mode is only supported for wave32"); + return false; + } + + ArgInfo FallbackExecArg = Info.OrigArgs[ChainCallArgIdx::FallbackExec]; + assert(FallbackExecArg.Regs.size() == 1 && + "Expected single register for fallback EXEC"); + if (!FallbackExecArg.Ty->isIntegerTy(ST.getWavefrontSize())) { + LLVM_DEBUG(dbgs() << "Bad type for fallback EXEC"); + return false; + } ---------------- rovka wrote:
Ok, but also for consistency we'd probably want to do that for all chain calls, not just when dynamic VGPRs are in use. I'll send a separate patch for that. https://github.com/llvm/llvm-project/pull/130094 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits