mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
113 lines
2.7 KiB
Plaintext
113 lines
2.7 KiB
Plaintext
// #target: macos-x64
|
|
|
|
module foo;
|
|
fn int test()
|
|
{
|
|
static int x = 0;
|
|
return 1 + x++;
|
|
}
|
|
|
|
extern fn void printf(char*, ...);
|
|
|
|
fn void main()
|
|
{
|
|
int i = 10;
|
|
do
|
|
{
|
|
printf("%d\n", test());
|
|
if (i > 100) break;
|
|
} while (i-- > 0);
|
|
i = 1;
|
|
do
|
|
{
|
|
printf("%d, %d\n", i, test());
|
|
if (i % 3 == 0) break;
|
|
} while (i++ < 100);
|
|
}
|
|
|
|
/* #expect: foo.ll
|
|
source_filename = "foo"
|
|
target datalayout = "e-m:o-p270:32:32-p271:32
|
|
target triple = "x86_64-apple
|
|
|
|
@test.x = internal unnamed_addr global i32 0, align 4
|
|
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
|
|
@.str.1 = private unnamed_addr constant [8 x i8] c"%d, %d\0A\00", align 1
|
|
|
|
|
|
define i32 @foo.test() #0 {
|
|
entry:
|
|
%0 = load i32, ptr @test.x, align 4
|
|
%add = add i32 %0, 1
|
|
store i32 %add, ptr @test.x, align 4
|
|
%add1 = add i32 1, %0
|
|
ret i32 %add1
|
|
}
|
|
|
|
|
|
declare void @printf(ptr, ...) #0
|
|
|
|
|
|
define void @foo.main() #0 {
|
|
entry:
|
|
%i = alloca i32, align 4
|
|
store i32 10, ptr %i, align 4
|
|
br label %loop.body
|
|
|
|
loop.cond: ; preds = %if.exit
|
|
%0 = load i32, ptr %i, align 4
|
|
%sub = sub i32 %0, 1
|
|
store i32 %sub, ptr %i, align 4
|
|
%gt = icmp sgt i32 %0, 0
|
|
br i1 %gt, label %loop.body, label %loop.exit
|
|
|
|
loop.body: ; preds = %loop.cond, %entry
|
|
%1 = call i32 @foo.test()
|
|
call void (ptr, ...) @printf(ptr @.str, i32 %1)
|
|
%2 = load i32, ptr %i, align 4
|
|
%gt1 = icmp sgt i32 %2, 100
|
|
br i1 %gt1, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %loop.body
|
|
br label %loop.exit
|
|
|
|
if.exit: ; preds = %loop.body
|
|
br label %loop.cond
|
|
|
|
loop.exit: ; preds = %if.then, %loop.cond
|
|
store i32 1, ptr %i, align 4
|
|
br label %loop.body3
|
|
|
|
loop.cond2: ; preds = %if.exit5
|
|
%3 = load i32, ptr %i, align 4
|
|
%add = add i32 %3, 1
|
|
store i32 %add, ptr %i, align 4
|
|
%lt = icmp slt i32 %3, 100
|
|
br i1 %lt, label %loop.body3, label %loop.exit6
|
|
|
|
loop.body3: ; preds = %loop.cond2, %loop.exit
|
|
%4 = call i32 @foo.test()
|
|
%5 = load i32, ptr %i, align 4
|
|
call void (ptr, ...) @printf(ptr @.str.1, i32 %5, i32 %4)
|
|
%6 = load i32, ptr %i, align 4
|
|
%smod = srem i32 %6, 3
|
|
%eq = icmp eq i32 %smod, 0
|
|
br i1 %eq, label %if.then4, label %if.exit5
|
|
|
|
if.then4: ; preds = %loop.body3
|
|
br label %loop.exit6
|
|
|
|
if.exit5: ; preds = %loop.body3
|
|
br label %loop.cond2
|
|
|
|
loop.exit6: ; preds = %if.then4, %loop.cond2
|
|
ret void
|
|
}
|
|
|
|
|
|
define i32 @main(i32 %0, ptr %1) #0 {
|
|
entry:
|
|
call void @foo.main()
|
|
ret i32 0
|
|
}
|