diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-05-31 00:19:23 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-05-31 14:17:54 -0400 |
| commit | d410693dadfe791e616e78239fa0cec707b95cfa (patch) | |
| tree | cc797ccc0b13a5b65d676a7aac78c88f3c42fa38 /test | |
| parent | 26aea8cfa1ea98329e18458cb23be2d60ef52507 (diff) | |
| download | zig-d410693dadfe791e616e78239fa0cec707b95cfa.tar.gz zig-d410693dadfe791e616e78239fa0cec707b95cfa.zip | |
LLVM: elide some loads when lowering
Generally, the load instruction may need to make a copy of an
isByRef=true value, such as in the case of the following code:
```zig
pub fn swap(comptime T: type, a: *T, b: *T) void {
const tmp = a.*;
a.* = b.*;
b.* = tmp;
}
```
However, it only needs to do so if there are any instructions which can
possibly write to memory. When calling functions with isByRef=true
parameters, the AIR code that is generated looks like loads followed
directly by call.
This allows for a peephole optimization when lowering loads: if the load
instruction operates on an isByRef=true type and dies before any side effects
occur, then we can safely lower the load as a no-op that returns its
operand.
This is one out of three changes I intend to make to address #11498.
However I will put these changes in separate branches and merge them
separately so that we can have three independent points on the perf
charts.
Diffstat (limited to 'test')
0 files changed, 0 insertions, 0 deletions
