mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
- Remove `[?]` syntax. - Change `int!` to `int?` syntax. - New `fault` declarations. - Enum associated values can reference the calling enum.
98 lines
2.7 KiB
Plaintext
98 lines
2.7 KiB
Plaintext
fn void test()
|
|
{
|
|
int x;
|
|
int y;
|
|
long z = (long)x * y;
|
|
z = x / y;
|
|
z = (long)x + y;
|
|
z = (long)x - y;
|
|
z = x % y;
|
|
z = (long)x << y;
|
|
z = (long)x >> y;
|
|
z = (long)~x;
|
|
z = (long)-x;
|
|
int? w;
|
|
z = w ?? 1;
|
|
}
|
|
|
|
/* #expect: top_down_casts.ll
|
|
|
|
define void @top_down_casts.test() #0 {
|
|
entry:
|
|
%x = alloca i32, align 4
|
|
%y = alloca i32, align 4
|
|
%z = alloca i64, align 8
|
|
%w = alloca i32, align 4
|
|
%w.f = alloca i64, align 8
|
|
store i32 0, ptr %x, align 4
|
|
store i32 0, ptr %y, align 4
|
|
%0 = load i32, ptr %x, align 4
|
|
%sext = sext i32 %0 to i64
|
|
%1 = load i32, ptr %y, align 4
|
|
%sext1 = sext i32 %1 to i64
|
|
%mul = mul i64 %sext, %sext1
|
|
store i64 %mul, ptr %z, align 8
|
|
%2 = load i32, ptr %x, align 4
|
|
%3 = load i32, ptr %y, align 4
|
|
%sdiv = sdiv i32 %2, %3
|
|
%sext2 = sext i32 %sdiv to i64
|
|
store i64 %sext2, ptr %z, align 8
|
|
%4 = load i32, ptr %x, align 4
|
|
%sext3 = sext i32 %4 to i64
|
|
%5 = load i32, ptr %y, align 4
|
|
%sext4 = sext i32 %5 to i64
|
|
%add = add i64 %sext3, %sext4
|
|
store i64 %add, ptr %z, align 8
|
|
%6 = load i32, ptr %x, align 4
|
|
%sext5 = sext i32 %6 to i64
|
|
%7 = load i32, ptr %y, align 4
|
|
%sext6 = sext i32 %7 to i64
|
|
%sub = sub i64 %sext5, %sext6
|
|
store i64 %sub, ptr %z, align 8
|
|
%8 = load i32, ptr %x, align 4
|
|
%9 = load i32, ptr %y, align 4
|
|
%smod = srem i32 %8, %9
|
|
%sext7 = sext i32 %smod to i64
|
|
store i64 %sext7, ptr %z, align 8
|
|
%10 = load i32, ptr %x, align 4
|
|
%sext8 = sext i32 %10 to i64
|
|
%11 = load i32, ptr %y, align 4
|
|
%zext = zext i32 %11 to i64
|
|
%shl = shl i64 %sext8, %zext
|
|
%12 = freeze i64 %shl
|
|
store i64 %12, ptr %z, align 8
|
|
%13 = load i32, ptr %x, align 4
|
|
%sext9 = sext i32 %13 to i64
|
|
%14 = load i32, ptr %y, align 4
|
|
%zext10 = zext i32 %14 to i64
|
|
%ashr = ashr i64 %sext9, %zext10
|
|
%15 = freeze i64 %ashr
|
|
store i64 %15, ptr %z, align 8
|
|
%16 = load i32, ptr %x, align 4
|
|
%bnot = xor i32 %16, -1
|
|
%sext11 = sext i32 %bnot to i64
|
|
store i64 %sext11, ptr %z, align 8
|
|
%17 = load i32, ptr %x, align 4
|
|
%neg = sub i32 0, %17
|
|
%sext12 = sext i32 %neg to i64
|
|
store i64 %sext12, ptr %z, align 8
|
|
store i64 0, ptr %w.f, align 8
|
|
store i32 0, ptr %w, align 4
|
|
%optval = load i64, ptr %w.f, align 8
|
|
%not_err = icmp eq i64 %optval, 0
|
|
%18 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
|
|
br i1 %18, label %after_check, label %else_block
|
|
|
|
after_check: ; preds = %entry
|
|
%19 = load i32, ptr %w, align 4
|
|
%sext13 = sext i32 %19 to i64
|
|
br label %phi_block
|
|
|
|
else_block: ; preds = %entry
|
|
br label %phi_block
|
|
|
|
phi_block: ; preds = %else_block, %after_check
|
|
%val = phi i64 [ %sext13, %after_check ], [ 1, %else_block ]
|
|
store i64 %val, ptr %z, align 8
|
|
ret void
|
|
} |