Files
c3c/test/test_suite/statements/defer_with_loop.c3t
2022-07-20 12:22:03 +02:00

109 lines
3.0 KiB
C

// #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 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0))
store i32 0, i32* %i, align 4
br label %loop.cond
loop.cond: ; preds = %loop.body, %if.then
%1 = load i32, i32* %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, i32* %i, align 4
%add = add i32 %0, %2
call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %add)
%3 = load i32, i32* %i, align 4
%add1 = add i32 %3, 1
store i32 %add1, i32* %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, i32* %i4, align 4
br label %loop.cond5
loop.cond5: ; preds = %loop.body7, %if.then3
%4 = load i32, i32* %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, i32* %i4, align 4
%add8 = add i32 %0, %5
call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %add8)
%6 = load i32, i32* %i4, align 4
%add9 = add i32 %6, 1
store i32 %add9, i32* %i4, align 4
br label %loop.cond5
loop.exit10: ; preds = %loop.cond5
ret void
if.exit11: ; preds = %if.exit
store i32 0, i32* %i12, align 4
br label %loop.cond13
loop.cond13: ; preds = %loop.body15, %if.exit11
%7 = load i32, i32* %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, i32* %i12, align 4
%add16 = add i32 %0, %8
call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %add16)
%9 = load i32, i32* %i12, align 4
%add17 = add i32 %9, 1
store i32 %add17, i32* %i12, align 4
br label %loop.cond13
loop.exit18: ; preds = %loop.cond13
ret void
}