diff options
| author | Yong He <yonghe@outlook.com> | 2022-10-10 15:59:45 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-10 15:59:45 -0700 |
| commit | 768e62f6c7541439e2edc18dad5fb3846d2e05f9 (patch) | |
| tree | 8c68424ee65905b77d3ecb4c7659c5fdcc6ab948 /source/slang/slang-ir-simplify-cfg.cpp | |
| parent | 8487678d6504459935fec07886d2e53ed688ac2f (diff) | |
Support multi-level break + single-return conversion + general inline. (#2436)
* Support multi-level break.
* Single return.
* Add test for inlining `void` return-type functions.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-simplify-cfg.cpp')
| -rw-r--r-- | source/slang/slang-ir-simplify-cfg.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/source/slang/slang-ir-simplify-cfg.cpp b/source/slang/slang-ir-simplify-cfg.cpp index af0e7c0ce..db0274d32 100644 --- a/source/slang/slang-ir-simplify-cfg.cpp +++ b/source/slang/slang-ir-simplify-cfg.cpp @@ -6,7 +6,7 @@ namespace Slang { -bool processFunc(IRFunc* func) +bool processFunc(IRGlobalValueWithCode* func) { auto firstBlock = func->getFirstBlock(); if (!firstBlock) @@ -23,6 +23,15 @@ bool processFunc(IRFunc* func) workList.fastRemoveAt(0); while (block) { + if (auto loop = as<IRLoop>(block->getTerminator())) + { + auto continueBlock = loop->getContinueBlock(); + if (continueBlock && !continueBlock->hasMoreThanOneUse()) + { + loop->continueBlock.set(loop->getTargetBlock()); + continueBlock->removeAndDeallocate(); + } + } // If `block` does not end with an unconditional branch, bail. if (block->getTerminator()->getOp() != kIROp_unconditionalBranch) break; @@ -33,6 +42,8 @@ bool processFunc(IRFunc* func) // merge point in CFG. Such blocks will have more than one use. if (successor->hasMoreThanOneUse()) break; + if (block->hasMoreThanOneUse()) + break; changed = true; Index paramIndex = 0; auto inst = successor->getFirstDecorationOrChild(); @@ -79,4 +90,9 @@ bool simplifyCFG(IRModule* module) return changed; } +bool simplifyCFG(IRGlobalValueWithCode* func) +{ + return processFunc(func); +} + } // namespace Slang |
