summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-emit.cpp')
-rw-r--r--source/slang/slang-emit.cpp37
1 files changed, 27 insertions, 10 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index e1689ccfc..f1cc6090d 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -97,6 +97,7 @@
#include "slang-ir-restructure.h"
#include "slang-ir-sccp.h"
#include "slang-ir-simplify-for-emit.h"
+#include "slang-ir-specialize-address-space.h"
#include "slang-ir-specialize-arrays.h"
#include "slang-ir-specialize-buffer-load-arg.h"
#include "slang-ir-specialize-matrix-layout.h"
@@ -1715,6 +1716,7 @@ Result linkAndOptimizeIR(
if (targetProgram->getOptionSet().getBoolOption(
CompilerOptionName::EnableExperimentalPasses))
introduceExplicitGlobalContext(irModule, target);
+ transformParamsToConstRef(irModule, codeGenContext->getSink());
#if 0
dumpIRIfEnabled(codeGenContext, irModule, "EXPLICIT GLOBAL CONTEXT INTRODUCED");
#endif
@@ -1812,11 +1814,11 @@ Result linkAndOptimizeIR(
if (requiredLoweringPassSet.meshOutput)
legalizeMeshOutputTypes(irModule);
- BufferElementTypeLoweringOptions bufferElementTypeLoweringOptions;
- bufferElementTypeLoweringOptions.use16ByteArrayElementForConstantBuffer =
- isWGPUTarget(targetRequest);
- lowerBufferElementTypeToStorageType(targetProgram, irModule, bufferElementTypeLoweringOptions);
- performForceInlining(irModule);
+
+ // Lower all bit_cast operations on complex types into leaf-level
+ // bit_cast on basic types.
+ if (requiredLoweringPassSet.bitcast)
+ lowerBitCast(targetProgram, irModule, sink);
// Rewrite functions that return arrays to return them via `out` parameter,
// since our target languages doesn't allow returning arrays.
@@ -1832,13 +1834,28 @@ Result linkAndOptimizeIR(
rcpWOfPositionInput(irModule);
}
- // Lower all bit_cast operations on complex types into leaf-level
- // bit_cast on basic types.
- if (requiredLoweringPassSet.bitcast)
- lowerBitCast(targetProgram, irModule, sink);
-
bool emitSpirvDirectly = targetProgram->shouldEmitSPIRVDirectly();
+ BufferElementTypeLoweringOptions bufferElementTypeLoweringOptions;
+ bufferElementTypeLoweringOptions.use16ByteArrayElementForConstantBuffer =
+ isWGPUTarget(targetRequest);
+ lowerBufferElementTypeToStorageType(targetProgram, irModule, bufferElementTypeLoweringOptions);
+
+ // If we are generating code for glsl or metal, perform address space propagation now.
+ // For SPIRV, we will do that during spirv legalization that happens after
+ // `linkAndOptimizeIR`.
+ if (target == CodeGenTarget::GLSL)
+ {
+ NoOpInitialAddressSpaceAssigner addrSpaceAssigner;
+ specializeAddressSpace(irModule, &addrSpaceAssigner);
+ }
+ else if (isMetalTarget(targetRequest))
+ {
+ specializeAddressSpaceForMetal(irModule);
+ }
+
+ performForceInlining(irModule);
+
if (emitSpirvDirectly)
{
performIntrinsicFunctionInlining(irModule);