diff options
| author | Timon Kruiper <timonkruiper@gmail.com> | 2021-01-08 19:28:34 +0100 |
|---|---|---|
| committer | Timon Kruiper <timonkruiper@gmail.com> | 2021-01-08 19:30:52 +0100 |
| commit | 56c059077cdaf71220cb44f06902051a34ffd31d (patch) | |
| tree | 6caa61bd74fdb294c293e025f9f76ae3580aac79 /test/stage2 | |
| parent | 3715ed7b54d4382a4495eb041ff3f9ad987bacfb (diff) | |
| download | zig-56c059077cdaf71220cb44f06902051a34ffd31d.tar.gz zig-56c059077cdaf71220cb44f06902051a34ffd31d.zip | |
stage2: add initial impl of control flow in LLVM backend
The following TZIR instrutions have been implemented in the backend:
- all cmp operators (lt, lte, gt, gte, eq, neq)
- block
- br
- condbr
The following LLVMIR is generated for a simple assert function:
```
define void @assert(i1 %0) {
Entry:
%1 = alloca i1, align 1
store i1 %0, i1* %1, align 1
%2 = load i1, i1* %1, align 1
%3 = xor i1 %2, true
br i1 %3, label %Then, label %Else
Then: ; preds = %Entry
call void @llvm.debugtrap()
unreachable
Else: ; preds = %Entry
br label %Block
Block: ; preds = %Else
ret void
}
```
See tests for more examples.
Diffstat (limited to 'test/stage2')
| -rw-r--r-- | test/stage2/llvm.zig | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/test/stage2/llvm.zig b/test/stage2/llvm.zig index ebb5fc390f..eecea3d1f0 100644 --- a/test/stage2/llvm.zig +++ b/test/stage2/llvm.zig @@ -40,4 +40,75 @@ pub fn addCases(ctx: *TestContext) !void { \\} , "hello world!" ++ std.cstr.line_sep); } + + { + var case = ctx.exeUsingLlvmBackend("simple if statement", linux_x64); + + case.addCompareOutput( + \\fn add(a: i32, b: i32) i32 { + \\ return a + b; + \\} + \\ + \\fn assert(ok: bool) void { + \\ if (!ok) unreachable; + \\} + \\ + \\export fn main() c_int { + \\ assert(add(1,2) == 3); + \\ return 0; + \\} + , ""); + } + + { + var case = ctx.exeUsingLlvmBackend("blocks", linux_x64); + + case.addCompareOutput( + \\fn assert(ok: bool) void { + \\ if (!ok) unreachable; + \\} + \\ + \\fn foo(ok: bool) i32 { + \\ const val: i32 = blk: { + \\ var x: i32 = 1; + \\ if (!ok) break :blk x + 9; + \\ break :blk x + 19; + \\ }; + \\ return val + 10; + \\} + \\ + \\export fn main() c_int { + \\ assert(foo(false) == 20); + \\ assert(foo(true) == 30); + \\ return 0; + \\} + , ""); + } + + { + var case = ctx.exeUsingLlvmBackend("nested blocks", linux_x64); + + case.addCompareOutput( + \\fn assert(ok: bool) void { + \\ if (!ok) unreachable; + \\} + \\ + \\fn foo(ok: bool) i32 { + \\ var val: i32 = blk: { + \\ const val2: i32 = another: { + \\ if (!ok) break :blk 10; + \\ break :another 10; + \\ }; + \\ break :blk val2 + 10; + \\ }; + \\ return val; + \\} + \\ + \\export fn main() c_int { + \\ assert(foo(false) == 10); + \\ assert(foo(true) == 20); + \\ return 0; + \\} + , ""); + } } |
