@@ -1306,16 +1306,61 @@ bool getHasColorExport(const Function &F);
13061306bool getHasDepthExport (const Function &F);
13071307
13081308LLVM_READNONE
1309- bool isShader (CallingConv::ID CC);
1309+ constexpr bool isShader (CallingConv::ID CC) {
1310+ switch (CC) {
1311+ case CallingConv::AMDGPU_VS:
1312+ case CallingConv::AMDGPU_LS:
1313+ case CallingConv::AMDGPU_HS:
1314+ case CallingConv::AMDGPU_ES:
1315+ case CallingConv::AMDGPU_GS:
1316+ case CallingConv::AMDGPU_PS:
1317+ case CallingConv::AMDGPU_CS_Chain:
1318+ case CallingConv::AMDGPU_CS_ChainPreserve:
1319+ case CallingConv::AMDGPU_CS:
1320+ return true ;
1321+ default :
1322+ return false ;
1323+ }
1324+ }
13101325
13111326LLVM_READNONE
1312- bool isGraphics (CallingConv::ID CC);
1327+ constexpr bool isGraphics (CallingConv::ID CC) {
1328+ return isShader (CC) || CC == CallingConv::AMDGPU_Gfx;
1329+ }
13131330
13141331LLVM_READNONE
1315- bool isCompute (CallingConv::ID CC);
1332+ constexpr bool isCompute (CallingConv::ID CC) {
1333+ return !isGraphics (CC) || CC == CallingConv::AMDGPU_CS;
1334+ }
13161335
13171336LLVM_READNONE
1318- bool isEntryFunctionCC (CallingConv::ID CC);
1337+ constexpr bool isEntryFunctionCC (CallingConv::ID CC) {
1338+ switch (CC) {
1339+ case CallingConv::AMDGPU_KERNEL:
1340+ case CallingConv::SPIR_KERNEL:
1341+ case CallingConv::AMDGPU_VS:
1342+ case CallingConv::AMDGPU_GS:
1343+ case CallingConv::AMDGPU_PS:
1344+ case CallingConv::AMDGPU_CS:
1345+ case CallingConv::AMDGPU_ES:
1346+ case CallingConv::AMDGPU_HS:
1347+ case CallingConv::AMDGPU_LS:
1348+ return true ;
1349+ default :
1350+ return false ;
1351+ }
1352+ }
1353+
1354+ LLVM_READNONE
1355+ constexpr bool isChainCC (CallingConv::ID CC) {
1356+ switch (CC) {
1357+ case CallingConv::AMDGPU_CS_Chain:
1358+ case CallingConv::AMDGPU_CS_ChainPreserve:
1359+ return true ;
1360+ default :
1361+ return false ;
1362+ }
1363+ }
13191364
13201365// These functions are considered entrypoints into the current module, i.e. they
13211366// are allowed to be called from outside the current module. This is different
@@ -1324,16 +1369,17 @@ bool isEntryFunctionCC(CallingConv::ID CC);
13241369// include functions that can be called from other functions inside or outside
13251370// the current module. Module entry functions are allowed to allocate LDS.
13261371LLVM_READNONE
1327- bool isModuleEntryFunctionCC (CallingConv::ID CC);
1328-
1329- LLVM_READNONE
1330- bool isChainCC (CallingConv::ID CC);
1331-
1332- bool isKernelCC (const Function *Func);
1372+ constexpr bool isModuleEntryFunctionCC (CallingConv::ID CC) {
1373+ switch (CC) {
1374+ case CallingConv::AMDGPU_Gfx:
1375+ return true ;
1376+ default :
1377+ return isEntryFunctionCC (CC) || isChainCC (CC);
1378+ }
1379+ }
13331380
1334- // FIXME: Remove this when calling conventions cleaned up
13351381LLVM_READNONE
1336- inline bool isKernel (CallingConv::ID CC) {
1382+ constexpr inline bool isKernel (CallingConv::ID CC) {
13371383 switch (CC) {
13381384 case CallingConv::AMDGPU_KERNEL:
13391385 case CallingConv::SPIR_KERNEL:
@@ -1343,6 +1389,23 @@ inline bool isKernel(CallingConv::ID CC) {
13431389 }
13441390}
13451391
1392+ LLVM_READNONE
1393+ constexpr bool canGuaranteeTCO (CallingConv::ID CC) {
1394+ return CC == CallingConv::Fast;
1395+ }
1396+
1397+ // / Return true if we might ever do TCO for calls with this calling convention.
1398+ LLVM_READNONE
1399+ constexpr bool mayTailCallThisCC (CallingConv::ID CC) {
1400+ switch (CC) {
1401+ case CallingConv::C:
1402+ case CallingConv::AMDGPU_Gfx:
1403+ return true ;
1404+ default :
1405+ return canGuaranteeTCO (CC);
1406+ }
1407+ }
1408+
13461409bool hasXNACK (const MCSubtargetInfo &STI);
13471410bool hasSRAMECC (const MCSubtargetInfo &STI);
13481411bool hasMIMG_R128 (const MCSubtargetInfo &STI);
0 commit comments