mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
721 lines
32 KiB
C
721 lines
32 KiB
C
// #target: macos-x64
|
|
module test;
|
|
import std::io;
|
|
|
|
fault Test { FOO }
|
|
|
|
fn void test1()
|
|
{
|
|
int! a = 1;
|
|
int! b = a = Test.FOO!;
|
|
if (catch err = a) io::printfln("A err was: %s", err);
|
|
if (catch err = b) io::printfln("B err was: %s", err);
|
|
io::printfln("A was: %s", a);
|
|
io::printfln("B was: %s", b);
|
|
}
|
|
|
|
fn void test2()
|
|
{
|
|
int! x = Test.FOO!;
|
|
int! a = 1;
|
|
int! b = a = x;
|
|
if (catch err = a) io::printfln("A err was: %s", err);
|
|
if (catch err = b) io::printfln("B err was: %s", err);
|
|
io::printfln("A was: %s", a);
|
|
io::printfln("B was: %s", b);
|
|
}
|
|
|
|
|
|
fn void test3()
|
|
{
|
|
int! x = 23;
|
|
int! a = 1;
|
|
int! b = a = x;
|
|
if (catch err = a) io::printfln("A err was: %s", err);
|
|
if (catch err = b) io::printfln("B err was: %s", err);
|
|
io::printfln("A was: %s", a);
|
|
io::printfln("B was: %s", b);
|
|
}
|
|
|
|
fn void main()
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
}
|
|
|
|
/* #expect: test.ll
|
|
|
|
; Function Attrs: nounwind
|
|
define void @test_test1() #0 {
|
|
entry:
|
|
%a = alloca i32, align 4
|
|
%a.f = alloca i64, align 8
|
|
%b = alloca i32, align 4
|
|
%b.f = alloca i64, align 8
|
|
%err = alloca i64, align 8
|
|
%retparam = alloca i64, align 8
|
|
%taddr = alloca %"char[]", align 8
|
|
%vararg = alloca %"variant[]", align 8
|
|
%varargslots = alloca [1 x %variant], align 16
|
|
%err5 = alloca i64, align 8
|
|
%retparam14 = alloca i64, align 8
|
|
%taddr15 = alloca %"char[]", align 8
|
|
%vararg18 = alloca %"variant[]", align 8
|
|
%varargslots19 = alloca [1 x %variant], align 16
|
|
%retparam26 = alloca i64, align 8
|
|
%taddr27 = alloca %"char[]", align 8
|
|
%vararg30 = alloca %"variant[]", align 8
|
|
%varargslots31 = alloca [1 x %variant], align 16
|
|
%retparam40 = alloca i64, align 8
|
|
%taddr41 = alloca %"char[]", align 8
|
|
%vararg44 = alloca %"variant[]", align 8
|
|
%varargslots45 = alloca [1 x %variant], align 16
|
|
store i32 1, i32* %a, align 4
|
|
store i64 0, i64* %a.f, align 8
|
|
store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %a.f, align 8
|
|
store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %b.f, align 8
|
|
br label %after_assign
|
|
|
|
after_assign: ; preds = %entry
|
|
br label %testblock
|
|
|
|
testblock: ; preds = %after_assign
|
|
%optval = load i64, i64* %a.f, align 8
|
|
%not_err = icmp eq i64 %optval, 0
|
|
br i1 %not_err, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %testblock
|
|
store i64 %optval, i64* %err, align 8
|
|
br label %end_block
|
|
|
|
after_check: ; preds = %testblock
|
|
store i64 0, i64* %err, align 8
|
|
br label %end_block
|
|
|
|
end_block: ; preds = %after_check, %assign_optional
|
|
%0 = load i64, i64* %err, align 8
|
|
%neq = icmp ne i64 %0, 0
|
|
br i1 %neq, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %end_block
|
|
store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i32 0, i32 0), i64 13 }, %"char[]"* %taddr, align 8
|
|
%1 = bitcast %"char[]"* %taddr to { i8*, i64 }*
|
|
%2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %1, i32 0, i32 0
|
|
%lo = load i8*, i8** %2, align 8
|
|
%3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %1, i32 0, i32 1
|
|
%hi = load i64, i64* %3, align 8
|
|
%4 = bitcast i64* %err to i8*
|
|
%5 = insertvalue %variant undef, i8* %4, 0
|
|
%6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1
|
|
%7 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0
|
|
store %variant %6, %variant* %7, align 16
|
|
%8 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 1
|
|
store i64 1, i64* %8, align 8
|
|
%9 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 0
|
|
%10 = bitcast [1 x %variant]* %varargslots to %variant*
|
|
store %variant* %10, %variant** %9, align 8
|
|
%11 = bitcast %"variant[]"* %vararg to { i8*, i64 }*
|
|
%12 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %11, i32 0, i32 0
|
|
%lo1 = load i8*, i8** %12, align 8
|
|
%13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %11, i32 0, i32 1
|
|
%hi2 = load i64, i64* %13, align 8
|
|
%14 = call i64 @std_io_printfln(i64* %retparam, i8* %lo, i64 %hi, i8* %lo1, i64 %hi2)
|
|
%not_err3 = icmp eq i64 %14, 0
|
|
br i1 %not_err3, label %after_check4, label %voiderr
|
|
|
|
after_check4: ; preds = %if.then
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %after_check4, %if.then
|
|
br label %if.exit
|
|
|
|
if.exit: ; preds = %voiderr, %end_block
|
|
br label %testblock6
|
|
|
|
testblock6: ; preds = %if.exit
|
|
%optval7 = load i64, i64* %b.f, align 8
|
|
%not_err8 = icmp eq i64 %optval7, 0
|
|
br i1 %not_err8, label %after_check10, label %assign_optional9
|
|
|
|
assign_optional9: ; preds = %testblock6
|
|
store i64 %optval7, i64* %err5, align 8
|
|
br label %end_block11
|
|
|
|
after_check10: ; preds = %testblock6
|
|
store i64 0, i64* %err5, align 8
|
|
br label %end_block11
|
|
|
|
end_block11: ; preds = %after_check10, %assign_optional9
|
|
%15 = load i64, i64* %err5, align 8
|
|
%neq12 = icmp ne i64 %15, 0
|
|
br i1 %neq12, label %if.then13, label %if.exit25
|
|
|
|
if.then13: ; preds = %end_block11
|
|
store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i64 13 }, %"char[]"* %taddr15, align 8
|
|
%16 = bitcast %"char[]"* %taddr15 to { i8*, i64 }*
|
|
%17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 0
|
|
%lo16 = load i8*, i8** %17, align 8
|
|
%18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 1
|
|
%hi17 = load i64, i64* %18, align 8
|
|
%19 = bitcast i64* %err5 to i8*
|
|
%20 = insertvalue %variant undef, i8* %19, 0
|
|
%21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1
|
|
%22 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots19, i64 0, i64 0
|
|
store %variant %21, %variant* %22, align 16
|
|
%23 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg18, i32 0, i32 1
|
|
store i64 1, i64* %23, align 8
|
|
%24 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg18, i32 0, i32 0
|
|
%25 = bitcast [1 x %variant]* %varargslots19 to %variant*
|
|
store %variant* %25, %variant** %24, align 8
|
|
%26 = bitcast %"variant[]"* %vararg18 to { i8*, i64 }*
|
|
%27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0
|
|
%lo20 = load i8*, i8** %27, align 8
|
|
%28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1
|
|
%hi21 = load i64, i64* %28, align 8
|
|
%29 = call i64 @std_io_printfln(i64* %retparam14, i8* %lo16, i64 %hi17, i8* %lo20, i64 %hi21)
|
|
%not_err22 = icmp eq i64 %29, 0
|
|
br i1 %not_err22, label %after_check23, label %voiderr24
|
|
|
|
after_check23: ; preds = %if.then13
|
|
br label %voiderr24
|
|
|
|
voiderr24: ; preds = %after_check23, %if.then13
|
|
br label %if.exit25
|
|
|
|
if.exit25: ; preds = %voiderr24, %end_block11
|
|
store %"char[]" { i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i64 9 }, %"char[]"* %taddr27, align 8
|
|
%30 = bitcast %"char[]"* %taddr27 to { i8*, i64 }*
|
|
%31 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %30, i32 0, i32 0
|
|
%lo28 = load i8*, i8** %31, align 8
|
|
%32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %30, i32 0, i32 1
|
|
%hi29 = load i64, i64* %32, align 8
|
|
%optval32 = load i64, i64* %a.f, align 8
|
|
%not_err33 = icmp eq i64 %optval32, 0
|
|
br i1 %not_err33, label %after_check34, label %voiderr39
|
|
|
|
after_check34: ; preds = %if.exit25
|
|
%33 = bitcast i32* %a to i8*
|
|
%34 = insertvalue %variant undef, i8* %33, 0
|
|
%35 = insertvalue %variant %34, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
|
|
%36 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots31, i64 0, i64 0
|
|
store %variant %35, %variant* %36, align 16
|
|
%37 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg30, i32 0, i32 1
|
|
store i64 1, i64* %37, align 8
|
|
%38 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg30, i32 0, i32 0
|
|
%39 = bitcast [1 x %variant]* %varargslots31 to %variant*
|
|
store %variant* %39, %variant** %38, align 8
|
|
%40 = bitcast %"variant[]"* %vararg30 to { i8*, i64 }*
|
|
%41 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %40, i32 0, i32 0
|
|
%lo35 = load i8*, i8** %41, align 8
|
|
%42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %40, i32 0, i32 1
|
|
%hi36 = load i64, i64* %42, align 8
|
|
%43 = call i64 @std_io_printfln(i64* %retparam26, i8* %lo28, i64 %hi29, i8* %lo35, i64 %hi36)
|
|
%not_err37 = icmp eq i64 %43, 0
|
|
br i1 %not_err37, label %after_check38, label %voiderr39
|
|
|
|
after_check38: ; preds = %after_check34
|
|
br label %voiderr39
|
|
|
|
voiderr39: ; preds = %after_check38, %after_check34, %if.exit25
|
|
store %"char[]" { i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i64 9 }, %"char[]"* %taddr41, align 8
|
|
%44 = bitcast %"char[]"* %taddr41 to { i8*, i64 }*
|
|
%45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %44, i32 0, i32 0
|
|
%lo42 = load i8*, i8** %45, align 8
|
|
%46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %44, i32 0, i32 1
|
|
%hi43 = load i64, i64* %46, align 8
|
|
%optval46 = load i64, i64* %b.f, align 8
|
|
%not_err47 = icmp eq i64 %optval46, 0
|
|
br i1 %not_err47, label %after_check48, label %voiderr53
|
|
|
|
after_check48: ; preds = %voiderr39
|
|
%47 = bitcast i32* %b to i8*
|
|
%48 = insertvalue %variant undef, i8* %47, 0
|
|
%49 = insertvalue %variant %48, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
|
|
%50 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots45, i64 0, i64 0
|
|
store %variant %49, %variant* %50, align 16
|
|
%51 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg44, i32 0, i32 1
|
|
store i64 1, i64* %51, align 8
|
|
%52 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg44, i32 0, i32 0
|
|
%53 = bitcast [1 x %variant]* %varargslots45 to %variant*
|
|
store %variant* %53, %variant** %52, align 8
|
|
%54 = bitcast %"variant[]"* %vararg44 to { i8*, i64 }*
|
|
%55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %54, i32 0, i32 0
|
|
%lo49 = load i8*, i8** %55, align 8
|
|
%56 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %54, i32 0, i32 1
|
|
%hi50 = load i64, i64* %56, align 8
|
|
%57 = call i64 @std_io_printfln(i64* %retparam40, i8* %lo42, i64 %hi43, i8* %lo49, i64 %hi50)
|
|
%not_err51 = icmp eq i64 %57, 0
|
|
br i1 %not_err51, label %after_check52, label %voiderr53
|
|
|
|
after_check52: ; preds = %after_check48
|
|
br label %voiderr53
|
|
|
|
voiderr53: ; preds = %after_check52, %after_check48, %voiderr39
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define void @test_test2() #0 {
|
|
entry:
|
|
%x = alloca i32, align 4
|
|
%x.f = alloca i64, align 8
|
|
%a = alloca i32, align 4
|
|
%a.f = alloca i64, align 8
|
|
%b = alloca i32, align 4
|
|
%b.f = alloca i64, align 8
|
|
%err = alloca i64, align 8
|
|
%retparam = alloca i64, align 8
|
|
%taddr = alloca %"char[]", align 8
|
|
%vararg = alloca %"variant[]", align 8
|
|
%varargslots = alloca [1 x %variant], align 16
|
|
%err10 = alloca i64, align 8
|
|
%retparam19 = alloca i64, align 8
|
|
%taddr20 = alloca %"char[]", align 8
|
|
%vararg23 = alloca %"variant[]", align 8
|
|
%varargslots24 = alloca [1 x %variant], align 16
|
|
%retparam31 = alloca i64, align 8
|
|
%taddr32 = alloca %"char[]", align 8
|
|
%vararg35 = alloca %"variant[]", align 8
|
|
%varargslots36 = alloca [1 x %variant], align 16
|
|
%retparam45 = alloca i64, align 8
|
|
%taddr46 = alloca %"char[]", align 8
|
|
%vararg49 = alloca %"variant[]", align 8
|
|
%varargslots50 = alloca [1 x %variant], align 16
|
|
store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %x.f, align 8
|
|
store i32 1, i32* %a, align 4
|
|
store i64 0, i64* %a.f, align 8
|
|
%optval = load i64, i64* %x.f, align 8
|
|
%not_err = icmp eq i64 %optval, 0
|
|
br i1 %not_err, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %optval, i64* %a.f, align 8
|
|
br label %optional_assign_jump
|
|
|
|
after_check: ; preds = %entry
|
|
%0 = load i32, i32* %x, align 4
|
|
store i32 %0, i32* %a, align 4
|
|
store i64 0, i64* %a.f, align 8
|
|
br label %after_assign
|
|
|
|
optional_assign_jump: ; preds = %assign_optional
|
|
%reload_err = load i64, i64* %a.f, align 8
|
|
store i64 %reload_err, i64* %b.f, align 8
|
|
br label %after_assign1
|
|
|
|
after_assign: ; preds = %after_check
|
|
store i32 %0, i32* %b, align 4
|
|
store i64 0, i64* %b.f, align 8
|
|
br label %after_assign1
|
|
|
|
after_assign1: ; preds = %after_assign, %optional_assign_jump
|
|
br label %testblock
|
|
|
|
testblock: ; preds = %after_assign1
|
|
%optval2 = load i64, i64* %a.f, align 8
|
|
%not_err3 = icmp eq i64 %optval2, 0
|
|
br i1 %not_err3, label %after_check5, label %assign_optional4
|
|
|
|
assign_optional4: ; preds = %testblock
|
|
store i64 %optval2, i64* %err, align 8
|
|
br label %end_block
|
|
|
|
after_check5: ; preds = %testblock
|
|
store i64 0, i64* %err, align 8
|
|
br label %end_block
|
|
|
|
end_block: ; preds = %after_check5, %assign_optional4
|
|
%1 = load i64, i64* %err, align 8
|
|
%neq = icmp ne i64 %1, 0
|
|
br i1 %neq, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %end_block
|
|
store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i64 13 }, %"char[]"* %taddr, align 8
|
|
%2 = bitcast %"char[]"* %taddr to { i8*, i64 }*
|
|
%3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %2, i32 0, i32 0
|
|
%lo = load i8*, i8** %3, align 8
|
|
%4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %2, i32 0, i32 1
|
|
%hi = load i64, i64* %4, align 8
|
|
%5 = bitcast i64* %err to i8*
|
|
%6 = insertvalue %variant undef, i8* %5, 0
|
|
%7 = insertvalue %variant %6, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1
|
|
%8 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0
|
|
store %variant %7, %variant* %8, align 16
|
|
%9 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 1
|
|
store i64 1, i64* %9, align 8
|
|
%10 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 0
|
|
%11 = bitcast [1 x %variant]* %varargslots to %variant*
|
|
store %variant* %11, %variant** %10, align 8
|
|
%12 = bitcast %"variant[]"* %vararg to { i8*, i64 }*
|
|
%13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 0
|
|
%lo6 = load i8*, i8** %13, align 8
|
|
%14 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 1
|
|
%hi7 = load i64, i64* %14, align 8
|
|
%15 = call i64 @std_io_printfln(i64* %retparam, i8* %lo, i64 %hi, i8* %lo6, i64 %hi7)
|
|
%not_err8 = icmp eq i64 %15, 0
|
|
br i1 %not_err8, label %after_check9, label %voiderr
|
|
|
|
after_check9: ; preds = %if.then
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %after_check9, %if.then
|
|
br label %if.exit
|
|
|
|
if.exit: ; preds = %voiderr, %end_block
|
|
br label %testblock11
|
|
|
|
testblock11: ; preds = %if.exit
|
|
%optval12 = load i64, i64* %b.f, align 8
|
|
%not_err13 = icmp eq i64 %optval12, 0
|
|
br i1 %not_err13, label %after_check15, label %assign_optional14
|
|
|
|
assign_optional14: ; preds = %testblock11
|
|
store i64 %optval12, i64* %err10, align 8
|
|
br label %end_block16
|
|
|
|
after_check15: ; preds = %testblock11
|
|
store i64 0, i64* %err10, align 8
|
|
br label %end_block16
|
|
|
|
end_block16: ; preds = %after_check15, %assign_optional14
|
|
%16 = load i64, i64* %err10, align 8
|
|
%neq17 = icmp ne i64 %16, 0
|
|
br i1 %neq17, label %if.then18, label %if.exit30
|
|
|
|
if.then18: ; preds = %end_block16
|
|
store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i32 0, i32 0), i64 13 }, %"char[]"* %taddr20, align 8
|
|
%17 = bitcast %"char[]"* %taddr20 to { i8*, i64 }*
|
|
%18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0
|
|
%lo21 = load i8*, i8** %18, align 8
|
|
%19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1
|
|
%hi22 = load i64, i64* %19, align 8
|
|
%20 = bitcast i64* %err10 to i8*
|
|
%21 = insertvalue %variant undef, i8* %20, 0
|
|
%22 = insertvalue %variant %21, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1
|
|
%23 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots24, i64 0, i64 0
|
|
store %variant %22, %variant* %23, align 16
|
|
%24 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg23, i32 0, i32 1
|
|
store i64 1, i64* %24, align 8
|
|
%25 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg23, i32 0, i32 0
|
|
%26 = bitcast [1 x %variant]* %varargslots24 to %variant*
|
|
store %variant* %26, %variant** %25, align 8
|
|
%27 = bitcast %"variant[]"* %vararg23 to { i8*, i64 }*
|
|
%28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 0
|
|
%lo25 = load i8*, i8** %28, align 8
|
|
%29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 1
|
|
%hi26 = load i64, i64* %29, align 8
|
|
%30 = call i64 @std_io_printfln(i64* %retparam19, i8* %lo21, i64 %hi22, i8* %lo25, i64 %hi26)
|
|
%not_err27 = icmp eq i64 %30, 0
|
|
br i1 %not_err27, label %after_check28, label %voiderr29
|
|
|
|
after_check28: ; preds = %if.then18
|
|
br label %voiderr29
|
|
|
|
voiderr29: ; preds = %after_check28, %if.then18
|
|
br label %if.exit30
|
|
|
|
if.exit30: ; preds = %voiderr29, %end_block16
|
|
store %"char[]" { i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i64 9 }, %"char[]"* %taddr32, align 8
|
|
%31 = bitcast %"char[]"* %taddr32 to { i8*, i64 }*
|
|
%32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 0
|
|
%lo33 = load i8*, i8** %32, align 8
|
|
%33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 1
|
|
%hi34 = load i64, i64* %33, align 8
|
|
%optval37 = load i64, i64* %a.f, align 8
|
|
%not_err38 = icmp eq i64 %optval37, 0
|
|
br i1 %not_err38, label %after_check39, label %voiderr44
|
|
|
|
after_check39: ; preds = %if.exit30
|
|
%34 = bitcast i32* %a to i8*
|
|
%35 = insertvalue %variant undef, i8* %34, 0
|
|
%36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
|
|
%37 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots36, i64 0, i64 0
|
|
store %variant %36, %variant* %37, align 16
|
|
%38 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg35, i32 0, i32 1
|
|
store i64 1, i64* %38, align 8
|
|
%39 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg35, i32 0, i32 0
|
|
%40 = bitcast [1 x %variant]* %varargslots36 to %variant*
|
|
store %variant* %40, %variant** %39, align 8
|
|
%41 = bitcast %"variant[]"* %vararg35 to { i8*, i64 }*
|
|
%42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0
|
|
%lo40 = load i8*, i8** %42, align 8
|
|
%43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1
|
|
%hi41 = load i64, i64* %43, align 8
|
|
%44 = call i64 @std_io_printfln(i64* %retparam31, i8* %lo33, i64 %hi34, i8* %lo40, i64 %hi41)
|
|
%not_err42 = icmp eq i64 %44, 0
|
|
br i1 %not_err42, label %after_check43, label %voiderr44
|
|
|
|
after_check43: ; preds = %after_check39
|
|
br label %voiderr44
|
|
|
|
voiderr44: ; preds = %after_check43, %after_check39, %if.exit30
|
|
store %"char[]" { i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.7, i32 0, i32 0), i64 9 }, %"char[]"* %taddr46, align 8
|
|
%45 = bitcast %"char[]"* %taddr46 to { i8*, i64 }*
|
|
%46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0
|
|
%lo47 = load i8*, i8** %46, align 8
|
|
%47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1
|
|
%hi48 = load i64, i64* %47, align 8
|
|
%optval51 = load i64, i64* %b.f, align 8
|
|
%not_err52 = icmp eq i64 %optval51, 0
|
|
br i1 %not_err52, label %after_check53, label %voiderr58
|
|
|
|
after_check53: ; preds = %voiderr44
|
|
%48 = bitcast i32* %b to i8*
|
|
%49 = insertvalue %variant undef, i8* %48, 0
|
|
%50 = insertvalue %variant %49, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
|
|
%51 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots50, i64 0, i64 0
|
|
store %variant %50, %variant* %51, align 16
|
|
%52 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg49, i32 0, i32 1
|
|
store i64 1, i64* %52, align 8
|
|
%53 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg49, i32 0, i32 0
|
|
%54 = bitcast [1 x %variant]* %varargslots50 to %variant*
|
|
store %variant* %54, %variant** %53, align 8
|
|
%55 = bitcast %"variant[]"* %vararg49 to { i8*, i64 }*
|
|
%56 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %55, i32 0, i32 0
|
|
%lo54 = load i8*, i8** %56, align 8
|
|
%57 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %55, i32 0, i32 1
|
|
%hi55 = load i64, i64* %57, align 8
|
|
%58 = call i64 @std_io_printfln(i64* %retparam45, i8* %lo47, i64 %hi48, i8* %lo54, i64 %hi55)
|
|
%not_err56 = icmp eq i64 %58, 0
|
|
br i1 %not_err56, label %after_check57, label %voiderr58
|
|
|
|
after_check57: ; preds = %after_check53
|
|
br label %voiderr58
|
|
|
|
voiderr58: ; preds = %after_check57, %after_check53, %voiderr44
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind
|
|
define void @test_test3() #0 {
|
|
entry:
|
|
%x = alloca i32, align 4
|
|
%x.f = alloca i64, align 8
|
|
%a = alloca i32, align 4
|
|
%a.f = alloca i64, align 8
|
|
%b = alloca i32, align 4
|
|
%b.f = alloca i64, align 8
|
|
%err = alloca i64, align 8
|
|
%retparam = alloca i64, align 8
|
|
%taddr = alloca %"char[]", align 8
|
|
%vararg = alloca %"variant[]", align 8
|
|
%varargslots = alloca [1 x %variant], align 16
|
|
%err10 = alloca i64, align 8
|
|
%retparam19 = alloca i64, align 8
|
|
%taddr20 = alloca %"char[]", align 8
|
|
%vararg23 = alloca %"variant[]", align 8
|
|
%varargslots24 = alloca [1 x %variant], align 16
|
|
%retparam31 = alloca i64, align 8
|
|
%taddr32 = alloca %"char[]", align 8
|
|
%vararg35 = alloca %"variant[]", align 8
|
|
%varargslots36 = alloca [1 x %variant], align 16
|
|
%retparam45 = alloca i64, align 8
|
|
%taddr46 = alloca %"char[]", align 8
|
|
%vararg49 = alloca %"variant[]", align 8
|
|
%varargslots50 = alloca [1 x %variant], align 16
|
|
store i32 23, i32* %x, align 4
|
|
store i64 0, i64* %x.f, align 8
|
|
store i32 1, i32* %a, align 4
|
|
store i64 0, i64* %a.f, align 8
|
|
%optval = load i64, i64* %x.f, align 8
|
|
%not_err = icmp eq i64 %optval, 0
|
|
br i1 %not_err, label %after_check, label %assign_optional
|
|
|
|
assign_optional: ; preds = %entry
|
|
store i64 %optval, i64* %a.f, align 8
|
|
br label %optional_assign_jump
|
|
|
|
after_check: ; preds = %entry
|
|
%0 = load i32, i32* %x, align 4
|
|
store i32 %0, i32* %a, align 4
|
|
store i64 0, i64* %a.f, align 8
|
|
br label %after_assign
|
|
|
|
optional_assign_jump: ; preds = %assign_optional
|
|
%reload_err = load i64, i64* %a.f, align 8
|
|
store i64 %reload_err, i64* %b.f, align 8
|
|
br label %after_assign1
|
|
|
|
after_assign: ; preds = %after_check
|
|
store i32 %0, i32* %b, align 4
|
|
store i64 0, i64* %b.f, align 8
|
|
br label %after_assign1
|
|
|
|
after_assign1: ; preds = %after_assign, %optional_assign_jump
|
|
br label %testblock
|
|
|
|
testblock: ; preds = %after_assign1
|
|
%optval2 = load i64, i64* %a.f, align 8
|
|
%not_err3 = icmp eq i64 %optval2, 0
|
|
br i1 %not_err3, label %after_check5, label %assign_optional4
|
|
|
|
assign_optional4: ; preds = %testblock
|
|
store i64 %optval2, i64* %err, align 8
|
|
br label %end_block
|
|
|
|
after_check5: ; preds = %testblock
|
|
store i64 0, i64* %err, align 8
|
|
br label %end_block
|
|
|
|
end_block: ; preds = %after_check5, %assign_optional4
|
|
%1 = load i64, i64* %err, align 8
|
|
%neq = icmp ne i64 %1, 0
|
|
br i1 %neq, label %if.then, label %if.exit
|
|
|
|
if.then: ; preds = %end_block
|
|
store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.8, i32 0, i32 0), i64 13 }, %"char[]"* %taddr, align 8
|
|
%2 = bitcast %"char[]"* %taddr to { i8*, i64 }*
|
|
%3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %2, i32 0, i32 0
|
|
%lo = load i8*, i8** %3, align 8
|
|
%4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %2, i32 0, i32 1
|
|
%hi = load i64, i64* %4, align 8
|
|
%5 = bitcast i64* %err to i8*
|
|
%6 = insertvalue %variant undef, i8* %5, 0
|
|
%7 = insertvalue %variant %6, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1
|
|
%8 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0
|
|
store %variant %7, %variant* %8, align 16
|
|
%9 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 1
|
|
store i64 1, i64* %9, align 8
|
|
%10 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg, i32 0, i32 0
|
|
%11 = bitcast [1 x %variant]* %varargslots to %variant*
|
|
store %variant* %11, %variant** %10, align 8
|
|
%12 = bitcast %"variant[]"* %vararg to { i8*, i64 }*
|
|
%13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 0
|
|
%lo6 = load i8*, i8** %13, align 8
|
|
%14 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 1
|
|
%hi7 = load i64, i64* %14, align 8
|
|
%15 = call i64 @std_io_printfln(i64* %retparam, i8* %lo, i64 %hi, i8* %lo6, i64 %hi7)
|
|
%not_err8 = icmp eq i64 %15, 0
|
|
br i1 %not_err8, label %after_check9, label %voiderr
|
|
|
|
after_check9: ; preds = %if.then
|
|
br label %voiderr
|
|
|
|
voiderr: ; preds = %after_check9, %if.then
|
|
br label %if.exit
|
|
|
|
if.exit: ; preds = %voiderr, %end_block
|
|
br label %testblock11
|
|
|
|
testblock11: ; preds = %if.exit
|
|
%optval12 = load i64, i64* %b.f, align 8
|
|
%not_err13 = icmp eq i64 %optval12, 0
|
|
br i1 %not_err13, label %after_check15, label %assign_optional14
|
|
|
|
assign_optional14: ; preds = %testblock11
|
|
store i64 %optval12, i64* %err10, align 8
|
|
br label %end_block16
|
|
|
|
after_check15: ; preds = %testblock11
|
|
store i64 0, i64* %err10, align 8
|
|
br label %end_block16
|
|
|
|
end_block16: ; preds = %after_check15, %assign_optional14
|
|
%16 = load i64, i64* %err10, align 8
|
|
%neq17 = icmp ne i64 %16, 0
|
|
br i1 %neq17, label %if.then18, label %if.exit30
|
|
|
|
if.then18: ; preds = %end_block16
|
|
store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.9, i32 0, i32 0), i64 13 }, %"char[]"* %taddr20, align 8
|
|
%17 = bitcast %"char[]"* %taddr20 to { i8*, i64 }*
|
|
%18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0
|
|
%lo21 = load i8*, i8** %18, align 8
|
|
%19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1
|
|
%hi22 = load i64, i64* %19, align 8
|
|
%20 = bitcast i64* %err10 to i8*
|
|
%21 = insertvalue %variant undef, i8* %20, 0
|
|
%22 = insertvalue %variant %21, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1
|
|
%23 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots24, i64 0, i64 0
|
|
store %variant %22, %variant* %23, align 16
|
|
%24 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg23, i32 0, i32 1
|
|
store i64 1, i64* %24, align 8
|
|
%25 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg23, i32 0, i32 0
|
|
%26 = bitcast [1 x %variant]* %varargslots24 to %variant*
|
|
store %variant* %26, %variant** %25, align 8
|
|
%27 = bitcast %"variant[]"* %vararg23 to { i8*, i64 }*
|
|
%28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 0
|
|
%lo25 = load i8*, i8** %28, align 8
|
|
%29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 1
|
|
%hi26 = load i64, i64* %29, align 8
|
|
%30 = call i64 @std_io_printfln(i64* %retparam19, i8* %lo21, i64 %hi22, i8* %lo25, i64 %hi26)
|
|
%not_err27 = icmp eq i64 %30, 0
|
|
br i1 %not_err27, label %after_check28, label %voiderr29
|
|
|
|
after_check28: ; preds = %if.then18
|
|
br label %voiderr29
|
|
|
|
voiderr29: ; preds = %after_check28, %if.then18
|
|
br label %if.exit30
|
|
|
|
if.exit30: ; preds = %voiderr29, %end_block16
|
|
store %"char[]" { i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i32 0, i32 0), i64 9 }, %"char[]"* %taddr32, align 8
|
|
%31 = bitcast %"char[]"* %taddr32 to { i8*, i64 }*
|
|
%32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 0
|
|
%lo33 = load i8*, i8** %32, align 8
|
|
%33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 1
|
|
%hi34 = load i64, i64* %33, align 8
|
|
%optval37 = load i64, i64* %a.f, align 8
|
|
%not_err38 = icmp eq i64 %optval37, 0
|
|
br i1 %not_err38, label %after_check39, label %voiderr44
|
|
|
|
after_check39: ; preds = %if.exit30
|
|
%34 = bitcast i32* %a to i8*
|
|
%35 = insertvalue %variant undef, i8* %34, 0
|
|
%36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
|
|
%37 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots36, i64 0, i64 0
|
|
store %variant %36, %variant* %37, align 16
|
|
%38 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg35, i32 0, i32 1
|
|
store i64 1, i64* %38, align 8
|
|
%39 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg35, i32 0, i32 0
|
|
%40 = bitcast [1 x %variant]* %varargslots36 to %variant*
|
|
store %variant* %40, %variant** %39, align 8
|
|
%41 = bitcast %"variant[]"* %vararg35 to { i8*, i64 }*
|
|
%42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0
|
|
%lo40 = load i8*, i8** %42, align 8
|
|
%43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1
|
|
%hi41 = load i64, i64* %43, align 8
|
|
%44 = call i64 @std_io_printfln(i64* %retparam31, i8* %lo33, i64 %hi34, i8* %lo40, i64 %hi41)
|
|
%not_err42 = icmp eq i64 %44, 0
|
|
br i1 %not_err42, label %after_check43, label %voiderr44
|
|
|
|
after_check43: ; preds = %after_check39
|
|
br label %voiderr44
|
|
|
|
voiderr44: ; preds = %after_check43, %after_check39, %if.exit30
|
|
store %"char[]" { i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0), i64 9 }, %"char[]"* %taddr46, align 8
|
|
%45 = bitcast %"char[]"* %taddr46 to { i8*, i64 }*
|
|
%46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0
|
|
%lo47 = load i8*, i8** %46, align 8
|
|
%47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1
|
|
%hi48 = load i64, i64* %47, align 8
|
|
%optval51 = load i64, i64* %b.f, align 8
|
|
%not_err52 = icmp eq i64 %optval51, 0
|
|
br i1 %not_err52, label %after_check53, label %voiderr58
|
|
|
|
after_check53: ; preds = %voiderr44
|
|
%48 = bitcast i32* %b to i8*
|
|
%49 = insertvalue %variant undef, i8* %48, 0
|
|
%50 = insertvalue %variant %49, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1
|
|
%51 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots50, i64 0, i64 0
|
|
store %variant %50, %variant* %51, align 16
|
|
%52 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg49, i32 0, i32 1
|
|
store i64 1, i64* %52, align 8
|
|
%53 = getelementptr inbounds %"variant[]", %"variant[]"* %vararg49, i32 0, i32 0
|
|
%54 = bitcast [1 x %variant]* %varargslots50 to %variant*
|
|
store %variant* %54, %variant** %53, align 8
|
|
%55 = bitcast %"variant[]"* %vararg49 to { i8*, i64 }*
|
|
%56 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %55, i32 0, i32 0
|
|
%lo54 = load i8*, i8** %56, align 8
|
|
%57 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %55, i32 0, i32 1
|
|
%hi55 = load i64, i64* %57, align 8
|
|
%58 = call i64 @std_io_printfln(i64* %retparam45, i8* %lo47, i64 %hi48, i8* %lo54, i64 %hi55)
|
|
%not_err56 = icmp eq i64 %58, 0
|
|
br i1 %not_err56, label %after_check57, label %voiderr58
|
|
|
|
after_check57: ; preds = %after_check53
|
|
br label %voiderr58
|
|
|
|
voiderr58: ; preds = %after_check57, %after_check53, %voiderr44
|
|
ret void
|
|
}
|