[Unity][Transform] Handle replacement at both var binding and usage#16367
Merged
Hzfengsy merged 1 commit intoapache:unityfrom Jan 9, 2024
Merged
Conversation
Resolve a bug that caused undefined relax variables in the output of `CanonicalizeBindings` for cases where `VisitVarDef(const Var&)` replaces a variable, and `VisitExpr_(const VarNode*)` returns a value with different struct info, both occurring within the same `VarBinding`. The ExprMutator is only allowed to update a variable's struct info if the value bound to it has new struct info. When CanonicalizeBindings replaces a trivial binding, this may provide better struct info as a result. Prior to this commit, `ExprMutator::ReEmitBinding` defined a remap for `binding->var->vid`, even if the derived class defined a replacement by overriding `VisitVarDef`. If the derived class defines a new variable binding by overriding `VisitVarDef`, and also causes a variable replacement by overriding `VisitExpr` and returning a type with different struct info, then `ExprMutator` must check for both `binding->var->vid` *AND* `new_var->vid`. The former may be present in the unmodified graph, and the latter may be produced by the derived class before delegating to the base class. This commit updates `ExprMutator::ReEmitBinding` to define entries for both replacements that may be required.
Hzfengsy
approved these changes
Jan 9, 2024
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolve a bug that caused undefined relax variables in the output of
CanonicalizeBindingsfor cases whereVisitVarDef(const Var&)replaces a variable, andVisitExpr_(const VarNode*)returns a value with different struct info, both occurring within the sameVarBinding.The ExprMutator is only allowed to update a variable's struct info if the value bound to it has new struct info. When CanonicalizeBindings replaces a trivial binding, this may provide better struct info as a result.
Prior to this commit,
ExprMutator::ReEmitBindingdefined a remap forbinding->var->vid, even if the derived class defined a replacement by overridingVisitVarDef. If the derived class defines a new variable binding by overridingVisitVarDef, and also causes a variable replacement by overridingVisitExprand returning a type with different struct info, thenExprMutatormust check for bothbinding->var->vidANDnew_var->vid. The former may be present in the unmodified graph, and the latter may be produced by the derived class before delegating to the base class.This commit updates
ExprMutator::ReEmitBindingto define entries for both replacements that may be required.