diff options
| author | Yong He <yonghe@outlook.com> | 2022-10-11 23:14:41 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-11 23:14:41 -0700 |
| commit | 5128de89a9a8da09587f20e8fb5bc324ea14e0df (patch) | |
| tree | 292d6488ee966eedcff9736f22511038f9bdc84b | |
| parent | 8c43a19d2fd8f9d1bd9d5854a4b1e64d5231bc41 (diff) | |
Small IR cleanups. (#2441)
| -rw-r--r-- | source/slang/slang-emit.cpp | 3 | ||||
| -rw-r--r-- | source/slang/slang-ir-eliminate-phis.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-ir-simplify-cfg.cpp | 18 | ||||
| -rw-r--r-- | tests/experimental/liveness/liveness-7.slang | 4 | ||||
| -rw-r--r-- | tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl | 117 |
5 files changed, 99 insertions, 48 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index a916d0d63..6d85e1ce0 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -830,6 +830,9 @@ Result linkAndOptimizeIR( } } + // Run a final round of DCE to clean up unused things after phi-elimination. + eliminateDeadCode(irModule); + // We include one final step to (optionally) dump the IR and validate // it after all of the optimization passes are complete. This should // reflect the IR that code is generated from as closely as possible. diff --git a/source/slang/slang-ir-eliminate-phis.cpp b/source/slang/slang-ir-eliminate-phis.cpp index c4f0b8b9d..07d0e7374 100644 --- a/source/slang/slang-ir-eliminate-phis.cpp +++ b/source/slang/slang-ir-eliminate-phis.cpp @@ -807,7 +807,10 @@ struct PhiEliminationContext // so that any logic that might have moved another parameter // into a temporary will influence our result. // - m_builder.emitStore(dstParam.temp, *srcArg.currentValPtr); + if ((*srcArg.currentValPtr)->getOp() != kIROp_undefined) + { + m_builder.emitStore(dstParam.temp, *srcArg.currentValPtr); + } // // Once the store is emitted, the assignment has been performed, diff --git a/source/slang/slang-ir-simplify-cfg.cpp b/source/slang/slang-ir-simplify-cfg.cpp index db0274d32..a1bc38b64 100644 --- a/source/slang/slang-ir-simplify-cfg.cpp +++ b/source/slang/slang-ir-simplify-cfg.cpp @@ -12,6 +12,9 @@ bool processFunc(IRGlobalValueWithCode* func) if (!firstBlock) return false; + SharedIRBuilder sharedBuilder(func->getModule()); + IRBuilder builder(&sharedBuilder); + bool changed = false; List<IRBlock*> workList; @@ -25,12 +28,27 @@ bool processFunc(IRGlobalValueWithCode* func) { if (auto loop = as<IRLoop>(block->getTerminator())) { + // If continue block is unreachable, remove it. auto continueBlock = loop->getContinueBlock(); if (continueBlock && !continueBlock->hasMoreThanOneUse()) { loop->continueBlock.set(loop->getTargetBlock()); continueBlock->removeAndDeallocate(); } + // If there isn't any actual back jumps into loop target, remove the header + // and turn it into a normal branch. + auto targetBlock = loop->getTargetBlock(); + if (targetBlock->getPredecessors().getCount() == 1 && *targetBlock->getPredecessors().begin() == block) + { + builder.setInsertBefore(loop); + List<IRInst*> args; + for (UInt i = 0; i < loop->getArgCount(); i++) + { + args.add(loop->getArg(i)); + } + builder.emitBranch(targetBlock, args.getCount(), args.getBuffer()); + loop->removeAndDeallocate(); + } } // If `block` does not end with an unconditional branch, bail. if (block->getTerminator()->getOp() != kIROp_unconditionalBranch) diff --git a/tests/experimental/liveness/liveness-7.slang b/tests/experimental/liveness/liveness-7.slang index 5d8ed48cc..1bf53b09d 100644 --- a/tests/experimental/liveness/liveness-7.slang +++ b/tests/experimental/liveness/liveness-7.slang @@ -1,4 +1,6 @@ -//TEST:SIMPLE:-target glsl -entry computeMain -profile cs_6_3 -track-liveness -line-directive-mode none +//DISABLED_TEST:SIMPLE:-target glsl -entry computeMain -profile cs_6_3 -track-liveness -line-directive-mode none + +// This test is disabled because the loop will always be optimized out so no liveness info will be inserted. //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer RWStructuredBuffer<int> outputBuffer; diff --git a/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl b/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl index e591fc391..ae26ab498 100644 --- a/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl +++ b/tests/pipeline/ray-tracing/trace-ray-inline.slang.glsl @@ -1,6 +1,3 @@ -// trace-ray-inline.slang.glsl -//TEST_IGNORE_FILE: - #version 460 #extension GL_EXT_ray_tracing : require #extension GL_EXT_ray_query : require @@ -24,14 +21,6 @@ layout(std140) uniform _S1 SLANG_ParameterGroup_C_0 _data; } C_0; -struct RayDesc_0 -{ - vec3 Origin_0; - float TMin_0; - vec3 Direction_0; - float TMax_0; -}; - layout(binding = 0) uniform accelerationStructureEXT myAccelerationStructure_0; @@ -78,13 +67,17 @@ void myMiss_0(inout MyRayPayload_0 payload_4) return; } +struct RayDesc_0 +{ + vec3 Origin_0; + float TMin_0; + vec3 Direction_0; + float TMax_0; +}; + layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; void main() { - MyProceduralHitAttrs_0 committedProceduralAttrs_0; - MyProceduralHitAttrs_0 committedProceduralAttrs_1; - MyProceduralHitAttrs_0 committedProceduralAttrs_2; - MyProceduralHitAttrs_0 committedProceduralAttrs_3; rayQueryEXT query_0; @@ -95,63 +88,87 @@ void main() RayDesc_0 ray_0 = { C_0._data.origin_0, C_0._data.tMin_0, C_0._data.direction_0, C_0._data.tMax_0 }; rayQueryInitializeEXT((query_0), (myAccelerationStructure_0), (C_0._data.rayFlags_0 | 512), (C_0._data.instanceMask_0), (ray_0.Origin_0), (ray_0.TMin_0), (ray_0.Direction_0), (ray_0.TMax_0)); - MyProceduralHitAttrs_0 _S3; - committedProceduralAttrs_0 = _S3; + MyProceduralHitAttrs_0 committedProceduralAttrs_0; for(;;) { - bool _S4 = rayQueryProceedEXT(query_0); - if(!_S4) + + bool _S3 = rayQueryProceedEXT(query_0); + + if(!_S3) { break; } - uint _S5 = (rayQueryGetIntersectionTypeEXT((query_0), false)); - switch(_S5) + uint _S4 = (rayQueryGetIntersectionTypeEXT((query_0), false)); + + MyProceduralHitAttrs_0 committedProceduralAttrs_1; + + switch(_S4) { - case uint(1): + case 1U: { MyProceduralHitAttrs_0 candidateProceduralAttrs_0; - MyProceduralHitAttrs_0 _S6 = { 0 }; - candidateProceduralAttrs_0 = _S6; + + MyProceduralHitAttrs_0 _S5 = { 0 }; + + candidateProceduralAttrs_0 = _S5; float tHit_1; tHit_1 = 0.00000000000000000000; - bool _S7 = myProceduralIntersection_0(tHit_1, candidateProceduralAttrs_0); - if(_S7) + bool _S6 = myProceduralIntersection_0(tHit_1, candidateProceduralAttrs_0); + + MyProceduralHitAttrs_0 committedProceduralAttrs_2; + + if(_S6) { - bool _S8 = myProceduralAnyHit_0(payload_5); - if(_S8) + bool _S7 = myProceduralAnyHit_0(payload_5); + + MyProceduralHitAttrs_0 committedProceduralAttrs_3; + + if(_S7) { rayQueryGenerateIntersectionEXT(query_0, tHit_1); - MyProceduralHitAttrs_0 _S9 = candidateProceduralAttrs_0; - if(bool(C_0._data.shouldStopAtFirstHit_0)) + MyProceduralHitAttrs_0 _S8 = candidateProceduralAttrs_0; + if(C_0._data.shouldStopAtFirstHit_0 != 0U) { rayQueryTerminateEXT(query_0); } else { } - committedProceduralAttrs_1 = _S9; + + committedProceduralAttrs_3 = _S8; + } else { - committedProceduralAttrs_1 = committedProceduralAttrs_0; + + committedProceduralAttrs_3 = committedProceduralAttrs_0; + } - committedProceduralAttrs_2 = committedProceduralAttrs_1; + + committedProceduralAttrs_2 = committedProceduralAttrs_3; + } else { + committedProceduralAttrs_2 = committedProceduralAttrs_0; + } - committedProceduralAttrs_3 = committedProceduralAttrs_2; + + committedProceduralAttrs_1 = committedProceduralAttrs_2; + break; } - case uint(0): + case 0U: { - bool _S10 = myTriangleAnyHit_0(payload_5); - if(_S10) + + bool _S9 = myTriangleAnyHit_0(payload_5); + + if(_S9) { rayQueryConfirmIntersectionEXT(query_0); - if(bool(C_0._data.shouldStopAtFirstHit_0)) + if(C_0._data.shouldStopAtFirstHit_0 != 0U) { rayQueryTerminateEXT(query_0); } @@ -162,31 +179,39 @@ void main() else { } - committedProceduralAttrs_3 = committedProceduralAttrs_0; + + committedProceduralAttrs_1 = committedProceduralAttrs_0; + break; } default: { - committedProceduralAttrs_3 = committedProceduralAttrs_0; + + committedProceduralAttrs_1 = committedProceduralAttrs_0; + break; } } - committedProceduralAttrs_0 = committedProceduralAttrs_3; + + committedProceduralAttrs_0 = committedProceduralAttrs_1; + } - uint _S11 = (rayQueryGetIntersectionTypeEXT((query_0), true)); - switch(_S11) + + uint _S10 = (rayQueryGetIntersectionTypeEXT((query_0), true)); + + switch(_S10) { - case uint(1): + case 1U: { myTriangleClosestHit_0(payload_5); break; } - case uint(2): + case 2U: { myProceduralClosestHit_0(payload_5, committedProceduralAttrs_0); break; } - case uint(0): + case 0U: { myMiss_0(payload_5); break; |
