diff options
| author | Yong He <yonghe@outlook.com> | 2024-02-20 12:24:00 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-20 12:24:00 -0800 |
| commit | 4d20fd329956ac89408b1628a8291fea01bc9a6d (patch) | |
| tree | 8e62d9c1ec05142fd25d0b31073fdb56d44691b0 /source/slang/slang-emit.cpp | |
| parent | 8e9b61e3bac69dbb37a1451b62302e688a017ced (diff) | |
Refactor compiler option representations. (#3598)
* Refactor compiler option representation.
* Fix binary compatibility.
* Add a test for specifying compiler options at link time.
* Fix binary compatibility.
* Fix binary compatibility.
* Fix backward compatibility on matrix layout.
* Fix.
* Fix.
* Fix.
* Fix gfx.
* Fix gfx.
* Fix dynamic dispatch.
* Polish.
Diffstat (limited to 'source/slang/slang-emit.cpp')
| -rw-r--r-- | source/slang/slang-emit.cpp | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index 311fce83d..763d96840 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -214,6 +214,7 @@ Result linkAndOptimizeIR( auto sink = codeGenContext->getSink(); auto target = codeGenContext->getTargetFormat(); auto targetRequest = codeGenContext->getTargetReq(); + auto targetProgram = codeGenContext->getTargetProgram(); // Get the artifact desc for the target const auto artifactDesc = ArtifactDescUtil::makeDescForCompileTarget(asExternal(target)); @@ -234,7 +235,6 @@ Result linkAndOptimizeIR( dumpIRIfEnabled(codeGenContext, irModule, "LINKED"); #endif - validateIRModuleIfEnabled(codeGenContext, irModule); // If the user specified the flag that they want us to dump @@ -351,7 +351,7 @@ Result linkAndOptimizeIR( case CodeGenTarget::HostCPPSource: { lowerComInterfaces(irModule, artifactDesc.style, sink); - generateDllImportFuncs(codeGenContext->getTargetReq(), irModule, sink); + generateDllImportFuncs(codeGenContext->getTargetProgram(), irModule, sink); generateDllExportFuncs(irModule, sink); break; } @@ -367,12 +367,12 @@ Result linkAndOptimizeIR( validateIRModuleIfEnabled(codeGenContext, irModule); // Lower all the LValue implict casts (used for out/inout/ref scenarios) - lowerLValueCast(targetRequest, irModule); + lowerLValueCast(targetProgram, irModule); - simplifyIR(targetRequest, irModule, IRSimplificationOptions::getDefault(), sink); + simplifyIR(targetProgram, irModule, IRSimplificationOptions::getDefault(), sink); // Fill in default matrix layout into matrix types that left layout unspecified. - specializeMatrixLayout(codeGenContext->getTargetReq(), irModule); + specializeMatrixLayout(codeGenContext->getTargetProgram(), irModule); // It's important that this takes place before defunctionalization as we // want to be able to easily discover the cooperate and fallback funcitons @@ -406,14 +406,12 @@ Result linkAndOptimizeIR( for (;;) { bool changed = false; - //auto b1 = dumpIRToString(irModule->getModuleInst()); dumpIRIfEnabled(codeGenContext, irModule, "BEFORE-SPECIALIZE"); if (!codeGenContext->isSpecializationDisabled()) - changed |= specializeModule(codeGenContext->getTargetReq(), irModule, codeGenContext->getSink()); + changed |= specializeModule(targetProgram, irModule, codeGenContext->getSink()); if (codeGenContext->getSink()->getErrorCount() != 0) return SLANG_FAIL; dumpIRIfEnabled(codeGenContext, irModule, "AFTER-SPECIALIZE"); - //auto b2 = dumpIRToString(irModule->getModuleInst()); applySparseConditionalConstantPropagation(irModule, codeGenContext->getSink()); eliminateDeadCode(irModule); @@ -427,7 +425,7 @@ Result linkAndOptimizeIR( // Unroll loops. if (codeGenContext->getSink()->getErrorCount() == 0) { - if (!unrollLoopsInModule(targetRequest, irModule, codeGenContext->getSink())) + if (!unrollLoopsInModule(targetProgram, irModule, codeGenContext->getSink())) return SLANG_FAIL; } @@ -440,7 +438,7 @@ Result linkAndOptimizeIR( dumpIRIfEnabled(codeGenContext, irModule, "BEFORE-AUTODIFF"); enableIRValidationAtInsert(); - changed |= processAutodiffCalls(targetRequest, irModule, sink); + changed |= processAutodiffCalls(targetProgram, irModule, sink); disableIRValidationAtInsert(); dumpIRIfEnabled(codeGenContext, irModule, "AFTER-AUTODIFF"); @@ -448,7 +446,7 @@ Result linkAndOptimizeIR( break; } - finalizeAutoDiffPass(targetRequest, irModule); + finalizeAutoDiffPass(targetProgram, irModule); finalizeSpecialization(irModule); @@ -479,11 +477,11 @@ Result linkAndOptimizeIR( SLANG_RETURN_ON_FAIL(performStringInlining(irModule, sink)); } - lowerReinterpret(targetRequest, irModule, sink); + lowerReinterpret(targetProgram, irModule, sink); validateIRModuleIfEnabled(codeGenContext, irModule); - simplifyIR(targetRequest, irModule, IRSimplificationOptions::getFast(), sink); + simplifyIR(targetProgram, irModule, IRSimplificationOptions::getFast(), sink); if (!ArtifactDescUtil::isCpuLikeTarget(artifactDesc)) { @@ -495,7 +493,7 @@ Result linkAndOptimizeIR( // generics / interface types to ordinary functions and types using // function pointers. dumpIRIfEnabled(codeGenContext, irModule, "BEFORE-LOWER-GENERICS"); - lowerGenerics(targetRequest, irModule, sink); + lowerGenerics(targetProgram, irModule, sink); dumpIRIfEnabled(codeGenContext, irModule, "AFTER-LOWER-GENERICS"); if (sink->getErrorCount() != 0) @@ -512,7 +510,7 @@ Result linkAndOptimizeIR( // up downstream passes like type legalization, so we // will run a DCE pass to clean up after the specialization. // - simplifyIR(targetRequest, irModule, IRSimplificationOptions::getDefault(), sink); + simplifyIR(targetProgram, irModule, IRSimplificationOptions::getDefault(), sink); validateIRModuleIfEnabled(codeGenContext, irModule); @@ -521,7 +519,7 @@ Result linkAndOptimizeIR( // of `RWStructuredBuffer` typed fields now. if (target != CodeGenTarget::HLSL) { - lowerAppendConsumeStructuredBuffers(targetRequest, irModule, sink); + lowerAppendConsumeStructuredBuffers(targetProgram, irModule, sink); } // We don't need the legalize pass for C/C++ based types @@ -598,7 +596,7 @@ Result linkAndOptimizeIR( // to see if we can clean up any temporaries created by legalization. // (e.g., things that used to be aggregated might now be split up, // so that we can work with the individual fields). - simplifyIR(targetRequest, irModule, IRSimplificationOptions::getFast(), sink); + simplifyIR(targetProgram, irModule, IRSimplificationOptions::getFast(), sink); #if 0 dumpIRIfEnabled(codeGenContext, irModule, "AFTER SSA"); @@ -721,7 +719,7 @@ Result linkAndOptimizeIR( { case CodeGenTarget::HLSL: { - auto profile = targetRequest->getTargetProfile(); + auto profile = codeGenContext->getTargetProgram()->getOptionSet().getProfile(); if( profile.getFamily() == ProfileFamily::DX ) { if(profile.getVersion() <= ProfileVersion::DX_5_0) @@ -742,7 +740,7 @@ Result linkAndOptimizeIR( break; } - legalizeByteAddressBufferOps(session, targetRequest, irModule, byteAddressBufferOptions); + legalizeByteAddressBufferOps(session, targetProgram, irModule, byteAddressBufferOptions); } // For CUDA targets only, we will need to turn operations @@ -909,7 +907,7 @@ Result linkAndOptimizeIR( { // We need to lower any types used in a buffer resource (e.g. ContantBuffer or StructuredBuffer) into // a simple storage type that has target independent layout based on the kind of buffer resource. - lowerBufferElementTypeToStorageType(targetRequest, irModule); + lowerBufferElementTypeToStorageType(targetProgram, irModule); } // Rewrite functions that return arrays to return them via `out` parameter, @@ -919,20 +917,21 @@ Result linkAndOptimizeIR( if (isKhronosTarget(targetRequest) || target == CodeGenTarget::HLSL) { legalizeUniformBufferLoad(irModule); - if (targetRequest->getHLSLToVulkanLayoutOptions() && targetRequest->getHLSLToVulkanLayoutOptions()->shouldInvertY()) + if (targetProgram->getOptionSet().getBoolOption(CompilerOptionName::VulkanInvertY)) invertYOfPositionOutput(irModule); } // Lower sizeof/alignof - lowerSizeOfLike(targetRequest, irModule, sink); + lowerSizeOfLike(targetProgram, irModule, sink); // Lower all bit_cast operations on complex types into leaf-level // bit_cast on basic types. - lowerBitCast(targetRequest, irModule); + lowerBitCast(targetProgram, irModule); + bool emitSpirvDirectly = targetProgram->getOptionSet().shouldEmitSPIRVDirectly(); - if (isKhronosTarget(targetRequest) && targetRequest->shouldEmitSPIRVDirectly()) + if (isKhronosTarget(targetRequest) && emitSpirvDirectly) { performIntrinsicFunctionInlining(irModule); eliminateDeadCode(irModule); @@ -942,7 +941,7 @@ Result linkAndOptimizeIR( { IRSimplificationOptions simplificationOptions = IRSimplificationOptions::getFast(); simplificationOptions.cfgOptions.removeTrivialSingleIterationLoops = true; - simplifyIR(targetRequest, irModule, simplificationOptions, sink); + simplifyIR(targetProgram, irModule, simplificationOptions, sink); } // As a late step, we need to take the SSA-form IR and move things *out* @@ -971,7 +970,7 @@ Result linkAndOptimizeIR( // We only want to accumulate locations if liveness tracking is enabled. PhiEliminationOptions phiEliminationOptions; - if (isKhronosTarget(targetRequest) && targetRequest->shouldEmitSPIRVDirectly()) + if (isKhronosTarget(targetRequest) && emitSpirvDirectly) { phiEliminationOptions.eliminateCompositeTypedPhiOnly = false; phiEliminationOptions.useRegisterAllocation = true; @@ -1020,7 +1019,7 @@ Result linkAndOptimizeIR( } // Run a final round of simplifications to clean up unused things after phi-elimination. - simplifyNonSSAIR(targetRequest, irModule, IRSimplificationOptions::getFast()); + simplifyNonSSAIR(targetProgram, irModule, IRSimplificationOptions::getFast()); // We include one final step to (optionally) dump the IR and validate // it after all of the optimization passes are complete. This should @@ -1052,8 +1051,9 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr auto sourceManager = getSourceManager(); auto target = getTargetFormat(); auto targetRequest = getTargetReq(); + auto targetProgram = getTargetProgram(); - auto lineDirectiveMode = targetRequest->getLineDirectiveMode(); + auto lineDirectiveMode = targetProgram->getOptionSet().getEnumOption<LineDirectiveMode>(CompilerOptionName::LineDirectiveMode); // To try to make the default behavior reasonable, we will // always use C-style line directives (to give the user // good source locations on error messages from downstream @@ -1088,7 +1088,7 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr<IArtifact>& outAr else { desc.entryPointStage = Stage::Unknown; - desc.effectiveProfile = targetRequest->getTargetProfile(); + desc.effectiveProfile = targetProgram->getOptionSet().getProfile(); } desc.sourceWriter = &sourceWriter; @@ -1310,8 +1310,7 @@ SlangResult emitSPIRVForEntryPointsDirectly( downstreamOptions.sourceArtifacts = makeSlice(artifact.readRef(), 1); downstreamOptions.targetType = SLANG_SPIRV; downstreamOptions.sourceLanguage = SLANG_SOURCE_LANGUAGE_SPIRV; - auto linkage = codeGenContext->getLinkage(); - switch (linkage->optimizationLevel) + switch (codeGenContext->getTargetProgram()->getOptionSet().getEnumOption<OptimizationLevel>(CompilerOptionName::Optimization)) { case OptimizationLevel::None: downstreamOptions.optimizationLevel = DownstreamCompileOptions::OptimizationLevel::None; break; case OptimizationLevel::Default: downstreamOptions.optimizationLevel = DownstreamCompileOptions::OptimizationLevel::Default; break; |
