@@ -3450,7 +3450,8 @@ namespace IGC
34503450
34513451 if (ctx->platform .getMinDispatchMode () == SIMDMode::SIMD16)
34523452 {
3453- AddCodeGenPasses (*ctx, shaders, Passes, SIMDMode::SIMD32, false );
3453+ bool abortOnSpills = ctx->platform .isCoreXE2 () && (ctx->getModuleMetaData ()->csInfo .forcedSIMDSize != 32 );
3454+ AddCodeGenPasses (*ctx, shaders, Passes, SIMDMode::SIMD32, abortOnSpills);
34543455 AddCodeGenPasses (*ctx, shaders, Passes, SIMDMode::SIMD16, false );
34553456
34563457 ctx->SetSIMDInfo (SIMD_SKIP_HW, SIMDMode::SIMD8, ShaderDispatchMode::NOT_APPLICABLE);
@@ -3755,9 +3756,23 @@ namespace IGC
37553756 return SIMDStatus::SIMD_FUNC_FAIL;
37563757 }
37573758
3758- EP.m_canAbortOnSpill = false ; // spill is always allowed since we don't do SIMD size lowering
37593759 // Next we check if there is a required sub group size specified
37603760 CodeGenContext* pCtx = GetContext ();
3761+
3762+ CShader* simd16Program = m_parent->GetShader (SIMDMode::SIMD16);
3763+ CShader* simd32Program = m_parent->GetShader (SIMDMode::SIMD32);
3764+
3765+ bool compileFunctionVariants = pCtx->m_enableSimdVariantCompilation &&
3766+ (m_FGA && IGC::isIntelSymbolTableVoidProgram (m_FGA->getGroupHead (&F)));
3767+
3768+ if ((simd16Program && simd16Program->ProgramOutput ()->m_programSize > 0 ) ||
3769+ (simd32Program && simd32Program->ProgramOutput ()->m_programSize > 0 ))
3770+ {
3771+ bool canCompileMultipleSIMD = compileFunctionVariants;
3772+ if (!(canCompileMultipleSIMD && (pCtx->getModuleMetaData ()->csInfo .forcedSIMDSize == 0 )))
3773+ return SIMDStatus::SIMD_FUNC_FAIL;
3774+ }
3775+
37613776 MetaDataUtils* pMdUtils = EP.getAnalysis <MetaDataUtilsWrapper>().getMetaDataUtils ();
37623777 FunctionInfoMetaDataHandle funcInfoMD = pMdUtils->getFunctionsInfoItem (&F);
37633778 uint32_t simd_size = getReqdSubGroupSize (F, pMdUtils);
@@ -3860,7 +3875,7 @@ namespace IGC
38603875 return SIMDStatus::SIMD_PASS;
38613876 }
38623877
3863- if (simdMode == SIMDMode::SIMD16 && !hasSubGroupForce && !forceLowestSIMDForStackCalls && !hasSubroutine)
3878+ if (simdMode == SIMDMode::SIMD16 && !pCtx-> platform . isCoreXE2 () && ! hasSubGroupForce && !forceLowestSIMDForStackCalls && !hasSubroutine)
38643879 {
38653880 pCtx->SetSIMDInfo (SIMD_SKIP_PERF, simdMode, ShaderDispatchMode::NOT_APPLICABLE);
38663881 return SIMDStatus::SIMD_FUNC_FAIL;
0 commit comments