// #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
}

