aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorTimon Kruiper <timonkruiper@gmail.com>2021-01-08 19:28:34 +0100
committerTimon Kruiper <timonkruiper@gmail.com>2021-01-08 19:30:52 +0100
commit56c059077cdaf71220cb44f06902051a34ffd31d (patch)
tree6caa61bd74fdb294c293e025f9f76ae3580aac79 /test
parent3715ed7b54d4382a4495eb041ff3f9ad987bacfb (diff)
downloadzig-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')
-rw-r--r--test/stage2/llvm.zig71
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;
+ \\}
+ , "");
+ }
}