Do not load Path
call receiver if known to be pure load
#15488
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.
Follow-up to #15485.
The compiler always emits LLVM instructions to load the receiver of a call even if it has a metaclass type, because there could be other side effects. This adds a large number of superfluous type ID loads when calling class methods:
Although
.new
does load the type ID later, this ID should never show up as an implicit argument to theFoo*.new
methods. Here the%0
,%2
, and%4
variables are a consequence of un-inlining the type IDs. This PR removes those loads when the call receiver is aPath
known to refer to a non-generic metaclass type. (In isolation, the PR skips over whatever is inCrystal::CodeGenVisitor#visit(Crystal::Path)
.)