diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-05-14 17:32:52 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-14 17:32:52 -0400 |
| commit | 79d106fac18f5792fcac448a0b037aa834fa6042 (patch) | |
| tree | bb2d03de9c28066d32641b62e1bcf098ebc3e2c3 /source | |
| parent | 12bcc039c2a2c0c69486b670503a7437931d73e4 (diff) | |
Fix for KernelContext threading issue for C++ targets (#1843)
* #include an absolute path didn't work - because paths were taken to always be relative.
* Fix for issue where threading KernelContext was not working on C++ test when there were multiple invocations.
* Improve test for context threading.
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ir-explicit-global-context.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/source/slang/slang-ir-explicit-global-context.cpp b/source/slang/slang-ir-explicit-global-context.cpp index ea7d0fb2a..6ab0d68f2 100644 --- a/source/slang/slang-ir-explicit-global-context.cpp +++ b/source/slang/slang-ir-explicit-global-context.cpp @@ -467,7 +467,7 @@ struct IntroduceExplicitGlobalContextPass addKernelContextNameHint(contextParam); contextParam->insertBefore(firstBlock->getFirstOrdinaryInst()); - // The new parameter can be registerd as the context value + // The new parameter can be registered as the context value // to be used for `func` right away. // // Note: we register the value *before* modifying locations @@ -482,8 +482,12 @@ struct IntroduceExplicitGlobalContextPass // TODO: There is an issue here if `func` might be called // dynamically, through something like a witness table. // - List<IRUse*> uses; - for( auto use = func->firstUse; use; use = use->nextUse ) + // We collect all the uses first which are in calls. + // NOTE! That we collect all calls and then process (and don't iterate + // using the linked list), because when a replacement is made the func usage + // linked list will no longer hold all of the use sites. + List<IRCall*> callUses; + for (auto use = func->firstUse; use; use = use->nextUse) { // We will only fix up calls to `func`, and ignore // other operations that might refer to it. @@ -495,9 +499,15 @@ struct IntroduceExplicitGlobalContextPass // to a higher-order function. // auto call = as<IRCall>(use->getUser()); - if(!call) - continue; + if (call) + { + callUses.add(call); + } + } + // Fix up all of the call uses + for( auto call : callUses) + { // We are going to construct a new call to `func` // that has all of the arguments of the original call... // |
