# stage2: hoist alloca instructions to top of function in LLVM backend · gitcafe/zig

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

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

Visibility: public

Requested revision: 5d5db833f277518bab152b743d6a4cfaa1e3fd8d

Requested commit: 5d5db833f277518bab152b743d6a4cfaa1e3fd8d

Commit: 5d5db833f277518bab152b743d6a4cfaa1e3fd8d

Tree: c7f898a8b063ccb8cf6c249a508ebec14dad0164

Author: Timon Kruiper

Committer: Timon Kruiper

## Message

````
stage2: hoist alloca instructions to top of function in LLVM backend

This way the generated code only has to setup the stack size at the
beginning of a function and this improves codegen.

Fixes #7689

```
fn foo() void {}

export fn hello(z: i8) void {
    var x: i16 = undefined;
    foo();
    var y: i32 = 1;
    y += z;
}
```
llvm-ir:
```
define void @hello(i8 %0) {
Entry:
  %1 = alloca i8, align 1
  %2 = alloca i16, align 2
  %3 = alloca i32, align 4
  store i8 %0, i8* %1, align 1
  %4 = load i8, i8* %1, align 1
  store i16 undef, i16* %2, align 2
  call void @foo()
  store i32 1, i32* %3, align 4
  %5 = load i32, i32* %3, align 4
  %6 = sext i8 %4 to i32
  %7 = add nsw i32 %5, %6
  store i32 %7, i32* %3, align 4
  ret void
}
```

````

## Parents

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

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