# LLVM: elide some loads when lowering · gitcafe/zig

[View on GitCafe](https://git.cafe/gitcafe/zig/commit/d410693dadfe791e616e78239fa0cec707b95cfa)

Repository: [gitcafe/zig](https://git.cafe/gitcafe/zig)

Visibility: public

Requested revision: d410693dadfe791e616e78239fa0cec707b95cfa

Requested commit: d410693dadfe791e616e78239fa0cec707b95cfa

Commit: d410693dadfe791e616e78239fa0cec707b95cfa

Tree: cc797ccc0b13a5b65d676a7aac78c88f3c42fa38

Author: Andrew Kelley

Committer: Andrew Kelley

## Message

````
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.

````

## Parents

- [26aea8cfa1ea98329e18458cb23be2d60ef52507](https://git.cafe/gitcafe/zig/commit/26aea8cfa1ea98329e18458cb23be2d60ef52507?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zig/tree/d410693dadfe791e616e78239fa0cec707b95cfa?format=markdown)
