Files
c3c/test/test_suite/statements/defer_with_loop.c3t

109 lines
2.8 KiB
Plaintext

// #target: macos-x64
module test;
extern fn void printf(char*,...);
fn void test(int x)
{
defer
{
for (int i = 0; i < 3; i++)
{
printf("%d\n", x + i);
}
}
if (x == 1)
{
printf("1x\n");
return;
}
if (x == 0) return;
}
fn void main()
{
test(123);
test(1);
test(0);
}
/* #expect: test.ll
define void @test.test(i32 %0) #0 {
entry:
%i = alloca i32, align 4
%i4 = alloca i32, align 4
%i12 = alloca i32, align 4
%eq = icmp eq i32 %0, 1
br i1 %eq, label %if.then, label %if.exit
if.then: ; preds = %entry
call void (ptr, ...) @printf(ptr @.str)
store i32 0, ptr %i, align 4
br label %loop.cond
loop.cond: ; preds = %loop.body, %if.then
%1 = load i32, ptr %i, align 4
%lt = icmp slt i32 %1, 3
br i1 %lt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%2 = load i32, ptr %i, align 4
%add = add i32 %0, %2
call void (ptr, ...) @printf(ptr @.str.1, i32 %add)
%3 = load i32, ptr %i, align 4
%add1 = add i32 %3, 1
store i32 %add1, ptr %i, align 4
br label %loop.cond
loop.exit: ; preds = %loop.cond
ret void
if.exit: ; preds = %entry
%eq2 = icmp eq i32 %0, 0
br i1 %eq2, label %if.then3, label %if.exit11
if.then3: ; preds = %if.exit
store i32 0, ptr %i4, align 4
br label %loop.cond5
loop.cond5: ; preds = %loop.body7, %if.then3
%4 = load i32, ptr %i4, align 4
%lt6 = icmp slt i32 %4, 3
br i1 %lt6, label %loop.body7, label %loop.exit10
loop.body7: ; preds = %loop.cond5
%5 = load i32, ptr %i4, align 4
%add8 = add i32 %0, %5
call void (ptr, ...) @printf(ptr @.str.2, i32 %add8)
%6 = load i32, ptr %i4, align 4
%add9 = add i32 %6, 1
store i32 %add9, ptr %i4, align 4
br label %loop.cond5
loop.exit10: ; preds = %loop.cond5
ret void
if.exit11: ; preds = %if.exit
store i32 0, ptr %i12, align 4
br label %loop.cond13
loop.cond13: ; preds = %loop.body15, %if.exit11
%7 = load i32, ptr %i12, align 4
%lt14 = icmp slt i32 %7, 3
br i1 %lt14, label %loop.body15, label %loop.exit18
loop.body15: ; preds = %loop.cond13
%8 = load i32, ptr %i12, align 4
%add16 = add i32 %0, %8
call void (ptr, ...) @printf(ptr @.str.3, i32 %add16)
%9 = load i32, ptr %i12, align 4
%add17 = add i32 %9, 1
store i32 %add17, ptr %i12, align 4
br label %loop.cond13
loop.exit18: ; preds = %loop.cond13
ret void
}