diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9e4a47035..a4c0bfc47 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,7 +54,7 @@ jobs: - name: run compiler tests run: | cd test - python3.exe src/tester.py ..\build\${{ matrix.build_type }}\c3c.exe test_suite2/ + python3.exe src/tester.py ..\build\${{ matrix.build_type }}\c3c.exe test_suite/ - name: Compile run unit tests run: | @@ -119,7 +119,7 @@ jobs: - name: run compiler tests run: | cd test - python3 src/tester.py ../build/c3c.exe test_suite2/ + python3 src/tester.py ../build/c3c.exe test_suite/ build-msys2-clang: @@ -168,7 +168,7 @@ jobs: - name: run compiler tests run: | cd test - python3 src/tester.py ../build/c3c.exe test_suite/ + python3 src/tester.py ../build/c3c.exe test_suite14/ build-linux: runs-on: ubuntu-latest @@ -237,9 +237,9 @@ jobs: run: | cd test if [[ "${{matrix.llvm_version}}" < 15 ]]; then - python3 src/tester.py ../build/c3c test_suite/ + python3 src/tester.py ../build/c3c test_suite14/ else - python3 src/tester.py ../build/c3c test_suite2/ + python3 src/tester.py ../build/c3c test_suite/ fi - name: bundle_output @@ -317,9 +317,9 @@ jobs: run: | cd test if [[ "${{matrix.llvm_version}}" < 15 ]]; then - python3 src/tester.py ../build/c3c test_suite/ + python3 src/tester.py ../build/c3c test_suite14/ else - python3 src/tester.py ../build/c3c test_suite2/ + python3 src/tester.py ../build/c3c test_suite/ fi - name: bundle_output diff --git a/lib/std/io/io_printf.c3 b/lib/std/io/io_printf.c3 index 3069cc964..be5c1b22b 100644 --- a/lib/std/io/io_printf.c3 +++ b/lib/std/io/io_printf.c3 @@ -294,7 +294,9 @@ fn usz! printf(String format, args...) @maydiscard return formatter.vprintf(format, args); } -fn usz! printfln(String format, args...) @maydiscard +define printfln = printfn; + +fn usz! printfn(String format, args...) @maydiscard { Formatter formatter; formatter.init(&out_putchar_fn); @@ -310,7 +312,7 @@ fn usz! VarString.printf(VarString* str, String format, args...) @maydiscard return formatter.vprintf(format, args); } -fn usz! VarString.printfln(VarString* str, String format, args...) @maydiscard +fn usz! VarString.printfn(VarString* str, String format, args...) @maydiscard { Formatter formatter; formatter.init(&out_string_append_fn, str); @@ -341,7 +343,7 @@ fn usz! File.printf(File file, String format, args...) @maydiscard return formatter.vprintf(format, args)?; } -fn usz! File.printfln(File file, String format, args...) @maydiscard +fn usz! File.printfn(File file, String format, args...) @maydiscard { Formatter formatter; formatter.init(&out_putchar_fn, &file); diff --git a/lib/std/math.c3 b/lib/std/math.c3 index 16568305c..0395ce0a4 100644 --- a/lib/std/math.c3 +++ b/lib/std/math.c3 @@ -412,6 +412,13 @@ macro int128 int128[<*>].xor(int128[<*>] x) = $$reduce_xor(x); macro int128 int128[<*>].max(int128[<*>] x) = $$reduce_max(x); macro int128 int128[<*>].min(int128[<*>] x) = $$reduce_min(x); +macro bool[<*>] bool[<*>].comp_lt(bool[<*>] x, bool[<*>] y) = $$veccomplt(x, y); +macro bool[<*>] bool[<*>].comp_le(bool[<*>] x, bool[<*>] y) = $$veccomple(x, y); +macro bool[<*>] bool[<*>].comp_eq(bool[<*>] x, bool[<*>] y) = $$veccompeq(x, y); +macro bool[<*>] bool[<*>].comp_gt(bool[<*>] x, bool[<*>] y) = $$veccompgt(x, y); +macro bool[<*>] bool[<*>].comp_ge(bool[<*>] x, bool[<*>] y) = $$veccompge(x, y); +macro bool[<*>] bool[<*>].comp_ne(bool[<*>] x, bool[<*>] y) = $$veccompne(x, y); + macro bool bool[<*>].sum(bool[<*>] x) = $$reduce_add(x); macro bool bool[<*>].product(bool[<*>] x) = $$reduce_mul(x); macro bool bool[<*>].and(bool[<*>] x) = $$reduce_and(x); diff --git a/lib/std/runtime.c3 b/lib/std/runtime.c3 index 0b18d940f..1a0f0c6d7 100644 --- a/lib/std/runtime.c3 +++ b/lib/std/runtime.c3 @@ -51,8 +51,8 @@ private TestRunner* current_runner; fn void test_panic(String message, String file, String function, uint line) { io::println("[error]"); - io::printfln("\n Error: %s", message); - io::printfln(" - in %s %s:%s.\n", function, file, line); + io::printfn("\n Error: %s", message); + io::printfn(" - in %s %s:%s.\n", function, file, line); libc::longjmp(¤t_runner.buf, 1); } @@ -79,7 +79,7 @@ fn bool TestRunner.run(TestRunner* runner) tests_passed++; } } - io::printfln("\n%d test(s) run.\n", tests); + io::printfn("\n%d test(s) run.\n", tests); io::print("Test Result: "); if (tests_passed < tests) { @@ -89,7 +89,7 @@ fn bool TestRunner.run(TestRunner* runner) { io::print("ok"); } - io::printfln(". %d passed, %d failed.", tests_passed, tests - tests_passed); + io::printfn(". %d passed, %d failed.", tests_passed, tests - tests_passed); return tests == tests_passed; } diff --git a/resources/examples/brainfk.c3 b/resources/examples/brainfk.c3 index 99d5e2cae..f2f6dadd3 100644 --- a/resources/examples/brainfk.c3 +++ b/resources/examples/brainfk.c3 @@ -12,7 +12,7 @@ fault InterpretError fn void! print_error(usz pos, String err) { - io::printfln("Error at %s: %s", pos, err); + io::printfn("Error at %s: %s", pos, err); return InterpretError.INTEPRET_FAILED!; } diff --git a/resources/examples/contextfree/dynscope.c3 b/resources/examples/contextfree/dynscope.c3 index 387018a5c..9d681b8a9 100644 --- a/resources/examples/contextfree/dynscope.c3 +++ b/resources/examples/contextfree/dynscope.c3 @@ -5,7 +5,7 @@ tlocal String context_user = "safe"; macro long reallyPerform(task) { - io::printfln("%s: %s", context_user, task); + io::printfn("%s: %s", context_user, task); return task.len; } @@ -28,5 +28,5 @@ fn void main() long val1 = perform("something"); long val2 = @with_mode("faster", perform, "reliable"); long val3 = perform(String[] {"something"}); - io::printfln("%d %d %d", val1, val2, val3); + io::printfn("%d %d %d", val1, val2, val3); } diff --git a/resources/examples/nbodies.c3 b/resources/examples/nbodies.c3 index 03fa1db48..919a25ca5 100644 --- a/resources/examples/nbodies.c3 +++ b/resources/examples/nbodies.c3 @@ -155,6 +155,6 @@ fn void main(String[] args) advance(bodies); } scale_bodies(bodies, RECIP_DT); - io::printfln("%.9f", start); - io::printfln("%.9f", energy(bodies)); + io::printfn("%.9f", start); + io::printfn("%.9f", energy(bodies)); } diff --git a/resources/examples/plus_minus.c3 b/resources/examples/plus_minus.c3 index 674f67818..041c86690 100644 --- a/resources/examples/plus_minus.c3 +++ b/resources/examples/plus_minus.c3 @@ -53,7 +53,7 @@ fn void main(String[] args) return; } } - io::printfln("%d", val); + io::printfn("%d", val); } fn String! read_next(String* remaining) diff --git a/resources/testfragments/allocators_testing.c3 b/resources/testfragments/allocators_testing.c3 index b1f55d22a..6ad35ac5e 100644 --- a/resources/testfragments/allocators_testing.c3 +++ b/resources/testfragments/allocators_testing.c3 @@ -32,7 +32,7 @@ fn void testAllocator(Allocator* a, int val) io::printf("Aligned with offset %p, align 16: %s offset align 128: %s\n", data, mem::ptr_is_aligned(data, 16), mem::ptr_is_aligned(data + 16, 128)); data = a.realloc_aligned(data, val + 1, 128, 0)!!; io::printf("No offset %p, align 16: %s offset align 128: %s\n", data, mem::ptr_is_aligned(data, 16), mem::ptr_is_aligned(data + 16, 128)); - io::printfln("Freeing %p", data); + io::printfn("Freeing %p", data); a.free_aligned(data)!!; } fn void main() diff --git a/src/version.h b/src/version.h index fd6e1cb85..2ba61195a 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.4.10" \ No newline at end of file +#define COMPILER_VERSION "0.4.11" \ No newline at end of file diff --git a/test/test_suite/abi/aarch64_args.c3t b/test/test_suite/abi/aarch64_args.c3t index c716c6597..498a388c2 100644 --- a/test/test_suite/abi/aarch64_args.c3t +++ b/test/test_suite/abi/aarch64_args.c3t @@ -20,15 +20,10 @@ entry: %l = alloca %Large, align 8 %indirectarg = alloca %Large, align 8 %indirectarg1 = alloca %Large, align 8 - %0 = bitcast %Large* %l to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 64, i1 false) - %1 = bitcast %Large* %indirectarg to i8* - %2 = bitcast %Large* %l to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 64, i1 false) - call void @pass_large(%Large* align 8 %indirectarg) - %3 = bitcast %Large* %indirectarg1 to i8* - %4 = bitcast %Large* %l to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 64, i1 false) - call void @pass_large(%Large* align 8 %indirectarg1) + call void @llvm.memset.p0.i64(ptr align 8 %l, i8 0, i64 64, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 8 %l, i32 64, i1 false) + call void @pass_large(ptr align 8 %indirectarg) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg1, ptr align 8 %l, i32 64, i1 false) + call void @pass_large(ptr align 8 %indirectarg1) ret void } \ No newline at end of file diff --git a/test/test_suite/abi/darwin64_avx.c3t b/test/test_suite/abi/darwin64_avx.c3t index b5e3d5fc0..465b64271 100644 --- a/test/test_suite/abi/darwin64_avx.c3t +++ b/test/test_suite/abi/darwin64_avx.c3t @@ -111,13 +111,13 @@ fn void f61(SAtwo256 s) { declare void @f38(<8 x float>) declare void @f37(<8 x float>) -declare void @func40(%Two128* byval(%Two128) align 16) -define void @test_func41(%Two128* byval(%Two128) align 16 %0) +declare void @func40(ptr byval(%Two128) align 16) +define void @test_func41(ptr byval(%Two128) align 16 %0) -declare void @func42(%Sa* byval(%Sa) align 16) -define void @test_func43(%Sa* byval(%Sa) align 16 %0) +declare void @func42(ptr byval(%Sa) align 16) +define void @test_func43(ptr byval(%Sa) align 16 %0) -declare void @f46(double, double, double, double, double, double, double, double, <2 x float>* byval(<2 x float>) align 8, <2 x float>* byval(<2 x float>) align 8) +declare void @f46(double, double, double, double, double, double, double, double, ptr byval(<2 x float>) align 8, ptr byval(<2 x float>) align 8) #0 declare void @f47(i32, i32, i32, i32, i32, i32, i32) declare void @test_test49_helper(double, ...) @@ -127,15 +127,15 @@ entry: ret void call void (i32, ...) @test52_helper(i32 0, <8 x float> %0, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) - call void (<8 x float>, ...) @test54_helper(<8 x float> %0, <8 x float> %1, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) - call void (<8 x float>, ...) @test54_helper(<8 x float> %6, <8 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, %Complex* byval(%Complex) align 8 %literal1) + call void (<8 x float>, ...) @test54_helper(<8 x float> %6, <8 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, ptr byval(%Complex) align 8 %literal1) -declare void @f55(%St512* byval(%St512) align 64) #0 -declare void @f56(<16 x float>* byval(<16 x float>) align 64) #0 +declare void @f55(ptr byval(%St512) align 64) +declare void @f56(ptr byval(<16 x float>) align 64) -declare void @f58(%Two256* byval(%Two256) align 32) #0 -define void @test_f59(%Two256* byval(%Two256) align 32 %0) #0 { +declare void @f58(ptr byval(%Two256) align 32) +define void @test_f59(ptr byval(%Two256) align 32 %0) -declare void @f60(%SAtwo256* byval(%SAtwo256) align 32) #0 -define void @test_f61(%SAtwo256* byval(%SAtwo256) align 32 %0) #0 { \ No newline at end of file +declare void @f60(ptr byval(%SAtwo256) align 32) + +define void @test_f61(ptr byval(%SAtwo256) align 32 %0) #0 { diff --git a/test/test_suite/abi/darwin64_avx512.c3t b/test/test_suite/abi/darwin64_avx512.c3t index 26e579226..b45b3cd50 100644 --- a/test/test_suite/abi/darwin64_avx512.c3t +++ b/test/test_suite/abi/darwin64_avx512.c3t @@ -61,15 +61,14 @@ fn void f64() { declare void @f55(<16 x float>) #0 declare void @f56(<16 x float>) #0 -declare void @f58(%Two256* byval(%Two256) align 32) #0 -define void @test_f59(%Two256* byval(%Two256) align 32 %0) #0 { - -declare void @f60(%SAtwo256* byval(%SAtwo256) align 32) #0 -define void @test_f61(%SAtwo256* byval(%SAtwo256) align 32 %0) #0 { +declare void @f58(ptr byval(%Two256) align 32) #0 +define void @test_f59(ptr byval(%Two256) align 32 %0) #0 { +declare void @f60(ptr byval(%SAtwo256) align 32) #0 +define void @test_f61(ptr byval(%SAtwo256) align 32 %0) #0 { define void @test_f62() #0 { call void (i32, ...) @test_f62_helper(i32 0, <16 x float> %0, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) define void @test_f64() #0 { call void (<16 x float>, ...) @test_f64_helper(<16 x float> %0, <16 x float> %1, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) - call void (<16 x float>, ...) @test_f64_helper(<16 x float> %6, <16 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, %Complex* byval(%Complex) align 8 %literal1) + call void (<16 x float>, ...) @test_f64_helper(<16 x float> %6, <16 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, ptr byval(%Complex) align 8 %literal1) diff --git a/test/test_suite/abi/darwin64_sret.c3t b/test/test_suite/abi/darwin64_sret.c3t index 64b7125fc..bab17c41d 100644 --- a/test/test_suite/abi/darwin64_sret.c3t +++ b/test/test_suite/abi/darwin64_sret.c3t @@ -12,10 +12,8 @@ fn SimdDouble4x4 ident(SimdDouble4x4 x) { /* #expect: foo.ll -define void @foo_ident(%SimdDouble4x4* noalias sret(%SimdDouble4x4) align 32 %0, %SimdDouble4x4* byval(%SimdDouble4x4) align 32 %1) #0 { +define void @foo_ident(ptr noalias sret(%SimdDouble4x4) align 32 %0, ptr byval(%SimdDouble4x4) align 32 %1) #0 { entry: - %2 = bitcast %SimdDouble4x4* %0 to i8* - %3 = bitcast %SimdDouble4x4* %1 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 32 %2, i8* align 32 %3, i32 128, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 32 %0, ptr align 32 %1, i32 128, i1 false) ret void } \ No newline at end of file diff --git a/test/test_suite/abi/darwin64_sse.c3t b/test/test_suite/abi/darwin64_sse.c3t index a425eb231..98dfe1932 100644 --- a/test/test_suite/abi/darwin64_sse.c3t +++ b/test/test_suite/abi/darwin64_sse.c3t @@ -46,11 +46,11 @@ fn void func43(Sa s) { /* #expect: test.ll -declare void @f38(%St256* byval(%St256) align 32) -declare void @f37(<8 x float>* byval(<8 x float>) align 32) +declare void @f38(ptr byval(%St256) align 32) +declare void @f37(ptr byval(<8 x float>) align 32) -declare void @func40(%Two128* byval(%Two128) align 16) -define void @test_func41(%Two128* byval(%Two128) align 16 %0) +declare void @func40(ptr byval(%Two128) align 16) +define void @test_func41(ptr byval(%Two128) align 16 %0) -declare void @func42(%Sa* byval(%Sa) align 16) -define void @test_func43(%Sa* byval(%Sa) align 16 %0) +declare void @func42(ptr byval(%Sa) align 16) +define void @test_func43(ptr byval(%Sa) align 16 %0) diff --git a/test/test_suite/abi/darwin_arg.c3t b/test/test_suite/abi/darwin_arg.c3t index ce0e37812..39502e1b0 100644 --- a/test/test_suite/abi/darwin_arg.c3t +++ b/test/test_suite/abi/darwin_arg.c3t @@ -20,7 +20,6 @@ fn void f9122143() declare void @d(i64, double) #0 - %lo = load i64, i64* getelementptr inbounds ({ i64, double }, { i64, double }* bitcast (%Str* @test_ss to { i64, double }*), i32 0, i32 0), align 16 - %hi = load double, double* getelementptr inbounds ({ i64, double }, { i64, double }* bitcast (%Str* @test_ss to { i64, double }*), i32 0, i32 1), align 8 + %lo = load i64, ptr @test_ss, align 16 + %hi = load double, ptr getelementptr inbounds ({ i64, double }, ptr @test_ss, i32 0, i32 1), align 8 call void @d(i64 %lo, double %hi) - ret void diff --git a/test/test_suite/abi/darwinx64_1.c3t b/test/test_suite/abi/darwinx64_1.c3t index 90ceda530..f332dffbe 100644 --- a/test/test_suite/abi/darwinx64_1.c3t +++ b/test/test_suite/abi/darwinx64_1.c3t @@ -42,7 +42,7 @@ define signext i16 @test_f1() define i32 @test_f2() define float @test_f3() define double @test_f4() -define void @test_f6(i8 zeroext %0, i16 signext %1, i32 %2, i64 %3, i8* %4) +define void @test_f6(i8 zeroext %0, i16 signext %1, i32 %2, i64 %3, ptr %4) define void @test_f7(i32 %0) define i64 @test_f8_1() define void @test_f8_2(i64 %0) #0 { diff --git a/test/test_suite/abi/darwinx64_2.c3t b/test/test_suite/abi/darwinx64_2.c3t index 713557505..59a6cdd43 100644 --- a/test/test_suite/abi/darwinx64_2.c3t +++ b/test/test_suite/abi/darwinx64_2.c3t @@ -149,15 +149,15 @@ fn V2i32 f36(V2i32 arg) { return arg; } define i32 @test_f12_0() define void @test_f12_1(i32 %0) -define void @test_f13(%St13_0* noalias sret(%St13_0) align 8 %0, i32 %1, i32 %2, i32 %3, i32 %4, %St13_1* byval(%St13_1) align 8 %5, i32 %6) #0 { +define void @test_f13(ptr noalias sret(%St13_0) align 8 %0, i32 %1, i32 %2, i32 %3, i32 %4, ptr byval(%St13_1) align 8 %5, i32 %6) #0 { define void @test_f14(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i8 signext %6) #0 { -define void @test_f15(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i8* %6) +define void @test_f15(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, ptr %6) define void @test_f16(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, float %8) define void @test_fl18(i32 %0, i32 %1) -define void @test_f20(%St20* byval(%St20) align 32 %0) -define i8* @test_f21(i64 %0, i8* %1) +define void @test_f20(ptr byval(%St20) align 32 %0) +define ptr @test_f21(i64 %0, ptr %1) define void @test_f22(i64 %0, i64 %1, i64 %2, i64 %3) entry: @@ -165,7 +165,7 @@ entry: %y = alloca %St22s, align 16 define void @test_f23(i32 %0, i64 %1, i32 %2) -define { i64, i32 } @test_f24(%St23S* %0, %St24s* %1) +define { i64, i32 } @test_f24(ptr %0, ptr %1) define <4 x float> @test_f25(<4 x float> %0) #0 { entry: @@ -173,7 +173,7 @@ entry: ret <4 x float> %fadd } -define { i32*, float* } @test_f26(%Foo26* %0) +define { ptr, ptr } @test_f26(ptr %0) define <4 x float> @test_f27(<4 x float> %0) define <8 x float> @test_f27a(<8 x float> %0) define <8 x float> @test_f27b(<8 x float> %0) @@ -183,4 +183,4 @@ define void @test_f30(i64 %0, i24 %1) define float @test_f31(<2 x float> %0, float %1) define double @test_f34(double %0) define double @test_f35(double %0) -define double @test_f36(double %0) +define double @test_f36(double %0) \ No newline at end of file diff --git a/test/test_suite/abi/literal_load.c3t b/test/test_suite/abi/literal_load.c3t index 02dd36d0e..797ce3bdb 100644 --- a/test/test_suite/abi/literal_load.c3t +++ b/test/test_suite/abi/literal_load.c3t @@ -15,17 +15,18 @@ fn Test creator() return Test{}; } -// #expect: literal_load.ll +/* #expect: literal_load.ll +define i32 @literal_load_creator() #0 { +entry: %literal = alloca %Test, align 4 %literal1 = alloca %Test, align 4 - %0 = bitcast %Test* %literal to i32* - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds %Test, %Test* %literal, i32 0, i32 0 - %2 = load i32, i32* %1, align 4 - call void @blorg(i32 %2) - %3 = bitcast %Test* %literal1 to i32* - store i32 0, i32* %3, align 4 - %4 = getelementptr inbounds %Test, %Test* %literal1, i32 0, i32 0 - %5 = load i32, i32* %4, align 4 - ret i32 %5 \ No newline at end of file + store i32 0, ptr %literal, align 4 + %0 = getelementptr inbounds %Test, ptr %literal, i32 0, i32 0 + %1 = load i32, ptr %0, align 4 + call void @blorg(i32 %1) + store i32 0, ptr %literal1, align 4 + %2 = getelementptr inbounds %Test, ptr %literal1, i32 0, i32 0 + %3 = load i32, ptr %2, align 4 + ret i32 %3 +} diff --git a/test/test_suite/abi/literal_load_aarch64.c3t b/test/test_suite/abi/literal_load_aarch64.c3t index ea6de7b9d..dde880cfa 100644 --- a/test/test_suite/abi/literal_load_aarch64.c3t +++ b/test/test_suite/abi/literal_load_aarch64.c3t @@ -16,7 +16,7 @@ fn Test creator() return Test{}; } -// #expect: literal_load.ll +/* #expect: literal_load.ll declare void @blorg(i64) #0 @@ -24,15 +24,13 @@ define i32 @literal_load_creator() #0 { entry: %literal = alloca %Test, align 4 %literal1 = alloca %Test, align 4 - %0 = bitcast %Test* %literal to i32* - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds %Test, %Test* %literal, i32 0, i32 0 - %2 = load i32, i32* %1, align 4 - %3 = zext i32 %2 to i64 - call void @blorg(i64 %3) - %4 = bitcast %Test* %literal1 to i32* - store i32 0, i32* %4, align 4 - %5 = getelementptr inbounds %Test, %Test* %literal1, i32 0, i32 0 - %6 = load i32, i32* %5, align 4 - ret i32 %6 + store i32 0, ptr %literal, align 4 + %0 = getelementptr inbounds %Test, ptr %literal, i32 0, i32 0 + %1 = load i32, ptr %0, align 4 + %2 = zext i32 %1 to i64 + call void @blorg(i64 %2) + store i32 0, ptr %literal1, align 4 + %3 = getelementptr inbounds %Test, ptr %literal1, i32 0, i32 0 + %4 = load i32, ptr %3, align 4 + ret i32 %4 } \ No newline at end of file diff --git a/test/test_suite/abi/literal_load_mingw.c3t b/test/test_suite/abi/literal_load_mingw.c3t index 18e5f6156..430a9da08 100644 --- a/test/test_suite/abi/literal_load_mingw.c3t +++ b/test/test_suite/abi/literal_load_mingw.c3t @@ -16,17 +16,18 @@ fn Test creator() return Test{}; } -// #expect: literal_load.ll +/* #expect: literal_load.ll +define i32 @literal_load_creator() #0 { +entry: %literal = alloca %Test, align 4 %literal1 = alloca %Test, align 4 - %0 = bitcast %Test* %literal to i32* - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds %Test, %Test* %literal, i32 0, i32 0 - %2 = load i32, i32* %1, align 4 - call void @blorg(i32 %2) - %3 = bitcast %Test* %literal1 to i32* - store i32 0, i32* %3, align 4 - %4 = getelementptr inbounds %Test, %Test* %literal1, i32 0, i32 0 - %5 = load i32, i32* %4, align 4 - ret i32 %5 \ No newline at end of file + store i32 0, ptr %literal, align 4 + %0 = getelementptr inbounds %Test, ptr %literal, i32 0, i32 0 + %1 = load i32, ptr %0, align 4 + call void @blorg(i32 %1) + store i32 0, ptr %literal1, align 4 + %2 = getelementptr inbounds %Test, ptr %literal1, i32 0, i32 0 + %3 = load i32, ptr %2, align 4 + ret i32 %3 +} diff --git a/test/test_suite/abi/pass_large_aarch.c3t b/test/test_suite/abi/pass_large_aarch.c3t index 3e156d241..ad4f36305 100644 --- a/test/test_suite/abi/pass_large_aarch.c3t +++ b/test/test_suite/abi/pass_large_aarch.c3t @@ -24,14 +24,9 @@ entry: %l = alloca %Large, align 8 %indirectarg = alloca %Large, align 8 %indirectarg1 = alloca %Large, align 8 - %0 = bitcast %Large* %l to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 64, i1 false) - %1 = bitcast %Large* %indirectarg to i8* - %2 = bitcast %Large* %l to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 64, i1 false) - call void @pass_large(%Large* align 8 %indirectarg) - %3 = bitcast %Large* %indirectarg1 to i8* - %4 = bitcast %Large* %l to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 64, i1 false) - call void @pass_large(%Large* align 8 %indirectarg1) + call void @llvm.memset.p0.i64(ptr align 8 %l, i8 0, i64 64, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 8 %l, i32 64, i1 false) + call void @pass_large(ptr align 8 %indirectarg) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg1, ptr align 8 %l, i32 64, i1 false) + call void @pass_large(ptr align 8 %indirectarg1) ret void diff --git a/test/test_suite/abi/regcall_expand.c3t b/test/test_suite/abi/regcall_expand.c3t index b712caf02..d250c8c77 100644 --- a/test/test_suite/abi/regcall_expand.c3t +++ b/test/test_suite/abi/regcall_expand.c3t @@ -25,14 +25,16 @@ $"ct$test_Foo" = comdat any @"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 +declare void @printf(ptr, ...) #0 + define x86_regcallcc void @test_test(float %0, float %1) #0 { entry: %x = alloca %Foo, align 4 - %2 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %3 = getelementptr inbounds [2 x float], [2 x float]* %2, i64 0, i64 0 - store float %0, float* %3, align 4 - %4 = getelementptr inbounds [2 x float], [2 x float]* %2, i64 0, i64 1 - store float %1, float* %4, align 4 + %2 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %3 = getelementptr inbounds [2 x float], ptr %2, i64 0, i64 0 + store float %0, ptr %3, align 4 + %4 = getelementptr inbounds [2 x float], ptr %2, i64 0, i64 1 + store float %1, ptr %4, align 4 ret void } @@ -40,16 +42,16 @@ entry: define i32 @main() #0 { entry: %literal = alloca %Foo, align 4 - %0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 - %1 = getelementptr inbounds [2 x float], [2 x float]* %0, i64 0, i64 0 - store float 0.000000e+00, float* %1, align 4 - %2 = getelementptr inbounds [2 x float], [2 x float]* %0, i64 0, i64 1 - store float 0.000000e+00, float* %2, align 4 - %3 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 - %4 = getelementptr inbounds [2 x float], [2 x float]* %3, i64 0, i64 0 - %loadexpanded = load float, float* %4, align 4 - %5 = getelementptr inbounds [2 x float], [2 x float]* %3, i64 0, i64 1 - %loadexpanded1 = load float, float* %5, align 4 + %0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 + %1 = getelementptr inbounds [2 x float], ptr %0, i64 0, i64 0 + store float 0.000000e+00, ptr %1, align 4 + %2 = getelementptr inbounds [2 x float], ptr %0, i64 0, i64 1 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 + %4 = getelementptr inbounds [2 x float], ptr %3, i64 0, i64 0 + %loadexpanded = load float, ptr %4, align 4 + %5 = getelementptr inbounds [2 x float], ptr %3, i64 0, i64 1 + %loadexpanded1 = load float, ptr %5, align 4 call x86_regcallcc void @test_test(float %loadexpanded, float %loadexpanded1) ret i32 0 } \ No newline at end of file diff --git a/test/test_suite/abi/riscv64-lp64-abi.c3t b/test/test_suite/abi/riscv64-lp64-abi.c3t index 3bb7951bd..70eab8d76 100644 --- a/test/test_suite/abi/riscv64-lp64-abi.c3t +++ b/test/test_suite/abi/riscv64-lp64-abi.c3t @@ -19,30 +19,29 @@ fn Large f_scalar_stack_2(double a, int128 b, float128 c, V32i8 d, /* #expect: test.ll -define signext i32 @test_f_scalar_stack_1(i32 signext %0, i128 %1, float %2, fp128 %3, <32 x i8>* align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { +define signext i32 @test_f_scalar_stack_1(i32 signext %0, i128 %1, float %2, fp128 %3, ptr align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { entry: %uisiext = zext i8 %6 to i32 %uisiext1 = zext i8 %7 to i32 %add = add i32 %uisiext, %uisiext1 ret i32 %add } -define void @test_f_scalar_stack_2(%Large* noalias sret(%Large) align 8 %0, double %1, i128 %2, fp128 %3, <32 x i8>* align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { + +define void @test_f_scalar_stack_2(ptr noalias sret(%Large) align 8 %0, double %1, i128 %2, fp128 %3, ptr align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { entry: %literal = alloca %Large, align 8 - %8 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 0 + %8 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 0 %fpsi = fptosi double %1 to i64 - store i64 %fpsi, i64* %8, align 8 - %9 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 1 + store i64 %fpsi, ptr %8, align 8 + %9 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 1 %uisiext = zext i8 %5 to i64 - store i64 %uisiext, i64* %9, align 8 - %10 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 2 + store i64 %uisiext, ptr %9, align 8 + %10 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 2 %sisiext = sext i8 %6 to i64 - store i64 %sisiext, i64* %10, align 8 - %11 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 3 + store i64 %sisiext, ptr %10, align 8 + %11 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 3 %uisiext1 = zext i8 %7 to i64 - store i64 %uisiext1, i64* %11, align 8 - %12 = bitcast %Large* %0 to i8* - %13 = bitcast %Large* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %12, i8* align 8 %13, i32 32, i1 false) + store i64 %uisiext1, ptr %11, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal, i32 32, i1 false) ret void } diff --git a/test/test_suite/abi/small_struct_x64.c3t b/test/test_suite/abi/small_struct_x64.c3t index 3c953d485..bf7f52e1a 100644 --- a/test/test_suite/abi/small_struct_x64.c3t +++ b/test/test_suite/abi/small_struct_x64.c3t @@ -20,6 +20,12 @@ fn Foo getFoo(Foo f) /* #expect: test.ll +%.introspect = type { i8, i64, i64, i64, [0 x i64] } +%Foo = type { i8, i8, i8 } + +@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 3, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 + +; Function Attrs: nounwind define i32 @test_testing() #0 { entry: %y = alloca %Foo, align 1 @@ -27,30 +33,24 @@ entry: %tempcoerce = alloca i24, align 4 %result = alloca %Foo, align 1 %tempcoerce1 = alloca i24, align 4 - %0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 - store i8 4, i8* %0, align 1 - %1 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 - store i8 5, i8* %1, align 1 - %2 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 2 - store i8 6, i8* %2, align 1 - %3 = bitcast i24* %tempcoerce to i8* - %4 = bitcast %Foo* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 1 %4, i32 3, i1 false) - %5 = load i24, i24* %tempcoerce, align 4 - %6 = call i24 @test_getFoo(i24 %5) - store i24 %6, i24* %tempcoerce1, align 4 - %7 = bitcast %Foo* %result to i8* - %8 = bitcast i24* %tempcoerce1 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %7, i8* align 4 %8, i32 3, i1 false) - %9 = bitcast %Foo* %y to i8* - %10 = bitcast %Foo* %result to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %9, i8* align 1 %10, i32 3, i1 false) - %11 = getelementptr inbounds %Foo, %Foo* %y, i32 0, i32 0 - %12 = load i8, i8* %11, align 1 - %uisiext = zext i8 %12 to i32 - %13 = getelementptr inbounds %Foo, %Foo* %y, i32 0, i32 2 - %14 = load i8, i8* %13, align 1 - %uisiext2 = zext i8 %14 to i32 + %0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 + store i8 4, ptr %0, align 1 + %1 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 + store i8 5, ptr %1, align 1 + %2 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 2 + store i8 6, ptr %2, align 1 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %tempcoerce, ptr align 1 %literal, i32 3, i1 false) + %3 = load i24, ptr %tempcoerce, align 4 + %4 = call i24 @test_getFoo(i24 %3) + store i24 %4, ptr %tempcoerce1, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 1 %result, ptr align 4 %tempcoerce1, i32 3, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 1 %y, ptr align 1 %result, i32 3, i1 false) + %5 = getelementptr inbounds %Foo, ptr %y, i32 0, i32 0 + %6 = load i8, ptr %5, align 1 + %uisiext = zext i8 %6 to i32 + %7 = getelementptr inbounds %Foo, ptr %y, i32 0, i32 2 + %8 = load i8, ptr %7, align 1 + %uisiext2 = zext i8 %8 to i32 %add = add i32 %uisiext, %uisiext2 ret i32 %add } @@ -62,19 +62,18 @@ entry: %tempcoerce = alloca i24, align 4 %literal = alloca %Foo, align 1 %tempcoerce1 = alloca i24, align 4 - store i24 %0, i24* %tempcoerce, align 4 - %1 = bitcast %Foo* %f to i8* - %2 = bitcast i24* %tempcoerce to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %1, i8* align 4 %2, i32 3, i1 false) - %3 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 - store i8 1, i8* %3, align 1 - %4 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 - store i8 2, i8* %4, align 1 - %5 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 2 - store i8 3, i8* %5, align 1 - %6 = bitcast i24* %tempcoerce1 to i8* - %7 = bitcast %Foo* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %6, i8* align 1 %7, i32 3, i1 false) - %8 = load i24, i24* %tempcoerce1, align 4 - ret i24 %8 + store i24 %0, ptr %tempcoerce, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 1 %f, ptr align 4 %tempcoerce, i32 3, i1 false) + %1 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 + store i8 1, ptr %1, align 1 + %2 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 + store i8 2, ptr %2, align 1 + %3 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 2 + store i8 3, ptr %3, align 1 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %tempcoerce1, ptr align 1 %literal, i32 3, i1 false) + %4 = load i24, ptr %tempcoerce1, align 4 + ret i24 %4 } + +declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg) #1 + diff --git a/test/test_suite/abi/sysv_abi_avx.c3t b/test/test_suite/abi/sysv_abi_avx.c3t index 8f36042b0..44d71bb5c 100644 --- a/test/test_suite/abi/sysv_abi_avx.c3t +++ b/test/test_suite/abi/sysv_abi_avx.c3t @@ -31,8 +31,8 @@ fn void use_vectors() /* #expect: foo.ll -declare void @take_stringref(i8*, i64) #0 -call void @take_stringref(i8* %lo, i64 %hi) +declare void @take_stringref(ptr, i64) #0 +call void @take_stringref(ptr %lo, i64 %hi) define void @foo_use_vectors() #0 { entry: diff --git a/test/test_suite/abi/sysv_abi_noavx.c3t b/test/test_suite/abi/sysv_abi_noavx.c3t index 75c83e061..e3ee93e90 100644 --- a/test/test_suite/abi/sysv_abi_noavx.c3t +++ b/test/test_suite/abi/sysv_abi_noavx.c3t @@ -31,12 +31,11 @@ fn void use_vectors() /* #expect: foo.ll -declare void @take_stringref(i8*, i64) #0 - call void @take_stringref(i8* %lo, i64 %hi) +declare void @take_stringref(ptr, i64) #0 + call void @take_stringref(ptr %lo, i64 %hi) define void @foo_use_vectors() #0 { -entry: %0 = call <8 x float> @get_m256() - call void @take_m256(<8 x float>* byval(<8 x float>) align 32 %v1) + call void @take_m256(ptr byval(<8 x float>) align 32 %v1) %1 = call <16 x float> @get_m512() - call void @take_m512(<16 x float>* byval(<16 x float>) align 64 %v2) + call void @take_m512(ptr byval(<16 x float>) align 64 %v2) \ No newline at end of file diff --git a/test/test_suite/abi/sysv_direct_coerce.c3t b/test/test_suite/abi/sysv_direct_coerce.c3t index a81bf313a..05dbffc86 100644 --- a/test/test_suite/abi/sysv_direct_coerce.c3t +++ b/test/test_suite/abi/sysv_direct_coerce.c3t @@ -21,27 +21,23 @@ entry: %r = alloca %Rectangle, align 4 %literal = alloca %Rectangle, align 4 %coerce = alloca %Rectangle, align 8 - %pair = bitcast %Rectangle* %r to { <2 x float>, <2 x float> }* - %2 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %pair, i32 0, i32 0 - store <2 x float> %0, <2 x float>* %2, align 4 - %3 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %pair, i32 0, i32 1 - store <2 x float> %1, <2 x float>* %3, align 4 - %4 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 0 - store float 1.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 1 - store float 2.000000e+00, float* %5, align 4 - %6 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 2 - store float 3.000000e+00, float* %6, align 4 - %7 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 3 - store float 4.000000e+00, float* %7, align 4 - %8 = bitcast %Rectangle* %coerce to { <2 x float>, <2 x float> }* - %9 = bitcast { <2 x float>, <2 x float> }* %8 to i8* - %10 = bitcast %Rectangle* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %9, i8* align 4 %10, i32 16, i1 false) - %11 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %8, i32 0, i32 0 - %lo = load <2 x float>, <2 x float>* %11, align 8 - %12 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %8, i32 0, i32 1 - %hi = load <2 x float>, <2 x float>* %12, align 8 + %2 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %r, i32 0, i32 0 + store <2 x float> %0, ptr %2, align 4 + %3 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %r, i32 0, i32 1 + store <2 x float> %1, ptr %3, align 4 + %4 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 0 + store float 1.000000e+00, ptr %4, align 4 + %5 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 1 + store float 2.000000e+00, ptr %5, align 4 + %6 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 2 + store float 3.000000e+00, ptr %6, align 4 + %7 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 3 + store float 4.000000e+00, ptr %7, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %coerce, ptr align 4 %literal, i32 16, i1 false) + %8 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %coerce, i32 0, i32 0 + %lo = load <2 x float>, ptr %8, align 8 + %9 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %coerce, i32 0, i32 1 + %hi = load <2 x float>, ptr %9, align 8 call void @foo_test(<2 x float> %lo, <2 x float> %hi) ret void } \ No newline at end of file diff --git a/test/test_suite/abi/test_sret.c3t b/test/test_suite/abi/test_sret.c3t index ec8b22292..39eb03e04 100644 --- a/test/test_suite/abi/test_sret.c3t +++ b/test/test_suite/abi/test_sret.c3t @@ -16,16 +16,17 @@ fn void bar() { Abc dummy2 = foo2(); } -// Cleanup for this result, since it's creating an unnecessary sret. +/* #expect: test_sret.ll -// #expect: test_sret.ll +declare void @foo1(ptr noalias sret(%Abc) align 8) #0 -declare void @foo1(%Abc* noalias sret(%Abc) align 8) - -declare void @foo2(%Abc* noalias sret(%Abc) align 8) +declare void @foo2(ptr noalias sret(%Abc) align 8) #0 +define void @test_sret_bar() #0 { +entry: %dummy1 = alloca %Abc, align 8 %dummy2 = alloca %Abc, align 8 - call void @foo1(%Abc* sret(%Abc) align 8 %dummy1) - call void @foo2(%Abc* sret(%Abc) align 8 %dummy2) + call void @foo1(ptr sret(%Abc) align 8 %dummy1) + call void @foo2(ptr sret(%Abc) align 8 %dummy2) ret void +} diff --git a/test/test_suite/abi/union_x64.c3t b/test/test_suite/abi/union_x64.c3t index 9490947df..daf3b8dd5 100644 --- a/test/test_suite/abi/union_x64.c3t +++ b/test/test_suite/abi/union_x64.c3t @@ -23,16 +23,15 @@ declare void @hello2(i64, i64) #0 define void @unionx64_hello(i64 %0, i64 %1) #0 { entry: %f = alloca %Foo, align 8 - %pair = bitcast %Foo* %f to { i64, i64 }* - %2 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - %4 = bitcast %Foo* %f to { i64, i64 }* - %5 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %4, i32 0, i32 0 - %lo = load i64, i64* %5, align 8 - %6 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %4, i32 0, i32 1 - %hi = load i64, i64* %6, align 8 + %2 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + %4 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 0 + %lo = load i64, ptr %4, align 8 + %5 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 1 + %hi = load i64, ptr %5, align 8 call void @hello2(i64 %lo, i64 %hi) ret void } + diff --git a/test/test_suite/abi/vec2_aarch64.c3t b/test/test_suite/abi/vec2_aarch64.c3t index 8f29e8784..df230db68 100644 --- a/test/test_suite/abi/vec2_aarch64.c3t +++ b/test/test_suite/abi/vec2_aarch64.c3t @@ -12,28 +12,29 @@ extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } -// #expect: abi.ll +/* #expect: abi.ll + %Vector2 = type { float, float } define %Vector2 @vector2_zero() #0 { entry: %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %0, align 4 - %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %1, align 4 - %2 = load %Vector2, %Vector2* %literal, align 4 + %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %0, align 4 + %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %1, align 4 + %2 = load %Vector2, ptr %literal, align 4 ret %Vector2 %2 } define %Vector2 @vector2_one() #0 { entry: %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %0, align 4 - %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %1, align 4 - %2 = load %Vector2, %Vector2* %literal, align 4 + %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %0, align 4 + %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %1, align 4 + %2 = load %Vector2, ptr %literal, align 4 ret %Vector2 %2 } @@ -42,30 +43,27 @@ entry: %v1 = alloca %Vector2, align 4 %v2 = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v1 to [2 x float]* - store [2 x float] %0, [2 x float]* %2, align 4 - %3 = bitcast %Vector2* %v2 to [2 x float]* - store [2 x float] %1, [2 x float]* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %5, align 4 - %6 = load %Vector2, %Vector2* %literal, align 4 - ret %Vector2 %6 + store [2 x float] %0, ptr %v1, align 4 + store [2 x float] %1, ptr %v2, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load %Vector2, ptr %literal, align 4 + ret %Vector2 %4 } define %Vector2 @vector2_add_value([2 x float] %0, float %1) #0 { entry: %v = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v to [2 x float]* - store [2 x float] %0, [2 x float]* %2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = load %Vector2, %Vector2* %literal, align 4 - ret %Vector2 %5 + store [2 x float] %0, ptr %v, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load %Vector2, ptr %literal, align 4 + ret %Vector2 %4 } define %Vector2 @vector2_subtract([2 x float] %0, [2 x float] %1) #0 { @@ -73,28 +71,25 @@ entry: %v1 = alloca %Vector2, align 4 %v2 = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v1 to [2 x float]* - store [2 x float] %0, [2 x float]* %2, align 4 - %3 = bitcast %Vector2* %v2 to [2 x float]* - store [2 x float] %1, [2 x float]* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %5, align 4 - %6 = load %Vector2, %Vector2* %literal, align 4 - ret %Vector2 %6 + store [2 x float] %0, ptr %v1, align 4 + store [2 x float] %1, ptr %v2, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load %Vector2, ptr %literal, align 4 + ret %Vector2 %4 } define %Vector2 @vector2_subtract_value([2 x float] %0, float %1) #0 { entry: %v = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v to [2 x float]* - store [2 x float] %0, [2 x float]* %2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = load %Vector2, %Vector2* %literal, align 4 - ret %Vector2 %5 + store [2 x float] %0, ptr %v, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load %Vector2, ptr %literal, align 4 + ret %Vector2 %4 } diff --git a/test/test_suite/abi/vec2_wasm.c3t b/test/test_suite/abi/vec2_wasm.c3t index a976b652c..783bd350b 100644 --- a/test/test_suite/abi/vec2_wasm.c3t +++ b/test/test_suite/abi/vec2_wasm.c3t @@ -12,88 +12,76 @@ extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } -// #expect: abi.ll +/* #expect: abi.ll + target triple = "wasm32-unknown-unknown" %Vector2 = type { float, float } -define void @vector2_zero(%Vector2* noalias sret(%Vector2) align 4 %0) #0 { +define void @vector2_zero(ptr noalias sret(%Vector2) align 4 %0) #0 { entry: %literal = alloca %Vector2, align 4 - %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %1, align 4 - %2 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %2, align 4 - %3 = bitcast %Vector2* %0 to i8* - %4 = bitcast %Vector2* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %1, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %2, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) ret void } -define void @vector2_one(%Vector2* noalias sret(%Vector2) align 4 %0) #0 { +define void @vector2_one(ptr noalias sret(%Vector2) align 4 %0) #0 { entry: %literal = alloca %Vector2, align 4 - %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %1, align 4 - %2 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %2, align 4 - %3 = bitcast %Vector2* %0 to i8* - %4 = bitcast %Vector2* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %1, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %2, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) ret void } -define void @vector2_add(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, %Vector2* byval(%Vector2) align 4 %2) #0 { +define void @vector2_add(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, ptr byval(%Vector2) align 4 %2) #0 { entry: %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = bitcast %Vector2* %0 to i8* - %6 = bitcast %Vector2* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %3, align 4 + %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %4, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) + ret void +} + +define void @vector2_add_value(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, float %2) #0 { +entry: + %literal = alloca %Vector2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %3, align 4 + %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %4, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) + ret void +} + +define void @vector2_subtract(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, ptr byval(%Vector2) align 4 %2) #0 { +entry: + %literal = alloca %Vector2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %3, align 4 + %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %4, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) ret void } ; Function Attrs: nounwind -define void @vector2_add_value(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, float %2) #0 { +define void @vector2_subtract_value(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, float %2) #0 { entry: %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = bitcast %Vector2* %0 to i8* - %6 = bitcast %Vector2* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %3, align 4 + %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %4, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) ret void } -; Function Attrs: nounwind -define void @vector2_subtract(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, %Vector2* byval(%Vector2) align 4 %2) #0 { -entry: - %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = bitcast %Vector2* %0 to i8* - %6 = bitcast %Vector2* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) - ret void -} - -; Function Attrs: nounwind -define void @vector2_subtract_value(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, float %2) #0 { -entry: - %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = bitcast %Vector2* %0 to i8* - %6 = bitcast %Vector2* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) - ret void -} diff --git a/test/test_suite/abi/vec2_x64.c3t b/test/test_suite/abi/vec2_x64.c3t index d3a81963b..00c2e1129 100644 --- a/test/test_suite/abi/vec2_x64.c3t +++ b/test/test_suite/abi/vec2_x64.c3t @@ -19,25 +19,23 @@ extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 define <2 x float> @vector2_zero() #0 { entry: %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %0, align 4 - %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %1, align 4 - %2 = bitcast %Vector2* %literal to <2 x float>* - %3 = load <2 x float>, <2 x float>* %2, align 4 - ret <2 x float> %3 + %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %0, align 4 + %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %1, align 4 + %2 = load <2 x float>, ptr %literal, align 4 + ret <2 x float> %2 } define <2 x float> @vector2_one() #0 { entry: %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %0, align 4 - %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %1, align 4 - %2 = bitcast %Vector2* %literal to <2 x float>* - %3 = load <2 x float>, <2 x float>* %2, align 4 - ret <2 x float> %3 + %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %0, align 4 + %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %1, align 4 + %2 = load <2 x float>, ptr %literal, align 4 + ret <2 x float> %2 } define <2 x float> @vector2_add(<2 x float> %0, <2 x float> %1) #0 { @@ -45,66 +43,53 @@ entry: %v1 = alloca %Vector2, align 4 %v2 = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v1 to <2 x float>* - store <2 x float> %0, <2 x float>* %2, align 4 - %3 = bitcast %Vector2* %v2 to <2 x float>* - store <2 x float> %1, <2 x float>* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %5, align 4 - %6 = bitcast %Vector2* %literal to <2 x float>* - %7 = load <2 x float>, <2 x float>* %6, align 4 - ret <2 x float> %7 + store <2 x float> %0, ptr %v1, align 4 + store <2 x float> %1, ptr %v2, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load <2 x float>, ptr %literal, align 4 + ret <2 x float> %4 } -; Function Attrs: nounwind define <2 x float> @vector2_add_value(<2 x float> %0, float %1) #0 { entry: %v = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v to <2 x float>* - store <2 x float> %0, <2 x float>* %2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = bitcast %Vector2* %literal to <2 x float>* - %6 = load <2 x float>, <2 x float>* %5, align 4 - ret <2 x float> %6 + store <2 x float> %0, ptr %v, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load <2 x float>, ptr %literal, align 4 + ret <2 x float> %4 } -; Function Attrs: nounwind define <2 x float> @vector2_subtract(<2 x float> %0, <2 x float> %1) #0 { entry: %v1 = alloca %Vector2, align 4 %v2 = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v1 to <2 x float>* - store <2 x float> %0, <2 x float>* %2, align 4 - %3 = bitcast %Vector2* %v2 to <2 x float>* - store <2 x float> %1, <2 x float>* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %5, align 4 - %6 = bitcast %Vector2* %literal to <2 x float>* - %7 = load <2 x float>, <2 x float>* %6, align 4 - ret <2 x float> %7 + store <2 x float> %0, ptr %v1, align 4 + store <2 x float> %1, ptr %v2, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load <2 x float>, ptr %literal, align 4 + ret <2 x float> %4 } -; Function Attrs: nounwind define <2 x float> @vector2_subtract_value(<2 x float> %0, float %1) #0 { entry: %v = alloca %Vector2, align 4 %literal = alloca %Vector2, align 4 - %2 = bitcast %Vector2* %v to <2 x float>* - store <2 x float> %0, <2 x float>* %2, align 4 - %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %4, align 4 - %5 = bitcast %Vector2* %literal to <2 x float>* - %6 = load <2 x float>, <2 x float>* %5, align 4 - ret <2 x float> %6 + store <2 x float> %0, ptr %v, align 4 + %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %3, align 4 + %4 = load <2 x float>, ptr %literal, align 4 + ret <2 x float> %4 } diff --git a/test/test_suite/abi/x64alignarray.c3t b/test/test_suite/abi/x64alignarray.c3t index 55b2cefb4..8c4ee8a6b 100644 --- a/test/test_suite/abi/x64alignarray.c3t +++ b/test/test_suite/abi/x64alignarray.c3t @@ -14,15 +14,14 @@ fn void test1_g() define void @test_test1_g() #0 { entry: %x = alloca [4 x float], align 16 - %0 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 0 - store float 0.000000e+00, float* %0, align 4 - %1 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 1 - store float 0.000000e+00, float* %1, align 4 - %2 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 2 - store float 0.000000e+00, float* %2, align 4 - %3 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 3 - store float 0.000000e+00, float* %3, align 4 - %ptrptr = bitcast [4 x float]* %x to i8* - call void @test1_f(i8* %ptrptr) + %0 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 0 + store float 0.000000e+00, ptr %0, align 4 + %1 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 1 + store float 0.000000e+00, ptr %1, align 4 + %2 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 2 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 3 + store float 0.000000e+00, ptr %3, align 4 + call void @test1_f(ptr %x) ret void -} \ No newline at end of file +} diff --git a/test/test_suite/arrays/array_casts.c3t b/test/test_suite/arrays/array_casts.c3t index 7c2419f00..e2b7065c3 100644 --- a/test/test_suite/arrays/array_casts.c3t +++ b/test/test_suite/arrays/array_casts.c3t @@ -9,26 +9,24 @@ fn void test() int[] z = &x; } -// #expect: array_casts.ll +/* #expect: array_casts.ll -%"int[]" = type { i32*, i64 } +%"int[]" = type { ptr, i64 } define void @array_casts_test() #0 { entry: %x = alloca [3 x i32], align 4 - %y = alloca i32*, align 8 + %y = alloca ptr, align 8 %z = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 - store i32 0, i32* %2, align 4 - %ptrptr = bitcast [3 x i32]* %x to i32* - store i32* %ptrptr, i32** %y, align 8 - %3 = bitcast [3 x i32]* %x to i32* - %4 = insertvalue %"int[]" undef, i32* %3, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - store %"int[]" %5, %"int[]"* %z, align 8 + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 + store i32 0, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 + store i32 0, ptr %2, align 4 + store ptr %x, ptr %y, align 8 + %3 = insertvalue %"int[]" undef, ptr %x, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, ptr %z, align 8 ret void } \ No newline at end of file diff --git a/test/test_suite/arrays/array_literal.c3t b/test/test_suite/arrays/array_literal.c3t index 10a74df30..d29dd766e 100644 --- a/test/test_suite/arrays/array_literal.c3t +++ b/test/test_suite/arrays/array_literal.c3t @@ -19,10 +19,9 @@ fn double test(uint x) define double @array_literal_test(i32 %0) #0 { entry: %student_t = alloca [30 x double], align 16 - %1 = bitcast [30 x double]* %student_t to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %1, i8* align 16 bitcast ([30 x double]* @.__const to i8*), i32 240, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %student_t, ptr align 16 @.__const, i32 240, i1 false) %zext = zext i32 %0 to i64 - %2 = getelementptr inbounds [30 x double], [30 x double]* %student_t, i64 0, i64 %zext - %3 = load double, double* %2, align 8 - ret double %3 + %1 = getelementptr inbounds [30 x double], ptr %student_t, i64 0, i64 %zext + %2 = load double, ptr %1, align 8 + ret double %2 } diff --git a/test/test_suite/arrays/complex_array_const.c3t b/test/test_suite/arrays/complex_array_const.c3t index 85b28771f..af690fbd3 100644 --- a/test/test_suite/arrays/complex_array_const.c3t +++ b/test/test_suite/arrays/complex_array_const.c3t @@ -13,9 +13,10 @@ private Connection[3] link {2, "link2", 20}, {3, "link3", 30} }; -// #expect: test.ll +/* #expect: test.ll +@"ct$test_Connection" = linkonce constant %.introspect { i8 10, i64 24, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [6 x i8] c"link1\00", align 1 @.str.1 = private unnamed_addr constant [6 x i8] c"link2\00", align 1 @.str.2 = private unnamed_addr constant [6 x i8] c"link3\00", align 1 -@test_link = protected unnamed_addr global [3 x %Connection] [%Connection { i64 1, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 10 }, %Connection { i64 2, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 20 }, %Connection { i64 3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i64 30 }], align 16 +@test_link = protected unnamed_addr global [3 x %Connection] [%Connection { i64 1, ptr @.str, i64 10 }, %Connection { i64 2, ptr @.str.1, i64 20 }, %Connection { i64 3, ptr @.str.2, i64 30 }], align 16 diff --git a/test/test_suite/arrays/global_init.c3t b/test/test_suite/arrays/global_init.c3t index 23b6868f6..88698f917 100644 --- a/test/test_suite/arrays/global_init.c3t +++ b/test/test_suite/arrays/global_init.c3t @@ -21,51 +21,42 @@ fn void main() { /* #expect: test.ll @.taddr = private global i32 3, align 4 -@test_foo = local_unnamed_addr global i32* @.taddr, align 8 +@test_foo = local_unnamed_addr global ptr @.taddr, align 8 @test_a = global i32 0, align 4 @test_c = local_unnamed_addr global i32 0, align 4 @test_d = local_unnamed_addr global i32 0, align 4 @test_abc = local_unnamed_addr global [3 x i32] zeroinitializer, align 4 -@test_b = local_unnamed_addr global i32* getelementptr (i32, i32* @test_a, i64 7), align 8 -@test_bf = local_unnamed_addr global i32* getelementptr ([3 x i32], [3 x i32]* @test_abc, i64 1, i64 1), align 8 -@test_bf2 = local_unnamed_addr global i32* getelementptr inbounds ([3 x i32], [3 x i32]* @test_abc, i64 0, i64 2), align 8 -@test_bf3 = local_unnamed_addr global i32* getelementptr ([3 x i32], [3 x i32]* @test_abc, i64 1, i64 1), align 8 +@test_b = local_unnamed_addr global ptr getelementptr (i32, ptr @test_a, i64 7), align 8 +@test_bf = local_unnamed_addr global ptr getelementptr ([3 x i32], ptr @test_abc, i64 1, i64 1), align 8 +@test_bf2 = local_unnamed_addr global ptr getelementptr inbounds ([3 x i32], ptr @test_abc, i64 0, i64 2), align 8 +@test_bf3 = local_unnamed_addr global ptr getelementptr ([3 x i32], ptr @test_abc, i64 1, i64 1), align 8 @.taddr.9 = private global i32 42, align 4 -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @.taddr.10 = private global i8 99, align 1 -@"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@.str = private unnamed_addr constant [4 x i8] c"for\00", align 1 -@.taddr.11 = private global [3 x i8]* bitcast ([4 x i8]* @.str to [3 x i8]*), align 8 -@"ct$a3$char" = linkonce constant %.introspect { i8 15, i64 3, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 3, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a3$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a3$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"main$x" = internal unnamed_addr global [3 x %variant] [%variant { i8* bitcast (i32* @.taddr.9 to i8*), i64 ptrtoint (%.introspect* @"ct$int" to i64) }, %variant { i8* @.taddr.10, i64 ptrtoint (%.introspect* @"ct$char" to i64) }, %variant { i8* bitcast ([3 x i8]** @.taddr.11 to i8*), i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64) }], align 16 -@.str.12 = private unnamed_addr constant [4 x i8] c"for\00", align 1 +@.taddr.11 = private global ptr @.str, align 8 +@"main$x" = internal unnamed_addr global [3 x %variant] [%variant { ptr @.taddr.9, i64 ptrtoint (ptr @"ct$int" to i64) }, %variant { ptr @.taddr.10, i64 ptrtoint (ptr @"ct$char" to i64) }, %variant { ptr @.taddr.11, i64 ptrtoint (ptr @"ct$p$a3$char" to i64) }], align 16 -; Function Attrs: nounwind define void @test_main() #0 { entry: - %bf34 = alloca i32*, align 8 + %bf34 = alloca ptr, align 8 %y = alloca [3 x %variant], align 16 %taddr = alloca i32, align 4 %taddr1 = alloca i8, align 1 - %taddr2 = alloca [3 x i8]*, align 8 - store i32* getelementptr - %0 = getelementptr inbounds [3 x %variant], [3 x %variant]* %y, i64 0, i64 0 - store i32 42, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %3, %variant* %0, align 16 - %4 = getelementptr inbounds [3 x %variant], [3 x %variant]* %y, i64 0, i64 1 - store i8 99, i8* %taddr1, align 1 - %5 = insertvalue %variant undef, i8* %taddr1, 0 - %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - store %variant %6, %variant* %4, align 16 - %7 = getelementptr inbounds [3 x %variant], [3 x %variant]* %y, i64 0, i64 2 - store [3 x i8]* bitcast ([4 x i8]* @.str.12 to [3 x i8]*), [3 x i8]** %taddr2, align 8 - %8 = bitcast [3 x i8]** %taddr2 to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - store %variant %10, %variant* %7, align 16 + %taddr2 = alloca ptr, align 8 + store ptr getelementptr ([3 x i32], ptr @test_abc, i64 2, i64 1), ptr %bf34, align 8 + %0 = getelementptr inbounds [3 x %variant], ptr %y, i64 0, i64 0 + store i32 42, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %2, ptr %0, align 16 + %3 = getelementptr inbounds [3 x %variant], ptr %y, i64 0, i64 1 + store i8 99, ptr %taddr1, align 1 + %4 = insertvalue %variant undef, ptr %taddr1, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$char" to i64), 1 + store %variant %5, ptr %3, align 16 + %6 = getelementptr inbounds [3 x %variant], ptr %y, i64 0, i64 2 + store ptr @.str.12, ptr %taddr2, align 8 + %7 = insertvalue %variant undef, ptr %taddr2, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + store %variant %8, ptr %6, align 16 ret void } diff --git a/test/test_suite/arrays/index_from_back.c3t b/test/test_suite/arrays/index_from_back.c3t index 7fabb3d9a..32a1f13c3 100644 --- a/test/test_suite/arrays/index_from_back.c3t +++ b/test/test_suite/arrays/index_from_back.c3t @@ -15,7 +15,7 @@ fn void test(int[10] x, int[<10>] y) /* #expect: test.ll -define void @test_test([10 x i32]* byval([10 x i32]) align 8 %0, <10 x i32>* byval(<10 x i32>) align 64 %1) #0 { +define void @test_test(ptr byval([10 x i32]) align 8 %0, ptr byval(<10 x i32>) align 64 %1) #0 { entry: %a = alloca i32, align 4 %b = alloca i32, align 4 @@ -24,30 +24,30 @@ entry: %j = alloca i32, align 4 %e = alloca i32, align 4 %f = alloca i32, align 4 - %2 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i64 0, i64 4 - %3 = load i32, i32* %2, align 4 - store i32 %3, i32* %a, align 4 - %4 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i64 0, i64 8 - %5 = load i32, i32* %4, align 4 - store i32 %5, i32* %b, align 4 - %6 = load <10 x i32>, <10 x i32>* %1, align 64 + %2 = getelementptr inbounds [10 x i32], ptr %0, i64 0, i64 4 + %3 = load i32, ptr %2, align 4 + store i32 %3, ptr %a, align 4 + %4 = getelementptr inbounds [10 x i32], ptr %0, i64 0, i64 8 + %5 = load i32, ptr %4, align 4 + store i32 %5, ptr %b, align 4 + %6 = load <10 x i32>, ptr %1, align 64 %7 = extractelement <10 x i32> %6, i64 4 - store i32 %7, i32* %c, align 4 - %8 = load <10 x i32>, <10 x i32>* %1, align 64 + store i32 %7, ptr %c, align 4 + %8 = load <10 x i32>, ptr %1, align 64 %9 = extractelement <10 x i32> %8, i64 8 - store i32 %9, i32* %d, align 4 - store i32 3, i32* %j, align 4 - %10 = load <10 x i32>, <10 x i32>* %1, align 64 - %11 = load i32, i32* %j, align 4 + store i32 %9, ptr %d, align 4 + store i32 3, ptr %j, align 4 + %10 = load <10 x i32>, ptr %1, align 64 + %11 = load i32, ptr %j, align 4 %sisiext = sext i32 %11 to i64 %12 = sub nuw i64 10, %sisiext %13 = extractelement <10 x i32> %10, i64 %12 - store i32 %13, i32* %e, align 4 - %14 = load i32, i32* %j, align 4 + store i32 %13, ptr %e, align 4 + %14 = load i32, ptr %j, align 4 %sisiext1 = sext i32 %14 to i64 %15 = sub nuw i64 10, %sisiext1 - %16 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i64 0, i64 %15 - %17 = load i32, i32* %16, align 4 - store i32 %17, i32* %f, align 4 + %16 = getelementptr inbounds [10 x i32], ptr %0, i64 0, i64 %15 + %17 = load i32, ptr %16, align 4 + store i32 %17, ptr %f, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite/arrays/index_into_global.c3t b/test/test_suite/arrays/index_into_global.c3t index c8c0e2be6..8c107bea6 100644 --- a/test/test_suite/arrays/index_into_global.c3t +++ b/test/test_suite/arrays/index_into_global.c3t @@ -25,9 +25,9 @@ fn void test_bar(int idx) define void @foo_test_bar(i32 %0) #0 { entry: %sisiext = sext i32 %0 to i64 - %1 = getelementptr inbounds [6 x %Bar], [6 x %Bar]* @foo_bar, i64 0, i64 %sisiext - %2 = getelementptr inbounds %Bar, %Bar* %1, i32 0, i32 0 - store i32 0, i32* %2, align 4 - store i32 %0, i32* getelementptr inbounds ([6 x %Bar], [6 x %Bar]* @foo_bar, i64 0, i64 0, i32 0), align 4 + %1 = getelementptr inbounds [6 x %Bar], ptr @foo_bar, i64 0, i64 %sisiext + %2 = getelementptr inbounds %Bar, ptr %1, i32 0, i32 0 + store i32 0, ptr %2, align 4 + store i32 %0, ptr @foo_bar, align 4 ret void } diff --git a/test/test_suite/asm/asm_regression.c3t b/test/test_suite/asm/asm_regression.c3t index 099dbdb35..c661ffe0e 100644 --- a/test/test_suite/asm/asm_regression.c3t +++ b/test/test_suite/asm/asm_regression.c3t @@ -27,24 +27,24 @@ fn void main() movq [&z], 33; addl aa, 22; } - io::printfln("aa: %d", aa); - io::printfln("Z: %d", z); - io::printfln("x: %d", x); - io::printfln("G was: %d", g); - foreach(int abc : a) io::printfln("%d", abc); + io::printfn("aa: %d", aa); + io::printfn("Z: %d", z); + io::printfn("x: %d", x); + io::printfn("G was: %d", g); + foreach(int abc : a) io::printfn("%d", abc); } /* #expect: test.ll - %5 = load i32*, i32** %gp, align 8 - %6 = load i32*, i32** %xa, align 8 - %7 = load i64, i64* %asf, align 8 - %8 = load i32, i32* %x, align 4 - %add3 = add i32 23, %8 - %9 = load i32, i32* %aa, align 4 - %10 = call { i32, i32 } asm alignstack "movl $$4, $0\0Amovl $0, ($3)\0Amovl $$1, $0\0Amovl $0, 4($4,$5,4)\0Amovl $6, %eax\0Amovl %eax, $0\0Amovq $$33, $1\0Aaddl $$22, $2\0A", "=&r,=*&m,=r,r,r,r,r,2,~{cc},~{rax},~{flags},~{dirflag},~{fspr}" - %11 = extractvalue { i32, i32 } %10, 0 - store i32 %11, i32* %x, align 4 - %12 = extractvalue { i32, i32 } %10, 1 - store i32 %12, i32* %aa, align 4 + %4 = load ptr, ptr %gp, align 8 + %5 = load ptr, ptr %xa, align 8 + %6 = load i64, ptr %asf, align 8 + %7 = load i32, ptr %x, align 4 + %add3 = add i32 23, %7 + %8 = load i32, ptr %aa, align 4 + %9 = call { i32, i32 } asm alignstack "movl $$4, $0\0Amovl $0, ($3)\0Amovl $$1, $0\0Amovl $0, 4($4,$5,4)\0Amovl $6, %eax\0Amovl %eax, $0\0Amovq $$33, $1\0Aaddl $$22, $2\0A", "=&r,=*&m,=r,r,r,r,r,2,~{cc},~{rax},~{flags},~{dirflag},~{fspr}"(ptr elementtype(i64) %z, ptr %4, ptr %5, i64 %6, i32 %add3, i32 %8) + %10 = extractvalue { i32, i32 } %9, 0 + store i32 %10, ptr %x, align 4 + %11 = extractvalue { i32, i32 } %9, 1 + store i32 %11, ptr %aa, align 4 \ No newline at end of file diff --git a/test/test_suite/assert/assert_variants.c3t b/test/test_suite/assert/assert_variants.c3t index 10e42aae6..f9f8a5a32 100644 --- a/test/test_suite/assert/assert_variants.c3t +++ b/test/test_suite/assert/assert_variants.c3t @@ -25,37 +25,37 @@ fn void test() %y = alloca i32, align 4 %z = alloca i32, align 4 %0 = call i32 @assert_variants_foo() - store i32 %0, i32* %x, align 4 + store i32 %0, ptr %x, align 4 %1 = call i32 @assert_variants_foo() - store i32 %1, i32* %y, align 4 + store i32 %1, ptr %y, align 4 %2 = call i32 @assert_variants_foo() - store i32 %2, i32* %z, align 4 - %3 = load i32, i32* %x, align 4 + store i32 %2, ptr %z, align 4 + %3 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %3, 0 call void @llvm.assume(i1 %gt) - %4 = load i32, i32* %y, align 4 + %4 = load i32, ptr %y, align 4 %gt1 = icmp sgt i32 %4, 0 call void @llvm.assume(i1 %gt1) - %5 = load i32, i32* %z, align 4 + %5 = load i32, ptr %z, align 4 %gt2 = icmp sgt i32 %5, 0 call void @llvm.assume(i1 %gt2) - %6 = load i32, i32* %x, align 4 + %6 = load i32, ptr %x, align 4 %gt3 = icmp sgt i32 %6, 0 call void @llvm.assume(i1 %gt3) - %7 = load i32, i32* %y, align 4 + %7 = load i32, ptr %y, align 4 %gt4 = icmp sgt i32 %7, 0 call void @llvm.assume(i1 %gt4) - %8 = load i32, i32* %z, align 4 + %8 = load i32, ptr %z, align 4 %gt5 = icmp sgt i32 %8, 0 call void @llvm.assume(i1 %gt5) - %9 = load i32, i32* %x, align 4 + %9 = load i32, ptr %x, align 4 %gt6 = icmp sgt i32 %9, 0 call void @llvm.assume(i1 %gt6) - %10 = load i32, i32* %x, align 4 + %10 = load i32, ptr %x, align 4 %lt = icmp slt i32 %10, 1 %not = xor i1 %lt, true call void @llvm.assume(i1 %not) - %11 = load i32, i32* %y, align 4 + %11 = load i32, ptr %y, align 4 %lt7 = icmp slt i32 %11, 1 %not8 = xor i1 %lt7, true call void @llvm.assume(i1 %not8) diff --git a/test/test_suite/assert/unreachable.c3t b/test/test_suite/assert/unreachable.c3t index 774891b82..48eb633e5 100644 --- a/test/test_suite/assert/unreachable.c3t +++ b/test/test_suite/assert/unreachable.c3t @@ -19,8 +19,8 @@ define void @unreachable_test() #0 { entry: %x = alloca i32, align 4 %0 = call i32 @unreachable_foo() - store i32 %0, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %0, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %1, 0 br i1 %gt, label %if.then, label %if.exit @@ -28,13 +28,14 @@ if.then: ; preds = %entry ret void if.exit: ; preds = %entry - %2 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %2(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i32 0, i32 0), i64 30, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0), i64 14, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i64 4, i32 10) + %2 = load ptr, ptr @std_core_builtin_panic, align 8 + call void %2(ptr @.str, i64 30, ptr @.str.1, i64 14, ptr @.str.2, i64 4, i32 10) unreachable after.unreachable: ; No predecessors! - %3 = load i32, i32* %x, align 4 + %3 = load i32, ptr %x, align 4 %add = add i32 %3, 1 - store i32 %add, i32* %x, align 4 + store i32 %add, ptr %x, align 4 ret void -} \ No newline at end of file +} + diff --git a/test/test_suite/assignment/int_assign.c3t b/test/test_suite/assignment/int_assign.c3t index 0160df514..f6663027d 100644 --- a/test/test_suite/assignment/int_assign.c3t +++ b/test/test_suite/assignment/int_assign.c3t @@ -22,48 +22,48 @@ fn int foo() %x = alloca i32, align 4 %y = alloca i32, align 4 - store i32 0, i32* %x, align 4 - store i32 0, i32* %y, align 4 - %0 = load i32, i32* %x, align 4 - %1 = load i32, i32* %y, align 4 + store i32 0, ptr %x, align 4 + store i32 0, ptr %y, align 4 + %0 = load i32, ptr %x, align 4 + %1 = load i32, ptr %y, align 4 %add = add i32 %0, %1 - store i32 %add, i32* %x, align 4 - %2 = load i32, i32* %x, align 4 - %3 = load i32, i32* %y, align 4 + store i32 %add, ptr %x, align 4 + %2 = load i32, ptr %x, align 4 + %3 = load i32, ptr %y, align 4 %sub = sub i32 %2, %3 - store i32 %sub, i32* %x, align 4 - %4 = load i32, i32* %x, align 4 - %5 = load i32, i32* %y, align 4 + store i32 %sub, ptr %x, align 4 + %4 = load i32, ptr %x, align 4 + %5 = load i32, ptr %y, align 4 %smod = srem i32 %4, %5 - store i32 %smod, i32* %x, align 4 - %6 = load i32, i32* %x, align 4 - %7 = load i32, i32* %y, align 4 + store i32 %smod, ptr %x, align 4 + %6 = load i32, ptr %x, align 4 + %7 = load i32, ptr %y, align 4 %sdiv = sdiv i32 %6, %7 - store i32 %sdiv, i32* %x, align 4 - %8 = load i32, i32* %x, align 4 - %9 = load i32, i32* %y, align 4 + store i32 %sdiv, ptr %x, align 4 + %8 = load i32, ptr %x, align 4 + %9 = load i32, ptr %y, align 4 %mul = mul i32 %8, %9 - store i32 %mul, i32* %x, align 4 - %10 = load i32, i32* %x, align 4 - %11 = load i32, i32* %y, align 4 + store i32 %mul, ptr %x, align 4 + %10 = load i32, ptr %x, align 4 + %11 = load i32, ptr %y, align 4 %shl = shl i32 %10, %11 %12 = freeze i32 %shl - store i32 %12, i32* %x, align 4 - %13 = load i32, i32* %x, align 4 - %14 = load i32, i32* %y, align 4 + store i32 %12, ptr %x, align 4 + %13 = load i32, ptr %x, align 4 + %14 = load i32, ptr %y, align 4 %ashr = ashr i32 %13, %14 %15 = freeze i32 %ashr - store i32 %15, i32* %x, align 4 - %16 = load i32, i32* %x, align 4 - %17 = load i32, i32* %y, align 4 + store i32 %15, ptr %x, align 4 + %16 = load i32, ptr %x, align 4 + %17 = load i32, ptr %y, align 4 %xor = xor i32 %16, %17 - store i32 %xor, i32* %x, align 4 - %18 = load i32, i32* %x, align 4 - %19 = load i32, i32* %y, align 4 + store i32 %xor, ptr %x, align 4 + %18 = load i32, ptr %x, align 4 + %19 = load i32, ptr %y, align 4 %or = or i32 %18, %19 - store i32 %or, i32* %x, align 4 - %20 = load i32, i32* %x, align 4 - %21 = load i32, i32* %y, align 4 + store i32 %or, ptr %x, align 4 + %20 = load i32, ptr %x, align 4 + %21 = load i32, ptr %y, align 4 %and = and i32 %20, %21 - store i32 %and, i32* %x, align 4 - %22 = load i32, i32* %x, align 4 + store i32 %and, ptr %x, align 4 + %22 = load i32, ptr %x, align 4 diff --git a/test/test_suite/attributes/recursive_attributes.c3 b/test/test_suite/attributes/recursive_attributes.c3 index 82ef26716..f3e6a9a0b 100644 --- a/test/test_suite/attributes/recursive_attributes.c3 +++ b/test/test_suite/attributes/recursive_attributes.c3 @@ -1,10 +1,7 @@ module test; define @Align(y) = @Align16(y / 2); -// This one is directly recursive define @Align16(x) = @align(4), @Align(8 * x); // #error: Recursive declaration of attribute -// This one uses a recursive attribute -define @AlignIndirect(x) = @Align16(x); // #error: Recursive declaration of attribute define @Test = @noinline; struct Foo { @@ -18,8 +15,3 @@ fn void testme() @Test { int x; } - -struct Bar -{ - int abc @AlignIndirect(8); -} \ No newline at end of file diff --git a/test/test_suite/attributes/user_defined_attributes.c3t b/test/test_suite/attributes/user_defined_attributes.c3t index b55335e62..bb957cc49 100644 --- a/test/test_suite/attributes/user_defined_attributes.c3t +++ b/test/test_suite/attributes/user_defined_attributes.c3t @@ -34,7 +34,7 @@ fn void main() @TestZero define void @test_testme() #0 { entry: %x = alloca i32, align 4 - store i32 0, i32* %x, align 4 + store i32 0, ptr %x, align 4 ret void } diff --git a/test/test_suite/bitstruct/array_with_boolean.c3t b/test/test_suite/bitstruct/array_with_boolean.c3t index 8437695c6..9f5c4224c 100644 --- a/test/test_suite/bitstruct/array_with_boolean.c3t +++ b/test/test_suite/bitstruct/array_with_boolean.c3t @@ -27,45 +27,45 @@ define void @foo_main() #0 { entry: %xx = alloca [3 x i8], align 1 %xy = alloca [3 x i8], align 1 - store [3 x i8] c"\1A\1E\08", [3 x i8]* %xx, align 1 - store [3 x i8] c"\1A\1E\10", [3 x i8]* %xy, align 1 - %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %1 = load i8, i8* %0, align 1 + store [3 x i8] c"\1A\1E\08", ptr %xx, align 1 + store [3 x i8] c"\1A\1E\10", ptr %xy, align 1 + %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %1 = load i8, ptr %0, align 1 %zext = zext i8 %1 to i32 %shl = shl i32 %zext, 29 %ashr = ashr i32 %shl, 29 - %2 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %3 = load i8, i8* %2, align 1 + %2 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %3 = load i8, ptr %2, align 1 %zext1 = zext i8 %3 to i32 %lshrl = lshr i32 %zext1, 3 - %4 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %5 = load i8, i8* %4, align 1 + %4 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %5 = load i8, ptr %4, align 1 %zext2 = zext i8 %5 to i32 %shl3 = shl i32 %zext2, 5 %6 = or i32 %shl3, %lshrl %shl4 = shl i32 %6, 26 %ashr5 = ashr i32 %shl4, 26 - %7 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %8 = load i8, i8* %7, align 1 + %7 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %8 = load i8, ptr %7, align 1 %zext6 = zext i8 %8 to i32 %lshrl7 = lshr i32 %zext6, 1 - %9 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %10 = load i8, i8* %9, align 1 + %9 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %10 = load i8, ptr %9, align 1 %zext8 = zext i8 %10 to i32 %shl9 = shl i32 %zext8, 7 %11 = or i32 %shl9, %lshrl7 %shl10 = shl i32 %11, 22 %ashr11 = ashr i32 %shl10, 22 - %12 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %13 = load i8, i8* %12, align 1 + %12 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %13 = load i8, ptr %12, align 1 %lshrl12 = lshr i8 %13, 3 %14 = trunc i8 %lshrl12 to i1 %boolsi = zext i1 %14 to i32 - %15 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %16 = load i8, i8* %15, align 1 + %15 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %16 = load i8, ptr %15, align 1 %lshrl13 = lshr i8 %16, 4 %17 = trunc i8 %lshrl13 to i1 %boolsi14 = zext i1 %17 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i32 0, i32 0), i32 %ashr, i32 %ashr5, i32 %ashr11, i32 %boolsi, i32 %boolsi14) + call void (ptr, ...) @printf(ptr @.str, i32 %ashr, i32 %ashr5, i32 %ashr11, i32 %boolsi, i32 %boolsi14) ret void } \ No newline at end of file diff --git a/test/test_suite/bitstruct/bitfield_access.c3t b/test/test_suite/bitstruct/bitfield_access.c3t index 65c190e9e..b22e6e031 100644 --- a/test/test_suite/bitstruct/bitfield_access.c3t +++ b/test/test_suite/bitstruct/bitfield_access.c3t @@ -111,70 +111,70 @@ entry: %z2 = alloca [3 x i8], align 1 %z3 = alloca [3 x i8], align 1 %xx = alloca [5 x i8], align 1 - store i8 115, i8* %b, align 1 - store i16 5, i16* %c1, align 2 - store i16 96, i16* %c2, align 2 - store i16 18432, i16* %c3, align 2 - store i16 18683, i16* %c4, align 2 - store i16 27, i16* %c5, align 2 - store i16 5, i16* %c6, align 2 - store i16 10240, i16* %c7, align 2 - store [3 x i8] c"\0B\06 ", [3 x i8]* %e1, align 1 - store [3 x i8] c"\09\06 ", [3 x i8]* %e2, align 1 - store [3 x i8] c"\0A\06 ", [3 x i8]* %e3, align 1 - store i8 0, i8* %d, align 1 - %0 = getelementptr inbounds [3 x i8], [3 x i8]* %e1, i64 0, i64 0 - %1 = load i8, i8* %0, align 1 + store i8 115, ptr %b, align 1 + store i16 5, ptr %c1, align 2 + store i16 96, ptr %c2, align 2 + store i16 18432, ptr %c3, align 2 + store i16 18683, ptr %c4, align 2 + store i16 27, ptr %c5, align 2 + store i16 5, ptr %c6, align 2 + store i16 10240, ptr %c7, align 2 + store [3 x i8] c"\0B\06 ", ptr %e1, align 1 + store [3 x i8] c"\09\06 ", ptr %e2, align 1 + store [3 x i8] c"\0A\06 ", ptr %e3, align 1 + store i8 0, ptr %d, align 1 + %0 = getelementptr inbounds [3 x i8], ptr %e1, i64 0, i64 0 + %1 = load i8, ptr %0, align 1 %zext = zext i8 %1 to i32 %shl = shl i32 %zext, 29 %ashr = ashr i32 %shl, 29 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) - %2 = getelementptr inbounds [3 x i8], [3 x i8]* %e2, i64 0, i64 0 - %3 = load i8, i8* %2, align 1 + call void (ptr, ...) @printf(ptr @.str, i32 %ashr) + %2 = getelementptr inbounds [3 x i8], ptr %e2, i64 0, i64 0 + %3 = load i8, ptr %2, align 1 %zext1 = zext i8 %3 to i32 %shl2 = shl i32 %zext1, 29 %ashr3 = ashr i32 %shl2, 29 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr3) - %4 = getelementptr inbounds [3 x i8], [3 x i8]* %e3, i64 0, i64 0 - %5 = load i8, i8* %4, align 1 + call void (ptr, ...) @printf(ptr @.str.1, i32 %ashr3) + %4 = getelementptr inbounds [3 x i8], ptr %e3, i64 0, i64 0 + %5 = load i8, ptr %4, align 1 %zext4 = zext i8 %5 to i32 %shl5 = shl i32 %zext4, 29 %ashr6 = ashr i32 %shl5, 29 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %ashr6) - store [3 x i8] c"\0B\06 ", [3 x i8]* %z1, align 1 - store [3 x i8] c"\0C\06 ", [3 x i8]* %z2, align 1 - store [3 x i8] c"\0F\06 ", [3 x i8]* %z3, align 1 - %6 = getelementptr inbounds [3 x i8], [3 x i8]* %z1, i64 0, i64 0 - %7 = load i8, i8* %6, align 1 + call void (ptr, ...) @printf(ptr @.str.2, i32 %ashr6) + store [3 x i8] c"\0B\06 ", ptr %z1, align 1 + store [3 x i8] c"\0C\06 ", ptr %z2, align 1 + store [3 x i8] c"\0F\06 ", ptr %z3, align 1 + %6 = getelementptr inbounds [3 x i8], ptr %z1, i64 0, i64 0 + %7 = load i8, ptr %6, align 1 %zext7 = zext i8 %7 to i32 %8 = and i32 7, %zext7 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %8) - %9 = getelementptr inbounds [3 x i8], [3 x i8]* %z2, i64 0, i64 0 - %10 = load i8, i8* %9, align 1 + call void (ptr, ...) @printf(ptr @.str.3, i32 %8) + %9 = getelementptr inbounds [3 x i8], ptr %z2, i64 0, i64 0 + %10 = load i8, ptr %9, align 1 %zext8 = zext i8 %10 to i32 %11 = and i32 7, %zext8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), i32 %11) - %12 = getelementptr inbounds [3 x i8], [3 x i8]* %z3, i64 0, i64 0 - %13 = load i8, i8* %12, align 1 + call void (ptr, ...) @printf(ptr @.str.4, i32 %11) + %12 = getelementptr inbounds [3 x i8], ptr %z3, i64 0, i64 0 + %13 = load i8, ptr %12, align 1 %zext9 = zext i8 %13 to i32 %14 = and i32 7, %zext9 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), i32 %14) - store [5 x i8] c"\00G\02\00\00", [5 x i8]* %xx, align 1 - %15 = getelementptr inbounds [5 x i8], [5 x i8]* %xx, i64 0, i64 0 - %16 = load i8, i8* %15, align 1 + call void (ptr, ...) @printf(ptr @.str.5, i32 %14) + store [5 x i8] c"\00G\02\00\00", ptr %xx, align 1 + %15 = getelementptr inbounds [5 x i8], ptr %xx, i64 0, i64 0 + %16 = load i8, ptr %15, align 1 %zext10 = zext i8 %16 to i32 %lshrl = lshr i32 %zext10, 5 - %17 = getelementptr inbounds [5 x i8], [5 x i8]* %xx, i64 0, i64 1 - %18 = load i8, i8* %17, align 1 + %17 = getelementptr inbounds [5 x i8], ptr %xx, i64 0, i64 1 + %18 = load i8, ptr %17, align 1 %zext11 = zext i8 %18 to i32 %shl12 = shl i32 %zext11, 3 %19 = or i32 %shl12, %lshrl - %20 = getelementptr inbounds [5 x i8], [5 x i8]* %xx, i64 0, i64 2 - %21 = load i8, i8* %20, align 1 + %20 = getelementptr inbounds [5 x i8], ptr %xx, i64 0, i64 2 + %21 = load i8, ptr %20, align 1 %zext13 = zext i8 %21 to i32 %shl14 = shl i32 %zext13, 11 %22 = or i32 %shl14, %19 %23 = and i32 262143, %22 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.6, i32 0, i32 0), i32 %23) + call void (ptr, ...) @printf(ptr @.str.6, i32 %23) ret void } \ No newline at end of file diff --git a/test/test_suite/bitstruct/bitstruct_access_signed.c3t b/test/test_suite/bitstruct/bitstruct_access_signed.c3t index d769244ab..3475821f5 100644 --- a/test/test_suite/bitstruct/bitstruct_access_signed.c3t +++ b/test/test_suite/bitstruct/bitstruct_access_signed.c3t @@ -34,58 +34,58 @@ define void @foo_main() #0 { entry: %xx = alloca [3 x i8], align 1 %xxu = alloca [3 x i8], align 1 - store [3 x i8] c"\E0\FD\7F", [3 x i8]* %xx, align 1 - %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %1 = load i8, i8* %0, align 1 + store [3 x i8] c"\E0\FD\7F", ptr %xx, align 1 + %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %1 = load i8, ptr %0, align 1 %zext = zext i8 %1 to i32 %lshrl = lshr i32 %zext, 5 - %2 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %3 = load i8, i8* %2, align 1 + %2 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %3 = load i8, ptr %2, align 1 %zext1 = zext i8 %3 to i32 %shl = shl i32 %zext1, 3 %4 = or i32 %shl, %lshrl - %5 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %6 = load i8, i8* %5, align 1 + %5 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %6 = load i8, ptr %5, align 1 %zext2 = zext i8 %6 to i32 %shl3 = shl i32 %zext2, 11 %7 = or i32 %shl3, %4 %shl4 = shl i32 %7, 14 %ashr = ashr i32 %shl4, 14 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) - store [3 x i8] c"\FF\FD\FF", [3 x i8]* %xx, align 1 - %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %9 = load i8, i8* %8, align 1 + call void (ptr, ...) @printf(ptr @.str, i32 %ashr) + store [3 x i8] c"\FF\FD\FF", ptr %xx, align 1 + %8 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %9 = load i8, ptr %8, align 1 %zext5 = zext i8 %9 to i32 %lshrl6 = lshr i32 %zext5, 5 - %10 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %11 = load i8, i8* %10, align 1 + %10 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %11 = load i8, ptr %10, align 1 %zext7 = zext i8 %11 to i32 %shl8 = shl i32 %zext7, 3 %12 = or i32 %shl8, %lshrl6 - %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %14 = load i8, i8* %13, align 1 + %13 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %14 = load i8, ptr %13, align 1 %zext9 = zext i8 %14 to i32 %shl10 = shl i32 %zext9, 11 %15 = or i32 %shl10, %12 %shl11 = shl i32 %15, 14 %ashr12 = ashr i32 %shl11, 14 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr12) - store [3 x i8] c"\1F\CF\AA", [3 x i8]* %xxu, align 1 - %16 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 0 - %17 = load i8, i8* %16, align 1 + call void (ptr, ...) @printf(ptr @.str.1, i32 %ashr12) + store [3 x i8] c"\1F\CF\AA", ptr %xxu, align 1 + %16 = getelementptr inbounds [3 x i8], ptr %xxu, i64 0, i64 0 + %17 = load i8, ptr %16, align 1 %zext13 = zext i8 %17 to i32 %lshrl14 = lshr i32 %zext13, 5 - %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 1 - %19 = load i8, i8* %18, align 1 + %18 = getelementptr inbounds [3 x i8], ptr %xxu, i64 0, i64 1 + %19 = load i8, ptr %18, align 1 %zext15 = zext i8 %19 to i32 %shl16 = shl i32 %zext15, 3 %20 = or i32 %shl16, %lshrl14 - %21 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 2 - %22 = load i8, i8* %21, align 1 + %21 = getelementptr inbounds [3 x i8], ptr %xxu, i64 0, i64 2 + %22 = load i8, ptr %21, align 1 %zext17 = zext i8 %22 to i32 %shl18 = shl i32 %zext17, 11 %23 = or i32 %shl18, %20 %24 = and i32 262143, %23 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %24) + call void (ptr, ...) @printf(ptr @.str.2, i32 %24) ret void } diff --git a/test/test_suite/bitstruct/bitstruct_arrays.c3t b/test/test_suite/bitstruct/bitstruct_arrays.c3t index e661e9837..066ba1e77 100644 --- a/test/test_suite/bitstruct/bitstruct_arrays.c3t +++ b/test/test_suite/bitstruct/bitstruct_arrays.c3t @@ -122,222 +122,213 @@ fn void test3() /* #expect: foo.ll -define void @foo_main() #0 { -entry: - call void @foo_test1() - call void @foo_test2() - call void @foo_test3() - ret void -} - -; Function Attrs: nounwind define void @foo_test1() #0 { entry: %xx = alloca i64, align 8 - store i64 531994, i64* %xx, align 8 - %0 = load i64, i64* %xx, align 8 + store i64 531994, ptr %xx, align 8 + %0 = load i64, ptr %xx, align 8 %1 = and i64 %0, -8 %2 = or i64 %1, 3 - store i64 %2, i64* %xx, align 8 - %3 = load i64, i64* %xx, align 8 + store i64 %2, ptr %xx, align 8 + %3 = load i64, ptr %xx, align 8 %shl = shl i64 %3, 61 %ashr = ashr i64 %shl, 61 %4 = trunc i64 %ashr to i32 - %5 = load i64, i64* %xx, align 8 + %5 = load i64, ptr %xx, align 8 %shl1 = shl i64 %5, 55 %ashr2 = ashr i64 %shl1, 58 %6 = trunc i64 %ashr2 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 %4, i32 %6) - %7 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %4, i32 %6) + %7 = load i64, ptr %xx, align 8 %shl3 = shl i64 %7, 61 %ashr4 = ashr i64 %shl3, 61 %8 = trunc i64 %ashr4 to i32 %sub = sub i32 %8, 1 - %9 = load i64, i64* %xx, align 8 + %9 = load i64, ptr %xx, align 8 %zext = zext i32 %sub to i64 %10 = and i64 %zext, 7 %11 = and i64 %9, -8 %12 = or i64 %11, %10 - store i64 %12, i64* %xx, align 8 - %13 = load i64, i64* %xx, align 8 + store i64 %12, ptr %xx, align 8 + %13 = load i64, ptr %xx, align 8 %shl5 = shl i64 %13, 61 %ashr6 = ashr i64 %shl5, 61 %14 = trunc i64 %ashr6 to i32 - %15 = load i64, i64* %xx, align 8 + %15 = load i64, ptr %xx, align 8 %shl7 = shl i64 %15, 55 %ashr8 = ashr i64 %shl7, 58 %16 = trunc i64 %ashr8 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %14, i32 %16) - %17 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.1, i32 %14, i32 %16) + %17 = load i64, ptr %xx, align 8 %shl9 = shl i64 %17, 55 %ashr10 = ashr i64 %shl9, 58 %18 = trunc i64 %ashr10 to i32 %mul = mul i32 %18, 2 - %19 = load i64, i64* %xx, align 8 + %19 = load i64, ptr %xx, align 8 %zext11 = zext i32 %mul to i64 %shl12 = shl i64 %zext11, 3 %20 = and i64 %shl12, 504 %21 = and i64 %19, -505 %22 = or i64 %21, %20 - store i64 %22, i64* %xx, align 8 - %23 = load i64, i64* %xx, align 8 + store i64 %22, ptr %xx, align 8 + %23 = load i64, ptr %xx, align 8 %shl13 = shl i64 %23, 61 %ashr14 = ashr i64 %shl13, 61 %24 = trunc i64 %ashr14 to i32 - %25 = load i64, i64* %xx, align 8 + %25 = load i64, ptr %xx, align 8 %shl15 = shl i64 %25, 55 %ashr16 = ashr i64 %shl15, 58 %26 = trunc i64 %ashr16 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 %24, i32 %26) - %27 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.2, i32 %24, i32 %26) + %27 = load i64, ptr %xx, align 8 %shl17 = shl i64 %27, 55 %ashr18 = ashr i64 %shl17, 58 %28 = trunc i64 %ashr18 to i32 %xor = xor i32 %28, 4 - %29 = load i64, i64* %xx, align 8 + %29 = load i64, ptr %xx, align 8 %zext19 = zext i32 %xor to i64 %shl20 = shl i64 %zext19, 3 %30 = and i64 %shl20, 504 %31 = and i64 %29, -505 %32 = or i64 %31, %30 - store i64 %32, i64* %xx, align 8 - %33 = load i64, i64* %xx, align 8 + store i64 %32, ptr %xx, align 8 + %33 = load i64, ptr %xx, align 8 %shl21 = shl i64 %33, 61 %ashr22 = ashr i64 %shl21, 61 %34 = trunc i64 %ashr22 to i32 - %35 = load i64, i64* %xx, align 8 + %35 = load i64, ptr %xx, align 8 %shl23 = shl i64 %35, 55 %ashr24 = ashr i64 %shl23, 58 %36 = trunc i64 %ashr24 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i32 0, i32 0), i32 %34, i32 %36) - %37 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.3, i32 %34, i32 %36) + %37 = load i64, ptr %xx, align 8 %shl25 = shl i64 %37, 55 %ashr26 = ashr i64 %shl25, 58 %38 = trunc i64 %ashr26 to i32 %or = or i32 %38, 4 - %39 = load i64, i64* %xx, align 8 + %39 = load i64, ptr %xx, align 8 %zext27 = zext i32 %or to i64 %shl28 = shl i64 %zext27, 3 %40 = and i64 %shl28, 504 %41 = and i64 %39, -505 %42 = or i64 %41, %40 - store i64 %42, i64* %xx, align 8 - %43 = load i64, i64* %xx, align 8 + store i64 %42, ptr %xx, align 8 + %43 = load i64, ptr %xx, align 8 %shl29 = shl i64 %43, 61 %ashr30 = ashr i64 %shl29, 61 %44 = trunc i64 %ashr30 to i32 - %45 = load i64, i64* %xx, align 8 + %45 = load i64, ptr %xx, align 8 %shl31 = shl i64 %45, 55 %ashr32 = ashr i64 %shl31, 58 %46 = trunc i64 %ashr32 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i32 0, i32 0), i32 %44, i32 %46) - %47 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.4, i32 %44, i32 %46) + %47 = load i64, ptr %xx, align 8 %shl33 = shl i64 %47, 55 %ashr34 = ashr i64 %shl33, 58 %48 = trunc i64 %ashr34 to i32 %shl35 = shl i32 %48, 1 %49 = freeze i32 %shl35 - %50 = load i64, i64* %xx, align 8 + %50 = load i64, ptr %xx, align 8 %zext36 = zext i32 %49 to i64 %shl37 = shl i64 %zext36, 3 %51 = and i64 %shl37, 504 %52 = and i64 %50, -505 %53 = or i64 %52, %51 - store i64 %53, i64* %xx, align 8 - %54 = load i64, i64* %xx, align 8 + store i64 %53, ptr %xx, align 8 + %54 = load i64, ptr %xx, align 8 %shl38 = shl i64 %54, 61 %ashr39 = ashr i64 %shl38, 61 %55 = trunc i64 %ashr39 to i32 - %56 = load i64, i64* %xx, align 8 + %56 = load i64, ptr %xx, align 8 %shl40 = shl i64 %56, 55 %ashr41 = ashr i64 %shl40, 58 %57 = trunc i64 %ashr41 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i32 0, i32 0), i32 %55, i32 %57) - %58 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.5, i32 %55, i32 %57) + %58 = load i64, ptr %xx, align 8 %shl42 = shl i64 %58, 55 %ashr43 = ashr i64 %shl42, 58 %59 = trunc i64 %ashr43 to i32 %ashr44 = ashr i32 %59, 1 %60 = freeze i32 %ashr44 - %61 = load i64, i64* %xx, align 8 + %61 = load i64, ptr %xx, align 8 %zext45 = zext i32 %60 to i64 %shl46 = shl i64 %zext45, 3 %62 = and i64 %shl46, 504 %63 = and i64 %61, -505 %64 = or i64 %63, %62 - store i64 %64, i64* %xx, align 8 - %65 = load i64, i64* %xx, align 8 + store i64 %64, ptr %xx, align 8 + %65 = load i64, ptr %xx, align 8 %shl47 = shl i64 %65, 61 %ashr48 = ashr i64 %shl47, 61 %66 = trunc i64 %ashr48 to i32 - %67 = load i64, i64* %xx, align 8 + %67 = load i64, ptr %xx, align 8 %shl49 = shl i64 %67, 55 %ashr50 = ashr i64 %shl49, 58 %68 = trunc i64 %ashr50 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0), i32 %66, i32 %68) - %69 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.6, i32 %66, i32 %68) + %69 = load i64, ptr %xx, align 8 %shl51 = shl i64 %69, 55 %ashr52 = ashr i64 %shl51, 58 %70 = trunc i64 %ashr52 to i32 %sdiv = sdiv i32 %70, 2 - %71 = load i64, i64* %xx, align 8 + %71 = load i64, ptr %xx, align 8 %zext53 = zext i32 %sdiv to i64 %shl54 = shl i64 %zext53, 3 %72 = and i64 %shl54, 504 %73 = and i64 %71, -505 %74 = or i64 %73, %72 - store i64 %74, i64* %xx, align 8 - %75 = load i64, i64* %xx, align 8 + store i64 %74, ptr %xx, align 8 + %75 = load i64, ptr %xx, align 8 %shl55 = shl i64 %75, 61 %ashr56 = ashr i64 %shl55, 61 %76 = trunc i64 %ashr56 to i32 - %77 = load i64, i64* %xx, align 8 + %77 = load i64, ptr %xx, align 8 %shl57 = shl i64 %77, 55 %ashr58 = ashr i64 %shl57, 58 %78 = trunc i64 %ashr58 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.7, i32 0, i32 0), i32 %76, i32 %78) - %79 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.7, i32 %76, i32 %78) + %79 = load i64, ptr %xx, align 8 %shl59 = shl i64 %79, 55 %ashr60 = ashr i64 %shl59, 58 %80 = trunc i64 %ashr60 to i32 %smod = srem i32 %80, 2 - %81 = load i64, i64* %xx, align 8 + %81 = load i64, ptr %xx, align 8 %zext61 = zext i32 %smod to i64 %shl62 = shl i64 %zext61, 3 %82 = and i64 %shl62, 504 %83 = and i64 %81, -505 %84 = or i64 %83, %82 - store i64 %84, i64* %xx, align 8 - %85 = load i64, i64* %xx, align 8 + store i64 %84, ptr %xx, align 8 + %85 = load i64, ptr %xx, align 8 %shl63 = shl i64 %85, 61 %ashr64 = ashr i64 %shl63, 61 %86 = trunc i64 %ashr64 to i32 - %87 = load i64, i64* %xx, align 8 + %87 = load i64, ptr %xx, align 8 %shl65 = shl i64 %87, 55 %ashr66 = ashr i64 %shl65, 58 %88 = trunc i64 %ashr66 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), i32 %86, i32 %88) - %89 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.8, i32 %86, i32 %88) + %89 = load i64, ptr %xx, align 8 %90 = and i64 %89, -1048577 %91 = or i64 %90, 1048576 - store i64 %91, i64* %xx, align 8 - %92 = load i64, i64* %xx, align 8 + store i64 %91, ptr %xx, align 8 + %92 = load i64, ptr %xx, align 8 %lshrl = lshr i64 %92, 20 %93 = and i64 1, %lshrl %ztrunc = trunc i64 %93 to i8 %94 = trunc i8 %ztrunc to i1 %boolsi = zext i1 %94 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i32 0, i32 0), i32 %boolsi) - %95 = load i64, i64* %xx, align 8 + call void (ptr, ...) @printf(ptr @.str.9, i32 %boolsi) + %95 = load i64, ptr %xx, align 8 %96 = and i64 %95, -1048577 - store i64 %96, i64* %xx, align 8 - %97 = load i64, i64* %xx, align 8 + store i64 %96, ptr %xx, align 8 + %97 = load i64, ptr %xx, align 8 %lshrl67 = lshr i64 %97, 20 %98 = and i64 1, %lshrl67 %ztrunc68 = trunc i64 %98 to i8 %99 = trunc i8 %ztrunc68 to i1 %boolsi69 = zext i1 %99 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i32 0, i32 0), i32 %boolsi69) + call void (ptr, ...) @printf(ptr @.str.10, i32 %boolsi69) ret void } @@ -345,197 +336,197 @@ entry: define void @foo_test2() #0 { entry: %xx = alloca [3 x i8], align 1 - store [3 x i8] c"\1A\1E\00", [3 x i8]* %xx, align 1 - %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %1 = load i8, i8* %0, align 1 + store [3 x i8] c"\1A\1E\00", ptr %xx, align 1 + %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %1 = load i8, ptr %0, align 1 %2 = and i8 %1, -8 %3 = or i8 %2, 3 - store i8 %2, i8* %0, align 1 - %4 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %5 = load i8, i8* %4, align 1 + store i8 %2, ptr %0, align 1 + %4 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %5 = load i8, ptr %4, align 1 %zext = zext i8 %5 to i32 %shl = shl i32 %zext, 29 %ashr = ashr i32 %shl, 29 - %6 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %7 = load i8, i8* %6, align 1 + %6 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %7 = load i8, ptr %6, align 1 %zext1 = zext i8 %7 to i32 %lshrl = lshr i32 %zext1, 3 - %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %9 = load i8, i8* %8, align 1 + %8 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %9 = load i8, ptr %8, align 1 %zext2 = zext i8 %9 to i32 %shl3 = shl i32 %zext2, 5 %10 = or i32 %shl3, %lshrl %shl4 = shl i32 %10, 26 %ashr5 = ashr i32 %shl4, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.11, i32 0, i32 0), i32 %ashr, i32 %ashr5) - %11 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %12 = load i8, i8* %11, align 1 + call void (ptr, ...) @printf(ptr @.str.11, i32 %ashr, i32 %ashr5) + %11 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %12 = load i8, ptr %11, align 1 %zext6 = zext i8 %12 to i32 %shl7 = shl i32 %zext6, 29 %ashr8 = ashr i32 %shl7, 29 %sub = sub i32 %ashr8, 1 - %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %13 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %ztrunc = trunc i32 %sub to i8 %14 = and i8 %ztrunc, 7 - %15 = load i8, i8* %13, align 1 + %15 = load i8, ptr %13, align 1 %16 = and i8 %15, -8 %17 = or i8 %16, %14 - store i8 %16, i8* %13, align 1 - %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %19 = load i8, i8* %18, align 1 + store i8 %16, ptr %13, align 1 + %18 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %19 = load i8, ptr %18, align 1 %zext9 = zext i8 %19 to i32 %shl10 = shl i32 %zext9, 29 %ashr11 = ashr i32 %shl10, 29 - %20 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %21 = load i8, i8* %20, align 1 + %20 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %21 = load i8, ptr %20, align 1 %zext12 = zext i8 %21 to i32 %lshrl13 = lshr i32 %zext12, 3 - %22 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %23 = load i8, i8* %22, align 1 + %22 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %23 = load i8, ptr %22, align 1 %zext14 = zext i8 %23 to i32 %shl15 = shl i32 %zext14, 5 %24 = or i32 %shl15, %lshrl13 %shl16 = shl i32 %24, 26 %ashr17 = ashr i32 %shl16, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.12, i32 0, i32 0), i32 %ashr11, i32 %ashr17) - %25 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %26 = load i8, i8* %25, align 1 + call void (ptr, ...) @printf(ptr @.str.12, i32 %ashr11, i32 %ashr17) + %25 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %26 = load i8, ptr %25, align 1 %zext18 = zext i8 %26 to i32 %lshrl19 = lshr i32 %zext18, 3 - %27 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %28 = load i8, i8* %27, align 1 + %27 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %28 = load i8, ptr %27, align 1 %zext20 = zext i8 %28 to i32 %shl21 = shl i32 %zext20, 5 %29 = or i32 %shl21, %lshrl19 %shl22 = shl i32 %29, 26 %ashr23 = ashr i32 %shl22, 26 %mul = mul i32 %ashr23, 2 - %30 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %30 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl24 = shl i32 %mul, 3 %ztrunc25 = trunc i32 %shl24 to i8 - %31 = load i8, i8* %30, align 1 + %31 = load i8, ptr %30, align 1 %32 = and i8 %31, 7 %33 = or i8 %32, %ztrunc25 - store i8 %33, i8* %30, align 1 + store i8 %33, ptr %30, align 1 %lshrl26 = lshr i32 %mul, 5 - %34 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %34 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc27 = trunc i32 %lshrl26 to i8 %35 = and i8 %ztrunc27, 1 - %36 = load i8, i8* %34, align 1 + %36 = load i8, ptr %34, align 1 %37 = and i8 %36, -2 %38 = or i8 %37, %35 - store i8 %37, i8* %34, align 1 - %39 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %40 = load i8, i8* %39, align 1 + store i8 %37, ptr %34, align 1 + %39 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %40 = load i8, ptr %39, align 1 %zext28 = zext i8 %40 to i32 %shl29 = shl i32 %zext28, 29 %ashr30 = ashr i32 %shl29, 29 - %41 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %42 = load i8, i8* %41, align 1 + %41 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %42 = load i8, ptr %41, align 1 %zext31 = zext i8 %42 to i32 %lshrl32 = lshr i32 %zext31, 3 - %43 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %44 = load i8, i8* %43, align 1 + %43 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %44 = load i8, ptr %43, align 1 %zext33 = zext i8 %44 to i32 %shl34 = shl i32 %zext33, 5 %45 = or i32 %shl34, %lshrl32 %shl35 = shl i32 %45, 26 %ashr36 = ashr i32 %shl35, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.13, i32 0, i32 0), i32 %ashr30, i32 %ashr36) - %46 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %47 = load i8, i8* %46, align 1 + call void (ptr, ...) @printf(ptr @.str.13, i32 %ashr30, i32 %ashr36) + %46 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %47 = load i8, ptr %46, align 1 %zext37 = zext i8 %47 to i32 %lshrl38 = lshr i32 %zext37, 3 - %48 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %49 = load i8, i8* %48, align 1 + %48 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %49 = load i8, ptr %48, align 1 %zext39 = zext i8 %49 to i32 %shl40 = shl i32 %zext39, 5 %50 = or i32 %shl40, %lshrl38 %shl41 = shl i32 %50, 26 %ashr42 = ashr i32 %shl41, 26 %xor = xor i32 %ashr42, 4 - %51 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %51 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl43 = shl i32 %xor, 3 %ztrunc44 = trunc i32 %shl43 to i8 - %52 = load i8, i8* %51, align 1 + %52 = load i8, ptr %51, align 1 %53 = and i8 %52, 7 %54 = or i8 %53, %ztrunc44 - store i8 %54, i8* %51, align 1 + store i8 %54, ptr %51, align 1 %lshrl45 = lshr i32 %xor, 5 - %55 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %55 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc46 = trunc i32 %lshrl45 to i8 %56 = and i8 %ztrunc46, 1 - %57 = load i8, i8* %55, align 1 + %57 = load i8, ptr %55, align 1 %58 = and i8 %57, -2 %59 = or i8 %58, %56 - store i8 %58, i8* %55, align 1 - %60 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %61 = load i8, i8* %60, align 1 + store i8 %58, ptr %55, align 1 + %60 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %61 = load i8, ptr %60, align 1 %zext47 = zext i8 %61 to i32 %shl48 = shl i32 %zext47, 29 %ashr49 = ashr i32 %shl48, 29 - %62 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %63 = load i8, i8* %62, align 1 + %62 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %63 = load i8, ptr %62, align 1 %zext50 = zext i8 %63 to i32 %lshrl51 = lshr i32 %zext50, 3 - %64 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %65 = load i8, i8* %64, align 1 + %64 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %65 = load i8, ptr %64, align 1 %zext52 = zext i8 %65 to i32 %shl53 = shl i32 %zext52, 5 %66 = or i32 %shl53, %lshrl51 %shl54 = shl i32 %66, 26 %ashr55 = ashr i32 %shl54, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.14, i32 0, i32 0), i32 %ashr49, i32 %ashr55) - %67 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %68 = load i8, i8* %67, align 1 + call void (ptr, ...) @printf(ptr @.str.14, i32 %ashr49, i32 %ashr55) + %67 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %68 = load i8, ptr %67, align 1 %zext56 = zext i8 %68 to i32 %lshrl57 = lshr i32 %zext56, 3 - %69 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %70 = load i8, i8* %69, align 1 + %69 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %70 = load i8, ptr %69, align 1 %zext58 = zext i8 %70 to i32 %shl59 = shl i32 %zext58, 5 %71 = or i32 %shl59, %lshrl57 %shl60 = shl i32 %71, 26 %ashr61 = ashr i32 %shl60, 26 %or = or i32 %ashr61, 4 - %72 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %72 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl62 = shl i32 %or, 3 %ztrunc63 = trunc i32 %shl62 to i8 - %73 = load i8, i8* %72, align 1 + %73 = load i8, ptr %72, align 1 %74 = and i8 %73, 7 %75 = or i8 %74, %ztrunc63 - store i8 %75, i8* %72, align 1 + store i8 %75, ptr %72, align 1 %lshrl64 = lshr i32 %or, 5 - %76 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %76 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc65 = trunc i32 %lshrl64 to i8 %77 = and i8 %ztrunc65, 1 - %78 = load i8, i8* %76, align 1 + %78 = load i8, ptr %76, align 1 %79 = and i8 %78, -2 %80 = or i8 %79, %77 - store i8 %79, i8* %76, align 1 - %81 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %82 = load i8, i8* %81, align 1 + store i8 %79, ptr %76, align 1 + %81 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %82 = load i8, ptr %81, align 1 %zext66 = zext i8 %82 to i32 %shl67 = shl i32 %zext66, 29 %ashr68 = ashr i32 %shl67, 29 - %83 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %84 = load i8, i8* %83, align 1 + %83 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %84 = load i8, ptr %83, align 1 %zext69 = zext i8 %84 to i32 %lshrl70 = lshr i32 %zext69, 3 - %85 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %86 = load i8, i8* %85, align 1 + %85 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %86 = load i8, ptr %85, align 1 %zext71 = zext i8 %86 to i32 %shl72 = shl i32 %zext71, 5 %87 = or i32 %shl72, %lshrl70 %shl73 = shl i32 %87, 26 %ashr74 = ashr i32 %shl73, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.15, i32 0, i32 0), i32 %ashr68, i32 %ashr74) - %88 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %89 = load i8, i8* %88, align 1 + call void (ptr, ...) @printf(ptr @.str.15, i32 %ashr68, i32 %ashr74) + %88 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %89 = load i8, ptr %88, align 1 %zext75 = zext i8 %89 to i32 %lshrl76 = lshr i32 %zext75, 3 - %90 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %91 = load i8, i8* %90, align 1 + %90 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %91 = load i8, ptr %90, align 1 %zext77 = zext i8 %91 to i32 %shl78 = shl i32 %zext77, 5 %92 = or i32 %shl78, %lshrl76 @@ -543,44 +534,44 @@ entry: %ashr80 = ashr i32 %shl79, 26 %shl81 = shl i32 %ashr80, 1 %93 = freeze i32 %shl81 - %94 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %94 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl82 = shl i32 %93, 3 %ztrunc83 = trunc i32 %shl82 to i8 - %95 = load i8, i8* %94, align 1 + %95 = load i8, ptr %94, align 1 %96 = and i8 %95, 7 %97 = or i8 %96, %ztrunc83 - store i8 %97, i8* %94, align 1 + store i8 %97, ptr %94, align 1 %lshrl84 = lshr i32 %93, 5 - %98 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %98 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc85 = trunc i32 %lshrl84 to i8 %99 = and i8 %ztrunc85, 1 - %100 = load i8, i8* %98, align 1 + %100 = load i8, ptr %98, align 1 %101 = and i8 %100, -2 %102 = or i8 %101, %99 - store i8 %101, i8* %98, align 1 - %103 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %104 = load i8, i8* %103, align 1 + store i8 %101, ptr %98, align 1 + %103 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %104 = load i8, ptr %103, align 1 %zext86 = zext i8 %104 to i32 %shl87 = shl i32 %zext86, 29 %ashr88 = ashr i32 %shl87, 29 - %105 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %106 = load i8, i8* %105, align 1 + %105 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %106 = load i8, ptr %105, align 1 %zext89 = zext i8 %106 to i32 %lshrl90 = lshr i32 %zext89, 3 - %107 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %108 = load i8, i8* %107, align 1 + %107 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %108 = load i8, ptr %107, align 1 %zext91 = zext i8 %108 to i32 %shl92 = shl i32 %zext91, 5 %109 = or i32 %shl92, %lshrl90 %shl93 = shl i32 %109, 26 %ashr94 = ashr i32 %shl93, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.16, i32 0, i32 0), i32 %ashr88, i32 %ashr94) - %110 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %111 = load i8, i8* %110, align 1 + call void (ptr, ...) @printf(ptr @.str.16, i32 %ashr88, i32 %ashr94) + %110 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %111 = load i8, ptr %110, align 1 %zext95 = zext i8 %111 to i32 %lshrl96 = lshr i32 %zext95, 3 - %112 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %113 = load i8, i8* %112, align 1 + %112 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %113 = load i8, ptr %112, align 1 %zext97 = zext i8 %113 to i32 %shl98 = shl i32 %zext97, 5 %114 = or i32 %shl98, %lshrl96 @@ -588,153 +579,153 @@ entry: %ashr100 = ashr i32 %shl99, 26 %ashr101 = ashr i32 %ashr100, 1 %115 = freeze i32 %ashr101 - %116 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %116 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl102 = shl i32 %115, 3 %ztrunc103 = trunc i32 %shl102 to i8 - %117 = load i8, i8* %116, align 1 + %117 = load i8, ptr %116, align 1 %118 = and i8 %117, 7 %119 = or i8 %118, %ztrunc103 - store i8 %119, i8* %116, align 1 + store i8 %119, ptr %116, align 1 %lshrl104 = lshr i32 %115, 5 - %120 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %120 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc105 = trunc i32 %lshrl104 to i8 %121 = and i8 %ztrunc105, 1 - %122 = load i8, i8* %120, align 1 + %122 = load i8, ptr %120, align 1 %123 = and i8 %122, -2 %124 = or i8 %123, %121 - store i8 %123, i8* %120, align 1 - %125 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %126 = load i8, i8* %125, align 1 + store i8 %123, ptr %120, align 1 + %125 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %126 = load i8, ptr %125, align 1 %zext106 = zext i8 %126 to i32 %shl107 = shl i32 %zext106, 29 %ashr108 = ashr i32 %shl107, 29 - %127 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %128 = load i8, i8* %127, align 1 + %127 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %128 = load i8, ptr %127, align 1 %zext109 = zext i8 %128 to i32 %lshrl110 = lshr i32 %zext109, 3 - %129 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %130 = load i8, i8* %129, align 1 + %129 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %130 = load i8, ptr %129, align 1 %zext111 = zext i8 %130 to i32 %shl112 = shl i32 %zext111, 5 %131 = or i32 %shl112, %lshrl110 %shl113 = shl i32 %131, 26 %ashr114 = ashr i32 %shl113, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.17, i32 0, i32 0), i32 %ashr108, i32 %ashr114) - %132 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %133 = load i8, i8* %132, align 1 + call void (ptr, ...) @printf(ptr @.str.17, i32 %ashr108, i32 %ashr114) + %132 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %133 = load i8, ptr %132, align 1 %zext115 = zext i8 %133 to i32 %lshrl116 = lshr i32 %zext115, 3 - %134 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %135 = load i8, i8* %134, align 1 + %134 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %135 = load i8, ptr %134, align 1 %zext117 = zext i8 %135 to i32 %shl118 = shl i32 %zext117, 5 %136 = or i32 %shl118, %lshrl116 %shl119 = shl i32 %136, 26 %ashr120 = ashr i32 %shl119, 26 %sdiv = sdiv i32 %ashr120, 2 - %137 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %137 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl121 = shl i32 %sdiv, 3 %ztrunc122 = trunc i32 %shl121 to i8 - %138 = load i8, i8* %137, align 1 + %138 = load i8, ptr %137, align 1 %139 = and i8 %138, 7 %140 = or i8 %139, %ztrunc122 - store i8 %140, i8* %137, align 1 + store i8 %140, ptr %137, align 1 %lshrl123 = lshr i32 %sdiv, 5 - %141 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %141 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc124 = trunc i32 %lshrl123 to i8 %142 = and i8 %ztrunc124, 1 - %143 = load i8, i8* %141, align 1 + %143 = load i8, ptr %141, align 1 %144 = and i8 %143, -2 %145 = or i8 %144, %142 - store i8 %144, i8* %141, align 1 - %146 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %147 = load i8, i8* %146, align 1 + store i8 %144, ptr %141, align 1 + %146 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %147 = load i8, ptr %146, align 1 %zext125 = zext i8 %147 to i32 %shl126 = shl i32 %zext125, 29 %ashr127 = ashr i32 %shl126, 29 - %148 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %149 = load i8, i8* %148, align 1 + %148 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %149 = load i8, ptr %148, align 1 %zext128 = zext i8 %149 to i32 %lshrl129 = lshr i32 %zext128, 3 - %150 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %151 = load i8, i8* %150, align 1 + %150 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %151 = load i8, ptr %150, align 1 %zext130 = zext i8 %151 to i32 %shl131 = shl i32 %zext130, 5 %152 = or i32 %shl131, %lshrl129 %shl132 = shl i32 %152, 26 %ashr133 = ashr i32 %shl132, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.18, i32 0, i32 0), i32 %ashr127, i32 %ashr133) - %153 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %154 = load i8, i8* %153, align 1 + call void (ptr, ...) @printf(ptr @.str.18, i32 %ashr127, i32 %ashr133) + %153 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %154 = load i8, ptr %153, align 1 %zext134 = zext i8 %154 to i32 %lshrl135 = lshr i32 %zext134, 3 - %155 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %156 = load i8, i8* %155, align 1 + %155 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %156 = load i8, ptr %155, align 1 %zext136 = zext i8 %156 to i32 %shl137 = shl i32 %zext136, 5 %157 = or i32 %shl137, %lshrl135 %shl138 = shl i32 %157, 26 %ashr139 = ashr i32 %shl138, 26 %smod = srem i32 %ashr139, 2 - %158 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %158 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl140 = shl i32 %smod, 3 %ztrunc141 = trunc i32 %shl140 to i8 - %159 = load i8, i8* %158, align 1 + %159 = load i8, ptr %158, align 1 %160 = and i8 %159, 7 %161 = or i8 %160, %ztrunc141 - store i8 %161, i8* %158, align 1 + store i8 %161, ptr %158, align 1 %lshrl142 = lshr i32 %smod, 5 - %162 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %162 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc143 = trunc i32 %lshrl142 to i8 %163 = and i8 %ztrunc143, 1 - %164 = load i8, i8* %162, align 1 + %164 = load i8, ptr %162, align 1 %165 = and i8 %164, -2 %166 = or i8 %165, %163 - store i8 %165, i8* %162, align 1 - %167 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %168 = load i8, i8* %167, align 1 + store i8 %165, ptr %162, align 1 + %167 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %168 = load i8, ptr %167, align 1 %zext144 = zext i8 %168 to i32 %shl145 = shl i32 %zext144, 29 %ashr146 = ashr i32 %shl145, 29 - %169 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %170 = load i8, i8* %169, align 1 + %169 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %170 = load i8, ptr %169, align 1 %zext147 = zext i8 %170 to i32 %lshrl148 = lshr i32 %zext147, 3 - %171 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %172 = load i8, i8* %171, align 1 + %171 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %172 = load i8, ptr %171, align 1 %zext149 = zext i8 %172 to i32 %shl150 = shl i32 %zext149, 5 %173 = or i32 %shl150, %lshrl148 %shl151 = shl i32 %173, 26 %ashr152 = ashr i32 %shl151, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.19, i32 0, i32 0), i32 %ashr146, i32 %ashr152) - %174 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %175 = load i8, i8* %174, align 1 + call void (ptr, ...) @printf(ptr @.str.19, i32 %ashr146, i32 %ashr152) + %174 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %175 = load i8, ptr %174, align 1 %lshrl153 = lshr i8 %175, 4 %176 = trunc i8 %lshrl153 to i1 %boolsi = zext i1 %176 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.20, i32 0, i32 0), i32 %boolsi) - %177 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %178 = load i8, i8* %177, align 1 + call void (ptr, ...) @printf(ptr @.str.20, i32 %boolsi) + %177 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %178 = load i8, ptr %177, align 1 %179 = and i8 %178, -17 %180 = or i8 %179, 16 - store i8 %180, i8* %177, align 1 - %181 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %182 = load i8, i8* %181, align 1 + store i8 %180, ptr %177, align 1 + %181 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %182 = load i8, ptr %181, align 1 %lshrl154 = lshr i8 %182, 4 %183 = trunc i8 %lshrl154 to i1 %boolsi155 = zext i1 %183 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.21, i32 0, i32 0), i32 %boolsi155) - %184 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %185 = load i8, i8* %184, align 1 + call void (ptr, ...) @printf(ptr @.str.21, i32 %boolsi155) + %184 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %185 = load i8, ptr %184, align 1 %186 = and i8 %185, -17 - store i8 %186, i8* %184, align 1 - %187 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %188 = load i8, i8* %187, align 1 + store i8 %186, ptr %184, align 1 + %187 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %188 = load i8, ptr %187, align 1 %lshrl156 = lshr i8 %188, 4 %189 = trunc i8 %lshrl156 to i1 %boolsi157 = zext i1 %189 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.22, i32 0, i32 0), i32 %boolsi157) + call void (ptr, ...) @printf(ptr @.str.22, i32 %boolsi157) ret void } @@ -742,205 +733,205 @@ entry: define void @foo_test3() #0 { entry: %xx = alloca [3 x i8], align 1 - store [3 x i8] c"4<\00", [3 x i8]* %xx, align 1 - %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %1 = load i8, i8* %0, align 1 + store [3 x i8] c"4<\00", ptr %xx, align 1 + %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %1 = load i8, ptr %0, align 1 %2 = and i8 %1, -15 %3 = or i8 %2, 6 - store i8 %3, i8* %0, align 1 - %4 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %5 = load i8, i8* %4, align 1 + store i8 %3, ptr %0, align 1 + %4 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %5 = load i8, ptr %4, align 1 %zext = zext i8 %5 to i32 %lshrl = lshr i32 %zext, 1 %shl = shl i32 %lshrl, 29 %ashr = ashr i32 %shl, 29 - %6 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %7 = load i8, i8* %6, align 1 + %6 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %7 = load i8, ptr %6, align 1 %zext1 = zext i8 %7 to i32 %lshrl2 = lshr i32 %zext1, 4 - %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %9 = load i8, i8* %8, align 1 + %8 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %9 = load i8, ptr %8, align 1 %zext3 = zext i8 %9 to i32 %shl4 = shl i32 %zext3, 4 %10 = or i32 %shl4, %lshrl2 %shl5 = shl i32 %10, 26 %ashr6 = ashr i32 %shl5, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.23, i32 0, i32 0), i32 %ashr, i32 %ashr6) - %11 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %12 = load i8, i8* %11, align 1 + call void (ptr, ...) @printf(ptr @.str.23, i32 %ashr, i32 %ashr6) + %11 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %12 = load i8, ptr %11, align 1 %zext7 = zext i8 %12 to i32 %lshrl8 = lshr i32 %zext7, 1 %shl9 = shl i32 %lshrl8, 29 %ashr10 = ashr i32 %shl9, 29 %sub = sub i32 %ashr10, 1 - %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %13 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl11 = shl i32 %sub, 1 %ztrunc = trunc i32 %shl11 to i8 %14 = and i8 %ztrunc, 15 - %15 = load i8, i8* %13, align 1 + %15 = load i8, ptr %13, align 1 %16 = and i8 %15, -15 %17 = or i8 %16, %14 - store i8 %17, i8* %13, align 1 + store i8 %17, ptr %13, align 1 %lshrl12 = lshr i32 %sub, 7 - %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %19 = load i8, i8* %18, align 1 + %18 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %19 = load i8, ptr %18, align 1 %zext13 = zext i8 %19 to i32 %lshrl14 = lshr i32 %zext13, 1 %shl15 = shl i32 %lshrl14, 29 %ashr16 = ashr i32 %shl15, 29 - %20 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %21 = load i8, i8* %20, align 1 + %20 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %21 = load i8, ptr %20, align 1 %zext17 = zext i8 %21 to i32 %lshrl18 = lshr i32 %zext17, 4 - %22 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %23 = load i8, i8* %22, align 1 + %22 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %23 = load i8, ptr %22, align 1 %zext19 = zext i8 %23 to i32 %shl20 = shl i32 %zext19, 4 %24 = or i32 %shl20, %lshrl18 %shl21 = shl i32 %24, 26 %ashr22 = ashr i32 %shl21, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.24, i32 0, i32 0), i32 %ashr16, i32 %ashr22) - %25 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %26 = load i8, i8* %25, align 1 + call void (ptr, ...) @printf(ptr @.str.24, i32 %ashr16, i32 %ashr22) + %25 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %26 = load i8, ptr %25, align 1 %zext23 = zext i8 %26 to i32 %lshrl24 = lshr i32 %zext23, 4 - %27 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %28 = load i8, i8* %27, align 1 + %27 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %28 = load i8, ptr %27, align 1 %zext25 = zext i8 %28 to i32 %shl26 = shl i32 %zext25, 4 %29 = or i32 %shl26, %lshrl24 %shl27 = shl i32 %29, 26 %ashr28 = ashr i32 %shl27, 26 %mul = mul i32 %ashr28, 2 - %30 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %30 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl29 = shl i32 %mul, 4 %ztrunc30 = trunc i32 %shl29 to i8 - %31 = load i8, i8* %30, align 1 + %31 = load i8, ptr %30, align 1 %32 = and i8 %31, 15 %33 = or i8 %32, %ztrunc30 - store i8 %33, i8* %30, align 1 + store i8 %33, ptr %30, align 1 %lshrl31 = lshr i32 %mul, 4 - %34 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %34 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc32 = trunc i32 %lshrl31 to i8 %35 = and i8 %ztrunc32, 3 - %36 = load i8, i8* %34, align 1 + %36 = load i8, ptr %34, align 1 %37 = and i8 %36, -4 %38 = or i8 %37, %35 - store i8 %37, i8* %34, align 1 - %39 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %40 = load i8, i8* %39, align 1 + store i8 %37, ptr %34, align 1 + %39 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %40 = load i8, ptr %39, align 1 %zext33 = zext i8 %40 to i32 %lshrl34 = lshr i32 %zext33, 1 %shl35 = shl i32 %lshrl34, 29 %ashr36 = ashr i32 %shl35, 29 - %41 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %42 = load i8, i8* %41, align 1 + %41 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %42 = load i8, ptr %41, align 1 %zext37 = zext i8 %42 to i32 %lshrl38 = lshr i32 %zext37, 4 - %43 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %44 = load i8, i8* %43, align 1 + %43 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %44 = load i8, ptr %43, align 1 %zext39 = zext i8 %44 to i32 %shl40 = shl i32 %zext39, 4 %45 = or i32 %shl40, %lshrl38 %shl41 = shl i32 %45, 26 %ashr42 = ashr i32 %shl41, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.25, i32 0, i32 0), i32 %ashr36, i32 %ashr42) - %46 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %47 = load i8, i8* %46, align 1 + call void (ptr, ...) @printf(ptr @.str.25, i32 %ashr36, i32 %ashr42) + %46 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %47 = load i8, ptr %46, align 1 %zext43 = zext i8 %47 to i32 %lshrl44 = lshr i32 %zext43, 4 - %48 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %49 = load i8, i8* %48, align 1 + %48 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %49 = load i8, ptr %48, align 1 %zext45 = zext i8 %49 to i32 %shl46 = shl i32 %zext45, 4 %50 = or i32 %shl46, %lshrl44 %shl47 = shl i32 %50, 26 %ashr48 = ashr i32 %shl47, 26 %xor = xor i32 %ashr48, 4 - %51 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %51 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl49 = shl i32 %xor, 4 %ztrunc50 = trunc i32 %shl49 to i8 - %52 = load i8, i8* %51, align 1 + %52 = load i8, ptr %51, align 1 %53 = and i8 %52, 15 %54 = or i8 %53, %ztrunc50 - store i8 %54, i8* %51, align 1 + store i8 %54, ptr %51, align 1 %lshrl51 = lshr i32 %xor, 4 - %55 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %55 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc52 = trunc i32 %lshrl51 to i8 %56 = and i8 %ztrunc52, 3 - %57 = load i8, i8* %55, align 1 + %57 = load i8, ptr %55, align 1 %58 = and i8 %57, -4 %59 = or i8 %58, %56 - store i8 %58, i8* %55, align 1 - %60 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %61 = load i8, i8* %60, align 1 + store i8 %58, ptr %55, align 1 + %60 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %61 = load i8, ptr %60, align 1 %zext53 = zext i8 %61 to i32 %lshrl54 = lshr i32 %zext53, 1 %shl55 = shl i32 %lshrl54, 29 %ashr56 = ashr i32 %shl55, 29 - %62 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %63 = load i8, i8* %62, align 1 + %62 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %63 = load i8, ptr %62, align 1 %zext57 = zext i8 %63 to i32 %lshrl58 = lshr i32 %zext57, 4 - %64 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %65 = load i8, i8* %64, align 1 + %64 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %65 = load i8, ptr %64, align 1 %zext59 = zext i8 %65 to i32 %shl60 = shl i32 %zext59, 4 %66 = or i32 %shl60, %lshrl58 %shl61 = shl i32 %66, 26 %ashr62 = ashr i32 %shl61, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.26, i32 0, i32 0), i32 %ashr56, i32 %ashr62) - %67 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %68 = load i8, i8* %67, align 1 + call void (ptr, ...) @printf(ptr @.str.26, i32 %ashr56, i32 %ashr62) + %67 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %68 = load i8, ptr %67, align 1 %zext63 = zext i8 %68 to i32 %lshrl64 = lshr i32 %zext63, 4 - %69 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %70 = load i8, i8* %69, align 1 + %69 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %70 = load i8, ptr %69, align 1 %zext65 = zext i8 %70 to i32 %shl66 = shl i32 %zext65, 4 %71 = or i32 %shl66, %lshrl64 %shl67 = shl i32 %71, 26 %ashr68 = ashr i32 %shl67, 26 %or = or i32 %ashr68, 4 - %72 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %72 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl69 = shl i32 %or, 4 %ztrunc70 = trunc i32 %shl69 to i8 - %73 = load i8, i8* %72, align 1 + %73 = load i8, ptr %72, align 1 %74 = and i8 %73, 15 %75 = or i8 %74, %ztrunc70 - store i8 %75, i8* %72, align 1 + store i8 %75, ptr %72, align 1 %lshrl71 = lshr i32 %or, 4 - %76 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %76 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc72 = trunc i32 %lshrl71 to i8 %77 = and i8 %ztrunc72, 3 - %78 = load i8, i8* %76, align 1 + %78 = load i8, ptr %76, align 1 %79 = and i8 %78, -4 %80 = or i8 %79, %77 - store i8 %79, i8* %76, align 1 - %81 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %82 = load i8, i8* %81, align 1 + store i8 %79, ptr %76, align 1 + %81 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %82 = load i8, ptr %81, align 1 %zext73 = zext i8 %82 to i32 %lshrl74 = lshr i32 %zext73, 1 %shl75 = shl i32 %lshrl74, 29 %ashr76 = ashr i32 %shl75, 29 - %83 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %84 = load i8, i8* %83, align 1 + %83 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %84 = load i8, ptr %83, align 1 %zext77 = zext i8 %84 to i32 %lshrl78 = lshr i32 %zext77, 4 - %85 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %86 = load i8, i8* %85, align 1 + %85 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %86 = load i8, ptr %85, align 1 %zext79 = zext i8 %86 to i32 %shl80 = shl i32 %zext79, 4 %87 = or i32 %shl80, %lshrl78 %shl81 = shl i32 %87, 26 %ashr82 = ashr i32 %shl81, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.27, i32 0, i32 0), i32 %ashr76, i32 %ashr82) - %88 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %89 = load i8, i8* %88, align 1 + call void (ptr, ...) @printf(ptr @.str.27, i32 %ashr76, i32 %ashr82) + %88 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %89 = load i8, ptr %88, align 1 %zext83 = zext i8 %89 to i32 %lshrl84 = lshr i32 %zext83, 4 - %90 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %91 = load i8, i8* %90, align 1 + %90 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %91 = load i8, ptr %90, align 1 %zext85 = zext i8 %91 to i32 %shl86 = shl i32 %zext85, 4 %92 = or i32 %shl86, %lshrl84 @@ -948,45 +939,45 @@ entry: %ashr88 = ashr i32 %shl87, 26 %shl89 = shl i32 %ashr88, 1 %93 = freeze i32 %shl89 - %94 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %94 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl90 = shl i32 %93, 4 %ztrunc91 = trunc i32 %shl90 to i8 - %95 = load i8, i8* %94, align 1 + %95 = load i8, ptr %94, align 1 %96 = and i8 %95, 15 %97 = or i8 %96, %ztrunc91 - store i8 %97, i8* %94, align 1 + store i8 %97, ptr %94, align 1 %lshrl92 = lshr i32 %93, 4 - %98 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %98 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc93 = trunc i32 %lshrl92 to i8 %99 = and i8 %ztrunc93, 3 - %100 = load i8, i8* %98, align 1 + %100 = load i8, ptr %98, align 1 %101 = and i8 %100, -4 %102 = or i8 %101, %99 - store i8 %101, i8* %98, align 1 - %103 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %104 = load i8, i8* %103, align 1 + store i8 %101, ptr %98, align 1 + %103 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %104 = load i8, ptr %103, align 1 %zext94 = zext i8 %104 to i32 %lshrl95 = lshr i32 %zext94, 1 %shl96 = shl i32 %lshrl95, 29 %ashr97 = ashr i32 %shl96, 29 - %105 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %106 = load i8, i8* %105, align 1 + %105 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %106 = load i8, ptr %105, align 1 %zext98 = zext i8 %106 to i32 %lshrl99 = lshr i32 %zext98, 4 - %107 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %108 = load i8, i8* %107, align 1 + %107 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %108 = load i8, ptr %107, align 1 %zext100 = zext i8 %108 to i32 %shl101 = shl i32 %zext100, 4 %109 = or i32 %shl101, %lshrl99 %shl102 = shl i32 %109, 26 %ashr103 = ashr i32 %shl102, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.28, i32 0, i32 0), i32 %ashr97, i32 %ashr103) - %110 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %111 = load i8, i8* %110, align 1 + call void (ptr, ...) @printf(ptr @.str.28, i32 %ashr97, i32 %ashr103) + %110 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %111 = load i8, ptr %110, align 1 %zext104 = zext i8 %111 to i32 %lshrl105 = lshr i32 %zext104, 4 - %112 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %113 = load i8, i8* %112, align 1 + %112 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %113 = load i8, ptr %112, align 1 %zext106 = zext i8 %113 to i32 %shl107 = shl i32 %zext106, 4 %114 = or i32 %shl107, %lshrl105 @@ -994,155 +985,155 @@ entry: %ashr109 = ashr i32 %shl108, 26 %ashr110 = ashr i32 %ashr109, 1 %115 = freeze i32 %ashr110 - %116 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %116 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl111 = shl i32 %115, 4 %ztrunc112 = trunc i32 %shl111 to i8 - %117 = load i8, i8* %116, align 1 + %117 = load i8, ptr %116, align 1 %118 = and i8 %117, 15 %119 = or i8 %118, %ztrunc112 - store i8 %119, i8* %116, align 1 + store i8 %119, ptr %116, align 1 %lshrl113 = lshr i32 %115, 4 - %120 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %120 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc114 = trunc i32 %lshrl113 to i8 %121 = and i8 %ztrunc114, 3 - %122 = load i8, i8* %120, align 1 + %122 = load i8, ptr %120, align 1 %123 = and i8 %122, -4 %124 = or i8 %123, %121 - store i8 %123, i8* %120, align 1 - %125 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %126 = load i8, i8* %125, align 1 + store i8 %123, ptr %120, align 1 + %125 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %126 = load i8, ptr %125, align 1 %zext115 = zext i8 %126 to i32 %lshrl116 = lshr i32 %zext115, 1 %shl117 = shl i32 %lshrl116, 29 %ashr118 = ashr i32 %shl117, 29 - %127 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %128 = load i8, i8* %127, align 1 + %127 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %128 = load i8, ptr %127, align 1 %zext119 = zext i8 %128 to i32 %lshrl120 = lshr i32 %zext119, 4 - %129 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %130 = load i8, i8* %129, align 1 + %129 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %130 = load i8, ptr %129, align 1 %zext121 = zext i8 %130 to i32 %shl122 = shl i32 %zext121, 4 %131 = or i32 %shl122, %lshrl120 %shl123 = shl i32 %131, 26 %ashr124 = ashr i32 %shl123, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.29, i32 0, i32 0), i32 %ashr118, i32 %ashr124) - %132 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %133 = load i8, i8* %132, align 1 + call void (ptr, ...) @printf(ptr @.str.29, i32 %ashr118, i32 %ashr124) + %132 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %133 = load i8, ptr %132, align 1 %zext125 = zext i8 %133 to i32 %lshrl126 = lshr i32 %zext125, 4 - %134 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %135 = load i8, i8* %134, align 1 + %134 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %135 = load i8, ptr %134, align 1 %zext127 = zext i8 %135 to i32 %shl128 = shl i32 %zext127, 4 %136 = or i32 %shl128, %lshrl126 %shl129 = shl i32 %136, 26 %ashr130 = ashr i32 %shl129, 26 %sdiv = sdiv i32 %ashr130, 2 - %137 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %137 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl131 = shl i32 %sdiv, 4 %ztrunc132 = trunc i32 %shl131 to i8 - %138 = load i8, i8* %137, align 1 + %138 = load i8, ptr %137, align 1 %139 = and i8 %138, 15 %140 = or i8 %139, %ztrunc132 - store i8 %140, i8* %137, align 1 + store i8 %140, ptr %137, align 1 %lshrl133 = lshr i32 %sdiv, 4 - %141 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %141 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc134 = trunc i32 %lshrl133 to i8 %142 = and i8 %ztrunc134, 3 - %143 = load i8, i8* %141, align 1 + %143 = load i8, ptr %141, align 1 %144 = and i8 %143, -4 %145 = or i8 %144, %142 - store i8 %144, i8* %141, align 1 - %146 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %147 = load i8, i8* %146, align 1 + store i8 %144, ptr %141, align 1 + %146 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %147 = load i8, ptr %146, align 1 %zext135 = zext i8 %147 to i32 %lshrl136 = lshr i32 %zext135, 1 %shl137 = shl i32 %lshrl136, 29 %ashr138 = ashr i32 %shl137, 29 - %148 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %149 = load i8, i8* %148, align 1 + %148 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %149 = load i8, ptr %148, align 1 %zext139 = zext i8 %149 to i32 %lshrl140 = lshr i32 %zext139, 4 - %150 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %151 = load i8, i8* %150, align 1 + %150 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %151 = load i8, ptr %150, align 1 %zext141 = zext i8 %151 to i32 %shl142 = shl i32 %zext141, 4 %152 = or i32 %shl142, %lshrl140 %shl143 = shl i32 %152, 26 %ashr144 = ashr i32 %shl143, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.30, i32 0, i32 0), i32 %ashr138, i32 %ashr144) - %153 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %154 = load i8, i8* %153, align 1 + call void (ptr, ...) @printf(ptr @.str.30, i32 %ashr138, i32 %ashr144) + %153 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %154 = load i8, ptr %153, align 1 %zext145 = zext i8 %154 to i32 %lshrl146 = lshr i32 %zext145, 4 - %155 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %156 = load i8, i8* %155, align 1 + %155 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %156 = load i8, ptr %155, align 1 %zext147 = zext i8 %156 to i32 %shl148 = shl i32 %zext147, 4 %157 = or i32 %shl148, %lshrl146 %shl149 = shl i32 %157, 26 %ashr150 = ashr i32 %shl149, 26 %smod = srem i32 %ashr150, 2 - %158 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %158 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 %shl151 = shl i32 %smod, 4 %ztrunc152 = trunc i32 %shl151 to i8 - %159 = load i8, i8* %158, align 1 + %159 = load i8, ptr %158, align 1 %160 = and i8 %159, 15 %161 = or i8 %160, %ztrunc152 - store i8 %161, i8* %158, align 1 + store i8 %161, ptr %158, align 1 %lshrl153 = lshr i32 %smod, 4 - %162 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %162 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 %ztrunc154 = trunc i32 %lshrl153 to i8 %163 = and i8 %ztrunc154, 3 - %164 = load i8, i8* %162, align 1 + %164 = load i8, ptr %162, align 1 %165 = and i8 %164, -4 %166 = or i8 %165, %163 - store i8 %165, i8* %162, align 1 - %167 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %168 = load i8, i8* %167, align 1 + store i8 %165, ptr %162, align 1 + %167 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %168 = load i8, ptr %167, align 1 %zext155 = zext i8 %168 to i32 %lshrl156 = lshr i32 %zext155, 1 %shl157 = shl i32 %lshrl156, 29 %ashr158 = ashr i32 %shl157, 29 - %169 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 - %170 = load i8, i8* %169, align 1 + %169 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %170 = load i8, ptr %169, align 1 %zext159 = zext i8 %170 to i32 %lshrl160 = lshr i32 %zext159, 4 - %171 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 - %172 = load i8, i8* %171, align 1 + %171 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %172 = load i8, ptr %171, align 1 %zext161 = zext i8 %172 to i32 %shl162 = shl i32 %zext161, 4 %173 = or i32 %shl162, %lshrl160 %shl163 = shl i32 %173, 26 %ashr164 = ashr i32 %shl163, 26 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.31, i32 0, i32 0), i32 %ashr158, i32 %ashr164) - %174 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %175 = load i8, i8* %174, align 1 + call void (ptr, ...) @printf(ptr @.str.31, i32 %ashr158, i32 %ashr164) + %174 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %175 = load i8, ptr %174, align 1 %lshrl165 = lshr i8 %175, 5 %176 = trunc i8 %lshrl165 to i1 %boolsi = zext i1 %176 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.32, i32 0, i32 0), i32 %boolsi) - %177 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %178 = load i8, i8* %177, align 1 + call void (ptr, ...) @printf(ptr @.str.32, i32 %boolsi) + %177 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %178 = load i8, ptr %177, align 1 %179 = and i8 %178, -33 %180 = or i8 %179, 32 - store i8 %180, i8* %177, align 1 - %181 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %182 = load i8, i8* %181, align 1 + store i8 %180, ptr %177, align 1 + %181 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %182 = load i8, ptr %181, align 1 %lshrl166 = lshr i8 %182, 5 %183 = trunc i8 %lshrl166 to i1 %boolsi167 = zext i1 %183 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.33, i32 0, i32 0), i32 %boolsi167) - %184 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %185 = load i8, i8* %184, align 1 + call void (ptr, ...) @printf(ptr @.str.33, i32 %boolsi167) + %184 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %185 = load i8, ptr %184, align 1 %186 = and i8 %185, -33 - store i8 %186, i8* %184, align 1 - %187 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 - %188 = load i8, i8* %187, align 1 + store i8 %186, ptr %184, align 1 + %187 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 + %188 = load i8, ptr %187, align 1 %lshrl168 = lshr i8 %188, 5 %189 = trunc i8 %lshrl168 to i1 %boolsi169 = zext i1 %189 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.34, i32 0, i32 0), i32 %boolsi169) + call void (ptr, ...) @printf(ptr @.str.34, i32 %boolsi169) ret void } diff --git a/test/test_suite/bitstruct/bitstruct_arrays_be.c3t b/test/test_suite/bitstruct/bitstruct_arrays_be.c3t index 9e5b7a254..d2325338b 100644 --- a/test/test_suite/bitstruct/bitstruct_arrays_be.c3t +++ b/test/test_suite/bitstruct/bitstruct_arrays_be.c3t @@ -41,106 +41,104 @@ define void @foo_test3() #0 { entry: %xx = alloca [4 x i8], align 1 %xy = alloca [4 x i8], align 1 - %abc = alloca i8*, align 8 - %z = alloca [4 x i8]*, align 8 - store [4 x i8] c"\E0\FB\0A\00", [4 x i8]* %xx, align 1 - %0 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 0 - %1 = load i8, i8* %0, align 1 + %abc = alloca ptr, align 8 + %z = alloca ptr, align 8 + store [4 x i8] c"\E0\FB\0A\00", ptr %xx, align 1 + %0 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 0 + %1 = load i8, ptr %0, align 1 %zext = zext i8 %1 to i32 %lshrl = lshr i32 %zext, 4 - %2 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 1 - %3 = load i8, i8* %2, align 1 + %2 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 1 + %3 = load i8, ptr %2, align 1 %zext1 = zext i8 %3 to i32 %shl = shl i32 %zext1, 4 %4 = or i32 %shl, %lshrl - %5 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 2 - %6 = load i8, i8* %5, align 1 + %5 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 2 + %6 = load i8, ptr %5, align 1 %zext2 = zext i8 %6 to i32 %shl3 = shl i32 %zext2, 12 %7 = or i32 %shl3, %4 %shl4 = shl i32 %7, 16 %8 = call i32 @llvm.bswap.i32(i32 %shl4) %9 = and i32 65535, %8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), i32 %9) - store [4 x i8] c"\F0\EA\0B\00", [4 x i8]* %xy, align 1 - %ptrptr = bitcast [4 x i8]* %xy to i8* - store i8* %ptrptr, i8** %abc, align 8 - %10 = load i8*, i8** %abc, align 8 - %ptrptr5 = bitcast i8* %10 to [4 x i8]* - store [4 x i8]* %ptrptr5, [4 x i8]** %z, align 8 - %11 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 0 - %12 = load i8, i8* %11, align 1 - %zext6 = zext i8 %12 to i32 - %lshrl7 = lshr i32 %zext6, 4 - %13 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 1 - %14 = load i8, i8* %13, align 1 - %zext8 = zext i8 %14 to i32 - %shl9 = shl i32 %zext8, 4 - %15 = or i32 %shl9, %lshrl7 - %16 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 2 - %17 = load i8, i8* %16, align 1 - %zext10 = zext i8 %17 to i32 - %shl11 = shl i32 %zext10, 12 - %18 = or i32 %shl11, %15 + call void (ptr, ...) @printf(ptr @.str, i32 %9) + store [4 x i8] c"\F0\EA\0B\00", ptr %xy, align 1 + store ptr %xy, ptr %abc, align 8 + %10 = load ptr, ptr %abc, align 8 + store ptr %10, ptr %z, align 8 + %11 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 0 + %12 = load i8, ptr %11, align 1 + %zext5 = zext i8 %12 to i32 + %lshrl6 = lshr i32 %zext5, 4 + %13 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 1 + %14 = load i8, ptr %13, align 1 + %zext7 = zext i8 %14 to i32 + %shl8 = shl i32 %zext7, 4 + %15 = or i32 %shl8, %lshrl6 + %16 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 2 + %17 = load i8, ptr %16, align 1 + %zext9 = zext i8 %17 to i32 + %shl10 = shl i32 %zext9, 12 + %18 = or i32 %shl10, %15 %19 = and i32 65535, %18 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %19) - %20 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 0 - %21 = load i8, i8* %20, align 1 + call void (ptr, ...) @printf(ptr @.str.1, i32 %19) + %20 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 0 + %21 = load i8, ptr %20, align 1 %22 = and i8 %21, 15 %23 = or i8 %22, -16 - store i8 %23, i8* %20, align 1 - %24 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 1 - store i8 -18, i8* %24, align 1 - %25 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 2 - %26 = load i8, i8* %25, align 1 + store i8 %23, ptr %20, align 1 + %24 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 1 + store i8 -18, ptr %24, align 1 + %25 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 2 + %26 = load i8, ptr %25, align 1 %27 = and i8 %26, -16 %28 = or i8 %27, 11 - store i8 %27, i8* %25, align 1 - %29 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 0 - %30 = load i8, i8* %29, align 1 - %zext12 = zext i8 %30 to i32 - %lshrl13 = lshr i32 %zext12, 4 - %31 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 1 - %32 = load i8, i8* %31, align 1 - %zext14 = zext i8 %32 to i32 - %shl15 = shl i32 %zext14, 4 - %33 = or i32 %shl15, %lshrl13 - %34 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 2 - %35 = load i8, i8* %34, align 1 - %zext16 = zext i8 %35 to i32 - %shl17 = shl i32 %zext16, 12 - %36 = or i32 %shl17, %33 + store i8 %27, ptr %25, align 1 + %29 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 0 + %30 = load i8, ptr %29, align 1 + %zext11 = zext i8 %30 to i32 + %lshrl12 = lshr i32 %zext11, 4 + %31 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 1 + %32 = load i8, ptr %31, align 1 + %zext13 = zext i8 %32 to i32 + %shl14 = shl i32 %zext13, 4 + %33 = or i32 %shl14, %lshrl12 + %34 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 2 + %35 = load i8, ptr %34, align 1 + %zext15 = zext i8 %35 to i32 + %shl16 = shl i32 %zext15, 12 + %36 = or i32 %shl16, %33 %37 = and i32 65535, %36 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), i32 %37) - %38 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 0 - %39 = load i8, i8* %38, align 1 + call void (ptr, ...) @printf(ptr @.str.2, i32 %37) + %38 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 0 + %39 = load i8, ptr %38, align 1 %40 = and i8 %39, 15 %41 = or i8 %40, -32 - store i8 %41, i8* %38, align 1 - %42 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 1 - store i8 -5, i8* %42, align 1 - %43 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 2 - %44 = load i8, i8* %43, align 1 + store i8 %41, ptr %38, align 1 + %42 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 1 + store i8 -5, ptr %42, align 1 + %43 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 2 + %44 = load i8, ptr %43, align 1 %45 = and i8 %44, -16 %46 = or i8 %45, 14 - store i8 %45, i8* %43, align 1 - %47 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 0 - %48 = load i8, i8* %47, align 1 - %zext18 = zext i8 %48 to i32 - %lshrl19 = lshr i32 %zext18, 4 - %49 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 1 - %50 = load i8, i8* %49, align 1 - %zext20 = zext i8 %50 to i32 - %shl21 = shl i32 %zext20, 4 - %51 = or i32 %shl21, %lshrl19 - %52 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 2 - %53 = load i8, i8* %52, align 1 - %zext22 = zext i8 %53 to i32 - %shl23 = shl i32 %zext22, 12 - %54 = or i32 %shl23, %51 - %shl24 = shl i32 %54, 16 - %55 = call i32 @llvm.bswap.i32(i32 %shl24) + store i8 %45, ptr %43, align 1 + %47 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 0 + %48 = load i8, ptr %47, align 1 + %zext17 = zext i8 %48 to i32 + %lshrl18 = lshr i32 %zext17, 4 + %49 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 1 + %50 = load i8, ptr %49, align 1 + %zext19 = zext i8 %50 to i32 + %shl20 = shl i32 %zext19, 4 + %51 = or i32 %shl20, %lshrl18 + %52 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 2 + %53 = load i8, ptr %52, align 1 + %zext21 = zext i8 %53 to i32 + %shl22 = shl i32 %zext21, 12 + %54 = or i32 %shl22, %51 + %shl23 = shl i32 %54, 16 + %55 = call i32 @llvm.bswap.i32(i32 %shl23) %56 = and i32 65535, %55 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 %56) + call void (ptr, ...) @printf(ptr @.str.3, i32 %56) ret void } \ No newline at end of file diff --git a/test/test_suite/bitstruct/bitstruct_be.c3t b/test/test_suite/bitstruct/bitstruct_be.c3t index b24968b59..ec6dee02f 100644 --- a/test/test_suite/bitstruct/bitstruct_be.c3t +++ b/test/test_suite/bitstruct/bitstruct_be.c3t @@ -28,10 +28,10 @@ fn void main() io::println(""); foreach (d : z) io::printf(" %x", d); io::println(""); - io::printfln("abc.a = %x", abc.a); + io::printfn("abc.a = %x", abc.a); abc.a = 0x1234; abc.b = 0x5678; - io::printfln("->abc.a = %x", abc.a); + io::printfn("->abc.a = %x", abc.a); foreach (d : z) io::printf(" %x", d); io::println(""); @@ -43,273 +43,203 @@ fn void main() /* #expect: test.ll - %0 = load i32, i32* %x, align 4 + %0 = load i32, ptr %x, align 4 %1 = call i32 @llvm.bswap.i32(i32 %0) - store i32 2063597568, i32* %x, align 4 - %2 = bitcast i32* %x to i8* - %3 = insertvalue %variant undef, i8* %2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %5 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %4, %variant* %5, align 16 - %6 = load i32, i32* %x, align 4 - %7 = call i32 @llvm.bswap.i32(i32 %6) - store i32 %7, i32* %taddr, align 4 - %8 = bitcast i32* %taddr to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %11 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %10, %variant* %11, align 16 - %12 = bitcast [2 x %variant]* %varargslots to %variant* - %13 = insertvalue %"variant[]" undef, %variant* %12, 0 - %14 = insertvalue %"variant[]" %13, i64 2, 1 - store %"variant[]" %14, %"variant[]"* %taddr1, align 8 - %15 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 - %lo = load i8*, i8** %16, align 8 - %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 - %hi = load i64, i64* %17, align 8 - %18 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i64 18, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %18, 0 + store i32 2063597568, ptr %x, align 4 + %2 = insertvalue %variant undef, ptr %x, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %4 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %3, ptr %4, align 16 + %5 = load i32, ptr %x, align 4 + %6 = call i32 @llvm.bswap.i32(i32 %5) + store i32 %6, ptr %taddr, align 4 + %7 = insertvalue %variant undef, ptr %taddr, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %9 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %8, ptr %9, align 16 + %10 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %10, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - store i32 873625686, i32* %abc, align 4 - store [4 x i8] c"\124Vx", [4 x i8]* %abc2, align 1 - %ptrptr = bitcast i32* %abc to [4 x i8]* - store [4 x i8]* %ptrptr, [4 x i8]** %z, align 8 - store [4 x i8]* %abc2, [4 x i8]** %z2, align 8 - %19 = load [4 x i8]*, [4 x i8]** %z2, align 8 - store [4 x i8]* %19, [4 x i8]** %.anon, align 8 - store i64 0, i64* %.anon2, align 8 + store i32 873625686, ptr %abc, align 4 + store [4 x i8] c"\124Vx", ptr %abc2, align 1 + store ptr %abc, ptr %z, align 8 + store ptr %abc2, ptr %z2, align 8 + %11 = load ptr, ptr %z2, align 8 + store ptr %11, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond -loop.cond: ; preds = %voiderr10, %voiderr - %20 = load i64, i64* %.anon2, align 8 - %gt = icmp ugt i64 4, %20 +loop.cond: ; preds = %voiderr6, %voiderr + %12 = load i64, ptr %.anon1, align 8 + %gt = icmp ugt i64 4, %12 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %21 = load [4 x i8]*, [4 x i8]** %.anon, align 8 - %22 = load i64, i64* %.anon2, align 8 - %23 = getelementptr inbounds [4 x i8], [4 x i8]* %21, i64 0, i64 %22 - %24 = load i8, i8* %23, align 1 - store i8 %24, i8* %d, align 1 - %25 = insertvalue %variant undef, i8* %d, 0 - %26 = insertvalue %variant %25, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - %27 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots4, i64 0, i64 0 - store %variant %26, %variant* %27, align 16 - %28 = bitcast [1 x %variant]* %varargslots4 to %variant* - %29 = insertvalue %"variant[]" undef, %variant* %28, 0 - %30 = insertvalue %"variant[]" %29, i64 1, 1 - store %"variant[]" %30, %"variant[]"* %taddr5, align 8 - %31 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 0 - %lo6 = load i8*, i8** %32, align 8 - %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 1 - %hi7 = load i64, i64* %33, align 8 - %34 = call i64 @std_io_printf(i64* %retparam3, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %34, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + %13 = load ptr, ptr %.anon, align 8 + %14 = load i64, ptr %.anon1, align 8 + %15 = getelementptr inbounds [4 x i8], ptr %13, i64 0, i64 %14 + %16 = load i8, ptr %15, align 1 + store i8 %16, ptr %d, align 1 + %17 = insertvalue %variant undef, ptr %d, 0 + %18 = insertvalue %variant %17, i64 ptrtoint (ptr @"ct$char" to i64), 1 + %19 = getelementptr inbounds [1 x %variant], ptr %varargslots3, i64 0, i64 0 + store %variant %18, ptr %19, align 16 + %20 = call i64 @std_io_printf(ptr %retparam2, ptr @.str.1, i64 3, ptr %varargslots3, i64 1) + %not_err4 = icmp eq i64 %20, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %loop.body - br label %voiderr10 +after_check5: ; preds = %loop.body + br label %voiderr6 -voiderr10: ; preds = %after_check9, %loop.body - %35 = load i64, i64* %.anon2, align 8 - %add = add i64 %35, 1 - store i64 %add, i64* %.anon2, align 8 +voiderr6: ; preds = %after_check5, %loop.body + %21 = load i64, ptr %.anon1, align 8 + %add = add i64 %21, 1 + store i64 %add, ptr %.anon1, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %36 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i32 0, i32 0)) #2 - %37 = load [4 x i8]*, [4 x i8]** %z, align 8 - store [4 x i8]* %37, [4 x i8]** %.anon11, align 8 - store i64 0, i64* %.anon12, align 8 - br label %loop.cond13 + %22 = call i32 @std_io_println(ptr @.str.2) #2 + %23 = load ptr, ptr %z, align 8 + store ptr %23, ptr %.anon7, align 8 + store i64 0, ptr %.anon8, align 8 + br label %loop.cond9 -loop.cond13: ; preds = %voiderr24, %loop.exit - %38 = load i64, i64* %.anon12, align 8 - %gt14 = icmp ugt i64 4, %38 - br i1 %gt14, label %loop.body15, label %loop.exit26 +loop.cond9: ; preds = %voiderr17, %loop.exit + %24 = load i64, ptr %.anon8, align 8 + %gt10 = icmp ugt i64 4, %24 + br i1 %gt10, label %loop.body11, label %loop.exit19 -loop.body15: ; preds = %loop.cond13 - %39 = load [4 x i8]*, [4 x i8]** %.anon11, align 8 - %40 = load i64, i64* %.anon12, align 8 - %41 = getelementptr inbounds [4 x i8], [4 x i8]* %39, i64 0, i64 %40 - %42 = load i8, i8* %41, align 1 - store i8 %42, i8* %d16, align 1 - %43 = insertvalue %variant undef, i8* %d16, 0 - %44 = insertvalue %variant %43, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - %45 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots18, i64 0, i64 0 - store %variant %44, %variant* %45, align 16 - %46 = bitcast [1 x %variant]* %varargslots18 to %variant* - %47 = insertvalue %"variant[]" undef, %variant* %46, 0 - %48 = insertvalue %"variant[]" %47, i64 1, 1 - store %"variant[]" %48, %"variant[]"* %taddr19, align 8 - %49 = bitcast %"variant[]"* %taddr19 to { i8*, i64 }* - %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %49, i32 0, i32 0 - %lo20 = load i8*, i8** %50, align 8 - %51 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %49, i32 0, i32 1 - %hi21 = load i64, i64* %51, align 8 - %52 = call i64 @std_io_printf(i64* %retparam17, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i64 3, i8* %lo20, i64 %hi21) - %not_err22 = icmp eq i64 %52, 0 - br i1 %not_err22, label %after_check23, label %voiderr24 +loop.body11: ; preds = %loop.cond9 + %25 = load ptr, ptr %.anon7, align 8 + %26 = load i64, ptr %.anon8, align 8 + %27 = getelementptr inbounds [4 x i8], ptr %25, i64 0, i64 %26 + %28 = load i8, ptr %27, align 1 + store i8 %28, ptr %d12, align 1 + %29 = insertvalue %variant undef, ptr %d12, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$char" to i64), 1 + %31 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 + store %variant %30, ptr %31, align 16 + %32 = call i64 @std_io_printf(ptr %retparam13, ptr @.str.3, i64 3, ptr %varargslots14, i64 1) + %not_err15 = icmp eq i64 %32, 0 + br i1 %not_err15, label %after_check16, label %voiderr17 -after_check23: ; preds = %loop.body15 - br label %voiderr24 +after_check16: ; preds = %loop.body11 + br label %voiderr17 -voiderr24: ; preds = %after_check23, %loop.body15 - %53 = load i64, i64* %.anon12, align 8 - %add25 = add i64 %53, 1 - store i64 %add25, i64* %.anon12, align 8 - br label %loop.cond13 +voiderr17: ; preds = %after_check16, %loop.body11 + %33 = load i64, ptr %.anon8, align 8 + %add18 = add i64 %33, 1 + store i64 %add18, ptr %.anon8, align 8 + br label %loop.cond9 -loop.exit26: ; preds = %loop.cond13 - %54 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.4, i32 0, i32 0)) #2 - %55 = load i32, i32* %abc, align 4 - %56 = call i32 @llvm.bswap.i32(i32 %55) - %57 = and i32 65535, %56 - %ztrunc = trunc i32 %57 to i16 - store i16 %ztrunc, i16* %taddr29, align 2 - %58 = bitcast i16* %taddr29 to i8* - %59 = insertvalue %variant undef, i8* %58, 0 - %60 = insertvalue %variant %59, i64 ptrtoint (%.introspect* @"ct$ushort" to i64), 1 - %61 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots28, i64 0, i64 0 - store %variant %60, %variant* %61, align 16 - %62 = bitcast [1 x %variant]* %varargslots28 to %variant* - %63 = insertvalue %"variant[]" undef, %variant* %62, 0 - %64 = insertvalue %"variant[]" %63, i64 1, 1 - store %"variant[]" %64, %"variant[]"* %taddr30, align 8 - %65 = bitcast %"variant[]"* %taddr30 to { i8*, i64 }* - %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 - %lo31 = load i8*, i8** %66, align 8 - %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 - %hi32 = load i64, i64* %67, align 8 - %68 = call i64 @std_io_printfln(i64* %retparam27, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i64 10, i8* %lo31, i64 %hi32) - %not_err33 = icmp eq i64 %68, 0 - br i1 %not_err33, label %after_check34, label %voiderr35 +loop.exit19: ; preds = %loop.cond9 + %34 = call i32 @std_io_println(ptr @.str.4) #2 + %35 = load i32, ptr %abc, align 4 + %36 = call i32 @llvm.bswap.i32(i32 %35) + %37 = and i32 65535, %36 + %ztrunc = trunc i32 %37 to i16 + store i16 %ztrunc, ptr %taddr22, align 2 + %38 = insertvalue %variant undef, ptr %taddr22, 0 + %39 = insertvalue %variant %38, i64 ptrtoint (ptr @"ct$ushort" to i64), 1 + %40 = getelementptr inbounds [1 x %variant], ptr %varargslots21, i64 0, i64 0 + store %variant %39, ptr %40, align 16 + %41 = call i64 @std_io_printfn(ptr %retparam20, ptr @.str.5, i64 10, ptr %varargslots21, i64 1) + %not_err23 = icmp eq i64 %41, 0 + br i1 %not_err23, label %after_check24, label %voiderr25 -after_check34: ; preds = %loop.exit26 - br label %voiderr35 +after_check24: ; preds = %loop.exit19 + br label %voiderr25 -voiderr35: ; preds = %after_check34, %loop.exit26 - %69 = load i32, i32* %abc, align 4 - %70 = call i32 @llvm.bswap.i32(i32 %69) - %71 = and i32 %70, -65536 - %72 = or i32 %71, 4660 - %73 = call i32 @llvm.bswap.i32(i32 %72) - store i32 %73, i32* %abc, align 4 - %74 = load i32, i32* %abc, align 4 - %75 = call i32 @llvm.bswap.i32(i32 %74) - %76 = and i32 %75, 65535 - %77 = or i32 %76, 1450704896 - %78 = call i32 @llvm.bswap.i32(i32 %77) - store i32 %78, i32* %abc, align 4 - %79 = load i32, i32* %abc, align 4 - %80 = call i32 @llvm.bswap.i32(i32 %79) - %81 = and i32 65535, %80 - %ztrunc38 = trunc i32 %81 to i16 - store i16 %ztrunc38, i16* %taddr39, align 2 - %82 = bitcast i16* %taddr39 to i8* - %83 = insertvalue %variant undef, i8* %82, 0 - %84 = insertvalue %variant %83, i64 ptrtoint (%.introspect* @"ct$ushort" to i64), 1 - %85 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots37, i64 0, i64 0 - store %variant %84, %variant* %85, align 16 - %86 = bitcast [1 x %variant]* %varargslots37 to %variant* - %87 = insertvalue %"variant[]" undef, %variant* %86, 0 - %88 = insertvalue %"variant[]" %87, i64 1, 1 - store %"variant[]" %88, %"variant[]"* %taddr40, align 8 - %89 = bitcast %"variant[]"* %taddr40 to { i8*, i64 }* - %90 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 0 - %lo41 = load i8*, i8** %90, align 8 - %91 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 1 - %hi42 = load i64, i64* %91, align 8 - %92 = call i64 @std_io_printfln(i64* %retparam36, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0), i64 12, i8* %lo41, i64 %hi42) - %not_err43 = icmp eq i64 %92, 0 - br i1 %not_err43, label %after_check44, label %voiderr45 +voiderr25: ; preds = %after_check24, %loop.exit19 + %42 = load i32, ptr %abc, align 4 + %43 = call i32 @llvm.bswap.i32(i32 %42) + %44 = and i32 %43, -65536 + %45 = or i32 %44, 4660 + %46 = call i32 @llvm.bswap.i32(i32 %45) + store i32 %46, ptr %abc, align 4 + %47 = load i32, ptr %abc, align 4 + %48 = call i32 @llvm.bswap.i32(i32 %47) + %49 = and i32 %48, 65535 + %50 = or i32 %49, 1450704896 + %51 = call i32 @llvm.bswap.i32(i32 %50) + store i32 %51, ptr %abc, align 4 + %52 = load i32, ptr %abc, align 4 + %53 = call i32 @llvm.bswap.i32(i32 %52) + %54 = and i32 65535, %53 + %ztrunc28 = trunc i32 %54 to i16 + store i16 %ztrunc28, ptr %taddr29, align 2 + %55 = insertvalue %variant undef, ptr %taddr29, 0 + %56 = insertvalue %variant %55, i64 ptrtoint (ptr @"ct$ushort" to i64), 1 + %57 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0 + store %variant %56, ptr %57, align 16 + %58 = call i64 @std_io_printfn(ptr %retparam26, ptr @.str.6, i64 12, ptr %varargslots27, i64 1) + %not_err30 = icmp eq i64 %58, 0 + br i1 %not_err30, label %after_check31, label %voiderr32 -after_check44: ; preds = %voiderr35 - br label %voiderr45 +after_check31: ; preds = %voiderr25 + br label %voiderr32 -voiderr45: ; preds = %after_check44, %voiderr35 - %93 = load [4 x i8]*, [4 x i8]** %z, align 8 - store [4 x i8]* %93, [4 x i8]** %.anon46, align 8 - store i64 0, i64* %.anon47, align 8 - br label %loop.cond48 +voiderr32: ; preds = %after_check31, %voiderr25 + %59 = load ptr, ptr %z, align 8 + store ptr %59, ptr %.anon33, align 8 + store i64 0, ptr %.anon34, align 8 + br label %loop.cond35 -loop.cond48: ; preds = %voiderr59, %voiderr45 - %94 = load i64, i64* %.anon47, align 8 - %gt49 = icmp ugt i64 4, %94 - br i1 %gt49, label %loop.body50, label %loop.exit61 +loop.cond35: ; preds = %voiderr43, %voiderr32 + %60 = load i64, ptr %.anon34, align 8 + %gt36 = icmp ugt i64 4, %60 + br i1 %gt36, label %loop.body37, label %loop.exit45 -loop.body50: ; preds = %loop.cond48 - %95 = load [4 x i8]*, [4 x i8]** %.anon46, align 8 - %96 = load i64, i64* %.anon47, align 8 - %97 = getelementptr inbounds [4 x i8], [4 x i8]* %95, i64 0, i64 %96 - %98 = load i8, i8* %97, align 1 - store i8 %98, i8* %d51, align 1 - %99 = insertvalue %variant undef, i8* %d51, 0 - %100 = insertvalue %variant %99, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - %101 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots53, i64 0, i64 0 - store %variant %100, %variant* %101, align 16 - %102 = bitcast [1 x %variant]* %varargslots53 to %variant* - %103 = insertvalue %"variant[]" undef, %variant* %102, 0 - %104 = insertvalue %"variant[]" %103, i64 1, 1 - store %"variant[]" %104, %"variant[]"* %taddr54, align 8 - %105 = bitcast %"variant[]"* %taddr54 to { i8*, i64 }* - %106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 0 - %lo55 = load i8*, i8** %106, align 8 - %107 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 1 - %hi56 = load i64, i64* %107, align 8 - %108 = call i64 @std_io_printf(i64* %retparam52, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i32 0, i32 0), i64 3, i8* %lo55, i64 %hi56) - %not_err57 = icmp eq i64 %108, 0 - br i1 %not_err57, label %after_check58, label %voiderr59 +loop.body37: ; preds = %loop.cond35 + %61 = load ptr, ptr %.anon33, align 8 + %62 = load i64, ptr %.anon34, align 8 + %63 = getelementptr inbounds [4 x i8], ptr %61, i64 0, i64 %62 + %64 = load i8, ptr %63, align 1 + store i8 %64, ptr %d38, align 1 + %65 = insertvalue %variant undef, ptr %d38, 0 + %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$char" to i64), 1 + %67 = getelementptr inbounds [1 x %variant], ptr %varargslots40, i64 0, i64 0 + store %variant %66, ptr %67, align 16 + %68 = call i64 @std_io_printf(ptr %retparam39, ptr @.str.7, i64 3, ptr %varargslots40, i64 1) + %not_err41 = icmp eq i64 %68, 0 + br i1 %not_err41, label %after_check42, label %voiderr43 -after_check58: ; preds = %loop.body50 - br label %voiderr59 +after_check42: ; preds = %loop.body37 + br label %voiderr43 -voiderr59: ; preds = %after_check58, %loop.body50 - %109 = load i64, i64* %.anon47, align 8 - %add60 = add i64 %109, 1 - store i64 %add60, i64* %.anon47, align 8 - br label %loop.cond48 +voiderr43: ; preds = %after_check42, %loop.body37 + %69 = load i64, ptr %.anon34, align 8 + %add44 = add i64 %69, 1 + store i64 %add44, ptr %.anon34, align 8 + br label %loop.cond35 -loop.exit61: ; preds = %loop.cond48 - %110 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.8, i32 0, i32 0)) #2 - store i32 0, i32* %y, align 4 - %111 = load i32, i32* %y, align 4 - store i32 123, i32* %y, align 4 - %112 = bitcast i32* %y to i8* - %113 = insertvalue %variant undef, i8* %112, 0 - %114 = insertvalue %variant %113, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %115 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots63, i64 0, i64 0 - store %variant %114, %variant* %115, align 16 - %116 = load i32, i32* %y, align 4 - store i32 %116, i32* %taddr64, align 4 - %117 = bitcast i32* %taddr64 to i8* - %118 = insertvalue %variant undef, i8* %117, 0 - %119 = insertvalue %variant %118, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %120 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots63, i64 0, i64 1 - store %variant %119, %variant* %120, align 16 - %121 = bitcast [2 x %variant]* %varargslots63 to %variant* - %122 = insertvalue %"variant[]" undef, %variant* %121, 0 - %123 = insertvalue %"variant[]" %122, i64 2, 1 - store %"variant[]" %123, %"variant[]"* %taddr65, align 8 - %124 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* - %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 0 - %lo66 = load i8*, i8** %125, align 8 - %126 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 1 - %hi67 = load i64, i64* %126, align 8 - %127 = call i64 @std_io_printf(i64* %retparam62, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.9, i32 0, i32 0), i64 18, i8* %lo66, i64 %hi67) - %not_err68 = icmp eq i64 %127, 0 - br i1 %not_err68, label %after_check69, label %voiderr70 +loop.exit45: ; preds = %loop.cond35 + %70 = call i32 @std_io_println(ptr @.str.8) #2 + store i32 0, ptr %y, align 4 + %71 = load i32, ptr %y, align 4 + store i32 123, ptr %y, align 4 + %72 = insertvalue %variant undef, ptr %y, 0 + %73 = insertvalue %variant %72, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %74 = getelementptr inbounds [2 x %variant], ptr %varargslots47, i64 0, i64 0 + store %variant %73, ptr %74, align 16 + %75 = load i32, ptr %y, align 4 + store i32 %75, ptr %taddr48, align 4 + %76 = insertvalue %variant undef, ptr %taddr48, 0 + %77 = insertvalue %variant %76, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %78 = getelementptr inbounds [2 x %variant], ptr %varargslots47, i64 0, i64 1 + store %variant %77, ptr %78, align 16 + %79 = call i64 @std_io_printf(ptr %retparam46, ptr @.str.9, i64 18, ptr %varargslots47, i64 2) + %not_err49 = icmp eq i64 %79, 0 + br i1 %not_err49, label %after_check50, label %voiderr51 -after_check69: ; preds = %loop.exit61 - br label %voiderr70 +after_check50: ; preds = %loop.exit45 + br label %voiderr51 -voiderr70: ; preds = %after_check69, %loop.exit61 +voiderr51: ; preds = %after_check50, %loop.exit45 ret void } \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitstruct_init_bool.c3t b/test/test_suite/bitstruct/bitstruct_init_bool.c3t similarity index 100% rename from test/test_suite2/bitstruct/bitstruct_init_bool.c3t rename to test/test_suite/bitstruct/bitstruct_init_bool.c3t diff --git a/test/test_suite/bitstruct/bitstruct_initializer.c3t b/test/test_suite/bitstruct/bitstruct_initializer.c3t index 1887fb4bd..379a552ce 100644 --- a/test/test_suite/bitstruct/bitstruct_initializer.c3t +++ b/test/test_suite/bitstruct/bitstruct_initializer.c3t @@ -29,15 +29,15 @@ fn void hello(int z) Abc d = { .b = { 23, 11, true } }; Bar b; b = { .x = z, .w = z < 100 }; - io::printfln("%s %s %s", x.x, x.y, x.w); - io::printfln("%s %s %s", y.b.x, y.b.y, y.b.w); - io::printfln("%s %s %s", b.x, b.y, b.w); + io::printfn("%s %s %s", x.x, x.y, x.w); + io::printfn("%s %s %s", y.b.x, y.b.y, y.b.w); + io::printfn("%s %s %s", b.x, b.y, b.w); x = { z + 1, 1, z > 100 }; y.b = { 33, 11, true }; b = { z + 1, 1, z > 100 }; - io::printfln("%s %s %s", x.x, x.y, x.w); - io::printfln("%s %s %s", y.b.x, y.b.y, y.b.w); - io::printfln("%s %s %s", b.x, b.y, b.w); + io::printfn("%s %s %s", x.x, x.y, x.w); + io::printfn("%s %s %s", y.b.x, y.b.y, y.b.w); + io::printfn("%s %s %s", b.x, b.y, b.w); } @@ -59,38 +59,32 @@ entry: %taddr = alloca i32, align 4 %taddr13 = alloca i32, align 4 %taddr16 = alloca i8, align 1 - %taddr17 = alloca %"variant[]", align 8 - %retparam18 = alloca i64, align 8 - %varargslots19 = alloca [3 x %variant], align 16 - %taddr21 = alloca i32, align 4 - %taddr24 = alloca i32, align 4 - %taddr27 = alloca i8, align 1 - %taddr28 = alloca %"variant[]", align 8 - %retparam34 = alloca i64, align 8 - %varargslots35 = alloca [3 x %variant], align 16 - %taddr43 = alloca i32, align 4 - %taddr51 = alloca i32, align 4 - %taddr53 = alloca i8, align 1 - %taddr54 = alloca %"variant[]", align 8 - %retparam74 = alloca i64, align 8 - %varargslots75 = alloca [3 x %variant], align 16 - %taddr77 = alloca i32, align 4 - %taddr80 = alloca i32, align 4 - %taddr83 = alloca i8, align 1 - %taddr84 = alloca %"variant[]", align 8 - %retparam90 = alloca i64, align 8 - %varargslots91 = alloca [3 x %variant], align 16 - %taddr93 = alloca i32, align 4 - %taddr96 = alloca i32, align 4 - %taddr99 = alloca i8, align 1 - %taddr100 = alloca %"variant[]", align 8 - %retparam106 = alloca i64, align 8 - %varargslots107 = alloca [3 x %variant], align 16 - %taddr115 = alloca i32, align 4 - %taddr123 = alloca i32, align 4 - %taddr125 = alloca i8, align 1 - %taddr126 = alloca %"variant[]", align 8 - store i64 0, i64* %x, align 8 + %retparam17 = alloca i64, align 8 + %varargslots18 = alloca [3 x %variant], align 16 + %taddr20 = alloca i32, align 4 + %taddr23 = alloca i32, align 4 + %taddr26 = alloca i8, align 1 + %retparam30 = alloca i64, align 8 + %varargslots31 = alloca [3 x %variant], align 16 + %taddr39 = alloca i32, align 4 + %taddr47 = alloca i32, align 4 + %taddr49 = alloca i8, align 1 + %retparam67 = alloca i64, align 8 + %varargslots68 = alloca [3 x %variant], align 16 + %taddr70 = alloca i32, align 4 + %taddr73 = alloca i32, align 4 + %taddr76 = alloca i8, align 1 + %retparam80 = alloca i64, align 8 + %varargslots81 = alloca [3 x %variant], align 16 + %taddr83 = alloca i32, align 4 + %taddr86 = alloca i32, align 4 + %taddr89 = alloca i8, align 1 + %retparam93 = alloca i64, align 8 + %varargslots94 = alloca [3 x %variant], align 16 + %taddr102 = alloca i32, align 4 + %taddr110 = alloca i32, align 4 + %taddr112 = alloca i8, align 1 + store i64 0, ptr %x, align 8 %zext = zext i32 %0 to i64 %1 = and i64 %zext, 4294967295 %lt = icmp slt i32 %0, 100 @@ -100,470 +94,409 @@ entry: %3 = and i64 %shl, -9223372036854775808 %4 = and i64 %1, 9223372036854775807 %5 = or i64 %4, %3 - store i64 %5, i64* %x, align 8 - %6 = bitcast %Abc* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %6, i8* align 8 bitcast (%Abc* @.__const to i8*), i32 16, i1 false) - %7 = bitcast %Abc* %d to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %7, i8* align 8 bitcast (%Abc* @.__const.1 to i8*), i32 16, i1 false) - %8 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 - store i8 0, i8* %8, align 1 - %9 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 - store i8 0, i8* %9, align 1 - %10 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 - store i8 0, i8* %10, align 1 - %11 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 - store i8 0, i8* %11, align 1 - %12 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 - store i8 0, i8* %12, align 1 - %13 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 - store i8 0, i8* %13, align 1 - %14 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 - store i8 0, i8* %14, align 1 - %15 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - store i8 0, i8* %15, align 1 - %16 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 - store i8 0, i8* %16, align 1 - %17 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 - store i8 0, i8* %17, align 1 - %18 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 - store i8 0, i8* %18, align 1 - %19 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 - store i8 0, i8* %19, align 1 - %20 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 - store i8 0, i8* %20, align 1 - %21 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 - store i8 0, i8* %21, align 1 - %22 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 - store i8 0, i8* %22, align 1 - %23 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - store i8 0, i8* %23, align 1 - %24 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + store i64 %5, ptr %x, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %y, ptr align 8 @.__const, i32 16, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %d, ptr align 8 @.__const.1, i32 16, i1 false) + %6 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 + store i8 0, ptr %6, align 1 + %7 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 + store i8 0, ptr %7, align 1 + %8 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 + store i8 0, ptr %8, align 1 + %9 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 + store i8 0, ptr %9, align 1 + %10 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 + store i8 0, ptr %10, align 1 + %11 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 + store i8 0, ptr %11, align 1 + %12 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 + store i8 0, ptr %12, align 1 + %13 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + store i8 0, ptr %13, align 1 + %14 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 + store i8 0, ptr %14, align 1 + %15 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 + store i8 0, ptr %15, align 1 + %16 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 + store i8 0, ptr %16, align 1 + %17 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 + store i8 0, ptr %17, align 1 + %18 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 + store i8 0, ptr %18, align 1 + %19 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 + store i8 0, ptr %19, align 1 + %20 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 + store i8 0, ptr %20, align 1 + %21 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + store i8 0, ptr %21, align 1 + %22 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 %ztrunc = trunc i32 %0 to i8 - store i8 %ztrunc, i8* %24, align 1 + store i8 %ztrunc, ptr %22, align 1 %lshrl = lshr i32 %0, 8 - %25 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + %23 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 %ztrunc2 = trunc i32 %lshrl to i8 - store i8 %ztrunc2, i8* %25, align 1 + store i8 %ztrunc2, ptr %23, align 1 %lshrl3 = lshr i32 %lshrl, 8 - %26 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + %24 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 %ztrunc4 = trunc i32 %lshrl3 to i8 - store i8 %ztrunc4, i8* %26, align 1 + store i8 %ztrunc4, ptr %24, align 1 %lshrl5 = lshr i32 %lshrl3, 8 - %27 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + %25 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 %ztrunc6 = trunc i32 %lshrl5 to i8 - store i8 %ztrunc6, i8* %27, align 1 + store i8 %ztrunc6, ptr %25, align 1 %lshrl7 = lshr i32 %lshrl5, 8 %lt8 = icmp slt i32 %0, 100 - %28 = zext i1 %lt8 to i8 - %shl9 = shl i8 %28, 7 - %29 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %30 = load i8, i8* %29, align 1 - %31 = and i8 %30, 127 - %32 = or i8 %31, %shl9 - store i8 %32, i8* %29, align 1 - %33 = load i64, i64* %x, align 8 - %34 = and i64 4294967295, %33 - %ztrunc10 = trunc i64 %34 to i32 - store i32 %ztrunc10, i32* %taddr, align 4 - %35 = bitcast i32* %taddr to i8* - %36 = insertvalue %variant undef, i8* %35, 0 - %37 = insertvalue %variant %36, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %38 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots, i64 0, i64 0 - store %variant %37, %variant* %38, align 16 - %39 = load i64, i64* %x, align 8 - %lshrl11 = lshr i64 %39, 32 - %40 = and i64 2147483647, %lshrl11 - %ztrunc12 = trunc i64 %40 to i32 - store i32 %ztrunc12, i32* %taddr13, align 4 - %41 = bitcast i32* %taddr13 to i8* - %42 = insertvalue %variant undef, i8* %41, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %44 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots, i64 0, i64 1 - store %variant %43, %variant* %44, align 16 - %45 = load i64, i64* %x, align 8 - %lshrl14 = lshr i64 %45, 63 - %46 = and i64 1, %lshrl14 - %ztrunc15 = trunc i64 %46 to i8 - store i8 %ztrunc15, i8* %taddr16, align 1 - %47 = insertvalue %variant undef, i8* %taddr16, 0 - %48 = insertvalue %variant %47, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %49 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots, i64 0, i64 2 - store %variant %48, %variant* %49, align 16 - %50 = bitcast [3 x %variant]* %varargslots to %variant* - %51 = insertvalue %"variant[]" undef, %variant* %50, 0 - %52 = insertvalue %"variant[]" %51, i64 3, 1 - store %"variant[]" %52, %"variant[]"* %taddr17, align 8 - %53 = bitcast %"variant[]"* %taddr17 to { i8*, i64 }* - %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 0 - %lo = load i8*, i8** %54, align 8 - %55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 1 - %hi = load i64, i64* %55, align 8 - %56 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %56, 0 + %26 = zext i1 %lt8 to i8 + %shl9 = shl i8 %26, 7 + %27 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %28 = load i8, ptr %27, align 1 + %29 = and i8 %28, 127 + %30 = or i8 %29, %shl9 + store i8 %30, ptr %27, align 1 + %31 = load i64, ptr %x, align 8 + %32 = and i64 4294967295, %31 + %ztrunc10 = trunc i64 %32 to i32 + store i32 %ztrunc10, ptr %taddr, align 4 + %33 = insertvalue %variant undef, ptr %taddr, 0 + %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %35 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %34, ptr %35, align 16 + %36 = load i64, ptr %x, align 8 + %lshrl11 = lshr i64 %36, 32 + %37 = and i64 2147483647, %lshrl11 + %ztrunc12 = trunc i64 %37 to i32 + store i32 %ztrunc12, ptr %taddr13, align 4 + %38 = insertvalue %variant undef, ptr %taddr13, 0 + %39 = insertvalue %variant %38, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %40 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %39, ptr %40, align 16 + %41 = load i64, ptr %x, align 8 + %lshrl14 = lshr i64 %41, 63 + %42 = and i64 1, %lshrl14 + %ztrunc15 = trunc i64 %42 to i8 + store i8 %ztrunc15, ptr %taddr16, align 1 + %43 = insertvalue %variant undef, ptr %taddr16, 0 + %44 = insertvalue %variant %43, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %45 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 2 + store %variant %44, ptr %45, align 16 + %46 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 3) + %not_err = icmp eq i64 %46, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %57 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - %58 = load i64, i64* %57, align 8 - %59 = and i64 4294967295, %58 - %ztrunc20 = trunc i64 %59 to i32 - store i32 %ztrunc20, i32* %taddr21, align 4 - %60 = bitcast i32* %taddr21 to i8* - %61 = insertvalue %variant undef, i8* %60, 0 - %62 = insertvalue %variant %61, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %63 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots19, i64 0, i64 0 - store %variant %62, %variant* %63, align 16 - %64 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - %65 = load i64, i64* %64, align 8 - %lshrl22 = lshr i64 %65, 32 - %66 = and i64 2147483647, %lshrl22 - %ztrunc23 = trunc i64 %66 to i32 - store i32 %ztrunc23, i32* %taddr24, align 4 - %67 = bitcast i32* %taddr24 to i8* - %68 = insertvalue %variant undef, i8* %67, 0 - %69 = insertvalue %variant %68, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %70 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots19, i64 0, i64 1 - store %variant %69, %variant* %70, align 16 - %71 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - %72 = load i64, i64* %71, align 8 - %lshrl25 = lshr i64 %72, 63 - %73 = and i64 1, %lshrl25 - %ztrunc26 = trunc i64 %73 to i8 - store i8 %ztrunc26, i8* %taddr27, align 1 - %74 = insertvalue %variant undef, i8* %taddr27, 0 - %75 = insertvalue %variant %74, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %76 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots19, i64 0, i64 2 - store %variant %75, %variant* %76, align 16 - %77 = bitcast [3 x %variant]* %varargslots19 to %variant* - %78 = insertvalue %"variant[]" undef, %variant* %77, 0 - %79 = insertvalue %"variant[]" %78, i64 3, 1 - store %"variant[]" %79, %"variant[]"* %taddr28, align 8 - %80 = bitcast %"variant[]"* %taddr28 to { i8*, i64 }* - %81 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 0 - %lo29 = load i8*, i8** %81, align 8 - %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 1 - %hi30 = load i64, i64* %82, align 8 - %83 = call i64 @std_io_printfln(i64* %retparam18, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i32 0, i32 0), i64 8, i8* %lo29, i64 %hi30) - %not_err31 = icmp eq i64 %83, 0 - br i1 %not_err31, label %after_check32, label %voiderr33 + %47 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + %48 = load i64, ptr %47, align 8 + %49 = and i64 4294967295, %48 + %ztrunc19 = trunc i64 %49 to i32 + store i32 %ztrunc19, ptr %taddr20, align 4 + %50 = insertvalue %variant undef, ptr %taddr20, 0 + %51 = insertvalue %variant %50, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %52 = getelementptr inbounds [3 x %variant], ptr %varargslots18, i64 0, i64 0 + store %variant %51, ptr %52, align 16 + %53 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + %54 = load i64, ptr %53, align 8 + %lshrl21 = lshr i64 %54, 32 + %55 = and i64 2147483647, %lshrl21 + %ztrunc22 = trunc i64 %55 to i32 + store i32 %ztrunc22, ptr %taddr23, align 4 + %56 = insertvalue %variant undef, ptr %taddr23, 0 + %57 = insertvalue %variant %56, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %58 = getelementptr inbounds [3 x %variant], ptr %varargslots18, i64 0, i64 1 + store %variant %57, ptr %58, align 16 + %59 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + %60 = load i64, ptr %59, align 8 + %lshrl24 = lshr i64 %60, 63 + %61 = and i64 1, %lshrl24 + %ztrunc25 = trunc i64 %61 to i8 + store i8 %ztrunc25, ptr %taddr26, align 1 + %62 = insertvalue %variant undef, ptr %taddr26, 0 + %63 = insertvalue %variant %62, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %64 = getelementptr inbounds [3 x %variant], ptr %varargslots18, i64 0, i64 2 + store %variant %63, ptr %64, align 16 + %65 = call i64 @std_io_printfn(ptr %retparam17, ptr @.str.2, i64 8, ptr %varargslots18, i64 3) + %not_err27 = icmp eq i64 %65, 0 + br i1 %not_err27, label %after_check28, label %voiderr29 -after_check32: ; preds = %voiderr - br label %voiderr33 +after_check28: ; preds = %voiderr + br label %voiderr29 -voiderr33: ; preds = %after_check32, %voiderr - %84 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 - %85 = load i8, i8* %84, align 1 - %zext36 = zext i8 %85 to i32 - %86 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 - %87 = load i8, i8* %86, align 1 - %zext37 = zext i8 %87 to i32 - %shl38 = shl i32 %zext37, 8 - %88 = or i32 %shl38, %zext36 - %89 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 - %90 = load i8, i8* %89, align 1 - %zext39 = zext i8 %90 to i32 - %shl40 = shl i32 %zext39, 16 - %91 = or i32 %shl40, %88 - %92 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 - %93 = load i8, i8* %92, align 1 - %zext41 = zext i8 %93 to i32 - %shl42 = shl i32 %zext41, 24 - %94 = or i32 %shl42, %91 - store i32 %94, i32* %taddr43, align 4 - %95 = bitcast i32* %taddr43 to i8* - %96 = insertvalue %variant undef, i8* %95, 0 - %97 = insertvalue %variant %96, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %98 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots35, i64 0, i64 0 - store %variant %97, %variant* %98, align 16 - %99 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 - %100 = load i8, i8* %99, align 1 - %zext44 = zext i8 %100 to i32 - %101 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 - %102 = load i8, i8* %101, align 1 - %zext45 = zext i8 %102 to i32 - %shl46 = shl i32 %zext45, 8 - %103 = or i32 %shl46, %zext44 - %104 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 - %105 = load i8, i8* %104, align 1 - %zext47 = zext i8 %105 to i32 - %shl48 = shl i32 %zext47, 16 - %106 = or i32 %shl48, %103 - %107 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %108 = load i8, i8* %107, align 1 - %zext49 = zext i8 %108 to i32 - %shl50 = shl i32 %zext49, 24 - %109 = or i32 %shl50, %106 - %110 = and i32 2147483647, %109 - store i32 %110, i32* %taddr51, align 4 - %111 = bitcast i32* %taddr51 to i8* - %112 = insertvalue %variant undef, i8* %111, 0 - %113 = insertvalue %variant %112, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %114 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots35, i64 0, i64 1 - store %variant %113, %variant* %114, align 16 - %115 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %116 = load i8, i8* %115, align 1 - %lshrl52 = lshr i8 %116, 7 - %117 = trunc i8 %lshrl52 to i1 - %118 = zext i1 %117 to i8 - store i8 %118, i8* %taddr53, align 1 - %119 = insertvalue %variant undef, i8* %taddr53, 0 - %120 = insertvalue %variant %119, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %121 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots35, i64 0, i64 2 - store %variant %120, %variant* %121, align 16 - %122 = bitcast [3 x %variant]* %varargslots35 to %variant* - %123 = insertvalue %"variant[]" undef, %variant* %122, 0 - %124 = insertvalue %"variant[]" %123, i64 3, 1 - store %"variant[]" %124, %"variant[]"* %taddr54, align 8 - %125 = bitcast %"variant[]"* %taddr54 to { i8*, i64 }* - %126 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %125, i32 0, i32 0 - %lo55 = load i8*, i8** %126, align 8 - %127 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %125, i32 0, i32 1 - %hi56 = load i64, i64* %127, align 8 - %128 = call i64 @std_io_printfln(i64* %retparam34, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i64 8, i8* %lo55, i64 %hi56) - %not_err57 = icmp eq i64 %128, 0 - br i1 %not_err57, label %after_check58, label %voiderr59 +voiderr29: ; preds = %after_check28, %voiderr + %66 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 + %67 = load i8, ptr %66, align 1 + %zext32 = zext i8 %67 to i32 + %68 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 + %69 = load i8, ptr %68, align 1 + %zext33 = zext i8 %69 to i32 + %shl34 = shl i32 %zext33, 8 + %70 = or i32 %shl34, %zext32 + %71 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 + %72 = load i8, ptr %71, align 1 + %zext35 = zext i8 %72 to i32 + %shl36 = shl i32 %zext35, 16 + %73 = or i32 %shl36, %70 + %74 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 + %75 = load i8, ptr %74, align 1 + %zext37 = zext i8 %75 to i32 + %shl38 = shl i32 %zext37, 24 + %76 = or i32 %shl38, %73 + store i32 %76, ptr %taddr39, align 4 + %77 = insertvalue %variant undef, ptr %taddr39, 0 + %78 = insertvalue %variant %77, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %79 = getelementptr inbounds [3 x %variant], ptr %varargslots31, i64 0, i64 0 + store %variant %78, ptr %79, align 16 + %80 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 + %81 = load i8, ptr %80, align 1 + %zext40 = zext i8 %81 to i32 + %82 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 + %83 = load i8, ptr %82, align 1 + %zext41 = zext i8 %83 to i32 + %shl42 = shl i32 %zext41, 8 + %84 = or i32 %shl42, %zext40 + %85 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 + %86 = load i8, ptr %85, align 1 + %zext43 = zext i8 %86 to i32 + %shl44 = shl i32 %zext43, 16 + %87 = or i32 %shl44, %84 + %88 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %89 = load i8, ptr %88, align 1 + %zext45 = zext i8 %89 to i32 + %shl46 = shl i32 %zext45, 24 + %90 = or i32 %shl46, %87 + %91 = and i32 2147483647, %90 + store i32 %91, ptr %taddr47, align 4 + %92 = insertvalue %variant undef, ptr %taddr47, 0 + %93 = insertvalue %variant %92, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %94 = getelementptr inbounds [3 x %variant], ptr %varargslots31, i64 0, i64 1 + store %variant %93, ptr %94, align 16 + %95 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %96 = load i8, ptr %95, align 1 + %lshrl48 = lshr i8 %96, 7 + %97 = trunc i8 %lshrl48 to i1 + %98 = zext i1 %97 to i8 + store i8 %98, ptr %taddr49, align 1 + %99 = insertvalue %variant undef, ptr %taddr49, 0 + %100 = insertvalue %variant %99, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %101 = getelementptr inbounds [3 x %variant], ptr %varargslots31, i64 0, i64 2 + store %variant %100, ptr %101, align 16 + %102 = call i64 @std_io_printfn(ptr %retparam30, ptr @.str.3, i64 8, ptr %varargslots31, i64 3) + %not_err50 = icmp eq i64 %102, 0 + br i1 %not_err50, label %after_check51, label %voiderr52 -after_check58: ; preds = %voiderr33 - br label %voiderr59 +after_check51: ; preds = %voiderr29 + br label %voiderr52 -voiderr59: ; preds = %after_check58, %voiderr33 +voiderr52: ; preds = %after_check51, %voiderr29 %add = add i32 %0, 1 - %zext60 = zext i32 %add to i64 - %129 = and i64 %zext60, 4294967295 - %130 = and i64 %129, -9223372032559808513 - %131 = or i64 %130, 4294967296 + %zext53 = zext i32 %add to i64 + %103 = and i64 %zext53, 4294967295 + %104 = and i64 %103, -9223372032559808513 + %105 = or i64 %104, 4294967296 %gt = icmp sgt i32 %0, 100 - %132 = zext i1 %gt to i8 - %zext61 = zext i8 %132 to i64 - %shl62 = shl i64 %zext61, 63 - %133 = and i64 %shl62, -9223372036854775808 - %134 = and i64 %131, 9223372036854775807 - %135 = or i64 %134, %133 - store i64 %135, i64* %x, align 8 - %136 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - store i64 -9223371989610135519, i64* %136, align 8 - %137 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 - store i8 0, i8* %137, align 1 - %138 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 - store i8 0, i8* %138, align 1 - %139 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 - store i8 0, i8* %139, align 1 - %140 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 - store i8 0, i8* %140, align 1 - %141 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 - store i8 0, i8* %141, align 1 - %142 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 - store i8 0, i8* %142, align 1 - %143 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 - store i8 0, i8* %143, align 1 - %144 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - store i8 0, i8* %144, align 1 - %add63 = add i32 %0, 1 - %145 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 - %ztrunc64 = trunc i32 %add63 to i8 - store i8 %ztrunc64, i8* %145, align 1 - %lshrl65 = lshr i32 %add63, 8 - %146 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 - %ztrunc66 = trunc i32 %lshrl65 to i8 - store i8 %ztrunc66, i8* %146, align 1 - %lshrl67 = lshr i32 %lshrl65, 8 - %147 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 - %ztrunc68 = trunc i32 %lshrl67 to i8 - store i8 %ztrunc68, i8* %147, align 1 - %lshrl69 = lshr i32 %lshrl67, 8 - %148 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 - %ztrunc70 = trunc i32 %lshrl69 to i8 - store i8 %ztrunc70, i8* %148, align 1 - %lshrl71 = lshr i32 %lshrl69, 8 - %149 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 - store i8 1, i8* %149, align 1 - %150 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 - store i8 0, i8* %150, align 1 - %151 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 - store i8 0, i8* %151, align 1 - %152 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %153 = load i8, i8* %152, align 1 - %154 = and i8 %153, -128 - store i8 %154, i8* %152, align 1 - %gt72 = icmp sgt i32 %0, 100 - %155 = zext i1 %gt72 to i8 - %shl73 = shl i8 %155, 7 - %156 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %157 = load i8, i8* %156, align 1 - %158 = and i8 %157, 127 - %159 = or i8 %158, %shl73 - store i8 %159, i8* %156, align 1 - %160 = load i64, i64* %x, align 8 - %161 = and i64 4294967295, %160 - %ztrunc76 = trunc i64 %161 to i32 - store i32 %ztrunc76, i32* %taddr77, align 4 - %162 = bitcast i32* %taddr77 to i8* - %163 = insertvalue %variant undef, i8* %162, 0 - %164 = insertvalue %variant %163, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %165 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots75, i64 0, i64 0 - store %variant %164, %variant* %165, align 16 - %166 = load i64, i64* %x, align 8 - %lshrl78 = lshr i64 %166, 32 - %167 = and i64 2147483647, %lshrl78 - %ztrunc79 = trunc i64 %167 to i32 - store i32 %ztrunc79, i32* %taddr80, align 4 - %168 = bitcast i32* %taddr80 to i8* - %169 = insertvalue %variant undef, i8* %168, 0 - %170 = insertvalue %variant %169, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %171 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots75, i64 0, i64 1 - store %variant %170, %variant* %171, align 16 - %172 = load i64, i64* %x, align 8 - %lshrl81 = lshr i64 %172, 63 - %173 = and i64 1, %lshrl81 - %ztrunc82 = trunc i64 %173 to i8 - store i8 %ztrunc82, i8* %taddr83, align 1 - %174 = insertvalue %variant undef, i8* %taddr83, 0 - %175 = insertvalue %variant %174, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %176 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots75, i64 0, i64 2 - store %variant %175, %variant* %176, align 16 - %177 = bitcast [3 x %variant]* %varargslots75 to %variant* - %178 = insertvalue %"variant[]" undef, %variant* %177, 0 - %179 = insertvalue %"variant[]" %178, i64 3, 1 - store %"variant[]" %179, %"variant[]"* %taddr84, align 8 - %180 = bitcast %"variant[]"* %taddr84 to { i8*, i64 }* - %181 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %180, i32 0, i32 0 - %lo85 = load i8*, i8** %181, align 8 - %182 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %180, i32 0, i32 1 - %hi86 = load i64, i64* %182, align 8 - %183 = call i64 @std_io_printfln(i64* %retparam74, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i32 0, i32 0), i64 8, i8* %lo85, i64 %hi86) - %not_err87 = icmp eq i64 %183, 0 - br i1 %not_err87, label %after_check88, label %voiderr89 + %106 = zext i1 %gt to i8 + %zext54 = zext i8 %106 to i64 + %shl55 = shl i64 %zext54, 63 + %107 = and i64 %shl55, -9223372036854775808 + %108 = and i64 %105, 9223372036854775807 + %109 = or i64 %108, %107 + store i64 %109, ptr %x, align 8 + %110 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + store i64 -9223371989610135519, ptr %110, align 8 + %111 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 + store i8 0, ptr %111, align 1 + %112 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 + store i8 0, ptr %112, align 1 + %113 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 + store i8 0, ptr %113, align 1 + %114 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 + store i8 0, ptr %114, align 1 + %115 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 + store i8 0, ptr %115, align 1 + %116 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 + store i8 0, ptr %116, align 1 + %117 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 + store i8 0, ptr %117, align 1 + %118 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + store i8 0, ptr %118, align 1 + %add56 = add i32 %0, 1 + %119 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 + %ztrunc57 = trunc i32 %add56 to i8 + store i8 %ztrunc57, ptr %119, align 1 + %lshrl58 = lshr i32 %add56, 8 + %120 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 + %ztrunc59 = trunc i32 %lshrl58 to i8 + store i8 %ztrunc59, ptr %120, align 1 + %lshrl60 = lshr i32 %lshrl58, 8 + %121 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 + %ztrunc61 = trunc i32 %lshrl60 to i8 + store i8 %ztrunc61, ptr %121, align 1 + %lshrl62 = lshr i32 %lshrl60, 8 + %122 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 + %ztrunc63 = trunc i32 %lshrl62 to i8 + store i8 %ztrunc63, ptr %122, align 1 + %lshrl64 = lshr i32 %lshrl62, 8 + %123 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 + store i8 1, ptr %123, align 1 + %124 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 + store i8 0, ptr %124, align 1 + %125 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 + store i8 0, ptr %125, align 1 + %126 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %127 = load i8, ptr %126, align 1 + %128 = and i8 %127, -128 + store i8 %128, ptr %126, align 1 + %gt65 = icmp sgt i32 %0, 100 + %129 = zext i1 %gt65 to i8 + %shl66 = shl i8 %129, 7 + %130 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %131 = load i8, ptr %130, align 1 + %132 = and i8 %131, 127 + %133 = or i8 %132, %shl66 + store i8 %133, ptr %130, align 1 + %134 = load i64, ptr %x, align 8 + %135 = and i64 4294967295, %134 + %ztrunc69 = trunc i64 %135 to i32 + store i32 %ztrunc69, ptr %taddr70, align 4 + %136 = insertvalue %variant undef, ptr %taddr70, 0 + %137 = insertvalue %variant %136, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %138 = getelementptr inbounds [3 x %variant], ptr %varargslots68, i64 0, i64 0 + store %variant %137, ptr %138, align 16 + %139 = load i64, ptr %x, align 8 + %lshrl71 = lshr i64 %139, 32 + %140 = and i64 2147483647, %lshrl71 + %ztrunc72 = trunc i64 %140 to i32 + store i32 %ztrunc72, ptr %taddr73, align 4 + %141 = insertvalue %variant undef, ptr %taddr73, 0 + %142 = insertvalue %variant %141, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %143 = getelementptr inbounds [3 x %variant], ptr %varargslots68, i64 0, i64 1 + store %variant %142, ptr %143, align 16 + %144 = load i64, ptr %x, align 8 + %lshrl74 = lshr i64 %144, 63 + %145 = and i64 1, %lshrl74 + %ztrunc75 = trunc i64 %145 to i8 + store i8 %ztrunc75, ptr %taddr76, align 1 + %146 = insertvalue %variant undef, ptr %taddr76, 0 + %147 = insertvalue %variant %146, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %148 = getelementptr inbounds [3 x %variant], ptr %varargslots68, i64 0, i64 2 + store %variant %147, ptr %148, align 16 + %149 = call i64 @std_io_printfn(ptr %retparam67, ptr @.str.4, i64 8, ptr %varargslots68, i64 3) + %not_err77 = icmp eq i64 %149, 0 + br i1 %not_err77, label %after_check78, label %voiderr79 -after_check88: ; preds = %voiderr59 - br label %voiderr89 +after_check78: ; preds = %voiderr52 + br label %voiderr79 -voiderr89: ; preds = %after_check88, %voiderr59 - %184 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - %185 = load i64, i64* %184, align 8 - %186 = and i64 4294967295, %185 - %ztrunc92 = trunc i64 %186 to i32 - store i32 %ztrunc92, i32* %taddr93, align 4 - %187 = bitcast i32* %taddr93 to i8* - %188 = insertvalue %variant undef, i8* %187, 0 - %189 = insertvalue %variant %188, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %190 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots91, i64 0, i64 0 - store %variant %189, %variant* %190, align 16 - %191 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - %192 = load i64, i64* %191, align 8 - %lshrl94 = lshr i64 %192, 32 - %193 = and i64 2147483647, %lshrl94 - %ztrunc95 = trunc i64 %193 to i32 - store i32 %ztrunc95, i32* %taddr96, align 4 - %194 = bitcast i32* %taddr96 to i8* - %195 = insertvalue %variant undef, i8* %194, 0 - %196 = insertvalue %variant %195, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %197 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots91, i64 0, i64 1 - store %variant %196, %variant* %197, align 16 - %198 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 - %199 = load i64, i64* %198, align 8 - %lshrl97 = lshr i64 %199, 63 - %200 = and i64 1, %lshrl97 - %ztrunc98 = trunc i64 %200 to i8 - store i8 %ztrunc98, i8* %taddr99, align 1 - %201 = insertvalue %variant undef, i8* %taddr99, 0 - %202 = insertvalue %variant %201, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %203 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots91, i64 0, i64 2 - store %variant %202, %variant* %203, align 16 - %204 = bitcast [3 x %variant]* %varargslots91 to %variant* - %205 = insertvalue %"variant[]" undef, %variant* %204, 0 - %206 = insertvalue %"variant[]" %205, i64 3, 1 - store %"variant[]" %206, %"variant[]"* %taddr100, align 8 - %207 = bitcast %"variant[]"* %taddr100 to { i8*, i64 }* - %208 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %207, i32 0, i32 0 - %lo101 = load i8*, i8** %208, align 8 - %209 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %207, i32 0, i32 1 - %hi102 = load i64, i64* %209, align 8 - %210 = call i64 @std_io_printfln(i64* %retparam90, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i32 0, i32 0), i64 8, i8* %lo101, i64 %hi102) - %not_err103 = icmp eq i64 %210, 0 - br i1 %not_err103, label %after_check104, label %voiderr105 +voiderr79: ; preds = %after_check78, %voiderr52 + %150 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + %151 = load i64, ptr %150, align 8 + %152 = and i64 4294967295, %151 + %ztrunc82 = trunc i64 %152 to i32 + store i32 %ztrunc82, ptr %taddr83, align 4 + %153 = insertvalue %variant undef, ptr %taddr83, 0 + %154 = insertvalue %variant %153, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %155 = getelementptr inbounds [3 x %variant], ptr %varargslots81, i64 0, i64 0 + store %variant %154, ptr %155, align 16 + %156 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + %157 = load i64, ptr %156, align 8 + %lshrl84 = lshr i64 %157, 32 + %158 = and i64 2147483647, %lshrl84 + %ztrunc85 = trunc i64 %158 to i32 + store i32 %ztrunc85, ptr %taddr86, align 4 + %159 = insertvalue %variant undef, ptr %taddr86, 0 + %160 = insertvalue %variant %159, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %161 = getelementptr inbounds [3 x %variant], ptr %varargslots81, i64 0, i64 1 + store %variant %160, ptr %161, align 16 + %162 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 + %163 = load i64, ptr %162, align 8 + %lshrl87 = lshr i64 %163, 63 + %164 = and i64 1, %lshrl87 + %ztrunc88 = trunc i64 %164 to i8 + store i8 %ztrunc88, ptr %taddr89, align 1 + %165 = insertvalue %variant undef, ptr %taddr89, 0 + %166 = insertvalue %variant %165, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %167 = getelementptr inbounds [3 x %variant], ptr %varargslots81, i64 0, i64 2 + store %variant %166, ptr %167, align 16 + %168 = call i64 @std_io_printfn(ptr %retparam80, ptr @.str.5, i64 8, ptr %varargslots81, i64 3) + %not_err90 = icmp eq i64 %168, 0 + br i1 %not_err90, label %after_check91, label %voiderr92 -after_check104: ; preds = %voiderr89 - br label %voiderr105 +after_check91: ; preds = %voiderr79 + br label %voiderr92 -voiderr105: ; preds = %after_check104, %voiderr89 - %211 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 - %212 = load i8, i8* %211, align 1 - %zext108 = zext i8 %212 to i32 - %213 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 - %214 = load i8, i8* %213, align 1 - %zext109 = zext i8 %214 to i32 - %shl110 = shl i32 %zext109, 8 - %215 = or i32 %shl110, %zext108 - %216 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 - %217 = load i8, i8* %216, align 1 - %zext111 = zext i8 %217 to i32 - %shl112 = shl i32 %zext111, 16 - %218 = or i32 %shl112, %215 - %219 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 - %220 = load i8, i8* %219, align 1 - %zext113 = zext i8 %220 to i32 - %shl114 = shl i32 %zext113, 24 - %221 = or i32 %shl114, %218 - store i32 %221, i32* %taddr115, align 4 - %222 = bitcast i32* %taddr115 to i8* - %223 = insertvalue %variant undef, i8* %222, 0 - %224 = insertvalue %variant %223, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %225 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots107, i64 0, i64 0 - store %variant %224, %variant* %225, align 16 - %226 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 - %227 = load i8, i8* %226, align 1 - %zext116 = zext i8 %227 to i32 - %228 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 - %229 = load i8, i8* %228, align 1 - %zext117 = zext i8 %229 to i32 - %shl118 = shl i32 %zext117, 8 - %230 = or i32 %shl118, %zext116 - %231 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 - %232 = load i8, i8* %231, align 1 - %zext119 = zext i8 %232 to i32 - %shl120 = shl i32 %zext119, 16 - %233 = or i32 %shl120, %230 - %234 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %235 = load i8, i8* %234, align 1 - %zext121 = zext i8 %235 to i32 - %shl122 = shl i32 %zext121, 24 - %236 = or i32 %shl122, %233 - %237 = and i32 2147483647, %236 - store i32 %237, i32* %taddr123, align 4 - %238 = bitcast i32* %taddr123 to i8* - %239 = insertvalue %variant undef, i8* %238, 0 - %240 = insertvalue %variant %239, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %241 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots107, i64 0, i64 1 - store %variant %240, %variant* %241, align 16 - %242 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 - %243 = load i8, i8* %242, align 1 - %lshrl124 = lshr i8 %243, 7 - %244 = trunc i8 %lshrl124 to i1 - %245 = zext i1 %244 to i8 - store i8 %245, i8* %taddr125, align 1 - %246 = insertvalue %variant undef, i8* %taddr125, 0 - %247 = insertvalue %variant %246, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %248 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots107, i64 0, i64 2 - store %variant %247, %variant* %248, align 16 - %249 = bitcast [3 x %variant]* %varargslots107 to %variant* - %250 = insertvalue %"variant[]" undef, %variant* %249, 0 - %251 = insertvalue %"variant[]" %250, i64 3, 1 - store %"variant[]" %251, %"variant[]"* %taddr126, align 8 - %252 = bitcast %"variant[]"* %taddr126 to { i8*, i64 }* - %253 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %252, i32 0, i32 0 - %lo127 = load i8*, i8** %253, align 8 - %254 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %252, i32 0, i32 1 - %hi128 = load i64, i64* %254, align 8 - %255 = call i64 @std_io_printfln(i64* %retparam106, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.6, i32 0, i32 0), i64 8, i8* %lo127, i64 %hi128) - %not_err129 = icmp eq i64 %255, 0 - br i1 %not_err129, label %after_check130, label %voiderr131 +voiderr92: ; preds = %after_check91, %voiderr79 + %169 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 + %170 = load i8, ptr %169, align 1 + %zext95 = zext i8 %170 to i32 + %171 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 + %172 = load i8, ptr %171, align 1 + %zext96 = zext i8 %172 to i32 + %shl97 = shl i32 %zext96, 8 + %173 = or i32 %shl97, %zext95 + %174 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 + %175 = load i8, ptr %174, align 1 + %zext98 = zext i8 %175 to i32 + %shl99 = shl i32 %zext98, 16 + %176 = or i32 %shl99, %173 + %177 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 + %178 = load i8, ptr %177, align 1 + %zext100 = zext i8 %178 to i32 + %shl101 = shl i32 %zext100, 24 + %179 = or i32 %shl101, %176 + store i32 %179, ptr %taddr102, align 4 + %180 = insertvalue %variant undef, ptr %taddr102, 0 + %181 = insertvalue %variant %180, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %182 = getelementptr inbounds [3 x %variant], ptr %varargslots94, i64 0, i64 0 + store %variant %181, ptr %182, align 16 + %183 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 + %184 = load i8, ptr %183, align 1 + %zext103 = zext i8 %184 to i32 + %185 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 + %186 = load i8, ptr %185, align 1 + %zext104 = zext i8 %186 to i32 + %shl105 = shl i32 %zext104, 8 + %187 = or i32 %shl105, %zext103 + %188 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 + %189 = load i8, ptr %188, align 1 + %zext106 = zext i8 %189 to i32 + %shl107 = shl i32 %zext106, 16 + %190 = or i32 %shl107, %187 + %191 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %192 = load i8, ptr %191, align 1 + %zext108 = zext i8 %192 to i32 + %shl109 = shl i32 %zext108, 24 + %193 = or i32 %shl109, %190 + %194 = and i32 2147483647, %193 + store i32 %194, ptr %taddr110, align 4 + %195 = insertvalue %variant undef, ptr %taddr110, 0 + %196 = insertvalue %variant %195, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %197 = getelementptr inbounds [3 x %variant], ptr %varargslots94, i64 0, i64 1 + store %variant %196, ptr %197, align 16 + %198 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 + %199 = load i8, ptr %198, align 1 + %lshrl111 = lshr i8 %199, 7 + %200 = trunc i8 %lshrl111 to i1 + %201 = zext i1 %200 to i8 + store i8 %201, ptr %taddr112, align 1 + %202 = insertvalue %variant undef, ptr %taddr112, 0 + %203 = insertvalue %variant %202, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %204 = getelementptr inbounds [3 x %variant], ptr %varargslots94, i64 0, i64 2 + store %variant %203, ptr %204, align 16 + %205 = call i64 @std_io_printfn(ptr %retparam93, ptr @.str.6, i64 8, ptr %varargslots94, i64 3) + %not_err113 = icmp eq i64 %205, 0 + br i1 %not_err113, label %after_check114, label %voiderr115 -after_check130: ; preds = %voiderr105 - br label %voiderr131 +after_check114: ; preds = %voiderr92 + br label %voiderr115 -voiderr131: ; preds = %after_check130, %voiderr105 +voiderr115: ; preds = %after_check114, %voiderr92 + ret void +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + call void @test_hello(i32 12) ret void } diff --git a/test/test_suite/bitstruct/bitstruct_intcontainer.c3t b/test/test_suite/bitstruct/bitstruct_intcontainer.c3t index 12580a87f..bb2a46ddd 100644 --- a/test/test_suite/bitstruct/bitstruct_intcontainer.c3t +++ b/test/test_suite/bitstruct/bitstruct_intcontainer.c3t @@ -55,51 +55,51 @@ entry: %xxu = alloca i32, align 4 %xxy = alloca i64, align 8 %xxybe = alloca i64, align 8 - store i32 8388128, i32* %xx, align 4 - %0 = load i32, i32* %xx, align 4 + store i32 8388128, ptr %xx, align 4 + %0 = load i32, ptr %xx, align 4 %shl = shl i32 %0, 9 %ashr = ashr i32 %shl, 14 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) - store i32 1073741375, i32* %xx, align 4 - %1 = load i32, i32* %xx, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %ashr) + store i32 1073741375, ptr %xx, align 4 + %1 = load i32, ptr %xx, align 4 %shl1 = shl i32 %1, 9 %ashr2 = ashr i32 %shl1, 14 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr2) - store i32 -3485921, i32* %xxu, align 4 - %2 = load i32, i32* %xxu, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %ashr2) + store i32 -3485921, ptr %xxu, align 4 + %2 = load i32, ptr %xxu, align 4 %lshrl = lshr i32 %2, 5 %3 = and i32 262143, %lshrl - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %3) - store i64 1525363991714123551, i64* %xxy, align 8 - %4 = load i64, i64* %xxy, align 8 + call void (ptr, ...) @printf(ptr @.str.2, i32 %3) + store i64 1525363991714123551, ptr %xxy, align 8 + %4 = load i64, ptr %xxy, align 8 %lshrl3 = lshr i64 %4, 5 %5 = and i64 262143, %lshrl3 %ztrunc = trunc i64 %5 to i32 - %6 = load i64, i64* %xxy, align 8 + %6 = load i64, ptr %xxy, align 8 %lshrl4 = lshr i64 %6, 23 %7 = and i64 262143, %lshrl4 %ztrunc5 = trunc i64 %7 to i32 - %8 = load i64, i64* %xxy, align 8 + %8 = load i64, ptr %xxy, align 8 %lshrl6 = lshr i64 %8, 41 %9 = and i64 2097151, %lshrl6 %ztrunc7 = trunc i64 %9 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.3, i32 0, i32 0), i32 %ztrunc, i32 %ztrunc5, i32 %ztrunc7) - store i64 2292133196431502101, i64* %xxybe, align 8 - %10 = load i64, i64* %xxybe, align 8 + call void (ptr, ...) @printf(ptr @.str.3, i32 %ztrunc, i32 %ztrunc5, i32 %ztrunc7) + store i64 2292133196431502101, ptr %xxybe, align 8 + %10 = load i64, ptr %xxybe, align 8 %11 = call i64 @llvm.bswap.i64(i64 %10) %lshrl8 = lshr i64 %11, 5 %12 = and i64 262143, %lshrl8 %ztrunc9 = trunc i64 %12 to i32 - %13 = load i64, i64* %xxybe, align 8 + %13 = load i64, ptr %xxybe, align 8 %14 = call i64 @llvm.bswap.i64(i64 %13) %lshrl10 = lshr i64 %14, 23 %15 = and i64 262143, %lshrl10 %ztrunc11 = trunc i64 %15 to i32 - %16 = load i64, i64* %xxybe, align 8 + %16 = load i64, ptr %xxybe, align 8 %17 = call i64 @llvm.bswap.i64(i64 %16) %lshrl12 = lshr i64 %17, 41 %18 = and i64 2097151, %lshrl12 %ztrunc13 = trunc i64 %18 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i32 0, i32 0), i32 %ztrunc9, i32 %ztrunc11, i32 %ztrunc13) + call void (ptr, ...) @printf(ptr @.str.4, i32 %ztrunc9, i32 %ztrunc11, i32 %ztrunc13) ret void } \ No newline at end of file diff --git a/test/test_suite/bitstruct/bitstruct_to_int.c3t b/test/test_suite/bitstruct/bitstruct_to_int.c3t index 8b45c964e..70724f7b2 100644 --- a/test/test_suite/bitstruct/bitstruct_to_int.c3t +++ b/test/test_suite/bitstruct/bitstruct_to_int.c3t @@ -53,25 +53,23 @@ entry: %b = alloca i32, align 4 %x = alloca i32, align 4 %y = alloca [4 x i8], align 1 - %c = alloca i32*, align 8 - %x2 = alloca i32*, align 8 - %y2 = alloca [4 x i8]*, align 8 - store i32 0, i32* %b, align 4 - %0 = load i32, i32* %b, align 4 - store i32 %0, i32* %x, align 4 - %1 = bitcast i32* %b to [4 x i8]* - %2 = load [4 x i8], [4 x i8]* %1, align 4 - store [4 x i8] %2, [4 x i8]* %y, align 1 - store i32* %b, i32** %c, align 8 - %3 = load i32*, i32** %c, align 8 - %4 = load i32, i32* %3, align 8 - %shl = shl i32 %4, 28 + %c = alloca ptr, align 8 + %x2 = alloca ptr, align 8 + %y2 = alloca ptr, align 8 + store i32 0, ptr %b, align 4 + %0 = load i32, ptr %b, align 4 + store i32 %0, ptr %x, align 4 + %1 = load [4 x i8], ptr %b, align 4 + store [4 x i8] %1, ptr %y, align 1 + store ptr %b, ptr %c, align 8 + %2 = load ptr, ptr %c, align 8 + %3 = load i32, ptr %2, align 8 + %shl = shl i32 %3, 28 %ashr = ashr i32 %shl, 29 - %5 = load i32*, i32** %c, align 8 - store i32* %5, i32** %x2, align 8 - %6 = load i32*, i32** %c, align 8 - %ptrptr = bitcast i32* %6 to [4 x i8]* - store [4 x i8]* %ptrptr, [4 x i8]** %y2, align 8 + %4 = load ptr, ptr %c, align 8 + store ptr %4, ptr %x2, align 8 + %5 = load ptr, ptr %c, align 8 + store ptr %5, ptr %y2, align 8 ret void } @@ -81,29 +79,25 @@ entry: %b = alloca [4 x i8], align 1 %x = alloca i32, align 4 %y = alloca [4 x i8], align 1 - %c = alloca [4 x i8]*, align 8 - %x2 = alloca i32*, align 8 - %y2 = alloca [4 x i8]*, align 8 - store [4 x i8] c"\06\90\00\00", [4 x i8]* %b, align 1 - %0 = bitcast [4 x i8]* %b to i32* - %1 = load i32, i32* %0, align 1 - store i32 %1, i32* %x, align 4 - %2 = bitcast [4 x i8]* %y to i8* - %3 = bitcast [4 x i8]* %b to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %2, i8* align 1 %3, i32 4, i1 false) - store [4 x i8]* %b, [4 x i8]** %c, align 8 - %4 = load [4 x i8]*, [4 x i8]** %c, align 8 - %5 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 0 - %6 = load i8, i8* %5, align 1 - %zext = zext i8 %6 to i32 + %c = alloca ptr, align 8 + %x2 = alloca ptr, align 8 + %y2 = alloca ptr, align 8 + store [4 x i8] c"\06\90\00\00", ptr %b, align 1 + %0 = load i32, ptr %b, align 1 + store i32 %0, ptr %x, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 1 %y, ptr align 1 %b, i32 4, i1 false) + store ptr %b, ptr %c, align 8 + %1 = load ptr, ptr %c, align 8 + %2 = getelementptr inbounds [4 x i8], ptr %1, i64 0, i64 0 + %3 = load i8, ptr %2, align 1 + %zext = zext i8 %3 to i32 %lshrl = lshr i32 %zext, 1 %shl = shl i32 %lshrl, 29 %ashr = ashr i32 %shl, 29 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) - %7 = load [4 x i8]*, [4 x i8]** %c, align 8 - %ptrptr = bitcast [4 x i8]* %7 to i32* - store i32* %ptrptr, i32** %x2, align 8 - %8 = load [4 x i8]*, [4 x i8]** %c, align 8 - store [4 x i8]* %8, [4 x i8]** %y2, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %ashr) + %4 = load ptr, ptr %c, align 8 + store ptr %4, ptr %x2, align 8 + %5 = load ptr, ptr %c, align 8 + store ptr %5, ptr %y2, align 8 ret void } diff --git a/test/test_suite/bitstruct/embedded_bitstruct.c3t b/test/test_suite/bitstruct/embedded_bitstruct.c3t index 9614c47d8..580cf5a57 100644 --- a/test/test_suite/bitstruct/embedded_bitstruct.c3t +++ b/test/test_suite/bitstruct/embedded_bitstruct.c3t @@ -50,32 +50,30 @@ define void @foo_main() #0 { entry: %b = alloca %Bar, align 4 %f = alloca %Foo, align 4 - %0 = bitcast %Bar* %b to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Bar* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 - %2 = getelementptr inbounds %.anon, %.anon* %1, i32 0, i32 0 - %3 = getelementptr inbounds %.anon.0, %.anon.0* %2, i32 0, i32 0 - %4 = load i32, i32* %3, align 4 - %5 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 2 - %6 = load i32, i32* %5, align 4 - %shl = shl i32 %6, 21 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %b, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 + %1 = getelementptr inbounds %.anon, ptr %0, i32 0, i32 0 + %2 = getelementptr inbounds %.anon.0, ptr %1, i32 0, i32 0 + %3 = load i32, ptr %2, align 4 + %4 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 2 + %5 = load i32, ptr %4, align 4 + %shl = shl i32 %5, 21 %ashr = ashr i32 %shl, 23 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i32 %4, i32 %ashr) - %7 = bitcast %Foo* %f to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %7, i8* align 4 bitcast (%Foo* @.__const.10 to i8*), i32 16, i1 false) - %8 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 0 - %9 = getelementptr inbounds %.anon.1, %.anon.1* %8, i32 0, i32 0 - %10 = getelementptr inbounds %.anon.2, %.anon.2* %9, i32 0, i32 0 - %11 = load i32, i32* %10, align 4 - %12 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 0 - %13 = getelementptr inbounds %.anon.1, %.anon.1* %12, i32 0, i32 1 - %14 = getelementptr inbounds %.anon.3, %.anon.3* %13, i32 0, i32 0 - %15 = load i32, i32* %14, align 4 - %16 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 0 - %17 = getelementptr inbounds %.anon.1, %.anon.1* %16, i32 0, i32 2 - %18 = load i32, i32* %17, align 4 - %19 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 1 - %20 = load i32, i32* %19, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0), i32 %11, i32 %15, i32 %18, i32 %20) + call void (ptr, ...) @printf(ptr @.str, i32 %3, i32 %ashr) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %f, ptr align 4 @.__const.10, i32 16, i1 false) + %6 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 0 + %7 = getelementptr inbounds %.anon.1, ptr %6, i32 0, i32 0 + %8 = getelementptr inbounds %.anon.2, ptr %7, i32 0, i32 0 + %9 = load i32, ptr %8, align 4 + %10 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 0 + %11 = getelementptr inbounds %.anon.1, ptr %10, i32 0, i32 1 + %12 = getelementptr inbounds %.anon.3, ptr %11, i32 0, i32 0 + %13 = load i32, ptr %12, align 4 + %14 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 0 + %15 = getelementptr inbounds %.anon.1, ptr %14, i32 0, i32 2 + %16 = load i32, ptr %15, align 4 + %17 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 1 + %18 = load i32, ptr %17, align 4 + call void (ptr, ...) @printf(ptr @.str.11, i32 %9, i32 %13, i32 %16, i32 %18) ret void } diff --git a/test/test_suite2/bitstruct/param_bitstruct.c3t b/test/test_suite/bitstruct/param_bitstruct.c3t similarity index 100% rename from test/test_suite2/bitstruct/param_bitstruct.c3t rename to test/test_suite/bitstruct/param_bitstruct.c3t diff --git a/test/test_suite/builtins/exacts.c3t b/test/test_suite/builtins/exacts.c3t index de670fee6..9012d5d91 100644 --- a/test/test_suite/builtins/exacts.c3t +++ b/test/test_suite/builtins/exacts.c3t @@ -11,7 +11,7 @@ fn void main() int z4 = $$add(x, y); int z5 = $$sub(x, y); int z6 = $$neg(x); - io::printfln("%s %s %s %s %s %s", z1, z2, z3, z4, z5, z6); + io::printfn("%s %s %s %s %s %s", z1, z2, z3, z4, z5, z6); } /* #expect: test.ll diff --git a/test/test_suite/builtins/mem.c3t b/test/test_suite/builtins/mem.c3t index 416fd4196..08c1ea6e1 100644 --- a/test/test_suite/builtins/mem.c3t +++ b/test/test_suite/builtins/mem.c3t @@ -16,7 +16,8 @@ fn void main() /* #expect: test.ll - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 2 %0, i8* align 2 %1, i64 2, i1 false) - call void @llvm.memmove.p0i8.p0i8.i64(i8* align 2 %2, i8* align 2 %3, i64 2, i1 false) - call void @llvm.memset.p0i8.i64(i8* align 2 %4, i8 0, i64 2, i1 false) - call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 2 %5, i8* align 2 %6, i64 2, i1 false) + call void @llvm.memcpy.p0.p0.i64(ptr align 2 %dst, ptr align 2 %src, i64 2, i1 false) + call void @llvm.memmove.p0.p0.i64(ptr align 2 %dst, ptr align 2 %src, i64 2, i1 false) + call void @llvm.memset.p0.i64(ptr align 2 %dst, i8 0, i64 2, i1 false) + call void @llvm.memcpy.inline.p0.p0.i64(ptr align 2 %dst, ptr align 2 %src, i64 2, i1 false) + call void @llvm.memset.inline.p0.i64(ptr align 2 %dst, i8 0, i64 2, i1 false) diff --git a/test/test_suite/builtins/overflows.c3t b/test/test_suite/builtins/overflows.c3t index b0004833a..ac6267f04 100644 --- a/test/test_suite/builtins/overflows.c3t +++ b/test/test_suite/builtins/overflows.c3t @@ -14,53 +14,53 @@ fn void main() bool success3 = $$overflow_add(x, x, &z3); bool success4 = $$overflow_sub($$neg(y), y, &z4); bool success5 = $$overflow_sub(x, y, &z5); - io::printfln("%s %s", success1, z1); - io::printfln("%s %s", success2, z2); - io::printfln("%s %s", success3, z3); - io::printfln("%s %s", success4, z4); - io::printfln("%s %s", success5, z5); + io::printfn("%s %s", success1, z1); + io::printfn("%s %s", success2, z2); + io::printfn("%s %s", success3, z3); + io::printfn("%s %s", success4, z4); + io::printfn("%s %s", success5, z5); } /* #expect: test.ll - %0 = load i8, i8* %x, align 1 - %1 = load i8, i8* %y, align 1 + %0 = load i8, ptr %x, align 1 + %1 = load i8, ptr %y, align 1 %2 = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %0, i8 %1) %3 = extractvalue { i8, i1 } %2, 1 %4 = extractvalue { i8, i1 } %2, 0 - store i8 %4, i8* %z1, align 1 + store i8 %4, ptr %z1, align 1 %5 = zext i1 %3 to i8 - store i8 %5, i8* %success1, align 1 - %6 = load i8, i8* %x, align 1 - %7 = load i8, i8* %y, align 1 + store i8 %5, ptr %success1, align 1 + %6 = load i8, ptr %x, align 1 + %7 = load i8, ptr %y, align 1 %8 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %6, i8 %7) %9 = extractvalue { i8, i1 } %8, 1 %10 = extractvalue { i8, i1 } %8, 0 - store i8 %10, i8* %z2, align 1 + store i8 %10, ptr %z2, align 1 %11 = zext i1 %9 to i8 - store i8 %11, i8* %success2, align 1 - %12 = load i8, i8* %x, align 1 - %13 = load i8, i8* %x, align 1 + store i8 %11, ptr %success2, align 1 + %12 = load i8, ptr %x, align 1 + %13 = load i8, ptr %x, align 1 %14 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %12, i8 %13) %15 = extractvalue { i8, i1 } %14, 1 %16 = extractvalue { i8, i1 } %14, 0 - store i8 %16, i8* %z3, align 1 + store i8 %16, ptr %z3, align 1 %17 = zext i1 %15 to i8 - store i8 %17, i8* %success3, align 1 - %18 = load i8, i8* %y, align 1 + store i8 %17, ptr %success3, align 1 + %18 = load i8, ptr %y, align 1 %eneg = sub i8 0, %18 - %19 = load i8, i8* %y, align 1 + %19 = load i8, ptr %y, align 1 %20 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %eneg, i8 %19) %21 = extractvalue { i8, i1 } %20, 1 %22 = extractvalue { i8, i1 } %20, 0 - store i8 %22, i8* %z4, align 1 + store i8 %22, ptr %z4, align 1 %23 = zext i1 %21 to i8 - store i8 %23, i8* %success4, align 1 - %24 = load i8, i8* %x, align 1 - %25 = load i8, i8* %y, align 1 + store i8 %23, ptr %success4, align 1 + %24 = load i8, ptr %x, align 1 + %25 = load i8, ptr %y, align 1 %26 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %24, i8 %25) %27 = extractvalue { i8, i1 } %26, 1 %28 = extractvalue { i8, i1 } %26, 0 - store i8 %28, i8* %z5, align 1 + store i8 %28, ptr %z5, align 1 %29 = zext i1 %27 to i8 - store i8 %29, i8* %success5, align 1 + store i8 %29, ptr %success5, align 1 diff --git a/test/test_suite/builtins/prefetch.c3t b/test/test_suite/builtins/prefetch.c3t index 79084d5e0..24bac0177 100644 --- a/test/test_suite/builtins/prefetch.c3t +++ b/test/test_suite/builtins/prefetch.c3t @@ -13,13 +13,10 @@ fn void main() /* #expect: test.ll %a = alloca i32, align 4 - %ptr = alloca i8*, align 8 - store i32 0, i32* %a, align 4 - %ptrptr = bitcast i32* %a to i8* - call void @llvm.prefetch.p0i8(i8* %ptrptr, i32 1, i32 3, i32 1) - %ptrptr1 = bitcast i32* %a to i8* - call void @llvm.prefetch.p0i8(i8* %ptrptr1, i32 0, i32 1, i32 1) - %ptrptr2 = bitcast i32* %a to i8* - store i8* %ptrptr2, i8** %ptr, align 8 - %0 = load i8*, i8** %ptr, align 8 - call void @llvm.prefetch.p0i8(i8* %0, i32 0, i32 3, i32 1) + %ptr = alloca ptr, align 8 + store i32 0, ptr %a, align 4 + call void @llvm.prefetch.p0(ptr %a, i32 1, i32 3, i32 1) + call void @llvm.prefetch.p0(ptr %a, i32 0, i32 1, i32 1) + store ptr %a, ptr %ptr, align 8 + %0 = load ptr, ptr %ptr, align 8 + call void @llvm.prefetch.p0(ptr %0, i32 0, i32 3, i32 1) diff --git a/test/test_suite/builtins/reduce_arithmetics.c3t b/test/test_suite/builtins/reduce_arithmetics.c3t index e3dde3378..49601fb29 100644 --- a/test/test_suite/builtins/reduce_arithmetics.c3t +++ b/test/test_suite/builtins/reduce_arithmetics.c3t @@ -5,21 +5,21 @@ import std::io; fn void main() { int a; - io::printfln("%s", $$pow_int(double[<2>] { 23.3, 2.1 }, 3)); - io::printfln("%s", $$reduce_add(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_fadd(double[<2>] { 3, 10 }, -0.0)); - io::printfln("%s", $$reduce_fadd(double[<2>] { 3, 10 }, 3.2)); - io::printfln("%s", $$reduce_mul(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_fmul(double[<2>] { 3, 10 }, 3.4)); - io::printfln("%s", $$reduce_and(int[<2>] { 3, 11 })); - io::printfln("%s", $$reduce_or(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_xor(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_max(double[<2>] { 23.2, 23.3 })); - io::printfln("%s", $$reduce_max(int[<2>] { -23, 32 })); - io::printfln("%s", $$reduce_max(char[<2>] { 4, 253 })); - io::printfln("%s", $$reduce_min(double[<2>] { 23.2, 23.3 })); - io::printfln("%s", $$reduce_min(int[<2>] { -23, 32 })); - io::printfln("%s", $$reduce_min(char[<2>] { 4, 253 })); + io::printfn("%s", $$pow_int(double[<2>] { 23.3, 2.1 }, 3)); + io::printfn("%s", $$reduce_add(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_fadd(double[<2>] { 3, 10 }, -0.0)); + io::printfn("%s", $$reduce_fadd(double[<2>] { 3, 10 }, 3.2)); + io::printfn("%s", $$reduce_mul(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_fmul(double[<2>] { 3, 10 }, 3.4)); + io::printfn("%s", $$reduce_and(int[<2>] { 3, 11 })); + io::printfn("%s", $$reduce_or(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_xor(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_max(double[<2>] { 23.2, 23.3 })); + io::printfn("%s", $$reduce_max(int[<2>] { -23, 32 })); + io::printfn("%s", $$reduce_max(char[<2>] { 4, 253 })); + io::printfn("%s", $$reduce_min(double[<2>] { 23.2, 23.3 })); + io::printfn("%s", $$reduce_min(int[<2>] { -23, 32 })); + io::printfn("%s", $$reduce_min(char[<2>] { 4, 253 })); } diff --git a/test/test_suite/builtins/reverse_builtin.c3t b/test/test_suite/builtins/reverse_builtin.c3t index a3b556f78..effef43d0 100644 --- a/test/test_suite/builtins/reverse_builtin.c3t +++ b/test/test_suite/builtins/reverse_builtin.c3t @@ -6,7 +6,7 @@ import std::io; fn void main() { int[<4>] a = { 1, -3, 5, -7 }; - io::printfln("%s", $$reverse(a)); + io::printfn("%s", $$reverse(a)); } /* #expect: test.ll diff --git a/test/test_suite/builtins/sat_builtins.c3t b/test/test_suite/builtins/sat_builtins.c3t index b56e7ddf3..4a10937ee 100644 --- a/test/test_suite/builtins/sat_builtins.c3t +++ b/test/test_suite/builtins/sat_builtins.c3t @@ -7,18 +7,18 @@ fn void main() { char a = 123; char b = 222; - io::printfln("%s %s", $$sat_add(a, b), $$sat_add((ichar)a, (ichar)30)); - io::printfln("%s %s", $$sat_sub(a, b), $$sat_sub((ichar)-120, (ichar)10)); + io::printfn("%s %s", $$sat_add(a, b), $$sat_add((ichar)a, (ichar)30)); + io::printfn("%s %s", $$sat_sub(a, b), $$sat_sub((ichar)-120, (ichar)10)); b = 3; - io::printfln("%s %s", $$sat_shl(a, b), $$sat_shl((ichar)a, (ichar)1)); + io::printfn("%s %s", $$sat_shl(a, b), $$sat_shl((ichar)a, (ichar)1)); b = 222; char[<2>] x = { 123, 222 }; char[<2>] y = { 143, 50 }; ichar[<2>] z = { 120, -120 }; ichar[<2>] w = { -44, 30 }; - io::printfln("%s %s", $$sat_add(x, y), $$sat_add(z, z)); - io::printfln("%s %s", $$sat_sub(x, y), $$sat_sub(w, z)); - io::printfln("%s %s", $$sat_shl(x, char[<2>] { 1, 1 }), $$sat_shl(z, ichar[<2>] { 1, 1 })); + io::printfn("%s %s", $$sat_add(x, y), $$sat_add(z, z)); + io::printfn("%s %s", $$sat_sub(x, y), $$sat_sub(w, z)); + io::printfn("%s %s", $$sat_shl(x, char[<2>] { 1, 1 }), $$sat_shl(z, ichar[<2>] { 1, 1 })); } /* #expect: test.ll diff --git a/test/test_suite/builtins/shufflevector.c3t b/test/test_suite/builtins/shufflevector.c3t index d10624e59..e05139be8 100644 --- a/test/test_suite/builtins/shufflevector.c3t +++ b/test/test_suite/builtins/shufflevector.c3t @@ -49,53 +49,48 @@ fn float[<2>] apply3(Matrix2x2* mat, float[<2>] vec) fn void main() { Matrix2x2 a = { 1, -3, 5, -7 }; - io::printfln("1: %s", apply1(&a, float[<2>] { 11, 13 })); - io::printfln("2: %s", apply2(&a, float[<2>] { 11, 13 })); - io::printfln("3: %s", apply3(&a, float[<2>] { 11, 13 })); + io::printfn("1: %s", apply1(&a, float[<2>] { 11, 13 })); + io::printfn("2: %s", apply2(&a, float[<2>] { 11, 13 })); + io::printfn("3: %s", apply3(&a, float[<2>] { 11, 13 })); } /* #expect: test.ll -define double @test_apply3(%Matrix2x2* %0, double %1) #0 { +define double @test_apply3(ptr %0, double %1) #0 { entry: %vec = alloca <2 x float>, align 8 %a = alloca <2 x float>, align 8 %b = alloca <2 x float>, align 8 %flip = alloca <2 x float>, align 8 %taddr = alloca <2 x float>, align 8 - %2 = bitcast <2 x float>* %vec to double* - store double %1, double* %2, align 8 - %3 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 - %4 = bitcast %.anon* %3 to %.anon.1* - %5 = getelementptr inbounds %.anon.1, %.anon.1* %4, i32 0, i32 0 - %6 = load <2 x float>, <2 x float>* %5, align 8 - %7 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 - %8 = bitcast %.anon* %7 to %.anon.1* - %9 = getelementptr inbounds %.anon.1, %.anon.1* %8, i32 0, i32 1 - %10 = load <2 x float>, <2 x float>* %9, align 8 - %shuffle = shufflevector <2 x float> %6, <2 x float> %10, <2 x i32> - store <2 x float> %shuffle, <2 x float>* %a, align 8 - %11 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 - %12 = bitcast %.anon* %11 to %.anon.1* - %13 = getelementptr inbounds %.anon.1, %.anon.1* %12, i32 0, i32 0 - %14 = load <2 x float>, <2 x float>* %13, align 8 - %15 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 - %16 = bitcast %.anon* %15 to %.anon.1* - %17 = getelementptr inbounds %.anon.1, %.anon.1* %16, i32 0, i32 1 - %18 = load <2 x float>, <2 x float>* %17, align 8 - %shuffle1 = shufflevector <2 x float> %14, <2 x float> %18, <2 x i32> - store <2 x float> %shuffle1, <2 x float>* %b, align 8 - %19 = load <2 x float>, <2 x float>* %vec, align 8 - %shuffle2 = shufflevector <2 x float> %19, <2 x float> poison, <2 x i32> - store <2 x float> %shuffle2, <2 x float>* %flip, align 8 - %20 = load <2 x float>, <2 x float>* %a, align 8 - %21 = load <2 x float>, <2 x float>* %vec, align 8 - %fmul = fmul <2 x float> %20, %21 - %22 = load <2 x float>, <2 x float>* %b, align 8 - %23 = load <2 x float>, <2 x float>* %flip, align 8 - %fmul3 = fmul <2 x float> %22, %23 + store double %1, ptr %vec, align 8 + %2 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 + %3 = getelementptr inbounds %.anon.1, ptr %2, i32 0, i32 0 + %4 = load <2 x float>, ptr %3, align 8 + %5 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 + %6 = getelementptr inbounds %.anon.1, ptr %5, i32 0, i32 1 + %7 = load <2 x float>, ptr %6, align 8 + %shuffle = shufflevector <2 x float> %4, <2 x float> %7, <2 x i32> + store <2 x float> %shuffle, ptr %a, align 8 + %8 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 + %9 = getelementptr inbounds %.anon.1, ptr %8, i32 0, i32 0 + %10 = load <2 x float>, ptr %9, align 8 + %11 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 + %12 = getelementptr inbounds %.anon.1, ptr %11, i32 0, i32 1 + %13 = load <2 x float>, ptr %12, align 8 + %shuffle1 = shufflevector <2 x float> %10, <2 x float> %13, <2 x i32> + store <2 x float> %shuffle1, ptr %b, align 8 + %14 = load <2 x float>, ptr %vec, align 8 + %shuffle2 = shufflevector <2 x float> %14, <2 x float> poison, <2 x i32> + store <2 x float> %shuffle2, ptr %flip, align 8 + %15 = load <2 x float>, ptr %a, align 8 + %16 = load <2 x float>, ptr %vec, align 8 + %fmul = fmul <2 x float> %15, %16 + %17 = load <2 x float>, ptr %b, align 8 + %18 = load <2 x float>, ptr %flip, align 8 + %fmul3 = fmul <2 x float> %17, %18 %fadd = fadd <2 x float> %fmul, %fmul3 - store <2 x float> %fadd, <2 x float>* %taddr, align 8 - %24 = bitcast <2 x float>* %taddr to double* - %25 = load double, double* %24, align 8 - ret double %25 \ No newline at end of file + store <2 x float> %fadd, ptr %taddr, align 8 + %19 = load double, ptr %taddr, align 8 + ret double %19 +} \ No newline at end of file diff --git a/test/test_suite/builtins/simple_builtins.c3t b/test/test_suite/builtins/simple_builtins.c3t index 913250933..b603bebc1 100644 --- a/test/test_suite/builtins/simple_builtins.c3t +++ b/test/test_suite/builtins/simple_builtins.c3t @@ -29,34 +29,34 @@ entry: %abcd = alloca [3 x i32], align 4 %sy = alloca i32, align 4 %1 = call double @llvm.ceil.f64(double %0) - store double %1, double* %d, align 8 - %2 = load double, double* %d, align 8 + store double %1, ptr %d, align 8 + %2 = load double, ptr %d, align 8 %3 = call double @llvm.maxnum.f64(double 1.000000e+00, double %2) - store double %3, double* %e, align 8 - %4 = load double, double* %d, align 8 + store double %3, ptr %e, align 8 + %4 = load double, ptr %d, align 8 %5 = call double @llvm.fma.f64(double %4, double 2.000000e+00, double 3.000000e+00) - store double %5, double* %f, align 8 - %6 = load double, double* %d, align 8 + store double %5, ptr %f, align 8 + %6 = load double, ptr %d, align 8 %7 = call double @llvm.fmuladd.f64(double %6, double 2.000000e+00, double 3.000000e+00) - store double %7, double* %m, align 8 - store i32 13, i32* %xeb, align 4 - %8 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 0 - store i32 0, i32* %8, align 4 - %9 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 1 - store i32 0, i32* %9, align 4 - %10 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2 - store i32 0, i32* %10, align 4 - %11 = load volatile i32, i32* %xeb, align 4 - store i32 %11, i32* %sy, align 4 - %12 = load i32, i32* %sy, align 4 + store double %7, ptr %m, align 8 + store i32 13, ptr %xeb, align 4 + %8 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 0 + store i32 0, ptr %8, align 4 + %9 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 1 + store i32 0, ptr %9, align 4 + %10 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 2 + store i32 0, ptr %10, align 4 + %11 = load volatile i32, ptr %xeb, align 4 + store i32 %11, ptr %sy, align 4 + %12 = load i32, ptr %sy, align 4 %add = add i32 %12, 1 - store volatile i32 %add, i32* %xeb, align 4 - %13 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2 - %14 = load i32, i32* %sy, align 4 + store volatile i32 %add, ptr %xeb, align 4 + %13 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 2 + %14 = load i32, ptr %sy, align 4 %add1 = add i32 %14, 2 - store volatile i32 %add1, i32* %13, align 4 - %15 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2 - %16 = load volatile i32, i32* %15, align 4 - store i32 %16, i32* %sy, align 4 + store volatile i32 %add1, ptr %13, align 4 + %15 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 2 + %16 = load volatile i32, ptr %15, align 4 + store i32 %16, ptr %sy, align 4 ret i32 1 } diff --git a/test/test_suite/cast/cast_from_ptr.c3t b/test/test_suite/cast/cast_from_ptr.c3t index 5fd784a32..523ea2c60 100644 --- a/test/test_suite/cast/cast_from_ptr.c3t +++ b/test/test_suite/cast/cast_from_ptr.c3t @@ -9,10 +9,14 @@ fn void tester() /* #expect: test.ll - %0 = load i32*, i32** %x, align 8 - %ptrxi = ptrtoint i32* %0 to i16 - store i16 %ptrxi, i16* %y, align 2 - %1 = load i32*, i32** %x, align 8 - %ptrxi1 = ptrtoint i32* %1 to i16 + %x = alloca ptr, align 8 + %y = alloca i16, align 2 + %z = alloca i64, align 8 + store ptr null, ptr %x, align 8 + %0 = load ptr, ptr %x, align 8 + %ptrxi = ptrtoint ptr %0 to i16 + store i16 %ptrxi, ptr %y, align 2 + %1 = load ptr, ptr %x, align 8 + %ptrxi1 = ptrtoint ptr %1 to i16 %siuiext = sext i16 %ptrxi1 to i64 - store i64 %siuiext, i64* %z, align 8 + store i64 %siuiext, ptr %z, align 8 diff --git a/test/test_suite/cast/implicit_infer_len_cast.c3t b/test/test_suite/cast/implicit_infer_len_cast.c3t index b12a4ce60..945a96145 100644 --- a/test/test_suite/cast/implicit_infer_len_cast.c3t +++ b/test/test_suite/cast/implicit_infer_len_cast.c3t @@ -26,41 +26,31 @@ fn void main() %literal = alloca [1 x <2 x i32>], align 8 %bb = alloca [1 x %"int[]"], align 16 %literal1 = alloca [2 x i32], align 4 - %y2 = alloca [2 x [2 x i32]]*, align 8 + %y2 = alloca ptr, align 8 %z3 = alloca [2 x [2 x i32]], align 16 - %0 = bitcast [2 x [2 x i32]]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %0, i8* align 16 bitcast ([2 x [2 x i32]]* @.__const to i8*), i32 16, i1 false) - %1 = bitcast [1 x <2 x i32>]* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 bitcast ([1 x <2 x i32>]* @.__const.1 to i8*), i32 8, i1 false) - %2 = bitcast [1 x <2 x i32>]* %z to i8* - %3 = bitcast [1 x <2 x i32>]* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %2, i8* align 8 %3, i32 8, i1 false) - %4 = bitcast [1 x <2 x i32>]* %w to i8* - %5 = bitcast [1 x <2 x i32>]* %z to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 8, i1 false) - %6 = getelementptr inbounds [1 x <2 x i32>], [1 x <2 x i32>]* %literal, i64 0, i64 0 - %7 = getelementptr inbounds <2 x i32>, <2 x i32>* %6, i64 0, i64 0 - store i32 1, i32* %7, align 4 - %8 = getelementptr inbounds <2 x i32>, <2 x i32>* %6, i64 0, i64 1 - store i32 3, i32* %8, align 4 - %9 = bitcast [1 x <2 x i32>]* %literal to <2 x i32>* - %10 = insertvalue %"int[<2>][]" undef, <2 x i32>* %9, 0 - %11 = insertvalue %"int[<2>][]" %10, i64 1, 1 - store %"int[<2>][]" %11, %"int[<2>][]"* %aa, align 8 - %12 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %bb, i64 0, i64 0 - %13 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 0 - store i32 1, i32* %13, align 4 - %14 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 1 - store i32 3, i32* %14, align 4 - %15 = bitcast [2 x i32]* %literal1 to i32* - %16 = insertvalue %"int[]" undef, i32* %15, 0 - %17 = insertvalue %"int[]" %16, i64 2, 1 - store %"int[]" %17, %"int[]"* %12, align 16 - store [2 x [2 x i32]]* %x, [2 x [2 x i32]]** %y2, align 8 - %18 = load [2 x [2 x i32]]*, [2 x [2 x i32]]** %y2, align 8 - %19 = bitcast [2 x [2 x i32]]* %z3 to i8* - %20 = bitcast [2 x [2 x i32]]* %18 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %19, i8* align 8 %20, i32 16, i1 false) - %21 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %z3, i64 0, i64 1 - %22 = getelementptr inbounds [2 x i32], [2 x i32]* %21, i64 0, i64 1 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 16 @.__const, i32 16, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %y, ptr align 8 @.__const.1, i32 8, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %z, ptr align 8 %y, i32 8, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %w, ptr align 8 %z, i32 8, i1 false) + %0 = getelementptr inbounds [1 x <2 x i32>], ptr %literal, i64 0, i64 0 + %1 = getelementptr inbounds <2 x i32>, ptr %0, i64 0, i64 0 + store i32 1, ptr %1, align 4 + %2 = getelementptr inbounds <2 x i32>, ptr %0, i64 0, i64 1 + store i32 3, ptr %2, align 4 + %3 = insertvalue %"int[<2>][]" undef, ptr %literal, 0 + %4 = insertvalue %"int[<2>][]" %3, i64 1, 1 + store %"int[<2>][]" %4, ptr %aa, align 8 + %5 = getelementptr inbounds [1 x %"int[]"], ptr %bb, i64 0, i64 0 + %6 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 0 + store i32 1, ptr %6, align 4 + %7 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 1 + store i32 3, ptr %7, align 4 + %8 = insertvalue %"int[]" undef, ptr %literal1, 0 + %9 = insertvalue %"int[]" %8, i64 2, 1 + store %"int[]" %9, ptr %5, align 16 + store ptr %x, ptr %y2, align 8 + %10 = load ptr, ptr %y2, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %z3, ptr align 8 %10, i32 16, i1 false) + %11 = getelementptr inbounds [2 x [2 x i32]], ptr %z3, i64 0, i64 1 + %12 = getelementptr inbounds [2 x i32], ptr %11, i64 0, i64 1 ret void diff --git a/test/test_suite/cast/top_down_casts.c3t b/test/test_suite/cast/top_down_casts.c3t index ac882bf5a..e9054b2bf 100644 --- a/test/test_suite/cast/top_down_casts.c3t +++ b/test/test_suite/cast/top_down_casts.c3t @@ -24,70 +24,70 @@ entry: %z = alloca i64, align 8 %w = alloca i32, align 4 %w.f = alloca i64, align 8 - store i32 0, i32* %x, align 4 - store i32 0, i32* %y, align 4 - %0 = load i32, i32* %x, align 4 + store i32 0, ptr %x, align 4 + store i32 0, ptr %y, align 4 + %0 = load i32, ptr %x, align 4 %sisiext = sext i32 %0 to i64 - %1 = load i32, i32* %y, align 4 + %1 = load i32, ptr %y, align 4 %sisiext1 = sext i32 %1 to i64 %mul = mul i64 %sisiext, %sisiext1 - store i64 %mul, i64* %z, align 8 - %2 = load i32, i32* %x, align 4 + store i64 %mul, ptr %z, align 8 + %2 = load i32, ptr %x, align 4 %sisiext2 = sext i32 %2 to i64 - %3 = load i32, i32* %y, align 4 + %3 = load i32, ptr %y, align 4 %sisiext3 = sext i32 %3 to i64 %sdiv = sdiv i64 %sisiext2, %sisiext3 - store i64 %sdiv, i64* %z, align 8 - %4 = load i32, i32* %x, align 4 + store i64 %sdiv, ptr %z, align 8 + %4 = load i32, ptr %x, align 4 %sisiext4 = sext i32 %4 to i64 - %5 = load i32, i32* %y, align 4 + %5 = load i32, ptr %y, align 4 %sisiext5 = sext i32 %5 to i64 %add = add i64 %sisiext4, %sisiext5 - store i64 %add, i64* %z, align 8 - %6 = load i32, i32* %x, align 4 + store i64 %add, ptr %z, align 8 + %6 = load i32, ptr %x, align 4 %sisiext6 = sext i32 %6 to i64 - %7 = load i32, i32* %y, align 4 + %7 = load i32, ptr %y, align 4 %sisiext7 = sext i32 %7 to i64 %sub = sub i64 %sisiext6, %sisiext7 - store i64 %sub, i64* %z, align 8 - %8 = load i32, i32* %x, align 4 + store i64 %sub, ptr %z, align 8 + %8 = load i32, ptr %x, align 4 %sisiext8 = sext i32 %8 to i64 - %9 = load i32, i32* %y, align 4 + %9 = load i32, ptr %y, align 4 %sisiext9 = sext i32 %9 to i64 %smod = srem i64 %sisiext8, %sisiext9 - store i64 %smod, i64* %z, align 8 - %10 = load i32, i32* %x, align 4 + store i64 %smod, ptr %z, align 8 + %10 = load i32, ptr %x, align 4 %sisiext10 = sext i32 %10 to i64 - %11 = load i32, i32* %y, align 4 + %11 = load i32, ptr %y, align 4 %zext = zext i32 %11 to i64 %shl = shl i64 %sisiext10, %zext %12 = freeze i64 %shl - store i64 %12, i64* %z, align 8 - %13 = load i32, i32* %x, align 4 + store i64 %12, ptr %z, align 8 + %13 = load i32, ptr %x, align 4 %sisiext11 = sext i32 %13 to i64 - %14 = load i32, i32* %y, align 4 + %14 = load i32, ptr %y, align 4 %zext12 = zext i32 %14 to i64 %ashr = ashr i64 %sisiext11, %zext12 %15 = freeze i64 %ashr - store i64 %15, i64* %z, align 8 - %16 = load i32, i32* %x, align 4 + store i64 %15, ptr %z, align 8 + %16 = load i32, ptr %x, align 4 %sisiext13 = sext i32 %16 to i64 %bnot = xor i64 %sisiext13, -1 - store i64 %bnot, i64* %z, align 8 - %17 = load i32, i32* %x, align 4 + store i64 %bnot, ptr %z, align 8 + %17 = load i32, ptr %x, align 4 %sisiext14 = sext i32 %17 to i64 - %18 = load i32, i32* %x, align 4 + %18 = load i32, ptr %x, align 4 %sisiext15 = sext i32 %18 to i64 %neg = sub i64 0, %sisiext15 - store i64 %neg, i64* %z, align 8 - store i64 0, i64* %w.f, align 8 - store i32 0, i32* %w, align 4 - %optval = load i64, i64* %w.f, align 8 + store i64 %neg, 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 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %19 = load i32, i32* %w, align 4 + %19 = load i32, ptr %w, align 4 %sisiext16 = sext i32 %19 to i64 br label %phi_block @@ -96,6 +96,6 @@ else_block: ; preds = %entry phi_block: ; preds = %else_block, %after_check %val = phi i64 [ %sisiext16, %after_check ], [ 1, %else_block ] - store i64 %val, i64* %z, align 8 + store i64 %val, ptr %z, align 8 ret void } \ No newline at end of file diff --git a/test/test_suite/clang/2002-01_02.c3t b/test/test_suite/clang/2002-01_02.c3t index f04926b66..5b22b65c8 100644 --- a/test/test_suite/clang/2002-01_02.c3t +++ b/test/test_suite/clang/2002-01_02.c3t @@ -136,8 +136,7 @@ void *[*] data = { &afoo, &abar, &axx }; %Foo = type { i32, i32 } %Foostruct = type { i16 } -%Edge_rec = type { %Vertex*, %Edge_rec*, i32, i32 } -%Vertex = type { float, float, float } +%Edge_rec = type { ptr, ptr, i32, i32 } %Test = type { i16, i16, i32, i32 } %STest2 = type { i32, [4 x i16], double } @@ -146,30 +145,25 @@ void *[*] data = { &afoo, &abar, &axx }; @test_abar = global double 1.200000e+01, align 8 @test_axx = global float 1.200000e+01, align 4 @.str = private unnamed_addr constant [5 x i8] c"EXIT\00", align 1 -@test_procnames = local_unnamed_addr global [1 x i8*] [i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0)], align 8 -@test_data = local_unnamed_addr global [3 x i8*] [i8* bitcast (double* @test_afoo to i8*), i8* bitcast (double* @test_abar to i8*), i8* bitcast (float* @test_axx to i8*)], align 16 +@test_procnames = local_unnamed_addr global [1 x ptr] [ptr @.str], align 8 +@test_data = local_unnamed_addr global [3 x ptr] [ptr @test_afoo, ptr @test_abar, ptr @test_axx], align 16 @.str.6 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1 -; Function Attrs: nounwind define void @test_foo() #0 { entry: ret void } -; Function Attrs: nounwind -declare i8* @test_dlclose(i8*) #0 +declare ptr @test_dlclose(ptr) #0 -; Function Attrs: nounwind -define void @test_ap_os_dso_unload(i8* %0) #0 { +define void @test_ap_os_dso_unload(ptr %0) #0 { entry: - %1 = call i8* @test_dlclose(i8* %0) + %1 = call ptr @test_dlclose(ptr %0) ret void } -; Function Attrs: nounwind declare void @foo2(i32, double, float) #0 -; Function Attrs: nounwind define void @test_bar(i32 %0) #0 { entry: %intbool = icmp ne i32 %0, 0 @@ -178,11 +172,9 @@ entry: ret void } -; Function Attrs: nounwind declare i32 @tolower(i32) #0 -; Function Attrs: nounwind -define i8* @test_rangematch(i8* %0, i32 %1, i32 %2) #0 { +define ptr @test_rangematch(ptr %0, i32 %1, i32 %2) #0 { entry: %le = icmp sle i32 %2, %1 %3 = call i32 @tolower(i32 %2) @@ -194,48 +186,44 @@ entry: br i1 %or, label %if.then, label %if.exit if.then: ; preds = %entry - ret i8* null + ret ptr null if.exit: ; preds = %entry - ret i8* %0 + ret ptr %0 } -; Function Attrs: nounwind declare i32 @foo3(i16) #0 -; Function Attrs: nounwind define void @test_teste2() #0 { entry: %xqic = alloca %Foostruct, align 2 - %0 = bitcast %Foostruct* %xqic to i16* - store i16 0, i16* %0, align 2 - %1 = getelementptr inbounds %Foostruct, %Foostruct* %xqic, i32 0, i32 0 - %2 = load i16, i16* %1, align 2 - %3 = call i32 @foo3(i16 %2) + store i16 0, ptr %xqic, align 2 + %0 = getelementptr inbounds %Foostruct, ptr %xqic, i32 0, i32 0 + %1 = load i16, ptr %0, align 2 + %2 = call i32 @foo3(i16 %1) ret void } -; Function Attrs: nounwind -define i32 @test_do_merge(%Edge_rec* %0, %Edge_rec* %1) #0 { +define i32 @test_do_merge(ptr %0, ptr %1) #0 { entry: %lvalid = alloca i32, align 4 - %basel = alloca %Edge_rec*, align 8 - %rcand = alloca %Edge_rec*, align 8 - store i32 0, i32* %lvalid, align 4 - store %Edge_rec* null, %Edge_rec** %basel, align 8 - store %Edge_rec* null, %Edge_rec** %rcand, align 8 + %basel = alloca ptr, align 8 + %rcand = alloca ptr, align 8 + store i32 0, ptr %lvalid, align 4 + store ptr null, ptr %basel, align 8 + store ptr null, ptr %rcand, align 8 br label %loop.body loop.body: ; preds = %if.exit, %entry - %2 = load i32, i32* %lvalid, align 4 + %2 = load i32, ptr %lvalid, align 4 %not = icmp eq i32 %2, 0 br i1 %not, label %if.then, label %if.exit if.then: ; preds = %loop.body - %3 = load %Edge_rec*, %Edge_rec** %basel, align 8 - %4 = getelementptr inbounds %Edge_rec, %Edge_rec* %3, i32 0, i32 1 - %5 = load %Edge_rec*, %Edge_rec** %4, align 8 - %ptrxi = ptrtoint %Edge_rec* %5 to i32 + %3 = load ptr, ptr %basel, align 8 + %4 = getelementptr inbounds %Edge_rec, ptr %3, i32 0, i32 1 + %5 = load ptr, ptr %4, align 8 + %ptrxi = ptrtoint ptr %5 to i32 ret i32 %ptrxi if.exit: ; preds = %loop.body @@ -245,132 +233,112 @@ loop.exit: ; No predecessors! ret i32 1 } -; Function Attrs: nounwind define i32 @test_test(i32 %0) #0 { entry: ret i32 %0 } -; Function Attrs: nounwind -declare void @test_abc(i32*) #0 +declare void @test_abc(ptr) #0 -; Function Attrs: nounwind define i32 @test_def(i32 %0, i32 %1) #0 { entry: %z = alloca i32, align 4 - store i32 %1, i32* %z, align 4 - call void @test_abc(i32* %z) + store i32 %1, ptr %z, align 4 + call void @test_abc(ptr %z) ret i32 %0 } -; Function Attrs: nounwind -define i32 @test_testing(%Test* %0) #0 { +define i32 @test_testing(ptr %0) #0 { entry: - %1 = getelementptr inbounds %Test, %Test* %0, i32 0, i32 1 - %2 = load i16, i16* %1, align 2 + %1 = getelementptr inbounds %Test, ptr %0, i32 0, i32 1 + %2 = load i16, ptr %1, align 2 %sisiext = sext i16 %2 to i32 - %3 = getelementptr inbounds %Test, %Test* %0, i32 0, i32 2 - %4 = load i32, i32* %3, align 4 + %3 = getelementptr inbounds %Test, ptr %0, i32 0, i32 2 + %4 = load i32, ptr %3, align 4 %add = add i32 %sisiext, %4 ret i32 %add } -; Function Attrs: nounwind define i32 @test_test2(i32 %0, i64 %1, i32 %2, i32 %3) #0 { entry: %4 = alloca { i64, i32 }, align 8 - %a = bitcast { i64, i32 }* %4 to %Test* - %5 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 0 - store i64 %1, i64* %5, align 8 - %6 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 1 - store i32 %2, i32* %6, align 8 + %5 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 0 + store i64 %1, ptr %5, align 8 + %6 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 1 + store i32 %2, ptr %6, align 8 %add = add i32 %0, %3 - %7 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 1 - %8 = load i16, i16* %7, align 2 + %7 = getelementptr inbounds %Test, ptr %4, i32 0, i32 1 + %8 = load i16, ptr %7, align 2 %sisiext = sext i16 %8 to i32 %add1 = add i32 %add, %sisiext - %9 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 2 - %10 = load i32, i32* %9, align 4 + %9 = getelementptr inbounds %Test, ptr %4, i32 0, i32 2 + %10 = load i32, ptr %9, align 4 %add2 = add i32 %add1, %10 ret i32 %add2 } -; Function Attrs: nounwind define i32 @test_test3(i64 %0, i32 %1, i64 %2, i32 %3) #0 { entry: %4 = alloca { i64, i32 }, align 8 %5 = alloca { i64, i32 }, align 8 - %a = bitcast { i64, i32 }* %4 to %Test* - %6 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 0 - store i64 %0, i64* %6, align 8 - %7 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 1 - store i32 %1, i32* %7, align 8 - %b = bitcast { i64, i32 }* %5 to %Test* - %8 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %5, i32 0, i32 0 - store i64 %2, i64* %8, align 8 - %9 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %5, i32 0, i32 1 - store i32 %3, i32* %9, align 8 - %10 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 1 - %11 = load i16, i16* %10, align 2 + %6 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 0 + store i64 %0, ptr %6, align 8 + %7 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 1 + store i32 %1, ptr %7, align 8 + %8 = getelementptr inbounds { i64, i32 }, ptr %5, i32 0, i32 0 + store i64 %2, ptr %8, align 8 + %9 = getelementptr inbounds { i64, i32 }, ptr %5, i32 0, i32 1 + store i32 %3, ptr %9, align 8 + %10 = getelementptr inbounds %Test, ptr %4, i32 0, i32 1 + %11 = load i16, ptr %10, align 2 %sisiext = sext i16 %11 to i32 - %12 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 2 - %13 = load i32, i32* %12, align 4 + %12 = getelementptr inbounds %Test, ptr %4, i32 0, i32 2 + %13 = load i32, ptr %12, align 4 %add = add i32 %sisiext, %13 - %14 = getelementptr inbounds %Test, %Test* %b, i32 0, i32 2 - %15 = load i32, i32* %14, align 4 + %14 = getelementptr inbounds %Test, ptr %5, i32 0, i32 2 + %15 = load i32, ptr %14, align 4 %add1 = add i32 %add, %15 - %16 = getelementptr inbounds %Test, %Test* %b, i32 0, i32 3 - %17 = load i32, i32* %16, align 8 + %16 = getelementptr inbounds %Test, ptr %5, i32 0, i32 3 + %17 = load i32, ptr %16, align 8 %add2 = add i32 %add1, %17 ret i32 %add2 } -; Function Attrs: nounwind define { i64, i32 } @test_test4(i64 %0, i32 %1) #0 { entry: %2 = alloca { i64, i32 }, align 8 %tempcoerce = alloca { i64, i32 }, align 8 - %a = bitcast { i64, i32 }* %2 to %Test* - %3 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %2, i32 0, i32 0 - store i64 %0, i64* %3, align 8 - %4 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %2, i32 0, i32 1 - store i32 %1, i32* %4, align 8 - %5 = bitcast { i64, i32 }* %tempcoerce to i8* - %6 = bitcast %Test* %a to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 8 %6, i32 12, i1 false) - %7 = load { i64, i32 }, { i64, i32 }* %tempcoerce, align 8 - ret { i64, i32 } %7 + %3 = getelementptr inbounds { i64, i32 }, ptr %2, i32 0, i32 0 + store i64 %0, ptr %3, align 8 + %4 = getelementptr inbounds { i64, i32 }, ptr %2, i32 0, i32 1 + store i32 %1, ptr %4, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %tempcoerce, ptr align 8 %2, i32 12, i1 false) + %5 = load { i64, i32 }, ptr %tempcoerce, align 8 + ret { i64, i32 } %5 } -; Function Attrs: nounwind define i32 @test_test6() #0 { entry: %b = alloca [200 x i32], align 16 - %0 = bitcast [200 x i32]* %b to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 800, i1 false) - %1 = getelementptr inbounds [200 x i32], [200 x i32]* %b, i64 0, i64 4 - %2 = load i32, i32* %1, align 4 - ret i32 %2 + call void @llvm.memset.p0.i64(ptr align 16 %b, i8 0, i64 800, i1 false) + %0 = getelementptr inbounds [200 x i32], ptr %b, i64 0, i64 4 + %1 = load i32, ptr %0, align 4 + ret i32 %1 } -; Function Attrs: nounwind -define void @test_test7(%STest2* noalias sret(%STest2) align 8 %0, %STest2* byval(%STest2) align 8 %1) #0 { +define void @test_test7(ptr noalias sret(%STest2) align 8 %0, ptr byval(%STest2) align 8 %1) #0 { entry: - %2 = bitcast %STest2* %0 to i8* - %3 = bitcast %STest2* %1 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %2, i8* align 8 %3, i32 24, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %1, i32 24, i1 false) ret void } -; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 -; Function Attrs: nounwind define i32 @test_main2() #0 { entry: %v = alloca i64, align 8 - store i64 123455678902, i64* %v, align 8 - %0 = load i64, i64* %v, align 8 - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i64 %0) + store i64 123455678902, ptr %v, align 8 + %0 = load i64, ptr %v, align 8 + %1 = call i32 (ptr, ...) @printf(ptr @.str.6, i64 %0) ret i32 1 } diff --git a/test/test_suite/clang/2002-03.c3t b/test/test_suite/clang/2002-03.c3t index 9cc3fba78..23afbbfc7 100644 --- a/test/test_suite/clang/2002-03.c3t +++ b/test/test_suite/clang/2002-03.c3t @@ -55,41 +55,43 @@ fn char* foo() { @test_a = local_unnamed_addr global { i32, i32, [8 x i32] } { i32 0, i32 2, [8 x i32] zeroinitializer }, align 16 @test_str = local_unnamed_addr global [10 x i8] c"x\00\00\00\00\00\00\00\00\00", align 1 -@test_arr = local_unnamed_addr global { i8*, i8*, [3 x i8*] } zeroinitializer, align 16 +@test_arr = local_unnamed_addr global { ptr, ptr, [3 x ptr] } zeroinitializer, align 16 @test_f = local_unnamed_addr global { float, float, [10 x float] } { float 0x3FF3AE1480000000, float 0x40415999A0000000, [10 x float] zeroinitializer }, align 16 @test_array = local_unnamed_addr global { %Test, %Test, [8 x %Test] } { %Test { i32 2, double 1.200000e+01 }, %Test { i32 3, double 2.400000e+01 }, [8 x %Test] zeroinitializer }, align 16 @test_b = local_unnamed_addr global { [4 x i32], { i32, i32, i32, i32 }, { i32, i32, [2 x i32] }, [4 x i32] } { [4 x i32] [i32 1, i32 2, i32 3, i32 4], { i32, i32, i32, i32 } { i32 5, i32 6, i32 7, i32 0 }, { i32, i32, [2 x i32] } { i32 8, i32 9, [2 x i32] zeroinitializer }, [4 x i32] zeroinitializer }, align 16 @test_link = local_unnamed_addr global [3 x %Connection] [%Connection { i64 1, [10 x i8] c"link1\00\00\00\00\00", i64 10 }, %Connection { i64 2, [10 x i8] c"link2\00\00\00\00\00", i64 20 }, %Connection { i64 3, [10 x i8] c"link3\00\00\00\00\00", i64 30 }], align 16 +@.str = private unnamed_addr constant [4 x i8] c"\1F\C2\8B\00", align 1 +@.str.7 = private unnamed_addr constant [32 x i8] c"*** Word \22%s\22 on line %d is not\00", align 1 -declare i32 @test_strcmp(i8*, i8*) #0 +declare i32 @test_strcmp(ptr, ptr) #0 -define i32 @test_test(i8* %0) #0 { +define i32 @test_test(ptr %0) #0 { entry: - %1 = call i32 @test_strcmp(i8* %0, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0)) + %1 = call i32 @test_strcmp(ptr %0, ptr @.str) ret i32 %1 } -define i32 @test_trys(i8* %0, i32 %1) #0 { +define i32 @test_trys(ptr %0, i32 %1) #0 { entry: %asa = alloca i32, align 4 %val = alloca double, align 8 %lLS = alloca i32, align 4 - store i32 0, i32* %asa, align 4 - store double 0.000000e+00, double* %val, align 8 - store i32 0, i32* %lLS, align 4 + store i32 0, ptr %asa, align 4 + store double 0.000000e+00, ptr %val, align 8 + store i32 0, ptr %lLS, align 4 %intbool = icmp ne i32 %1, 0 br i1 %intbool, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, i32* %lLS, align 4 - %3 = load i32, i32* %asa, align 4 + %2 = load i32, ptr %lLS, align 4 + %3 = load i32, ptr %asa, align 4 %add = add i32 %2, %3 - store i32 %add, i32* %asa, align 4 + store i32 %add, ptr %asa, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry - %4 = load i32, i32* %asa, align 4 - %5 = load double, double* %val, align 8 + %4 = load i32, ptr %asa, align 4 + %5 = load double, ptr %val, align 8 %fpsi = fptosi double %5 to i32 %add1 = add i32 %4, %fpsi ret i32 %add1 diff --git a/test/test_suite/clang/2002-04.c3t b/test/test_suite/clang/2002-04.c3t index 4909eab1b..14dea515b 100644 --- a/test/test_suite/clang/2002-04.c3t +++ b/test/test_suite/clang/2002-04.c3t @@ -80,11 +80,11 @@ loop.cond: ; preds = %switch.exit, %entry loop.body: ; preds = %loop.cond %1 = call i32 @foo() - store i32 %1, i32* %switch, align 4 + store i32 %1, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body - %2 = load i32, i32* %switch, align 4 + %2 = load i32, ptr %switch, align 4 switch i32 %2, label %switch.exit [ i32 0, label %switch.case i32 1, label %switch.case @@ -96,11 +96,11 @@ switch.entry: ; preds = %loop.body ] switch.case: ; preds = %switch.entry, %switch.entry, %switch.entry, %switch.entry - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) + %3 = call i32 (ptr, ...) @printf(ptr @.str) br label %switch.case1 switch.case1: ; preds = %switch.entry, %switch.case - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) + %4 = call i32 (ptr, ...) @printf(ptr @.str.1) br label %switch.exit switch.exit: ; preds = %switch.entry, %switch.entry, %switch.case1, %switch.entry @@ -110,70 +110,55 @@ loop.exit: ; preds = %loop.cond ret i32 0 } -; Function Attrs: nounwind define double @test_test(i32 %0) #0 { entry: %student_t = alloca [30 x double], align 16 - %1 = bitcast [30 x double]* %student_t to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %1, i8* align 16 bitcast ([30 x double]* @.__const to i8*), i32 240, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %student_t, ptr align 16 @.__const, i32 240, i1 false) %zext = zext i32 %0 to i64 - %2 = getelementptr inbounds [30 x double], [30 x double]* %student_t, i64 0, i64 %zext - %3 = load double, double* %2, align 8 - ret double %3 + %1 = getelementptr inbounds [30 x double], ptr %student_t, i64 0, i64 %zext + %2 = load double, ptr %1, align 8 + ret double %2 } -; Function Attrs: nounwind -declare i64 @func_returning_struct() #0 - -; Function Attrs: nounwind define void @test_loop() #0 { entry: %result = alloca %St, align 4 %0 = call i64 @func_returning_struct() - %1 = bitcast %St* %result to i64* - store i64 %0, i64* %1, align 4 + store i64 %0, ptr %result, align 4 ret void } -; Function Attrs: nounwind -declare i32 @testF(%FooSt* byval(%FooSt) align 8, float) #0 +declare i32 @testF(ptr byval(%FooSt) align 8, float) #0 -; Function Attrs: nounwind declare i32 @testE(i8 zeroext, i16 signext, i8 zeroext, i32, i32, float) #0 -; Function Attrs: nounwind -define void @test_test3(%FooSt* %0) #0 { +define void @test_test3(ptr %0) #0 { entry: - %1 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 1 - store i16 1, i16* %1, align 2 + %1 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 1 + store i16 1, ptr %1, align 2 ret void } -; Function Attrs: nounwind -define void @test_test2(%FooSt* byval(%FooSt) align 8 %0) #0 { +define void @test_test2(ptr byval(%FooSt) align 8 %0) #0 { entry: %indirectarg = alloca %FooSt, align 8 %indirectarg1 = alloca %FooSt, align 8 - %1 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 0 - %2 = load i8, i8* %1, align 4 - %3 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 1 - %4 = load i16, i16* %3, align 2 - %5 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 2 - %6 = load i8, i8* %5, align 4 - %7 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 3 - %8 = load i32, i32* %7, align 4 - %9 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 4 - %10 = load i16, i16* %9, align 4 + %1 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 0 + %2 = load i8, ptr %1, align 4 + %3 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 1 + %4 = load i16, ptr %3, align 2 + %5 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 2 + %6 = load i8, ptr %5, align 4 + %7 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 3 + %8 = load i32, ptr %7, align 4 + %9 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 4 + %10 = load i16, ptr %9, align 4 %sisiext = sext i16 %10 to i32 %11 = call i32 @testE(i8 %2, i16 %4, i8 %6, i32 %8, i32 %sisiext, float 0x3FB99999A0000000) - %12 = bitcast %FooSt* %indirectarg to i8* - %13 = bitcast %FooSt* %0 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %12, i8* align 4 %13, i32 20, i1 false) - %14 = call i32 @testF(%FooSt* byval(%FooSt) align 8 %indirectarg, float 0x3FB99999A0000000) - %15 = bitcast %FooSt* %indirectarg1 to i8* - %16 = bitcast %FooSt* %0 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %15, i8* align 4 %16, i32 20, i1 false) - call void @test_test2(%FooSt* byval(%FooSt) align 8 %indirectarg1) - call void @test_test3(%FooSt* %0) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 4 %0, i32 20, i1 false) + %12 = call i32 @testF(ptr byval(%FooSt) align 8 %indirectarg, float 0x3FB99999A0000000) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg1, ptr align 4 %0, i32 20, i1 false) + call void @test_test2(ptr byval(%FooSt) align 8 %indirectarg1) + call void @test_test3(ptr %0) ret void } diff --git a/test/test_suite/compile_time/compile_time_access_subscript.c3t b/test/test_suite/compile_time/compile_time_access_subscript.c3t index a1e8f7bd0..e9438a947 100644 --- a/test/test_suite/compile_time/compile_time_access_subscript.c3t +++ b/test/test_suite/compile_time/compile_time_access_subscript.c3t @@ -39,84 +39,72 @@ fn void main() check_type(Bdd); check_type(int[2]); check_type(int[]); - io::printfln("%d", $b[0].m11); + io::printfn("%d", $b[0].m11); } /* #expect: test.ll - %z = alloca i32, align 4 - %z1 = alloca %Abc, align 4 - %z2 = alloca i64, align 8 - %z3 = alloca i32, align 4 - %z4 = alloca i32*, align 8 - %z5 = alloca i8, align 1 - %z6 = alloca i64, align 8 - %z7 = alloca <3 x i32>, align 16 - %z8 = alloca %Abc, align 4 - %z9 = alloca [2 x i32], align 4 - %z10 = alloca %"int[]", align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %literal = alloca %Abc, align 4 - %taddr = alloca %"variant[]", align 8 - store i32 0, i32* %z, align 4 - %0 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 0 - store float 0.000000e+00, float* %0, align 4 - %1 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 1 - store float 0.000000e+00, float* %1, align 4 - %2 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 2 - store float 0.000000e+00, float* %2, align 4 - %3 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 3 - store float 0.000000e+00, float* %3, align 4 - store i64 0, i64* %z2, align 8 - store i32 0, i32* %z3, align 4 - store i32* null, i32** %z4, align 8 - store i8 0, i8* %z5, align 1 - store i64 0, i64* %z6, align 8 - store <3 x i32> zeroinitializer, <3 x i32>* %z7, align 16 - %4 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 0 - store float 0.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 1 - store float 0.000000e+00, float* %5, align 4 - %6 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 2 - store float 0.000000e+00, float* %6, align 4 - %7 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 3 - store float 0.000000e+00, float* %7, align 4 - %8 = getelementptr inbounds [2 x i32], [2 x i32]* %z9, i64 0, i64 0 - store i32 0, i32* %8, align 4 - %9 = getelementptr inbounds [2 x i32], [2 x i32]* %z9, i64 0, i64 1 - store i32 0, i32* %9, align 4 - %10 = bitcast %"int[]"* %z10 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %10, i8 0, i64 16, i1 false) - %11 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 0 - store float 0.000000e+00, float* %11, align 4 - %12 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 1 - store float 0.000000e+00, float* %12, align 4 - %13 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 2 - store float 0.000000e+00, float* %13, align 4 - %14 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 3 - store float 0.000000e+00, float* %14, align 4 - %15 = bitcast %Abc* %literal to i8* - %16 = insertvalue %variant undef, i8* %15, 0 - %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$test_Abc" to i64), 1 - %18 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %17, %variant* %18, align 16 - %19 = bitcast [1 x %variant]* %varargslots to %variant* - %20 = insertvalue %"variant[]" undef, %variant* %19, 0 - %21 = insertvalue %"variant[]" %20, i64 1, 1 - store %"variant[]" %21, %"variant[]"* %taddr, align 8 - %22 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 0 - %lo = load i8*, i8** %23, align 8 - %24 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 1 - %hi = load i64, i64* %24, align 8 - %25 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %25, 0 - br i1 %not_err, label %after_check, label %voiderr + %z = alloca i32, align 4 + %z1 = alloca %Abc, align 4 + %z2 = alloca i64, align 8 + %z3 = alloca i32, align 4 + %z4 = alloca ptr, align 8 + %z5 = alloca i8, align 1 + %z6 = alloca i64, align 8 + %z7 = alloca <3 x i32>, align 16 + %z8 = alloca %Abc, align 4 + %z9 = alloca [2 x i32], align 4 + %z10 = alloca %"int[]", align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %literal = alloca %Abc, align 4 + store i32 0, ptr %z, align 4 + %0 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 0 + store float 0.000000e+00, ptr %0, align 4 + %1 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 1 + store float 0.000000e+00, ptr %1, align 4 + %2 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 2 + store float 0.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 3 + store float 0.000000e+00, ptr %3, align 4 + store i64 0, ptr %z2, align 8 + store i32 0, ptr %z3, align 4 + store ptr null, ptr %z4, align 8 + store i8 0, ptr %z5, align 1 + store i64 0, ptr %z6, align 8 + store <3 x i32> zeroinitializer, ptr %z7, align 16 + %4 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 0 + store float 0.000000e+00, ptr %4, align 4 + %5 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 1 + store float 0.000000e+00, ptr %5, align 4 + %6 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 2 + store float 0.000000e+00, ptr %6, align 4 + %7 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 3 + store float 0.000000e+00, ptr %7, align 4 + %8 = getelementptr inbounds [2 x i32], ptr %z9, i64 0, i64 0 + store i32 0, ptr %8, align 4 + %9 = getelementptr inbounds [2 x i32], ptr %z9, i64 0, i64 1 + store i32 0, ptr %9, align 4 + call void @llvm.memset.p0.i64(ptr align 8 %z10, i8 0, i64 16, i1 false) + %10 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 0 + store float 0.000000e+00, ptr %10, align 4 + %11 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 1 + store float 0.000000e+00, ptr %11, align 4 + %12 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 2 + store float 0.000000e+00, ptr %12, align 4 + %13 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 3 + store float 0.000000e+00, ptr %13, align 4 + %14 = insertvalue %variant undef, ptr %literal, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$test_Abc" to i64), 1 + %16 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %15, ptr %16, align 16 + %17 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %17, 0 + br i1 %not_err, label %after_check, label %voiderr -after_check: ; preds = %entry - br label %voiderr + after_check: ; preds = %entry + br label %voiderr -voiderr: ; preds = %after_check, %entry - ret void -} + voiderr: ; preds = %after_check, %entry + ret void + } diff --git a/test/test_suite/compile_time/compile_time_array.c3t b/test/test_suite/compile_time/compile_time_array.c3t index f67c3ddb2..412ce0b29 100644 --- a/test/test_suite/compile_time/compile_time_array.c3t +++ b/test/test_suite/compile_time/compile_time_array.c3t @@ -13,17 +13,16 @@ fn void test() /* #expect: test.ll - -%"char[]" = type { i8*, i64 } +%"char[]" = type { ptr, i64 } @.str = private unnamed_addr constant [2 x i8] c"a\00", align 1 +; Function Attrs: nounwind define void @test_test() #0 { entry: %x = alloca i32, align 4 %z = alloca %"char[]", align 8 - store i32 1, i32* %x, align 4 - store %"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i64 1 }, %"char[]"* %z, align 8 + store i32 1, ptr %x, align 4 + store %"char[]" { ptr @.str, i64 1 }, ptr %z, align 8 ret void } - diff --git a/test/test_suite/compile_time/compile_time_array_ref.c3t b/test/test_suite/compile_time/compile_time_array_ref.c3t index aed2889fe..2955ab0db 100644 --- a/test/test_suite/compile_time/compile_time_array_ref.c3t +++ b/test/test_suite/compile_time/compile_time_array_ref.c3t @@ -13,12 +13,6 @@ fn void test() /* #expect: foo.ll @foo_stack = local_unnamed_addr global [8192 x i8] zeroinitializer, align 16 -@foo_x = local_unnamed_addr global i8* getelementptr inbounds ([8192 x i8], [8192 x i8]* @foo_stack, i64 0, i64 1000), align 8 +@foo_x = local_unnamed_addr global ptr getelementptr (i8, ptr @foo_stack, i64 1000), align 8 @"test$y" = internal unnamed_addr global [2 x i8] zeroinitializer, align 1 -@"test$z" = internal unnamed_addr global i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"test$y", i64 0, i64 1), align 8 - -; Function Attrs: nounwind -define void @foo_test() #0 { -entry: - ret void -} +@"test$z" = internal unnamed_addr global ptr getelementptr inbounds ([2 x i8], ptr @"test$y", i64 0, i64 1), align 8 \ No newline at end of file diff --git a/test/test_suite/compile_time/compile_time_pointers.c3t b/test/test_suite/compile_time/compile_time_pointers.c3t index ae7c411b1..6e115970b 100644 --- a/test/test_suite/compile_time/compile_time_pointers.c3t +++ b/test/test_suite/compile_time/compile_time_pointers.c3t @@ -24,12 +24,12 @@ fn void test() /* #expect: test.ll @test_ABC = local_unnamed_addr constant i64 531, align 8 -@test_BAC = local_unnamed_addr constant i8* inttoptr (i64 143 to i8*), align 8 -@test_EXX = local_unnamed_addr constant i8* inttoptr (i64 155 to i8*), align 8 +@test_BAC = local_unnamed_addr constant ptr inttoptr (i64 143 to ptr), align 8 +@test_EXX = local_unnamed_addr constant ptr inttoptr (i64 155 to ptr), align 8 @test_KEX = local_unnamed_addr constant i64 -12, align 8 -@test_CAB = local_unnamed_addr constant i8* inttoptr (i64 143 to i8*), align 8 +@test_CAB = local_unnamed_addr constant ptr inttoptr (i64 143 to ptr), align 8 @test_ZAB = local_unnamed_addr constant i64 143, align 8 -@test_BOB = local_unnamed_addr constant i32* inttoptr (i64 12 to i32*), align 8 -@test_BAB = local_unnamed_addr constant i32* inttoptr (i64 20 to i32*), align 8 +@test_BOB = local_unnamed_addr constant ptr inttoptr (i64 12 to ptr), align 8 +@test_BAB = local_unnamed_addr constant ptr inttoptr (i64 20 to ptr), align 8 @test_AO = local_unnamed_addr constant i64 2, align 8 @test_abc = local_unnamed_addr global i32 123, align 4 \ No newline at end of file diff --git a/test/test_suite/compile_time/compile_time_ptr_ref.c3t b/test/test_suite/compile_time/compile_time_ptr_ref.c3t index 83bf64236..e4fc87bf1 100644 --- a/test/test_suite/compile_time/compile_time_ptr_ref.c3t +++ b/test/test_suite/compile_time/compile_time_ptr_ref.c3t @@ -9,14 +9,14 @@ int* c3 = (int*)(4 + (iptr)(&ptr)); iptr ff = (iptr)(&ptr); int ptr = 0; -// #expect: test.ll +/* #expect: test.ll -%"int*[]" = type { i32**, i64 } +%"int*[]" = type { ptr, i64 } -@.taddr = private global [5 x i32*] [i32* @test_ptr, i32* @test_ptr, i32* getelementptr inbounds (i32, i32* @test_ptr, i64 1), i32* getelementptr (i32, i32* @test_ptr, i64 -1), i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 -4) to i32*)], align 8 -@test_blurp = local_unnamed_addr global %"int*[]" { i32** getelementptr inbounds ([5 x i32*], [5 x i32*]* @.taddr, i32 0, i32 0), i64 5 }, align 8 -@test_c = local_unnamed_addr global i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 -4) to i32*), align 8 -@test_c2 = local_unnamed_addr global i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 4) to i32*), align 8 -@test_c3 = local_unnamed_addr global i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 4) to i32*), align 8 -@test_ff = local_unnamed_addr global i64 ptrtoint (i32* @test_ptr to i64), align 8 +@.taddr = private global [5 x ptr] [ptr @test_ptr, ptr @test_ptr, ptr getelementptr inbounds (i32, ptr @test_ptr, i64 1), ptr getelementptr (i32, ptr @test_ptr, i64 -1), ptr getelementptr (i8, ptr @test_ptr, i64 -4)], align 8 +@test_blurp = local_unnamed_addr global %"int*[]" { ptr @.taddr, i64 5 }, align 8 +@test_c = local_unnamed_addr global ptr getelementptr (i8, ptr @test_ptr, i64 -4), align 8 +@test_c2 = local_unnamed_addr global ptr getelementptr (i8, ptr @test_ptr, i64 4), align 8 +@test_c3 = local_unnamed_addr global ptr getelementptr (i8, ptr @test_ptr, i64 4), align 8 +@test_ff = local_unnamed_addr global i64 ptrtoint (ptr @test_ptr to i64), align 8 @test_ptr = global i32 0, align 4 \ No newline at end of file diff --git a/test/test_suite/compile_time/ct_builtin_time_date.c3t b/test/test_suite/compile_time/ct_builtin_time_date.c3t index 52de8ef8e..46d37b5aa 100644 --- a/test/test_suite/compile_time/ct_builtin_time_date.c3t +++ b/test/test_suite/compile_time/ct_builtin_time_date.c3t @@ -4,11 +4,11 @@ import std::io; macro printline() { - io::printfln("%d", $$LINE); io::printfln("%d", $$LINE_RAW); + io::printfn("%d", $$LINE); io::printfn("%d", $$LINE_RAW); } fn void test(int x) { - io::printfln("%d", x); + io::printfn("%d", x); if (x > 0) $$FUNCTION(x - 1); io::println($$TIME); io::println($$DATE); @@ -26,37 +26,25 @@ fn void main() /* #expect: test.ll + define void @test_test(i32 %0) #0 { entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [1 x %variant], align 16 - %taddr4 = alloca i64, align 8 - %taddr5 = alloca %"variant[]", align 8 - %retparam11 = alloca i64, align 8 - %varargslots12 = alloca [1 x %variant], align 16 - %taddr13 = alloca i64, align 8 - %taddr14 = alloca %"variant[]", align 8 - store i32 %0, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr1, align 8 - %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %11, 0 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %taddr3 = alloca i64, align 8 + %retparam7 = alloca i64, align 8 + %varargslots8 = alloca [1 x %variant], align 16 + %taddr9 = alloca i64, align 8 + store i32 %0, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry @@ -72,55 +60,35 @@ if.then: ; preds = %voiderr br label %if.exit if.exit: ; preds = %if.then, %voiderr - %12 = call i32 @std_io_println(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)) #1 - %13 = call i32 @std_io_println(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0)) #1 - store i64 14, i64* %taddr4, align 8 - %14 = bitcast i64* %taddr4 to i8* - %15 = insertvalue %variant undef, i8* %14, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 - %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 - store %variant %16, %variant* %17, align 16 - %18 = bitcast [1 x %variant]* %varargslots3 to %variant* - %19 = insertvalue %"variant[]" undef, %variant* %18, 0 - %20 = insertvalue %"variant[]" %19, i64 1, 1 - store %"variant[]" %20, %"variant[]"* %taddr5, align 8 - %21 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 - %lo6 = load i8*, i8** %22, align 8 - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 - %hi7 = load i64, i64* %23, align 8 - %24 = call i64 @std_io_printfln(i64* %retparam2, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %24, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + %5 = call i32 @std_io_println(ptr @.str.1) #1 + %6 = call i32 @std_io_println(ptr @.str.2) #1 + store i64 14, ptr %taddr3, align 8 + %7 = insertvalue %variant undef, ptr %taddr3, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$long" to i64), 1 + %9 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %8, ptr %9, align 16 + %10 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.3, i64 2, ptr %varargslots2, i64 1) + %not_err4 = icmp eq i64 %10, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %if.exit - br label %voiderr10 +after_check5: ; preds = %if.exit + br label %voiderr6 -voiderr10: ; preds = %after_check9, %if.exit - store i64 6, i64* %taddr13, align 8 - %25 = bitcast i64* %taddr13 to i8* - %26 = insertvalue %variant undef, i8* %25, 0 - %27 = insertvalue %variant %26, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 - %28 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 - store %variant %27, %variant* %28, align 16 - %29 = bitcast [1 x %variant]* %varargslots12 to %variant* - %30 = insertvalue %"variant[]" undef, %variant* %29, 0 - %31 = insertvalue %"variant[]" %30, i64 1, 1 - store %"variant[]" %31, %"variant[]"* %taddr14, align 8 - %32 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* - %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 0 - %lo15 = load i8*, i8** %33, align 8 - %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 1 - %hi16 = load i64, i64* %34, align 8 - %35 = call i64 @std_io_printfln(i64* %retparam11, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo15, i64 %hi16) - %not_err17 = icmp eq i64 %35, 0 - br i1 %not_err17, label %after_check18, label %voiderr19 +voiderr6: ; preds = %after_check5, %if.exit + store i64 6, ptr %taddr9, align 8 + %11 = insertvalue %variant undef, ptr %taddr9, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$long" to i64), 1 + %13 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 + store %variant %12, ptr %13, align 16 + %14 = call i64 @std_io_printfn(ptr %retparam7, ptr @.str.4, i64 2, ptr %varargslots8, i64 1) + %not_err10 = icmp eq i64 %14, 0 + br i1 %not_err10, label %after_check11, label %voiderr12 -after_check18: ; preds = %voiderr10 - br label %voiderr19 +after_check11: ; preds = %voiderr6 + br label %voiderr12 -voiderr19: ; preds = %after_check18, %voiderr10 - %36 = call i32 @std_io_println(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.5, i32 0, i32 0)) #1 - %37 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0)) #1 +voiderr12: ; preds = %after_check11, %voiderr6 + %15 = call i32 @std_io_println(ptr @.str.5) #1 + %16 = call i32 @std_io_println(ptr @.str.6) #1 ret void -} \ No newline at end of file +} diff --git a/test/test_suite/compile_time/ct_checks.c3t b/test/test_suite/compile_time/ct_checks.c3t index 357665a2c..214382b48 100644 --- a/test/test_suite/compile_time/ct_checks.c3t +++ b/test/test_suite/compile_time/ct_checks.c3t @@ -10,7 +10,7 @@ fn void main() bool c = $checks(int z = 23, $y += 23, &c); bool d = $checks(&c, $y, int yy = 23); int z = $y; - io::printfln("%s %s %s", b, $y, c); + io::printfn("%s %s %s", b, $y, c); } /* #expect: test.ll diff --git a/test/test_suite/compile_time/ct_enum_values.c3t b/test/test_suite/compile_time/ct_enum_values.c3t index 49ec977b7..5f905e81a 100644 --- a/test/test_suite/compile_time/ct_enum_values.c3t +++ b/test/test_suite/compile_time/ct_enum_values.c3t @@ -23,8 +23,8 @@ fn void main() entry: %x = alloca i32, align 4 - store i32 0, i32* %x, align 4 - store i32 0, i32* %x, align 4 - store i32 1, i32* %x, align 4 + store i32 0, ptr %x, align 4 + store i32 0, ptr %x, align 4 + store i32 1, ptr %x, align 4 ret void } diff --git a/test/test_suite/compile_time/ct_eval.c3t b/test/test_suite/compile_time/ct_eval.c3t index 55f6e312b..b874f45d1 100644 --- a/test/test_suite/compile_time/ct_eval.c3t +++ b/test/test_suite/compile_time/ct_eval.c3t @@ -14,9 +14,9 @@ fn void main() define void @test_main() #0 { entry: %abc = alloca i32, align 4 - store i32 20, i32* %abc, align 4 - store i32 444, i32* %abc, align 4 - %0 = load i32, i32* %abc, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %0) + store i32 20, ptr %abc, align 4 + store i32 444, ptr %abc, align 4 + %0 = load i32, ptr %abc, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %0) ret void } diff --git a/test/test_suite/compile_time/ct_for.c3t b/test/test_suite/compile_time/ct_for.c3t index 7d8994ea8..34d6b921b 100644 --- a/test/test_suite/compile_time/ct_for.c3t +++ b/test/test_suite/compile_time/ct_for.c3t @@ -21,12 +21,12 @@ fn void main() define void @test_main() #0 { entry: - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 0) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 1) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 2) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 0, i32 100) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), i32 1, i32 99) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i32 2, i32 98) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i32 0, i32 0), i32 3, i32 97) + call void (ptr, ...) @printf(ptr @.str, i32 0) + call void (ptr, ...) @printf(ptr @.str.1, i32 1) + call void (ptr, ...) @printf(ptr @.str.2, i32 2) + call void (ptr, ...) @printf(ptr @.str.3, i32 0, i32 100) + call void (ptr, ...) @printf(ptr @.str.4, i32 1, i32 99) + call void (ptr, ...) @printf(ptr @.str.5, i32 2, i32 98) + call void (ptr, ...) @printf(ptr @.str.6, i32 3, i32 97) ret void } diff --git a/test/test_suite/compile_time/ct_foreach.c3t b/test/test_suite/compile_time/ct_foreach.c3t index 02cfb3830..752a86234 100644 --- a/test/test_suite/compile_time/ct_foreach.c3t +++ b/test/test_suite/compile_time/ct_foreach.c3t @@ -31,22 +31,22 @@ fn void main() define void @test_main() #0 { entry: %z = alloca i32, align 4 - %z1 = alloca [3 x i8]*, align 8 + %z1 = alloca ptr, align 8 %z2 = alloca i32, align 4 - %z3 = alloca [5 x i8]*, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 1) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 10) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 34) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 0, i32 1) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), i32 1, i32 10) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i32 2, i32 34) - store i32 123, i32* %z, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0), i32 123) - store [3 x i8]* bitcast ([4 x i8]* @.str.7 to [3 x i8]*), [3 x i8]** %z1, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), [3 x i8]* bitcast ([4 x i8]* @.str.9 to [3 x i8]*)) - store i32 1177, i32* %z2, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.10, i32 0, i32 0), i32 1177) - store [5 x i8]* bitcast ([6 x i8]* @.str.11 to [5 x i8]*), [5 x i8]** %z3, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.12, i32 0, i32 0), [5 x i8]* bitcast ([6 x i8]* @.str.13 to [5 x i8]*)) + %z3 = alloca ptr, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 1) + call void (ptr, ...) @printf(ptr @.str.1, i32 10) + call void (ptr, ...) @printf(ptr @.str.2, i32 34) + call void (ptr, ...) @printf(ptr @.str.3, i32 0, i32 1) + call void (ptr, ...) @printf(ptr @.str.4, i32 1, i32 10) + call void (ptr, ...) @printf(ptr @.str.5, i32 2, i32 34) + store i32 123, ptr %z, align 4 + call void (ptr, ...) @printf(ptr @.str.6, i32 123) + store ptr @.str.7, ptr %z1, align 8 + call void (ptr, ...) @printf(ptr @.str.8, ptr @.str.9) + store i32 1177, ptr %z2, align 4 + call void (ptr, ...) @printf(ptr @.str.10, i32 1177) + store ptr @.str.11, ptr %z3, align 8 + call void (ptr, ...) @printf(ptr @.str.12, ptr @.str.13) ret void } diff --git a/test/test_suite/compile_time/ct_funcptr.c3t b/test/test_suite/compile_time/ct_funcptr.c3t index b0e48ac67..ffbb21d1e 100644 --- a/test/test_suite/compile_time/ct_funcptr.c3t +++ b/test/test_suite/compile_time/ct_funcptr.c3t @@ -5,7 +5,7 @@ import std::io; fn void test(int x) { $typeof(&$$FUNCTION) ptr = &$$FUNCTION; - io::printfln("%d", x); + io::printfn("%d", x); if (x > 0) ptr(x - 1); } @@ -18,29 +18,18 @@ fn void main() define void @test_test(i32 %0) #0 { entry: - %ptr = alloca void (i32)*, align 8 + %ptr = alloca ptr, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 - store void (i32)* @test_test, void (i32)** %ptr, align 8 - store i32 %0, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr1, align 8 - %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %11, 0 + store ptr @test_test, ptr %ptr, align 8 + store i32 %0, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry @@ -51,9 +40,9 @@ voiderr: ; preds = %after_check, %entry br i1 %gt, label %if.then, label %if.exit if.then: ; preds = %voiderr - %12 = load void (i32)*, void (i32)** %ptr, align 8 + %5 = load ptr, ptr %ptr, align 8 %sub = sub i32 %0, 1 - call void %12(i32 %sub) + call void %5(i32 %sub) br label %if.exit if.exit: ; preds = %if.then, %voiderr diff --git a/test/test_suite/compile_time/ct_memberof.c3t b/test/test_suite/compile_time/ct_memberof.c3t index 18e4d116c..b8b2b4ca7 100644 --- a/test/test_suite/compile_time/ct_memberof.c3t +++ b/test/test_suite/compile_time/ct_memberof.c3t @@ -33,10 +33,10 @@ struct Foo } macro print_fields($Type) { - io::printfln("Type: %s", $Type.nameof); + io::printfn("Type: %s", $Type.nameof); var $params = $Type.membersof; $foreach ($param : $params): - io::printfln("%s: %s", $param.nameof, $param.typeid.nameof); + io::printfn("%s: %s", $param.nameof, $param.typeid.nameof); $endforeach; } @@ -84,37 +84,35 @@ fn void main() { var $x = Bar.a; - io::printfln("len: %d", Bar.membersof.len); - io::printfln("len: %d", Bar.baz.membersof.len); - io::printfln("a: %d %d", Bar.a.offsetof, Bar.a.alignof); - io::printfln("b: %d %d", Bar.b.offsetof, Bar.b.alignof); - io::printfln("y: %d %d", Bar.y.offsetof, Bar.y.alignof); - io::printfln("z: %d %d", Bar.z.offsetof, Bar.z.alignof); - io::printfln("z1: %d %d", Bar.z1.offsetof, Bar.z1.alignof); - io::printfln("z2: %d %d", Bar.z2.offsetof, Bar.z2.alignof); - io::printfln("baz: %d %d", Bar.baz.offsetof, Bar.baz.alignof); - io::printfln("Bar: %d", $x.alignof); - io::printfln("foo: %d %d", Bar.baz.foo.offsetof, Bar.baz.foo.alignof); + io::printfn("len: %d", Bar.membersof.len); + io::printfn("len: %d", Bar.baz.membersof.len); + io::printfn("a: %d %d", Bar.a.offsetof, Bar.a.alignof); + io::printfn("b: %d %d", Bar.b.offsetof, Bar.b.alignof); + io::printfn("y: %d %d", Bar.y.offsetof, Bar.y.alignof); + io::printfn("z: %d %d", Bar.z.offsetof, Bar.z.alignof); + io::printfn("z1: %d %d", Bar.z1.offsetof, Bar.z1.alignof); + io::printfn("z2: %d %d", Bar.z2.offsetof, Bar.z2.alignof); + io::printfn("baz: %d %d", Bar.baz.offsetof, Bar.baz.alignof); + io::printfn("Bar: %d", $x.alignof); + io::printfn("foo: %d %d", Bar.baz.foo.offsetof, Bar.baz.foo.alignof); test(10); } /* #expect: test.ll -define void @test_hello(i32 %0, double %1, i64 %2, i64 %3, i8* %4, i64 %5) #0 { +define void @test_hello(i32 %0, double %1, i64 %2, i64 %3, ptr %4, i64 %5) #0 { entry: %d = alloca [4 x i32], align 4 %args = alloca %"variant[]", align 8 - %pair = bitcast [4 x i32]* %d to { i64, i64 }* - %6 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 0 - store i64 %2, i64* %6, align 4 - %7 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 1 - store i64 %3, i64* %7, align 4 - %pair1 = bitcast %"variant[]"* %args to { i8*, i64 }* - %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 0 - store i8* %4, i8** %8, align 8 - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 1 - store i64 %5, i64* %9, align 8 + %6 = getelementptr inbounds { i64, i64 }, ptr %d, i32 0, i32 0 + store i64 %2, ptr %6, align 4 + %7 = getelementptr inbounds { i64, i64 }, ptr %d, i32 0, i32 1 + store i64 %3, ptr %7, align 4 + %8 = getelementptr inbounds { ptr, i64 }, ptr %args, i32 0, i32 0 + store ptr %4, ptr %8, align 8 + %9 = getelementptr inbounds { ptr, i64 }, ptr %args, i32 0, i32 1 + store i64 %5, ptr %9, align 8 ret void } @@ -123,432 +121,279 @@ define void @test_test(i32 %0) #0 { entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca [3 x i8]*, align 8 - %taddr1 = alloca %"variant[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [2 x %variant], align 16 - %taddr4 = alloca [1 x i8]*, align 8 - %taddr5 = alloca [3 x i8]*, align 8 - %taddr6 = alloca %"variant[]", align 8 - %retparam12 = alloca i64, align 8 - %varargslots13 = alloca [2 x %variant], align 16 - %taddr14 = alloca [4 x i8]*, align 8 - %taddr15 = alloca [4 x i8]*, align 8 - %taddr16 = alloca %"variant[]", align 8 + %taddr = alloca ptr, align 8 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [2 x %variant], align 16 + %taddr3 = alloca ptr, align 8 + %taddr4 = alloca ptr, align 8 + %retparam8 = alloca i64, align 8 + %varargslots9 = alloca [2 x %variant], align 16 + %taddr10 = alloca ptr, align 8 + %taddr11 = alloca ptr, align 8 + %retparam15 = alloca i64, align 8 + %varargslots16 = alloca [2 x %variant], align 16 + %taddr17 = alloca ptr, align 8 + %taddr18 = alloca ptr, align 8 %retparam22 = alloca i64, align 8 %varargslots23 = alloca [2 x %variant], align 16 - %taddr24 = alloca [0 x i8]*, align 8 - %taddr25 = alloca [5 x i8]*, align 8 - %taddr26 = alloca %"variant[]", align 8 - %retparam32 = alloca i64, align 8 - %varargslots33 = alloca [2 x %variant], align 16 - %taddr34 = alloca [1 x i8]*, align 8 - %taddr35 = alloca [6 x i8]*, align 8 - %taddr36 = alloca %"variant[]", align 8 + %taddr24 = alloca ptr, align 8 + %taddr25 = alloca ptr, align 8 + %retparam29 = alloca i64, align 8 + %varargslots30 = alloca [1 x %variant], align 16 + %taddr31 = alloca ptr, align 8 + %retparam35 = alloca i64, align 8 + %varargslots36 = alloca [2 x %variant], align 16 + %taddr37 = alloca ptr, align 8 + %taddr38 = alloca ptr, align 8 %retparam42 = alloca i64, align 8 - %varargslots43 = alloca [1 x %variant], align 16 - %taddr44 = alloca [3 x i8]*, align 8 - %taddr45 = alloca %"variant[]", align 8 - %retparam51 = alloca i64, align 8 - %varargslots52 = alloca [2 x %variant], align 16 - %taddr53 = alloca [1 x i8]*, align 8 - %taddr54 = alloca [4 x i8]*, align 8 - %taddr55 = alloca %"variant[]", align 8 - %retparam61 = alloca i64, align 8 - %varargslots62 = alloca [2 x %variant], align 16 - %taddr63 = alloca [1 x i8]*, align 8 - %taddr64 = alloca [5 x i8]*, align 8 - %taddr65 = alloca %"variant[]", align 8 - %retparam71 = alloca i64, align 8 - %varargslots72 = alloca [2 x %variant], align 16 - %taddr73 = alloca [0 x i8]*, align 8 - %taddr74 = alloca [5 x i8]*, align 8 - %taddr75 = alloca %"variant[]", align 8 - %retparam81 = alloca i64, align 8 - %varargslots82 = alloca [2 x %variant], align 16 - %taddr83 = alloca [3 x i8]*, align 8 - %taddr84 = alloca [3 x i8]*, align 8 - %taddr85 = alloca %"variant[]", align 8 - %retparam91 = alloca i64, align 8 - %varargslots92 = alloca [1 x %variant], align 16 - %taddr93 = alloca [4 x i8]*, align 8 - %taddr94 = alloca %"variant[]", align 8 - %retparam100 = alloca i64, align 8 - %varargslots101 = alloca [2 x %variant], align 16 - %taddr102 = alloca [1 x i8]*, align 8 - %taddr103 = alloca [3 x i8]*, align 8 - %taddr104 = alloca %"variant[]", align 8 - %retparam110 = alloca i64, align 8 - %varargslots111 = alloca [2 x %variant], align 16 - %taddr112 = alloca [1 x i8]*, align 8 - %taddr113 = alloca [5 x i8]*, align 8 - %taddr114 = alloca %"variant[]", align 8 - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0)) #1 - %2 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i32 0, i32 0)) #1 - %3 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i32 0, i32 0)) #1 - %4 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i32 0, i32 0)) #1 - %5 = call i32 @std_io_println(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i32 0, i32 0)) #1 - %6 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.14, i32 0, i32 0)) #1 - %7 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.15, i32 0, i32 0)) #1 - store [3 x i8]* bitcast ([4 x i8]* @.str.17 to [3 x i8]*), [3 x i8]** %taddr, align 8 - %8 = bitcast [3 x i8]** %taddr to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %11 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %10, %variant* %11, align 16 - %12 = bitcast [1 x %variant]* %varargslots to %variant* - %13 = insertvalue %"variant[]" undef, %variant* %12, 0 - %14 = insertvalue %"variant[]" %13, i64 1, 1 - store %"variant[]" %14, %"variant[]"* %taddr1, align 8 - %15 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 - %lo = load i8*, i8** %16, align 8 - %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 - %hi = load i64, i64* %17, align 8 - %18 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.16, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %18, 0 + %varargslots43 = alloca [2 x %variant], align 16 + %taddr44 = alloca ptr, align 8 + %taddr45 = alloca ptr, align 8 + %retparam49 = alloca i64, align 8 + %varargslots50 = alloca [2 x %variant], align 16 + %taddr51 = alloca ptr, align 8 + %taddr52 = alloca ptr, align 8 + %retparam56 = alloca i64, align 8 + %varargslots57 = alloca [2 x %variant], align 16 + %taddr58 = alloca ptr, align 8 + %taddr59 = alloca ptr, align 8 + %retparam63 = alloca i64, align 8 + %varargslots64 = alloca [1 x %variant], align 16 + %taddr65 = alloca ptr, align 8 + %retparam69 = alloca i64, align 8 + %varargslots70 = alloca [2 x %variant], align 16 + %taddr71 = alloca ptr, align 8 + %taddr72 = alloca ptr, align 8 + %retparam76 = alloca i64, align 8 + %varargslots77 = alloca [2 x %variant], align 16 + %taddr78 = alloca ptr, align 8 + %taddr79 = alloca ptr, align 8 + %1 = call i32 @std_io_println(ptr @.str) #1 + %2 = call i32 @std_io_println(ptr @.str.10) #1 + %3 = call i32 @std_io_println(ptr @.str.11) #1 + %4 = call i32 @std_io_println(ptr @.str.12) #1 + %5 = call i32 @std_io_println(ptr @.str.13) #1 + %6 = call i32 @std_io_println(ptr @.str.14) #1 + %7 = call i32 @std_io_println(ptr @.str.15) #1 + store ptr @.str.17, ptr %taddr, align 8 + %8 = insertvalue %variant undef, ptr %taddr, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %10 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %9, ptr %10, align 16 + %11 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.16, i64 8, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %11, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - store [1 x i8]* bitcast ([2 x i8]* @.str.19 to [1 x i8]*), [1 x i8]** %taddr4, align 8 - %19 = bitcast [1 x i8]** %taddr4 to i8* - %20 = insertvalue %variant undef, i8* %19, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 - %22 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots3, i64 0, i64 0 - store %variant %21, %variant* %22, align 16 - store [3 x i8]* bitcast ([4 x i8]* @.str.20 to [3 x i8]*), [3 x i8]** %taddr5, align 8 - %23 = bitcast [3 x i8]** %taddr5 to i8* - %24 = insertvalue %variant undef, i8* %23, 0 - %25 = insertvalue %variant %24, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %26 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots3, i64 0, i64 1 - store %variant %25, %variant* %26, align 16 - %27 = bitcast [2 x %variant]* %varargslots3 to %variant* - %28 = insertvalue %"variant[]" undef, %variant* %27, 0 - %29 = insertvalue %"variant[]" %28, i64 2, 1 - store %"variant[]" %29, %"variant[]"* %taddr6, align 8 - %30 = bitcast %"variant[]"* %taddr6 to { i8*, i64 }* - %31 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %30, i32 0, i32 0 - %lo7 = load i8*, i8** %31, align 8 - %32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %30, i32 0, i32 1 - %hi8 = load i64, i64* %32, align 8 - %33 = call i64 @std_io_printfln(i64* %retparam2, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.18, i32 0, i32 0), i64 6, i8* %lo7, i64 %hi8) - %not_err9 = icmp eq i64 %33, 0 - br i1 %not_err9, label %after_check10, label %voiderr11 + store ptr @.str.19, ptr %taddr3, align 8 + %12 = insertvalue %variant undef, ptr %taddr3, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 + %14 = getelementptr inbounds [2 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %13, ptr %14, align 16 + store ptr @.str.20, ptr %taddr4, align 8 + %15 = insertvalue %variant undef, ptr %taddr4, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %17 = getelementptr inbounds [2 x %variant], ptr %varargslots2, i64 0, i64 1 + store %variant %16, ptr %17, align 16 + %18 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.18, i64 6, ptr %varargslots2, i64 2) + %not_err5 = icmp eq i64 %18, 0 + br i1 %not_err5, label %after_check6, label %voiderr7 -after_check10: ; preds = %voiderr - br label %voiderr11 +after_check6: ; preds = %voiderr + br label %voiderr7 -voiderr11: ; preds = %after_check10, %voiderr - store [4 x i8]* bitcast ([5 x i8]* @.str.22 to [4 x i8]*), [4 x i8]** %taddr14, align 8 - %34 = bitcast [4 x i8]** %taddr14 to i8* - %35 = insertvalue %variant undef, i8* %34, 0 - %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 - %37 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots13, i64 0, i64 0 - store %variant %36, %variant* %37, align 16 - store [4 x i8]* bitcast ([5 x i8]* @.str.23 to [4 x i8]*), [4 x i8]** %taddr15, align 8 - %38 = bitcast [4 x i8]** %taddr15 to i8* - %39 = insertvalue %variant undef, i8* %38, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 - %41 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots13, i64 0, i64 1 - store %variant %40, %variant* %41, align 16 - %42 = bitcast [2 x %variant]* %varargslots13 to %variant* - %43 = insertvalue %"variant[]" undef, %variant* %42, 0 - %44 = insertvalue %"variant[]" %43, i64 2, 1 - store %"variant[]" %44, %"variant[]"* %taddr16, align 8 - %45 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* - %46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0 - %lo17 = load i8*, i8** %46, align 8 - %47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1 - %hi18 = load i64, i64* %47, align 8 - %48 = call i64 @std_io_printfln(i64* %retparam12, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.21, i32 0, i32 0), i64 6, i8* %lo17, i64 %hi18) - %not_err19 = icmp eq i64 %48, 0 +voiderr7: ; preds = %after_check6, %voiderr + store ptr @.str.22, ptr %taddr10, align 8 + %19 = insertvalue %variant undef, ptr %taddr10, 0 + %20 = insertvalue %variant %19, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 + %21 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 0 + store %variant %20, ptr %21, align 16 + store ptr @.str.23, ptr %taddr11, align 8 + %22 = insertvalue %variant undef, ptr %taddr11, 0 + %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 + %24 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 1 + store %variant %23, ptr %24, align 16 + %25 = call i64 @std_io_printfn(ptr %retparam8, ptr @.str.21, i64 6, ptr %varargslots9, i64 2) + %not_err12 = icmp eq i64 %25, 0 + br i1 %not_err12, label %after_check13, label %voiderr14 + +after_check13: ; preds = %voiderr7 + br label %voiderr14 + +voiderr14: ; preds = %after_check13, %voiderr7 + store ptr @.str.25, ptr %taddr17, align 8 + %26 = insertvalue %variant undef, ptr %taddr17, 0 + %27 = insertvalue %variant %26, i64 ptrtoint (ptr @"ct$p$a0$char" to i64), 1 + %28 = getelementptr inbounds [2 x %variant], ptr %varargslots16, i64 0, i64 0 + store %variant %27, ptr %28, align 16 + store ptr @.str.26, ptr %taddr18, align 8 + %29 = insertvalue %variant undef, ptr %taddr18, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 + %31 = getelementptr inbounds [2 x %variant], ptr %varargslots16, i64 0, i64 1 + store %variant %30, ptr %31, align 16 + %32 = call i64 @std_io_printfn(ptr %retparam15, ptr @.str.24, i64 6, ptr %varargslots16, i64 2) + %not_err19 = icmp eq i64 %32, 0 br i1 %not_err19, label %after_check20, label %voiderr21 -after_check20: ; preds = %voiderr11 +after_check20: ; preds = %voiderr14 br label %voiderr21 -voiderr21: ; preds = %after_check20, %voiderr11 - store [0 x i8]* bitcast ([1 x i8]* @.str.25 to [0 x i8]*), [0 x i8]** %taddr24, align 8 - %49 = bitcast [0 x i8]** %taddr24 to i8* - %50 = insertvalue %variant undef, i8* %49, 0 - %51 = insertvalue %variant %50, i64 ptrtoint (%.introspect* @"ct$p$a0$char" to i64), 1 - %52 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots23, i64 0, i64 0 - store %variant %51, %variant* %52, align 16 - store [5 x i8]* bitcast ([6 x i8]* @.str.26 to [5 x i8]*), [5 x i8]** %taddr25, align 8 - %53 = bitcast [5 x i8]** %taddr25 to i8* - %54 = insertvalue %variant undef, i8* %53, 0 - %55 = insertvalue %variant %54, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 - %56 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots23, i64 0, i64 1 - store %variant %55, %variant* %56, align 16 - %57 = bitcast [2 x %variant]* %varargslots23 to %variant* - %58 = insertvalue %"variant[]" undef, %variant* %57, 0 - %59 = insertvalue %"variant[]" %58, i64 2, 1 - store %"variant[]" %59, %"variant[]"* %taddr26, align 8 - %60 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* - %61 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %60, i32 0, i32 0 - %lo27 = load i8*, i8** %61, align 8 - %62 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %60, i32 0, i32 1 - %hi28 = load i64, i64* %62, align 8 - %63 = call i64 @std_io_printfln(i64* %retparam22, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.24, i32 0, i32 0), i64 6, i8* %lo27, i64 %hi28) - %not_err29 = icmp eq i64 %63, 0 - br i1 %not_err29, label %after_check30, label %voiderr31 +voiderr21: ; preds = %after_check20, %voiderr14 + store ptr @.str.28, ptr %taddr24, align 8 + %33 = insertvalue %variant undef, ptr %taddr24, 0 + %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 + %35 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 0 + store %variant %34, ptr %35, align 16 + store ptr @.str.29, ptr %taddr25, align 8 + %36 = insertvalue %variant undef, ptr %taddr25, 0 + %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$p$a6$char" to i64), 1 + %38 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 1 + store %variant %37, ptr %38, align 16 + %39 = call i64 @std_io_printfn(ptr %retparam22, ptr @.str.27, i64 6, ptr %varargslots23, i64 2) + %not_err26 = icmp eq i64 %39, 0 + br i1 %not_err26, label %after_check27, label %voiderr28 -after_check30: ; preds = %voiderr21 - br label %voiderr31 +after_check27: ; preds = %voiderr21 + br label %voiderr28 -voiderr31: ; preds = %after_check30, %voiderr21 - store [1 x i8]* bitcast ([2 x i8]* @.str.28 to [1 x i8]*), [1 x i8]** %taddr34, align 8 - %64 = bitcast [1 x i8]** %taddr34 to i8* - %65 = insertvalue %variant undef, i8* %64, 0 - %66 = insertvalue %variant %65, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 - %67 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots33, i64 0, i64 0 - store %variant %66, %variant* %67, align 16 - store [6 x i8]* bitcast ([7 x i8]* @.str.29 to [6 x i8]*), [6 x i8]** %taddr35, align 8 - %68 = bitcast [6 x i8]** %taddr35 to i8* - %69 = insertvalue %variant undef, i8* %68, 0 - %70 = insertvalue %variant %69, i64 ptrtoint (%.introspect* @"ct$p$a6$char" to i64), 1 - %71 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots33, i64 0, i64 1 - store %variant %70, %variant* %71, align 16 - %72 = bitcast [2 x %variant]* %varargslots33 to %variant* - %73 = insertvalue %"variant[]" undef, %variant* %72, 0 - %74 = insertvalue %"variant[]" %73, i64 2, 1 - store %"variant[]" %74, %"variant[]"* %taddr36, align 8 - %75 = bitcast %"variant[]"* %taddr36 to { i8*, i64 }* - %76 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %75, i32 0, i32 0 - %lo37 = load i8*, i8** %76, align 8 - %77 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %75, i32 0, i32 1 - %hi38 = load i64, i64* %77, align 8 - %78 = call i64 @std_io_printfln(i64* %retparam32, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.27, i32 0, i32 0), i64 6, i8* %lo37, i64 %hi38) - %not_err39 = icmp eq i64 %78, 0 +voiderr28: ; preds = %after_check27, %voiderr21 + store ptr @.str.31, ptr %taddr31, align 8 + %40 = insertvalue %variant undef, ptr %taddr31, 0 + %41 = insertvalue %variant %40, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %42 = getelementptr inbounds [1 x %variant], ptr %varargslots30, i64 0, i64 0 + store %variant %41, ptr %42, align 16 + %43 = call i64 @std_io_printfn(ptr %retparam29, ptr @.str.30, i64 8, ptr %varargslots30, i64 1) + %not_err32 = icmp eq i64 %43, 0 + br i1 %not_err32, label %after_check33, label %voiderr34 + +after_check33: ; preds = %voiderr28 + br label %voiderr34 + +voiderr34: ; preds = %after_check33, %voiderr28 + store ptr @.str.33, ptr %taddr37, align 8 + %44 = insertvalue %variant undef, ptr %taddr37, 0 + %45 = insertvalue %variant %44, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 + %46 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 0 + store %variant %45, ptr %46, align 16 + store ptr @.str.34, ptr %taddr38, align 8 + %47 = insertvalue %variant undef, ptr %taddr38, 0 + %48 = insertvalue %variant %47, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 + %49 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 1 + store %variant %48, ptr %49, align 16 + %50 = call i64 @std_io_printfn(ptr %retparam35, ptr @.str.32, i64 6, ptr %varargslots36, i64 2) + %not_err39 = icmp eq i64 %50, 0 br i1 %not_err39, label %after_check40, label %voiderr41 -after_check40: ; preds = %voiderr31 +after_check40: ; preds = %voiderr34 br label %voiderr41 -voiderr41: ; preds = %after_check40, %voiderr31 - store [3 x i8]* bitcast ([4 x i8]* @.str.31 to [3 x i8]*), [3 x i8]** %taddr44, align 8 - %79 = bitcast [3 x i8]** %taddr44 to i8* - %80 = insertvalue %variant undef, i8* %79, 0 - %81 = insertvalue %variant %80, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %82 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots43, i64 0, i64 0 - store %variant %81, %variant* %82, align 16 - %83 = bitcast [1 x %variant]* %varargslots43 to %variant* - %84 = insertvalue %"variant[]" undef, %variant* %83, 0 - %85 = insertvalue %"variant[]" %84, i64 1, 1 - store %"variant[]" %85, %"variant[]"* %taddr45, align 8 - %86 = bitcast %"variant[]"* %taddr45 to { i8*, i64 }* - %87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 0 - %lo46 = load i8*, i8** %87, align 8 - %88 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 1 - %hi47 = load i64, i64* %88, align 8 - %89 = call i64 @std_io_printfln(i64* %retparam42, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.30, i32 0, i32 0), i64 8, i8* %lo46, i64 %hi47) - %not_err48 = icmp eq i64 %89, 0 - br i1 %not_err48, label %after_check49, label %voiderr50 +voiderr41: ; preds = %after_check40, %voiderr34 + store ptr @.str.36, ptr %taddr44, align 8 + %51 = insertvalue %variant undef, ptr %taddr44, 0 + %52 = insertvalue %variant %51, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 + %53 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 0 + store %variant %52, ptr %53, align 16 + store ptr @.str.37, ptr %taddr45, align 8 + %54 = insertvalue %variant undef, ptr %taddr45, 0 + %55 = insertvalue %variant %54, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 + %56 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 1 + store %variant %55, ptr %56, align 16 + %57 = call i64 @std_io_printfn(ptr %retparam42, ptr @.str.35, i64 6, ptr %varargslots43, i64 2) + %not_err46 = icmp eq i64 %57, 0 + br i1 %not_err46, label %after_check47, label %voiderr48 -after_check49: ; preds = %voiderr41 - br label %voiderr50 +after_check47: ; preds = %voiderr41 + br label %voiderr48 -voiderr50: ; preds = %after_check49, %voiderr41 - store [1 x i8]* bitcast ([2 x i8]* @.str.33 to [1 x i8]*), [1 x i8]** %taddr53, align 8 - %90 = bitcast [1 x i8]** %taddr53 to i8* - %91 = insertvalue %variant undef, i8* %90, 0 - %92 = insertvalue %variant %91, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 - %93 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 0 - store %variant %92, %variant* %93, align 16 - store [4 x i8]* bitcast ([5 x i8]* @.str.34 to [4 x i8]*), [4 x i8]** %taddr54, align 8 - %94 = bitcast [4 x i8]** %taddr54 to i8* - %95 = insertvalue %variant undef, i8* %94, 0 - %96 = insertvalue %variant %95, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 - %97 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 1 - store %variant %96, %variant* %97, align 16 - %98 = bitcast [2 x %variant]* %varargslots52 to %variant* - %99 = insertvalue %"variant[]" undef, %variant* %98, 0 - %100 = insertvalue %"variant[]" %99, i64 2, 1 - store %"variant[]" %100, %"variant[]"* %taddr55, align 8 - %101 = bitcast %"variant[]"* %taddr55 to { i8*, i64 }* - %102 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %101, i32 0, i32 0 - %lo56 = load i8*, i8** %102, align 8 - %103 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %101, i32 0, i32 1 - %hi57 = load i64, i64* %103, align 8 - %104 = call i64 @std_io_printfln(i64* %retparam51, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.32, i32 0, i32 0), i64 6, i8* %lo56, i64 %hi57) - %not_err58 = icmp eq i64 %104, 0 - br i1 %not_err58, label %after_check59, label %voiderr60 +voiderr48: ; preds = %after_check47, %voiderr41 + store ptr @.str.39, ptr %taddr51, align 8 + %58 = insertvalue %variant undef, ptr %taddr51, 0 + %59 = insertvalue %variant %58, i64 ptrtoint (ptr @"ct$p$a0$char" to i64), 1 + %60 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 0 + store %variant %59, ptr %60, align 16 + store ptr @.str.40, ptr %taddr52, align 8 + %61 = insertvalue %variant undef, ptr %taddr52, 0 + %62 = insertvalue %variant %61, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 + %63 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 1 + store %variant %62, ptr %63, align 16 + %64 = call i64 @std_io_printfn(ptr %retparam49, ptr @.str.38, i64 6, ptr %varargslots50, i64 2) + %not_err53 = icmp eq i64 %64, 0 + br i1 %not_err53, label %after_check54, label %voiderr55 -after_check59: ; preds = %voiderr50 - br label %voiderr60 +after_check54: ; preds = %voiderr48 + br label %voiderr55 -voiderr60: ; preds = %after_check59, %voiderr50 - store [1 x i8]* bitcast ([2 x i8]* @.str.36 to [1 x i8]*), [1 x i8]** %taddr63, align 8 - %105 = bitcast [1 x i8]** %taddr63 to i8* - %106 = insertvalue %variant undef, i8* %105, 0 - %107 = insertvalue %variant %106, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 - %108 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 0 - store %variant %107, %variant* %108, align 16 - store [5 x i8]* bitcast ([6 x i8]* @.str.37 to [5 x i8]*), [5 x i8]** %taddr64, align 8 - %109 = bitcast [5 x i8]** %taddr64 to i8* - %110 = insertvalue %variant undef, i8* %109, 0 - %111 = insertvalue %variant %110, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 - %112 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 1 - store %variant %111, %variant* %112, align 16 - %113 = bitcast [2 x %variant]* %varargslots62 to %variant* - %114 = insertvalue %"variant[]" undef, %variant* %113, 0 - %115 = insertvalue %"variant[]" %114, i64 2, 1 - store %"variant[]" %115, %"variant[]"* %taddr65, align 8 - %116 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* - %117 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %116, i32 0, i32 0 - %lo66 = load i8*, i8** %117, align 8 - %118 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %116, i32 0, i32 1 - %hi67 = load i64, i64* %118, align 8 - %119 = call i64 @std_io_printfln(i64* %retparam61, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.35, i32 0, i32 0), i64 6, i8* %lo66, i64 %hi67) - %not_err68 = icmp eq i64 %119, 0 - br i1 %not_err68, label %after_check69, label %voiderr70 +voiderr55: ; preds = %after_check54, %voiderr48 + store ptr @.str.42, ptr %taddr58, align 8 + %65 = insertvalue %variant undef, ptr %taddr58, 0 + %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %67 = getelementptr inbounds [2 x %variant], ptr %varargslots57, i64 0, i64 0 + store %variant %66, ptr %67, align 16 + store ptr @.str.43, ptr %taddr59, align 8 + %68 = insertvalue %variant undef, ptr %taddr59, 0 + %69 = insertvalue %variant %68, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %70 = getelementptr inbounds [2 x %variant], ptr %varargslots57, i64 0, i64 1 + store %variant %69, ptr %70, align 16 + %71 = call i64 @std_io_printfn(ptr %retparam56, ptr @.str.41, i64 6, ptr %varargslots57, i64 2) + %not_err60 = icmp eq i64 %71, 0 + br i1 %not_err60, label %after_check61, label %voiderr62 -after_check69: ; preds = %voiderr60 - br label %voiderr70 +after_check61: ; preds = %voiderr55 + br label %voiderr62 -voiderr70: ; preds = %after_check69, %voiderr60 - store [0 x i8]* bitcast ([1 x i8]* @.str.39 to [0 x i8]*), [0 x i8]** %taddr73, align 8 - %120 = bitcast [0 x i8]** %taddr73 to i8* - %121 = insertvalue %variant undef, i8* %120, 0 - %122 = insertvalue %variant %121, i64 ptrtoint (%.introspect* @"ct$p$a0$char" to i64), 1 - %123 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 0 - store %variant %122, %variant* %123, align 16 - store [5 x i8]* bitcast ([6 x i8]* @.str.40 to [5 x i8]*), [5 x i8]** %taddr74, align 8 - %124 = bitcast [5 x i8]** %taddr74 to i8* - %125 = insertvalue %variant undef, i8* %124, 0 - %126 = insertvalue %variant %125, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 - %127 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 1 - store %variant %126, %variant* %127, align 16 - %128 = bitcast [2 x %variant]* %varargslots72 to %variant* - %129 = insertvalue %"variant[]" undef, %variant* %128, 0 - %130 = insertvalue %"variant[]" %129, i64 2, 1 - store %"variant[]" %130, %"variant[]"* %taddr75, align 8 - %131 = bitcast %"variant[]"* %taddr75 to { i8*, i64 }* - %132 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %131, i32 0, i32 0 - %lo76 = load i8*, i8** %132, align 8 - %133 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %131, i32 0, i32 1 - %hi77 = load i64, i64* %133, align 8 - %134 = call i64 @std_io_printfln(i64* %retparam71, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.38, i32 0, i32 0), i64 6, i8* %lo76, i64 %hi77) - %not_err78 = icmp eq i64 %134, 0 - br i1 %not_err78, label %after_check79, label %voiderr80 +voiderr62: ; preds = %after_check61, %voiderr55 + store ptr @.str.45, ptr %taddr65, align 8 + %72 = insertvalue %variant undef, ptr %taddr65, 0 + %73 = insertvalue %variant %72, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 + %74 = getelementptr inbounds [1 x %variant], ptr %varargslots64, i64 0, i64 0 + store %variant %73, ptr %74, align 16 + %75 = call i64 @std_io_printfn(ptr %retparam63, ptr @.str.44, i64 8, ptr %varargslots64, i64 1) + %not_err66 = icmp eq i64 %75, 0 + br i1 %not_err66, label %after_check67, label %voiderr68 -after_check79: ; preds = %voiderr70 - br label %voiderr80 +after_check67: ; preds = %voiderr62 + br label %voiderr68 -voiderr80: ; preds = %after_check79, %voiderr70 - store [3 x i8]* bitcast ([4 x i8]* @.str.42 to [3 x i8]*), [3 x i8]** %taddr83, align 8 - %135 = bitcast [3 x i8]** %taddr83 to i8* - %136 = insertvalue %variant undef, i8* %135, 0 - %137 = insertvalue %variant %136, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %138 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots82, i64 0, i64 0 - store %variant %137, %variant* %138, align 16 - store [3 x i8]* bitcast ([4 x i8]* @.str.43 to [3 x i8]*), [3 x i8]** %taddr84, align 8 - %139 = bitcast [3 x i8]** %taddr84 to i8* - %140 = insertvalue %variant undef, i8* %139, 0 - %141 = insertvalue %variant %140, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %142 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots82, i64 0, i64 1 - store %variant %141, %variant* %142, align 16 - %143 = bitcast [2 x %variant]* %varargslots82 to %variant* - %144 = insertvalue %"variant[]" undef, %variant* %143, 0 - %145 = insertvalue %"variant[]" %144, i64 2, 1 - store %"variant[]" %145, %"variant[]"* %taddr85, align 8 - %146 = bitcast %"variant[]"* %taddr85 to { i8*, i64 }* - %147 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %146, i32 0, i32 0 - %lo86 = load i8*, i8** %147, align 8 - %148 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %146, i32 0, i32 1 - %hi87 = load i64, i64* %148, align 8 - %149 = call i64 @std_io_printfln(i64* %retparam81, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.41, i32 0, i32 0), i64 6, i8* %lo86, i64 %hi87) - %not_err88 = icmp eq i64 %149, 0 - br i1 %not_err88, label %after_check89, label %voiderr90 +voiderr68: ; preds = %after_check67, %voiderr62 + store ptr @.str.47, ptr %taddr71, align 8 + %76 = insertvalue %variant undef, ptr %taddr71, 0 + %77 = insertvalue %variant %76, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 + %78 = getelementptr inbounds [2 x %variant], ptr %varargslots70, i64 0, i64 0 + store %variant %77, ptr %78, align 16 + store ptr @.str.48, ptr %taddr72, align 8 + %79 = insertvalue %variant undef, ptr %taddr72, 0 + %80 = insertvalue %variant %79, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %81 = getelementptr inbounds [2 x %variant], ptr %varargslots70, i64 0, i64 1 + store %variant %80, ptr %81, align 16 + %82 = call i64 @std_io_printfn(ptr %retparam69, ptr @.str.46, i64 6, ptr %varargslots70, i64 2) + %not_err73 = icmp eq i64 %82, 0 + br i1 %not_err73, label %after_check74, label %voiderr75 -after_check89: ; preds = %voiderr80 - br label %voiderr90 +after_check74: ; preds = %voiderr68 + br label %voiderr75 -voiderr90: ; preds = %after_check89, %voiderr80 - store [4 x i8]* bitcast ([5 x i8]* @.str.45 to [4 x i8]*), [4 x i8]** %taddr93, align 8 - %150 = bitcast [4 x i8]** %taddr93 to i8* - %151 = insertvalue %variant undef, i8* %150, 0 - %152 = insertvalue %variant %151, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 - %153 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots92, i64 0, i64 0 - store %variant %152, %variant* %153, align 16 - %154 = bitcast [1 x %variant]* %varargslots92 to %variant* - %155 = insertvalue %"variant[]" undef, %variant* %154, 0 - %156 = insertvalue %"variant[]" %155, i64 1, 1 - store %"variant[]" %156, %"variant[]"* %taddr94, align 8 - %157 = bitcast %"variant[]"* %taddr94 to { i8*, i64 }* - %158 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %157, i32 0, i32 0 - %lo95 = load i8*, i8** %158, align 8 - %159 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %157, i32 0, i32 1 - %hi96 = load i64, i64* %159, align 8 - %160 = call i64 @std_io_printfln(i64* %retparam91, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.44, i32 0, i32 0), i64 8, i8* %lo95, i64 %hi96) - %not_err97 = icmp eq i64 %160, 0 - br i1 %not_err97, label %after_check98, label %voiderr99 +voiderr75: ; preds = %after_check74, %voiderr68 + store ptr @.str.50, ptr %taddr78, align 8 + %83 = insertvalue %variant undef, ptr %taddr78, 0 + %84 = insertvalue %variant %83, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 + %85 = getelementptr inbounds [2 x %variant], ptr %varargslots77, i64 0, i64 0 + store %variant %84, ptr %85, align 16 + store ptr @.str.51, ptr %taddr79, align 8 + %86 = insertvalue %variant undef, ptr %taddr79, 0 + %87 = insertvalue %variant %86, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 + %88 = getelementptr inbounds [2 x %variant], ptr %varargslots77, i64 0, i64 1 + store %variant %87, ptr %88, align 16 + %89 = call i64 @std_io_printfn(ptr %retparam76, ptr @.str.49, i64 6, ptr %varargslots77, i64 2) + %not_err80 = icmp eq i64 %89, 0 + br i1 %not_err80, label %after_check81, label %voiderr82 -after_check98: ; preds = %voiderr90 - br label %voiderr99 +after_check81: ; preds = %voiderr75 + br label %voiderr82 -voiderr99: ; preds = %after_check98, %voiderr90 - store [1 x i8]* bitcast ([2 x i8]* @.str.47 to [1 x i8]*), [1 x i8]** %taddr102, align 8 - %161 = bitcast [1 x i8]** %taddr102 to i8* - %162 = insertvalue %variant undef, i8* %161, 0 - %163 = insertvalue %variant %162, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 - %164 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots101, i64 0, i64 0 - store %variant %163, %variant* %164, align 16 - store [3 x i8]* bitcast ([4 x i8]* @.str.48 to [3 x i8]*), [3 x i8]** %taddr103, align 8 - %165 = bitcast [3 x i8]** %taddr103 to i8* - %166 = insertvalue %variant undef, i8* %165, 0 - %167 = insertvalue %variant %166, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %168 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots101, i64 0, i64 1 - store %variant %167, %variant* %168, align 16 - %169 = bitcast [2 x %variant]* %varargslots101 to %variant* - %170 = insertvalue %"variant[]" undef, %variant* %169, 0 - %171 = insertvalue %"variant[]" %170, i64 2, 1 - store %"variant[]" %171, %"variant[]"* %taddr104, align 8 - %172 = bitcast %"variant[]"* %taddr104 to { i8*, i64 }* - %173 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %172, i32 0, i32 0 - %lo105 = load i8*, i8** %173, align 8 - %174 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %172, i32 0, i32 1 - %hi106 = load i64, i64* %174, align 8 - %175 = call i64 @std_io_printfln(i64* %retparam100, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.46, i32 0, i32 0), i64 6, i8* %lo105, i64 %hi106) - %not_err107 = icmp eq i64 %175, 0 - br i1 %not_err107, label %after_check108, label %voiderr109 - -after_check108: ; preds = %voiderr99 - br label %voiderr109 - -voiderr109: ; preds = %after_check108, %voiderr99 - store [1 x i8]* bitcast ([2 x i8]* @.str.50 to [1 x i8]*), [1 x i8]** %taddr112, align 8 - %176 = bitcast [1 x i8]** %taddr112 to i8* - %177 = insertvalue %variant undef, i8* %176, 0 - %178 = insertvalue %variant %177, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 - %179 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 0 - store %variant %178, %variant* %179, align 16 - store [5 x i8]* bitcast ([6 x i8]* @.str.51 to [5 x i8]*), [5 x i8]** %taddr113, align 8 - %180 = bitcast [5 x i8]** %taddr113 to i8* - %181 = insertvalue %variant undef, i8* %180, 0 - %182 = insertvalue %variant %181, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 - %183 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 1 - store %variant %182, %variant* %183, align 16 - %184 = bitcast [2 x %variant]* %varargslots111 to %variant* - %185 = insertvalue %"variant[]" undef, %variant* %184, 0 - %186 = insertvalue %"variant[]" %185, i64 2, 1 - store %"variant[]" %186, %"variant[]"* %taddr114, align 8 - %187 = bitcast %"variant[]"* %taddr114 to { i8*, i64 }* - %188 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %187, i32 0, i32 0 - %lo115 = load i8*, i8** %188, align 8 - %189 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %187, i32 0, i32 1 - %hi116 = load i64, i64* %189, align 8 - %190 = call i64 @std_io_printfln(i64* %retparam110, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.49, i32 0, i32 0), i64 6, i8* %lo115, i64 %hi116) - %not_err117 = icmp eq i64 %190, 0 - br i1 %not_err117, label %after_check118, label %voiderr119 - -after_check118: ; preds = %voiderr109 - br label %voiderr119 - -voiderr119: ; preds = %after_check118, %voiderr109 +voiderr82: ; preds = %after_check81, %voiderr75 ret void } @@ -558,356 +403,227 @@ entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i64, align 8 - %taddr1 = alloca %"variant[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [1 x %variant], align 16 - %taddr4 = alloca i64, align 8 - %taddr5 = alloca %"variant[]", align 8 - %retparam11 = alloca i64, align 8 - %varargslots12 = alloca [2 x %variant], align 16 - %taddr13 = alloca i64, align 8 - %taddr14 = alloca i64, align 8 - %taddr15 = alloca %"variant[]", align 8 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %taddr3 = alloca i64, align 8 + %retparam7 = alloca i64, align 8 + %varargslots8 = alloca [2 x %variant], align 16 + %taddr9 = alloca i64, align 8 + %taddr10 = alloca i64, align 8 + %retparam14 = alloca i64, align 8 + %varargslots15 = alloca [2 x %variant], align 16 + %taddr16 = alloca i64, align 8 + %taddr17 = alloca i64, align 8 %retparam21 = alloca i64, align 8 %varargslots22 = alloca [2 x %variant], align 16 %taddr23 = alloca i64, align 8 %taddr24 = alloca i64, align 8 - %taddr25 = alloca %"variant[]", align 8 - %retparam31 = alloca i64, align 8 - %varargslots32 = alloca [2 x %variant], align 16 - %taddr33 = alloca i64, align 8 - %taddr34 = alloca i64, align 8 - %taddr35 = alloca %"variant[]", align 8 - %retparam41 = alloca i64, align 8 - %varargslots42 = alloca [2 x %variant], align 16 - %taddr43 = alloca i64, align 8 + %retparam28 = alloca i64, align 8 + %varargslots29 = alloca [2 x %variant], align 16 + %taddr30 = alloca i64, align 8 + %taddr31 = alloca i64, align 8 + %retparam35 = alloca i64, align 8 + %varargslots36 = alloca [2 x %variant], align 16 + %taddr37 = alloca i64, align 8 + %taddr38 = alloca i64, align 8 + %retparam42 = alloca i64, align 8 + %varargslots43 = alloca [2 x %variant], align 16 %taddr44 = alloca i64, align 8 - %taddr45 = alloca %"variant[]", align 8 - %retparam51 = alloca i64, align 8 - %varargslots52 = alloca [2 x %variant], align 16 - %taddr53 = alloca i64, align 8 - %taddr54 = alloca i64, align 8 - %taddr55 = alloca %"variant[]", align 8 - %retparam61 = alloca i64, align 8 - %varargslots62 = alloca [2 x %variant], align 16 - %taddr63 = alloca i64, align 8 + %taddr45 = alloca i64, align 8 + %retparam49 = alloca i64, align 8 + %varargslots50 = alloca [2 x %variant], align 16 + %taddr51 = alloca i64, align 8 + %taddr52 = alloca i64, align 8 + %retparam56 = alloca i64, align 8 + %varargslots57 = alloca [1 x %variant], align 16 + %taddr58 = alloca i64, align 8 + %retparam62 = alloca i64, align 8 + %varargslots63 = alloca [2 x %variant], align 16 %taddr64 = alloca i64, align 8 - %taddr65 = alloca %"variant[]", align 8 - %retparam71 = alloca i64, align 8 - %varargslots72 = alloca [2 x %variant], align 16 - %taddr73 = alloca i64, align 8 - %taddr74 = alloca i64, align 8 - %taddr75 = alloca %"variant[]", align 8 - %retparam81 = alloca i64, align 8 - %varargslots82 = alloca [1 x %variant], align 16 - %taddr83 = alloca i64, align 8 - %taddr84 = alloca %"variant[]", align 8 - %retparam90 = alloca i64, align 8 - %varargslots91 = alloca [2 x %variant], align 16 - %taddr92 = alloca i64, align 8 - %taddr93 = alloca i64, align 8 - %taddr94 = alloca %"variant[]", align 8 - store i64 4, i64* %taddr, align 8 - %0 = bitcast i64* %taddr to i8* - %1 = insertvalue %variant undef, i8* %0, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %2, %variant* %3, align 16 - %4 = bitcast [1 x %variant]* %varargslots to %variant* - %5 = insertvalue %"variant[]" undef, %variant* %4, 0 - %6 = insertvalue %"variant[]" %5, i64 1, 1 - store %"variant[]" %6, %"variant[]"* %taddr1, align 8 - %7 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 0 - %lo = load i8*, i8** %8, align 8 - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 1 - %hi = load i64, i64* %9, align 8 - %10 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.52, i32 0, i32 0), i64 7, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %10, 0 + %taddr65 = alloca i64, align 8 + store i64 4, ptr %taddr, align 8 + %0 = insertvalue %variant undef, ptr %taddr, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$long" to i64), 1 + %2 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %1, ptr %2, align 16 + %3 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.52, i64 7, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %3, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - store i64 1, i64* %taddr4, align 8 - %11 = bitcast i64* %taddr4 to i8* - %12 = insertvalue %variant undef, i8* %11, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 - %14 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 - store %variant %13, %variant* %14, align 16 - %15 = bitcast [1 x %variant]* %varargslots3 to %variant* - %16 = insertvalue %"variant[]" undef, %variant* %15, 0 - %17 = insertvalue %"variant[]" %16, i64 1, 1 - store %"variant[]" %17, %"variant[]"* %taddr5, align 8 - %18 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 0 - %lo6 = load i8*, i8** %19, align 8 - %20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 1 - %hi7 = load i64, i64* %20, align 8 - %21 = call i64 @std_io_printfln(i64* %retparam2, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.53, i32 0, i32 0), i64 7, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %21, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + store i64 1, ptr %taddr3, align 8 + %4 = insertvalue %variant undef, ptr %taddr3, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$long" to i64), 1 + %6 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %5, ptr %6, align 16 + %7 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.53, i64 7, ptr %varargslots2, i64 1) + %not_err4 = icmp eq i64 %7, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %voiderr - br label %voiderr10 +after_check5: ; preds = %voiderr + br label %voiderr6 -voiderr10: ; preds = %after_check9, %voiderr - store i64 0, i64* %taddr13, align 8 - %22 = bitcast i64* %taddr13 to i8* - %23 = insertvalue %variant undef, i8* %22, 0 - %24 = insertvalue %variant %23, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %25 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots12, i64 0, i64 0 - store %variant %24, %variant* %25, align 16 - store i64 4, i64* %taddr14, align 8 - %26 = bitcast i64* %taddr14 to i8* - %27 = insertvalue %variant undef, i8* %26, 0 - %28 = insertvalue %variant %27, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %29 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots12, i64 0, i64 1 - store %variant %28, %variant* %29, align 16 - %30 = bitcast [2 x %variant]* %varargslots12 to %variant* - %31 = insertvalue %"variant[]" undef, %variant* %30, 0 - %32 = insertvalue %"variant[]" %31, i64 2, 1 - store %"variant[]" %32, %"variant[]"* %taddr15, align 8 - %33 = bitcast %"variant[]"* %taddr15 to { i8*, i64 }* - %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %33, i32 0, i32 0 - %lo16 = load i8*, i8** %34, align 8 - %35 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %33, i32 0, i32 1 - %hi17 = load i64, i64* %35, align 8 - %36 = call i64 @std_io_printfln(i64* %retparam11, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.54, i32 0, i32 0), i64 8, i8* %lo16, i64 %hi17) - %not_err18 = icmp eq i64 %36, 0 +voiderr6: ; preds = %after_check5, %voiderr + store i64 0, ptr %taddr9, align 8 + %8 = insertvalue %variant undef, ptr %taddr9, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %10 = getelementptr inbounds [2 x %variant], ptr %varargslots8, i64 0, i64 0 + store %variant %9, ptr %10, align 16 + store i64 4, ptr %taddr10, align 8 + %11 = insertvalue %variant undef, ptr %taddr10, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %13 = getelementptr inbounds [2 x %variant], ptr %varargslots8, i64 0, i64 1 + store %variant %12, ptr %13, align 16 + %14 = call i64 @std_io_printfn(ptr %retparam7, ptr @.str.54, i64 8, ptr %varargslots8, i64 2) + %not_err11 = icmp eq i64 %14, 0 + br i1 %not_err11, label %after_check12, label %voiderr13 + +after_check12: ; preds = %voiderr6 + br label %voiderr13 + +voiderr13: ; preds = %after_check12, %voiderr6 + store i64 2, ptr %taddr16, align 8 + %15 = insertvalue %variant undef, ptr %taddr16, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %17 = getelementptr inbounds [2 x %variant], ptr %varargslots15, i64 0, i64 0 + store %variant %16, ptr %17, align 16 + store i64 2, ptr %taddr17, align 8 + %18 = insertvalue %variant undef, ptr %taddr17, 0 + %19 = insertvalue %variant %18, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %20 = getelementptr inbounds [2 x %variant], ptr %varargslots15, i64 0, i64 1 + store %variant %19, ptr %20, align 16 + %21 = call i64 @std_io_printfn(ptr %retparam14, ptr @.str.55, i64 8, ptr %varargslots15, i64 2) + %not_err18 = icmp eq i64 %21, 0 br i1 %not_err18, label %after_check19, label %voiderr20 -after_check19: ; preds = %voiderr10 +after_check19: ; preds = %voiderr13 br label %voiderr20 -voiderr20: ; preds = %after_check19, %voiderr10 - store i64 2, i64* %taddr23, align 8 - %37 = bitcast i64* %taddr23 to i8* - %38 = insertvalue %variant undef, i8* %37, 0 - %39 = insertvalue %variant %38, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %40 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots22, i64 0, i64 0 - store %variant %39, %variant* %40, align 16 - store i64 2, i64* %taddr24, align 8 - %41 = bitcast i64* %taddr24 to i8* - %42 = insertvalue %variant undef, i8* %41, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %44 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots22, i64 0, i64 1 - store %variant %43, %variant* %44, align 16 - %45 = bitcast [2 x %variant]* %varargslots22 to %variant* - %46 = insertvalue %"variant[]" undef, %variant* %45, 0 - %47 = insertvalue %"variant[]" %46, i64 2, 1 - store %"variant[]" %47, %"variant[]"* %taddr25, align 8 - %48 = bitcast %"variant[]"* %taddr25 to { i8*, i64 }* - %49 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 0 - %lo26 = load i8*, i8** %49, align 8 - %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 1 - %hi27 = load i64, i64* %50, align 8 - %51 = call i64 @std_io_printfln(i64* %retparam21, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.55, i32 0, i32 0), i64 8, i8* %lo26, i64 %hi27) - %not_err28 = icmp eq i64 %51, 0 - br i1 %not_err28, label %after_check29, label %voiderr30 +voiderr20: ; preds = %after_check19, %voiderr13 + store i64 4, ptr %taddr23, align 8 + %22 = insertvalue %variant undef, ptr %taddr23, 0 + %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %24 = getelementptr inbounds [2 x %variant], ptr %varargslots22, i64 0, i64 0 + store %variant %23, ptr %24, align 16 + store i64 4, ptr %taddr24, align 8 + %25 = insertvalue %variant undef, ptr %taddr24, 0 + %26 = insertvalue %variant %25, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %27 = getelementptr inbounds [2 x %variant], ptr %varargslots22, i64 0, i64 1 + store %variant %26, ptr %27, align 16 + %28 = call i64 @std_io_printfn(ptr %retparam21, ptr @.str.56, i64 8, ptr %varargslots22, i64 2) + %not_err25 = icmp eq i64 %28, 0 + br i1 %not_err25, label %after_check26, label %voiderr27 -after_check29: ; preds = %voiderr20 - br label %voiderr30 +after_check26: ; preds = %voiderr20 + br label %voiderr27 -voiderr30: ; preds = %after_check29, %voiderr20 - store i64 4, i64* %taddr33, align 8 - %52 = bitcast i64* %taddr33 to i8* - %53 = insertvalue %variant undef, i8* %52, 0 - %54 = insertvalue %variant %53, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %55 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots32, i64 0, i64 0 - store %variant %54, %variant* %55, align 16 - store i64 4, i64* %taddr34, align 8 - %56 = bitcast i64* %taddr34 to i8* - %57 = insertvalue %variant undef, i8* %56, 0 - %58 = insertvalue %variant %57, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %59 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots32, i64 0, i64 1 - store %variant %58, %variant* %59, align 16 - %60 = bitcast [2 x %variant]* %varargslots32 to %variant* - %61 = insertvalue %"variant[]" undef, %variant* %60, 0 - %62 = insertvalue %"variant[]" %61, i64 2, 1 - store %"variant[]" %62, %"variant[]"* %taddr35, align 8 - %63 = bitcast %"variant[]"* %taddr35 to { i8*, i64 }* - %64 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 0 - %lo36 = load i8*, i8** %64, align 8 - %65 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 1 - %hi37 = load i64, i64* %65, align 8 - %66 = call i64 @std_io_printfln(i64* %retparam31, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.56, i32 0, i32 0), i64 8, i8* %lo36, i64 %hi37) - %not_err38 = icmp eq i64 %66, 0 - br i1 %not_err38, label %after_check39, label %voiderr40 +voiderr27: ; preds = %after_check26, %voiderr20 + store i64 4, ptr %taddr30, align 8 + %29 = insertvalue %variant undef, ptr %taddr30, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %31 = getelementptr inbounds [2 x %variant], ptr %varargslots29, i64 0, i64 0 + store %variant %30, ptr %31, align 16 + store i64 4, ptr %taddr31, align 8 + %32 = insertvalue %variant undef, ptr %taddr31, 0 + %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %34 = getelementptr inbounds [2 x %variant], ptr %varargslots29, i64 0, i64 1 + store %variant %33, ptr %34, align 16 + %35 = call i64 @std_io_printfn(ptr %retparam28, ptr @.str.57, i64 8, ptr %varargslots29, i64 2) + %not_err32 = icmp eq i64 %35, 0 + br i1 %not_err32, label %after_check33, label %voiderr34 -after_check39: ; preds = %voiderr30 - br label %voiderr40 +after_check33: ; preds = %voiderr27 + br label %voiderr34 -voiderr40: ; preds = %after_check39, %voiderr30 - store i64 4, i64* %taddr43, align 8 - %67 = bitcast i64* %taddr43 to i8* - %68 = insertvalue %variant undef, i8* %67, 0 - %69 = insertvalue %variant %68, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %70 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots42, i64 0, i64 0 - store %variant %69, %variant* %70, align 16 - store i64 4, i64* %taddr44, align 8 - %71 = bitcast i64* %taddr44 to i8* - %72 = insertvalue %variant undef, i8* %71, 0 - %73 = insertvalue %variant %72, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %74 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots42, i64 0, i64 1 - store %variant %73, %variant* %74, align 16 - %75 = bitcast [2 x %variant]* %varargslots42 to %variant* - %76 = insertvalue %"variant[]" undef, %variant* %75, 0 - %77 = insertvalue %"variant[]" %76, i64 2, 1 - store %"variant[]" %77, %"variant[]"* %taddr45, align 8 - %78 = bitcast %"variant[]"* %taddr45 to { i8*, i64 }* - %79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 0 - %lo46 = load i8*, i8** %79, align 8 - %80 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 1 - %hi47 = load i64, i64* %80, align 8 - %81 = call i64 @std_io_printfln(i64* %retparam41, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.57, i32 0, i32 0), i64 8, i8* %lo46, i64 %hi47) - %not_err48 = icmp eq i64 %81, 0 - br i1 %not_err48, label %after_check49, label %voiderr50 +voiderr34: ; preds = %after_check33, %voiderr27 + store i64 4, ptr %taddr37, align 8 + %36 = insertvalue %variant undef, ptr %taddr37, 0 + %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %38 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 0 + store %variant %37, ptr %38, align 16 + store i64 4, ptr %taddr38, align 8 + %39 = insertvalue %variant undef, ptr %taddr38, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %41 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 1 + store %variant %40, ptr %41, align 16 + %42 = call i64 @std_io_printfn(ptr %retparam35, ptr @.str.58, i64 9, ptr %varargslots36, i64 2) + %not_err39 = icmp eq i64 %42, 0 + br i1 %not_err39, label %after_check40, label %voiderr41 -after_check49: ; preds = %voiderr40 - br label %voiderr50 +after_check40: ; preds = %voiderr34 + br label %voiderr41 -voiderr50: ; preds = %after_check49, %voiderr40 - store i64 4, i64* %taddr53, align 8 - %82 = bitcast i64* %taddr53 to i8* - %83 = insertvalue %variant undef, i8* %82, 0 - %84 = insertvalue %variant %83, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %85 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 0 - store %variant %84, %variant* %85, align 16 - store i64 4, i64* %taddr54, align 8 - %86 = bitcast i64* %taddr54 to i8* - %87 = insertvalue %variant undef, i8* %86, 0 - %88 = insertvalue %variant %87, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %89 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 1 - store %variant %88, %variant* %89, align 16 - %90 = bitcast [2 x %variant]* %varargslots52 to %variant* - %91 = insertvalue %"variant[]" undef, %variant* %90, 0 - %92 = insertvalue %"variant[]" %91, i64 2, 1 - store %"variant[]" %92, %"variant[]"* %taddr55, align 8 - %93 = bitcast %"variant[]"* %taddr55 to { i8*, i64 }* - %94 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %93, i32 0, i32 0 - %lo56 = load i8*, i8** %94, align 8 - %95 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %93, i32 0, i32 1 - %hi57 = load i64, i64* %95, align 8 - %96 = call i64 @std_io_printfln(i64* %retparam51, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.58, i32 0, i32 0), i64 9, i8* %lo56, i64 %hi57) - %not_err58 = icmp eq i64 %96, 0 - br i1 %not_err58, label %after_check59, label %voiderr60 +voiderr41: ; preds = %after_check40, %voiderr34 + store i64 5, ptr %taddr44, align 8 + %43 = insertvalue %variant undef, ptr %taddr44, 0 + %44 = insertvalue %variant %43, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %45 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 0 + store %variant %44, ptr %45, align 16 + store i64 1, ptr %taddr45, align 8 + %46 = insertvalue %variant undef, ptr %taddr45, 0 + %47 = insertvalue %variant %46, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %48 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 1 + store %variant %47, ptr %48, align 16 + %49 = call i64 @std_io_printfn(ptr %retparam42, ptr @.str.59, i64 9, ptr %varargslots43, i64 2) + %not_err46 = icmp eq i64 %49, 0 + br i1 %not_err46, label %after_check47, label %voiderr48 -after_check59: ; preds = %voiderr50 - br label %voiderr60 +after_check47: ; preds = %voiderr41 + br label %voiderr48 -voiderr60: ; preds = %after_check59, %voiderr50 - store i64 5, i64* %taddr63, align 8 - %97 = bitcast i64* %taddr63 to i8* - %98 = insertvalue %variant undef, i8* %97, 0 - %99 = insertvalue %variant %98, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %100 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 0 - store %variant %99, %variant* %100, align 16 - store i64 1, i64* %taddr64, align 8 - %101 = bitcast i64* %taddr64 to i8* - %102 = insertvalue %variant undef, i8* %101, 0 - %103 = insertvalue %variant %102, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %104 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 1 - store %variant %103, %variant* %104, align 16 - %105 = bitcast [2 x %variant]* %varargslots62 to %variant* - %106 = insertvalue %"variant[]" undef, %variant* %105, 0 - %107 = insertvalue %"variant[]" %106, i64 2, 1 - store %"variant[]" %107, %"variant[]"* %taddr65, align 8 - %108 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* - %109 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %108, i32 0, i32 0 - %lo66 = load i8*, i8** %109, align 8 - %110 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %108, i32 0, i32 1 - %hi67 = load i64, i64* %110, align 8 - %111 = call i64 @std_io_printfln(i64* %retparam61, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.59, i32 0, i32 0), i64 9, i8* %lo66, i64 %hi67) - %not_err68 = icmp eq i64 %111, 0 - br i1 %not_err68, label %after_check69, label %voiderr70 +voiderr48: ; preds = %after_check47, %voiderr41 + store i64 8, ptr %taddr51, align 8 + %50 = insertvalue %variant undef, ptr %taddr51, 0 + %51 = insertvalue %variant %50, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %52 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 0 + store %variant %51, ptr %52, align 16 + store i64 4, ptr %taddr52, align 8 + %53 = insertvalue %variant undef, ptr %taddr52, 0 + %54 = insertvalue %variant %53, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %55 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 1 + store %variant %54, ptr %55, align 16 + %56 = call i64 @std_io_printfn(ptr %retparam49, ptr @.str.60, i64 10, ptr %varargslots50, i64 2) + %not_err53 = icmp eq i64 %56, 0 + br i1 %not_err53, label %after_check54, label %voiderr55 -after_check69: ; preds = %voiderr60 - br label %voiderr70 +after_check54: ; preds = %voiderr48 + br label %voiderr55 -voiderr70: ; preds = %after_check69, %voiderr60 - store i64 8, i64* %taddr73, align 8 - %112 = bitcast i64* %taddr73 to i8* - %113 = insertvalue %variant undef, i8* %112, 0 - %114 = insertvalue %variant %113, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %115 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 0 - store %variant %114, %variant* %115, align 16 - store i64 4, i64* %taddr74, align 8 - %116 = bitcast i64* %taddr74 to i8* - %117 = insertvalue %variant undef, i8* %116, 0 - %118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %119 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 1 - store %variant %118, %variant* %119, align 16 - %120 = bitcast [2 x %variant]* %varargslots72 to %variant* - %121 = insertvalue %"variant[]" undef, %variant* %120, 0 - %122 = insertvalue %"variant[]" %121, i64 2, 1 - store %"variant[]" %122, %"variant[]"* %taddr75, align 8 - %123 = bitcast %"variant[]"* %taddr75 to { i8*, i64 }* - %124 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 0 - %lo76 = load i8*, i8** %124, align 8 - %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 1 - %hi77 = load i64, i64* %125, align 8 - %126 = call i64 @std_io_printfln(i64* %retparam71, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.60, i32 0, i32 0), i64 10, i8* %lo76, i64 %hi77) - %not_err78 = icmp eq i64 %126, 0 - br i1 %not_err78, label %after_check79, label %voiderr80 +voiderr55: ; preds = %after_check54, %voiderr48 + store i64 4, ptr %taddr58, align 8 + %57 = insertvalue %variant undef, ptr %taddr58, 0 + %58 = insertvalue %variant %57, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %59 = getelementptr inbounds [1 x %variant], ptr %varargslots57, i64 0, i64 0 + store %variant %58, ptr %59, align 16 + %60 = call i64 @std_io_printfn(ptr %retparam56, ptr @.str.61, i64 7, ptr %varargslots57, i64 1) + %not_err59 = icmp eq i64 %60, 0 + br i1 %not_err59, label %after_check60, label %voiderr61 -after_check79: ; preds = %voiderr70 - br label %voiderr80 +after_check60: ; preds = %voiderr55 + br label %voiderr61 -voiderr80: ; preds = %after_check79, %voiderr70 - store i64 4, i64* %taddr83, align 8 - %127 = bitcast i64* %taddr83 to i8* - %128 = insertvalue %variant undef, i8* %127, 0 - %129 = insertvalue %variant %128, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %130 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots82, i64 0, i64 0 - store %variant %129, %variant* %130, align 16 - %131 = bitcast [1 x %variant]* %varargslots82 to %variant* - %132 = insertvalue %"variant[]" undef, %variant* %131, 0 - %133 = insertvalue %"variant[]" %132, i64 1, 1 - store %"variant[]" %133, %"variant[]"* %taddr84, align 8 - %134 = bitcast %"variant[]"* %taddr84 to { i8*, i64 }* - %135 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %134, i32 0, i32 0 - %lo85 = load i8*, i8** %135, align 8 - %136 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %134, i32 0, i32 1 - %hi86 = load i64, i64* %136, align 8 - %137 = call i64 @std_io_printfln(i64* %retparam81, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.61, i32 0, i32 0), i64 7, i8* %lo85, i64 %hi86) - %not_err87 = icmp eq i64 %137, 0 - br i1 %not_err87, label %after_check88, label %voiderr89 +voiderr61: ; preds = %after_check60, %voiderr55 + store i64 8, ptr %taddr64, align 8 + %61 = insertvalue %variant undef, ptr %taddr64, 0 + %62 = insertvalue %variant %61, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %63 = getelementptr inbounds [2 x %variant], ptr %varargslots63, i64 0, i64 0 + store %variant %62, ptr %63, align 16 + store i64 4, ptr %taddr65, align 8 + %64 = insertvalue %variant undef, ptr %taddr65, 0 + %65 = insertvalue %variant %64, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %66 = getelementptr inbounds [2 x %variant], ptr %varargslots63, i64 0, i64 1 + store %variant %65, ptr %66, align 16 + %67 = call i64 @std_io_printfn(ptr %retparam62, ptr @.str.62, i64 10, ptr %varargslots63, i64 2) + %not_err66 = icmp eq i64 %67, 0 + br i1 %not_err66, label %after_check67, label %voiderr68 -after_check88: ; preds = %voiderr80 - br label %voiderr89 +after_check67: ; preds = %voiderr61 + br label %voiderr68 -voiderr89: ; preds = %after_check88, %voiderr80 - store i64 8, i64* %taddr92, align 8 - %138 = bitcast i64* %taddr92 to i8* - %139 = insertvalue %variant undef, i8* %138, 0 - %140 = insertvalue %variant %139, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %141 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots91, i64 0, i64 0 - store %variant %140, %variant* %141, align 16 - store i64 4, i64* %taddr93, align 8 - %142 = bitcast i64* %taddr93 to i8* - %143 = insertvalue %variant undef, i8* %142, 0 - %144 = insertvalue %variant %143, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %145 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots91, i64 0, i64 1 - store %variant %144, %variant* %145, align 16 - %146 = bitcast [2 x %variant]* %varargslots91 to %variant* - %147 = insertvalue %"variant[]" undef, %variant* %146, 0 - %148 = insertvalue %"variant[]" %147, i64 2, 1 - store %"variant[]" %148, %"variant[]"* %taddr94, align 8 - %149 = bitcast %"variant[]"* %taddr94 to { i8*, i64 }* - %150 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 0 - %lo95 = load i8*, i8** %150, align 8 - %151 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 1 - %hi96 = load i64, i64* %151, align 8 - %152 = call i64 @std_io_printfln(i64* %retparam90, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.62, i32 0, i32 0), i64 10, i8* %lo95, i64 %hi96) - %not_err97 = icmp eq i64 %152, 0 - br i1 %not_err97, label %after_check98, label %voiderr99 - -after_check98: ; preds = %voiderr89 - br label %voiderr99 - -voiderr99: ; preds = %after_check98, %voiderr89 +voiderr68: ; preds = %after_check67, %voiderr61 call void @test_test(i32 10) ret void -} +} \ No newline at end of file diff --git a/test/test_suite/compile_time/ct_switch.c3t b/test/test_suite/compile_time/ct_switch.c3t index 125f74188..9a832eb98 100644 --- a/test/test_suite/compile_time/ct_switch.c3t +++ b/test/test_suite/compile_time/ct_switch.c3t @@ -49,15 +49,17 @@ fn void main() @.str.7 = private unnamed_addr constant [14 x i8] c"donnowifprime\00", align 1 @.str.8 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 @.str.9 = private unnamed_addr constant [14 x i8] c"donnowifprime\00", align 1 + ; Function Attrs: nounwind -declare void @printf(i8*, ...) #0 +declare void @printf(ptr, ...) #0 + ; Function Attrs: nounwind define void @test_main() #0 { entry: - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), [5 x i8]* bitcast ([6 x i8]* @.str.1 to [5 x i8]*)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.3 to [9 x i8]*)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.5 to [9 x i8]*)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.6, i32 0, i32 0), [13 x i8]* bitcast ([14 x i8]* @.str.7 to [13 x i8]*)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.8, i32 0, i32 0), [13 x i8]* bitcast ([14 x i8]* @.str.9 to [13 x i8]*)) + call void (ptr, ...) @printf(ptr @.str, ptr @.str.1) + call void (ptr, ...) @printf(ptr @.str.2, ptr @.str.3) + call void (ptr, ...) @printf(ptr @.str.4, ptr @.str.5) + call void (ptr, ...) @printf(ptr @.str.6, ptr @.str.7) + call void (ptr, ...) @printf(ptr @.str.8, ptr @.str.9) ret void } diff --git a/test/test_suite/compile_time/ct_switch_top_level.c3t b/test/test_suite/compile_time/ct_switch_top_level.c3t index 5ffd7cf82..63c79fb90 100644 --- a/test/test_suite/compile_time/ct_switch_top_level.c3t +++ b/test/test_suite/compile_time/ct_switch_top_level.c3t @@ -45,10 +45,10 @@ entry: %z = alloca i32, align 4 %z1 = alloca i32, align 4 %i = alloca i32, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0)) - store i32 0, i32* %z, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) - store i32 0, i32* %z1, align 4 - store i32 1, i32* %i, align 4 + call void (ptr, ...) @printf(ptr @.str) + store i32 0, ptr %z, align 4 + call void (ptr, ...) @printf(ptr @.str.1) + store i32 0, ptr %z1, align 4 + store i32 1, ptr %i, align 4 ret i32 1 } diff --git a/test/test_suite/compile_time/ct_switch_type_check.c3t b/test/test_suite/compile_time/ct_switch_type_check.c3t index da7da4389..69a492928 100644 --- a/test/test_suite/compile_time/ct_switch_type_check.c3t +++ b/test/test_suite/compile_time/ct_switch_type_check.c3t @@ -32,13 +32,15 @@ fn void main() @.str.3 = private unnamed_addr constant [7 x i8] c"double\00", align 1 @.str.4 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 @.str.5 = private unnamed_addr constant [10 x i8] c"any other\00", align 1 + ; Function Attrs: nounwind -declare void @printf(i8*, ...) #0 +declare void @printf(ptr, ...) #0 + ; Function Attrs: nounwind define void @test_main() #0 { entry: - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), [3 x i8]* bitcast ([4 x i8]* @.str.1 to [3 x i8]*)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), [6 x i8]* bitcast ([7 x i8]* @.str.3 to [6 x i8]*)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.5 to [9 x i8]*)) + call void (ptr, ...) @printf(ptr @.str, ptr @.str.1) + call void (ptr, ...) @printf(ptr @.str.2, ptr @.str.3) + call void (ptr, ...) @printf(ptr @.str.4, ptr @.str.5) ret void } \ No newline at end of file diff --git a/test/test_suite/compile_time/cttype_reassign.c3t b/test/test_suite/compile_time/cttype_reassign.c3t index 6081a9191..ef4e0b1fb 100644 --- a/test/test_suite/compile_time/cttype_reassign.c3t +++ b/test/test_suite/compile_time/cttype_reassign.c3t @@ -11,5 +11,5 @@ fn void test() // #expect: reassign.ll %hello = alloca i32, align 4 - store i32 0, i32* %hello, align 4 + store i32 0, ptr %hello, align 4 ret void \ No newline at end of file diff --git a/test/test_suite/compile_time/stringify.c3t b/test/test_suite/compile_time/stringify.c3t index 7f1df621b..81eb7f989 100644 --- a/test/test_suite/compile_time/stringify.c3t +++ b/test/test_suite/compile_time/stringify.c3t @@ -45,20 +45,20 @@ fn void main() define void @test_test() #0 { entry: %i = alloca i32, align 4 - store i32 0, i32* %i, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %0 = load i32, i32* %i, align 4 + %0 = load i32, ptr %i, align 4 %lt = icmp slt i32 %0, 1000 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %1 = load i32, i32* %i, align 4 - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) - %3 = load i32, i32* %i, align 4 + %1 = load i32, ptr %i, align 4 + %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) + %3 = load i32, ptr %i, align 4 %add = add i32 %3, 1 - store i32 %add, i32* %i, align 4 + store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond @@ -75,34 +75,34 @@ entry: %result = alloca i32, align 4 %diff2 = alloca i64, align 8 %0 = call i64 @clock() - store i64 %0, i64* %t, align 8 + store i64 %0, ptr %t, align 8 call void @test_test() %1 = call i64 @clock() - %2 = load i64, i64* %t, align 8 + %2 = load i64, ptr %t, align 8 %sub = sub i64 %1, %2 - store i64 %sub, i64* %diff, align 8 - %3 = load i64, i64* %diff, align 8 - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.1, i32 0, i32 0), [6 x i8]* bitcast ([7 x i8]* @.str.2 to [6 x i8]*), i64 %3) - store i32 100, i32* %a, align 4 + store i64 %sub, ptr %diff, align 8 + %3 = load i64, ptr %diff, align 8 + %4 = call i32 (ptr, ...) @printf(ptr @.str.1, ptr @.str.2, i64 %3) + store i32 100, ptr %a, align 4 %5 = call i64 @clock() - store i64 %5, i64* %t1, align 8 - %6 = load i32, i32* %a, align 4 + store i64 %5, ptr %t1, align 8 + %6 = load i32, ptr %a, align 4 %add = add i32 4, %6 - store i32 %add, i32* %result, align 4 + store i32 %add, ptr %result, align 4 %7 = call i64 @clock() - %8 = load i64, i64* %t1, align 8 + %8 = load i64, ptr %t1, align 8 %sub3 = sub i64 %7, %8 - store i64 %sub3, i64* %diff2, align 8 - %9 = load i64, i64* %diff2, align 8 - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.3, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.4 to [9 x i8]*), i64 %9) - %11 = load i32, i32* %result, align 4 - store i32 %11, i32* %x, align 4 - %12 = load i32, i32* %x, align 4 - %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i32 0, i32 0), i32 %12) + store i64 %sub3, ptr %diff2, align 8 + %9 = load i64, ptr %diff2, align 8 + %10 = call i32 (ptr, ...) @printf(ptr @.str.3, ptr @.str.4, i64 %9) + %11 = load i32, ptr %result, align 4 + store i32 %11, ptr %x, align 4 + %12 = load i32, ptr %x, align 4 + %13 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %12) ret void } -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: call void @test_main() ret i32 0 diff --git a/test/test_suite/compile_time/stringify2.c3t b/test/test_suite/compile_time/stringify2.c3t index aca9f6a4f..ed8968e55 100644 --- a/test/test_suite/compile_time/stringify2.c3t +++ b/test/test_suite/compile_time/stringify2.c3t @@ -8,9 +8,9 @@ fn void main() char[*] s2 = $stringify($s1); char[] s3 = $s1; - io::printfln("$s1 == %s", $s1); - io::printfln("s2 == %s", &s2); - io::printfln("s3 == %s", s3); + io::printfn("$s1 == %s", $s1); + io::printfn("s2 == %s", &s2); + io::printfn("s3 == %s", s3); } /* #expect: test.ll diff --git a/test/test_suite/compile_time/ternary_folding.c3t b/test/test_suite/compile_time/ternary_folding.c3t index b57db3ad4..796e96748 100644 --- a/test/test_suite/compile_time/ternary_folding.c3t +++ b/test/test_suite/compile_time/ternary_folding.c3t @@ -20,6 +20,6 @@ fn int test2() { return 3; } define void @ternary_folding_test() #0 { entry: %x = alloca i32, align 4 - store i32 0, i32* %x, align 4 + store i32 0, ptr %x, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite/compile_time/typeof_example.c3t b/test/test_suite/compile_time/typeof_example.c3t index 3b7491038..5ba86b817 100644 --- a/test/test_suite/compile_time/typeof_example.c3t +++ b/test/test_suite/compile_time/typeof_example.c3t @@ -15,40 +15,38 @@ fn void main() printf("Bitcast %f to %d to %f", f, i, f2); } -// #expect: typeof_example.ll +/* #expect: typeof_example.ll - %f = alloca float, align 4 - %i = alloca i32, align 4 - %value = alloca float, align 4 - %temp = alloca float, align 4 - %result = alloca i32*, align 8 - %f2 = alloca float, align 4 - %value1 = alloca i32, align 4 - %temp2 = alloca i32, align 4 - %result3 = alloca float*, align 8 - store float 1.000000e+02, float* %f, align 4 - %0 = load float, float* %f, align 4 - store float %0, float* %value, align 4 - %1 = load float, float* %value, align 4 - store float %1, float* %temp, align 4 - %ptrptr = bitcast float* %temp to i32* - store i32* %ptrptr, i32** %result, align 8 - %2 = load i32*, i32** %result, align 8 - %3 = load i32, i32* %2, align 8 - store i32 %3, i32* %i, align 4 - %4 = load i32, i32* %i, align 4 - store i32 %4, i32* %value1, align 4 - %5 = load i32, i32* %value1, align 4 - store i32 %5, i32* %temp2, align 4 - %ptrptr4 = bitcast i32* %temp2 to float* - store float* %ptrptr4, float** %result3, align 8 - %6 = load float*, float** %result3, align 8 - %7 = load float, float* %6, align 8 - store float %7, float* %f2, align 4 - %8 = load float, float* %f, align 4 - %fpfpext = fpext float %8 to double - %9 = load i32, i32* %i, align 4 - %10 = load float, float* %f2, align 4 - %fpfpext5 = fpext float %10 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0), double %fpfpext, i32 %9, double %fpfpext5) - ret void \ No newline at end of file + %f = alloca float, align 4 + %i = alloca i32, align 4 + %value = alloca float, align 4 + %temp = alloca float, align 4 + %result = alloca ptr, align 8 + %f2 = alloca float, align 4 + %value1 = alloca i32, align 4 + %temp2 = alloca i32, align 4 + %result3 = alloca ptr, align 8 + store float 1.000000e+02, ptr %f, align 4 + %0 = load float, ptr %f, align 4 + store float %0, ptr %value, align 4 + %1 = load float, ptr %value, align 4 + store float %1, ptr %temp, align 4 + store ptr %temp, ptr %result, align 8 + %2 = load ptr, ptr %result, align 8 + %3 = load i32, ptr %2, align 8 + store i32 %3, ptr %i, align 4 + %4 = load i32, ptr %i, align 4 + store i32 %4, ptr %value1, align 4 + %5 = load i32, ptr %value1, align 4 + store i32 %5, ptr %temp2, align 4 + store ptr %temp2, ptr %result3, align 8 + %6 = load ptr, ptr %result3, align 8 + %7 = load float, ptr %6, align 8 + store float %7, ptr %f2, align 4 + %8 = load float, ptr %f, align 4 + %fpfpext = fpext float %8 to double + %9 = load i32, ptr %i, align 4 + %10 = load float, ptr %f2, align 4 + %fpfpext4 = fpext float %10 to double + call void (ptr, ...) @printf(ptr @.str, double %fpfpext, i32 %9, double %fpfpext4) + ret void \ No newline at end of file diff --git a/test/test_suite/compile_time/untyped_conversions.c3t b/test/test_suite/compile_time/untyped_conversions.c3t index 2533befc8..ba7d841b5 100644 --- a/test/test_suite/compile_time/untyped_conversions.c3t +++ b/test/test_suite/compile_time/untyped_conversions.c3t @@ -7,7 +7,7 @@ struct Foo } fn void test(int[2] a, int[] b, int[<2>] c) { - io::printfln("%s %s %s", a, b, c); + io::printfn("%s %s %s", a, b, c); } fn void main() { @@ -16,7 +16,7 @@ fn void main() Foo def = (Foo)$x[0]; int[2][1] y = (int[2][1])$x; double[2][1] y2 = $x; - io::printfln("%s %s {%s, %s}", y, y2, def.a, def.b); + io::printfn("%s %s {%s, %s}", y, y2, def.a, def.b); test({ 1, 2 }, { 3, 4}, { 5, 6 }); var $a = { 2, 7 }; test($a, $a, $a); @@ -24,6 +24,66 @@ fn void main() /* #expect: test.ll +%.introspect = type { i8, i64, i64, i64, [0 x i64] } +%Foo = type { i32, i32 } +%"int[]" = type { ptr, i64 } +%variant = type { ptr, i64 } + +@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [9 x i8] c"%s %s %s\00", align 1 +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$a2$int" = linkonce constant %.introspect { i8 15, i64 8, i64 ptrtoint (ptr @"ct$int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$sa$int" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (ptr @"ct$int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$v2$int" = linkonce constant %.introspect { i8 17, i64 8, i64 ptrtoint (ptr @"ct$int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@.__const = private unnamed_addr constant [1 x %Foo] [%Foo { i32 1, i32 2 }], align 4 +@.__const.1 = private unnamed_addr constant %Foo { i32 1, i32 2 }, align 4 +@.__const.2 = private unnamed_addr constant [1 x [2 x i32]] [[2 x i32] [i32 1, i32 2]], align 4 +@.__const.3 = private unnamed_addr constant [1 x [2 x double]] [[2 x double] [double 1.000000e+00, double 2.000000e+00]], align 16 +@.str.4 = private unnamed_addr constant [15 x i8] c"%s %s {%s, %s}\00", align 1 +@"ct$a1$a2$int" = linkonce constant %.introspect { i8 15, i64 8, i64 ptrtoint (ptr @"ct$a2$int" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 +@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$a2$double" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (ptr @"ct$double" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$a1$a2$double" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (ptr @"ct$a2$double" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 + +; Function Attrs: nounwind +define void @test_test(i64 %0, ptr %1, i64 %2, double %3) #0 { +entry: + %a = alloca [2 x i32], align 4 + %b = alloca %"int[]", align 8 + %c = alloca <2 x i32>, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [3 x %variant], align 16 + store i64 %0, ptr %a, align 4 + %4 = getelementptr inbounds { ptr, i64 }, ptr %b, i32 0, i32 0 + store ptr %1, ptr %4, align 8 + %5 = getelementptr inbounds { ptr, i64 }, ptr %b, i32 0, i32 1 + store i64 %2, ptr %5, align 8 + store double %3, ptr %c, align 8 + %6 = insertvalue %variant undef, ptr %a, 0 + %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$a2$int" to i64), 1 + %8 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %7, ptr %8, align 16 + %9 = insertvalue %variant undef, ptr %b, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$sa$int" to i64), 1 + %11 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %10, ptr %11, align 16 + %12 = insertvalue %variant undef, ptr %c, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$v2$int" to i64), 1 + %14 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 2 + store %variant %13, ptr %14, align 16 + %15 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 3) + %not_err = icmp eq i64 %15, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + ret void +} + +; Function Attrs: nounwind +define void @test_main() #0 { entry: %abc = alloca [1 x %Foo], align 4 %def = alloca %Foo, align 4 @@ -31,107 +91,65 @@ entry: %y2 = alloca [1 x [2 x double]], align 16 %retparam = alloca i64, align 8 %varargslots = alloca [4 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %literal = alloca [2 x i32], align 4 %literal1 = alloca [2 x i32], align 4 - %taddr2 = alloca %"int[]", align 8 - %taddr5 = alloca <2 x i32>, align 8 - %literal6 = alloca [2 x i32], align 4 - %literal7 = alloca [2 x i32], align 4 - %taddr8 = alloca %"int[]", align 8 - %taddr11 = alloca <2 x i32>, align 8 - %0 = bitcast [1 x %Foo]* %abc to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([1 x %Foo]* @.__const to i8*), i32 8, i1 false) - %1 = bitcast %Foo* %def to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Foo* @.__const.1 to i8*), i32 8, i1 false) - %2 = bitcast [1 x [2 x i32]]* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast ([1 x [2 x i32]]* @.__const.2 to i8*), i32 8, i1 false) - %3 = bitcast [1 x [2 x double]]* %y2 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %3, i8* align 16 bitcast ([1 x [2 x double]]* @.__const.3 to i8*), i32 16, i1 false) - %4 = bitcast [1 x [2 x i32]]* %y to i8* - %5 = insertvalue %variant undef, i8* %4, 0 - %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$a1$a2$int" to i64), 1 - %7 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 0 - store %variant %6, %variant* %7, align 16 - %8 = bitcast [1 x [2 x double]]* %y2 to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$a1$a2$double" to i64), 1 - %11 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 1 - store %variant %10, %variant* %11, align 16 - %12 = getelementptr inbounds %Foo, %Foo* %def, i32 0, i32 0 - %13 = bitcast i32* %12 to i8* - %14 = insertvalue %variant undef, i8* %13, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %16 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 2 - store %variant %15, %variant* %16, align 16 - %17 = getelementptr inbounds %Foo, %Foo* %def, i32 0, i32 1 - %18 = bitcast i32* %17 to i8* - %19 = insertvalue %variant undef, i8* %18, 0 - %20 = insertvalue %variant %19, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %21 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 3 - store %variant %20, %variant* %21, align 16 - %22 = bitcast [4 x %variant]* %varargslots to %variant* - %23 = insertvalue %"variant[]" undef, %variant* %22, 0 - %24 = insertvalue %"variant[]" %23, i64 4, 1 - store %"variant[]" %24, %"variant[]"* %taddr, align 8 - %25 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 0 - %lo = load i8*, i8** %26, align 8 - %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 1 - %hi = load i64, i64* %27, align 8 - %28 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i32 0, i32 0), i64 14, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %28, 0 + %taddr = alloca <2 x i32>, align 8 + %literal2 = alloca [2 x i32], align 4 + %literal3 = alloca [2 x i32], align 4 + %taddr4 = alloca <2 x i32>, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %abc, ptr align 4 @.__const, i32 8, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %def, ptr align 4 @.__const.1, i32 8, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 @.__const.2, i32 8, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %y2, ptr align 16 @.__const.3, i32 16, i1 false) + %0 = insertvalue %variant undef, ptr %y, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$a1$a2$int" to i64), 1 + %2 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %1, ptr %2, align 16 + %3 = insertvalue %variant undef, ptr %y2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (ptr @"ct$a1$a2$double" to i64), 1 + %5 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %4, ptr %5, align 16 + %6 = getelementptr inbounds %Foo, ptr %def, i32 0, i32 0 + %7 = insertvalue %variant undef, ptr %6, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %9 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 2 + store %variant %8, ptr %9, align 16 + %10 = getelementptr inbounds %Foo, ptr %def, i32 0, i32 1 + %11 = insertvalue %variant undef, ptr %10, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %13 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 3 + store %variant %12, ptr %13, align 16 + %14 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.4, i64 14, ptr %varargslots, i64 4) + %not_err = icmp eq i64 %14, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %29 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 0 - store i32 1, i32* %29, align 4 - %30 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 1 - store i32 2, i32* %30, align 4 - %31 = bitcast [2 x i32]* %literal to i64* - %32 = load i64, i64* %31, align 4 - %33 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 0 - store i32 3, i32* %33, align 4 - %34 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 1 - store i32 4, i32* %34, align 4 - %35 = bitcast [2 x i32]* %literal1 to i32* - %36 = insertvalue %"int[]" undef, i32* %35, 0 - %37 = insertvalue %"int[]" %36, i64 2, 1 - store %"int[]" %37, %"int[]"* %taddr2, align 8 - %38 = bitcast %"int[]"* %taddr2 to { i8*, i64 }* - %39 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %38, i32 0, i32 0 - %lo3 = load i8*, i8** %39, align 8 - %40 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %38, i32 0, i32 1 - %hi4 = load i64, i64* %40, align 8 - store <2 x i32> , <2 x i32>* %taddr5, align 8 - %41 = bitcast <2 x i32>* %taddr5 to double* - %42 = load double, double* %41, align 8 - call void @test_test(i64 %32, i8* %lo3, i64 %hi4, double %42) - %43 = getelementptr inbounds [2 x i32], [2 x i32]* %literal6, i64 0, i64 0 - store i32 2, i32* %43, align 4 - %44 = getelementptr inbounds [2 x i32], [2 x i32]* %literal6, i64 0, i64 1 - store i32 7, i32* %44, align 4 - %45 = bitcast [2 x i32]* %literal6 to i64* - %46 = load i64, i64* %45, align 4 - %47 = getelementptr inbounds [2 x i32], [2 x i32]* %literal7, i64 0, i64 0 - store i32 2, i32* %47, align 4 - %48 = getelementptr inbounds [2 x i32], [2 x i32]* %literal7, i64 0, i64 1 - store i32 7, i32* %48, align 4 - %49 = bitcast [2 x i32]* %literal7 to i32* - %50 = insertvalue %"int[]" undef, i32* %49, 0 - %51 = insertvalue %"int[]" %50, i64 2, 1 - store %"int[]" %51, %"int[]"* %taddr8, align 8 - %52 = bitcast %"int[]"* %taddr8 to { i8*, i64 }* - %53 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 0 - %lo9 = load i8*, i8** %53, align 8 - %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 1 - %hi10 = load i64, i64* %54, align 8 - store <2 x i32> , <2 x i32>* %taddr11, align 8 - %55 = bitcast <2 x i32>* %taddr11 to double* - %56 = load double, double* %55, align 8 - call void @test_test(i64 %46, i8* %lo9, i64 %hi10, double %56) + %15 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 0 + store i32 1, ptr %15, align 4 + %16 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 1 + store i32 2, ptr %16, align 4 + %17 = load i64, ptr %literal, align 4 + %18 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 0 + store i32 3, ptr %18, align 4 + %19 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 1 + store i32 4, ptr %19, align 4 + store <2 x i32> , ptr %taddr, align 8 + %20 = load double, ptr %taddr, align 8 + call void @test_test(i64 %17, ptr %literal1, i64 2, double %20) + %21 = getelementptr inbounds [2 x i32], ptr %literal2, i64 0, i64 0 + store i32 2, ptr %21, align 4 + %22 = getelementptr inbounds [2 x i32], ptr %literal2, i64 0, i64 1 + store i32 7, ptr %22, align 4 + %23 = load i64, ptr %literal2, align 4 + %24 = getelementptr inbounds [2 x i32], ptr %literal3, i64 0, i64 0 + store i32 2, ptr %24, align 4 + %25 = getelementptr inbounds [2 x i32], ptr %literal3, i64 0, i64 1 + store i32 7, ptr %25, align 4 + store <2 x i32> , ptr %taddr4, align 8 + %26 = load double, ptr %taddr4, align 8 + call void @test_test(i64 %23, ptr %literal3, i64 2, double %26) ret void -} \ No newline at end of file +} diff --git a/test/test_suite/compile_time_introspection/defined.c3t b/test/test_suite/compile_time_introspection/defined.c3t index ed7146453..8b3a5fe9e 100644 --- a/test/test_suite/compile_time_introspection/defined.c3t +++ b/test/test_suite/compile_time_introspection/defined.c3t @@ -59,39 +59,39 @@ fn void main() printf("%d\n", x); } -// #expect: mymodule.ll +/* #expect: mymodule.ll define void @mymodule_main() #0 { entry: %x = alloca i32, align 4 %y = alloca i32, align 4 %z = alloca i32, align 4 - store i32 0, i32* %x, align 4 - %0 = load i32, i32* %x, align 4 + store i32 0, ptr %x, align 4 + %0 = load i32, ptr %x, align 4 %add = add i32 %0, 1 - store i32 %add, i32* %x, align 4 - store i32 10, i32* %y, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %add, ptr %x, align 4 + store i32 10, ptr %y, align 4 + %1 = load i32, ptr %x, align 4 %add1 = add i32 %1, 1 - store i32 %add1, i32* %x, align 4 - %2 = load i32, i32* %x, align 4 + store i32 %add1, ptr %x, align 4 + %2 = load i32, ptr %x, align 4 %add2 = add i32 %2, 1 - store i32 %add2, i32* %x, align 4 - %3 = load i32, i32* %x, align 4 + store i32 %add2, ptr %x, align 4 + %3 = load i32, ptr %x, align 4 %add3 = add i32 %3, 1 - store i32 %add3, i32* %x, align 4 - %4 = load i32, i32* %x, align 4 + store i32 %add3, ptr %x, align 4 + %4 = load i32, ptr %x, align 4 %add4 = add i32 %4, 1 - store i32 %add4, i32* %x, align 4 - %5 = load i32, i32* %x, align 4 + store i32 %add4, ptr %x, align 4 + %5 = load i32, ptr %x, align 4 %add5 = add i32 %5, 1 - store i32 %add5, i32* %x, align 4 - %6 = load i32, i32* %x, align 4 + store i32 %add5, ptr %x, align 4 + %6 = load i32, ptr %x, align 4 %add6 = add i32 %6, 1 - store i32 %add6, i32* %x, align 4 - store i32 1, i32* %y, align 4 - store i32 7, i32* %z, align 4 - %7 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %7) + store i32 %add6, ptr %x, align 4 + store i32 1, ptr %y, align 4 + store i32 7, ptr %z, align 4 + %7 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %7) ret void } \ No newline at end of file diff --git a/test/test_suite/compile_time_introspection/defined_builtin.c3t b/test/test_suite/compile_time_introspection/defined_builtin.c3t index 9acaede32..582b62f50 100644 --- a/test/test_suite/compile_time_introspection/defined_builtin.c3t +++ b/test/test_suite/compile_time_introspection/defined_builtin.c3t @@ -12,7 +12,7 @@ define void @foo_test() #0 { entry: %a = alloca i8, align 1 %b = alloca i8, align 1 - store i8 1, i8* %a, align 1 - store i8 0, i8* %b, align 1 + store i8 1, ptr %a, align 1 + store i8 0, ptr %b, align 1 ret void } \ No newline at end of file diff --git a/test/test_suite/compile_time_introspection/qnameof.c3t b/test/test_suite/compile_time_introspection/qnameof.c3t index 2cdb4fdc2..a091a1dcf 100644 --- a/test/test_suite/compile_time_introspection/qnameof.c3t +++ b/test/test_suite/compile_time_introspection/qnameof.c3t @@ -1,3 +1,4 @@ +// #target: macos-x64 module qnametest; extern fn int printf(char *, ...); @@ -19,8 +20,10 @@ fn void main() printf("Blob**[3]: %s\n", Blob**[3].nameof); } -// #expect: qnametest.ll +/* #expect: qnametest.ll +@"ct$qnametest_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@qnametest_x = local_unnamed_addr global i32 0, align 4 @.str = private unnamed_addr constant [12 x i8] c"printf: %s\0A\00", align 1 @.str.1 = private unnamed_addr constant [7 x i8] c"printf\00", align 1 @.str.2 = private unnamed_addr constant [13 x i8] c"printfq: %s\0A\00", align 1 @@ -40,16 +43,18 @@ fn void main() @.str.16 = private unnamed_addr constant [15 x i8] c"Blob**[3]: %s\0A\00", align 1 @.str.17 = private unnamed_addr constant [10 x i8] c"Blob**[3]\00", align 1 -define void @qnametest_main() +define void @qnametest_main() #0 { +entry: %help = alloca i32, align 4 - store i32 0, i32* %help, align 4 - %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), [6 x i8]* bitcast ([7 x i8]* @.str.1 to [6 x i8]*)) - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0), [17 x i8]* bitcast ([18 x i8]* @.str.3 to [17 x i8]*)) - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), [15 x i8]* bitcast ([16 x i8]* @.str.5 to [15 x i8]*)) - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), [4 x i8]* bitcast ([5 x i8]* @.str.7 to [4 x i8]*)) - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), [12 x i8]* bitcast ([13 x i8]* @.str.9 to [12 x i8]*)) - %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i32 0, i32 0), [1 x i8]* bitcast ([2 x i8]* @.str.11 to [1 x i8]*)) - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.12, i32 0, i32 0), [4 x i8]* bitcast ([5 x i8]* @.str.13 to [4 x i8]*)) - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.14, i32 0, i32 0), [15 x i8]* bitcast ([16 x i8]* @.str.15 to [15 x i8]*)) - %8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.16, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.17 to [9 x i8]*)) + store i32 0, ptr %help, align 4 + %0 = call i32 (ptr, ...) @printf(ptr @.str, ptr @.str.1) + %1 = call i32 (ptr, ...) @printf(ptr @.str.2, ptr @.str.3) + %2 = call i32 (ptr, ...) @printf(ptr @.str.4, ptr @.str.5) + %3 = call i32 (ptr, ...) @printf(ptr @.str.6, ptr @.str.7) + %4 = call i32 (ptr, ...) @printf(ptr @.str.8, ptr @.str.9) + %5 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr @.str.11) + %6 = call i32 (ptr, ...) @printf(ptr @.str.12, ptr @.str.13) + %7 = call i32 (ptr, ...) @printf(ptr @.str.14, ptr @.str.15) + %8 = call i32 (ptr, ...) @printf(ptr @.str.16, ptr @.str.17) ret void +} diff --git a/test/test_suite/compile_time_introspection/sizeof.c3t b/test/test_suite/compile_time_introspection/sizeof.c3t index 2a5bfb30c..531ab71eb 100644 --- a/test/test_suite/compile_time_introspection/sizeof.c3t +++ b/test/test_suite/compile_time_introspection/sizeof.c3t @@ -1,5 +1,6 @@ module foo; import bar; +import bar::abc; long x = Baz.sizeof; short y = $evaltype("Baz").sizeof; diff --git a/test/test_suite/constants/const_var_copy.c3t b/test/test_suite/constants/const_var_copy.c3t index d2c1dcd8e..045a7cf47 100644 --- a/test/test_suite/constants/const_var_copy.c3t +++ b/test/test_suite/constants/const_var_copy.c3t @@ -19,11 +19,11 @@ entry: %s = alloca i8, align 1 %zd = alloca i32, align 4 %sisiext = sext i32 %0 to i64 - %1 = getelementptr inbounds [100 x i8], [100 x i8]* bitcast ({ [50 x i8], i8, [49 x i8] }* @foo_FOO to [100 x i8]*), i64 0, i64 %sisiext - %2 = load i8, i8* %1, align 1 - store i8 %2, i8* %s, align 1 + %1 = getelementptr inbounds [100 x i8], ptr @foo_FOO, i64 0, i64 %sisiext + %2 = load i8, ptr %1, align 1 + store i8 %2, ptr %s, align 1 %sisiext1 = sext i32 %0 to i64 %3 = extractelement <4 x i32> , i64 %sisiext1 - store i32 %3, i32* %zd, align 4 + store i32 %3, ptr %zd, align 4 ret void } diff --git a/test/test_suite/constants/constants.c3t b/test/test_suite/constants/constants.c3t index b91366f98..9f4fdb99b 100644 --- a/test/test_suite/constants/constants.c3t +++ b/test/test_suite/constants/constants.c3t @@ -17,12 +17,13 @@ fn void test() uint* yy = &&FOO; } -// #expect: constants.ll +/* #expect: constants.ll @constants_AA = protected unnamed_addr constant i8 -1, align 1 @constants_BB = local_unnamed_addr constant i8 -56, align 1 @constants_CC = protected unnamed_addr constant i32 -1, align 4 @constants_DD = protected unnamed_addr constant i32 -1, align 4 +@constants_FOO = protected unnamed_addr constant i32 -1, align 4 @constants_x = protected unnamed_addr global i32 255, align 4 @constants_z = protected unnamed_addr global i32 -1, align 4 @constants_w = protected unnamed_addr global i8 -1, align 1 @@ -30,10 +31,10 @@ fn void test() @constants_z2 = protected unnamed_addr global i32 -1, align 4 entry: - %xx = alloca i32 - %yy = alloca i32* - %taddr = alloca i32 - store i32 -1, i32* %xx - store i32 -1, i32* %taddr - store i32* %taddr, i32** %yy - ret void \ No newline at end of file + %xx = alloca i32, align 4 + %yy = alloca ptr, align 8 + %taddr = alloca i32, align 4 + store i32 -1, ptr %xx, align 4 + store i32 -1, ptr %taddr, align 4 + store ptr %taddr, ptr %yy, align 8 + ret void \ No newline at end of file diff --git a/test/test_suite/contracts/simple_test.c3t b/test/test_suite/contracts/simple_test.c3t index 3df7b7166..1406ba202 100644 --- a/test/test_suite/contracts/simple_test.c3t +++ b/test/test_suite/contracts/simple_test.c3t @@ -43,19 +43,21 @@ fn void main() /* #expect: simple_test.ll -define void @simple_test_test(i32* %0, i32 %1) #0 { +define void @simple_test_test(ptr %0, i32 %1) #0 { entry: %gt = icmp sgt i32 %1, 100 call void @llvm.assume(i1 %gt) - store i32 444, i32* %0, align 8 + store i32 444, ptr %0, align 8 ret void } -define i32 @simple_test_test2(i32* %0, i32 %1) #0 { +define i32 @simple_test_test2(ptr %0, i32 %1) #0 { entry: %gt = icmp sgt i32 %1, 100 call void @llvm.assume(i1 %gt) - store i32 444, i32* %0, align 8 + store i32 444, ptr %0, align 8 + %lt = icmp slt i32 %1, 200 + call void @llvm.assume(i1 %lt) ret i32 %1 } @@ -64,23 +66,25 @@ entry: %gt = icmp sgt i32 %0, 0 call void @llvm.assume(i1 %gt) %add = add i32 %0, 1 + %gt1 = icmp sgt i32 %add, 0 + call void @llvm.assume(i1 %gt1) ret i32 %add } define void @simple_test_main() #0 { entry: %fooofke = alloca i32, align 4 - store i32 0, i32* %fooofke, align 4 - call void @simple_test_test(i32* %fooofke, i32 330) - %0 = call i32 @simple_test_test2(i32* %fooofke, i32 150) + store i32 0, ptr %fooofke, align 4 + call void @simple_test_test(ptr %fooofke, i32 330) + %0 = call i32 @simple_test_test2(ptr %fooofke, i32 150) %1 = call i32 @simple_test_test3(i32 123) - %2 = load i32, i32* %fooofke, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %2) + %2 = load i32, ptr %fooofke, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %2) ret void } -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: call void @simple_test_main() ret i32 0 -} +} \ No newline at end of file diff --git a/test/test_suite/defer/defer_and_expr_block.c3t b/test/test_suite/defer/defer_and_expr_block.c3t index 1eca0d219..5c8c9269b 100644 --- a/test/test_suite/defer/defer_and_expr_block.c3t +++ b/test/test_suite/defer/defer_and_expr_block.c3t @@ -26,15 +26,15 @@ entry: br label %if.then if.then: ; preds = %entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0)) - store i32 12, i32* %blockret, align 4 + call void (ptr, ...) @printf(ptr @.str) + call void (ptr, ...) @printf(ptr @.str.1) + store i32 12, ptr %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %if.then - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.7, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.5) + call void (ptr, ...) @printf(ptr @.str.6) + call void (ptr, ...) @printf(ptr @.str.7) ret void } diff --git a/test/test_suite/defer/defer_static_var.c3t b/test/test_suite/defer/defer_static_var.c3t index fb228b656..7712cfb52 100644 --- a/test/test_suite/defer/defer_static_var.c3t +++ b/test/test_suite/defer/defer_static_var.c3t @@ -53,19 +53,19 @@ entry: br i1 %gt, label %if.then, label %if.exit if.then: ; preds = %entry - %1 = load i32, i32* @"foo$y", align 4 + %1 = load i32, ptr @"foo$y", align 4 %add = add i32 %1, 1 - store i32 %add, i32* @"foo$y", align 4 - %2 = load i32, i32* @"foo$y", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0), i32 %2) + store i32 %add, ptr @"foo$y", align 4 + %2 = load i32, ptr @"foo$y", align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %2) ret i32 2 if.exit: ; preds = %entry - %3 = load i32, i32* @"foo$y", align 4 + %3 = load i32, ptr @"foo$y", align 4 %add1 = add i32 %3, 1 - store i32 %add1, i32* @"foo$y", align 4 - %4 = load i32, i32* @"foo$y", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0), i32 %4) + store i32 %add1, ptr @"foo$y", align 4 + %4 = load i32, ptr @"foo$y", align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %4) ret i32 %0 } @@ -80,123 +80,123 @@ entry: %0 = call i32 @foo_foo(i32 1) %1 = call i32 @foo_foo(i32 2) %2 = call i32 @foo_foo(i32 -2) - store i32 0, i32* %x, align 4 - %3 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i32 %3) - store i32 0, i32* %i, align 4 + store i32 0, ptr %x, align 4 + %3 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.2, i32 %3) + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %if.exit, %entry - %4 = load i32, i32* %i, align 4 + %4 = load i32, ptr %i, align 4 %lt = icmp slt i32 %4, 100 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %5 = load i32, i32* %i, align 4 - %6 = load i32, i32* %x, align 4 + %5 = load i32, ptr %i, align 4 + %6 = load i32, ptr %x, align 4 %eq = icmp eq i32 %5, %6 br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %loop.body - %7 = load i32, i32* @"main$y", align 4 + %7 = load i32, ptr @"main$y", align 4 %add = add i32 %7, 1 - store i32 %add, i32* @"main$y", align 4 - %8 = load i32, i32* %i, align 4 - %9 = load i32, i32* @"main$y", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %8, i32 %9) + store i32 %add, ptr @"main$y", align 4 + %8 = load i32, ptr %i, align 4 + %9 = load i32, ptr @"main$y", align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %8, i32 %9) br label %loop.exit if.exit: ; preds = %loop.body - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0)) - %10 = load i32, i32* @"main$y", align 4 + call void (ptr, ...) @printf(ptr @.str.4) + %10 = load i32, ptr @"main$y", align 4 %add1 = add i32 %10, 1 - store i32 %add1, i32* @"main$y", align 4 - %11 = load i32, i32* %i, align 4 - %12 = load i32, i32* @"main$y", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i32 0, i32 0), i32 %11, i32 %12) - %13 = load i32, i32* %i, align 4 + store i32 %add1, ptr @"main$y", align 4 + %11 = load i32, ptr %i, align 4 + %12 = load i32, ptr @"main$y", align 4 + call void (ptr, ...) @printf(ptr @.str.5, i32 %11, i32 %12) + %13 = load i32, ptr %i, align 4 %add2 = add i32 %13, 1 - store i32 %add2, i32* %i, align 4 + store i32 %add2, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond - store i32 1, i32* %x3, align 4 - %14 = load i32, i32* %x3, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i32 %14) - store i32 0, i32* %i4, align 4 + store i32 1, ptr %x3, align 4 + %14 = load i32, ptr %x3, align 4 + call void (ptr, ...) @printf(ptr @.str.6, i32 %14) + store i32 0, ptr %i4, align 4 br label %loop.cond5 loop.cond5: ; preds = %if.exit11, %loop.exit - %15 = load i32, i32* %i4, align 4 + %15 = load i32, ptr %i4, align 4 %lt6 = icmp slt i32 %15, 100 br i1 %lt6, label %loop.body7, label %loop.exit14 loop.body7: ; preds = %loop.cond5 - %16 = load i32, i32* %i4, align 4 - %17 = load i32, i32* %x3, align 4 + %16 = load i32, ptr %i4, align 4 + %17 = load i32, ptr %x3, align 4 %eq8 = icmp eq i32 %16, %17 br i1 %eq8, label %if.then9, label %if.exit11 if.then9: ; preds = %loop.body7 - %18 = load i32, i32* @"main$y.7", align 4 + %18 = load i32, ptr @"main$y.7", align 4 %add10 = add i32 %18, 1 - store i32 %add10, i32* @"main$y.7", align 4 - %19 = load i32, i32* %i4, align 4 - %20 = load i32, i32* @"main$y.7", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.8, i32 0, i32 0), i32 %19, i32 %20) + store i32 %add10, ptr @"main$y.7", align 4 + %19 = load i32, ptr %i4, align 4 + %20 = load i32, ptr @"main$y.7", align 4 + call void (ptr, ...) @printf(ptr @.str.8, i32 %19, i32 %20) br label %loop.exit14 if.exit11: ; preds = %loop.body7 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) - %21 = load i32, i32* @"main$y.7", align 4 + call void (ptr, ...) @printf(ptr @.str.9) + %21 = load i32, ptr @"main$y.7", align 4 %add12 = add i32 %21, 1 - store i32 %add12, i32* @"main$y.7", align 4 - %22 = load i32, i32* %i4, align 4 - %23 = load i32, i32* @"main$y.7", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.10, i32 0, i32 0), i32 %22, i32 %23) - %24 = load i32, i32* %i4, align 4 + store i32 %add12, ptr @"main$y.7", align 4 + %22 = load i32, ptr %i4, align 4 + %23 = load i32, ptr @"main$y.7", align 4 + call void (ptr, ...) @printf(ptr @.str.10, i32 %22, i32 %23) + %24 = load i32, ptr %i4, align 4 %add13 = add i32 %24, 1 - store i32 %add13, i32* %i4, align 4 + store i32 %add13, ptr %i4, align 4 br label %loop.cond5 loop.exit14: ; preds = %if.then9, %loop.cond5 - store i32 2, i32* %x15, align 4 - %25 = load i32, i32* %x15, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.11, i32 0, i32 0), i32 %25) - store i32 0, i32* %i16, align 4 + store i32 2, ptr %x15, align 4 + %25 = load i32, ptr %x15, align 4 + call void (ptr, ...) @printf(ptr @.str.11, i32 %25) + store i32 0, ptr %i16, align 4 br label %loop.cond17 loop.cond17: ; preds = %if.exit23, %loop.exit14 - %26 = load i32, i32* %i16, align 4 + %26 = load i32, ptr %i16, align 4 %lt18 = icmp slt i32 %26, 100 br i1 %lt18, label %loop.body19, label %loop.exit26 loop.body19: ; preds = %loop.cond17 - %27 = load i32, i32* %i16, align 4 - %28 = load i32, i32* %x15, align 4 + %27 = load i32, ptr %i16, align 4 + %28 = load i32, ptr %x15, align 4 %eq20 = icmp eq i32 %27, %28 br i1 %eq20, label %if.then21, label %if.exit23 if.then21: ; preds = %loop.body19 - %29 = load i32, i32* @"main$y.12", align 4 + %29 = load i32, ptr @"main$y.12", align 4 %add22 = add i32 %29, 1 - store i32 %add22, i32* @"main$y.12", align 4 - %30 = load i32, i32* %i16, align 4 - %31 = load i32, i32* @"main$y.12", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.13, i32 0, i32 0), i32 %30, i32 %31) + store i32 %add22, ptr @"main$y.12", align 4 + %30 = load i32, ptr %i16, align 4 + %31 = load i32, ptr @"main$y.12", align 4 + call void (ptr, ...) @printf(ptr @.str.13, i32 %30, i32 %31) br label %loop.exit26 if.exit23: ; preds = %loop.body19 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.14, i32 0, i32 0)) - %32 = load i32, i32* @"main$y.12", align 4 + call void (ptr, ...) @printf(ptr @.str.14) + %32 = load i32, ptr @"main$y.12", align 4 %add24 = add i32 %32, 1 - store i32 %add24, i32* @"main$y.12", align 4 - %33 = load i32, i32* %i16, align 4 - %34 = load i32, i32* @"main$y.12", align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i32 0, i32 0), i32 %33, i32 %34) - %35 = load i32, i32* %i16, align 4 + store i32 %add24, ptr @"main$y.12", align 4 + %33 = load i32, ptr %i16, align 4 + %34 = load i32, ptr @"main$y.12", align 4 + call void (ptr, ...) @printf(ptr @.str.15, i32 %33, i32 %34) + %35 = load i32, ptr %i16, align 4 %add25 = add i32 %35, 1 - store i32 %add25, i32* %i16, align 4 + store i32 %add25, ptr %i16, align 4 br label %loop.cond17 loop.exit26: ; preds = %if.then21, %loop.cond17 diff --git a/test/test_suite/define/test_at.c3 b/test/test_suite/define/test_at.c3 index a48b1bb20..30c060010 100644 --- a/test/test_suite/define/test_at.c3 +++ b/test/test_suite/define/test_at.c3 @@ -2,7 +2,7 @@ module foo; import std::io; macro @hello(Type thing) { - io::printfln("%d", $sizeof(thing)); + io::printfn("%d", $sizeof(thing)); } module bar; diff --git a/test/test_suite/define/test_at_alias.c3 b/test/test_suite/define/test_at_alias.c3 index f453dc948..f10964a90 100644 --- a/test/test_suite/define/test_at_alias.c3 +++ b/test/test_suite/define/test_at_alias.c3 @@ -2,7 +2,7 @@ module foo; import std::io; macro @hello(Type thing) { - io::printfln("%d", $sizeof(thing)); + io::printfn("%d", $sizeof(thing)); } module bar; diff --git a/test/test_suite/distinct/distinct_invalid.c3 b/test/test_suite/distinct/distinct_invalid.c3 index af271a330..433d00332 100644 --- a/test/test_suite/distinct/distinct_invalid.c3 +++ b/test/test_suite/distinct/distinct_invalid.c3 @@ -1,7 +1,7 @@ fault Error {} -define Foo1 = distinct Error; // #error: You cannot create a distinct +define Foo1 = distinct Error; // #error: You cannot create a distinct type define Foo3 = distinct void; // #error: create a distinct type from 'void' diff --git a/test/test_suite/enumerations/compile_time.c3t b/test/test_suite/enumerations/compile_time.c3t index 68c6f8db0..684f8ef3b 100644 --- a/test/test_suite/enumerations/compile_time.c3t +++ b/test/test_suite/enumerations/compile_time.c3t @@ -9,7 +9,7 @@ int myenum_elements = MyEnum.elements; int myenum_alignof = MyEnum.alignof; int myenum_sizeof = MyEnum.sizeof; -// #expect: compile_time.ll +/* #expect: compile_time.ll @compile_time_myenum_elements = local_unnamed_addr global i32 3, align 4 @compile_time_myenum_alignof = local_unnamed_addr global i32 2, align 4 diff --git a/test/test_suite/enumerations/enum_associated_value.c3t b/test/test_suite/enumerations/enum_associated_value.c3t index fcf37b228..980cd93b1 100644 --- a/test/test_suite/enumerations/enum_associated_value.c3t +++ b/test/test_suite/enumerations/enum_associated_value.c3t @@ -18,14 +18,12 @@ fn void main() /* #expect: test.ll -@.enum.0 = internal constant [2 x i8] c"A\00", align 1 -@.enum.1 = internal constant [2 x i8] c"B\00", align 1 @"ct$uint" = linkonce constant %.introspect { i8 3, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$test_Foo" = linkonce constant { i8, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (%.introspect* @"ct$uint" to i64), i64 2, [2 x %"char[]"] [%"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.enum.0, i64 0, i64 0), i64 1 }, %"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.enum.1, i64 0, i64 0), i64 1 }] }, align 8 +@"ct$test_Foo" = linkonce constant { i8, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (ptr @"ct$uint" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 1 }, %"char[]" { ptr @.enum.1, i64 1 }] }, align 8 @"test_Foo$val" = linkonce constant [2 x i32] [i32 123, i32 333], align 4 @.str = private unnamed_addr constant [9 x i8] c"Number A\00", align 1 @.str.1 = private unnamed_addr constant [9 x i8] c"Number B\00", align 1 -@"test_Foo$testme" = linkonce constant [2 x i8*] [i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)], align 8 +@"test_Foo$testme" = linkonce constant [2 x ptr] [ptr @.str, ptr @.str.1], align 8 @.str.2 = private unnamed_addr constant [17 x i8] c"%d (%s) %d (%s)\0A\00", align 1 ; Function Attrs: nounwind @@ -34,21 +32,21 @@ entry: %x = alloca i32, align 4 %f = alloca i32, align 4 %g = alloca i32, align 4 - store i32 123, i32* %x, align 4 - store i32 1, i32* %f, align 4 - store i32 0, i32* %g, align 4 - %0 = load i32, i32* %f, align 4 - %1 = getelementptr inbounds [2 x i32], [2 x i32]* @"test_Foo$val", i32 0, i32 %0 - %2 = load i32, i32* %1, align 4 - %3 = load i32, i32* %f, align 4 - %4 = getelementptr inbounds [2 x i8*], [2 x i8*]* @"test_Foo$testme", i32 0, i32 %3 - %5 = load i8*, i8** %4, align 8 - %6 = load i32, i32* %g, align 4 - %7 = getelementptr inbounds [2 x i32], [2 x i32]* @"test_Foo$val", i32 0, i32 %6 - %8 = load i32, i32* %7, align 4 - %9 = load i32, i32* %g, align 4 - %10 = getelementptr inbounds [2 x i8*], [2 x i8*]* @"test_Foo$testme", i32 0, i32 %9 - %11 = load i8*, i8** %10, align 8 - %12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %2, i8* %5, i32 %8, i8* %11) + store i32 123, ptr %x, align 4 + store i32 1, ptr %f, align 4 + store i32 0, ptr %g, align 4 + %0 = load i32, ptr %f, align 4 + %1 = getelementptr inbounds [2 x i32], ptr @"test_Foo$val", i32 0, i32 %0 + %2 = load i32, ptr %1, align 4 + %3 = load i32, ptr %f, align 4 + %4 = getelementptr inbounds [2 x ptr], ptr @"test_Foo$testme", i32 0, i32 %3 + %5 = load ptr, ptr %4, align 8 + %6 = load i32, ptr %g, align 4 + %7 = getelementptr inbounds [2 x i32], ptr @"test_Foo$val", i32 0, i32 %6 + %8 = load i32, ptr %7, align 4 + %9 = load i32, ptr %g, align 4 + %10 = getelementptr inbounds [2 x ptr], ptr @"test_Foo$testme", i32 0, i32 %9 + %11 = load ptr, ptr %10, align 8 + %12 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %2, ptr %5, i32 %8, ptr %11) ret void } diff --git a/test/test_suite/enumerations/enum_cast.c3t b/test/test_suite/enumerations/enum_cast.c3t index 43a9b3a48..15ad4b8ee 100644 --- a/test/test_suite/enumerations/enum_cast.c3t +++ b/test/test_suite/enumerations/enum_cast.c3t @@ -40,14 +40,13 @@ entry: %ww = alloca i8, align 1 %x = alloca i8, align 1 %zz = alloca i8, align 1 - store i8 0, i8* %ww, align 1 - store i8 1, i8* %x, align 1 - %0 = load i8, i8* %x, align 1 - store i8 %0, i8* %zz, align 1 + store i8 0, ptr %ww, align 1 + store i8 1, ptr %x, align 1 + %0 = load i8, ptr %x, align 1 + store i8 %0, ptr %zz, align 1 ret void } -; Function Attrs: nounwind define void @test_test() #0 { entry: %b = alloca i8, align 1 @@ -61,35 +60,35 @@ entry: %xf.f = alloca i64, align 8 %e = alloca float, align 4 %e.f = alloca i64, align 8 - store i8 0, i8* %b, align 1 - store i32 1, i32* %z, align 4 - store i8 1, i8* %x, align 1 - %0 = load i8, i8* %x, align 1 - store i8 %0, i8* %b2, align 1 - %1 = load i8, i8* %x, align 1 + store i8 0, ptr %b, align 1 + store i32 1, ptr %z, align 4 + store i8 1, ptr %x, align 1 + %0 = load i8, ptr %x, align 1 + store i8 %0, ptr %b2, align 1 + %1 = load i8, ptr %x, align 1 %uisiext = zext i8 %1 to i32 - store i32 %uisiext, i32* %z2, align 4 - store float 0.000000e+00, float* %d, align 4 - store i8 0, i8* %hello, align 1 - store i8 1, i8* %xf, align 1 - store i64 0, i64* %xf.f, align 8 - %2 = load i8, i8* %x, align 1 + store i32 %uisiext, ptr %z2, align 4 + store float 0.000000e+00, ptr %d, align 4 + store i8 0, ptr %hello, align 1 + store i8 1, ptr %xf, align 1 + store i64 0, ptr %xf.f, align 8 + %2 = load i8, ptr %x, align 1 %uifp = uitofp i8 %2 to float - store float %uifp, float* %e, align 4 - store i64 0, i64* %e.f, align 8 - %optval = load i64, i64* %xf.f, align 8 + store float %uifp, ptr %e, align 4 + store i64 0, ptr %e.f, align 8 + %optval = load i64, ptr %xf.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* %e.f, align 8 + store i64 %optval, ptr %e.f, align 8 br label %after_assign after_check: ; preds = %entry - %3 = load i8, i8* %xf, align 1 + %3 = load i8, ptr %xf, align 1 %uifp1 = uitofp i8 %3 to float - store float %uifp1, float* %e, align 4 - store i64 0, i64* %e.f, align 8 + store float %uifp1, ptr %e, align 4 + store i64 0, ptr %e.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional @@ -98,5 +97,3 @@ after_assign: ; preds = %after_check, %assig voiderr: ; preds = %after_assign ret void } - -attributes #0 = { nounwind } \ No newline at end of file diff --git a/test/test_suite/enumerations/enum_values.c3t b/test/test_suite/enumerations/enum_values.c3t index 9a06a62c3..7e69c75da 100644 --- a/test/test_suite/enumerations/enum_values.c3t +++ b/test/test_suite/enumerations/enum_values.c3t @@ -18,23 +18,23 @@ fn void test(int x) /* #expect: test.ll -%"Foo[]" = type { i32*, i64 } +%"Foo[]" = type { ptr, i64 } @test_zfok = local_unnamed_addr global i32 0, align 4 @.taddr = private global [2 x i32] [i32 0, i32 1], align 4 -@test_zw = local_unnamed_addr global %"Foo[]" { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr, i32 0, i32 0), i64 2 }, align 8 +@test_zw = local_unnamed_addr global %"Foo[]" { ptr @.taddr, i64 2 }, align 8 define void @test_test(i32 %0) #0 { entry: %zonk = alloca i32, align 4 %literal = alloca [2 x i32], align 4 - %1 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 0 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 1 - store i32 1, i32* %2, align 4 + %1 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 0 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 1 + store i32 1, ptr %2, align 4 %sisiext = sext i32 %0 to i64 - %3 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 %sisiext - %4 = load i32, i32* %3, align 4 - store i32 %4, i32* %zonk, align 4 + %3 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 %sisiext + %4 = load i32, ptr %3, align 4 + store i32 %4, ptr %zonk, align 4 ret void } diff --git a/test/test_suite/enumerations/simple_inference.c3t b/test/test_suite/enumerations/simple_inference.c3t index 54ae20f1c..d2e93de8c 100644 --- a/test/test_suite/enumerations/simple_inference.c3t +++ b/test/test_suite/enumerations/simple_inference.c3t @@ -17,7 +17,7 @@ fn void test() define void @simple_inference_test() #0 { entry: %h = alloca i32, align 4 - store i32 1, i32* %h, align 4 - store i32 2, i32* %h, align 4 + store i32 1, ptr %h, align 4 + store i32 2, ptr %h, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite/errors/anyerr_void.c3t b/test/test_suite/errors/anyerr_void.c3t index a46b30952..bb931feec 100644 --- a/test/test_suite/errors/anyerr_void.c3t +++ b/test/test_suite/errors/anyerr_void.c3t @@ -28,9 +28,10 @@ fn void main() define i64 @anyerr_void_errorThing() #0 { entry: - ret i64 ptrtoint (%.fault* @"anyerr_void_MyError$BAR" to i64) + ret i64 ptrtoint (ptr @"anyerr_void_MyError$BAR" to i64) } +; Function Attrs: nounwind define i64 @anyerr_void_errorThing2() #0 { entry: %reterr = alloca i64, align 8 @@ -38,7 +39,7 @@ entry: } ; Function Attrs: nounwind -declare void @printf(i8*, ...) #0 +declare void @printf(ptr, ...) #0 ; Function Attrs: nounwind define void @anyerr_void_main() #0 { @@ -46,41 +47,41 @@ entry: %z = alloca i64, align 8 %error_var = alloca i64, align 8 %error_var1 = alloca i64, align 8 - store i64 0, i64* %error_var, align 8 + store i64 0, ptr %error_var, align 8 %0 = call i64 @anyerr_void_errorThing() %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, i64* %error_var, align 8 + store i64 %0, ptr %error_var, align 8 br label %noerr_block after_check: ; preds = %entry br label %noerr_block noerr_block: ; preds = %after_check, %assign_optional - %1 = load i64, i64* %error_var, align 8 - store i64 %1, i64* %z, align 8 - %2 = load i64, i64* %z, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), i64 %2) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), i64 ptrtoint (%.fault* @"anyerr_void_MyError$BAR" to i64)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i64 ptrtoint (%.fault* @"anyerr_void_MyError$FOO" to i64)) - store i64 0, i64* %error_var1, align 8 + %1 = load i64, ptr %error_var, align 8 + store i64 %1, ptr %z, align 8 + %2 = load i64, ptr %z, align 8 + call void (ptr, ...) @printf(ptr @.str, i64 %2) + call void (ptr, ...) @printf(ptr @.str.2, i64 ptrtoint (ptr @"anyerr_void_MyError$BAR" to i64)) + call void (ptr, ...) @printf(ptr @.str.3, i64 ptrtoint (ptr @"anyerr_void_MyError$FOO" to i64)) + store i64 0, ptr %error_var1, align 8 %3 = call i64 @anyerr_void_errorThing2() %not_err2 = icmp eq i64 %3, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %noerr_block - store i64 %3, i64* %error_var1, align 8 + store i64 %3, ptr %error_var1, align 8 br label %noerr_block5 after_check4: ; preds = %noerr_block br label %noerr_block5 noerr_block5: ; preds = %after_check4, %assign_optional3 - %4 = load i64, i64* %error_var1, align 8 - store i64 %4, i64* %z, align 8 - %5 = load i64, i64* %z, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), i64 %5) + %4 = load i64, ptr %error_var1, align 8 + store i64 %4, ptr %z, align 8 + %5 = load i64, ptr %z, align 8 + call void (ptr, ...) @printf(ptr @.str.4, i64 %5) ret void } \ No newline at end of file diff --git a/test/test_suite/errors/else_checks.c3t b/test/test_suite/errors/else_checks.c3t index 3d7538f91..7984188c4 100644 --- a/test/test_suite/errors/else_checks.c3t +++ b/test/test_suite/errors/else_checks.c3t @@ -14,7 +14,7 @@ fn void test() /* #expect: else_checks.ll ; Function Attrs: nounwind -declare i64 @testError(i32*) #0 +declare i64 @testError(ptr) #0 ; Function Attrs: nounwind define void @else_checks_test() #0 { @@ -29,18 +29,18 @@ entry: %w = alloca double, align 8 %retparam18 = alloca i32, align 4 %retparam21 = alloca i32, align 4 - %0 = call i64 @testError(i32* %retparam) + %0 = call i64 @testError(ptr %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %1 = load i32, i32* %retparam, align 4 - %2 = call i64 @testError(i32* %retparam1) + %1 = load i32, ptr %retparam, align 4 + %2 = call i64 @testError(ptr %retparam1) %not_err2 = icmp eq i64 %2, 0 br i1 %not_err2, label %after_check3, label %else_block after_check3: ; preds = %after_check - %3 = load i32, i32* %retparam1, align 4 + %3 = load i32, ptr %retparam1, align 4 %add = add i32 %1, %3 br label %phi_block @@ -50,13 +50,13 @@ else_block: ; preds = %after_check, %entry phi_block: ; preds = %else_block, %after_check3 %val = phi i32 [ %add, %after_check3 ], [ 100, %else_block ] %sifp = sitofp i32 %val to double - store double %sifp, double* %x, align 8 - %4 = call i64 @testError(i32* %retparam4) + store double %sifp, ptr %x, align 8 + %4 = call i64 @testError(ptr %retparam4) %not_err5 = icmp eq i64 %4, 0 br i1 %not_err5, label %after_check6, label %else_block7 after_check6: ; preds = %phi_block - %5 = load i32, i32* %retparam4, align 4 + %5 = load i32, ptr %retparam4, align 4 %shl = shl i32 1, %5 %6 = freeze i32 %shl br label %phi_block8 @@ -67,13 +67,13 @@ else_block7: ; preds = %phi_block phi_block8: ; preds = %else_block7, %after_check6 %val9 = phi i32 [ %6, %after_check6 ], [ 100, %else_block7 ] %sifp10 = sitofp i32 %val9 to double - store double %sifp10, double* %y, align 8 - %7 = call i64 @testError(i32* %retparam11) + store double %sifp10, ptr %y, align 8 + %7 = call i64 @testError(ptr %retparam11) %not_err12 = icmp eq i64 %7, 0 br i1 %not_err12, label %after_check13, label %else_block14 after_check13: ; preds = %phi_block8 - %8 = load i32, i32* %retparam11, align 4 + %8 = load i32, ptr %retparam11, align 4 %ashr = ashr i32 %8, 1 %9 = freeze i32 %ashr br label %phi_block15 @@ -84,19 +84,19 @@ else_block14: ; preds = %phi_block8 phi_block15: ; preds = %else_block14, %after_check13 %val16 = phi i32 [ %9, %after_check13 ], [ 100, %else_block14 ] %sifp17 = sitofp i32 %val16 to double - store double %sifp17, double* %z, align 8 - %10 = call i64 @testError(i32* %retparam18) + store double %sifp17, ptr %z, align 8 + %10 = call i64 @testError(ptr %retparam18) %not_err19 = icmp eq i64 %10, 0 br i1 %not_err19, label %after_check20, label %else_block24 after_check20: ; preds = %phi_block15 - %11 = load i32, i32* %retparam18, align 4 - %12 = call i64 @testError(i32* %retparam21) + %11 = load i32, ptr %retparam18, align 4 + %12 = call i64 @testError(ptr %retparam21) %not_err22 = icmp eq i64 %12, 0 br i1 %not_err22, label %after_check23, label %else_block24 after_check23: ; preds = %after_check20 - %13 = load i32, i32* %retparam21, align 4 + %13 = load i32, ptr %retparam21, align 4 %mul = mul i32 %11, %13 br label %phi_block25 @@ -106,7 +106,6 @@ else_block24: ; preds = %after_check20, %phi phi_block25: ; preds = %else_block24, %after_check23 %val26 = phi i32 [ %mul, %after_check23 ], [ 100, %else_block24 ] %sifp27 = sitofp i32 %val26 to double - store double %sifp27, double* %w, align 8 + store double %sifp27, ptr %w, align 8 ret void } - diff --git a/test/test_suite/errors/error_introspect.c3t b/test/test_suite/errors/error_introspect.c3t index b9dd42796..56f69b0c5 100644 --- a/test/test_suite/errors/error_introspect.c3t +++ b/test/test_suite/errors/error_introspect.c3t @@ -11,120 +11,87 @@ fault Foo fn void main() { char[][] x = Foo.names; - io::printfln("Foo.names: %s", x); - io::printfln("Foo.values: %s", Foo.values); - io::printfln("Foo.elements: %s", Foo.elements); + io::printfn("Foo.names: %s", x); + io::printfn("Foo.values: %s", Foo.values); + io::printfn("Foo.elements: %s", Foo.elements); } /* #expect: foo.ll -@"foo_Foo$BAR" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$foo_Foo" to i64), %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.fault, i64 0, i64 0), i64 3 } }, align 8 +@"foo_Foo$BAR" = linkonce constant %.fault { i64 ptrtoint (ptr @"ct$foo_Foo" to i64), %"char[]" { ptr @.fault, i64 3 } }, align 8 @.fault = internal constant [4 x i8] c"BAR\00", align 1 -@"foo_Foo$BAZ" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$foo_Foo" to i64), %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.fault.1, i64 0, i64 0), i64 3 } }, align 8 +@"foo_Foo$BAZ" = linkonce constant %.fault { i64 ptrtoint (ptr @"ct$foo_Foo" to i64), %"char[]" { ptr @.fault.1, i64 3 } }, align 8 @.fault.1 = internal constant [4 x i8] c"BAZ\00", align 1 @"ct$foo_Foo" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [4 x i8] c"BAR\00", align 1 @.str.2 = private unnamed_addr constant [4 x i8] c"BAZ\00", align 1 @.str.3 = private unnamed_addr constant [14 x i8] c"Foo.names: %s\00", align 1 @"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$sa$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (%.introspect* @"ct$sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (ptr @"ct$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$sa$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (ptr @"ct$sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 @.str.4 = private unnamed_addr constant [15 x i8] c"Foo.values: %s\00", align 1 -@"ct$a2$foo_Foo" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (%.introspect* @"ct$foo_Foo" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$a2$foo_Foo" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (ptr @"ct$foo_Foo" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 @.str.5 = private unnamed_addr constant [17 x i8] c"Foo.elements: %s\00", align 1 @"ct$long" = linkonce constant %.introspect { i8 2, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +entry: %x = alloca %"char[][]", align 8 %literal = alloca [2 x %"char[]"], align 16 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %retparam1 = alloca i64, align 8 %varargslots2 = alloca [1 x %variant], align 16 %literal3 = alloca [2 x i64], align 16 - %taddr4 = alloca %"variant[]", align 8 - %retparam10 = alloca i64, align 8 - %varargslots11 = alloca [1 x %variant], align 16 - %taddr12 = alloca i64, align 8 - %taddr13 = alloca %"variant[]", align 8 - %0 = getelementptr inbounds [2 x %"char[]"], [2 x %"char[]"]* %literal, i64 0, i64 0 - store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 3 }, %"char[]"* %0, align 8 - %1 = getelementptr inbounds [2 x %"char[]"], [2 x %"char[]"]* %literal, i64 0, i64 1 - store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i64 3 }, %"char[]"* %1, align 8 - %2 = bitcast [2 x %"char[]"]* %literal to %"char[]"* - %3 = insertvalue %"char[][]" undef, %"char[]"* %2, 0 - %4 = insertvalue %"char[][]" %3, i64 2, 1 - store %"char[][]" %4, %"char[][]"* %x, align 8 - %5 = bitcast %"char[][]"* %x to i8* - %6 = insertvalue %variant undef, i8* %5, 0 - %7 = insertvalue %variant %6, i64 ptrtoint (%.introspect* @"ct$sa$sa$char" 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 = bitcast [1 x %variant]* %varargslots to %variant* - %10 = insertvalue %"variant[]" undef, %variant* %9, 0 - %11 = insertvalue %"variant[]" %10, i64 1, 1 - store %"variant[]" %11, %"variant[]"* %taddr, align 8 - %12 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 0 - %lo = load i8*, i8** %13, align 8 - %14 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 1 - %hi = load i64, i64* %14, align 8 - %15 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %15, 0 + %retparam7 = alloca i64, align 8 + %varargslots8 = alloca [1 x %variant], align 16 + %taddr = alloca i64, align 8 + %0 = getelementptr inbounds [2 x %"char[]"], ptr %literal, i64 0, i64 0 + store %"char[]" { ptr @.str, i64 3 }, ptr %0, align 8 + %1 = getelementptr inbounds [2 x %"char[]"], ptr %literal, i64 0, i64 1 + store %"char[]" { ptr @.str.2, i64 3 }, ptr %1, align 8 + %2 = insertvalue %"char[][]" undef, ptr %literal, 0 + %3 = insertvalue %"char[][]" %2, i64 2, 1 + store %"char[][]" %3, ptr %x, align 8 + %4 = insertvalue %variant undef, ptr %x, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$sa$sa$char" to i64), 1 + %6 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %5, ptr %6, align 16 + %7 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.3, i64 13, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %7, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %16 = getelementptr inbounds [2 x i64], [2 x i64]* %literal3, i64 0, i64 0 - store i64 ptrtoint (%.fault* @"foo_Foo$BAR" to i64), i64* %16, align 8 - %17 = getelementptr inbounds [2 x i64], [2 x i64]* %literal3, i64 0, i64 1 - store i64 ptrtoint (%.fault* @"foo_Foo$BAZ" to i64), i64* %17, align 8 - %18 = bitcast [2 x i64]* %literal3 to i8* - %19 = insertvalue %variant undef, i8* %18, 0 - %20 = insertvalue %variant %19, i64 ptrtoint (%.introspect* @"ct$a2$foo_Foo" to i64), 1 - %21 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots2, i64 0, i64 0 - store %variant %20, %variant* %21, align 16 - %22 = bitcast [1 x %variant]* %varargslots2 to %variant* - %23 = insertvalue %"variant[]" undef, %variant* %22, 0 - %24 = insertvalue %"variant[]" %23, i64 1, 1 - store %"variant[]" %24, %"variant[]"* %taddr4, align 8 - %25 = bitcast %"variant[]"* %taddr4 to { i8*, i64 }* - %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 0 - %lo5 = load i8*, i8** %26, align 8 - %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 1 - %hi6 = load i64, i64* %27, align 8 - %28 = call i64 @std_io_printfln(i64* %retparam1, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i32 0, i32 0), i64 14, i8* %lo5, i64 %hi6) - %not_err7 = icmp eq i64 %28, 0 - br i1 %not_err7, label %after_check8, label %voiderr9 + %8 = getelementptr inbounds [2 x i64], ptr %literal3, i64 0, i64 0 + store i64 ptrtoint (ptr @"foo_Foo$BAR" to i64), ptr %8, align 8 + %9 = getelementptr inbounds [2 x i64], ptr %literal3, i64 0, i64 1 + store i64 ptrtoint (ptr @"foo_Foo$BAZ" to i64), ptr %9, align 8 + %10 = insertvalue %variant undef, ptr %literal3, 0 + %11 = insertvalue %variant %10, i64 ptrtoint (ptr @"ct$a2$foo_Foo" to i64), 1 + %12 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %11, ptr %12, align 16 + %13 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.4, i64 14, ptr %varargslots2, i64 1) + %not_err4 = icmp eq i64 %13, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check8: ; preds = %voiderr - br label %voiderr9 +after_check5: ; preds = %voiderr + br label %voiderr6 -voiderr9: ; preds = %after_check8, %voiderr - store i64 2, i64* %taddr12, align 8 - %29 = bitcast i64* %taddr12 to i8* - %30 = insertvalue %variant undef, i8* %29, 0 - %31 = insertvalue %variant %30, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 - %32 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots11, i64 0, i64 0 - store %variant %31, %variant* %32, align 16 - %33 = bitcast [1 x %variant]* %varargslots11 to %variant* - %34 = insertvalue %"variant[]" undef, %variant* %33, 0 - %35 = insertvalue %"variant[]" %34, i64 1, 1 - store %"variant[]" %35, %"variant[]"* %taddr13, align 8 - %36 = bitcast %"variant[]"* %taddr13 to { i8*, i64 }* - %37 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %36, i32 0, i32 0 - %lo14 = load i8*, i8** %37, align 8 - %38 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %36, i32 0, i32 1 - %hi15 = load i64, i64* %38, align 8 - %39 = call i64 @std_io_printfln(i64* %retparam10, i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i64 16, i8* %lo14, i64 %hi15) - %not_err16 = icmp eq i64 %39, 0 - br i1 %not_err16, label %after_check17, label %voiderr18 +voiderr6: ; preds = %after_check5, %voiderr + store i64 2, ptr %taddr, align 8 + %14 = insertvalue %variant undef, ptr %taddr, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$long" to i64), 1 + %16 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 + store %variant %15, ptr %16, align 16 + %17 = call i64 @std_io_printfn(ptr %retparam7, ptr @.str.5, i64 16, ptr %varargslots8, i64 1) + %not_err9 = icmp eq i64 %17, 0 + br i1 %not_err9, label %after_check10, label %voiderr11 -after_check17: ; preds = %voiderr9 - br label %voiderr18 +after_check10: ; preds = %voiderr6 + br label %voiderr11 -voiderr18: ; preds = %after_check17, %voiderr9 +voiderr11: ; preds = %after_check10, %voiderr6 ret void } diff --git a/test/test_suite/errors/error_regression_2.c3t b/test/test_suite/errors/error_regression_2.c3t index 3fd6c10a5..5021b89c5 100644 --- a/test/test_suite/errors/error_regression_2.c3t +++ b/test/test_suite/errors/error_regression_2.c3t @@ -150,65 +150,63 @@ fn void main() /* #expect: test.ll -define void @test_Summary_print(%Summary* %0, i8* %1) #0 { +define void @test_Summary_print(ptr %0, ptr %1) #0 { entry: %title = alloca %"char[]", align 8 - %2 = getelementptr inbounds %Summary, %Summary* %0, i32 0, i32 0 - %3 = load %"char[]"*, %"char[]"** %2, align 8 - %ptrbool = icmp ne %"char[]"* %3, null + %2 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0 + %3 = load ptr, ptr %2, align 8 + %ptrbool = icmp ne ptr %3, null br i1 %ptrbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %4 = getelementptr inbounds %Summary, %Summary* %0, i32 0, i32 0 - %5 = load %"char[]"*, %"char[]"** %4, align 8 - %6 = load %"char[]", %"char[]"* %5, align 8 + %4 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0 + %5 = load ptr, ptr %4, align 8 + %6 = load %"char[]", ptr %5, align 8 br label %cond.phi cond.rhs: ; preds = %entry br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %"char[]" [ %6, %cond.lhs ], [ { i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.28, i32 0, i32 0), i64 7 }, %cond.rhs ] - store %"char[]" %val, %"char[]"* %title, align 8 - %7 = getelementptr inbounds %"char[]", %"char[]"* %title, i32 0, i32 1 - %8 = load i64, i64* %7, align 8 + %val = phi %"char[]" [ %6, %cond.lhs ], [ { ptr @.str.28, i64 7 }, %cond.rhs ] + store %"char[]" %val, ptr %title, align 8 + %7 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 1 + %8 = load i64, ptr %7, align 8 %uisitrunc = trunc i64 %8 to i32 - %9 = getelementptr inbounds %"char[]", %"char[]"* %title, i32 0, i32 0 - %10 = load i8*, i8** %9, align 8 - %11 = getelementptr inbounds %Summary, %Summary* %0, i32 0, i32 1 - %12 = load i8, i8* %11, align 8 + %9 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 0 + %10 = load ptr, ptr %9, align 8 + %11 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 1 + %12 = load i8, ptr %11, align 8 %13 = trunc i8 %12 to i1 - %ternary = select i1 %13, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.30, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.31, i32 0, i32 0) - %14 = call i32 (i8*, i8*, ...) @fprintf(i8* %1, i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.29, i32 0, i32 0), i32 %uisitrunc, i8* %10, i8* %ternary) + %ternary = select i1 %13, ptr @.str.30, ptr @.str.31 + %14 = call i32 (ptr, ptr, ...) @fprintf(ptr %1, ptr @.str.29, i32 %uisitrunc, ptr %10, ptr %ternary) ret void } ; Function Attrs: nounwind -define zeroext i8 @test_contains(i8* %0, i64 %1, i8* %2, i64 %3) #0 { +define zeroext i8 @test_contains(ptr %0, i64 %1, ptr %2, i64 %3) #0 { entry: %haystack = alloca %"char[]", align 8 %needle = alloca %"char[]", align 8 %len = alloca i64, align 8 %needle_len = alloca i64, align 8 %i = alloca i64, align 8 - %pair = bitcast %"char[]"* %haystack to { i8*, i64 }* - %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %4, align 8 - %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %5, align 8 - %pair1 = bitcast %"char[]"* %needle to { i8*, i64 }* - %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 0 - store i8* %2, i8** %6, align 8 - %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 1 - store i64 %3, i64* %7, align 8 - %8 = getelementptr inbounds %"char[]", %"char[]"* %haystack, i32 0, i32 1 - %9 = load i64, i64* %8, align 8 - store i64 %9, i64* %len, align 8 - %10 = getelementptr inbounds %"char[]", %"char[]"* %needle, i32 0, i32 1 - %11 = load i64, i64* %10, align 8 - store i64 %11, i64* %needle_len, align 8 - %12 = load i64, i64* %len, align 8 - %13 = load i64, i64* %needle_len, align 8 + %4 = getelementptr inbounds { ptr, i64 }, ptr %haystack, i32 0, i32 0 + store ptr %0, ptr %4, align 8 + %5 = getelementptr inbounds { ptr, i64 }, ptr %haystack, i32 0, i32 1 + store i64 %1, ptr %5, align 8 + %6 = getelementptr inbounds { ptr, i64 }, ptr %needle, i32 0, i32 0 + store ptr %2, ptr %6, align 8 + %7 = getelementptr inbounds { ptr, i64 }, ptr %needle, i32 0, i32 1 + store i64 %3, ptr %7, align 8 + %8 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 1 + %9 = load i64, ptr %8, align 8 + store i64 %9, ptr %len, align 8 + %10 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 1 + %11 = load i64, ptr %10, align 8 + store i64 %11, ptr %needle_len, align 8 + %12 = load i64, ptr %len, align 8 + %13 = load i64, ptr %needle_len, align 8 %lt = icmp ult i64 %12, %13 br i1 %lt, label %if.then, label %if.exit @@ -216,47 +214,47 @@ if.then: ; preds = %entry ret i8 0 if.exit: ; preds = %entry - %14 = load i64, i64* %needle_len, align 8 + %14 = load i64, ptr %needle_len, align 8 %not = icmp eq i64 %14, 0 - br i1 %not, label %if.then2, label %if.exit3 + br i1 %not, label %if.then1, label %if.exit2 -if.then2: ; preds = %if.exit +if.then1: ; preds = %if.exit ret i8 1 -if.exit3: ; preds = %if.exit - %15 = load i64, i64* %len, align 8 - %16 = load i64, i64* %needle_len, align 8 +if.exit2: ; preds = %if.exit + %15 = load i64, ptr %len, align 8 + %16 = load i64, ptr %needle_len, align 8 %sub = sub i64 %16, 1 - %sub4 = sub i64 %15, %sub - store i64 %sub4, i64* %len, align 8 - store i64 0, i64* %i, align 8 + %sub3 = sub i64 %15, %sub + store i64 %sub3, ptr %len, align 8 + store i64 0, ptr %i, align 8 br label %loop.cond -loop.cond: ; preds = %if.exit7, %if.exit3 - %17 = load i64, i64* %i, align 8 - %18 = load i64, i64* %len, align 8 - %lt5 = icmp ult i64 %17, %18 - br i1 %lt5, label %loop.body, label %loop.exit +loop.cond: ; preds = %if.exit6, %if.exit2 + %17 = load i64, ptr %i, align 8 + %18 = load i64, ptr %len, align 8 + %lt4 = icmp ult i64 %17, %18 + br i1 %lt4, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %19 = getelementptr inbounds %"char[]", %"char[]"* %haystack, i32 0, i32 0 - %20 = load i8*, i8** %19, align 8 - %21 = load i64, i64* %i, align 8 - %ptroffset = getelementptr inbounds i8, i8* %20, i64 %21 - %22 = getelementptr inbounds %"char[]", %"char[]"* %needle, i32 0, i32 0 - %23 = load i8*, i8** %22, align 8 - %24 = load i64, i64* %needle_len, align 8 - %25 = call i32 @memcmp(i8* %ptroffset, i8* %23, i64 %24) + %19 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 0 + %20 = load ptr, ptr %19, align 8 + %21 = load i64, ptr %i, align 8 + %ptroffset = getelementptr inbounds i8, ptr %20, i64 %21 + %22 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 0 + %23 = load ptr, ptr %22, align 8 + %24 = load i64, ptr %needle_len, align 8 + %25 = call i32 @memcmp(ptr %ptroffset, ptr %23, i64 %24) %eq = icmp eq i32 %25, 0 - br i1 %eq, label %if.then6, label %if.exit7 + br i1 %eq, label %if.then5, label %if.exit6 -if.then6: ; preds = %loop.body +if.then5: ; preds = %loop.body ret i8 1 -if.exit7: ; preds = %loop.body - %26 = load i64, i64* %i, align 8 +if.exit6: ; preds = %loop.body + %26 = load i64, ptr %i, align 8 %add = add i64 %26, 1 - store i64 %add, i64* %i, align 8 + store i64 %add, ptr %i, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond @@ -264,7 +262,7 @@ loop.exit: ; preds = %loop.cond } ; Function Attrs: nounwind -define i64 @test_readDoc(%Doc* %0, i8* %1, i64 %2) #0 { +define i64 @test_readDoc(ptr %0, ptr %1, i64 %2) #0 { entry: %url = alloca %"char[]", align 8 %reterr = alloca i64, align 8 @@ -274,7 +272,7 @@ entry: %error_var = alloca i64, align 8 %value = alloca %Head, align 8 %literal10 = alloca %Head, align 8 - %temp = alloca %Head*, align 8 + %temp = alloca ptr, align 8 %reterr17 = alloca i64, align 8 %literal18 = alloca %Doc, align 8 %error_var19 = alloca i64, align 8 @@ -282,487 +280,448 @@ entry: %literal21 = alloca %Head, align 8 %error_var22 = alloca i64, align 8 %value23 = alloca %"char[]", align 8 - %temp24 = alloca %"char[]"*, align 8 - %temp31 = alloca %Head*, align 8 + %temp24 = alloca ptr, align 8 + %temp30 = alloca ptr, align 8 %len = alloca i32, align 4 - %str = alloca i8*, align 8 - %reterr45 = alloca i64, align 8 - %literal46 = alloca %Doc, align 8 - %error_var47 = alloca i64, align 8 - %value48 = alloca %Head, align 8 - %literal49 = alloca %Head, align 8 - %error_var50 = alloca i64, align 8 - %value51 = alloca %"char[]", align 8 - %temp52 = alloca %"char[]"*, align 8 - %temp59 = alloca %Head*, align 8 - %pair = bitcast %"char[]"* %url to { i8*, i64 }* - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %1, i8** %3, align 8 - %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %2, i64* %4, align 8 - %5 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo = load i8*, i8** %5, align 8 - %6 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi = load i64, i64* %6, align 8 - %7 = call i8 @test_contains(i8* %lo, i64 %hi, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 4) + %str = alloca ptr, align 8 + %reterr43 = alloca i64, align 8 + %literal44 = alloca %Doc, align 8 + %error_var45 = alloca i64, align 8 + %value46 = alloca %Head, align 8 + %literal47 = alloca %Head, align 8 + %error_var48 = alloca i64, align 8 + %value49 = alloca %"char[]", align 8 + %temp50 = alloca ptr, align 8 + %temp56 = alloca ptr, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 0 + store ptr %1, ptr %3, align 8 + %4 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 1 + store i64 %2, ptr %4, align 8 + %5 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo = load ptr, ptr %5, align 8 + %6 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi = load i64, ptr %6, align 8 + %7 = call i8 @test_contains(ptr %lo, i64 %hi, ptr @.str, i64 4) %8 = trunc i8 %7 to i1 br i1 %8, label %if.then, label %if.exit if.then: ; preds = %entry - ret i64 ptrtoint (%.fault* @"test_ReadError$BAD_READ" to i64) + ret i64 ptrtoint (ptr @"test_ReadError$BAD_READ" to i64) if.exit: ; preds = %entry - %9 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo1 = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi2 = load i64, i64* %10, align 8 - %11 = call i8 @test_contains(i8* %lo1, i64 %hi2, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i32 0, i32 0), i64 12) + %9 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo1 = load ptr, ptr %9, align 8 + %10 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi2 = load i64, ptr %10, align 8 + %11 = call i8 @test_contains(ptr %lo1, i64 %hi2, ptr @.str.3, i64 12) %12 = trunc i8 %11 to i1 br i1 %12, label %if.then3, label %if.exit4 if.then3: ; preds = %if.exit - %13 = getelementptr inbounds %Doc, %Doc* %literal, i32 0, i32 0 - store %Head* null, %Head** %13, align 8 - %14 = bitcast %Doc* %0 to i8* - %15 = bitcast %Doc* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %14, i8* align 8 %15, i32 8, i1 false) + %13 = getelementptr inbounds %Doc, ptr %literal, i32 0, i32 0 + store ptr null, ptr %13, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal, i32 8, i1 false) ret i64 0 if.exit4: ; preds = %if.exit - %16 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo5 = load i8*, i8** %16, align 8 - %17 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi6 = load i64, i64* %17, align 8 - %18 = call i8 @test_contains(i8* %lo5, i64 %hi6, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i64 13) - %19 = trunc i8 %18 to i1 - br i1 %19, label %if.then7, label %if.exit13 + %14 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo5 = load ptr, ptr %14, align 8 + %15 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi6 = load i64, ptr %15, align 8 + %16 = call i8 @test_contains(ptr %lo5, i64 %hi6, ptr @.str.4, i64 13) + %17 = trunc i8 %16 to i1 + br i1 %17, label %if.then7, label %if.exit13 if.then7: ; preds = %if.exit4 - %20 = getelementptr inbounds %Doc, %Doc* %literal9, i32 0, i32 0 - %21 = getelementptr inbounds %Head, %Head* %literal10, i32 0, i32 0 - store %"char[]"* null, %"char[]"** %21, align 8 - %22 = bitcast %Head* %value to i8* - %23 = bitcast %Head* %literal10 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %22, i8* align 8 %23, i32 8, i1 false) - %24 = call i8* @std_core_mem_malloc(i64 8) #2 - %ptrptr = bitcast i8* %24 to %Head* - store %Head* %ptrptr, %Head** %temp, align 8 - %25 = load %Head*, %Head** %temp, align 8 - %not = icmp eq %Head* %25, null + %18 = getelementptr inbounds %Doc, ptr %literal9, i32 0, i32 0 + %19 = getelementptr inbounds %Head, ptr %literal10, i32 0, i32 0 + store ptr null, ptr %19, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value, ptr align 8 %literal10, i32 8, i1 false) + %20 = call ptr @std_core_mem_malloc(i64 8) #2 + store ptr %20, ptr %temp, align 8 + %21 = load ptr, ptr %temp, align 8 + %not = icmp eq ptr %21, null br i1 %not, label %if.then11, label %if.exit12 if.then11: ; preds = %if.then7 - store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var, align 8 + store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var, align 8 br label %guard_block if.exit12: ; preds = %if.then7 - %26 = load %Head*, %Head** %temp, align 8 - %27 = bitcast %Head* %26 to i8* - %28 = bitcast %Head* %value to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %27, i8* align 8 %28, i32 8, i1 false) + %22 = load ptr, ptr %temp, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %22, ptr align 8 %value, i32 8, i1 false) br label %noerr_block guard_block: ; preds = %if.then11 - %29 = load i64, i64* %error_var, align 8 - ret i64 %29 + %23 = load i64, ptr %error_var, align 8 + ret i64 %23 noerr_block: ; preds = %if.exit12 - %30 = load %Head*, %Head** %temp, align 8 - store %Head* %30, %Head** %20, align 8 - %31 = bitcast %Doc* %0 to i8* - %32 = bitcast %Doc* %literal9 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %31, i8* align 8 %32, i32 8, i1 false) + %24 = load ptr, ptr %temp, align 8 + store ptr %24, ptr %18, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal9, i32 8, i1 false) ret i64 0 if.exit13: ; preds = %if.exit4 - %33 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo14 = load i8*, i8** %33, align 8 - %34 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi15 = load i64, i64* %34, align 8 - %35 = call i8 @test_contains(i8* %lo14, i64 %hi15, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.5, i32 0, i32 0), i64 11) - %36 = trunc i8 %35 to i1 - br i1 %36, label %if.then16, label %if.exit38 + %25 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo14 = load ptr, ptr %25, align 8 + %26 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi15 = load i64, ptr %26, align 8 + %27 = call i8 @test_contains(ptr %lo14, i64 %hi15, ptr @.str.5, i64 11) + %28 = trunc i8 %27 to i1 + br i1 %28, label %if.then16, label %if.exit36 if.then16: ; preds = %if.exit13 - %37 = getelementptr inbounds %Doc, %Doc* %literal18, i32 0, i32 0 - %38 = bitcast %Head* %literal21 to %"char[]"** - store %"char[]"* null, %"char[]"** %38, align 8 - %39 = getelementptr inbounds %Head, %Head* %literal21, i32 0, i32 0 - store %"char[]" zeroinitializer, %"char[]"* %value23, align 8 - %40 = call i8* @std_core_mem_malloc(i64 16) #2 - %ptrptr25 = bitcast i8* %40 to %"char[]"* - store %"char[]"* %ptrptr25, %"char[]"** %temp24, align 8 - %41 = load %"char[]"*, %"char[]"** %temp24, align 8 - %not26 = icmp eq %"char[]"* %41, null - br i1 %not26, label %if.then27, label %if.exit28 + %29 = getelementptr inbounds %Doc, ptr %literal18, i32 0, i32 0 + store ptr null, ptr %literal21, align 8 + %30 = getelementptr inbounds %Head, ptr %literal21, i32 0, i32 0 + store %"char[]" zeroinitializer, ptr %value23, align 8 + %31 = call ptr @std_core_mem_malloc(i64 16) #2 + store ptr %31, ptr %temp24, align 8 + %32 = load ptr, ptr %temp24, align 8 + %not25 = icmp eq ptr %32, null + br i1 %not25, label %if.then26, label %if.exit27 -if.then27: ; preds = %if.then16 - store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var22, align 8 - br label %guard_block29 +if.then26: ; preds = %if.then16 + store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var22, align 8 + br label %guard_block28 -if.exit28: ; preds = %if.then16 - %42 = load %"char[]"*, %"char[]"** %temp24, align 8 - %43 = bitcast %"char[]"* %42 to i8* - %44 = bitcast %"char[]"* %value23 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %43, i8* align 8 %44, i32 16, i1 false) - br label %noerr_block30 +if.exit27: ; preds = %if.then16 + %33 = load ptr, ptr %temp24, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %33, ptr align 8 %value23, i32 16, i1 false) + br label %noerr_block29 -guard_block29: ; preds = %if.then27 - %45 = load i64, i64* %error_var22, align 8 - ret i64 %45 +guard_block28: ; preds = %if.then26 + %34 = load i64, ptr %error_var22, align 8 + ret i64 %34 -noerr_block30: ; preds = %if.exit28 - %46 = load %"char[]"*, %"char[]"** %temp24, align 8 - store %"char[]"* %46, %"char[]"** %39, align 8 - %47 = bitcast %Head* %value20 to i8* - %48 = bitcast %Head* %literal21 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %47, i8* align 8 %48, i32 8, i1 false) - %49 = call i8* @std_core_mem_malloc(i64 8) #2 - %ptrptr32 = bitcast i8* %49 to %Head* - store %Head* %ptrptr32, %Head** %temp31, align 8 - %50 = load %Head*, %Head** %temp31, align 8 - %not33 = icmp eq %Head* %50, null - br i1 %not33, label %if.then34, label %if.exit35 +noerr_block29: ; preds = %if.exit27 + %35 = load ptr, ptr %temp24, align 8 + store ptr %35, ptr %30, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value20, ptr align 8 %literal21, i32 8, i1 false) + %36 = call ptr @std_core_mem_malloc(i64 8) #2 + store ptr %36, ptr %temp30, align 8 + %37 = load ptr, ptr %temp30, align 8 + %not31 = icmp eq ptr %37, null + br i1 %not31, label %if.then32, label %if.exit33 -if.then34: ; preds = %noerr_block30 - store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var19, align 8 - br label %guard_block36 +if.then32: ; preds = %noerr_block29 + store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var19, align 8 + br label %guard_block34 -if.exit35: ; preds = %noerr_block30 - %51 = load %Head*, %Head** %temp31, align 8 - %52 = bitcast %Head* %51 to i8* - %53 = bitcast %Head* %value20 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %52, i8* align 8 %53, i32 8, i1 false) - br label %noerr_block37 +if.exit33: ; preds = %noerr_block29 + %38 = load ptr, ptr %temp30, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %38, ptr align 8 %value20, i32 8, i1 false) + br label %noerr_block35 -guard_block36: ; preds = %if.then34 - %54 = load i64, i64* %error_var19, align 8 - ret i64 %54 +guard_block34: ; preds = %if.then32 + %39 = load i64, ptr %error_var19, align 8 + ret i64 %39 -noerr_block37: ; preds = %if.exit35 - %55 = load %Head*, %Head** %temp31, align 8 - store %Head* %55, %Head** %37, align 8 - %56 = bitcast %Doc* %0 to i8* - %57 = bitcast %Doc* %literal18 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %56, i8* align 8 %57, i32 8, i1 false) +noerr_block35: ; preds = %if.exit33 + %40 = load ptr, ptr %temp30, align 8 + store ptr %40, ptr %29, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal18, i32 8, i1 false) ret i64 0 -if.exit38: ; preds = %if.exit13 - %58 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %59 = load i64, i64* %58, align 8 - %uisitrunc = trunc i64 %59 to i32 - %60 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %61 = load i8*, i8** %60, align 8 - %62 = call i32 (i8*, i64, i8*, ...) @snprintf(i8* null, i64 0, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i32 0, i32 0), i32 %uisitrunc, i8* %61) - store i32 %62, i32* %len, align 4 - %63 = load i32, i32* %len, align 4 - %siuiext = sext i32 %63 to i64 +if.exit36: ; preds = %if.exit13 + %41 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %42 = load i64, ptr %41, align 8 + %uisitrunc = trunc i64 %42 to i32 + %43 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %44 = load ptr, ptr %43, align 8 + %45 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @.str.7, i32 %uisitrunc, ptr %44) + store i32 %45, ptr %len, align 4 + %46 = load i32, ptr %len, align 4 + %siuiext = sext i32 %46 to i64 %add = add i64 %siuiext, 1 - %64 = call i8* @std_core_mem_malloc(i64 %add) #2 - store i8* %64, i8** %str, align 8 - %65 = load i8*, i8** %str, align 8 - %not39 = icmp eq i8* %65, null - br i1 %not39, label %if.then40, label %if.exit41 + %47 = call ptr @std_core_mem_malloc(i64 %add) #2 + store ptr %47, ptr %str, align 8 + %48 = load ptr, ptr %str, align 8 + %not37 = icmp eq ptr %48, null + br i1 %not37, label %if.then38, label %if.exit39 -if.then40: ; preds = %if.exit38 - ret i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64) +if.then38: ; preds = %if.exit36 + ret i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64) -if.exit41: ; preds = %if.exit38 - %66 = load i8*, i8** %str, align 8 - %67 = load i32, i32* %len, align 4 - %siuiext42 = sext i32 %67 to i64 - %add43 = add i64 %siuiext42, 1 - %68 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %69 = load i64, i64* %68, align 8 - %uisitrunc44 = trunc i64 %69 to i32 - %70 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %71 = load i8*, i8** %70, align 8 - %72 = call i32 (i8*, i64, i8*, ...) @snprintf(i8* %66, i64 %add43, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.8, i32 0, i32 0), i32 %uisitrunc44, i8* %71) - %73 = getelementptr inbounds %Doc, %Doc* %literal46, i32 0, i32 0 - %74 = bitcast %Head* %literal49 to %"char[]"** - store %"char[]"* null, %"char[]"** %74, align 8 - %75 = getelementptr inbounds %Head, %Head* %literal49, i32 0, i32 0 - %76 = load i8*, i8** %str, align 8 - %77 = load i32, i32* %len, align 4 - %sub = sub i32 %77, 1 +if.exit39: ; preds = %if.exit36 + %49 = load ptr, ptr %str, align 8 + %50 = load i32, ptr %len, align 4 + %siuiext40 = sext i32 %50 to i64 + %add41 = add i64 %siuiext40, 1 + %51 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %52 = load i64, ptr %51, align 8 + %uisitrunc42 = trunc i64 %52 to i32 + %53 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %54 = load ptr, ptr %53, align 8 + %55 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr %49, i64 %add41, ptr @.str.8, i32 %uisitrunc42, ptr %54) + %56 = getelementptr inbounds %Doc, ptr %literal44, i32 0, i32 0 + store ptr null, ptr %literal47, align 8 + %57 = getelementptr inbounds %Head, ptr %literal47, i32 0, i32 0 + %58 = load ptr, ptr %str, align 8 + %59 = load i32, ptr %len, align 4 + %sub = sub i32 %59, 1 %sisiext = sext i32 %sub to i64 - %78 = add i64 %sisiext, 1 - %size = sub i64 %78, 0 - %ptroffset = getelementptr inbounds i8, i8* %76, i64 0 - %79 = insertvalue %"char[]" undef, i8* %ptroffset, 0 - %80 = insertvalue %"char[]" %79, i64 %size, 1 - store %"char[]" %80, %"char[]"* %value51, align 8 - %81 = call i8* @std_core_mem_malloc(i64 16) #2 - %ptrptr53 = bitcast i8* %81 to %"char[]"* - store %"char[]"* %ptrptr53, %"char[]"** %temp52, align 8 - %82 = load %"char[]"*, %"char[]"** %temp52, align 8 - %not54 = icmp eq %"char[]"* %82, null - br i1 %not54, label %if.then55, label %if.exit56 + %60 = add i64 %sisiext, 1 + %size = sub i64 %60, 0 + %ptroffset = getelementptr inbounds i8, ptr %58, i64 0 + %61 = insertvalue %"char[]" undef, ptr %ptroffset, 0 + %62 = insertvalue %"char[]" %61, i64 %size, 1 + store %"char[]" %62, ptr %value49, align 8 + %63 = call ptr @std_core_mem_malloc(i64 16) #2 + store ptr %63, ptr %temp50, align 8 + %64 = load ptr, ptr %temp50, align 8 + %not51 = icmp eq ptr %64, null + br i1 %not51, label %if.then52, label %if.exit53 -if.then55: ; preds = %if.exit41 - store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var50, align 8 - br label %guard_block57 +if.then52: ; preds = %if.exit39 + store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var48, align 8 + br label %guard_block54 -if.exit56: ; preds = %if.exit41 - %83 = load %"char[]"*, %"char[]"** %temp52, align 8 - %84 = bitcast %"char[]"* %83 to i8* - %85 = bitcast %"char[]"* %value51 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %84, i8* align 8 %85, i32 16, i1 false) - br label %noerr_block58 +if.exit53: ; preds = %if.exit39 + %65 = load ptr, ptr %temp50, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %65, ptr align 8 %value49, i32 16, i1 false) + br label %noerr_block55 -guard_block57: ; preds = %if.then55 - %86 = load i64, i64* %error_var50, align 8 - ret i64 %86 +guard_block54: ; preds = %if.then52 + %66 = load i64, ptr %error_var48, align 8 + ret i64 %66 -noerr_block58: ; preds = %if.exit56 - %87 = load %"char[]"*, %"char[]"** %temp52, align 8 - store %"char[]"* %87, %"char[]"** %75, align 8 - %88 = bitcast %Head* %value48 to i8* - %89 = bitcast %Head* %literal49 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %88, i8* align 8 %89, i32 8, i1 false) - %90 = call i8* @std_core_mem_malloc(i64 8) #2 - %ptrptr60 = bitcast i8* %90 to %Head* - store %Head* %ptrptr60, %Head** %temp59, align 8 - %91 = load %Head*, %Head** %temp59, align 8 - %not61 = icmp eq %Head* %91, null - br i1 %not61, label %if.then62, label %if.exit63 +noerr_block55: ; preds = %if.exit53 + %67 = load ptr, ptr %temp50, align 8 + store ptr %67, ptr %57, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value46, ptr align 8 %literal47, i32 8, i1 false) + %68 = call ptr @std_core_mem_malloc(i64 8) #2 + store ptr %68, ptr %temp56, align 8 + %69 = load ptr, ptr %temp56, align 8 + %not57 = icmp eq ptr %69, null + br i1 %not57, label %if.then58, label %if.exit59 -if.then62: ; preds = %noerr_block58 - store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var47, align 8 - br label %guard_block64 +if.then58: ; preds = %noerr_block55 + store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var45, align 8 + br label %guard_block60 -if.exit63: ; preds = %noerr_block58 - %92 = load %Head*, %Head** %temp59, align 8 - %93 = bitcast %Head* %92 to i8* - %94 = bitcast %Head* %value48 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %93, i8* align 8 %94, i32 8, i1 false) - br label %noerr_block65 +if.exit59: ; preds = %noerr_block55 + %70 = load ptr, ptr %temp56, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %70, ptr align 8 %value46, i32 8, i1 false) + br label %noerr_block61 -guard_block64: ; preds = %if.then62 - %95 = load i64, i64* %error_var47, align 8 - ret i64 %95 +guard_block60: ; preds = %if.then58 + %71 = load i64, ptr %error_var45, align 8 + ret i64 %71 -noerr_block65: ; preds = %if.exit63 - %96 = load %Head*, %Head** %temp59, align 8 - store %Head* %96, %Head** %73, align 8 - %97 = bitcast %Doc* %0 to i8* - %98 = bitcast %Doc* %literal46 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %97, i8* align 8 %98, i32 8, i1 false) +noerr_block61: ; preds = %if.exit59 + %72 = load ptr, ptr %temp56, align 8 + store ptr %72, ptr %56, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal44, i32 8, i1 false) ret i64 0 } ; Function Attrs: nounwind -define { %"char[]"*, i8 } @test_buildSummary(%Head* %0) #0 { +define { ptr, i8 } @test_buildSummary(ptr %0) #0 { entry: %doc = alloca %Doc, align 8 %literal = alloca %Summary, align 8 - %1 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 - store %Head* %0, %Head** %1, align 8 - %2 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 0 - store %"char[]"* null, %"char[]"** %2, align 8 - %3 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 1 - store i8 0, i8* %3, align 8 - %4 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 0 - %5 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 - %6 = load %Head*, %Head** %5, align 8 - %ptrbool = icmp ne %Head* %6, null + %1 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 + store ptr %0, ptr %1, align 8 + %2 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0 + store ptr null, ptr %2, align 8 + %3 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1 + store i8 0, ptr %3, align 8 + %4 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0 + %5 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 + %6 = load ptr, ptr %5, align 8 + %ptrbool = icmp ne ptr %6, null br i1 %ptrbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %7 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 - %8 = load %Head*, %Head** %7, align 8 - %9 = getelementptr inbounds %Head, %Head* %8, i32 0, i32 0 - %10 = load %"char[]"*, %"char[]"** %9, align 8 - %ptrptr = bitcast %"char[]"* %10 to i8* + %7 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + %9 = getelementptr inbounds %Head, ptr %8, i32 0, i32 0 + %10 = load ptr, ptr %9, align 8 br label %cond.phi cond.rhs: ; preds = %entry br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi i8* [ %ptrptr, %cond.lhs ], [ null, %cond.rhs ] - %ptrptr1 = bitcast i8* %val to %"char[]"* - store %"char[]"* %ptrptr1, %"char[]"** %4, align 8 - %11 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 1 - store i8 1, i8* %11, align 8 - %12 = bitcast %Summary* %literal to { %"char[]"*, i8 }* - %13 = load { %"char[]"*, i8 }, { %"char[]"*, i8 }* %12, align 8 - ret { %"char[]"*, i8 } %13 + %val = phi ptr [ %10, %cond.lhs ], [ null, %cond.rhs ] + store ptr %val, ptr %4, align 8 + %11 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1 + store i8 1, ptr %11, align 8 + %12 = load { ptr, i8 }, ptr %literal, align 8 + ret { ptr, i8 } %12 } ; Function Attrs: nounwind -define { %"char[]"*, i8 } @test_readAndBuildSummary(i8* %0, i64 %1) #0 { +define { ptr, i8 } @test_readAndBuildSummary(ptr %0, i64 %1) #0 { entry: %url = alloca %"char[]", align 8 %retparam = alloca %Doc, align 8 %result = alloca %Summary, align 8 %literal = alloca %Summary, align 8 %taddr = alloca %Summary, align 8 - %pair = bitcast %"char[]"* %url to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - %4 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo = load i8*, i8** %4, align 8 - %5 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi = load i64, i64* %5, align 8 - %6 = call i64 @test_readDoc(%Doc* %retparam, i8* %lo, i64 %hi) + %2 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + %4 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo = load ptr, ptr %4, align 8 + %5 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi = load i64, ptr %5, align 8 + %6 = call i64 @test_readDoc(ptr %retparam, ptr %lo, i64 %hi) %not_err = icmp eq i64 %6, 0 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %7 = getelementptr inbounds %Doc, %Doc* %retparam, i32 0, i32 0 - %8 = load %Head*, %Head** %7, align 8 - %9 = call { %"char[]"*, i8 } @test_buildSummary(%Head* %8) - %10 = bitcast %Summary* %result to { %"char[]"*, i8 }* - store { %"char[]"*, i8 } %9, { %"char[]"*, i8 }* %10, align 8 - %11 = load %Summary, %Summary* %result, align 8 + %7 = getelementptr inbounds %Doc, ptr %retparam, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + %9 = call { ptr, i8 } @test_buildSummary(ptr %8) + store { ptr, i8 } %9, ptr %result, align 8 + %10 = load %Summary, ptr %result, align 8 br label %phi_block else_block: ; preds = %entry - %12 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 0 - store %"char[]"* null, %"char[]"** %12, align 8 - %13 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 1 - store i8 0, i8* %13, align 8 - %14 = load %Summary, %Summary* %literal, align 8 + %11 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0 + store ptr null, ptr %11, align 8 + %12 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1 + store i8 0, ptr %12, align 8 + %13 = load %Summary, ptr %literal, align 8 br label %phi_block phi_block: ; preds = %else_block, %after_check - %val = phi %Summary [ %11, %after_check ], [ %14, %else_block ] - store %Summary %val, %Summary* %taddr, align 8 - %15 = bitcast %Summary* %taddr to { %"char[]"*, i8 }* - %16 = load { %"char[]"*, i8 }, { %"char[]"*, i8 }* %15, align 8 - ret { %"char[]"*, i8 } %16 + %val = phi %Summary [ %10, %after_check ], [ %13, %else_block ] + store %Summary %val, ptr %taddr, align 8 + %14 = load { ptr, i8 }, ptr %taddr, align 8 + ret { ptr, i8 } %14 } ; Function Attrs: nounwind -define i64 @test_isTitleNonEmpty(i8* %0, %Head* %1) #0 { +define i64 @test_isTitleNonEmpty(ptr %0, ptr %1) #0 { entry: %doc = alloca %Doc, align 8 - %head = alloca %"char[]"*, align 8 + %head = alloca ptr, align 8 %reterr = alloca i64, align 8 - %2 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 - store %Head* %1, %Head** %2, align 8 - %3 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 - %4 = load %Head*, %Head** %3, align 8 - %not = icmp eq %Head* %4, null + %2 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 + store ptr %1, ptr %2, align 8 + %3 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 + %4 = load ptr, ptr %3, align 8 + %not = icmp eq ptr %4, null br i1 %not, label %if.then, label %if.exit if.then: ; preds = %entry - ret i64 ptrtoint (%.fault* @"test_TitleResult$TITLE_MISSING" to i64) + ret i64 ptrtoint (ptr @"test_TitleResult$TITLE_MISSING" to i64) if.exit: ; preds = %entry - %5 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 - %6 = load %Head*, %Head** %5, align 8 - %7 = getelementptr inbounds %Head, %Head* %6, i32 0, i32 0 - %8 = load %"char[]"*, %"char[]"** %7, align 8 - store %"char[]"* %8, %"char[]"** %head, align 8 - %9 = load %"char[]"*, %"char[]"** %head, align 8 - %not1 = icmp eq %"char[]"* %9, null + %5 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 + %6 = load ptr, ptr %5, align 8 + %7 = getelementptr inbounds %Head, ptr %6, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + store ptr %8, ptr %head, align 8 + %9 = load ptr, ptr %head, align 8 + %not1 = icmp eq ptr %9, null br i1 %not1, label %if.then2, label %if.exit3 if.then2: ; preds = %if.exit - ret i64 ptrtoint (%.fault* @"test_TitleResult$TITLE_MISSING" to i64) + ret i64 ptrtoint (ptr @"test_TitleResult$TITLE_MISSING" to i64) if.exit3: ; preds = %if.exit - %10 = load %"char[]"*, %"char[]"** %head, align 8 - %11 = getelementptr inbounds %"char[]", %"char[]"* %10, i32 0, i32 1 - %12 = load i64, i64* %11, align 8 + %10 = load ptr, ptr %head, align 8 + %11 = getelementptr inbounds %"char[]", ptr %10, i32 0, i32 1 + %12 = load i64, ptr %11, align 8 %lt = icmp ult i64 0, %12 %13 = zext i1 %lt to i8 - store i8 %13, i8* %0, align 1 + store i8 %13, ptr %0, align 1 ret i64 0 } ; Function Attrs: nounwind -define i64 @test_readWhetherTitleNonEmpty(i8* %0, i8* %1, i64 %2) #0 { +define i64 @test_readWhetherTitleNonEmpty(ptr %0, ptr %1, i64 %2) #0 { entry: %url = alloca %"char[]", align 8 %reterr = alloca i64, align 8 %retparam = alloca i8, align 1 %retparam1 = alloca %Doc, align 8 - %pair = bitcast %"char[]"* %url to { i8*, i64 }* - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %1, i8** %3, align 8 - %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %2, i64* %4, align 8 - %5 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo = load i8*, i8** %5, align 8 - %6 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi = load i64, i64* %6, align 8 - %7 = call i64 @test_readDoc(%Doc* %retparam1, i8* %lo, i64 %hi) + %3 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 0 + store ptr %1, ptr %3, align 8 + %4 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 1 + store i64 %2, ptr %4, align 8 + %5 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo = load ptr, ptr %5, align 8 + %6 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi = load i64, ptr %6, align 8 + %7 = call i64 @test_readDoc(ptr %retparam1, ptr %lo, i64 %hi) %not_err = icmp eq i64 %7, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %7, i64* %reterr, align 8 + store i64 %7, ptr %reterr, align 8 br label %err_retblock after_check: ; preds = %entry - %8 = getelementptr inbounds %Doc, %Doc* %retparam1, i32 0, i32 0 - %9 = load %Head*, %Head** %8, align 8 - %10 = call i64 @test_isTitleNonEmpty(i8* %retparam, %Head* %9) + %8 = getelementptr inbounds %Doc, ptr %retparam1, i32 0, i32 0 + %9 = load ptr, ptr %8, align 8 + %10 = call i64 @test_isTitleNonEmpty(ptr %retparam, ptr %9) %not_err2 = icmp eq i64 %10, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %after_check - store i64 %10, i64* %reterr, align 8 + store i64 %10, ptr %reterr, align 8 br label %err_retblock after_check4: ; preds = %after_check - %11 = load i8, i8* %retparam, align 1 - store i8 %11, i8* %0, align 1 + %11 = load i8, ptr %retparam, align 1 + store i8 %11, ptr %0, align 1 ret i64 0 err_retblock: ; preds = %assign_optional3, %assign_optional - %12 = load i64, i64* %reterr, align 8 + %12 = load i64, ptr %reterr, align 8 ret i64 %12 } ; Function Attrs: nounwind -define i8* @test_bool_to_string(i8 zeroext %0) #0 { +define ptr @test_bool_to_string(i8 zeroext %0) #0 { entry: %1 = trunc i8 %0 to i1 - %ternary = select i1 %1, %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.9, i32 0, i32 0), i64 4 }, %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i64 5 } + %ternary = select i1 %1, %"char[]" { ptr @.str.9, i64 4 }, %"char[]" { ptr @.str.10, i64 5 } %2 = extractvalue %"char[]" %ternary, 0 - ret i8* %2 + ret ptr %2 } ; Function Attrs: nounwind -define i8* @test_nameFromError(i64 %0) #0 { +define ptr @test_nameFromError(i64 %0) #0 { entry: %switch = alloca i64, align 8 - store i64 %0, i64* %switch, align 8 + store i64 %0, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.fault* @"test_TitleResult$TITLE_MISSING" to i64), %1 + %1 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"test_TitleResult$TITLE_MISSING" to i64), %1 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.11, i32 0, i32 0) + ret ptr @.str.11 next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (%.fault* @"test_ReadError$BAD_READ" to i64), %1 + %eq1 = icmp eq i64 ptrtoint (ptr @"test_ReadError$BAD_READ" to i64), %1 br i1 %eq1, label %switch.case2, label %next_if3 switch.case2: ; preds = %next_if - ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i32 0, i32 0) + ret ptr @.str.12 next_if3: ; preds = %next_if - %eq4 = icmp eq i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), %1 + %eq4 = icmp eq i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), %1 br i1 %eq4, label %switch.case5, label %next_if6 switch.case5: ; preds = %next_if3 - ret i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i32 0, i32 0) + ret ptr @.str.13 next_if6: ; preds = %next_if3 br label %switch.default switch.default: ; preds = %next_if6 - ret i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.14, i32 0, i32 0) + ret ptr @.str.14 } ; Function Attrs: nounwind @@ -779,137 +738,131 @@ entry: %has_title = alloca i8, align 1 %has_title.f = alloca i64, align 8 %retparam = alloca i8, align 1 - %0 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 0 - store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.15, i32 0, i32 0), i64 4 }, %"char[]"* %0, align 8 - %1 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 1 - store %"char[]" { i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.16, i32 0, i32 0), i64 11 }, %"char[]"* %1, align 8 - %2 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 2 - store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.17, i32 0, i32 0), i64 13 }, %"char[]"* %2, align 8 - %3 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 3 - store %"char[]" { i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i64 12 }, %"char[]"* %3, align 8 - %4 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 4 - store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.19, i32 0, i32 0), i64 4 }, %"char[]"* %4, align 8 - %5 = bitcast [5 x %"char[]"]* %literal to %"char[]"* - %6 = insertvalue %"char[][]" undef, %"char[]"* %5, 0 - %7 = insertvalue %"char[][]" %6, i64 5, 1 - store %"char[][]" %7, %"char[][]"* %URLS, align 8 - %8 = getelementptr inbounds %"char[][]", %"char[][]"* %URLS, i32 0, i32 1 - %9 = load i64, i64* %8, align 8 - store i64 %9, i64* %.anon, align 8 - store i64 0, i64* %.anon1, align 8 + %0 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 0 + store %"char[]" { ptr @.str.15, i64 4 }, ptr %0, align 8 + %1 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 1 + store %"char[]" { ptr @.str.16, i64 11 }, ptr %1, align 8 + %2 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 2 + store %"char[]" { ptr @.str.17, i64 13 }, ptr %2, align 8 + %3 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 3 + store %"char[]" { ptr @.str.18, i64 12 }, ptr %3, align 8 + %4 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 4 + store %"char[]" { ptr @.str.19, i64 4 }, ptr %4, align 8 + %5 = insertvalue %"char[][]" undef, ptr %literal, 0 + %6 = insertvalue %"char[][]" %5, i64 5, 1 + store %"char[][]" %6, ptr %URLS, align 8 + %7 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 1 + %8 = load i64, ptr %7, align 8 + store i64 %8, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond loop.cond: ; preds = %phi_block12, %entry - %10 = load i64, i64* %.anon1, align 8 - %11 = load i64, i64* %.anon, align 8 - %lt = icmp ult i64 %10, %11 + %9 = load i64, ptr %.anon1, align 8 + %10 = load i64, ptr %.anon, align 8 + %lt = icmp ult i64 %9, %10 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %12 = getelementptr inbounds %"char[][]", %"char[][]"* %URLS, i32 0, i32 0 - %13 = load %"char[]"*, %"char[]"** %12, align 8 - %14 = load i64, i64* %.anon1, align 8 - %ptroffset = getelementptr inbounds %"char[]", %"char[]"* %13, i64 %14 - %15 = bitcast %"char[]"* %url to i8* - %16 = bitcast %"char[]"* %ptroffset to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %15, i8* align 8 %16, i32 16, i1 false) - %17 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %18 = load i64, i64* %17, align 8 - %uisitrunc = trunc i64 %18 to i32 - %19 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %20 = load i8*, i8** %19, align 8 - %21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.20, i32 0, i32 0), i32 %uisitrunc, i8* %20) - %22 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo = load i8*, i8** %22, align 8 - %23 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi = load i64, i64* %23, align 8 - %24 = call { %"char[]"*, i8 } @test_readAndBuildSummary(i8* %lo, i64 %hi) - %25 = bitcast %Summary* %result to { %"char[]"*, i8 }* - store { %"char[]"*, i8 } %24, { %"char[]"*, i8 }* %25, align 8 - %26 = bitcast %Summary* %summary to i8* - %27 = bitcast %Summary* %result to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %26, i8* align 8 %27, i32 16, i1 false) - %28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.21, i32 0, i32 0)) - %29 = load i8*, i8** @__stdoutp, align 8 - call void @test_Summary_print(%Summary* %summary, i8* %29) - %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.22, i32 0, i32 0)) - %31 = getelementptr inbounds %Summary, %Summary* %summary, i32 0, i32 0 - %32 = load %"char[]"*, %"char[]"** %31, align 8 - %ptrbool = icmp ne %"char[]"* %32, null + %11 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 0 + %12 = load ptr, ptr %11, align 8 + %13 = load i64, ptr %.anon1, align 8 + %ptroffset = getelementptr inbounds %"char[]", ptr %12, i64 %13 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %url, ptr align 8 %ptroffset, i32 16, i1 false) + %14 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %15 = load i64, ptr %14, align 8 + %uisitrunc = trunc i64 %15 to i32 + %16 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %17 = load ptr, ptr %16, align 8 + %18 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %uisitrunc, ptr %17) + %19 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo = load ptr, ptr %19, align 8 + %20 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi = load i64, ptr %20, align 8 + %21 = call { ptr, i8 } @test_readAndBuildSummary(ptr %lo, i64 %hi) + store { ptr, i8 } %21, ptr %result, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %summary, ptr align 8 %result, i32 16, i1 false) + %22 = call i32 (ptr, ...) @printf(ptr @.str.21) + %23 = load ptr, ptr @__stdoutp, align 8 + call void @test_Summary_print(ptr %summary, ptr %23) + %24 = call i32 (ptr, ...) @printf(ptr @.str.22) + %25 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0 + %26 = load ptr, ptr %25, align 8 + %ptrbool = icmp ne ptr %26, null br i1 %ptrbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %loop.body - %33 = getelementptr inbounds %Summary, %Summary* %summary, i32 0, i32 0 - %34 = load %"char[]"*, %"char[]"** %33, align 8 - %35 = load %"char[]", %"char[]"* %34, align 8 + %27 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0 + %28 = load ptr, ptr %27, align 8 + %29 = load %"char[]", ptr %28, align 8 br label %cond.phi cond.rhs: ; preds = %loop.body br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %"char[]" [ %35, %cond.lhs ], [ zeroinitializer, %cond.rhs ] - store %"char[]" %val, %"char[]"* %title_sure, align 8 - %36 = getelementptr inbounds %"char[]", %"char[]"* %title_sure, i32 0, i32 1 - %37 = load i64, i64* %36, align 8 - %uisitrunc2 = trunc i64 %37 to i32 - %38 = getelementptr inbounds %"char[]", %"char[]"* %title_sure, i32 0, i32 0 - %39 = load i8*, i8** %38, align 8 - %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.24, i32 0, i32 0), i32 %uisitrunc2, i8* %39) - %41 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 - %lo3 = load i8*, i8** %41, align 8 - %42 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 - %hi4 = load i64, i64* %42, align 8 - %43 = call i64 @test_readWhetherTitleNonEmpty(i8* %retparam, i8* %lo3, i64 %hi4) - %not_err = icmp eq i64 %43, 0 + %val = phi %"char[]" [ %29, %cond.lhs ], [ zeroinitializer, %cond.rhs ] + store %"char[]" %val, ptr %title_sure, align 8 + %30 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 1 + %31 = load i64, ptr %30, align 8 + %uisitrunc2 = trunc i64 %31 to i32 + %32 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 0 + %33 = load ptr, ptr %32, align 8 + %34 = call i32 (ptr, ...) @printf(ptr @.str.24, i32 %uisitrunc2, ptr %33) + %35 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 + %lo3 = load ptr, ptr %35, align 8 + %36 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 + %hi4 = load i64, ptr %36, align 8 + %37 = call i64 @test_readWhetherTitleNonEmpty(ptr %retparam, ptr %lo3, i64 %hi4) + %not_err = icmp eq i64 %37, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %cond.phi - store i64 %43, i64* %has_title.f, align 8 + store i64 %37, ptr %has_title.f, align 8 br label %after_assign after_check: ; preds = %cond.phi - %44 = load i8, i8* %retparam, align 1 - store i8 %44, i8* %has_title, align 1 - store i64 0, i64* %has_title.f, align 8 + %38 = load i8, ptr %retparam, align 1 + store i8 %38, ptr %has_title, align 1 + store i64 0, ptr %has_title.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %optval = load i64, i64* %has_title.f, align 8 + %optval = load i64, ptr %has_title.f, align 8 %not_err5 = icmp eq i64 %optval, 0 br i1 %not_err5, label %after_check6, label %else_block after_check6: ; preds = %after_assign - %45 = load i8, i8* %has_title, align 1 - %46 = call i8* @test_bool_to_string(i8 %45) + %39 = load i8, ptr %has_title, align 1 + %40 = call ptr @test_bool_to_string(i8 %39) br label %phi_block else_block: ; preds = %after_assign - %47 = load i64, i64* %has_title.f, align 8 - %48 = call i8* @test_nameFromError(i64 %47) + %41 = load i64, ptr %has_title.f, align 8 + %42 = call ptr @test_nameFromError(i64 %41) br label %phi_block phi_block: ; preds = %else_block, %after_check6 - %val7 = phi i8* [ %46, %after_check6 ], [ %48, %else_block ] - %optval8 = load i64, i64* %has_title.f, align 8 + %val7 = phi ptr [ %40, %after_check6 ], [ %42, %else_block ] + %optval8 = load i64, ptr %has_title.f, align 8 %not_err9 = icmp eq i64 %optval8, 0 br i1 %not_err9, label %after_check10, label %else_block11 after_check10: ; preds = %phi_block - %49 = load i8, i8* %has_title, align 1 - %50 = trunc i8 %49 to i1 + %43 = load i8, ptr %has_title, align 1 + %44 = trunc i8 %43 to i1 br label %phi_block12 else_block11: ; preds = %phi_block br label %phi_block12 phi_block12: ; preds = %else_block11, %after_check10 - %val13 = phi i1 [ %50, %after_check10 ], [ false, %else_block11 ] - %ternary = select i1 %val13, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.26, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i32 0, i32 0) - %51 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.25, i32 0, i32 0), i8* %val7, i8* %ternary) - %52 = load i64, i64* %.anon1, align 8 - %add = add i64 %52, 1 - store i64 %add, i64* %.anon1, align 8 + %val13 = phi i1 [ %44, %after_check10 ], [ false, %else_block11 ] + %ternary = select i1 %val13, ptr @.str.26, ptr @.str.27 + %45 = call i32 (ptr, ...) @printf(ptr @.str.25, ptr %val7, ptr %ternary) + %46 = load i64, ptr %.anon1, align 8 + %add = add i64 %46, 1 + store i64 %add, ptr %.anon1, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond diff --git a/test/test_suite/errors/failable_catch.c3t b/test/test_suite/errors/failable_catch.c3t index 683d45f13..a67979bb7 100644 --- a/test/test_suite/errors/failable_catch.c3t +++ b/test/test_suite/errors/failable_catch.c3t @@ -44,108 +44,133 @@ entry: %c.f = alloca i64, align 8 %x8 = alloca i32, align 4 %blockret9 = alloca i32, align 4 - store i32 1, i32* %x, align 4 - %0 = load i32, i32* %x, align 4 + store i32 1, ptr %x, align 4 + %0 = load i32, ptr %x, align 4 %intbool = icmp ne i32 %0, 0 br i1 %intbool, label %if.then, label %if.exit + if.then: ; preds = %entry - %1 = load i32, i32* %x, align 4 - store i32 %1, i32* %blockret, align 4 + %1 = load i32, ptr %x, align 4 + store i32 %1, ptr %blockret, align 4 br label %expr_block.exit + if.exit: ; preds = %entry - store i64 ptrtoint (%.fault* @"failable_catch_MyErr$TEST" to i64), i64* %a.f, align 8 + store i64 ptrtoint (ptr @"failable_catch_MyErr$TEST" to i64), ptr %a.f, align 8 br label %after_assign + expr_block.exit: ; preds = %if.then - %2 = load i32, i32* %blockret, align 4 - store i32 %2, i32* %a, align 4 - store i64 0, i64* %a.f, align 8 + %2 = load i32, ptr %blockret, align 4 + store i32 %2, ptr %a, align 4 + store i64 0, ptr %a.f, align 8 br label %after_assign + after_assign: ; preds = %expr_block.exit, %if.exit - %optval = load i64, i64* %a.f, align 8 + %optval = load i64, ptr %a.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %else_block + after_check: ; preds = %after_assign - %3 = load i32, i32* %a, align 4 + %3 = load i32, ptr %a, align 4 %add = add i32 %3, 3 br label %phi_block + else_block: ; preds = %after_assign br label %phi_block + phi_block: ; preds = %else_block, %after_check %val = phi i32 [ %add, %after_check ], [ 2, %else_block ] - store i32 %val, i32* %x1, align 4 - %4 = load i32, i32* %x1, align 4 + store i32 %val, ptr %x1, align 4 + %4 = load i32, ptr %x1, align 4 %intbool3 = icmp ne i32 %4, 0 br i1 %intbool3, label %if.then4, label %if.exit5 + if.then4: ; preds = %phi_block - %5 = load i32, i32* %x1, align 4 - store i32 %5, i32* %blockret2, align 4 + %5 = load i32, ptr %x1, align 4 + store i32 %5, ptr %blockret2, align 4 br label %expr_block.exit6 + if.exit5: ; preds = %phi_block - store i64 ptrtoint (%.fault* @"failable_catch_MyErr$TEST" to i64), i64* %b.f, align 8 + store i64 ptrtoint (ptr @"failable_catch_MyErr$TEST" to i64), ptr %b.f, align 8 br label %after_assign7 + expr_block.exit6: ; preds = %if.then4 - %6 = load i32, i32* %blockret2, align 4 - store i32 %6, i32* %b, align 4 - store i64 0, i64* %b.f, align 8 + %6 = load i32, ptr %blockret2, align 4 + store i32 %6, ptr %b, align 4 + store i64 0, ptr %b.f, align 8 br label %after_assign7 + after_assign7: ; preds = %expr_block.exit6, %if.exit5 - store i32 0, i32* %x8, align 4 - %7 = load i32, i32* %x8, align 4 + store i32 0, ptr %x8, align 4 + %7 = load i32, ptr %x8, align 4 %intbool10 = icmp ne i32 %7, 0 br i1 %intbool10, label %if.then11, label %if.exit12 + if.then11: ; preds = %after_assign7 - %8 = load i32, i32* %x8, align 4 - store i32 %8, i32* %blockret9, align 4 + %8 = load i32, ptr %x8, align 4 + store i32 %8, ptr %blockret9, align 4 br label %expr_block.exit13 + if.exit12: ; preds = %after_assign7 - store i64 ptrtoint (%.fault* @"failable_catch_MyErr$TEST" to i64), i64* %c.f, align 8 + store i64 ptrtoint (ptr @"failable_catch_MyErr$TEST" to i64), ptr %c.f, align 8 br label %after_assign14 + expr_block.exit13: ; preds = %if.then11 - %9 = load i32, i32* %blockret9, align 4 - store i32 %9, i32* %c, align 4 - store i64 0, i64* %c.f, align 8 + %9 = load i32, ptr %blockret9, align 4 + store i32 %9, ptr %c, align 4 + store i64 0, ptr %c.f, align 8 br label %after_assign14 + after_assign14: ; preds = %expr_block.exit13, %if.exit12 - %optval15 = load i64, i64* %a.f, align 8 + %optval15 = load i64, ptr %a.f, align 8 %not_err16 = icmp eq i64 %optval15, 0 br i1 %not_err16, label %after_check17, label %voiderr + after_check17: ; preds = %after_assign14 - %10 = load i32, i32* %a, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 %10) + %10 = load i32, ptr %a, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %10) br label %voiderr + voiderr: ; preds = %after_check17, %after_assign14 - %optval18 = load i64, i64* %b.f, align 8 + %optval18 = load i64, ptr %b.f, align 8 %not_err19 = icmp eq i64 %optval18, 0 br i1 %not_err19, label %after_check20, label %voiderr21 + after_check20: ; preds = %voiderr - %11 = load i32, i32* %b, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %11) + %11 = load i32, ptr %b, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %11) br label %voiderr21 + voiderr21: ; preds = %after_check20, %voiderr - %optval22 = load i64, i64* %c.f, align 8 + %optval22 = load i64, ptr %c.f, align 8 %not_err23 = icmp eq i64 %optval22, 0 br i1 %not_err23, label %after_check24, label %voiderr25 + after_check24: ; preds = %voiderr21 - %12 = load i32, i32* %c, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 %12) + %12 = load i32, ptr %c, align 4 + call void (ptr, ...) @printf(ptr @.str.2, i32 %12) br label %voiderr25 + voiderr25: ; preds = %after_check24, %voiderr21 - %13 = load i64, i64* %c.f, align 8 + %13 = load i64, ptr %c.f, align 8 %neq = icmp ne i64 %13, 0 br i1 %neq, label %if.then26, label %if.exit27 + if.then26: ; preds = %voiderr25 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.3) br label %if.exit27 + if.exit27: ; preds = %if.then26, %voiderr25 - store i32 3, i32* %c, align 4 - store i64 0, i64* %c.f, align 8 - %optval28 = load i64, i64* %c.f, align 8 + store i32 3, ptr %c, align 4 + store i64 0, ptr %c.f, align 8 + %optval28 = load i64, ptr %c.f, align 8 %not_err29 = icmp eq i64 %optval28, 0 br i1 %not_err29, label %after_check30, label %voiderr31 + after_check30: ; preds = %if.exit27 - %14 = load i32, i32* %c, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i32 0, i32 0), i32 %14) + %14 = load i32, ptr %c, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %14) br label %voiderr31 + voiderr31: ; preds = %after_check30, %if.exit27 ret i32 0 } diff --git a/test/test_suite/errors/general_error_regression.c3t b/test/test_suite/errors/general_error_regression.c3t index 7f3da1d8f..cd268875a 100644 --- a/test/test_suite/errors/general_error_regression.c3t +++ b/test/test_suite/errors/general_error_regression.c3t @@ -72,21 +72,21 @@ fn void main() /* #expect: foo.ll -define void @foo_Foo_hello(i64* %0) #0 { +define void @foo_Foo_hello(ptr %0) #0 { entry: - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.12, i32 0, i32 0)) #1 + %1 = call i32 @std_io_println(ptr @.str.12) #1 ret void } -define void @foo_Bar_hello(i32* %0) #0 { +define void @foo_Bar_hello(ptr %0) #0 { entry: - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.13, i32 0, i32 0)) #1 + %1 = call i32 @std_io_println(ptr @.str.13) #1 ret void } -define void @foo_MyEnum_hello(i32* %0) #0 { +define void @foo_MyEnum_hello(ptr %0) #0 { entry: - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.14, i32 0, i32 0)) #1 + %1 = call i32 @std_io_println(ptr @.str.14) #1 ret void } @@ -98,44 +98,44 @@ entry: %z = alloca i64, align 8 %b = alloca i32, align 4 %a = alloca i32, align 4 - store i64 ptrtoint (%.fault* @"foo_Foo$X" to i64), i64* %f, align 8 - store i64 ptrtoint (%.fault* @"foo_Foo$Y" to i64), i64* %ef, align 8 - %0 = load i64, i64* %f, align 8 - store i64 %0, i64* %x, align 8 - %1 = load i64, i64* %x, align 8 - store i64 %1, i64* %z, align 8 - %2 = load i64, i64* %z, align 8 - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i64 %2) - %4 = load i64, i64* %ef, align 8 - store i64 %4, i64* %x, align 8 - %5 = load i64, i64* %x, align 8 - store i64 %5, i64* %z, align 8 - %6 = load i64, i64* %z, align 8 - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i32 0, i32 0), i64 %6) - store i64 ptrtoint (%.fault* @"foo_Foo$W" to i64), i64* %x, align 8 - %8 = load i64, i64* %x, align 8 - store i64 %8, i64* %z, align 8 - %9 = load i64, i64* %z, align 8 - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), i64 %9) - store i64 ptrtoint (%.fault* @"foo_Foo$W1" to i64), i64* %x, align 8 - %11 = load i64, i64* %x, align 8 - store i64 %11, i64* %z, align 8 - %12 = load i64, i64* %z, align 8 - %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.9, i32 0, i32 0), i64 %12) - store i64 ptrtoint (%.fault* @"foo_Foob$X1" to i64), i64* %x, align 8 - %14 = load i64, i64* %x, align 8 - store i64 %14, i64* %z, align 8 - %15 = load i64, i64* %z, align 8 - %16 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i32 0, i32 0), i64 %15) - store i64 ptrtoint (%.fault* @"foo_Foob$Y2" to i64), i64* %x, align 8 - %17 = load i64, i64* %x, align 8 - store i64 %17, i64* %z, align 8 - %18 = load i64, i64* %z, align 8 - %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i32 0, i32 0), i64 %18) - store i32 0, i32* %b, align 4 - store i32 0, i32* %a, align 4 - call void @foo_Foo_hello(i64* %f) - call void @foo_Bar_hello(i32* %b) - call void @foo_MyEnum_hello(i32* %a) + store i64 ptrtoint (ptr @"foo_Foo$X" to i64), ptr %f, align 8 + store i64 ptrtoint (ptr @"foo_Foo$Y" to i64), ptr %ef, align 8 + %0 = load i64, ptr %f, align 8 + store i64 %0, ptr %x, align 8 + %1 = load i64, ptr %x, align 8 + store i64 %1, ptr %z, align 8 + %2 = load i64, ptr %z, align 8 + %3 = call i32 (ptr, ...) @printf(ptr @.str, i64 %2) + %4 = load i64, ptr %ef, align 8 + store i64 %4, ptr %x, align 8 + %5 = load i64, ptr %x, align 8 + store i64 %5, ptr %z, align 8 + %6 = load i64, ptr %z, align 8 + %7 = call i32 (ptr, ...) @printf(ptr @.str.7, i64 %6) + store i64 ptrtoint (ptr @"foo_Foo$W" to i64), ptr %x, align 8 + %8 = load i64, ptr %x, align 8 + store i64 %8, ptr %z, align 8 + %9 = load i64, ptr %z, align 8 + %10 = call i32 (ptr, ...) @printf(ptr @.str.8, i64 %9) + store i64 ptrtoint (ptr @"foo_Foo$W1" to i64), ptr %x, align 8 + %11 = load i64, ptr %x, align 8 + store i64 %11, ptr %z, align 8 + %12 = load i64, ptr %z, align 8 + %13 = call i32 (ptr, ...) @printf(ptr @.str.9, i64 %12) + store i64 ptrtoint (ptr @"foo_Foob$X1" to i64), ptr %x, align 8 + %14 = load i64, ptr %x, align 8 + store i64 %14, ptr %z, align 8 + %15 = load i64, ptr %z, align 8 + %16 = call i32 (ptr, ...) @printf(ptr @.str.10, i64 %15) + store i64 ptrtoint (ptr @"foo_Foob$Y2" to i64), ptr %x, align 8 + %17 = load i64, ptr %x, align 8 + store i64 %17, ptr %z, align 8 + %18 = load i64, ptr %z, align 8 + %19 = call i32 (ptr, ...) @printf(ptr @.str.11, i64 %18) + store i32 0, ptr %b, align 4 + store i32 0, ptr %a, align 4 + call void @foo_Foo_hello(ptr %f) + call void @foo_Bar_hello(ptr %b) + call void @foo_MyEnum_hello(ptr %a) ret void } \ No newline at end of file diff --git a/test/test_suite2/errors/illegal_use_of_optional.c3 b/test/test_suite/errors/illegal_use_of_optional.c3 similarity index 100% rename from test/test_suite2/errors/illegal_use_of_optional.c3 rename to test/test_suite/errors/illegal_use_of_optional.c3 diff --git a/test/test_suite/errors/macro_err.c3t b/test/test_suite/errors/macro_err.c3t index 7f89c95f8..0b51381bb 100644 --- a/test/test_suite/errors/macro_err.c3t +++ b/test/test_suite/errors/macro_err.c3t @@ -18,10 +18,10 @@ fn void main() /* #expect: test.ll -define i64 @test_abc(i32* %0) #0 { +define i64 @test_abc(ptr %0) #0 { entry: %reterr = alloca i64, align 8 - store i32 1, i32* %0, align 4 + store i32 1, ptr %0, align 4 ret i64 0 } @@ -30,12 +30,12 @@ define void @test_main() #0 { entry: %error_var = alloca i64, align 8 %retparam = alloca i32, align 4 - %0 = call i64 @test_abc(i32* %retparam) + %0 = call i64 @test_abc(ptr %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, i64* %error_var, align 8 + store i64 %0, ptr %error_var, align 8 br label %guard_block after_check: ; preds = %entry @@ -45,10 +45,10 @@ guard_block: ; preds = %assign_optional ret void noerr_block: ; preds = %after_check - %1 = load i32, i32* %retparam, align 4 + %1 = load i32, ptr %retparam, align 4 br label %phi_block phi_block: ; preds = %noerr_block - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) + %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) ret void } diff --git a/test/test_suite/errors/macro_err2.c3t b/test/test_suite/errors/macro_err2.c3t index d34314250..c86a32432 100644 --- a/test/test_suite/errors/macro_err2.c3t +++ b/test/test_suite/errors/macro_err2.c3t @@ -21,31 +21,31 @@ fn void main() /* #expect: test.ll -define i64 @test_abc(i32* %0) #0 { +define i64 @test_abc(ptr %0) #0 { entry: - ret i64 ptrtoint (%.fault* @"test_Tester$FOO" to i64) + ret i64 ptrtoint (ptr @"test_Tester$FOO" to i64) } define void @test_main() #0 { entry: %blockret = alloca i32, align 4 %retparam = alloca i32, align 4 - %0 = call i64 @test_abc(i32* %retparam) + %0 = call i64 @test_abc(ptr %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %opt_block_cleanup after_check: ; preds = %entry - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) - %2 = load i32, i32* %retparam, align 4 - store i32 %2, i32* %blockret, align 4 + %1 = call i32 (ptr, ...) @printf(ptr @.str.1) + %2 = load i32, ptr %retparam, align 4 + store i32 %2, ptr %blockret, align 4 br label %expr_block.exit opt_block_cleanup: ; preds = %entry - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i32 0, i32 0)) + %3 = call i32 (ptr, ...) @printf(ptr @.str.2) br label %else_block expr_block.exit: ; preds = %after_check - %4 = load i32, i32* %blockret, align 4 + %4 = load i32, ptr %blockret, align 4 br label %phi_block else_block: ; preds = %opt_block_cleanup @@ -53,7 +53,7 @@ else_block: ; preds = %opt_block_cleanup phi_block: ; preds = %else_block, %expr_block.exit %val = phi i32 [ %4, %expr_block.exit ], [ 2, %else_block ] - %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %val) - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i32 0, i32 0)) + %5 = call i32 (ptr, ...) @printf(ptr @.str, i32 %val) + %6 = call i32 (ptr, ...) @printf(ptr @.str.3) ret void -} \ No newline at end of file +} diff --git a/test/test_suite/errors/macro_err3.c3t b/test/test_suite/errors/macro_err3.c3t index 590aebdde..1e743a38e 100644 --- a/test/test_suite/errors/macro_err3.c3t +++ b/test/test_suite/errors/macro_err3.c3t @@ -24,14 +24,14 @@ entry: br label %opt_block_cleanup opt_block_cleanup: ; preds = %entry - %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i32 0, i32 0)) + %0 = call i32 (ptr, ...) @printf(ptr @.str.2) br label %else_block else_block: ; preds = %opt_block_cleanup br label %phi_block phi_block: ; preds = %else_block - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 2) - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i32 0, i32 0)) + %1 = call i32 (ptr, ...) @printf(ptr @.str, i32 2) + %2 = call i32 (ptr, ...) @printf(ptr @.str.3) ret void } diff --git a/test/test_suite/errors/optional_chained_init.c3t b/test/test_suite/errors/optional_chained_init.c3t index cd20b747a..d04e0be32 100644 --- a/test/test_suite/errors/optional_chained_init.c3t +++ b/test/test_suite/errors/optional_chained_init.c3t @@ -8,10 +8,10 @@ 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); + if (catch err = a) io::printfn("A err was: %s", err); + if (catch err = b) io::printfn("B err was: %s", err); + io::printfn("A was: %s", a); + io::printfn("B was: %s", b); } fn void test2() @@ -19,10 +19,10 @@ 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); + if (catch err = a) io::printfn("A err was: %s", err); + if (catch err = b) io::printfn("B err was: %s", err); + io::printfn("A was: %s", a); + io::printfn("B was: %s", b); } @@ -31,10 +31,10 @@ 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); + if (catch err = a) io::printfn("A err was: %s", err); + if (catch err = b) io::printfn("B err was: %s", err); + io::printfn("A was: %s", a); + io::printfn("B was: %s", b); } fn void main() @@ -46,7 +46,6 @@ fn void main() /* #expect: test.ll -; Function Attrs: nounwind define void @test_test1() #0 { entry: %a = alloca i32, align 4 @@ -56,61 +55,47 @@ entry: %err = alloca i64, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %err3 = alloca i64, align 8 %retparam12 = alloca i64, align 8 %varargslots13 = alloca [1 x %variant], align 16 - %taddr14 = alloca %"variant[]", align 8 - %retparam21 = alloca i64, align 8 - %varargslots22 = alloca [1 x %variant], align 16 - %taddr26 = alloca %"variant[]", align 8 - %retparam32 = alloca i64, align 8 - %varargslots33 = alloca [1 x %variant], align 16 - %taddr37 = alloca %"variant[]", align 8 - 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 + %retparam18 = alloca i64, align 8 + %varargslots19 = alloca [1 x %variant], align 16 + %retparam26 = alloca i64, align 8 + %varargslots27 = alloca [1 x %variant], align 16 + store i32 1, ptr %a, align 4 + store i64 0, ptr %a.f, align 8 + store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %a.f, align 8 + store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %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 + %optval = load i64, ptr %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 + store i64 %optval, ptr %err, align 8 br label %end_block after_check: ; preds = %testblock - store i64 0, i64* %err, align 8 + store i64 0, ptr %err, align 8 br label %end_block end_block: ; preds = %after_check, %assign_optional - %0 = load i64, i64* %err, align 8 + %0 = load i64, ptr %err, align 8 %neq = icmp ne i64 %0, 0 br i1 %neq, label %if.then, label %if.exit if.then: ; preds = %end_block - %1 = bitcast i64* %err to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr, align 8 - %8 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) - %not_err1 = icmp eq i64 %11, 0 + %1 = insertvalue %variant undef, ptr %err, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 13, ptr %varargslots, i64 1) + %not_err1 = icmp eq i64 %4, 0 br i1 %not_err1, label %after_check2, label %voiderr after_check2: ; preds = %if.then @@ -123,103 +108,73 @@ if.exit: ; preds = %voiderr, %end_block br label %testblock4 testblock4: ; preds = %if.exit - %optval5 = load i64, i64* %b.f, align 8 + %optval5 = load i64, ptr %b.f, align 8 %not_err6 = icmp eq i64 %optval5, 0 br i1 %not_err6, label %after_check8, label %assign_optional7 assign_optional7: ; preds = %testblock4 - store i64 %optval5, i64* %err3, align 8 + store i64 %optval5, ptr %err3, align 8 br label %end_block9 after_check8: ; preds = %testblock4 - store i64 0, i64* %err3, align 8 + store i64 0, ptr %err3, align 8 br label %end_block9 end_block9: ; preds = %after_check8, %assign_optional7 - %12 = load i64, i64* %err3, align 8 - %neq10 = icmp ne i64 %12, 0 - br i1 %neq10, label %if.then11, label %if.exit20 + %5 = load i64, ptr %err3, align 8 + %neq10 = icmp ne i64 %5, 0 + br i1 %neq10, label %if.then11, label %if.exit17 if.then11: ; preds = %end_block9 - %13 = bitcast i64* %err3 to i8* - %14 = insertvalue %variant undef, i8* %13, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %16 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots13, i64 0, i64 0 - store %variant %15, %variant* %16, align 16 - %17 = bitcast [1 x %variant]* %varargslots13 to %variant* - %18 = insertvalue %"variant[]" undef, %variant* %17, 0 - %19 = insertvalue %"variant[]" %18, i64 1, 1 - store %"variant[]" %19, %"variant[]"* %taddr14, align 8 - %20 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* - %21 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %20, i32 0, i32 0 - %lo15 = load i8*, i8** %21, align 8 - %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %20, i32 0, i32 1 - %hi16 = load i64, i64* %22, align 8 - %23 = call i64 @std_io_printfln(i64* %retparam12, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i64 13, i8* %lo15, i64 %hi16) - %not_err17 = icmp eq i64 %23, 0 - br i1 %not_err17, label %after_check18, label %voiderr19 + %6 = insertvalue %variant undef, ptr %err3, 0 + %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %8 = getelementptr inbounds [1 x %variant], ptr %varargslots13, i64 0, i64 0 + store %variant %7, ptr %8, align 16 + %9 = call i64 @std_io_printfn(ptr %retparam12, ptr @.str.1, i64 13, ptr %varargslots13, i64 1) + %not_err14 = icmp eq i64 %9, 0 + br i1 %not_err14, label %after_check15, label %voiderr16 -after_check18: ; preds = %if.then11 - br label %voiderr19 +after_check15: ; preds = %if.then11 + br label %voiderr16 -voiderr19: ; preds = %after_check18, %if.then11 - br label %if.exit20 +voiderr16: ; preds = %after_check15, %if.then11 + br label %if.exit17 -if.exit20: ; preds = %voiderr19, %end_block9 - %optval23 = load i64, i64* %a.f, align 8 - %not_err24 = icmp eq i64 %optval23, 0 - br i1 %not_err24, label %after_check25, label %voiderr31 +if.exit17: ; preds = %voiderr16, %end_block9 + %optval20 = load i64, ptr %a.f, align 8 + %not_err21 = icmp eq i64 %optval20, 0 + br i1 %not_err21, label %after_check22, label %voiderr25 -after_check25: ; preds = %if.exit20 - %24 = bitcast i32* %a to i8* - %25 = insertvalue %variant undef, i8* %24, 0 - %26 = insertvalue %variant %25, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %27 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots22, i64 0, i64 0 - store %variant %26, %variant* %27, align 16 - %28 = bitcast [1 x %variant]* %varargslots22 to %variant* - %29 = insertvalue %"variant[]" undef, %variant* %28, 0 - %30 = insertvalue %"variant[]" %29, i64 1, 1 - store %"variant[]" %30, %"variant[]"* %taddr26, align 8 - %31 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* - %32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 0 - %lo27 = load i8*, i8** %32, align 8 - %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 1 - %hi28 = load i64, i64* %33, align 8 - %34 = call i64 @std_io_printfln(i64* %retparam21, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i64 9, i8* %lo27, i64 %hi28) - %not_err29 = icmp eq i64 %34, 0 - br i1 %not_err29, label %after_check30, label %voiderr31 +after_check22: ; preds = %if.exit17 + %10 = insertvalue %variant undef, ptr %a, 0 + %11 = insertvalue %variant %10, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %12 = getelementptr inbounds [1 x %variant], ptr %varargslots19, i64 0, i64 0 + store %variant %11, ptr %12, align 16 + %13 = call i64 @std_io_printfn(ptr %retparam18, ptr @.str.2, i64 9, ptr %varargslots19, i64 1) + %not_err23 = icmp eq i64 %13, 0 + br i1 %not_err23, label %after_check24, label %voiderr25 -after_check30: ; preds = %after_check25 - br label %voiderr31 +after_check24: ; preds = %after_check22 + br label %voiderr25 -voiderr31: ; preds = %after_check30, %after_check25, %if.exit20 - %optval34 = load i64, i64* %b.f, align 8 - %not_err35 = icmp eq i64 %optval34, 0 - br i1 %not_err35, label %after_check36, label %voiderr42 +voiderr25: ; preds = %after_check24, %after_check22, %if.exit17 + %optval28 = load i64, ptr %b.f, align 8 + %not_err29 = icmp eq i64 %optval28, 0 + br i1 %not_err29, label %after_check30, label %voiderr33 -after_check36: ; preds = %voiderr31 - %35 = bitcast i32* %b to i8* - %36 = insertvalue %variant undef, i8* %35, 0 - %37 = insertvalue %variant %36, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %38 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots33, i64 0, i64 0 - store %variant %37, %variant* %38, align 16 - %39 = bitcast [1 x %variant]* %varargslots33 to %variant* - %40 = insertvalue %"variant[]" undef, %variant* %39, 0 - %41 = insertvalue %"variant[]" %40, i64 1, 1 - store %"variant[]" %41, %"variant[]"* %taddr37, align 8 - %42 = bitcast %"variant[]"* %taddr37 to { i8*, i64 }* - %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 0 - %lo38 = load i8*, i8** %43, align 8 - %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 1 - %hi39 = load i64, i64* %44, align 8 - %45 = call i64 @std_io_printfln(i64* %retparam32, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i64 9, i8* %lo38, i64 %hi39) - %not_err40 = icmp eq i64 %45, 0 - br i1 %not_err40, label %after_check41, label %voiderr42 +after_check30: ; preds = %voiderr25 + %14 = insertvalue %variant undef, ptr %b, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %16 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0 + store %variant %15, ptr %16, align 16 + %17 = call i64 @std_io_printfn(ptr %retparam26, ptr @.str.3, i64 9, ptr %varargslots27, i64 1) + %not_err31 = icmp eq i64 %17, 0 + br i1 %not_err31, label %after_check32, label %voiderr33 -after_check41: ; preds = %after_check36 - br label %voiderr42 +after_check32: ; preds = %after_check30 + br label %voiderr33 -voiderr42: ; preds = %after_check41, %after_check36, %voiderr31 +voiderr33: ; preds = %after_check32, %after_check30, %voiderr25 ret void } @@ -235,82 +190,68 @@ entry: %err = alloca i64, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %err8 = alloca i64, align 8 %retparam17 = alloca i64, align 8 %varargslots18 = alloca [1 x %variant], align 16 - %taddr19 = alloca %"variant[]", align 8 - %retparam26 = alloca i64, align 8 - %varargslots27 = alloca [1 x %variant], align 16 - %taddr31 = alloca %"variant[]", align 8 - %retparam37 = alloca i64, align 8 - %varargslots38 = alloca [1 x %variant], align 16 - %taddr42 = alloca %"variant[]", align 8 - 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 + %retparam23 = alloca i64, align 8 + %varargslots24 = alloca [1 x %variant], align 16 + %retparam31 = alloca i64, align 8 + %varargslots32 = alloca [1 x %variant], align 16 + store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %x.f, align 8 + store i32 1, ptr %a, align 4 + store i64 0, ptr %a.f, align 8 + %optval = load i64, ptr %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 + store i64 %optval, ptr %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 + %0 = load i32, ptr %x, align 4 + store i32 %0, ptr %a, align 4 + store i64 0, ptr %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 + %reload_err = load i64, ptr %a.f, align 8 + store i64 %reload_err, ptr %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 + store i32 %0, ptr %b, align 4 + store i64 0, ptr %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 + %optval2 = load i64, ptr %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 + store i64 %optval2, ptr %err, align 8 br label %end_block after_check5: ; preds = %testblock - store i64 0, i64* %err, align 8 + store i64 0, ptr %err, align 8 br label %end_block end_block: ; preds = %after_check5, %assign_optional4 - %1 = load i64, i64* %err, align 8 + %1 = load i64, ptr %err, align 8 %neq = icmp ne i64 %1, 0 br i1 %neq, label %if.then, label %if.exit if.then: ; preds = %end_block - %2 = bitcast i64* %err to i8* - %3 = insertvalue %variant undef, i8* %2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %4, %variant* %5, align 16 - %6 = bitcast [1 x %variant]* %varargslots to %variant* - %7 = insertvalue %"variant[]" undef, %variant* %6, 0 - %8 = insertvalue %"variant[]" %7, i64 1, 1 - store %"variant[]" %8, %"variant[]"* %taddr, align 8 - %9 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 - %lo = load i8*, i8** %10, align 8 - %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 - %hi = load i64, i64* %11, align 8 - %12 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) - %not_err6 = icmp eq i64 %12, 0 + %2 = insertvalue %variant undef, ptr %err, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %3, ptr %4, align 16 + %5 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.4, i64 13, ptr %varargslots, i64 1) + %not_err6 = icmp eq i64 %5, 0 br i1 %not_err6, label %after_check7, label %voiderr after_check7: ; preds = %if.then @@ -323,103 +264,73 @@ if.exit: ; preds = %voiderr, %end_block br label %testblock9 testblock9: ; preds = %if.exit - %optval10 = load i64, i64* %b.f, align 8 + %optval10 = load i64, ptr %b.f, align 8 %not_err11 = icmp eq i64 %optval10, 0 br i1 %not_err11, label %after_check13, label %assign_optional12 assign_optional12: ; preds = %testblock9 - store i64 %optval10, i64* %err8, align 8 + store i64 %optval10, ptr %err8, align 8 br label %end_block14 after_check13: ; preds = %testblock9 - store i64 0, i64* %err8, align 8 + store i64 0, ptr %err8, align 8 br label %end_block14 end_block14: ; preds = %after_check13, %assign_optional12 - %13 = load i64, i64* %err8, align 8 - %neq15 = icmp ne i64 %13, 0 - br i1 %neq15, label %if.then16, label %if.exit25 + %6 = load i64, ptr %err8, align 8 + %neq15 = icmp ne i64 %6, 0 + br i1 %neq15, label %if.then16, label %if.exit22 if.then16: ; preds = %end_block14 - %14 = bitcast i64* %err8 to i8* - %15 = insertvalue %variant undef, i8* %14, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots18, i64 0, i64 0 - store %variant %16, %variant* %17, align 16 - %18 = bitcast [1 x %variant]* %varargslots18 to %variant* - %19 = insertvalue %"variant[]" undef, %variant* %18, 0 - %20 = insertvalue %"variant[]" %19, i64 1, 1 - store %"variant[]" %20, %"variant[]"* %taddr19, align 8 - %21 = bitcast %"variant[]"* %taddr19 to { i8*, i64 }* - %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 - %lo20 = load i8*, i8** %22, align 8 - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 - %hi21 = load i64, i64* %23, align 8 - %24 = call i64 @std_io_printfln(i64* %retparam17, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i32 0, i32 0), i64 13, i8* %lo20, i64 %hi21) - %not_err22 = icmp eq i64 %24, 0 - br i1 %not_err22, label %after_check23, label %voiderr24 + %7 = insertvalue %variant undef, ptr %err8, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %9 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 + store %variant %8, ptr %9, align 16 + %10 = call i64 @std_io_printfn(ptr %retparam17, ptr @.str.5, i64 13, ptr %varargslots18, i64 1) + %not_err19 = icmp eq i64 %10, 0 + br i1 %not_err19, label %after_check20, label %voiderr21 -after_check23: ; preds = %if.then16 - br label %voiderr24 +after_check20: ; preds = %if.then16 + br label %voiderr21 -voiderr24: ; preds = %after_check23, %if.then16 - br label %if.exit25 +voiderr21: ; preds = %after_check20, %if.then16 + br label %if.exit22 -if.exit25: ; preds = %voiderr24, %end_block14 - %optval28 = load i64, i64* %a.f, align 8 - %not_err29 = icmp eq i64 %optval28, 0 - br i1 %not_err29, label %after_check30, label %voiderr36 +if.exit22: ; preds = %voiderr21, %end_block14 + %optval25 = load i64, ptr %a.f, align 8 + %not_err26 = icmp eq i64 %optval25, 0 + br i1 %not_err26, label %after_check27, label %voiderr30 -after_check30: ; preds = %if.exit25 - %25 = bitcast i32* %a to i8* - %26 = insertvalue %variant undef, i8* %25, 0 - %27 = insertvalue %variant %26, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %28 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots27, i64 0, i64 0 - store %variant %27, %variant* %28, align 16 - %29 = bitcast [1 x %variant]* %varargslots27 to %variant* - %30 = insertvalue %"variant[]" undef, %variant* %29, 0 - %31 = insertvalue %"variant[]" %30, i64 1, 1 - store %"variant[]" %31, %"variant[]"* %taddr31, align 8 - %32 = bitcast %"variant[]"* %taddr31 to { i8*, i64 }* - %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 0 - %lo32 = load i8*, i8** %33, align 8 - %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 1 - %hi33 = load i64, i64* %34, align 8 - %35 = call i64 @std_io_printfln(i64* %retparam26, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i64 9, i8* %lo32, i64 %hi33) - %not_err34 = icmp eq i64 %35, 0 - br i1 %not_err34, label %after_check35, label %voiderr36 +after_check27: ; preds = %if.exit22 + %11 = insertvalue %variant undef, ptr %a, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %13 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 + store %variant %12, ptr %13, align 16 + %14 = call i64 @std_io_printfn(ptr %retparam23, ptr @.str.6, i64 9, ptr %varargslots24, i64 1) + %not_err28 = icmp eq i64 %14, 0 + br i1 %not_err28, label %after_check29, label %voiderr30 -after_check35: ; preds = %after_check30 - br label %voiderr36 +after_check29: ; preds = %after_check27 + br label %voiderr30 -voiderr36: ; preds = %after_check35, %after_check30, %if.exit25 - %optval39 = load i64, i64* %b.f, align 8 - %not_err40 = icmp eq i64 %optval39, 0 - br i1 %not_err40, label %after_check41, label %voiderr47 +voiderr30: ; preds = %after_check29, %after_check27, %if.exit22 + %optval33 = load i64, ptr %b.f, align 8 + %not_err34 = icmp eq i64 %optval33, 0 + br i1 %not_err34, label %after_check35, label %voiderr38 -after_check41: ; preds = %voiderr36 - %36 = bitcast i32* %b to i8* - %37 = insertvalue %variant undef, i8* %36, 0 - %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %39 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots38, i64 0, i64 0 - store %variant %38, %variant* %39, align 16 - %40 = bitcast [1 x %variant]* %varargslots38 to %variant* - %41 = insertvalue %"variant[]" undef, %variant* %40, 0 - %42 = insertvalue %"variant[]" %41, i64 1, 1 - store %"variant[]" %42, %"variant[]"* %taddr42, align 8 - %43 = bitcast %"variant[]"* %taddr42 to { i8*, i64 }* - %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0 - %lo43 = load i8*, i8** %44, align 8 - %45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1 - %hi44 = load i64, i64* %45, align 8 - %46 = call i64 @std_io_printfln(i64* %retparam37, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.7, i32 0, i32 0), i64 9, i8* %lo43, i64 %hi44) - %not_err45 = icmp eq i64 %46, 0 - br i1 %not_err45, label %after_check46, label %voiderr47 +after_check35: ; preds = %voiderr30 + %15 = insertvalue %variant undef, ptr %b, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %17 = getelementptr inbounds [1 x %variant], ptr %varargslots32, i64 0, i64 0 + store %variant %16, ptr %17, align 16 + %18 = call i64 @std_io_printfn(ptr %retparam31, ptr @.str.7, i64 9, ptr %varargslots32, i64 1) + %not_err36 = icmp eq i64 %18, 0 + br i1 %not_err36, label %after_check37, label %voiderr38 -after_check46: ; preds = %after_check41 - br label %voiderr47 +after_check37: ; preds = %after_check35 + br label %voiderr38 -voiderr47: ; preds = %after_check46, %after_check41, %voiderr36 +voiderr38: ; preds = %after_check37, %after_check35, %voiderr30 ret void } @@ -435,83 +346,69 @@ entry: %err = alloca i64, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %err8 = alloca i64, align 8 %retparam17 = alloca i64, align 8 %varargslots18 = alloca [1 x %variant], align 16 - %taddr19 = alloca %"variant[]", align 8 - %retparam26 = alloca i64, align 8 - %varargslots27 = alloca [1 x %variant], align 16 - %taddr31 = alloca %"variant[]", align 8 - %retparam37 = alloca i64, align 8 - %varargslots38 = alloca [1 x %variant], align 16 - %taddr42 = alloca %"variant[]", align 8 - 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 + %retparam23 = alloca i64, align 8 + %varargslots24 = alloca [1 x %variant], align 16 + %retparam31 = alloca i64, align 8 + %varargslots32 = alloca [1 x %variant], align 16 + store i32 23, ptr %x, align 4 + store i64 0, ptr %x.f, align 8 + store i32 1, ptr %a, align 4 + store i64 0, ptr %a.f, align 8 + %optval = load i64, ptr %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 + store i64 %optval, ptr %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 + %0 = load i32, ptr %x, align 4 + store i32 %0, ptr %a, align 4 + store i64 0, ptr %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 + %reload_err = load i64, ptr %a.f, align 8 + store i64 %reload_err, ptr %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 + store i32 %0, ptr %b, align 4 + store i64 0, ptr %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 + %optval2 = load i64, ptr %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 + store i64 %optval2, ptr %err, align 8 br label %end_block after_check5: ; preds = %testblock - store i64 0, i64* %err, align 8 + store i64 0, ptr %err, align 8 br label %end_block end_block: ; preds = %after_check5, %assign_optional4 - %1 = load i64, i64* %err, align 8 + %1 = load i64, ptr %err, align 8 %neq = icmp ne i64 %1, 0 br i1 %neq, label %if.then, label %if.exit if.then: ; preds = %end_block - %2 = bitcast i64* %err to i8* - %3 = insertvalue %variant undef, i8* %2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %4, %variant* %5, align 16 - %6 = bitcast [1 x %variant]* %varargslots to %variant* - %7 = insertvalue %"variant[]" undef, %variant* %6, 0 - %8 = insertvalue %"variant[]" %7, i64 1, 1 - store %"variant[]" %8, %"variant[]"* %taddr, align 8 - %9 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 - %lo = load i8*, i8** %10, align 8 - %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 - %hi = load i64, i64* %11, align 8 - %12 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.8, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) - %not_err6 = icmp eq i64 %12, 0 + %2 = insertvalue %variant undef, ptr %err, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %3, ptr %4, align 16 + %5 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.8, i64 13, ptr %varargslots, i64 1) + %not_err6 = icmp eq i64 %5, 0 br i1 %not_err6, label %after_check7, label %voiderr after_check7: ; preds = %if.then @@ -524,102 +421,72 @@ if.exit: ; preds = %voiderr, %end_block br label %testblock9 testblock9: ; preds = %if.exit - %optval10 = load i64, i64* %b.f, align 8 + %optval10 = load i64, ptr %b.f, align 8 %not_err11 = icmp eq i64 %optval10, 0 br i1 %not_err11, label %after_check13, label %assign_optional12 assign_optional12: ; preds = %testblock9 - store i64 %optval10, i64* %err8, align 8 + store i64 %optval10, ptr %err8, align 8 br label %end_block14 after_check13: ; preds = %testblock9 - store i64 0, i64* %err8, align 8 + store i64 0, ptr %err8, align 8 br label %end_block14 end_block14: ; preds = %after_check13, %assign_optional12 - %13 = load i64, i64* %err8, align 8 - %neq15 = icmp ne i64 %13, 0 - br i1 %neq15, label %if.then16, label %if.exit25 + %6 = load i64, ptr %err8, align 8 + %neq15 = icmp ne i64 %6, 0 + br i1 %neq15, label %if.then16, label %if.exit22 if.then16: ; preds = %end_block14 - %14 = bitcast i64* %err8 to i8* - %15 = insertvalue %variant undef, i8* %14, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots18, i64 0, i64 0 - store %variant %16, %variant* %17, align 16 - %18 = bitcast [1 x %variant]* %varargslots18 to %variant* - %19 = insertvalue %"variant[]" undef, %variant* %18, 0 - %20 = insertvalue %"variant[]" %19, i64 1, 1 - store %"variant[]" %20, %"variant[]"* %taddr19, align 8 - %21 = bitcast %"variant[]"* %taddr19 to { i8*, i64 }* - %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 - %lo20 = load i8*, i8** %22, align 8 - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 - %hi21 = load i64, i64* %23, align 8 - %24 = call i64 @std_io_printfln(i64* %retparam17, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.9, i32 0, i32 0), i64 13, i8* %lo20, i64 %hi21) - %not_err22 = icmp eq i64 %24, 0 - br i1 %not_err22, label %after_check23, label %voiderr24 + %7 = insertvalue %variant undef, ptr %err8, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %9 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 + store %variant %8, ptr %9, align 16 + %10 = call i64 @std_io_printfn(ptr %retparam17, ptr @.str.9, i64 13, ptr %varargslots18, i64 1) + %not_err19 = icmp eq i64 %10, 0 + br i1 %not_err19, label %after_check20, label %voiderr21 -after_check23: ; preds = %if.then16 - br label %voiderr24 +after_check20: ; preds = %if.then16 + br label %voiderr21 -voiderr24: ; preds = %after_check23, %if.then16 - br label %if.exit25 +voiderr21: ; preds = %after_check20, %if.then16 + br label %if.exit22 -if.exit25: ; preds = %voiderr24, %end_block14 - %optval28 = load i64, i64* %a.f, align 8 - %not_err29 = icmp eq i64 %optval28, 0 - br i1 %not_err29, label %after_check30, label %voiderr36 +if.exit22: ; preds = %voiderr21, %end_block14 + %optval25 = load i64, ptr %a.f, align 8 + %not_err26 = icmp eq i64 %optval25, 0 + br i1 %not_err26, label %after_check27, label %voiderr30 -after_check30: ; preds = %if.exit25 - %25 = bitcast i32* %a to i8* - %26 = insertvalue %variant undef, i8* %25, 0 - %27 = insertvalue %variant %26, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %28 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots27, i64 0, i64 0 - store %variant %27, %variant* %28, align 16 - %29 = bitcast [1 x %variant]* %varargslots27 to %variant* - %30 = insertvalue %"variant[]" undef, %variant* %29, 0 - %31 = insertvalue %"variant[]" %30, i64 1, 1 - store %"variant[]" %31, %"variant[]"* %taddr31, align 8 - %32 = bitcast %"variant[]"* %taddr31 to { i8*, i64 }* - %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 0 - %lo32 = load i8*, i8** %33, align 8 - %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 1 - %hi33 = load i64, i64* %34, align 8 - %35 = call i64 @std_io_printfln(i64* %retparam26, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i32 0, i32 0), i64 9, i8* %lo32, i64 %hi33) - %not_err34 = icmp eq i64 %35, 0 - br i1 %not_err34, label %after_check35, label %voiderr36 +after_check27: ; preds = %if.exit22 + %11 = insertvalue %variant undef, ptr %a, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %13 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 + store %variant %12, ptr %13, align 16 + %14 = call i64 @std_io_printfn(ptr %retparam23, ptr @.str.10, i64 9, ptr %varargslots24, i64 1) + %not_err28 = icmp eq i64 %14, 0 + br i1 %not_err28, label %after_check29, label %voiderr30 -after_check35: ; preds = %after_check30 - br label %voiderr36 +after_check29: ; preds = %after_check27 + br label %voiderr30 -voiderr36: ; preds = %after_check35, %after_check30, %if.exit25 - %optval39 = load i64, i64* %b.f, align 8 - %not_err40 = icmp eq i64 %optval39, 0 - br i1 %not_err40, label %after_check41, label %voiderr47 +voiderr30: ; preds = %after_check29, %after_check27, %if.exit22 + %optval33 = load i64, ptr %b.f, align 8 + %not_err34 = icmp eq i64 %optval33, 0 + br i1 %not_err34, label %after_check35, label %voiderr38 -after_check41: ; preds = %voiderr36 - %36 = bitcast i32* %b to i8* - %37 = insertvalue %variant undef, i8* %36, 0 - %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %39 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots38, i64 0, i64 0 - store %variant %38, %variant* %39, align 16 - %40 = bitcast [1 x %variant]* %varargslots38 to %variant* - %41 = insertvalue %"variant[]" undef, %variant* %40, 0 - %42 = insertvalue %"variant[]" %41, i64 1, 1 - store %"variant[]" %42, %"variant[]"* %taddr42, align 8 - %43 = bitcast %"variant[]"* %taddr42 to { i8*, i64 }* - %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0 - %lo43 = load i8*, i8** %44, align 8 - %45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1 - %hi44 = load i64, i64* %45, align 8 - %46 = call i64 @std_io_printfln(i64* %retparam37, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0), i64 9, i8* %lo43, i64 %hi44) - %not_err45 = icmp eq i64 %46, 0 - br i1 %not_err45, label %after_check46, label %voiderr47 +after_check35: ; preds = %voiderr30 + %15 = insertvalue %variant undef, ptr %b, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %17 = getelementptr inbounds [1 x %variant], ptr %varargslots32, i64 0, i64 0 + store %variant %16, ptr %17, align 16 + %18 = call i64 @std_io_printfn(ptr %retparam31, ptr @.str.11, i64 9, ptr %varargslots32, i64 1) + %not_err36 = icmp eq i64 %18, 0 + br i1 %not_err36, label %after_check37, label %voiderr38 -after_check46: ; preds = %after_check41 - br label %voiderr47 +after_check37: ; preds = %after_check35 + br label %voiderr38 -voiderr47: ; preds = %after_check46, %after_check41, %voiderr36 +voiderr38: ; preds = %after_check37, %after_check35, %voiderr30 ret void -} \ No newline at end of file +} diff --git a/test/test_suite/errors/optional_inits.c3t b/test/test_suite/errors/optional_inits.c3t index 4fe593f6c..e21850667 100644 --- a/test/test_suite/errors/optional_inits.c3t +++ b/test/test_suite/errors/optional_inits.c3t @@ -40,30 +40,27 @@ entry: %y = alloca %Bar, align 4 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i64 ptrtoint (%.fault* @"test_Foo$MY_VAL1" to i64), i64* %x.f, align 8 - %optval = load i64, i64* %x.f, align 8 + store i64 ptrtoint (ptr @"test_Foo$MY_VAL1" to i64), ptr %x.f, align 8 + %optval = load i64, ptr %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* %error_var, align 8 + store i64 %optval, ptr %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, i64* %error_var, align 8 + %0 = load i64, ptr %error_var, align 8 ret i64 %0 noerr_block: ; preds = %after_check - %1 = bitcast %Bar* %y to i8* - %2 = bitcast %Bar* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 %x, i32 4, i1 false) ret i64 0 } -; Function Attrs: nounwind define i64 @test_test2() #0 { entry: %x = alloca %Bar, align 4 @@ -71,28 +68,25 @@ entry: %y = alloca %Bar, align 4 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - %0 = bitcast %Bar* %x to i32* - store i32 0, i32* %0, align 4 - store i64 0, i64* %x.f, align 8 - %optval = load i64, i64* %x.f, align 8 + store i32 0, ptr %x, align 4 + store i64 0, ptr %x.f, align 8 + %optval = load i64, ptr %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* %error_var, align 8 + store i64 %optval, ptr %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %1 = load i64, i64* %error_var, align 8 - ret i64 %1 + %0 = load i64, ptr %error_var, align 8 + ret i64 %0 noerr_block: ; preds = %after_check - %2 = bitcast %Bar* %y to i8* - %3 = bitcast %Bar* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 %3, i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 %x, i32 4, i1 false) ret i64 0 } diff --git a/test/test_suite/errors/optional_taddr_and_access.c3t b/test/test_suite/errors/optional_taddr_and_access.c3t index b50d016a4..e3ccb5135 100644 --- a/test/test_suite/errors/optional_taddr_and_access.c3t +++ b/test/test_suite/errors/optional_taddr_and_access.c3t @@ -28,92 +28,91 @@ fn void main() %Foo = type { i32, i32 } @"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"test_MyErr$FOO" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$test_MyErr" to i64), %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.fault, i64 0, i64 0), i64 3 } }, align 8 -@.fault = internal constant [4 x i8] c"FOO\00", align 1 +@"test_MyErr$FOO" = linkonce constant %.fault { i64 ptrtoint (ptr @"ct$test_MyErr" to i64), %"char[]" { ptr @.fault, i64 3 } }, align 8 @"ct$test_MyErr" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @.str.1 = private unnamed_addr constant [17 x i8] c"Not visible: %d\0A\00", align 1 ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind define void @test_main() #0 { entry: %z = alloca i32, align 4 %z.f = alloca i64, align 8 - %w = alloca %Foo*, align 8 + %w = alloca ptr, align 8 %w.f = alloca i64, align 8 %literal = alloca %Foo, align 4 %literal6 = alloca %Foo, align 4 - store i32 2, i32* %z, align 4 - store i64 0, i64* %z.f, align 8 - %0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 - %optval = load i64, i64* %z.f, align 8 + store i32 2, ptr %z, align 4 + store i64 0, ptr %z.f, align 8 + %0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 + %optval = load i64, ptr %z.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* %w.f, align 8 + store i64 %optval, ptr %w.f, align 8 br label %after_assign after_check: ; preds = %entry - %1 = load i32, i32* %z, align 4 - store i32 %1, i32* %0, align 4 - %2 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 - store i32 0, i32* %2, align 4 - store %Foo* %literal, %Foo** %w, align 8 - store i64 0, i64* %w.f, align 8 + %1 = load i32, ptr %z, align 4 + store i32 %1, ptr %0, align 4 + %2 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 + store i32 0, ptr %2, align 4 + store ptr %literal, ptr %w, align 8 + store i64 0, ptr %w.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %optval1 = load i64, i64* %w.f, align 8 + %optval1 = load i64, ptr %w.f, align 8 %not_err2 = icmp eq i64 %optval1, 0 br i1 %not_err2, label %after_check3, label %voiderr after_check3: ; preds = %after_assign - %3 = load %Foo*, %Foo** %w, align 8 - %4 = getelementptr inbounds %Foo, %Foo* %3, i32 0, i32 0 - %5 = load i32, i32* %4, align 8 - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %5) + %3 = load ptr, ptr %w, align 8 + %4 = getelementptr inbounds %Foo, ptr %3, i32 0, i32 0 + %5 = load i32, ptr %4, align 8 + %6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %5) br label %voiderr voiderr: ; preds = %after_check3, %after_assign - store i64 ptrtoint (%.fault* @"test_MyErr$FOO" to i64), i64* %z.f, align 8 + store i64 ptrtoint (ptr @"test_MyErr$FOO" to i64), ptr %z.f, align 8 br label %voiderr5 voiderr5: ; preds = %voiderr - %7 = getelementptr inbounds %Foo, %Foo* %literal6, i32 0, i32 0 - %optval7 = load i64, i64* %z.f, align 8 + %7 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 0 + %optval7 = load i64, ptr %z.f, align 8 %not_err8 = icmp eq i64 %optval7, 0 br i1 %not_err8, label %after_check10, label %assign_optional9 assign_optional9: ; preds = %voiderr5 - store i64 %optval7, i64* %w.f, align 8 + store i64 %optval7, ptr %w.f, align 8 br label %after_assign11 after_check10: ; preds = %voiderr5 - %8 = load i32, i32* %z, align 4 - store i32 %8, i32* %7, align 4 - %9 = getelementptr inbounds %Foo, %Foo* %literal6, i32 0, i32 1 - store i32 0, i32* %9, align 4 - store %Foo* %literal6, %Foo** %w, align 8 - store i64 0, i64* %w.f, align 8 + %8 = load i32, ptr %z, align 4 + store i32 %8, ptr %7, align 4 + %9 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 1 + store i32 0, ptr %9, align 4 + store ptr %literal6, ptr %w, align 8 + store i64 0, ptr %w.f, align 8 br label %after_assign11 after_assign11: ; preds = %after_check10, %assign_optional9 br label %voiderr12 voiderr12: ; preds = %after_assign11 - %optval13 = load i64, i64* %w.f, align 8 + %optval13 = load i64, ptr %w.f, align 8 %not_err14 = icmp eq i64 %optval13, 0 br i1 %not_err14, label %after_check15, label %voiderr16 after_check15: ; preds = %voiderr12 - %10 = load %Foo*, %Foo** %w, align 8 - %11 = getelementptr inbounds %Foo, %Foo* %10, i32 0, i32 0 - %12 = load i32, i32* %11, align 8 - %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %12) + %10 = load ptr, ptr %w, align 8 + %11 = getelementptr inbounds %Foo, ptr %10, i32 0, i32 0 + %12 = load i32, ptr %11, align 8 + %13 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %12) br label %voiderr16 voiderr16: ; preds = %after_check15, %voiderr12 diff --git a/test/test_suite/errors/optional_with_optional.c3t b/test/test_suite/errors/optional_with_optional.c3t index cca90482e..dcde87ce0 100644 --- a/test/test_suite/errors/optional_with_optional.c3t +++ b/test/test_suite/errors/optional_with_optional.c3t @@ -6,15 +6,15 @@ fault Foo { ABC, DEF } fn void main() { - io::printfln("1:%d", get_a(1) ?? get_b(4) ?? -1); - io::printfln("2:%d", get_a(2) ?? get_b(4) ?? -1); - io::printfln("3:%d", get_a(1) ?? get_b(5) ?? -1); - io::printfln("4:%s", catch(Foo.ABC! ?? Foo.DEF!)); - io::printfln("5:%s", Foo.ABC! ?? 3); - io::printfln("6:%s", catch((3 > 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); - io::printfln("7:%s", catch((3 < 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); + io::printfn("1:%d", get_a(1) ?? get_b(4) ?? -1); + io::printfn("2:%d", get_a(2) ?? get_b(4) ?? -1); + io::printfn("3:%d", get_a(1) ?? get_b(5) ?? -1); + io::printfn("4:%s", catch(Foo.ABC! ?? Foo.DEF!)); + io::printfn("5:%s", Foo.ABC! ?? 3); + io::printfn("6:%s", catch((3 > 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); + io::printfn("7:%s", catch((3 < 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); long x = Foo.DEF! ?? 3; - io::printfln("8:%s", x); + io::printfn("8:%s", x); int! xy = Foo.ABC! ?? Foo.DEF!; } @@ -32,7 +32,6 @@ fn int! get_b(int x) /* #expect: test.ll - define void @test_main() #0 { entry: %retparam = alloca i64, align 8 @@ -40,56 +39,48 @@ entry: %retparam1 = alloca i32, align 4 %retparam2 = alloca i32, align 4 %taddr = alloca i32, align 4 - %taddr8 = alloca %"variant[]", align 8 - %retparam11 = alloca i64, align 8 - %varargslots12 = alloca [1 x %variant], align 16 - %retparam13 = alloca i32, align 4 - %retparam17 = alloca i32, align 4 - %taddr25 = alloca i32, align 4 - %taddr26 = alloca %"variant[]", align 8 - %retparam32 = alloca i64, align 8 - %varargslots33 = alloca [1 x %variant], align 16 + %retparam10 = alloca i64, align 8 + %varargslots11 = alloca [1 x %variant], align 16 + %retparam12 = alloca i32, align 4 + %retparam16 = alloca i32, align 4 + %taddr24 = alloca i32, align 4 + %retparam28 = alloca i64, align 8 + %varargslots29 = alloca [1 x %variant], align 16 + %retparam30 = alloca i32, align 4 %retparam34 = alloca i32, align 4 - %retparam38 = alloca i32, align 4 - %taddr46 = alloca i32, align 4 - %taddr47 = alloca %"variant[]", align 8 - %retparam53 = alloca i64, align 8 - %varargslots54 = alloca [1 x %variant], align 16 - %taddr55 = alloca i64, align 8 - %taddr56 = alloca %"variant[]", align 8 - %retparam62 = alloca i64, align 8 - %varargslots63 = alloca [1 x %variant], align 16 - %taddr64 = alloca i32, align 4 - %taddr65 = alloca %"variant[]", align 8 + %taddr42 = alloca i32, align 4 + %retparam46 = alloca i64, align 8 + %varargslots47 = alloca [1 x %variant], align 16 + %taddr48 = alloca i64, align 8 + %retparam52 = alloca i64, align 8 + %varargslots53 = alloca [1 x %variant], align 16 + %taddr54 = alloca i32, align 4 + %retparam58 = alloca i64, align 8 + %varargslots59 = alloca [1 x %variant], align 16 + %taddr60 = alloca i64, align 8 + %retparam64 = alloca i64, align 8 + %varargslots65 = alloca [1 x %variant], align 16 + %error_var = alloca i64, align 8 + %x = alloca i64, align 8 %retparam71 = alloca i64, align 8 %varargslots72 = alloca [1 x %variant], align 16 - %taddr73 = alloca i64, align 8 - %taddr74 = alloca %"variant[]", align 8 - %retparam80 = alloca i64, align 8 - %varargslots81 = alloca [1 x %variant], align 16 - %error_var = alloca i64, align 8 - %taddr84 = alloca %"variant[]", align 8 - %x = alloca i64, align 8 - %retparam90 = alloca i64, align 8 - %varargslots91 = alloca [1 x %variant], align 16 - %taddr92 = alloca %"variant[]", align 8 %xy = alloca i32, align 4 %xy.f = alloca i64, align 8 - %0 = call i64 @test_get_a(i32* %retparam1, i32 1) + %0 = call i64 @test_get_a(ptr %retparam1, i32 1) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %1 = load i32, i32* %retparam1, align 4 + %1 = load i32, ptr %retparam1, align 4 br label %phi_block else_block: ; preds = %entry - %2 = call i64 @test_get_b(i32* %retparam2, i32 4) + %2 = call i64 @test_get_b(ptr %retparam2, i32 4) %not_err3 = icmp eq i64 %2, 0 br i1 %not_err3, label %after_check4, label %else_block5 after_check4: ; preds = %else_block - %3 = load i32, i32* %retparam2, align 4 + %3 = load i32, ptr %retparam2, align 4 br label %phi_block phi_block: ; preds = %after_check4, %after_check @@ -101,254 +92,174 @@ else_block5: ; preds = %else_block phi_block6: ; preds = %else_block5, %phi_block %val7 = phi i32 [ %val, %phi_block ], [ -1, %else_block5 ] - store i32 %val7, i32* %taddr, align 4 - %4 = bitcast i32* %taddr to i8* - %5 = insertvalue %variant undef, i8* %4, 0 - %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$int" 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 = bitcast [1 x %variant]* %varargslots to %variant* - %9 = insertvalue %"variant[]" undef, %variant* %8, 0 - %10 = insertvalue %"variant[]" %9, i64 1, 1 - store %"variant[]" %10, %"variant[]"* %taddr8, align 8 - %11 = bitcast %"variant[]"* %taddr8 to { i8*, i64 }* - %12 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %11, i32 0, i32 0 - %lo = load i8*, i8** %12, align 8 - %13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %11, i32 0, i32 1 - %hi = load i64, i64* %13, align 8 - %14 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 4, i8* %lo, i64 %hi) - %not_err9 = icmp eq i64 %14, 0 - br i1 %not_err9, label %after_check10, label %voiderr + store i32 %val7, ptr %taddr, align 4 + %4 = insertvalue %variant undef, ptr %taddr, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %6 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %5, ptr %6, align 16 + %7 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 4, ptr %varargslots, i64 1) + %not_err8 = icmp eq i64 %7, 0 + br i1 %not_err8, label %after_check9, label %voiderr -after_check10: ; preds = %phi_block6 +after_check9: ; preds = %phi_block6 br label %voiderr -voiderr: ; preds = %after_check10, %phi_block6 - %15 = call i64 @test_get_a(i32* %retparam13, i32 2) - %not_err14 = icmp eq i64 %15, 0 - br i1 %not_err14, label %after_check15, label %else_block16 +voiderr: ; preds = %after_check9, %phi_block6 + %8 = call i64 @test_get_a(ptr %retparam12, i32 2) + %not_err13 = icmp eq i64 %8, 0 + br i1 %not_err13, label %after_check14, label %else_block15 -after_check15: ; preds = %voiderr - %16 = load i32, i32* %retparam13, align 4 - br label %phi_block20 +after_check14: ; preds = %voiderr + %9 = load i32, ptr %retparam12, align 4 + br label %phi_block19 -else_block16: ; preds = %voiderr - %17 = call i64 @test_get_b(i32* %retparam17, i32 4) - %not_err18 = icmp eq i64 %17, 0 - br i1 %not_err18, label %after_check19, label %else_block22 +else_block15: ; preds = %voiderr + %10 = call i64 @test_get_b(ptr %retparam16, i32 4) + %not_err17 = icmp eq i64 %10, 0 + br i1 %not_err17, label %after_check18, label %else_block21 -after_check19: ; preds = %else_block16 - %18 = load i32, i32* %retparam17, align 4 - br label %phi_block20 +after_check18: ; preds = %else_block15 + %11 = load i32, ptr %retparam16, align 4 + br label %phi_block19 -phi_block20: ; preds = %after_check19, %after_check15 - %val21 = phi i32 [ %16, %after_check15 ], [ %18, %after_check19 ] - br label %phi_block23 +phi_block19: ; preds = %after_check18, %after_check14 + %val20 = phi i32 [ %9, %after_check14 ], [ %11, %after_check18 ] + br label %phi_block22 -else_block22: ; preds = %else_block16 - br label %phi_block23 +else_block21: ; preds = %else_block15 + br label %phi_block22 -phi_block23: ; preds = %else_block22, %phi_block20 - %val24 = phi i32 [ %val21, %phi_block20 ], [ -1, %else_block22 ] - store i32 %val24, i32* %taddr25, align 4 - %19 = bitcast i32* %taddr25 to i8* - %20 = insertvalue %variant undef, i8* %19, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %22 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 - store %variant %21, %variant* %22, align 16 - %23 = bitcast [1 x %variant]* %varargslots12 to %variant* - %24 = insertvalue %"variant[]" undef, %variant* %23, 0 - %25 = insertvalue %"variant[]" %24, i64 1, 1 - store %"variant[]" %25, %"variant[]"* %taddr26, align 8 - %26 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* - %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0 - %lo27 = load i8*, i8** %27, align 8 - %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1 - %hi28 = load i64, i64* %28, align 8 - %29 = call i64 @std_io_printfln(i64* %retparam11, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i64 4, i8* %lo27, i64 %hi28) - %not_err29 = icmp eq i64 %29, 0 - br i1 %not_err29, label %after_check30, label %voiderr31 +phi_block22: ; preds = %else_block21, %phi_block19 + %val23 = phi i32 [ %val20, %phi_block19 ], [ -1, %else_block21 ] + store i32 %val23, ptr %taddr24, align 4 + %12 = insertvalue %variant undef, ptr %taddr24, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %14 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 + store %variant %13, ptr %14, align 16 + %15 = call i64 @std_io_printfn(ptr %retparam10, ptr @.str.2, i64 4, ptr %varargslots11, i64 1) + %not_err25 = icmp eq i64 %15, 0 + br i1 %not_err25, label %after_check26, label %voiderr27 -after_check30: ; preds = %phi_block23 - br label %voiderr31 +after_check26: ; preds = %phi_block22 + br label %voiderr27 -voiderr31: ; preds = %after_check30, %phi_block23 - %30 = call i64 @test_get_a(i32* %retparam34, i32 1) - %not_err35 = icmp eq i64 %30, 0 - br i1 %not_err35, label %after_check36, label %else_block37 +voiderr27: ; preds = %after_check26, %phi_block22 + %16 = call i64 @test_get_a(ptr %retparam30, i32 1) + %not_err31 = icmp eq i64 %16, 0 + br i1 %not_err31, label %after_check32, label %else_block33 -after_check36: ; preds = %voiderr31 - %31 = load i32, i32* %retparam34, align 4 - br label %phi_block41 +after_check32: ; preds = %voiderr27 + %17 = load i32, ptr %retparam30, align 4 + br label %phi_block37 -else_block37: ; preds = %voiderr31 - %32 = call i64 @test_get_b(i32* %retparam38, i32 5) - %not_err39 = icmp eq i64 %32, 0 - br i1 %not_err39, label %after_check40, label %else_block43 +else_block33: ; preds = %voiderr27 + %18 = call i64 @test_get_b(ptr %retparam34, i32 5) + %not_err35 = icmp eq i64 %18, 0 + br i1 %not_err35, label %after_check36, label %else_block39 -after_check40: ; preds = %else_block37 - %33 = load i32, i32* %retparam38, align 4 - br label %phi_block41 +after_check36: ; preds = %else_block33 + %19 = load i32, ptr %retparam34, align 4 + br label %phi_block37 -phi_block41: ; preds = %after_check40, %after_check36 - %val42 = phi i32 [ %31, %after_check36 ], [ %33, %after_check40 ] - br label %phi_block44 +phi_block37: ; preds = %after_check36, %after_check32 + %val38 = phi i32 [ %17, %after_check32 ], [ %19, %after_check36 ] + br label %phi_block40 -else_block43: ; preds = %else_block37 - br label %phi_block44 +else_block39: ; preds = %else_block33 + br label %phi_block40 -phi_block44: ; preds = %else_block43, %phi_block41 - %val45 = phi i32 [ %val42, %phi_block41 ], [ -1, %else_block43 ] - store i32 %val45, i32* %taddr46, align 4 - %34 = bitcast i32* %taddr46 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]* %varargslots33, i64 0, i64 0 - store %variant %36, %variant* %37, align 16 - %38 = bitcast [1 x %variant]* %varargslots33 to %variant* - %39 = insertvalue %"variant[]" undef, %variant* %38, 0 - %40 = insertvalue %"variant[]" %39, i64 1, 1 - store %"variant[]" %40, %"variant[]"* %taddr47, align 8 - %41 = bitcast %"variant[]"* %taddr47 to { i8*, i64 }* - %42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0 - %lo48 = load i8*, i8** %42, align 8 - %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1 - %hi49 = load i64, i64* %43, align 8 - %44 = call i64 @std_io_printfln(i64* %retparam32, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i32 0, i32 0), i64 4, i8* %lo48, i64 %hi49) - %not_err50 = icmp eq i64 %44, 0 - br i1 %not_err50, label %after_check51, label %voiderr52 +phi_block40: ; preds = %else_block39, %phi_block37 + %val41 = phi i32 [ %val38, %phi_block37 ], [ -1, %else_block39 ] + store i32 %val41, ptr %taddr42, align 4 + %20 = insertvalue %variant undef, ptr %taddr42, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %22 = getelementptr inbounds [1 x %variant], ptr %varargslots29, i64 0, i64 0 + store %variant %21, ptr %22, align 16 + %23 = call i64 @std_io_printfn(ptr %retparam28, ptr @.str.3, i64 4, ptr %varargslots29, i64 1) + %not_err43 = icmp eq i64 %23, 0 + br i1 %not_err43, label %after_check44, label %voiderr45 -after_check51: ; preds = %phi_block44 - br label %voiderr52 +after_check44: ; preds = %phi_block40 + br label %voiderr45 -voiderr52: ; preds = %after_check51, %phi_block44 - store i64 ptrtoint (%.fault* @"test_Foo$DEF" to i64), i64* %taddr55, align 8 - %45 = bitcast i64* %taddr55 to i8* - %46 = insertvalue %variant undef, i8* %45, 0 - %47 = insertvalue %variant %46, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %48 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots54, i64 0, i64 0 - store %variant %47, %variant* %48, align 16 - %49 = bitcast [1 x %variant]* %varargslots54 to %variant* - %50 = insertvalue %"variant[]" undef, %variant* %49, 0 - %51 = insertvalue %"variant[]" %50, i64 1, 1 - store %"variant[]" %51, %"variant[]"* %taddr56, align 8 - %52 = bitcast %"variant[]"* %taddr56 to { i8*, i64 }* - %53 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 0 - %lo57 = load i8*, i8** %53, align 8 - %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 1 - %hi58 = load i64, i64* %54, align 8 - %55 = call i64 @std_io_printfln(i64* %retparam53, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0), i64 4, i8* %lo57, i64 %hi58) - %not_err59 = icmp eq i64 %55, 0 - br i1 %not_err59, label %after_check60, label %voiderr61 +voiderr45: ; preds = %after_check44, %phi_block40 + store i64 ptrtoint (ptr @"test_Foo$DEF" to i64), ptr %taddr48, align 8 + %24 = insertvalue %variant undef, ptr %taddr48, 0 + %25 = insertvalue %variant %24, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %26 = getelementptr inbounds [1 x %variant], ptr %varargslots47, i64 0, i64 0 + store %variant %25, ptr %26, align 16 + %27 = call i64 @std_io_printfn(ptr %retparam46, ptr @.str.4, i64 4, ptr %varargslots47, i64 1) + %not_err49 = icmp eq i64 %27, 0 + br i1 %not_err49, label %after_check50, label %voiderr51 -after_check60: ; preds = %voiderr52 - br label %voiderr61 +after_check50: ; preds = %voiderr45 + br label %voiderr51 -voiderr61: ; preds = %after_check60, %voiderr52 - store i32 3, i32* %taddr64, align 4 - %56 = bitcast i32* %taddr64 to i8* - %57 = insertvalue %variant undef, i8* %56, 0 - %58 = insertvalue %variant %57, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %59 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots63, i64 0, i64 0 - store %variant %58, %variant* %59, align 16 - %60 = bitcast [1 x %variant]* %varargslots63 to %variant* - %61 = insertvalue %"variant[]" undef, %variant* %60, 0 - %62 = insertvalue %"variant[]" %61, i64 1, 1 - store %"variant[]" %62, %"variant[]"* %taddr65, align 8 - %63 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* - %64 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 0 - %lo66 = load i8*, i8** %64, align 8 - %65 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 1 - %hi67 = load i64, i64* %65, align 8 - %66 = call i64 @std_io_printfln(i64* %retparam62, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0), i64 4, i8* %lo66, i64 %hi67) - %not_err68 = icmp eq i64 %66, 0 - br i1 %not_err68, label %after_check69, label %voiderr70 +voiderr51: ; preds = %after_check50, %voiderr45 + store i32 3, ptr %taddr54, align 4 + %28 = insertvalue %variant undef, ptr %taddr54, 0 + %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %30 = getelementptr inbounds [1 x %variant], ptr %varargslots53, i64 0, i64 0 + store %variant %29, ptr %30, align 16 + %31 = call i64 @std_io_printfn(ptr %retparam52, ptr @.str.5, i64 4, ptr %varargslots53, i64 1) + %not_err55 = icmp eq i64 %31, 0 + br i1 %not_err55, label %after_check56, label %voiderr57 -after_check69: ; preds = %voiderr61 - br label %voiderr70 +after_check56: ; preds = %voiderr51 + br label %voiderr57 -voiderr70: ; preds = %after_check69, %voiderr61 - store i64 ptrtoint (%.fault* @"test_Foo$DEF" to i64), i64* %taddr73, align 8 - %67 = bitcast i64* %taddr73 to i8* - %68 = insertvalue %variant undef, i8* %67, 0 - %69 = insertvalue %variant %68, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %70 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots72, i64 0, i64 0 - store %variant %69, %variant* %70, align 16 - %71 = bitcast [1 x %variant]* %varargslots72 to %variant* - %72 = insertvalue %"variant[]" undef, %variant* %71, 0 - %73 = insertvalue %"variant[]" %72, i64 1, 1 - store %"variant[]" %73, %"variant[]"* %taddr74, align 8 - %74 = bitcast %"variant[]"* %taddr74 to { i8*, i64 }* - %75 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %74, i32 0, i32 0 - %lo75 = load i8*, i8** %75, align 8 - %76 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %74, i32 0, i32 1 - %hi76 = load i64, i64* %76, align 8 - %77 = call i64 @std_io_printfln(i64* %retparam71, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0), i64 4, i8* %lo75, i64 %hi76) - %not_err77 = icmp eq i64 %77, 0 - br i1 %not_err77, label %after_check78, label %voiderr79 +voiderr57: ; preds = %after_check56, %voiderr51 + store i64 ptrtoint (ptr @"test_Foo$DEF" to i64), ptr %taddr60, align 8 + %32 = insertvalue %variant undef, ptr %taddr60, 0 + %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %34 = getelementptr inbounds [1 x %variant], ptr %varargslots59, i64 0, i64 0 + store %variant %33, ptr %34, align 16 + %35 = call i64 @std_io_printfn(ptr %retparam58, ptr @.str.6, i64 4, ptr %varargslots59, i64 1) + %not_err61 = icmp eq i64 %35, 0 + br i1 %not_err61, label %after_check62, label %voiderr63 -after_check78: ; preds = %voiderr70 - br label %voiderr79 +after_check62: ; preds = %voiderr57 + br label %voiderr63 -voiderr79: ; preds = %after_check78, %voiderr70 - store i64 0, i64* %error_var, align 8 - br label %phi_block83 +voiderr63: ; preds = %after_check62, %voiderr57 + store i64 0, ptr %error_var, align 8 + br label %phi_block67 -phi_block83: ; preds = %voiderr79 +phi_block67: ; preds = %voiderr63 br label %noerr_block -noerr_block: ; preds = %phi_block83 - %78 = bitcast i64* %error_var to i8* - %79 = insertvalue %variant undef, i8* %78, 0 - %80 = insertvalue %variant %79, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 - %81 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots81, i64 0, i64 0 - store %variant %80, %variant* %81, align 16 - %82 = bitcast [1 x %variant]* %varargslots81 to %variant* - %83 = insertvalue %"variant[]" undef, %variant* %82, 0 - %84 = insertvalue %"variant[]" %83, i64 1, 1 - store %"variant[]" %84, %"variant[]"* %taddr84, align 8 - %85 = bitcast %"variant[]"* %taddr84 to { i8*, i64 }* - %86 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %85, i32 0, i32 0 - %lo85 = load i8*, i8** %86, align 8 - %87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %85, i32 0, i32 1 - %hi86 = load i64, i64* %87, align 8 - %88 = call i64 @std_io_printfln(i64* %retparam80, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i32 0, i32 0), i64 4, i8* %lo85, i64 %hi86) - %not_err87 = icmp eq i64 %88, 0 - br i1 %not_err87, label %after_check88, label %voiderr89 +noerr_block: ; preds = %phi_block67 + %36 = insertvalue %variant undef, ptr %error_var, 0 + %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 + %38 = getelementptr inbounds [1 x %variant], ptr %varargslots65, i64 0, i64 0 + store %variant %37, ptr %38, align 16 + %39 = call i64 @std_io_printfn(ptr %retparam64, ptr @.str.7, i64 4, ptr %varargslots65, i64 1) + %not_err68 = icmp eq i64 %39, 0 + br i1 %not_err68, label %after_check69, label %voiderr70 -after_check88: ; preds = %noerr_block - br label %voiderr89 +after_check69: ; preds = %noerr_block + br label %voiderr70 -voiderr89: ; preds = %after_check88, %noerr_block - store i64 3, i64* %x, align 8 - %89 = bitcast i64* %x to i8* - %90 = insertvalue %variant undef, i8* %89, 0 - %91 = insertvalue %variant %90, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 - %92 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots91, i64 0, i64 0 - store %variant %91, %variant* %92, align 16 - %93 = bitcast [1 x %variant]* %varargslots91 to %variant* - %94 = insertvalue %"variant[]" undef, %variant* %93, 0 - %95 = insertvalue %"variant[]" %94, i64 1, 1 - store %"variant[]" %95, %"variant[]"* %taddr92, align 8 - %96 = bitcast %"variant[]"* %taddr92 to { i8*, i64 }* - %97 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %96, i32 0, i32 0 - %lo93 = load i8*, i8** %97, align 8 - %98 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %96, i32 0, i32 1 - %hi94 = load i64, i64* %98, align 8 - %99 = call i64 @std_io_printfln(i64* %retparam90, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i32 0, i32 0), i64 4, i8* %lo93, i64 %hi94) - %not_err95 = icmp eq i64 %99, 0 - br i1 %not_err95, label %after_check96, label %voiderr97 +voiderr70: ; preds = %after_check69, %noerr_block + store i64 3, ptr %x, align 8 + %40 = insertvalue %variant undef, ptr %x, 0 + %41 = insertvalue %variant %40, i64 ptrtoint (ptr @"ct$long" to i64), 1 + %42 = getelementptr inbounds [1 x %variant], ptr %varargslots72, i64 0, i64 0 + store %variant %41, ptr %42, align 16 + %43 = call i64 @std_io_printfn(ptr %retparam71, ptr @.str.8, i64 4, ptr %varargslots72, i64 1) + %not_err73 = icmp eq i64 %43, 0 + br i1 %not_err73, label %after_check74, label %voiderr75 -after_check96: ; preds = %voiderr89 - br label %voiderr97 +after_check74: ; preds = %voiderr70 + br label %voiderr75 -voiderr97: ; preds = %after_check96, %voiderr89 - store i64 ptrtoint (%.fault* @"test_Foo$DEF" to i64), i64* %xy.f, align 8 +voiderr75: ; preds = %after_check74, %voiderr70 + store i64 ptrtoint (ptr @"test_Foo$DEF" to i64), ptr %xy.f, align 8 ret void } ; Function Attrs: nounwind -define i64 @test_get_a(i32* %0, i32 %1) #0 { +define i64 @test_get_a(ptr %0, i32 %1) #0 { entry: %reterr = alloca i64, align 8 %smod = srem i32 %1, 2 @@ -356,16 +267,16 @@ entry: br i1 %intbool, label %if.then, label %if.exit if.then: ; preds = %entry - ret i64 ptrtoint (%.fault* @"test_Foo$ABC" to i64) + ret i64 ptrtoint (ptr @"test_Foo$ABC" to i64) if.exit: ; preds = %entry %mul = mul i32 %1, 2 - store i32 %mul, i32* %0, align 4 + store i32 %mul, ptr %0, align 4 ret i64 0 } ; Function Attrs: nounwind -define i64 @test_get_b(i32* %0, i32 %1) #0 { +define i64 @test_get_b(ptr %0, i32 %1) #0 { entry: %reterr = alloca i64, align 8 %smod = srem i32 %1, 2 @@ -373,10 +284,10 @@ entry: br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry - ret i64 ptrtoint (%.fault* @"test_Foo$ABC" to i64) + ret i64 ptrtoint (ptr @"test_Foo$ABC" to i64) if.exit: ; preds = %entry %mul = mul i32 %1, 2 - store i32 %mul, i32* %0, align 4 + store i32 %mul, ptr %0, align 4 ret i64 0 -} +} \ No newline at end of file diff --git a/test/test_suite/errors/or_and_rethrow.c3t b/test/test_suite/errors/or_and_rethrow.c3t index 7eb743e17..7e792208d 100644 --- a/test/test_suite/errors/or_and_rethrow.c3t +++ b/test/test_suite/errors/or_and_rethrow.c3t @@ -13,7 +13,7 @@ macro int! tester() } fn void! test(int x) { - io::printfln("test(%d)", x); + io::printfn("test(%d)", x); if (x || (tester()?)) io::println("Ok1"); io::println("Test next"); if (tester()? || x) io::println("Ok?"); @@ -22,7 +22,7 @@ fn void! test(int x) fn void! test2(int x) { - io::printfln("test2(%d)", x); + io::printfn("test2(%d)", x); if (x && (tester()?)) io::println("Ok1"); io::println("Test next"); if ((tester()?) && x) io::println("Ok?"); @@ -44,29 +44,18 @@ entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 %error_var = alloca i64, align 8 %blockret = alloca i32, align 4 - %error_var2 = alloca i64, align 8 - %blockret3 = alloca i32, align 4 + %error_var1 = alloca i64, align 8 + %blockret2 = alloca i32, align 4 %reterr = alloca i64, align 8 - store i32 %0, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr1, align 8 - %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %11, 0 + store i32 %0, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.1, i64 8, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry @@ -77,7 +66,7 @@ voiderr: ; preds = %after_check, %entry br i1 %intbool, label %or.phi, label %or.rhs or.rhs: ; preds = %voiderr - store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var, align 8 + store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var, align 8 br label %opt_block_cleanup opt_block_cleanup: ; preds = %or.rhs @@ -85,31 +74,31 @@ opt_block_cleanup: ; preds = %or.rhs br label %guard_block guard_block: ; preds = %opt_block_cleanup - %12 = load i64, i64* %error_var, align 8 - ret i64 %12 + %5 = load i64, ptr %error_var, align 8 + ret i64 %5 or.phi: ; preds = %voiderr br label %if.then if.then: ; preds = %or.phi - %13 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0)) #1 + %6 = call i32 @std_io_println(ptr @.str.2) #1 br label %if.exit if.exit: ; preds = %if.then - %14 = call i32 @std_io_println(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0)) #1 - store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var2, align 8 - br label %opt_block_cleanup4 + %7 = call i32 @std_io_println(ptr @.str.3) #1 + store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var1, align 8 + br label %opt_block_cleanup3 -opt_block_cleanup4: ; preds = %if.exit +opt_block_cleanup3: ; preds = %if.exit call void @foo_blurb() - br label %guard_block5 + br label %guard_block4 -guard_block5: ; preds = %opt_block_cleanup4 - %15 = load i64, i64* %error_var2, align 8 - ret i64 %15 +guard_block4: ; preds = %opt_block_cleanup3 + %8 = load i64, ptr %error_var1, align 8 + ret i64 %8 -if.exit7: ; No predecessors! - %16 = call i32 @std_io_println(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i32 0, i32 0)) #1 +if.exit6: ; No predecessors! + %9 = call i32 @std_io_println(ptr @.str.5) #1 ret i64 0 } @@ -119,29 +108,18 @@ entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 %error_var = alloca i64, align 8 %blockret = alloca i32, align 4 - %error_var2 = alloca i64, align 8 - %blockret3 = alloca i32, align 4 + %error_var1 = alloca i64, align 8 + %blockret2 = alloca i32, align 4 %reterr = alloca i64, align 8 - store i32 %0, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr1, align 8 - %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i64 9, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %11, 0 + store i32 %0, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.6, i64 9, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry @@ -152,7 +130,7 @@ voiderr: ; preds = %after_check, %entry br i1 %intbool, label %and.rhs, label %and.phi and.rhs: ; preds = %voiderr - store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var, align 8 + store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var, align 8 br label %opt_block_cleanup opt_block_cleanup: ; preds = %and.rhs @@ -160,26 +138,26 @@ opt_block_cleanup: ; preds = %and.rhs br label %guard_block guard_block: ; preds = %opt_block_cleanup - %12 = load i64, i64* %error_var, align 8 - ret i64 %12 + %5 = load i64, ptr %error_var, align 8 + ret i64 %5 and.phi: ; preds = %voiderr br label %if.exit if.exit: ; preds = %and.phi - %13 = call i32 @std_io_println(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.7, i32 0, i32 0)) #1 - store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var2, align 8 - br label %opt_block_cleanup4 + %6 = call i32 @std_io_println(ptr @.str.7) #1 + store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var1, align 8 + br label %opt_block_cleanup3 -opt_block_cleanup4: ; preds = %if.exit +opt_block_cleanup3: ; preds = %if.exit call void @foo_blurb() - br label %guard_block5 + br label %guard_block4 -guard_block5: ; preds = %opt_block_cleanup4 - %14 = load i64, i64* %error_var2, align 8 - ret i64 %14 +guard_block4: ; preds = %opt_block_cleanup3 + %7 = load i64, ptr %error_var1, align 8 + ret i64 %7 -if.exit6: ; No predecessors! - %15 = call i32 @std_io_println(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0)) #1 +if.exit5: ; No predecessors! + %8 = call i32 @std_io_println(ptr @.str.8) #1 ret i64 0 } diff --git a/test/test_suite/errors/or_err_bool.c3t b/test/test_suite/errors/or_err_bool.c3t index 26a68c9d7..0c5ebd276 100644 --- a/test/test_suite/errors/or_err_bool.c3t +++ b/test/test_suite/errors/or_err_bool.c3t @@ -14,14 +14,14 @@ define void @test_tester() #0 { entry: %x = alloca i8, align 1 %x.f = alloca i64, align 8 - store i8 0, i8* %x, align 1 - store i64 0, i64* %x.f, align 8 - %optval = load i64, i64* %x.f, align 8 + store i8 0, ptr %x, align 1 + store i64 0, ptr %x.f, align 8 + %optval = load i64, ptr %x.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %0 = load i8, i8* %x, align 1 + %0 = load i8, ptr %x, align 1 %1 = trunc i8 %0 to i1 br label %phi_block diff --git a/test/test_suite/errors/printing_errors.c3t b/test/test_suite/errors/printing_errors.c3t index df4a9c0e1..35623daea 100644 --- a/test/test_suite/errors/printing_errors.c3t +++ b/test/test_suite/errors/printing_errors.c3t @@ -20,48 +20,35 @@ entry: %x = alloca i64, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [2 x %variant], align 16 - %taddr = alloca [5 x i8]*, align 8 + %taddr = alloca ptr, align 8 %faultname_zero = alloca %"char[]", align 8 - %taddr1 = alloca %"variant[]", align 8 - store i64 ptrtoint (%.fault* @"test_Cde$WORLD" to i64), i64* %x, align 8 - store [5 x i8]* bitcast ([6 x i8]* @.str.2 to [5 x i8]*), [5 x i8]** %taddr, align 8 - %0 = bitcast [5 x i8]** %taddr to i8* - %1 = insertvalue %variant undef, i8* %0, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 - %3 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %2, %variant* %3, align 16 - %4 = load i64, i64* %x, align 8 - %eq = icmp eq i64 %4, 0 + store i64 ptrtoint (ptr @"test_Cde$WORLD" to i64), ptr %x, align 8 + store ptr @.str.2, ptr %taddr, align 8 + %0 = insertvalue %variant undef, ptr %taddr, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 + %2 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %1, ptr %2, align 16 + %3 = load i64, ptr %x, align 8 + %eq = icmp eq i64 %3, 0 br i1 %eq, label %faultname_no, label %faultname_ok faultname_no: ; preds = %entry - %5 = bitcast %"char[]"* %faultname_zero to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %5, i8 0, i64 16, i1 false) + call void @llvm.memset.p0.i64(ptr align 8 %faultname_zero, i8 0, i64 16, i1 false) br label %faultname_exit faultname_ok: ; preds = %entry - %6 = inttoptr i64 %4 to %.fault* - %7 = getelementptr inbounds %.fault, %.fault* %6, i32 0, i32 1 + %4 = inttoptr i64 %3 to ptr + %5 = getelementptr inbounds %.fault, ptr %4, i32 0, i32 1 br label %faultname_exit faultname_exit: ; preds = %faultname_ok, %faultname_no - %faultname = phi %"char[]"* [ %faultname_zero, %faultname_no ], [ %7, %faultname_ok ] - %8 = bitcast %"char[]"* %faultname to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$sa$char" to i64), 1 - %11 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %10, %variant* %11, align 16 - %12 = bitcast [2 x %variant]* %varargslots to %variant* - %13 = insertvalue %"variant[]" undef, %variant* %12, 0 - %14 = insertvalue %"variant[]" %13, i64 2, 1 - store %"variant[]" %14, %"variant[]"* %taddr1, align 8 - %15 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 - %lo = load i8*, i8** %16, align 8 - %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 - %hi = load i64, i64* %17, align 8 - %18 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i64 6, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %18, 0 + %faultname = phi ptr [ %faultname_zero, %faultname_no ], [ %5, %faultname_ok ] + %6 = insertvalue %variant undef, ptr %faultname, 0 + %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$sa$char" to i64), 1 + %8 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %7, ptr %8, align 16 + %9 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 6, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %9, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %faultname_exit diff --git a/test/test_suite/errors/rethrow.c3t b/test/test_suite/errors/rethrow.c3t index d5a950e3d..1f729d736 100644 --- a/test/test_suite/errors/rethrow.c3t +++ b/test/test_suite/errors/rethrow.c3t @@ -12,21 +12,21 @@ fn void! test() %i.f = alloca i64, align 8 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i64 0, i64* %i.f, align 8 - store i32 0, i32* %i, align 4 - %optval = load i64, i64* %i.f, align 8 + store i64 0, ptr %i.f, align 8 + store i32 0, ptr %i, align 4 + %optval = load i64, ptr %i.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* %error_var, align 8 + store i64 %optval, ptr %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, i64* %error_var, align 8 + %0 = load i64, ptr %error_var, align 8 ret i64 %0 noerr_block: ; preds = %after_check diff --git a/test/test_suite/errors/rethrow_mingw.c3t b/test/test_suite/errors/rethrow_mingw.c3t index b0000e5f5..0c12b0f39 100644 --- a/test/test_suite/errors/rethrow_mingw.c3t +++ b/test/test_suite/errors/rethrow_mingw.c3t @@ -16,21 +16,21 @@ entry: %i.f = alloca i64, align 8 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i64 0, i64* %i.f, align 8 - store i32 0, i32* %i, align 4 - %optval = load i64, i64* %i.f, align 8 + store i64 0, ptr %i.f, align 8 + store i32 0, ptr %i, align 4 + %optval = load i64, ptr %i.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* %error_var, align 8 + store i64 %optval, ptr %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, i64* %error_var, align 8 + %0 = load i64, ptr %error_var, align 8 ret i64 %0 noerr_block: ; preds = %after_check diff --git a/test/test_suite/errors/simple_static_failable.c3t b/test/test_suite/errors/simple_static_failable.c3t index de3f5c634..9e83c22bd 100644 --- a/test/test_suite/errors/simple_static_failable.c3t +++ b/test/test_suite/errors/simple_static_failable.c3t @@ -19,6 +19,6 @@ define void @foo_main() #0 { entry: %i = alloca i32, align 4 %i.f = alloca i64, align 8 - store i64 ptrtoint (%.fault* @"foo_Blurg$Y" to i64), i64* %i.f, align 8 + store i64 ptrtoint (ptr @"foo_Blurg$Y" to i64), ptr %i.f, align 8 ret void } \ No newline at end of file diff --git a/test/test_suite/errors/try_assign.c3t b/test/test_suite/errors/try_assign.c3t index 0890d72cf..77fca57ad 100644 --- a/test/test_suite/errors/try_assign.c3t +++ b/test/test_suite/errors/try_assign.c3t @@ -37,19 +37,19 @@ entry: %w.f = alloca i64, align 8 %gh = alloca i32, align 4 %e = alloca i64, align 8 - store i32 123, i32* %x, align 4 - store i32 234, i32* %z, align 4 - store i64 0, i64* %z.f, align 8 - store i64 0, i64* %w.f, align 8 - store i32 0, i32* %w, align 4 - store i32 1, i32* %gh, align 4 - %optval = load i64, i64* %z.f, align 8 + store i32 123, ptr %x, align 4 + store i32 234, ptr %z, align 4 + store i64 0, ptr %z.f, align 8 + store i64 0, ptr %w.f, align 8 + store i32 0, ptr %w, align 4 + store i32 1, ptr %gh, align 4 + %optval = load i64, ptr %z.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %0 = load i32, i32* %z, align 4 - store i32 %0, i32* %x, align 4 + %0 = load i32, ptr %z, align 4 + store i32 %0, ptr %x, align 4 br label %phi_try_catch catch_landing: ; preds = %entry @@ -60,13 +60,13 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val, label %chain_next, label %fail_chain chain_next: ; preds = %phi_try_catch - %optval1 = load i64, i64* %w.f, align 8 + %optval1 = load i64, ptr %w.f, align 8 %not_err2 = icmp eq i64 %optval1, 0 br i1 %not_err2, label %after_check3, label %catch_landing4 after_check3: ; preds = %chain_next - %1 = load i32, i32* %w, align 4 - store i32 %1, i32* %gh, align 4 + %1 = load i32, ptr %w, align 4 + store i32 %1, ptr %gh, align 4 br label %phi_try_catch5 catch_landing4: ; preds = %chain_next @@ -87,26 +87,26 @@ end_chain: ; preds = %fail_chain, %chain_ br i1 %chain.phi, label %if.then, label %if.exit if.then: ; preds = %end_chain - %2 = load i32, i32* %x, align 4 - %3 = load i32, i32* %gh, align 4 - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i32 %2, i32 %3) + %2 = load i32, ptr %x, align 4 + %3 = load i32, ptr %gh, align 4 + %4 = call i32 (ptr, ...) @printf(ptr @.str, i32 %2, i32 %3) br label %if.exit if.exit: ; preds = %if.then, %end_chain - %optval8 = load i64, i64* %z.f, align 8 + %optval8 = load i64, ptr %z.f, align 8 %not_err9 = icmp eq i64 %optval8, 0 br i1 %not_err9, label %after_check10, label %catch_landing14 after_check10: ; preds = %if.exit - %5 = load i32, i32* %z, align 4 - %optval11 = load i64, i64* %w.f, align 8 + %5 = load i32, ptr %z, align 4 + %optval11 = load i64, ptr %w.f, align 8 %not_err12 = icmp eq i64 %optval11, 0 br i1 %not_err12, label %after_check13, label %catch_landing14 after_check13: ; preds = %after_check10 - %6 = load i32, i32* %w, align 4 + %6 = load i32, ptr %w, align 4 %add = add i32 %5, %6 - store i32 %add, i32* %x, align 4 + store i32 %add, ptr %x, align 4 br label %phi_try_catch15 catch_landing14: ; preds = %after_check10, %if.exit @@ -117,33 +117,33 @@ phi_try_catch15: ; preds = %catch_landing14, %a br i1 %val16, label %if.then17, label %if.exit18 if.then17: ; preds = %phi_try_catch15 - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0)) + %7 = call i32 (ptr, ...) @printf(ptr @.str.1) br label %if.exit18 if.exit18: ; preds = %if.then17, %phi_try_catch15 - store i64 0, i64* %e, align 8 + store i64 0, ptr %e, align 8 br label %testblock testblock: ; preds = %if.exit18 - %optval19 = load i64, i64* %z.f, align 8 + %optval19 = load i64, ptr %z.f, align 8 %not_err20 = icmp eq i64 %optval19, 0 br i1 %not_err20, label %after_check21, label %assign_optional assign_optional: ; preds = %testblock - store i64 %optval19, i64* %e, align 8 + store i64 %optval19, ptr %e, align 8 br label %end_block after_check21: ; preds = %testblock - store i64 0, i64* %e, align 8 + store i64 0, ptr %e, align 8 br label %end_block end_block: ; preds = %after_check21, %assign_optional - %8 = load i64, i64* %e, align 8 + %8 = load i64, ptr %e, align 8 %neq = icmp ne i64 %8, 0 br i1 %neq, label %if.then22, label %if.exit23 if.then22: ; preds = %end_block - %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0)) + %9 = call i32 (ptr, ...) @printf(ptr @.str.2) br label %if.exit23 if.exit23: ; preds = %if.then22, %end_block diff --git a/test/test_suite/errors/try_catch_if.c3t b/test/test_suite/errors/try_catch_if.c3t index 030fe7611..086e11959 100644 --- a/test/test_suite/errors/try_catch_if.c3t +++ b/test/test_suite/errors/try_catch_if.c3t @@ -36,11 +36,12 @@ fn void main() /* #expect: try_catch_if.ll -define i64 @try_catch_if_tester(i32* %0) #0 { + +define i64 @try_catch_if_tester(ptr %0) #0 { entry: %reterr = alloca i64, align 8 - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) - store i32 222, i32* %0, align 4 + %1 = call i32 (ptr, ...) @printf(ptr @.str) + store i32 222, ptr %0, align 4 ret i64 0 } @@ -50,47 +51,47 @@ entry: %a.f = alloca i64, align 8 %err = alloca i64, align 8 %retparam = alloca i32, align 4 - store i32 123, i32* %a, align 4 - store i64 0, i64* %a.f, align 8 + store i32 123, ptr %a, align 4 + store i64 0, ptr %a.f, align 8 br label %testblock testblock: ; preds = %entry - %optval = load i64, i64* %a.f, align 8 + %optval = load i64, ptr %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 + store i64 %optval, ptr %err, align 8 br label %end_block after_check: ; preds = %testblock br label %testblock1 testblock1: ; preds = %after_check - %0 = call i64 @try_catch_if_tester(i32* %retparam) + %0 = call i64 @try_catch_if_tester(ptr %retparam) %not_err2 = icmp eq i64 %0, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %testblock1 - store i64 %0, i64* %err, align 8 + store i64 %0, ptr %err, align 8 br label %end_block after_check4: ; preds = %testblock1 - store i64 0, i64* %err, align 8 + store i64 0, ptr %err, align 8 br label %end_block end_block: ; preds = %after_check4, %assign_optional3, %assign_optional - %1 = load i64, i64* %err, align 8 + %1 = load i64, ptr %err, align 8 %neq = icmp ne i64 %1, 0 br i1 %neq, label %if.then, label %if.else if.then: ; preds = %end_block - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i32 0, i32 0)) + %2 = call i32 (ptr, ...) @printf(ptr @.str.1) br label %if.exit if.else: ; preds = %end_block - %3 = load i32, i32* %a, align 4 - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %3) + %3 = load i32, ptr %a, align 4 + %4 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %3) br label %if.exit if.exit: ; preds = %if.else, %if.then diff --git a/test/test_suite/errors/try_unwrap_using_assert.c3t b/test/test_suite/errors/try_unwrap_using_assert.c3t index 9974ae2df..1870b5edb 100644 --- a/test/test_suite/errors/try_unwrap_using_assert.c3t +++ b/test/test_suite/errors/try_unwrap_using_assert.c3t @@ -19,23 +19,23 @@ entry: %num.f = alloca i64, align 8 %retparam = alloca i32, align 4 %x = alloca i32, align 4 - %1 = call i64 @maybe(i32* %retparam) + %1 = call i64 @maybe(ptr %retparam) %not_err = icmp eq i64 %1, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %1, i64* %num.f, align 8 + store i64 %1, ptr %num.f, align 8 br label %after_assign after_check: ; preds = %entry - %2 = load i32, i32* %retparam, align 4 - store i32 %2, i32* %num, align 4 - store i64 0, i64* %num.f, align 8 + %2 = load i32, ptr %retparam, align 4 + store i32 %2, ptr %num, align 4 + store i64 0, ptr %num.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %3 = load i32, i32* %num, align 4 - store i32 %3, i32* %x, align 4 - %4 = load i32, i32* %num, align 4 + %3 = load i32, ptr %num, align 4 + store i32 %3, ptr %x, align 4 + %4 = load i32, ptr %num, align 4 ret i32 %4 } \ No newline at end of file diff --git a/test/test_suite/errors/try_with_chained_unwrap.c3t b/test/test_suite/errors/try_with_chained_unwrap.c3t index d419e18e6..4e12d57c5 100644 --- a/test/test_suite/errors/try_with_chained_unwrap.c3t +++ b/test/test_suite/errors/try_with_chained_unwrap.c3t @@ -16,27 +16,28 @@ fn void main() printf("You didn't type an integer :(\n"); } -// #expect: try_with_chained_unwrap.ll +/* #expect: try_with_chained_unwrap.ll + define void @try_with_chained_unwrap_main() #0 { entry: %val = alloca i32, align 4 %retparam = alloca i32, align 4 - %retparam1 = alloca i8*, align 8 - store i32 0, i32* %val, align 4 - %0 = call i64 @readLine(i8** %retparam1) + %retparam1 = alloca ptr, align 8 + store i32 0, ptr %val, align 4 + %0 = call i64 @readLine(ptr %retparam1) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %1 = load i8*, i8** %retparam1, align 8 - %2 = call i64 @atoi(i32* %retparam, i8* %1) + %1 = load ptr, ptr %retparam1, align 8 + %2 = call i64 @atoi(ptr %retparam, ptr %1) %not_err2 = icmp eq i64 %2, 0 br i1 %not_err2, label %after_check3, label %catch_landing after_check3: ; preds = %after_check - %3 = load i32, i32* %retparam, align 4 - store i32 %3, i32* %val, align 4 + %3 = load i32, ptr %retparam, align 4 + store i32 %3, ptr %val, align 4 br label %phi_try_catch catch_landing: ; preds = %after_check, %entry @@ -47,11 +48,11 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val4, label %if.then, label %if.exit if.then: ; preds = %phi_try_catch - %4 = load i32, i32* %val, align 4 - %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i32 0, i32 0), i32 %4) + %4 = load i32, ptr %val, align 4 + %5 = call i32 (ptr, ...) @printf(ptr @.str, i32 %4) ret void if.exit: ; preds = %phi_try_catch - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.1, i32 0, i32 0)) + %6 = call i32 (ptr, ...) @printf(ptr @.str.1) ret void } \ No newline at end of file diff --git a/test/test_suite/errors/try_with_unwrap.c3t b/test/test_suite/errors/try_with_unwrap.c3t index 4759f09d3..7da35548e 100644 --- a/test/test_suite/errors/try_with_unwrap.c3t +++ b/test/test_suite/errors/try_with_unwrap.c3t @@ -23,62 +23,62 @@ fn void main() define void @try_with_unwrap_main() #0 { entry: - %line = alloca i8*, align 8 + %line = alloca ptr, align 8 %line.f = alloca i64, align 8 - %retparam = alloca i8*, align 8 + %retparam = alloca ptr, align 8 %val = alloca i32, align 4 %val.f = alloca i64, align 8 %retparam1 = alloca i32, align 4 - %0 = call i64 @readLine(i8** %retparam) + %0 = call i64 @readLine(ptr %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, i64* %line.f, align 8 + store i64 %0, ptr %line.f, align 8 br label %after_assign after_check: ; preds = %entry - %1 = load i8*, i8** %retparam, align 8 - store i8* %1, i8** %line, align 8 - store i64 0, i64* %line.f, align 8 + %1 = load ptr, ptr %retparam, align 8 + store ptr %1, ptr %line, align 8 + store i64 0, ptr %line.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %load.err = load i64, i64* %line.f, align 8 + %load.err = load i64, ptr %line.f, align 8 %result = icmp eq i64 %load.err, 0 br i1 %result, label %if.then, label %if.exit9 if.then: ; preds = %after_assign - %2 = load i8*, i8** %line, align 8 - %3 = call i64 @atoi(i32* %retparam1, i8* %2) + %2 = load ptr, ptr %line, align 8 + %3 = call i64 @atoi(ptr %retparam1, ptr %2) %not_err2 = icmp eq i64 %3, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %if.then - store i64 %3, i64* %val.f, align 8 + store i64 %3, ptr %val.f, align 8 br label %after_assign5 after_check4: ; preds = %if.then - %4 = load i32, i32* %retparam1, align 4 - store i32 %4, i32* %val, align 4 - store i64 0, i64* %val.f, align 8 + %4 = load i32, ptr %retparam1, align 4 + store i32 %4, ptr %val, align 4 + store i64 0, ptr %val.f, align 8 br label %after_assign5 after_assign5: ; preds = %after_check4, %assign_optional3 - %load.err6 = load i64, i64* %val.f, align 8 + %load.err6 = load i64, ptr %val.f, align 8 %result7 = icmp eq i64 %load.err6, 0 br i1 %result7, label %if.then8, label %if.exit if.then8: ; preds = %after_assign5 - %5 = load i32, i32* %val, align 4 - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i32 0, i32 0), i32 %5) + %5 = load i32, ptr %val, align 4 + %6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %5) ret void if.exit: ; preds = %after_assign5 br label %if.exit9 if.exit9: ; preds = %if.exit, %after_assign - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.1, i32 0, i32 0)) + %7 = call i32 (ptr, ...) @printf(ptr @.str.1) ret void } diff --git a/test/test_suite/errors/try_with_unwrapper.c3t b/test/test_suite/errors/try_with_unwrapper.c3t index 7fff22c00..1ee16122e 100644 --- a/test/test_suite/errors/try_with_unwrapper.c3t +++ b/test/test_suite/errors/try_with_unwrapper.c3t @@ -52,14 +52,14 @@ entry: } ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind -define i64 @try_with_unwrapper_tester(i32* %0) #0 { +define i64 @try_with_unwrapper_tester(ptr %0) #0 { entry: %reterr = alloca i64, align 8 - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) - store i32 222, i32* %0, align 4 + %1 = call i32 (ptr, ...) @printf(ptr @.str) + store i32 222, ptr %0, align 4 ret i64 0 } @@ -71,16 +71,16 @@ entry: %b = alloca i32, align 4 %c = alloca i32, align 4 %retparam = alloca i32, align 4 - store i32 11, i32* %a, align 4 - store i64 0, i64* %a.f, align 8 - store i32 0, i32* %b, align 4 - %optval = load i64, i64* %a.f, align 8 + store i32 11, ptr %a, align 4 + store i64 0, ptr %a.f, align 8 + store i32 0, ptr %b, align 4 + %optval = load i64, ptr %a.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %0 = load i32, i32* %a, align 4 - store i32 %0, i32* %b, align 4 + %0 = load i32, ptr %a, align 4 + store i32 %0, ptr %b, align 4 br label %phi_try_catch catch_landing: ; preds = %entry @@ -91,14 +91,14 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val, label %chain_next, label %fail_chain chain_next: ; preds = %phi_try_catch - store i32 0, i32* %c, align 4 - %1 = call i64 @try_with_unwrapper_tester(i32* %retparam) + store i32 0, ptr %c, align 4 + %1 = call i64 @try_with_unwrapper_tester(ptr %retparam) %not_err1 = icmp eq i64 %1, 0 br i1 %not_err1, label %after_check2, label %catch_landing3 after_check2: ; preds = %chain_next - %2 = load i32, i32* %retparam, align 4 - store i32 %2, i32* %c, align 4 + %2 = load i32, ptr %retparam, align 4 + store i32 %2, ptr %c, align 4 br label %phi_try_catch4 catch_landing3: ; preds = %chain_next @@ -119,11 +119,11 @@ end_chain: ; preds = %fail_chain, %chain_ br i1 %chain.phi, label %if.then, label %if.exit if.then: ; preds = %end_chain - %3 = load i32, i32* %b, align 4 + %3 = load i32, ptr %b, align 4 %4 = call i32 @try_with_unwrapper_hello(i32 %3) - %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %4) - %6 = load i32, i32* %c, align 4 - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %6) + %5 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %4) + %6 = load i32, ptr %c, align 4 + %7 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %6) br label %if.exit if.exit: ; preds = %if.then, %end_chain @@ -137,16 +137,16 @@ entry: %a = alloca i32, align 4 %a.f = alloca i64, align 8 %b = alloca i32, align 4 - store i64 0, i64* %a.f, align 8 - store i32 0, i32* %a, align 4 - store i32 0, i32* %b, align 4 - %optval = load i64, i64* %a.f, align 8 + store i64 0, ptr %a.f, align 8 + store i32 0, ptr %a, align 4 + store i32 0, ptr %b, align 4 + %optval = load i64, ptr %a.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %0 = load i32, i32* %a, align 4 - store i32 %0, i32* %b, align 4 + %0 = load i32, ptr %a, align 4 + store i32 %0, ptr %b, align 4 br label %phi_try_catch catch_landing: ; preds = %entry @@ -157,7 +157,7 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val, label %chain_next, label %fail_chain chain_next: ; preds = %phi_try_catch - %1 = load i32, i32* %b, align 4 + %1 = load i32, ptr %b, align 4 %2 = call i32 @try_with_unwrapper_hello(i32 %1) %intbool = icmp ne i32 %2, 0 br i1 %intbool, label %chain_next1, label %fail_chain @@ -173,7 +173,7 @@ end_chain: ; preds = %fail_chain, %chain_ br i1 %chain.phi, label %if.then, label %if.exit if.then: ; preds = %end_chain - %3 = load i32, i32* %b, align 4 + %3 = load i32, ptr %b, align 4 %add = add i32 %3, 1 %4 = call i32 @try_with_unwrapper_hello(i32 %add) br label %if.exit diff --git a/test/test_suite/expressions/addr_compiles.c3t b/test/test_suite/expressions/addr_compiles.c3t index beb4f6d04..b69bb3107 100644 --- a/test/test_suite/expressions/addr_compiles.c3t +++ b/test/test_suite/expressions/addr_compiles.c3t @@ -61,32 +61,32 @@ entry: define void @test_test() #0 { entry: %f = alloca i32, align 4 - %x = alloca i32*, align 8 - %h = alloca i32*, align 8 + %x = alloca ptr, align 8 + %h = alloca ptr, align 8 %taddr = alloca i32, align 4 - store i32 3, i32* %f, align 4 - store i32* %f, i32** %x, align 8 - %0 = load i32, i32* %f, align 4 + store i32 3, ptr %f, align 4 + store ptr %f, ptr %x, align 8 + %0 = load i32, ptr %f, align 4 %add = add i32 %0, 1 - store i32 %add, i32* %f, align 4 - store i32 %0, i32* %taddr, align 4 - store i32* %taddr, i32** %h, align 8 - %1 = load i32*, i32** %x, align 8 - %2 = load i32, i32* %1, align 8 - %3 = load i32*, i32** %h, align 8 - %4 = load i32, i32* %3, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str, i32 0, i32 0), i32 %2, i32 %4) + store i32 %add, ptr %f, align 4 + store i32 %0, ptr %taddr, align 4 + store ptr %taddr, ptr %h, align 8 + %1 = load ptr, ptr %x, align 8 + %2 = load i32, ptr %1, align 8 + %3 = load ptr, ptr %h, align 8 + %4 = load i32, ptr %3, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %2, i32 %4) ret void } ; Function Attrs: nounwind define void @test_test2() #0 { entry: - %w = alloca i32*, align 8 - store i32* @test_XX, i32** %w, align 8 - %0 = load i32*, i32** %w, align 8 - %1 = load i32, i32* %0, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i32 %1) + %w = alloca ptr, align 8 + store ptr @test_XX, ptr %w, align 8 + %0 = load ptr, ptr %w, align 8 + %1 = load i32, ptr %0, align 8 + call void (ptr, ...) @printf(ptr @.str.1, i32 %1) ret void } @@ -94,51 +94,49 @@ entry: define void @test_test3() #0 { entry: %h = alloca %Foo, align 4 - %zx = alloca i32*, align 8 - %zy = alloca i32*, align 8 + %zx = alloca ptr, align 8 + %zy = alloca ptr, align 8 %arr = alloca [3 x i32], align 4 - %d = alloca i32*, align 8 - %e = alloca %"int[]"*, align 8 + %d = alloca ptr, align 8 + %e = alloca ptr, align 8 %taddr = alloca %"int[]", align 8 - %0 = bitcast %Foo* %h to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 8, i1 false) - %1 = getelementptr inbounds %Foo, %Foo* %h, i32 0, i32 0 - store i32* %1, i32** %zx, align 8 - %2 = getelementptr inbounds %Foo, %Foo* %h, i32 0, i32 1 - store i32* %2, i32** %zy, align 8 - %3 = bitcast [3 x i32]* %arr to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 bitcast ([3 x i32]* @.__const.2 to i8*), i32 12, i1 false) - %4 = load i32*, i32** %zx, align 8 - %5 = load i32, i32* %4, align 8 - %6 = load i32*, i32** %zy, align 8 - %7 = load i32, i32* %6, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i32 0, i32 0), i32 %5, i32 %7) - %8 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 0 - %9 = load i32, i32* %8, align 4 - %sub = sub i32 %9, 1 - store i32 %sub, i32* %8, align 4 - %10 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 1 - %11 = load i32, i32* %10, align 4 - %sub1 = sub i32 %11, 1 - store i32 %sub1, i32* %10, align 4 - %12 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 2 - %13 = load i32, i32* %12, align 4 - %sub2 = sub i32 %13, 1 - store i32 %sub2, i32* %12, align 4 - %14 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 2 - store i32* %14, i32** %d, align 8 - %15 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 1 - %16 = insertvalue %"int[]" undef, i32* %15, 0 - %17 = insertvalue %"int[]" %16, i64 2, 1 - store %"int[]" %17, %"int[]"* %taddr, align 8 - store %"int[]"* %taddr, %"int[]"** %e, align 8 - %18 = load i32*, i32** %d, align 8 - %19 = load i32, i32* %18, align 8 - %20 = load %"int[]"*, %"int[]"** %e, align 8 - %21 = getelementptr inbounds %"int[]", %"int[]"* %20, i32 0, i32 0 - %22 = load i32*, i32** %21, align 8 - %ptroffset = getelementptr inbounds i32, i32* %22, i64 0 - %23 = load i32, i32* %ptroffset, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.4, i32 0, i32 0), i32 %19, i32 %23) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %h, ptr align 4 @.__const, i32 8, i1 false) + %0 = getelementptr inbounds %Foo, ptr %h, i32 0, i32 0 + store ptr %0, ptr %zx, align 8 + %1 = getelementptr inbounds %Foo, ptr %h, i32 0, i32 1 + store ptr %1, ptr %zy, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %arr, ptr align 4 @.__const.2, i32 12, i1 false) + %2 = load ptr, ptr %zx, align 8 + %3 = load i32, ptr %2, align 8 + %4 = load ptr, ptr %zy, align 8 + %5 = load i32, ptr %4, align 8 + call void (ptr, ...) @printf(ptr @.str.3, i32 %3, i32 %5) + %6 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 0 + %7 = load i32, ptr %6, align 4 + %sub = sub i32 %7, 1 + store i32 %sub, ptr %6, align 4 + %8 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 1 + %9 = load i32, ptr %8, align 4 + %sub1 = sub i32 %9, 1 + store i32 %sub1, ptr %8, align 4 + %10 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 2 + %11 = load i32, ptr %10, align 4 + %sub2 = sub i32 %11, 1 + store i32 %sub2, ptr %10, align 4 + %12 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 2 + store ptr %12, ptr %d, align 8 + %13 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 1 + %14 = insertvalue %"int[]" undef, ptr %13, 0 + %15 = insertvalue %"int[]" %14, i64 2, 1 + store %"int[]" %15, ptr %taddr, align 8 + store ptr %taddr, ptr %e, align 8 + %16 = load ptr, ptr %d, align 8 + %17 = load i32, ptr %16, align 8 + %18 = load ptr, ptr %e, align 8 + %19 = getelementptr inbounds %"int[]", ptr %18, i32 0, i32 0 + %20 = load ptr, ptr %19, align 8 + %ptroffset = getelementptr inbounds i32, ptr %20, i64 0 + %21 = load i32, ptr %ptroffset, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %17, i32 %21) ret void } \ No newline at end of file diff --git a/test/test_suite/expressions/assignment_precedence.c3t b/test/test_suite/expressions/assignment_precedence.c3t index da7d5bc14..679360c3a 100644 --- a/test/test_suite/expressions/assignment_precedence.c3t +++ b/test/test_suite/expressions/assignment_precedence.c3t @@ -14,10 +14,10 @@ fn void test() %j = alloca i32, align 4 %k = alloca i32, align 4 %l = alloca i32, align 4 - store i32 1, i32* %i, align 4 - store i32 2, i32* %j, align 4 - store i32 3, i32* %k, align 4 - %0 = load i32, i32* %k, align 4 - store i32 %0, i32* %j, align 4 - store i32 %0, i32* %i, align 4 - store i32 %0, i32* %l, align 4 \ No newline at end of file + store i32 1, ptr %i, align 4 + store i32 2, ptr %j, align 4 + store i32 3, ptr %k, align 4 + %0 = load i32, ptr %k, align 4 + store i32 %0, ptr %j, align 4 + store i32 %0, ptr %i, align 4 + store i32 %0, ptr %l, align 4 \ No newline at end of file diff --git a/test/test_suite/expressions/bool_conversions.c3t b/test/test_suite/expressions/bool_conversions.c3t index ef1cb53e1..657a2b3f7 100644 --- a/test/test_suite/expressions/bool_conversions.c3t +++ b/test/test_suite/expressions/bool_conversions.c3t @@ -10,16 +10,16 @@ fn bool f1() { return (bool){| Test x = void; return x = (Test)0; |}; } /* #expect: bool_conversions.ll -define internal zeroext i8 @bool_conversions_f0_0(i8* %0) #0 { +define internal zeroext i8 @bool_conversions_f0_0(ptr %0) #0 { entry: - %ptrbool = icmp ne i8* %0, null + %ptrbool = icmp ne ptr %0, null %1 = zext i1 %ptrbool to i8 ret i8 %1 } define i32 @bool_conversions_f0() #0 { entry: - %0 = call i8 @bool_conversions_f0_0(i8* inttoptr (i64 2 to i8*)) + %0 = call i8 @bool_conversions_f0_0(ptr inttoptr (i64 2 to ptr)) %1 = trunc i8 %0 to i1 %boolsi = zext i1 %1 to i32 ret i32 %boolsi @@ -27,7 +27,7 @@ entry: define zeroext i8 @bool_conversions_f1() #0 { entry: - %x = alloca void ()*, align 8 - store void ()* null, void ()** %x, align 8 + %x = alloca ptr, align 8 + store ptr null, ptr %x, align 8 ret i8 0 } diff --git a/test/test_suite/expressions/casts/cast_expr.c3t b/test/test_suite/expressions/casts/cast_expr.c3t index 32d8ee294..07b842ad2 100644 --- a/test/test_suite/expressions/casts/cast_expr.c3t +++ b/test/test_suite/expressions/casts/cast_expr.c3t @@ -17,11 +17,11 @@ define i32 @main %b = alloca i32 %c = alloca i32 - store i32 10, i32* %a - store i32 20, i32* %b - %2 = load i32, i32* %a + store i32 10, ptr %a + store i32 20, ptr %b + %2 = load i32, ptr %a trunc i32 %2 to i8 sext i8 %sisitrunc to i32 - store i32 %sisiext, i32* %c + store i32 %sisiext, ptr %c ret i32 0 } diff --git a/test/test_suite/expressions/casts/cast_func_to_various.c3 b/test/test_suite/expressions/casts/cast_func_to_various.c3 index 1a7acb57b..31fcb3154 100644 --- a/test/test_suite/expressions/casts/cast_func_to_various.c3 +++ b/test/test_suite/expressions/casts/cast_func_to_various.c3 @@ -3,7 +3,7 @@ struct Struct int x; } -enum Enum : usz +enum Enum : uptr { A, B } diff --git a/test/test_suite/expressions/chained_conditional.c3t b/test/test_suite/expressions/chained_conditional.c3t index c44be3422..ee0df31dd 100644 --- a/test/test_suite/expressions/chained_conditional.c3t +++ b/test/test_suite/expressions/chained_conditional.c3t @@ -28,17 +28,17 @@ entry: %y = alloca i32, align 4 %z = alloca i32, align 4 %0 = call i32 @chained_foo() - store i32 %0, i32* %x, align 4 + store i32 %0, ptr %x, align 4 %1 = call i32 @chained_foo() - store i32 %1, i32* %y, align 4 + store i32 %1, ptr %y, align 4 %2 = call i32 @chained_foo() - store i32 %2, i32* %z, align 4 - %3 = load i32, i32* %x, align 4 + store i32 %2, ptr %z, align 4 + %3 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %3, 0 br i1 %gt, label %and.rhs, label %and.phi and.rhs: - %4 = load i32, i32* %y, align 4 + %4 = load i32, ptr %y, align 4 %gt1 = icmp sgt i32 %4, 0 br label %and.phi @@ -47,7 +47,7 @@ and.phi: br i1 %val, label %and.rhs2, label %and.phi4 and.rhs2: - %5 = load i32, i32* %z, align 4 + %5 = load i32, ptr %z, align 4 %gt3 = icmp sgt i32 %5, 0 br label %and.phi4 @@ -60,9 +60,9 @@ if.then: br label %if.exit if.else: - %7 = load i32, i32* %x, align 4 + %7 = load i32, ptr %x, align 4 %add = add i32 %7, 1 - store i32 %add, i32* %x, align 4 + store i32 %add, ptr %x, align 4 br label %if.exit if.exit: diff --git a/test/test_suite/expressions/chained_ternary.c3t b/test/test_suite/expressions/chained_ternary.c3t index 798043661..2e0bf0daf 100644 --- a/test/test_suite/expressions/chained_ternary.c3t +++ b/test/test_suite/expressions/chained_ternary.c3t @@ -20,205 +20,205 @@ fn void test() /* #expect: test.ll - %0 = load i8*, i8** %a, align 8 - %not = icmp eq i8* %0, null + %0 = load ptr, ptr %a, align 8 + %not = icmp eq ptr %0, null br i1 %not, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %1 = load i8*, i8** %a, align 8 + %1 = load ptr, ptr %a, align 8 br label %cond.phi4 cond.rhs: ; preds = %entry - %2 = load i8*, i8** %a, align 8 - %not1 = icmp eq i8* %2, null + %2 = load ptr, ptr %a, align 8 + %not1 = icmp eq ptr %2, null br i1 %not1, label %cond.lhs2, label %cond.rhs3 cond.lhs2: ; preds = %cond.rhs - %3 = load i8*, i8** %b, align 8 + %3 = load ptr, ptr %b, align 8 br label %cond.phi cond.rhs3: ; preds = %cond.rhs - %4 = load i8*, i8** %c, align 8 + %4 = load ptr, ptr %c, align 8 br label %cond.phi cond.phi: ; preds = %cond.rhs3, %cond.lhs2 - %val = phi i8* [ %3, %cond.lhs2 ], [ %4, %cond.rhs3 ] + %val = phi ptr [ %3, %cond.lhs2 ], [ %4, %cond.rhs3 ] br label %cond.phi4 cond.phi4: ; preds = %cond.phi, %cond.lhs - %val5 = phi i8* [ %1, %cond.lhs ], [ %val, %cond.phi ] - store i8* %val5, i8** %a, align 8 - store i64 0, i64* %x.f, align 8 - store i8* null, i8** %x, align 8 - %5 = load i8*, i8** %a, align 8 - %not6 = icmp eq i8* %5, null + %val5 = phi ptr [ %1, %cond.lhs ], [ %val, %cond.phi ] + store ptr %val5, ptr %a, align 8 + store i64 0, ptr %x.f, align 8 + store ptr null, ptr %x, align 8 + %5 = load ptr, ptr %a, align 8 + %not6 = icmp eq ptr %5, null br i1 %not6, label %cond.lhs7, label %cond.rhs8 cond.lhs7: ; preds = %cond.phi4 - %optval = load i64, i64* %x.f, align 8 + %optval = load i64, ptr %x.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %cond.lhs7 - store i64 %optval, i64* %y.f, align 8 + store i64 %optval, ptr %y.f, align 8 br label %after_assign after_check: ; preds = %cond.lhs7 - %6 = load i8*, i8** %x, align 8 + %6 = load ptr, ptr %x, align 8 br label %cond.phi9 cond.rhs8: ; preds = %cond.phi4 - %7 = load i8*, i8** %b, align 8 + %7 = load ptr, ptr %b, align 8 br label %cond.phi9 cond.phi9: ; preds = %cond.rhs8, %after_check - %val10 = phi i8* [ %6, %after_check ], [ %7, %cond.rhs8 ] - store i8* %val10, i8** %y, align 8 - store i64 0, i64* %y.f, align 8 + %val10 = phi ptr [ %6, %after_check ], [ %7, %cond.rhs8 ] + store ptr %val10, ptr %y, align 8 + store i64 0, ptr %y.f, align 8 br label %after_assign after_assign: ; preds = %cond.phi9, %assign_optional - %8 = load i8*, i8** %a, align 8 - %not11 = icmp eq i8* %8, null + %8 = load ptr, ptr %a, align 8 + %not11 = icmp eq ptr %8, null br i1 %not11, label %cond.lhs12, label %cond.rhs13 cond.lhs12: ; preds = %after_assign - %9 = load i8*, i8** %b, align 8 + %9 = load ptr, ptr %b, align 8 br label %cond.phi18 cond.rhs13: ; preds = %after_assign - %optval14 = load i64, i64* %x.f, align 8 + %optval14 = load i64, ptr %x.f, align 8 %not_err15 = icmp eq i64 %optval14, 0 br i1 %not_err15, label %after_check17, label %assign_optional16 assign_optional16: ; preds = %cond.rhs13 - store i64 %optval14, i64* %y.f, align 8 + store i64 %optval14, ptr %y.f, align 8 br label %after_assign20 after_check17: ; preds = %cond.rhs13 - %10 = load i8*, i8** %x, align 8 + %10 = load ptr, ptr %x, align 8 br label %cond.phi18 cond.phi18: ; preds = %after_check17, %cond.lhs12 - %val19 = phi i8* [ %9, %cond.lhs12 ], [ %10, %after_check17 ] - store i8* %val19, i8** %y, align 8 - store i64 0, i64* %y.f, align 8 + %val19 = phi ptr [ %9, %cond.lhs12 ], [ %10, %after_check17 ] + store ptr %val19, ptr %y, align 8 + store i64 0, ptr %y.f, align 8 br label %after_assign20 after_assign20: ; preds = %cond.phi18, %assign_optional16 br label %voiderr voiderr: ; preds = %after_assign20 - %11 = load i8*, i8** %a, align 8 - %not21 = icmp eq i8* %11, null + %11 = load ptr, ptr %a, align 8 + %not21 = icmp eq ptr %11, null br i1 %not21, label %cond.lhs22, label %cond.rhs27 cond.lhs22: ; preds = %voiderr - %optval23 = load i64, i64* %x.f, align 8 + %optval23 = load i64, ptr %x.f, align 8 %not_err24 = icmp eq i64 %optval23, 0 br i1 %not_err24, label %after_check26, label %assign_optional25 assign_optional25: ; preds = %cond.lhs22 - store i64 %optval23, i64* %y.f, align 8 + store i64 %optval23, ptr %y.f, align 8 br label %after_assign34 after_check26: ; preds = %cond.lhs22 - %12 = load i8*, i8** %x, align 8 + %12 = load ptr, ptr %x, align 8 br label %cond.phi32 cond.rhs27: ; preds = %voiderr - %optval28 = load i64, i64* %x.f, align 8 + %optval28 = load i64, ptr %x.f, align 8 %not_err29 = icmp eq i64 %optval28, 0 br i1 %not_err29, label %after_check31, label %assign_optional30 assign_optional30: ; preds = %cond.rhs27 - store i64 %optval28, i64* %y.f, align 8 + store i64 %optval28, ptr %y.f, align 8 br label %after_assign34 after_check31: ; preds = %cond.rhs27 - %13 = load i8*, i8** %x, align 8 + %13 = load ptr, ptr %x, align 8 br label %cond.phi32 cond.phi32: ; preds = %after_check31, %after_check26 - %val33 = phi i8* [ %12, %after_check26 ], [ %13, %after_check31 ] - store i8* %val33, i8** %y, align 8 - store i64 0, i64* %y.f, align 8 + %val33 = phi ptr [ %12, %after_check26 ], [ %13, %after_check31 ] + store ptr %val33, ptr %y, align 8 + store i64 0, ptr %y.f, align 8 br label %after_assign34 after_assign34: ; preds = %cond.phi32, %assign_optional30, %assign_optional25 br label %voiderr35 voiderr35: ; preds = %after_assign34 - %14 = load i8*, i8** %a, align 8 - %not36 = icmp eq i8* %14, null + %14 = load ptr, ptr %a, align 8 + %not36 = icmp eq ptr %14, null br i1 %not36, label %cond.lhs37, label %cond.rhs42 cond.lhs37: ; preds = %voiderr35 - %optval38 = load i64, i64* %x.f, align 8 + %optval38 = load i64, ptr %x.f, align 8 %not_err39 = icmp eq i64 %optval38, 0 br i1 %not_err39, label %after_check41, label %assign_optional40 assign_optional40: ; preds = %cond.lhs37 - store i64 %optval38, i64* %y.f, align 8 + store i64 %optval38, ptr %y.f, align 8 br label %after_assign44 after_check41: ; preds = %cond.lhs37 - %15 = load i8*, i8** %x, align 8 + %15 = load ptr, ptr %x, align 8 br label %cond.phi43 cond.rhs42: ; preds = %voiderr35 - store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %y.f, align 8 + store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %y.f, align 8 br label %after_assign44 cond.phi43: ; preds = %after_check41 - store i8* %15, i8** %y, align 8 - store i64 0, i64* %y.f, align 8 + store ptr %15, ptr %y, align 8 + store i64 0, ptr %y.f, align 8 br label %after_assign44 after_assign44: ; preds = %cond.phi43, %cond.rhs42, %assign_optional40 br label %voiderr45 voiderr45: ; preds = %after_assign44 - %16 = load i8*, i8** %a, align 8 - %not46 = icmp eq i8* %16, null + %16 = load ptr, ptr %a, align 8 + %not46 = icmp eq ptr %16, null br i1 %not46, label %cond.lhs47, label %cond.rhs48 cond.lhs47: ; preds = %voiderr45 - store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %y.f, align 8 + store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %y.f, align 8 br label %after_assign54 cond.rhs48: ; preds = %voiderr45 - %optval49 = load i64, i64* %x.f, align 8 + %optval49 = load i64, ptr %x.f, align 8 %not_err50 = icmp eq i64 %optval49, 0 br i1 %not_err50, label %after_check52, label %assign_optional51 assign_optional51: ; preds = %cond.rhs48 - store i64 %optval49, i64* %y.f, align 8 + store i64 %optval49, ptr %y.f, align 8 br label %after_assign54 after_check52: ; preds = %cond.rhs48 - %17 = load i8*, i8** %x, align 8 + %17 = load ptr, ptr %x, align 8 br label %cond.phi53 cond.phi53: ; preds = %after_check52 - store i8* %17, i8** %y, align 8 - store i64 0, i64* %y.f, align 8 + store ptr %17, ptr %y, align 8 + store i64 0, ptr %y.f, align 8 br label %after_assign54 after_assign54: ; preds = %cond.phi53, %assign_optional51, %cond.lhs47 br label %voiderr55 voiderr55: ; preds = %after_assign54 - %18 = load i8*, i8** %a, align 8 - %not56 = icmp eq i8* %18, null + %18 = load ptr, ptr %a, align 8 + %not56 = icmp eq ptr %18, null br i1 %not56, label %cond.lhs57, label %cond.rhs58 cond.lhs57: ; preds = %voiderr55 - store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %y.f, align 8 + store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %y.f, align 8 br label %after_assign60 cond.rhs58: ; preds = %voiderr55 - store i64 ptrtoint (%.fault* @"test_Test$BAR" to i64), i64* %y.f, align 8 + store i64 ptrtoint (ptr @"test_Test$BAR" to i64), ptr %y.f, align 8 br label %after_assign60 after_assign60: ; preds = %cond.rhs58, %cond.lhs57 @@ -226,3 +226,4 @@ after_assign60: ; preds = %cond.rhs58, %cond.l voiderr61: ; preds = %after_assign60 ret void +} \ No newline at end of file diff --git a/test/test_suite/expressions/check_implict_conversion_signed_unsigned.c3t b/test/test_suite/expressions/check_implict_conversion_signed_unsigned.c3t index 743750b98..ca0b4200f 100644 --- a/test/test_suite/expressions/check_implict_conversion_signed_unsigned.c3t +++ b/test/test_suite/expressions/check_implict_conversion_signed_unsigned.c3t @@ -13,10 +13,10 @@ fn int main() entry: %a = alloca i32, align 4 %b = alloca i64, align 8 - store i32 0, i32* %a, align 4 - store i64 3, i64* %b, align 8 - %0 = load i64, i64* %b, align 8 - %1 = load i32, i32* %a, align 4 + store i32 0, ptr %a, align 4 + store i64 3, ptr %b, align 8 + %0 = load i64, ptr %b, align 8 + %1 = load i32, ptr %a, align 4 %sisiext = sext i32 %1 to i64 %sub = sub i64 %0, %sisiext ret i32 1 diff --git a/test/test_suite/expressions/elvis.c3t b/test/test_suite/expressions/elvis.c3t index f5c2b52ce..05682ed87 100644 --- a/test/test_suite/expressions/elvis.c3t +++ b/test/test_suite/expressions/elvis.c3t @@ -17,38 +17,38 @@ fn bool elvis3(bool x, bool y) // #expect: elvis.ll -define i32* @elvis_elvis(i32* %0, i32* %1) #0 { +define ptr @elvis_elvis(ptr %0, ptr %1) #0 { entry: - %ptrbool = icmp ne i32* %0, null + %ptrbool = icmp ne ptr %0, null br i1 %ptrbool, label %cond.phi, label %cond.rhs cond.rhs: ; preds = %entry br label %cond.phi cond.phi: ; preds = %cond.rhs, %entry - %val = phi i32* [ %0, %entry ], [ %1, %cond.rhs ] - ret i32* %val + %val = phi ptr [ %0, %entry ], [ %1, %cond.rhs ] + ret ptr %val } -define i32* @elvis_elvis2(i32* %0, i32* %1) #0 { +define ptr @elvis_elvis2(ptr %0, ptr %1) #0 { entry: - %ptrbool = icmp ne i32* %0, null + %ptrbool = icmp ne ptr %0, null br i1 %ptrbool, label %cond.phi3, label %cond.rhs cond.rhs: ; preds = %entry - %ptrbool1 = icmp ne i32* %1, null + %ptrbool1 = icmp ne ptr %1, null br i1 %ptrbool1, label %cond.phi, label %cond.rhs2 cond.rhs2: ; preds = %cond.rhs br label %cond.phi cond.phi: ; preds = %cond.rhs2, %cond.rhs - %val = phi i32* [ %1, %cond.rhs ], [ %0, %cond.rhs2 ] + %val = phi ptr [ %1, %cond.rhs ], [ %0, %cond.rhs2 ] br label %cond.phi3 cond.phi3: ; preds = %cond.phi, %entry - %val4 = phi i32* [ %0, %entry ], [ %val, %cond.phi ] - ret i32* %val4 + %val4 = phi ptr [ %0, %entry ], [ %val, %cond.phi ] + ret ptr %val4 } define zeroext i8 @elvis_elvis3(i8 zeroext %0, i8 zeroext %1) #0 { diff --git a/test/test_suite/expressions/fmuladd.c3t b/test/test_suite/expressions/fmuladd.c3t index 83eea1943..959ff8402 100644 --- a/test/test_suite/expressions/fmuladd.c3t +++ b/test/test_suite/expressions/fmuladd.c3t @@ -38,12 +38,12 @@ fn void main() float a = 3.1; float b = 1.4; float c = 0.1; - io::printfln("%f", tester1(a, b, c)); - io::printfln("%f", tester2(a, b, c)); - io::printfln("%f", tester3(a, b, c)); - io::printfln("%f", tester4(a, b, c)); - io::printfln("%f", tester5(a, b, c)); - io::printfln("%f", tester6(a, b, c)); + io::printfn("%f", tester1(a, b, c)); + io::printfn("%f", tester2(a, b, c)); + io::printfn("%f", tester3(a, b, c)); + io::printfn("%f", tester4(a, b, c)); + io::printfn("%f", tester5(a, b, c)); + io::printfn("%f", tester6(a, b, c)); } /* #expect: test.ll diff --git a/test/test_suite/expressions/fmuladd_err.c3t b/test/test_suite/expressions/fmuladd_err.c3t index b98a89097..1c0cadd09 100644 --- a/test/test_suite/expressions/fmuladd_err.c3t +++ b/test/test_suite/expressions/fmuladd_err.c3t @@ -25,8 +25,8 @@ entry: %a = alloca float, align 4 %s = alloca float, align 4 %postFix = alloca float, align 4 - store float %0, float* %t, align 4 - %4 = load float, float* %t, align 4 + store float %0, ptr %t, align 4 + %4 = load float, ptr %t, align 4 %eq = fcmp oeq float %4, 0.000000e+00 br i1 %eq, label %if.then, label %if.exit @@ -34,9 +34,9 @@ if.then: ; preds = %entry ret float %1 if.exit: ; preds = %entry - %5 = load float, float* %t, align 4 + %5 = load float, ptr %t, align 4 %fdiv = fdiv float %5, %3 - store float %fdiv, float* %t, align 4 + store float %fdiv, ptr %t, align 4 %eq1 = fcmp oeq float %fdiv, 1.000000e+00 br i1 %eq1, label %if.then2, label %if.exit3 @@ -46,26 +46,26 @@ if.then2: ; preds = %if.exit if.exit3: ; preds = %if.exit %fmul = fmul float %3, 0x3FD3333340000000 - store float %fmul, float* %p, align 4 - store float %2, float* %a, align 4 - %6 = load float, float* %p, align 4 + store float %fmul, ptr %p, align 4 + store float %2, ptr %a, align 4 + %6 = load float, ptr %p, align 4 %fdiv4 = fdiv float %6, 4.000000e+00 - store float %fdiv4, float* %s, align 4 - %7 = load float, float* %a, align 4 - %8 = load float, float* %t, align 4 + store float %fdiv4, ptr %s, align 4 + %7 = load float, ptr %a, align 4 + %8 = load float, ptr %t, align 4 %fsub = fsub float %8, 1.000000e+00 - store float %fsub, float* %t, align 4 + store float %fsub, ptr %t, align 4 %fmul5 = fmul float 1.000000e+01, %fsub %9 = call float @llvm.pow.f32(float 2.000000e+00, float %fmul5) %fmul6 = fmul float %7, %9 - store float %fmul6, float* %postFix, align 4 - %10 = load float, float* %postFix, align 4 - %11 = load float, float* %t, align 4 - %12 = load float, float* %s, align 4 + store float %fmul6, ptr %postFix, align 4 + %10 = load float, ptr %postFix, align 4 + %11 = load float, ptr %t, align 4 + %12 = load float, ptr %s, align 4 %13 = fneg float %12 %14 = call float @llvm.fmuladd.f32(float %11, float %3, float %13) %fmul7 = fmul float %14, 0x40191EB860000000 - %15 = load float, float* %p, align 4 + %15 = load float, ptr %p, align 4 %fdiv8 = fdiv float %fmul7, %15 %16 = call float @llvm.sin.f32(float %fdiv8) %17 = fneg float %1 diff --git a/test/test_suite/expressions/folding_ptr.c3t b/test/test_suite/expressions/folding_ptr.c3t index 51581256a..05f01edc0 100644 --- a/test/test_suite/expressions/folding_ptr.c3t +++ b/test/test_suite/expressions/folding_ptr.c3t @@ -18,17 +18,17 @@ fn int f() define i32 @test_f() #0 { entry: - %0 = load %Test*, %Test** @cfun, align 8 - %ptroffset = getelementptr %Test, %Test* %0, i64 0 - %not = icmp eq %Test* %ptroffset, null + %0 = load ptr, ptr @cfun, align 8 + %ptroffset = getelementptr %Test, ptr %0, i64 0 + %not = icmp eq ptr %ptroffset, null br i1 %not, label %if.then, label %if.exit if.then: ; preds = %entry ret i32 0 if.exit: ; preds = %entry - %1 = load %Test*, %Test** @cfun, align 8 - %2 = getelementptr inbounds %Test, %Test* %1, i32 0, i32 0 - %3 = load i32, i32* %2, align 8 + %1 = load ptr, ptr @cfun, align 8 + %2 = getelementptr inbounds %Test, ptr %1, i32 0, i32 0 + %3 = load i32, ptr %2, align 8 ret i32 %3 } diff --git a/test/test_suite/expressions/incdec.c3t b/test/test_suite/expressions/incdec.c3t index 39d42d8ed..cb4404e02 100644 --- a/test/test_suite/expressions/incdec.c3t +++ b/test/test_suite/expressions/incdec.c3t @@ -11,32 +11,34 @@ fn void test(int* foo) z--; } -// #expect: incdec.ll +/* #expect: incdec.ll - %foo = alloca i32*, align 8 + + %foo = alloca ptr, align 8 %y = alloca i32, align 4 %z = alloca float, align 4 - store i32* %0, i32** %foo - %1 = load i32*, i32** %foo, align 8 - %ptroffset = getelementptr i32, i32* %1, i8 1 - store i32* %ptroffset, i32** %foo, align 8 - %2 = load i32*, i32** %foo, align 8 - %ptroffset1 = getelementptr i32, i32* %2, i8 -1 - store i32* %ptroffset1, i32** %foo, align 8 - store i32 10, i32* %y, align 4 - %3 = load i32, i32* %y, align 4 + store ptr %0, ptr %foo, align 8 + %1 = load ptr, ptr %foo, align 8 + %ptroffset = getelementptr i32, ptr %1, i8 1 + store ptr %ptroffset, ptr %foo, align 8 + %2 = load ptr, ptr %foo, align 8 + %ptroffset1 = getelementptr i32, ptr %2, i8 -1 + store ptr %ptroffset1, ptr %foo, align 8 + store i32 10, ptr %y, align 4 + %3 = load i32, ptr %y, align 4 %add = add i32 %3, 1 - store i32 %add, i32* %y, align 4 - %4 = load i32, i32* %y, align 4 + store i32 %add, ptr %y, align 4 + %4 = load i32, ptr %y, align 4 %sub = sub i32 %4, 1 - store i32 %sub, i32* %y, align 4 - store float 2.000000e+00, float* %z, align 4 - %5 = load float, float* %z, align 4 + store i32 %sub, ptr %y, align 4 + store float 2.000000e+00, ptr %z, align 4 + %5 = load float, ptr %z, align 4 %fincdec = fadd float %5, 1.000000e+00 - store float %fincdec, float* %z, align 4 - %6 = load float, float* %z, align 4 + store float %fincdec, ptr %z, align 4 + %6 = load float, ptr %z, align 4 %fincdec2 = fadd float %6, 1.000000e+00 - store float %fincdec2, float* %z, align 4 - %7 = load float, float* %z, align 4 + store float %fincdec2, ptr %z, align 4 + %7 = load float, ptr %z, align 4 %fincdec3 = fadd float %7, -1.000000e+00 - store float %fincdec3, float* %z, align 4 \ No newline at end of file + store float %fincdec3, ptr %z, align 4 + ret void diff --git a/test/test_suite/expressions/optional_ternary.c3t b/test/test_suite/expressions/optional_ternary.c3t index 958d3e9d8..231a3edb0 100644 --- a/test/test_suite/expressions/optional_ternary.c3t +++ b/test/test_suite/expressions/optional_ternary.c3t @@ -55,9 +55,29 @@ fn void main() int! i = test2(3); } -/* #expect: test.ll +/* expect: test.ll +source_filename = "test" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" +%.fault = type { i64, %"char[]" } +%"char[]" = type { i8*, i64 } +%.introspect = type { i8, i64, i64, i64, [0 x i64] } +@"test_Foo$X" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$test_Foo" to i64), %"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.fault, i64 0, i64 0), i64 1 } }, align 8 +@.fault = internal constant [2 x i8] c"X\00", align 1 +@"ct$test_Foo" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@.zstr = internal constant [28 x i8] c"Runtime error force unwrap!\00", align 1 +@.zstr.1 = internal constant [20 x i8] c"optional_ternary.c3\00", align 1 +@.zstr.2 = internal constant [5 x i8] c"main\00", align 1 +@.zstr.3 = internal constant [28 x i8] c"Runtime error force unwrap!\00", align 1 +@.zstr.4 = internal constant [20 x i8] c"optional_ternary.c3\00", align 1 +@.zstr.5 = internal constant [5 x i8] c"main\00", align 1 +@.zstr.6 = internal constant [28 x i8] c"Runtime error force unwrap!\00", align 1 +@.zstr.7 = internal constant [20 x i8] c"optional_ternary.c3\00", align 1 +@.zstr.8 = internal constant [5 x i8] c"main\00", align 1 + +; Function Attrs: nounwind define i64 @test_test(i32* %0, i32 %1) #0 { entry: %reterr = alloca i64, align 8 @@ -327,61 +347,69 @@ after_check: ; preds = %entry br label %noerr_block panic_block: ; preds = %assign_optional - %2 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %2(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.file, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4, i32 51) + call void @std_core_builtin_panic(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.zstr, i64 0, i64 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.zstr.1, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.zstr.2, i64 0, i64 0), i32 51) unreachable noerr_block: ; preds = %after_check - %3 = call i64 @test_test7(i32* %retparam2, i32 0) - %not_err3 = icmp eq i64 %3, 0 + %2 = call i64 @test_test7(i32* %retparam2, i32 0) + %not_err3 = icmp eq i64 %2, 0 br i1 %not_err3, label %after_check5, label %assign_optional4 assign_optional4: ; preds = %noerr_block - store i64 %3, i64* %error_var1, align 8 + store i64 %2, i64* %error_var1, align 8 br label %panic_block6 after_check5: ; preds = %noerr_block - %4 = load i32, i32* %retparam2, align 4 + %3 = load i32, i32* %retparam2, align 4 br label %noerr_block7 panic_block6: ; preds = %assign_optional4 - %5 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %5(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg.1, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.file.2, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func.3, i64 0, i64 0), i64 4, i32 52) + call void @std_core_builtin_panic(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.zstr.3, i64 0, i64 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.zstr.4, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.zstr.5, i64 0, i64 0), i32 52) unreachable noerr_block7: ; preds = %after_check5 - %6 = call i64 @test_test6(i32* %retparam9, i32 1) - %not_err10 = icmp eq i64 %6, 0 + %4 = call i64 @test_test6(i32* %retparam9, i32 1) + %not_err10 = icmp eq i64 %4, 0 br i1 %not_err10, label %after_check12, label %assign_optional11 assign_optional11: ; preds = %noerr_block7 - store i64 %6, i64* %error_var8, align 8 + store i64 %4, i64* %error_var8, align 8 br label %panic_block13 after_check12: ; preds = %noerr_block7 - %7 = load i32, i32* %retparam9, align 4 + %5 = load i32, i32* %retparam9, align 4 br label %noerr_block14 panic_block13: ; preds = %assign_optional11 - %8 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %8(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg.4, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.file.5, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func.6, i64 0, i64 0), i64 4, i32 53) + call void @std_core_builtin_panic(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.zstr.6, i64 0, i64 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.zstr.7, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.zstr.8, i64 0, i64 0), i32 53) unreachable noerr_block14: ; preds = %after_check12 - %9 = call i64 @test_test2(i32* %retparam15, i32 3) - %not_err16 = icmp eq i64 %9, 0 + %6 = call i64 @test_test2(i32* %retparam15, i32 3) + %not_err16 = icmp eq i64 %6, 0 br i1 %not_err16, label %after_check18, label %assign_optional17 assign_optional17: ; preds = %noerr_block14 - store i64 %9, i64* %i.f, align 8 + store i64 %6, i64* %i.f, align 8 br label %after_assign after_check18: ; preds = %noerr_block14 - %10 = load i32, i32* %retparam15, align 4 - store i32 %10, i32* %i, align 4 + %7 = load i32, i32* %retparam15, align 4 + store i32 %7, i32* %i, align 4 store i64 0, i64* %i.f, align 8 br label %after_assign after_assign: ; preds = %after_check18, %assign_optional17 ret void } + +; Function Attrs: nounwind +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @test_main() + ret i32 0 +} + +declare void @std_core_builtin_panic(i8*, i8*, i8*, i32) + +attributes #0 = { nounwind } \ No newline at end of file diff --git a/test/test_suite/expressions/pointer_access.c3t b/test/test_suite/expressions/pointer_access.c3t index 77cf39af5..66aba105f 100644 --- a/test/test_suite/expressions/pointer_access.c3t +++ b/test/test_suite/expressions/pointer_access.c3t @@ -51,56 +51,54 @@ fn void testSimple() define void @pointer_access_testSimple() #0 { entry: %a = alloca %ExtraSimple, align 8 - %0 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0 - store i32 0, i32* %0, align 8 - %1 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 1 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 - %3 = getelementptr inbounds %c, %c* %2, i32 0, i32 0 - store double 0.000000e+00, double* %3, align 8 - %4 = getelementptr inbounds %c, %c* %2, i32 0, i32 1 - store double 0.000000e+00, double* %4, align 8 - %5 = getelementptr inbounds %c, %c* %2, i32 0, i32 2 - store double 0.000000e+00, double* %5, align 8 - %6 = getelementptr inbounds %c, %c* %2, i32 0, i32 3 - store double 0.000000e+00, double* %6, align 8 - %7 = getelementptr inbounds %c, %c* %2, i32 0, i32 4 - store double 3.300000e+00, double* %7, align 8 - %8 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3 - %9 = getelementptr inbounds %.anon, %.anon* %8, i32 0, i32 0 - store i32 0, i32* %9, align 8 - %10 = getelementptr inbounds %.anon, %.anon* %8, i32 0, i32 1 - store i32 0, i32* %10, align 4 - %11 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4 - %12 = bitcast %.anon.0* %11 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %12, i8 0, i64 8, i1 false) - %13 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5 - store i32 0, i32* %13, align 8 - %14 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 - %15 = getelementptr inbounds %c, %c* %14, i32 0, i32 4 - store double 3.400000e+00, double* %15, align 8 - %16 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0 - %17 = load i32, i32* %16, align 8 - %18 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 - %19 = getelementptr inbounds %c, %c* %18, i32 0, i32 0 - %20 = load double, double* %19, align 8 - %21 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 - %22 = getelementptr inbounds %c, %c* %21, i32 0, i32 3 - %23 = load double, double* %22, align 8 - %24 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 - %25 = getelementptr inbounds %c, %c* %24, i32 0, i32 4 - %26 = load double, double* %25, align 8 - %27 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5 - %28 = load i32, i32* %27, align 8 - %29 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4 - %30 = bitcast %.anon.0* %29 to double* - %31 = load double, double* %30, align 8 - %32 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3 - %33 = getelementptr inbounds %.anon, %.anon* %32, i32 0, i32 0 - %34 = load i32, i32* %33, align 8 - %35 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3 - %36 = getelementptr inbounds %.anon, %.anon* %35, i32 0, i32 1 - %37 = load i32, i32* %36, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str, i32 0, i32 0), i32 %17, double %20, double %23, double %26, i32 %28, double %31, i32 %34, i32 %37) + %0 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 0 + store i32 0, ptr %0, align 8 + %1 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 1 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 + %3 = getelementptr inbounds %c, ptr %2, i32 0, i32 0 + store double 0.000000e+00, ptr %3, align 8 + %4 = getelementptr inbounds %c, ptr %2, i32 0, i32 1 + store double 0.000000e+00, ptr %4, align 8 + %5 = getelementptr inbounds %c, ptr %2, i32 0, i32 2 + store double 0.000000e+00, ptr %5, align 8 + %6 = getelementptr inbounds %c, ptr %2, i32 0, i32 3 + store double 0.000000e+00, ptr %6, align 8 + %7 = getelementptr inbounds %c, ptr %2, i32 0, i32 4 + store double 3.300000e+00, ptr %7, align 8 + %8 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 3 + %9 = getelementptr inbounds %.anon, ptr %8, i32 0, i32 0 + store i32 0, ptr %9, align 8 + %10 = getelementptr inbounds %.anon, ptr %8, i32 0, i32 1 + store i32 0, ptr %10, align 4 + %11 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 4 + call void @llvm.memset.p0.i64(ptr align 8 %11, i8 0, i64 8, i1 false) + %12 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 5 + store i32 0, ptr %12, align 8 + %13 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 + %14 = getelementptr inbounds %c, ptr %13, i32 0, i32 4 + store double 3.400000e+00, ptr %14, align 8 + %15 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 0 + %16 = load i32, ptr %15, align 8 + %17 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 + %18 = getelementptr inbounds %c, ptr %17, i32 0, i32 0 + %19 = load double, ptr %18, align 8 + %20 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 + %21 = getelementptr inbounds %c, ptr %20, i32 0, i32 3 + %22 = load double, ptr %21, align 8 + %23 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 + %24 = getelementptr inbounds %c, ptr %23, i32 0, i32 4 + %25 = load double, ptr %24, align 8 + %26 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 5 + %27 = load i32, ptr %26, align 8 + %28 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 4 + %29 = load double, ptr %28, align 8 + %30 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 3 + %31 = getelementptr inbounds %.anon, ptr %30, i32 0, i32 0 + %32 = load i32, ptr %31, align 8 + %33 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 3 + %34 = getelementptr inbounds %.anon, ptr %33, i32 0, i32 1 + %35 = load i32, ptr %34, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %16, double %19, double %22, double %25, i32 %27, double %29, i32 %32, i32 %35) ret void } diff --git a/test/test_suite/expressions/ternary_bool.c3t b/test/test_suite/expressions/ternary_bool.c3t index f723b3a09..ac559f05f 100644 --- a/test/test_suite/expressions/ternary_bool.c3t +++ b/test/test_suite/expressions/ternary_bool.c3t @@ -18,23 +18,23 @@ fn void main() define void @ternary_bool_main() #0 { entry: %b = alloca i8, align 1 - %c = alloca i8*, align 8 - store i8 1, i8* %b, align 1 - store i8* %b, i8** %c, align 8 - %0 = load i8*, i8** %c, align 8 - %1 = load i8, i8* %0, align 8 + %c = alloca ptr, align 8 + store i8 1, ptr %b, align 1 + store ptr %b, ptr %c, align 8 + %0 = load ptr, ptr %c, align 8 + %1 = load i8, ptr %0, align 8 %2 = trunc i8 %1 to i1 br i1 %2, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %3 = load i8*, i8** %c, align 8 - %4 = load i8, i8* %3, align 8 + %3 = load ptr, ptr %c, align 8 + %4 = load i8, ptr %3, align 8 %5 = trunc i8 %4 to i1 br label %cond.phi cond.rhs: ; preds = %entry - %6 = load i8*, i8** %c, align 8 - %7 = load i8, i8* %6, align 8 + %6 = load ptr, ptr %c, align 8 + %7 = load i8, ptr %6, align 8 %8 = trunc i8 %7 to i1 br label %cond.phi @@ -43,21 +43,21 @@ cond.phi: ; preds = %cond.rhs, %cond.lhs br i1 %val, label %if.then, label %if.exit if.then: ; preds = %cond.phi - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str) br label %if.exit if.exit: ; preds = %if.then, %cond.phi - %9 = load i8, i8* %b, align 1 + %9 = load i8, ptr %b, align 1 %10 = trunc i8 %9 to i1 br i1 %10, label %cond.lhs1, label %cond.rhs2 cond.lhs1: ; preds = %if.exit - %11 = load i8, i8* %b, align 1 + %11 = load i8, ptr %b, align 1 %12 = trunc i8 %11 to i1 br label %cond.phi3 cond.rhs2: ; preds = %if.exit - %13 = load i8, i8* %b, align 1 + %13 = load i8, ptr %b, align 1 %14 = trunc i8 %13 to i1 br label %cond.phi3 @@ -66,18 +66,18 @@ cond.phi3: ; preds = %cond.rhs2, %cond.lh br i1 %val4, label %if.then5, label %if.exit6 if.then5: ; preds = %cond.phi3 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.1) br label %if.exit6 if.exit6: ; preds = %if.then5, %cond.phi3 - %15 = load i8*, i8** %c, align 8 - %16 = load i8, i8* %15, align 8 + %15 = load ptr, ptr %c, align 8 + %16 = load i8, ptr %15, align 8 %17 = trunc i8 %16 to i1 br i1 %17, label %cond.phi8, label %cond.rhs7 cond.rhs7: ; preds = %if.exit6 - %18 = load i8*, i8** %c, align 8 - %19 = load i8, i8* %18, align 8 + %18 = load ptr, ptr %c, align 8 + %19 = load i8, ptr %18, align 8 %20 = trunc i8 %19 to i1 br label %cond.phi8 @@ -86,16 +86,16 @@ cond.phi8: ; preds = %cond.rhs7, %if.exit br i1 %val9, label %if.then10, label %if.exit11 if.then10: ; preds = %cond.phi8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.2) br label %if.exit11 if.exit11: ; preds = %if.then10, %cond.phi8 - %21 = load i8, i8* %b, align 1 + %21 = load i8, ptr %b, align 1 %22 = trunc i8 %21 to i1 br i1 %22, label %cond.phi13, label %cond.rhs12 cond.rhs12: ; preds = %if.exit11 - %23 = load i8, i8* %b, align 1 + %23 = load i8, ptr %b, align 1 %24 = trunc i8 %23 to i1 br label %cond.phi13 @@ -104,7 +104,7 @@ cond.phi13: ; preds = %cond.rhs12, %if.exi br i1 %val14, label %if.then15, label %if.exit16 if.then15: ; preds = %cond.phi13 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.3) br label %if.exit16 if.exit16: ; preds = %if.then15, %cond.phi13 diff --git a/test/test_suite/expressions/type_support.c3t b/test/test_suite/expressions/type_support.c3t index a5cd4933b..b4da30819 100644 --- a/test/test_suite/expressions/type_support.c3t +++ b/test/test_suite/expressions/type_support.c3t @@ -6,72 +6,71 @@ import std::io; macro print_type_info(...) { $for (var $i = 0; $i < $vacount; $i++): - io::printfln("type: %s", $vatype($i).nameof); - io::printfln("%s.sizeof = %d", $vatype($i).nameof, $vatype($i).sizeof); - io::printfln("%s.min = %s", $vatype($i).nameof, $vatype($i).min); - io::printfln("%s.max = %s\n", $vatype($i).nameof, $vatype($i).max); + io::printfn("type: %s", $vatype($i).nameof); + io::printfn("%s.sizeof = %d", $vatype($i).nameof, $vatype($i).sizeof); + io::printfn("%s.min = %s", $vatype($i).nameof, $vatype($i).min); + io::printfn("%s.max = %s\n", $vatype($i).nameof, $vatype($i).max); $endfor; } fn void main() { - io::printfln("Unsigned integers:"); + io::printfn("Unsigned integers:"); print_type_info(char, ushort, uint, ulong, uptr, usz, usz); - io::printfln("Signed integers:"); + io::printfn("Signed integers:"); print_type_info(ichar, short, int, long, iptr, isz, isz); - io::printfln("Floats:"); + io::printfn("Floats:"); print_type_info(float, double); } /* #expect: test.ll - -i64 0 -i64 1 -i8 0 -i8 -1 -i16 0 -i16 -1 -i64 4 -i64 2 -i32 0 -i32 -1 -i64 8 -i64 0 -i64 -1 -i64 8 -i64 0 -i64 -1 -i64 8 -i64 0 -i64 -1 -i64 8 -i64 0 -i64 -1 -i64 1 -i8 -128 -i8 127 -i64 2 -i16 -32768 -i16 32767 -i64 4 -i32 -2147483648 -i32 2147483647 -i64 8 -i64 -9223372036854775808 -i64 9223372036854775807 -i64 8 -i64 -9223372036854775808 -i64 9223372036854775807 -i64 8 -i64 -9223372036854775808 -i64 9223372036854775807 -i64 8 -i64 -9223372036854775808 -i64 9223372036854775807 -i64 4 -float 0xC7EFFFFFE0000000 -float 0x47EFFFFFE0000000 -i64 8 -double 0xFFEFFFFFFFFFFFFF -double 0x7FEFFFFFFFFFFFFF \ No newline at end of file + i64 0 + i64 1 + i8 0 + i8 -1 + i16 0 + i16 -1 + i64 4 + i64 2 + i32 0 + i32 -1 + i64 8 + i64 0 + i64 -1 + i64 8 + i64 0 + i64 -1 + i64 8 + i64 0 + i64 -1 + i64 8 + i64 0 + i64 -1 + i64 1 + i8 -128 + i8 127 + i64 2 + i16 -32768 + i16 32767 + i64 4 + i32 -2147483648 + i32 2147483647 + i64 8 + i64 -9223372036854775808 + i64 9223372036854775807 + i64 8 + i64 -9223372036854775808 + i64 9223372036854775807 + i64 8 + i64 -9223372036854775808 + i64 9223372036854775807 + i64 8 + i64 -9223372036854775808 + i64 9223372036854775807 + i64 4 + float 0xC7EFFFFFE0000000 + float 0x47EFFFFFE0000000 + i64 8 + double 0xFFEFFFFFFFFFFFFF + double 0x7FEFFFFFFFFFFFFF \ No newline at end of file diff --git a/test/test_suite/floats/convert_float.c3t b/test/test_suite/floats/convert_float.c3t index dfe0fdd62..533849d35 100644 --- a/test/test_suite/floats/convert_float.c3t +++ b/test/test_suite/floats/convert_float.c3t @@ -13,12 +13,12 @@ define void @foo_test() #0 { entry: %x = alloca float, align 4 %y = alloca double, align 8 - store float 1.200000e+01, float* %x, align 4 - %0 = load float, float* %x, align 4 + store float 1.200000e+01, ptr %x, align 4 + %0 = load float, ptr %x, align 4 %fmul = fmul float %0, -1.000000e+00 - store float %fmul, float* %x, align 4 - %1 = load float, float* %x, align 4 + store float %fmul, ptr %x, align 4 + %1 = load float, ptr %x, align 4 %fpfpext = fpext float %1 to double - store double %fpfpext, double* %y, align 8 + store double %fpfpext, ptr %y, align 8 ret void -} +} \ No newline at end of file diff --git a/test/test_suite/floats/inf_nan.c3t b/test/test_suite/floats/inf_nan.c3t index b3a776a76..a0c712bc7 100644 --- a/test/test_suite/floats/inf_nan.c3t +++ b/test/test_suite/floats/inf_nan.c3t @@ -9,18 +9,18 @@ fn void main() double x = (double)(z); } -// #expect: fe.ll +/* #expect: fe.ll %z = alloca float, align 4 %z2 = alloca double, align 8 %g = alloca float, align 4 %g2 = alloca double, align 8 %x = alloca double, align 8 - store float 0x7FF0000000000000, float* %z, align 4 - store double 0x7FF0000000000000, double* %z2, align 8 - store float 0x7FF8000000000000, float* %g, align 4 - store double 0x7FF8000000000000, double* %g2, align 8 - %0 = load float, float* %z, align 4 + store float 0x7FF0000000000000, ptr %z, align 4 + store double 0x7FF0000000000000, ptr %z2, align 8 + store float 0x7FF8000000000000, ptr %g, align 4 + store double 0x7FF8000000000000, ptr %g2, align 8 + %0 = load float, ptr %z, align 4 %fpfpext = fpext float %0 to double - store double %fpfpext, double* %x, align 8 + store double %fpfpext, ptr %x, align 8 ret void \ No newline at end of file diff --git a/test/test_suite2/floats/mod.c3t b/test/test_suite/floats/mod.c3t similarity index 100% rename from test/test_suite2/floats/mod.c3t rename to test/test_suite/floats/mod.c3t diff --git a/test/test_suite/from_docs/examples_defer.c3t b/test/test_suite/from_docs/examples_defer.c3t index 31e7136ce..4bc7ddd58 100644 --- a/test/test_suite/from_docs/examples_defer.c3t +++ b/test/test_suite/from_docs/examples_defer.c3t @@ -29,8 +29,8 @@ entry: br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry - %1 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) - %2 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.1, i32 0, i32 0)) #1 + %1 = call i32 @std_io_print(ptr @.str) + %2 = call i32 @std_io_println(ptr @.str.1) #1 ret void if.exit: ; preds = %entry @@ -38,16 +38,16 @@ if.exit: ; preds = %entry br i1 %eq1, label %if.then2, label %if.exit3 if.then2: ; preds = %if.exit - %3 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i32 0, i32 0)) - %4 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0)) - %5 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.4, i32 0, i32 0)) #1 + %3 = call i32 @std_io_print(ptr @.str.2) + %4 = call i32 @std_io_print(ptr @.str.3) + %5 = call i32 @std_io_println(ptr @.str.4) #1 ret void if.exit3: ; preds = %if.exit - %6 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) - %7 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) - %8 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i32 0, i32 0)) - %9 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.8, i32 0, i32 0)) #1 + %6 = call i32 @std_io_print(ptr @.str.5) + %7 = call i32 @std_io_print(ptr @.str.6) + %8 = call i32 @std_io_print(ptr @.str.7) + %9 = call i32 @std_io_println(ptr @.str.8) #1 ret void } @@ -58,4 +58,4 @@ entry: call void @defer1_test(i32 0) call void @defer1_test(i32 10) ret void -} \ No newline at end of file +} diff --git a/test/test_suite/from_docs/examples_forswitch.c3t b/test/test_suite/from_docs/examples_forswitch.c3t index 446c24e63..437e4c4a5 100644 --- a/test/test_suite/from_docs/examples_forswitch.c3t +++ b/test/test_suite/from_docs/examples_forswitch.c3t @@ -92,25 +92,25 @@ fn void demo_enum(Height h) define void @examples_example_for() #0 { entry: %i = alloca i32, align 4 - store i32 0, i32* %i, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %0 = load i32, i32* %i, align 4 + %0 = load i32, ptr %i, align 4 %lt = icmp slt i32 %0, 10 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %1 = load i32, i32* %i, align 4 - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) - %3 = load i32, i32* %i, align 4 + %1 = load i32, ptr %i, align 4 + %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) + %3 = load i32, ptr %i, align 4 %add = add i32 %3, 1 - store i32 %add, i32* %i, align 4 + store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - %4 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %4(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.panic_msg, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.file, i64 0, i64 0), i64 21, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.func, i64 0, i64 0), i64 11, i32 14) + %4 = load ptr, ptr @std_core_builtin_panic, align 8 + call void %4(ptr @.panic_msg, i64 19, ptr @.file, i64 21, ptr @.func, i64 11, i32 14) unreachable unreachable_block: ; No predecessors! @@ -127,11 +127,11 @@ entry: %switch17 = alloca i32, align 4 %a = alloca i32, align 4 %a21 = alloca i32, align 4 - store i32 %0, i32* %switch, align 4 + store i32 %0, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i32, i32* %switch, align 4 + %1 = load i32, ptr %switch, align 4 switch i32 %1, label %switch.exit [ i32 0, label %switch.case i32 1, label %switch.case @@ -139,19 +139,19 @@ switch.entry: ; preds = %entry ] switch.case: ; preds = %switch.entry, %switch.entry - %2 = call i32 @std_io_println(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)) #1 + %2 = call i32 @std_io_println(ptr @.str.1) #1 br label %switch.exit switch.case1: ; preds = %switch.entry - %3 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0)) #1 + %3 = call i32 @std_io_println(ptr @.str.2) #1 br label %switch.exit switch.exit: ; preds = %switch.case1, %switch.case, %switch.entry - store i32 %0, i32* %switch2, align 4 + store i32 %0, ptr %switch2, align 4 br label %switch.entry3 switch.entry3: ; preds = %switch.exit - %4 = load i32, i32* %switch2, align 4 + %4 = load i32, ptr %switch2, align 4 switch i32 %4, label %switch.exit6 [ i32 0, label %switch.case4 i32 1, label %switch.case4 @@ -159,19 +159,19 @@ switch.entry3: ; preds = %switch.exit ] switch.case4: ; preds = %switch.entry3, %switch.entry3 - %5 = call i32 @std_io_println(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0)) #1 + %5 = call i32 @std_io_println(ptr @.str.3) #1 br label %switch.exit6 switch.case5: ; preds = %switch.entry3 - %6 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0)) #1 + %6 = call i32 @std_io_println(ptr @.str.4) #1 br label %switch.exit6 switch.exit6: ; preds = %switch.case5, %switch.case4, %switch.entry3 - store i32 %0, i32* %switch7, align 4 + store i32 %0, ptr %switch7, align 4 br label %switch.entry8 switch.entry8: ; preds = %switch.exit6 - %7 = load i32, i32* %switch7, align 4 + %7 = load i32, ptr %switch7, align 4 switch i32 %7, label %switch.exit12 [ i32 0, label %switch.case9 i32 1, label %switch.case10 @@ -182,18 +182,18 @@ switch.case9: ; preds = %switch.entry8 br label %switch.exit12 switch.case10: ; preds = %switch.entry8 - %8 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #1 + %8 = call i32 @std_io_println(ptr @.str.5) #1 br label %switch.exit12 switch.case11: ; preds = %switch.entry8 br label %switch.exit12 switch.exit12: ; preds = %switch.case11, %switch.case10, %switch.case9, %switch.entry8 - store i32 %0, i32* %switch13, align 4 + store i32 %0, ptr %switch13, align 4 br label %switch.entry14 switch.entry14: ; preds = %switch.exit12 - %9 = load i32, i32* %switch13, align 4 + %9 = load i32, ptr %switch13, align 4 switch i32 %9, label %switch.default [ i32 0, label %switch.case15 i32 1, label %switch.case15 @@ -207,11 +207,11 @@ switch.default: ; preds = %switch.entry14 br label %switch.exit16 switch.exit16: ; preds = %switch.default, %switch.case15 - store i32 %0, i32* %switch17, align 4 + store i32 %0, ptr %switch17, align 4 br label %switch.entry18 switch.entry18: ; preds = %switch.exit16 - %10 = load i32, i32* %switch17, align 4 + %10 = load i32, ptr %switch17, align 4 switch i32 %10, label %switch.exit23 [ i32 0, label %switch.case19 i32 1, label %switch.case20 @@ -219,19 +219,19 @@ switch.entry18: ; preds = %switch.exit16 ] switch.case19: ; preds = %switch.entry18 - store i32 1, i32* %a, align 4 - %11 = call i32 @std_io_println(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) #1 + store i32 1, ptr %a, align 4 + %11 = call i32 @std_io_println(ptr @.str.6) #1 br label %switch.case20 switch.case20: ; preds = %switch.entry18, %switch.case19 - store i32 2, i32* %a21, align 4 - %12 = call i32 @std_io_println(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i32 0, i32 0)) #1 + store i32 2, ptr %a21, align 4 + %12 = call i32 @std_io_println(ptr @.str.7) #1 br label %switch.case22 switch.case22: ; preds = %switch.entry18, %switch.case20 - %13 = call i32 @std_io_println(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.8, i32 0, i32 0)) #1 + %13 = call i32 @std_io_println(ptr @.str.8) #1 br label %switch.exit23 switch.exit23: ; preds = %switch.case22, %switch.entry18 ret void -} +} \ No newline at end of file diff --git a/test/test_suite/from_docs/examples_functionpointer.c3t b/test/test_suite/from_docs/examples_functionpointer.c3t index 81e152e89..cbdc50894 100644 --- a/test/test_suite/from_docs/examples_functionpointer.c3t +++ b/test/test_suite/from_docs/examples_functionpointer.c3t @@ -16,9 +16,10 @@ fn void main() // .. } -// #expect: demo.ll +/* #expect: demo.ll -define i32 @demo_my_callback(i8* %0, i32 %1) #0 { + +define i32 @demo_my_callback(ptr %0, i32 %1) #0 { entry: ret i32 0 } @@ -26,8 +27,8 @@ entry: define void @demo_main() #0 { entry: %result = alloca i32, align 4 - %0 = load i32 (i8*, i32)*, i32 (i8*, i32)** @demo_cb, align 8 - %1 = call i32 %0(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i32 123) - store i32 %1, i32* %result, align 4 + %0 = load ptr, ptr @demo_cb, align 8 + %1 = call i32 %0(ptr @.str, i32 123) + store i32 %1, ptr %result, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite/from_docs/examples_if_catch.c3t b/test/test_suite/from_docs/examples_if_catch.c3t index 5a82a6fa7..24071c8ab 100644 --- a/test/test_suite/from_docs/examples_if_catch.c3t +++ b/test/test_suite/from_docs/examples_if_catch.c3t @@ -26,7 +26,7 @@ fn void! testMayError() fn void main() { - // ratio has a failable type. + // ratio has an optional type. double! ratio = divide(foo(), bar()); // Handle the error @@ -46,25 +46,23 @@ fn void main() /* #expect: demo.ll - -define i64 @demo_divide(double* %0, i32 %1, i32 %2) #0 { +define i64 @demo_divide(ptr %0, i32 %1, i32 %2) #0 { entry: %reterr = alloca i64, align 8 %eq = icmp eq i32 %2, 0 br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry - ret i64 ptrtoint (%.fault* @"demo_MathError$DIVISION_BY_ZERO" to i64) + ret i64 ptrtoint (ptr @"demo_MathError$DIVISION_BY_ZERO" to i64) if.exit: ; preds = %entry %sifp = sitofp i32 %1 to double %sifp1 = sitofp i32 %2 to double %fdiv = fdiv double %sifp, %sifp1 - store double %fdiv, double* %0, align 8 + store double %fdiv, ptr %0, align 8 ret i64 0 } -; Function Attrs: nounwind define i64 @demo_testMayError() #0 { entry: %error_var = alloca i64, align 8 @@ -72,26 +70,25 @@ entry: %reterr = alloca i64, align 8 %0 = call i32 @demo_foo() %1 = call i32 @demo_bar() - %2 = call i64 @demo_divide(double* %retparam, i32 %0, i32 %1) + %2 = call i64 @demo_divide(ptr %retparam, i32 %0, i32 %1) %not_err = icmp eq i64 %2, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %2, i64* %error_var, align 8 + store i64 %2, ptr %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %3 = load i64, i64* %error_var, align 8 + %3 = load i64, ptr %error_var, align 8 ret i64 %3 noerr_block: ; preds = %after_check ret i64 0 } -; Function Attrs: nounwind define void @demo_main() #0 { entry: %ratio = alloca double, align 8 @@ -101,63 +98,63 @@ entry: %switch = alloca i64, align 8 %0 = call i32 @demo_foo() %1 = call i32 @demo_bar() - %2 = call i64 @demo_divide(double* %retparam, i32 %0, i32 %1) + %2 = call i64 @demo_divide(ptr %retparam, i32 %0, i32 %1) %not_err = icmp eq i64 %2, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %2, i64* %ratio.f, align 8 + store i64 %2, ptr %ratio.f, align 8 br label %after_assign after_check: ; preds = %entry - %3 = load double, double* %retparam, align 8 - store double %3, double* %ratio, align 8 - store i64 0, i64* %ratio.f, align 8 + %3 = load double, ptr %retparam, align 8 + store double %3, ptr %ratio, align 8 + store i64 0, ptr %ratio.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional br label %testblock testblock: ; preds = %after_assign - %optval = load i64, i64* %ratio.f, align 8 + %optval = load i64, ptr %ratio.f, align 8 %not_err1 = icmp eq i64 %optval, 0 br i1 %not_err1, label %after_check3, label %assign_optional2 assign_optional2: ; preds = %testblock - store i64 %optval, i64* %err, align 8 + store i64 %optval, ptr %err, align 8 br label %end_block after_check3: ; preds = %testblock - store i64 0, i64* %err, align 8 + store i64 0, ptr %err, align 8 br label %end_block end_block: ; preds = %after_check3, %assign_optional2 - %4 = load i64, i64* %err, align 8 + %4 = load i64, ptr %err, align 8 %neq = icmp ne i64 %4, 0 br i1 %neq, label %if.then, label %if.exit if.then: ; preds = %end_block - store i64 %4, i64* %switch, align 8 + store i64 %4, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %if.then - %5 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.fault* @"demo_MathError$DIVISION_BY_ZERO" to i64), %5 + %5 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"demo_MathError$DIVISION_BY_ZERO" to i64), %5 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str, i32 0, i32 0)) + %6 = call i32 (ptr, ...) @printf(ptr @.str) ret void next_if: ; preds = %switch.entry br label %switch.default switch.default: ; preds = %next_if - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i32 0, i32 0)) + %7 = call i32 (ptr, ...) @printf(ptr @.str.1) ret void if.exit: ; preds = %end_block - %8 = load double, double* %ratio, align 8 - %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i32 0, i32 0), double %8) + %8 = load double, ptr %ratio, align 8 + %9 = call i32 (ptr, ...) @printf(ptr @.str.2, double %8) ret void } \ No newline at end of file diff --git a/test/test_suite/from_docs/examples_macro_function.c3t b/test/test_suite/from_docs/examples_macro_function.c3t index 2e071cb37..20cd4ae5c 100644 --- a/test/test_suite/from_docs/examples_macro_function.c3t +++ b/test/test_suite/from_docs/examples_macro_function.c3t @@ -33,18 +33,18 @@ define i32 @example_test() #0 { entry: %a = alloca i32, align 4 %b = alloca i32, align 4 - %a1 = alloca i32 (i32)*, align 8 + %a1 = alloca ptr, align 8 %b2 = alloca i32, align 4 - store i32 2, i32* %a, align 4 - store i32 3, i32* %b, align 4 - store i32 (i32)* @example_square, i32 (i32)** %a1, align 8 - store i32 2, i32* %b2, align 4 - %0 = load i32 (i32)*, i32 (i32)** %a1, align 8 - %1 = load i32, i32* %b2, align 4 + store i32 2, ptr %a, align 4 + store i32 3, ptr %b, align 4 + store ptr @example_square, ptr %a1, align 8 + store i32 2, ptr %b2, align 4 + %0 = load ptr, ptr %a1, align 8 + %1 = load i32, ptr %b2, align 4 %2 = call i32 %0(i32 %1) - %3 = load i32, i32* %a, align 4 + %3 = load i32, ptr %a, align 4 %add = add i32 %2, %3 - %4 = load i32, i32* %b, align 4 + %4 = load i32, ptr %b, align 4 %add3 = add i32 %add, %4 ret i32 %add3 } \ No newline at end of file diff --git a/test/test_suite/functions/assorted_tests.c3t b/test/test_suite/functions/assorted_tests.c3t index 93dc4989b..0691478a4 100644 --- a/test/test_suite/functions/assorted_tests.c3t +++ b/test/test_suite/functions/assorted_tests.c3t @@ -50,17 +50,18 @@ fn void denormalize(InternalFPF* ptr) /* #expect: test.ll + define i32 @test_foo1() #0 { entry: - %pp = alloca i8*, align 8 + %pp = alloca ptr, align 8 %w_cnt = alloca i32, align 4 - %0 = load i32, i32* %w_cnt, align 4 - %1 = load i8*, i8** %pp, align 8 - %2 = load i8, i8* %1, align 8 + %0 = load i32, ptr %w_cnt, align 4 + %1 = load ptr, ptr %pp, align 8 + %2 = load i8, ptr %1, align 8 %zext = zext i8 %2 to i32 %add = add i32 %0, %zext - store i32 %add, i32* %w_cnt, align 4 - %3 = load i32, i32* %w_cnt, align 4 + store i32 %add, ptr %w_cnt, align 4 + %3 = load i32, ptr %w_cnt, align 4 ret i32 %3 } @@ -72,7 +73,7 @@ entry: ret void } -define i32 @test_trys(i8* %0, i32 %1) #0 { +define i32 @test_trys(ptr %0, i32 %1) #0 { entry: %asa = alloca i32, align 4 %val = alloca double, align 8 @@ -81,29 +82,29 @@ entry: br i1 %intbool, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, i32* %lls, align 4 - %3 = load i32, i32* %asa, align 4 + %2 = load i32, ptr %lls, align 4 + %3 = load i32, ptr %asa, align 4 %add = add i32 %2, %3 - store i32 %add, i32* %asa, align 4 + store i32 %add, ptr %asa, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry - %4 = load i32, i32* %asa, align 4 - %5 = load double, double* %val, align 8 + %4 = load i32, ptr %asa, align 4 + %5 = load double, ptr %val, align 8 %fpsi = fptosi double %5 to i32 %add1 = add i32 %4, %fpsi ret i32 %add1 } -define void @test_setInternalFPFZero(%InternalFPF* %0) #1 { +define void @test_setInternalFPFZero(ptr %0) #1 { entry: - %1 = getelementptr inbounds %InternalFPF, %InternalFPF* %0, i32 0, i32 0 - store i8 0, i8* %1, align 8 + %1 = getelementptr inbounds %InternalFPF, ptr %0, i32 0, i32 0 + store i8 0, ptr %1, align 8 ret void } -define void @test_denormalize(%InternalFPF* %0) #0 { +define void @test_denormalize(ptr %0) #0 { entry: - call void @test_setInternalFPFZero(%InternalFPF* %0) + call void @test_setInternalFPFZero(ptr %0) ret void } diff --git a/test/test_suite/functions/defered_default_arguments.c3t b/test/test_suite/functions/defered_default_arguments.c3t index e7ecc1211..2510dff2f 100644 --- a/test/test_suite/functions/defered_default_arguments.c3t +++ b/test/test_suite/functions/defered_default_arguments.c3t @@ -41,14 +41,14 @@ entry: %0 = call i32 @test2_foo() call void @test_test(i32 3, i32 %0) call void @test_test(i32 1, i32 32) - %1 = load i32, i32* @"main$x", align 4 + %1 = load i32, ptr @"main$x", align 4 %add = add i32 %1, 1 - store i32 %add, i32* @"main$x", align 4 + store i32 %add, ptr @"main$x", align 4 %2 = call i32 @test2_foo() call void @test_test(i32 %add, i32 %2) - %3 = load i32, i32* @"main$x.1", align 4 + %3 = load i32, ptr @"main$x.1", align 4 %add1 = add i32 %3, 1 - store i32 %add1, i32* @"main$x.1", align 4 + store i32 %add1, ptr @"main$x.1", align 4 %4 = call i32 @test2_foo() call void @test_test(i32 %add1, i32 %4) ret void diff --git a/test/test_suite/functions/func_ptr_conversions_and_names.c3t b/test/test_suite/functions/func_ptr_conversions_and_names.c3t index c0219d41b..684b556df 100644 --- a/test/test_suite/functions/func_ptr_conversions_and_names.c3t +++ b/test/test_suite/functions/func_ptr_conversions_and_names.c3t @@ -15,21 +15,20 @@ fn void main() { Func a = &test; Func b = &test2; - io::printfln("%d", a(.y = 123)); - io::printfln("%d", (&test2)()); + io::printfn("%d", a(.y = 123)); + io::printfn("%d", (&test2)()); FuncSame z = &test2; - io::printfln("%d", z()); - io::printfln("%s", $typeof(b ? &test2 : &test).qnameof); - io::printfln("%s", $typeof(b ? &test2 : &test).nameof); - io::printfln("%s", $typeof(&test2).qnameof); - io::printfln("%s", $typeof(&test2).nameof); - io::printfln("%s", $typeof(b ? &test4 : &test3).nameof); + io::printfn("%d", z()); + io::printfn("%s", $typeof(b ? &test2 : &test).qnameof); + io::printfn("%s", $typeof(b ? &test2 : &test).nameof); + io::printfn("%s", $typeof(&test2).qnameof); + io::printfn("%s", $typeof(&test2).nameof); + io::printfn("%s", $typeof(b ? &test4 : &test3).nameof); $typeof(b ? &test2 : &test) y = &test2; typeid zfoke = $typeof(y).typeid; } - /* #expect: test.ll @.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 @@ -39,256 +38,167 @@ fn void main() @.str.3 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.4 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 @"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$a12$char" = linkonce constant %.introspect { i8 15, i64 12, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 12, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a12$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a12$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$a12$char" = linkonce constant %.introspect { i8 15, i64 12, i64 ptrtoint (ptr @"ct$char" to i64), i64 12, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a12$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$a12$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 @.str.5 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.6 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 @.str.7 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.8 = private unnamed_addr constant [13 x i8] c"test::test2*\00", align 1 @.str.9 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.10 = private unnamed_addr constant [7 x i8] c"test2*\00", align 1 -@"ct$a6$char" = linkonce constant %.introspect { i8 15, i64 6, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 6, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a6$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a6$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$a6$char" = linkonce constant %.introspect { i8 15, i64 6, i64 ptrtoint (ptr @"ct$char" to i64), i64 6, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a6$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$a6$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 @.str.11 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 @.str.12 = private unnamed_addr constant [14 x i8] c"fn int!(int)*\00", align 1 -@"ct$a13$char" = linkonce constant %.introspect { i8 15, i64 13, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 13, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a13$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a13$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$a13$char" = linkonce constant %.introspect { i8 15, i64 13, i64 ptrtoint (ptr @"ct$char" to i64), i64 13, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a13$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$a13$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 @"ct$fn$int$int$" = linkonce constant %.introspect { i8 13, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$p$fn$int$int$" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$fn$int$int$" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 - +@"ct$p$fn$int$int$" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$fn$int$int$" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 define void @test_main() #0 { entry: - %a = alloca i32 (i32)*, align 8 - %b = alloca i32 (i32)*, align 8 + %a = alloca ptr, align 8 + %b = alloca ptr, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [1 x %variant], align 16 - %taddr4 = alloca i32, align 4 - %taddr5 = alloca %"variant[]", align 8 - %z = alloca i32 (i32)*, align 8 - %retparam11 = alloca i64, align 8 - %varargslots12 = alloca [1 x %variant], align 16 - %taddr13 = alloca i32, align 4 - %taddr14 = alloca %"variant[]", align 8 - %retparam20 = alloca i64, align 8 - %varargslots21 = alloca [1 x %variant], align 16 - %taddr22 = alloca [12 x i8]*, align 8 - %taddr23 = alloca %"variant[]", align 8 - %retparam29 = alloca i64, align 8 - %varargslots30 = alloca [1 x %variant], align 16 - %taddr31 = alloca [12 x i8]*, align 8 - %taddr32 = alloca %"variant[]", align 8 - %retparam38 = alloca i64, align 8 - %varargslots39 = alloca [1 x %variant], align 16 - %taddr40 = alloca [12 x i8]*, align 8 - %taddr41 = alloca %"variant[]", align 8 - %retparam47 = alloca i64, align 8 - %varargslots48 = alloca [1 x %variant], align 16 - %taddr49 = alloca [6 x i8]*, align 8 - %taddr50 = alloca %"variant[]", align 8 - %retparam56 = alloca i64, align 8 - %varargslots57 = alloca [1 x %variant], align 16 - %taddr58 = alloca [13 x i8]*, align 8 - %taddr59 = alloca %"variant[]", align 8 - %y = alloca i32 (i32)*, align 8 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %taddr3 = alloca i32, align 4 + %z = alloca ptr, align 8 + %retparam7 = alloca i64, align 8 + %varargslots8 = alloca [1 x %variant], align 16 + %taddr9 = alloca i32, align 4 + %retparam13 = alloca i64, align 8 + %varargslots14 = alloca [1 x %variant], align 16 + %taddr15 = alloca ptr, align 8 + %retparam19 = alloca i64, align 8 + %varargslots20 = alloca [1 x %variant], align 16 + %taddr21 = alloca ptr, align 8 + %retparam25 = alloca i64, align 8 + %varargslots26 = alloca [1 x %variant], align 16 + %taddr27 = alloca ptr, align 8 + %retparam31 = alloca i64, align 8 + %varargslots32 = alloca [1 x %variant], align 16 + %taddr33 = alloca ptr, align 8 + %retparam37 = alloca i64, align 8 + %varargslots38 = alloca [1 x %variant], align 16 + %taddr39 = alloca ptr, align 8 + %y = alloca ptr, align 8 %zfoke = alloca i64, align 8 - store i32 (i32)* @test_test, i32 (i32)** %a, align 8 - store i32 (i32)* @test_test2, i32 (i32)** %b, align 8 - %0 = load i32 (i32)*, i32 (i32)** %a, align 8 + store ptr @test_test, ptr %a, align 8 + store ptr @test_test2, ptr %b, align 8 + %0 = load ptr, ptr %a, align 8 %1 = call i32 %0(i32 123) - store i32 %1, i32* %taddr, align 4 - %2 = bitcast i32* %taddr to i8* - %3 = insertvalue %variant undef, i8* %2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %4, %variant* %5, align 16 - %6 = bitcast [1 x %variant]* %varargslots to %variant* - %7 = insertvalue %"variant[]" undef, %variant* %6, 0 - %8 = insertvalue %"variant[]" %7, i64 1, 1 - store %"variant[]" %8, %"variant[]"* %taddr1, align 8 - %9 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 - %lo = load i8*, i8** %10, align 8 - %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 - %hi = load i64, i64* %11, align 8 - %12 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %12, 0 + store i32 %1, ptr %taddr, align 4 + %2 = insertvalue %variant undef, ptr %taddr, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %3, ptr %4, align 16 + %5 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %5, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %13 = call i32 @test_test2(i32 3) - store i32 %13, i32* %taddr4, align 4 - %14 = bitcast i32* %taddr4 to i8* - %15 = insertvalue %variant undef, i8* %14, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 - store %variant %16, %variant* %17, align 16 - %18 = bitcast [1 x %variant]* %varargslots3 to %variant* - %19 = insertvalue %"variant[]" undef, %variant* %18, 0 - %20 = insertvalue %"variant[]" %19, i64 1, 1 - store %"variant[]" %20, %"variant[]"* %taddr5, align 8 - %21 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 - %lo6 = load i8*, i8** %22, align 8 - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 - %hi7 = load i64, i64* %23, align 8 - %24 = call i64 @std_io_printfln(i64* %retparam2, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %24, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + %6 = call i32 @test_test2(i32 3) + store i32 %6, ptr %taddr3, align 4 + %7 = insertvalue %variant undef, ptr %taddr3, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %9 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %8, ptr %9, align 16 + %10 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.1, i64 2, ptr %varargslots2, i64 1) + %not_err4 = icmp eq i64 %10, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %voiderr - br label %voiderr10 +after_check5: ; preds = %voiderr + br label %voiderr6 -voiderr10: ; preds = %after_check9, %voiderr - store i32 (i32)* @test_test2, i32 (i32)** %z, align 8 - %25 = load i32 (i32)*, i32 (i32)** %z, align 8 - %26 = call i32 %25(i32 444) - store i32 %26, i32* %taddr13, align 4 - %27 = bitcast i32* %taddr13 to i8* - %28 = insertvalue %variant undef, i8* %27, 0 - %29 = insertvalue %variant %28, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %30 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 - store %variant %29, %variant* %30, align 16 - %31 = bitcast [1 x %variant]* %varargslots12 to %variant* - %32 = insertvalue %"variant[]" undef, %variant* %31, 0 - %33 = insertvalue %"variant[]" %32, i64 1, 1 - store %"variant[]" %33, %"variant[]"* %taddr14, align 8 - %34 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* - %35 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %34, i32 0, i32 0 - %lo15 = load i8*, i8** %35, align 8 - %36 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %34, i32 0, i32 1 - %hi16 = load i64, i64* %36, align 8 - %37 = call i64 @std_io_printfln(i64* %retparam11, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo15, i64 %hi16) - %not_err17 = icmp eq i64 %37, 0 - br i1 %not_err17, label %after_check18, label %voiderr19 +voiderr6: ; preds = %after_check5, %voiderr + store ptr @test_test2, ptr %z, align 8 + %11 = load ptr, ptr %z, align 8 + %12 = call i32 %11(i32 444) + store i32 %12, ptr %taddr9, align 4 + %13 = insertvalue %variant undef, ptr %taddr9, 0 + %14 = insertvalue %variant %13, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %15 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 + store %variant %14, ptr %15, align 16 + %16 = call i64 @std_io_printfn(ptr %retparam7, ptr @.str.2, i64 2, ptr %varargslots8, i64 1) + %not_err10 = icmp eq i64 %16, 0 + br i1 %not_err10, label %after_check11, label %voiderr12 -after_check18: ; preds = %voiderr10 - br label %voiderr19 +after_check11: ; preds = %voiderr6 + br label %voiderr12 -voiderr19: ; preds = %after_check18, %voiderr10 - store [12 x i8]* bitcast ([13 x i8]* @.str.4 to [12 x i8]*), [12 x i8]** %taddr22, align 8 - %38 = bitcast [12 x i8]** %taddr22 to i8* - %39 = insertvalue %variant undef, i8* %38, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$p$a12$char" to i64), 1 - %41 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots21, i64 0, i64 0 - store %variant %40, %variant* %41, align 16 - %42 = bitcast [1 x %variant]* %varargslots21 to %variant* - %43 = insertvalue %"variant[]" undef, %variant* %42, 0 - %44 = insertvalue %"variant[]" %43, i64 1, 1 - store %"variant[]" %44, %"variant[]"* %taddr23, align 8 - %45 = bitcast %"variant[]"* %taddr23 to { i8*, i64 }* - %46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0 - %lo24 = load i8*, i8** %46, align 8 - %47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1 - %hi25 = load i64, i64* %47, align 8 - %48 = call i64 @std_io_printfln(i64* %retparam20, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo24, i64 %hi25) - %not_err26 = icmp eq i64 %48, 0 - br i1 %not_err26, label %after_check27, label %voiderr28 +voiderr12: ; preds = %after_check11, %voiderr6 + store ptr @.str.4, ptr %taddr15, align 8 + %17 = insertvalue %variant undef, ptr %taddr15, 0 + %18 = insertvalue %variant %17, i64 ptrtoint (ptr @"ct$p$a12$char" to i64), 1 + %19 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 + store %variant %18, ptr %19, align 16 + %20 = call i64 @std_io_printfn(ptr %retparam13, ptr @.str.3, i64 2, ptr %varargslots14, i64 1) + %not_err16 = icmp eq i64 %20, 0 + br i1 %not_err16, label %after_check17, label %voiderr18 -after_check27: ; preds = %voiderr19 - br label %voiderr28 +after_check17: ; preds = %voiderr12 + br label %voiderr18 -voiderr28: ; preds = %after_check27, %voiderr19 - store [12 x i8]* bitcast ([13 x i8]* @.str.6 to [12 x i8]*), [12 x i8]** %taddr31, align 8 - %49 = bitcast [12 x i8]** %taddr31 to i8* - %50 = insertvalue %variant undef, i8* %49, 0 - %51 = insertvalue %variant %50, i64 ptrtoint (%.introspect* @"ct$p$a12$char" to i64), 1 - %52 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots30, i64 0, i64 0 - store %variant %51, %variant* %52, align 16 - %53 = bitcast [1 x %variant]* %varargslots30 to %variant* - %54 = insertvalue %"variant[]" undef, %variant* %53, 0 - %55 = insertvalue %"variant[]" %54, i64 1, 1 - store %"variant[]" %55, %"variant[]"* %taddr32, align 8 - %56 = bitcast %"variant[]"* %taddr32 to { i8*, i64 }* - %57 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 0 - %lo33 = load i8*, i8** %57, align 8 - %58 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 1 - %hi34 = load i64, i64* %58, align 8 - %59 = call i64 @std_io_printfln(i64* %retparam29, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i32 0, i32 0), i64 2, i8* %lo33, i64 %hi34) - %not_err35 = icmp eq i64 %59, 0 - br i1 %not_err35, label %after_check36, label %voiderr37 +voiderr18: ; preds = %after_check17, %voiderr12 + store ptr @.str.6, ptr %taddr21, align 8 + %21 = insertvalue %variant undef, ptr %taddr21, 0 + %22 = insertvalue %variant %21, i64 ptrtoint (ptr @"ct$p$a12$char" to i64), 1 + %23 = getelementptr inbounds [1 x %variant], ptr %varargslots20, i64 0, i64 0 + store %variant %22, ptr %23, align 16 + %24 = call i64 @std_io_printfn(ptr %retparam19, ptr @.str.5, i64 2, ptr %varargslots20, i64 1) + %not_err22 = icmp eq i64 %24, 0 + br i1 %not_err22, label %after_check23, label %voiderr24 -after_check36: ; preds = %voiderr28 - br label %voiderr37 +after_check23: ; preds = %voiderr18 + br label %voiderr24 -voiderr37: ; preds = %after_check36, %voiderr28 - store [12 x i8]* bitcast ([13 x i8]* @.str.8 to [12 x i8]*), [12 x i8]** %taddr40, align 8 - %60 = bitcast [12 x i8]** %taddr40 to i8* - %61 = insertvalue %variant undef, i8* %60, 0 - %62 = insertvalue %variant %61, i64 ptrtoint (%.introspect* @"ct$p$a12$char" to i64), 1 - %63 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots39, i64 0, i64 0 - store %variant %62, %variant* %63, align 16 - %64 = bitcast [1 x %variant]* %varargslots39 to %variant* - %65 = insertvalue %"variant[]" undef, %variant* %64, 0 - %66 = insertvalue %"variant[]" %65, i64 1, 1 - store %"variant[]" %66, %"variant[]"* %taddr41, align 8 - %67 = bitcast %"variant[]"* %taddr41 to { i8*, i64 }* - %68 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %67, i32 0, i32 0 - %lo42 = load i8*, i8** %68, align 8 - %69 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %67, i32 0, i32 1 - %hi43 = load i64, i64* %69, align 8 - %70 = call i64 @std_io_printfln(i64* %retparam38, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.7, i32 0, i32 0), i64 2, i8* %lo42, i64 %hi43) - %not_err44 = icmp eq i64 %70, 0 - br i1 %not_err44, label %after_check45, label %voiderr46 +voiderr24: ; preds = %after_check23, %voiderr18 + store ptr @.str.8, ptr %taddr27, align 8 + %25 = insertvalue %variant undef, ptr %taddr27, 0 + %26 = insertvalue %variant %25, i64 ptrtoint (ptr @"ct$p$a12$char" to i64), 1 + %27 = getelementptr inbounds [1 x %variant], ptr %varargslots26, i64 0, i64 0 + store %variant %26, ptr %27, align 16 + %28 = call i64 @std_io_printfn(ptr %retparam25, ptr @.str.7, i64 2, ptr %varargslots26, i64 1) + %not_err28 = icmp eq i64 %28, 0 + br i1 %not_err28, label %after_check29, label %voiderr30 -after_check45: ; preds = %voiderr37 - br label %voiderr46 +after_check29: ; preds = %voiderr24 + br label %voiderr30 -voiderr46: ; preds = %after_check45, %voiderr37 - store [6 x i8]* bitcast ([7 x i8]* @.str.10 to [6 x i8]*), [6 x i8]** %taddr49, align 8 - %71 = bitcast [6 x i8]** %taddr49 to i8* - %72 = insertvalue %variant undef, i8* %71, 0 - %73 = insertvalue %variant %72, i64 ptrtoint (%.introspect* @"ct$p$a6$char" to i64), 1 - %74 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots48, i64 0, i64 0 - store %variant %73, %variant* %74, align 16 - %75 = bitcast [1 x %variant]* %varargslots48 to %variant* - %76 = insertvalue %"variant[]" undef, %variant* %75, 0 - %77 = insertvalue %"variant[]" %76, i64 1, 1 - store %"variant[]" %77, %"variant[]"* %taddr50, align 8 - %78 = bitcast %"variant[]"* %taddr50 to { i8*, i64 }* - %79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 0 - %lo51 = load i8*, i8** %79, align 8 - %80 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 1 - %hi52 = load i64, i64* %80, align 8 - %81 = call i64 @std_io_printfln(i64* %retparam47, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0), i64 2, i8* %lo51, i64 %hi52) - %not_err53 = icmp eq i64 %81, 0 - br i1 %not_err53, label %after_check54, label %voiderr55 +voiderr30: ; preds = %after_check29, %voiderr24 + store ptr @.str.10, ptr %taddr33, align 8 + %29 = insertvalue %variant undef, ptr %taddr33, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$p$a6$char" to i64), 1 + %31 = getelementptr inbounds [1 x %variant], ptr %varargslots32, i64 0, i64 0 + store %variant %30, ptr %31, align 16 + %32 = call i64 @std_io_printfn(ptr %retparam31, ptr @.str.9, i64 2, ptr %varargslots32, i64 1) + %not_err34 = icmp eq i64 %32, 0 + br i1 %not_err34, label %after_check35, label %voiderr36 -after_check54: ; preds = %voiderr46 - br label %voiderr55 +after_check35: ; preds = %voiderr30 + br label %voiderr36 -voiderr55: ; preds = %after_check54, %voiderr46 - store [13 x i8]* bitcast ([14 x i8]* @.str.12 to [13 x i8]*), [13 x i8]** %taddr58, align 8 - %82 = bitcast [13 x i8]** %taddr58 to i8* - %83 = insertvalue %variant undef, i8* %82, 0 - %84 = insertvalue %variant %83, i64 ptrtoint (%.introspect* @"ct$p$a13$char" to i64), 1 - %85 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots57, i64 0, i64 0 - store %variant %84, %variant* %85, align 16 - %86 = bitcast [1 x %variant]* %varargslots57 to %variant* - %87 = insertvalue %"variant[]" undef, %variant* %86, 0 - %88 = insertvalue %"variant[]" %87, i64 1, 1 - store %"variant[]" %88, %"variant[]"* %taddr59, align 8 - %89 = bitcast %"variant[]"* %taddr59 to { i8*, i64 }* - %90 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 0 - %lo60 = load i8*, i8** %90, align 8 - %91 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 1 - %hi61 = load i64, i64* %91, align 8 - %92 = call i64 @std_io_printfln(i64* %retparam56, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.11, i32 0, i32 0), i64 2, i8* %lo60, i64 %hi61) - %not_err62 = icmp eq i64 %92, 0 - br i1 %not_err62, label %after_check63, label %voiderr64 +voiderr36: ; preds = %after_check35, %voiderr30 + store ptr @.str.12, ptr %taddr39, align 8 + %33 = insertvalue %variant undef, ptr %taddr39, 0 + %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$p$a13$char" to i64), 1 + %35 = getelementptr inbounds [1 x %variant], ptr %varargslots38, i64 0, i64 0 + store %variant %34, ptr %35, align 16 + %36 = call i64 @std_io_printfn(ptr %retparam37, ptr @.str.11, i64 2, ptr %varargslots38, i64 1) + %not_err40 = icmp eq i64 %36, 0 + br i1 %not_err40, label %after_check41, label %voiderr42 -after_check63: ; preds = %voiderr55 - br label %voiderr64 +after_check41: ; preds = %voiderr36 + br label %voiderr42 -voiderr64: ; preds = %after_check63, %voiderr55 - store i32 (i32)* @test_test2, i32 (i32)** %y, align 8 - store i64 ptrtoint (%.introspect* @"ct$p$fn$int$int$" to i64), i64* %zfoke, align 8 +voiderr42: ; preds = %after_check41, %voiderr36 + store ptr @test_test2, ptr %y, align 8 + store i64 ptrtoint (ptr @"ct$p$fn$int$int$" to i64), ptr %zfoke, align 8 ret void } diff --git a/test/test_suite/functions/naked_function.c3t b/test/test_suite/functions/naked_function.c3t index 55830a596..86580849e 100644 --- a/test/test_suite/functions/naked_function.c3t +++ b/test/test_suite/functions/naked_function.c3t @@ -5,7 +5,7 @@ fn void test(int i) @naked } -/* #expect: naked_function.ll +// #expect: naked_function.ll define void @naked_function_test(i32 %0) #0 { entry: diff --git a/test/test_suite/functions/returning_void.c3t b/test/test_suite/functions/returning_void.c3t index 887a270ae..6b6d3bd50 100644 --- a/test/test_suite/functions/returning_void.c3t +++ b/test/test_suite/functions/returning_void.c3t @@ -7,8 +7,8 @@ fn void test1() // #expect: returning_void.ll %x = alloca i32, align 4 - store i32 0, i32* %x, align 4 - %0 = load i32, i32* %x, align 4 + store i32 0, ptr %x, align 4 + %0 = load i32, ptr %x, align 4 %eq = icmp eq i32 %0, 0 br i1 %eq, label %if.then, label %if.exit diff --git a/test/test_suite/functions/simple_test.c3t b/test/test_suite/functions/simple_test.c3t index 889c1be63..cd197087a 100644 --- a/test/test_suite/functions/simple_test.c3t +++ b/test/test_suite/functions/simple_test.c3t @@ -15,16 +15,16 @@ fn int foo() define i32 @simple_test_foo() #0 { entry: - %pp = alloca i8*, align 8 + %pp = alloca ptr, align 8 %w_cnt = alloca i32, align 4 - store i8* null, i8** %pp, align 8 - store i32 0, i32* %w_cnt, align 4 - %0 = load i32, i32* %w_cnt, align 4 - %1 = load i8*, i8** %pp, align 8 - %2 = load i8, i8* %1, align 8 + store ptr null, ptr %pp, align 8 + store i32 0, ptr %w_cnt, align 4 + %0 = load i32, ptr %w_cnt, align 4 + %1 = load ptr, ptr %pp, align 8 + %2 = load i8, ptr %1, align 8 %zext = zext i8 %2 to i32 %add = add i32 %0, %zext - store i32 %add, i32* %w_cnt, align 4 - %3 = load i32, i32* %w_cnt, align 4 + store i32 %add, ptr %w_cnt, align 4 + %3 = load i32, ptr %w_cnt, align 4 ret i32 %3 } \ No newline at end of file diff --git a/test/test_suite/functions/splat.c3t b/test/test_suite/functions/splat.c3t index 3a7bd0ddb..de3dae794 100644 --- a/test/test_suite/functions/splat.c3t +++ b/test/test_suite/functions/splat.c3t @@ -15,55 +15,29 @@ fn void test() /* #expect: splat.ll + +declare i32 @sum_us(ptr, i64) #0 + %varargslots = alloca [3 x i32], align 4 - %taddr = alloca %"int[]", align 8 %x = alloca [3 x i32], align 4 %z = alloca %"int[]", align 8 - %taddr1 = alloca %"int[]", align 8 - %taddr6 = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 0 - store i32 1, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 1 - store i32 2, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 2 - store i32 3, i32* %2, align 4 - %3 = bitcast [3 x i32]* %varargslots to i32* - %4 = insertvalue %"int[]" undef, i32* %3, 0 + %0 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 0 + store i32 1, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 1 + store i32 2, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 2 + store i32 3, ptr %2, align 4 + %3 = call i32 @sum_us(ptr %varargslots, i64 3) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %4 = insertvalue %"int[]" undef, ptr %x, 0 %5 = insertvalue %"int[]" %4, i64 3, 1 - store %"int[]" %5, %"int[]"* %taddr, align 8 - %6 = bitcast %"int[]"* %taddr to { i8*, i64 }* - %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %6, i32 0, i32 0 - %lo = load i8*, i8** %7, align 8 - %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %6, i32 0, i32 1 - %hi = load i64, i64* %8, align 8 - %9 = call i32 @sum_us(i8* %lo, i64 %hi) - %10 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %10, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %11 = bitcast [3 x i32]* %x to i32* - %12 = insertvalue %"int[]" undef, i32* %11, 0 - %13 = insertvalue %"int[]" %12, i64 3, 1 - store %"int[]" %13, %"int[]"* %z, align 8 - %14 = bitcast [3 x i32]* %x to i32* - %15 = insertvalue %"int[]" undef, i32* %14, 0 - %16 = insertvalue %"int[]" %15, i64 3, 1 - store %"int[]" %16, %"int[]"* %taddr1, align 8 - %17 = bitcast %"int[]"* %taddr1 to { i8*, i64 }* - %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 - %lo2 = load i8*, i8** %18, align 8 - %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 - %hi3 = load i64, i64* %19, align 8 - %20 = call i32 @sum_us(i8* %lo2, i64 %hi3) - %21 = bitcast %"int[]"* %z to { i8*, i64 }* - %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 - %lo4 = load i8*, i8** %22, align 8 - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 - %hi5 = load i64, i64* %23, align 8 - %24 = call i32 @sum_us(i8* %lo4, i64 %hi5) - store %"int[]" zeroinitializer, %"int[]"* %taddr6, align 8 - %25 = bitcast %"int[]"* %taddr6 to { i8*, i64 }* - %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 0 - %lo7 = load i8*, i8** %26, align 8 - %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 1 - %hi8 = load i64, i64* %27, align 8 - %28 = call i32 @sum_us(i8* %lo7, i64 %hi8) + store %"int[]" %5, ptr %z, align 8 + %6 = call i32 @sum_us(ptr %x, i64 3) + %7 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 0 + %lo = load ptr, ptr %7, align 8 + %8 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 1 + %hi = load i64, ptr %8, align 8 + %9 = call i32 @sum_us(ptr %lo, i64 %hi) + %10 = call i32 @sum_us(ptr null, i64 0) ret void +} \ No newline at end of file diff --git a/test/test_suite/functions/splat_aarch64.c3t b/test/test_suite/functions/splat_aarch64.c3t index 42a088556..902213b4b 100644 --- a/test/test_suite/functions/splat_aarch64.c3t +++ b/test/test_suite/functions/splat_aarch64.c3t @@ -15,7 +15,8 @@ fn void test() /* #expect: splat.ll -%"int[]" = type { i32*, i64 } + +%"int[]" = type { ptr, i64 } declare i32 @sum_us([2 x i64]) #0 @@ -27,38 +28,30 @@ entry: %z = alloca %"int[]", align 8 %taddr1 = alloca %"int[]", align 8 %taddr2 = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 0 - store i32 1, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 1 - store i32 2, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 2 - store i32 3, i32* %2, align 4 - %3 = bitcast [3 x i32]* %varargslots to i32* - %4 = insertvalue %"int[]" undef, i32* %3, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - store %"int[]" %5, %"int[]"* %taddr, align 8 - %6 = bitcast %"int[]"* %taddr to [2 x i64]* - %7 = load [2 x i64], [2 x i64]* %6, align 8 - %8 = call i32 @sum_us([2 x i64] %7) - %9 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %10 = bitcast [3 x i32]* %x to i32* - %11 = insertvalue %"int[]" undef, i32* %10, 0 - %12 = insertvalue %"int[]" %11, i64 3, 1 - store %"int[]" %12, %"int[]"* %z, align 8 - %13 = bitcast [3 x i32]* %x to i32* - %14 = insertvalue %"int[]" undef, i32* %13, 0 - %15 = insertvalue %"int[]" %14, i64 3, 1 - store %"int[]" %15, %"int[]"* %taddr1, align 8 - %16 = bitcast %"int[]"* %taddr1 to [2 x i64]* - %17 = load [2 x i64], [2 x i64]* %16, align 8 - %18 = call i32 @sum_us([2 x i64] %17) - %19 = bitcast %"int[]"* %z to [2 x i64]* - %20 = load [2 x i64], [2 x i64]* %19, align 8 - %21 = call i32 @sum_us([2 x i64] %20) - store %"int[]" zeroinitializer, %"int[]"* %taddr2, align 8 - %22 = bitcast %"int[]"* %taddr2 to [2 x i64]* - %23 = load [2 x i64], [2 x i64]* %22, align 8 - %24 = call i32 @sum_us([2 x i64] %23) + %0 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 0 + store i32 1, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 1 + store i32 2, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 2 + store i32 3, ptr %2, align 4 + %3 = insertvalue %"int[]" undef, ptr %varargslots, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, ptr %taddr, align 8 + %5 = load [2 x i64], ptr %taddr, align 8 + %6 = call i32 @sum_us([2 x i64] %5) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %7 = insertvalue %"int[]" undef, ptr %x, 0 + %8 = insertvalue %"int[]" %7, i64 3, 1 + store %"int[]" %8, ptr %z, align 8 + %9 = insertvalue %"int[]" undef, ptr %x, 0 + %10 = insertvalue %"int[]" %9, i64 3, 1 + store %"int[]" %10, ptr %taddr1, align 8 + %11 = load [2 x i64], ptr %taddr1, align 8 + %12 = call i32 @sum_us([2 x i64] %11) + %13 = load [2 x i64], ptr %z, align 8 + %14 = call i32 @sum_us([2 x i64] %13) + store %"int[]" zeroinitializer, ptr %taddr2, align 8 + %15 = load [2 x i64], ptr %taddr2, align 8 + %16 = call i32 @sum_us([2 x i64] %15) ret void } diff --git a/test/test_suite/functions/splat_mingw.c3t b/test/test_suite/functions/splat_mingw.c3t index 2e630a581..bcedcd954 100644 --- a/test/test_suite/functions/splat_mingw.c3t +++ b/test/test_suite/functions/splat_mingw.c3t @@ -15,8 +15,10 @@ fn void test() /* #expect: splat.ll -declare i32 @sum_us(%"int[]"* align 8) #0 +declare i32 @sum_us(ptr align 8) #0 +define void @splat_test() #0 { +entry: %varargslots = alloca [3 x i32], align 4 %indirectarg = alloca %"int[]", align 8 %x = alloca [3 x i32], align 4 @@ -24,32 +26,26 @@ declare i32 @sum_us(%"int[]"* align 8) #0 %indirectarg1 = alloca %"int[]", align 8 %indirectarg2 = alloca %"int[]", align 8 %indirectarg3 = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 0 - store i32 1, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 1 - store i32 2, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 2 - store i32 3, i32* %2, align 4 - %3 = bitcast [3 x i32]* %varargslots to i32* - %4 = insertvalue %"int[]" undef, i32* %3, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - store %"int[]" %5, %"int[]"* %indirectarg, align 8 - %6 = call i32 @sum_us(%"int[]"* align 8 %indirectarg) - %7 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %7, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %8 = bitcast [3 x i32]* %x to i32* - %9 = insertvalue %"int[]" undef, i32* %8, 0 - %10 = insertvalue %"int[]" %9, i64 3, 1 - store %"int[]" %10, %"int[]"* %z, align 8 - %11 = bitcast [3 x i32]* %x to i32* - %12 = insertvalue %"int[]" undef, i32* %11, 0 - %13 = insertvalue %"int[]" %12, i64 3, 1 - store %"int[]" %13, %"int[]"* %indirectarg1, align 8 - %14 = call i32 @sum_us(%"int[]"* align 8 %indirectarg1) - %15 = bitcast %"int[]"* %indirectarg2 to i8* - %16 = bitcast %"int[]"* %z to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %15, i8* align 8 %16, i32 16, i1 false) - %17 = call i32 @sum_us(%"int[]"* align 8 %indirectarg2) - store %"int[]" zeroinitializer, %"int[]"* %indirectarg3, align 8 - %18 = call i32 @sum_us(%"int[]"* align 8 %indirectarg3) + %0 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 0 + store i32 1, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 1 + store i32 2, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 2 + store i32 3, ptr %2, align 4 + %3 = insertvalue %"int[]" undef, ptr %varargslots, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, ptr %indirectarg, align 8 + %5 = call i32 @sum_us(ptr align 8 %indirectarg) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %6 = insertvalue %"int[]" undef, ptr %x, 0 + %7 = insertvalue %"int[]" %6, i64 3, 1 + store %"int[]" %7, ptr %z, align 8 + %8 = insertvalue %"int[]" undef, ptr %x, 0 + %9 = insertvalue %"int[]" %8, i64 3, 1 + store %"int[]" %9, ptr %indirectarg1, align 8 + %10 = call i32 @sum_us(ptr align 8 %indirectarg1) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg2, ptr align 8 %z, i32 16, i1 false) + %11 = call i32 @sum_us(ptr align 8 %indirectarg2) + store %"int[]" zeroinitializer, ptr %indirectarg3, align 8 + %12 = call i32 @sum_us(ptr align 8 %indirectarg3) ret void diff --git a/test/test_suite/functions/static_vars.c3t b/test/test_suite/functions/static_vars.c3t index 3c164b321..ac7205f65 100644 --- a/test/test_suite/functions/static_vars.c3t +++ b/test/test_suite/functions/static_vars.c3t @@ -15,9 +15,9 @@ fn int test() define i32 @foo_test() #0 { entry: - %0 = load i32, i32* @"test$x", align 4 + %0 = load i32, ptr @"test$x", align 4 %add = add i32 %0, 1 - store i32 %add, i32* @"test$x", align 4 - %1 = load i32, i32* @"test$x", align 4 + store i32 %add, ptr @"test$x", align 4 + %1 = load i32, ptr @"test$x", align 4 ret i32 %1 } diff --git a/test/test_suite/functions/test_regression.c3t b/test/test_suite/functions/test_regression.c3t index 89b467cec..0092950a4 100644 --- a/test/test_suite/functions/test_regression.c3t +++ b/test/test_suite/functions/test_regression.c3t @@ -234,403 +234,330 @@ fn Type getValue(Blob blob) /* #expect: test.ll -%Blob = type { i32 } -%Blob.0 = type { double } -%Foo2 = type { i32 } -%Bobo = type { i16, float, i16, i16, float, i16 } -%"int[]" = type { i32*, i64 } -%LinkedList = type { i64, %Node*, %Node* } -%Node = type { %Node*, %Node*, i32 } -%List = type { i64, i64, %Allocator*, i32* } -%Allocator = type { i64 (i8**, %Allocator*, i64, i64, i64, i8*, i32)* } -%Foo = type { i32, i32 } + %Blob = type { i32 } + %Blob.0 = type { double } + %Foo2 = type { i32 } + %Bobo = type { i16, float, i16, i16, float, i16 } + %"int[]" = type { ptr, i64 } + %LinkedList = type { i64, ptr, ptr } + %List = type { i64, i64, ptr, ptr } + %Foo = type { i32, i32 } -@"ct$test_Bobo" = linkonce constant %.introspect { i8 10, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 -@"ct$test_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$test_Foor" = linkonce constant %.introspect { i8 11, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (%.introspect* @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.enum.0, i64 0, i64 0), i64 4 }, %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.enum.1, i64 0, i64 0), i64 5 }, %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.enum.2, i64 0, i64 0), i64 3 }] }, align 8 + @"ct$test_Bobo" = linkonce constant %.introspect { i8 10, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 + @"ct$test_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 + @"ct$test_Foor" = linkonce constant %.introspect { i8 11, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 + @"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 + @"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 + @"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + @"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (ptr @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 4 }, %"char[]" { ptr @.enum.1, i64 5 }, %"char[]" { ptr @.enum.2, i64 3 }] }, align 8 + @"test_static$x" = internal unnamed_addr global i32 1, align 4 -define void @test_Foo2_printme(%Foo2* %0) #0 { -entry: - %1 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 - %2 = load i32, i32* %1, align 8 - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.21, i32 0, i32 0), i32 %2) - ret void -} + define void @test_Foo2_printme(ptr %0) #0 { + entry: + %1 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 + %2 = load i32, ptr %1, align 8 + %3 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %2) + ret void + } -; Function Attrs: nounwind -define i32 @test_Foo2_mutate(%Foo2* %0) #0 { -entry: - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.22, i32 0, i32 0)) - %2 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 - %3 = load i32, i32* %2, align 8 - %add = add i32 %3, 1 - store i32 %add, i32* %2, align 8 - ret i32 %add -} + ; Function Attrs: nounwind + define i32 @test_Foo2_mutate(ptr %0) #0 { + entry: + %1 = call i32 (ptr, ...) @printf(ptr @.str.22) + %2 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 + %3 = load i32, ptr %2, align 8 + %add = add i32 %3, 1 + store i32 %add, ptr %2, align 8 + ret i32 %add + } -; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 + ; Function Attrs: nounwind + declare i32 @printf(ptr, ...) #0 -; Function Attrs: nounwind -define void @test_helloWorld() #0 { -entry: - %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0)) - ret void -} + ; Function Attrs: nounwind + define void @test_helloWorld() #0 { + entry: + %0 = call i32 (ptr, ...) @printf(ptr @.str) + ret void + } -; Function Attrs: nounwind -define i32 @test_test_static() #0 { -entry: - %0 = load i32, i32* @"test_static$x", align 4 - %add = add i32 %0, 1 - store i32 %add, i32* @"test_static$x", align 4 - %1 = load i32, i32* @"test_static$x", align 4 - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i32 0, i32 0), i32 %1) - %3 = load i32, i32* @"test_static$x", align 4 - ret i32 %3 -} + ; Function Attrs: nounwind + define i32 @test_test_static() #0 { + entry: + %0 = load i32, ptr @"test_static$x", align 4 + %add = add i32 %0, 1 + store i32 %add, ptr @"test_static$x", align 4 + %1 = load i32, ptr @"test_static$x", align 4 + %2 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %1) + %3 = load i32, ptr @"test_static$x", align 4 + ret i32 %3 + } -; Function Attrs: nounwind -define i32 @test_helo(double %0, %Bobo* byval(%Bobo) align 8 %1) #0 { -entry: - %de = alloca [3 x i32], align 4 - %c = alloca %Bobo, align 4 - %indirectarg = alloca %Bobo, align 8 - %2 = bitcast [3 x i32]* %de to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %3 = bitcast %Bobo* %c to i8* - %4 = bitcast %Bobo* %1 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 20, i1 false) - %5 = bitcast %Bobo* %indirectarg to i8* - %6 = bitcast %Bobo* %c to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 4 %6, i32 20, i1 false) - %7 = call i32 @test_helo(double 1.000000e+00, %Bobo* byval(%Bobo) align 8 %indirectarg) - ret i32 1 -} + ; Function Attrs: nounwind + define i32 @test_helo(double %0, ptr byval(%Bobo) align 8 %1) #0 { + entry: + %de = alloca [3 x i32], align 4 + %c = alloca %Bobo, align 4 + %indirectarg = alloca %Bobo, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const, i32 12, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %c, ptr align 4 %1, i32 20, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 4 %c, i32 20, i1 false) + %2 = call i32 @test_helo(double 1.000000e+00, ptr byval(%Bobo) align 8 %indirectarg) + ret i32 1 + } -; Function Attrs: nounwind -define i32 @test_test1(i32 %0, i32 %1) #0 { -entry: - %a = alloca i32, align 4 - store i32 %0, i32* %a, align 4 - %2 = load i32, i32* %a, align 4 - %ashr = ashr i32 %2, %1 - %3 = freeze i32 %ashr - store i32 %3, i32* %a, align 4 - %gt = icmp sgt i32 %1, 128 - br i1 %gt, label %if.then, label %if.exit + ; Function Attrs: nounwind + define i32 @test_test1(i32 %0, i32 %1) #0 { + entry: + %a = alloca i32, align 4 + store i32 %0, ptr %a, align 4 + %2 = load i32, ptr %a, align 4 + %ashr = ashr i32 %2, %1 + %3 = freeze i32 %ashr + store i32 %3, ptr %a, align 4 + %gt = icmp sgt i32 %1, 128 + br i1 %gt, label %if.then, label %if.exit -if.then: ; preds = %entry - ret i32 -1 + if.then: ; preds = %entry + ret i32 -1 -if.exit: ; preds = %entry - %4 = load i32, i32* %a, align 4 - ret i32 %4 -} + if.exit: ; preds = %entry + %4 = load i32, ptr %a, align 4 + ret i32 %4 + } -; Function Attrs: nounwind -define i32 @test_sum_us(i8* %0, i64 %1) #0 { -entry: - %x = alloca %"int[]", align 8 - %sum = alloca i32, align 4 - %taddr = alloca %"int[]", align 8 - %pair = bitcast %"int[]"* %x to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - store i32 0, i32* %sum, align 4 - %4 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 - %5 = load i64, i64* %4, align 8 - %eq = icmp eq i64 0, %5 - br i1 %eq, label %if.then, label %if.exit + ; Function Attrs: nounwind + define i32 @test_sum_us(ptr %0, i64 %1) #0 { + entry: + %x = alloca %"int[]", align 8 + %sum = alloca i32, align 4 + %2 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + store i32 0, ptr %sum, align 4 + %4 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + %eq = icmp eq i64 0, %5 + br i1 %eq, label %if.then, label %if.exit -if.then: ; preds = %entry - ret i32 0 + if.then: ; preds = %entry + ret i32 0 -if.exit: ; preds = %entry - %6 = load i32, i32* %sum, align 4 - %7 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 - %8 = load i32*, i32** %7, align 8 - %ptroffset = getelementptr inbounds i32, i32* %8, i64 0 - %9 = load i32, i32* %ptroffset, align 4 - %10 = load %"int[]", %"int[]"* %x, align 8 - %11 = extractvalue %"int[]" %10, 0 - %12 = extractvalue %"int[]" %10, 1 - %sub = sub i64 %12, 1 - %13 = add i64 %sub, 1 - %size = sub i64 %13, 1 - %ptroffset1 = getelementptr inbounds i32, i32* %11, i64 1 - %14 = insertvalue %"int[]" undef, i32* %ptroffset1, 0 - %15 = insertvalue %"int[]" %14, i64 %size, 1 - store %"int[]" %15, %"int[]"* %taddr, align 8 - %16 = bitcast %"int[]"* %taddr to { i8*, i64 }* - %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 0 - %lo = load i8*, i8** %17, align 8 - %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 1 - %hi = load i64, i64* %18, align 8 - %19 = call i32 @test_sum_us(i8* %lo, i64 %hi) - %add = add i32 %9, %19 - %add2 = add i32 %6, %add - store i32 %add2, i32* %sum, align 4 - %20 = load i32, i32* %sum, align 4 - ret i32 %20 -} + if.exit: ; preds = %entry + %6 = load i32, ptr %sum, align 4 + %7 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + %ptroffset = getelementptr inbounds i32, ptr %8, i64 0 + %9 = load i32, ptr %ptroffset, align 4 + %10 = load %"int[]", ptr %x, align 8 + %11 = extractvalue %"int[]" %10, 0 + %12 = extractvalue %"int[]" %10, 1 + %sub = sub i64 %12, 1 + %13 = add i64 %sub, 1 + %size = sub i64 %13, 1 + %ptroffset1 = getelementptr inbounds i32, ptr %11, i64 1 + %14 = call i32 @test_sum_us(ptr %ptroffset1, i64 %size) + %add = add i32 %9, %14 + %add2 = add i32 %6, %add + store i32 %add2, ptr %sum, align 4 + %15 = load i32, ptr %sum, align 4 + ret i32 %15 + } -; Function Attrs: nounwind -define i32 @test_sumd(i8* %0, i64 %1) #0 { -entry: - %x = alloca %"int[]", align 8 - %sum = alloca i32, align 4 - %i = alloca i32, align 4 - %pair = bitcast %"int[]"* %x to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - store i32 0, i32* %sum, align 4 - store i32 0, i32* %i, align 4 - br label %loop.cond + ; Function Attrs: nounwind + define i32 @test_sumd(ptr %0, i64 %1) #0 { + entry: + %x = alloca %"int[]", align 8 + %sum = alloca i32, align 4 + %i = alloca i32, align 4 + %2 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + store i32 0, ptr %sum, align 4 + store i32 0, ptr %i, align 4 + br label %loop.cond -loop.cond: ; preds = %loop.body, %entry - %4 = load i32, i32* %i, align 4 - %sisiext = sext i32 %4 to i64 - %5 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 - %6 = load i64, i64* %5, align 8 - %lt = icmp slt i64 %sisiext, %6 - %check = icmp slt i64 %6, 0 - %siui-lt = or i1 %check, %lt - br i1 %siui-lt, label %loop.body, label %loop.exit + loop.cond: ; preds = %loop.body, %entry + %4 = load i32, ptr %i, align 4 + %sisiext = sext i32 %4 to i64 + %5 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 + %6 = load i64, ptr %5, align 8 + %lt = icmp slt i64 %sisiext, %6 + %check = icmp slt i64 %6, 0 + %siui-lt = or i1 %check, %lt + br i1 %siui-lt, label %loop.body, label %loop.exit -loop.body: ; preds = %loop.cond - %7 = load i32, i32* %sum, align 4 - %8 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 - %9 = load i32*, i32** %8, align 8 - %10 = load i32, i32* %i, align 4 - %sisiext1 = sext i32 %10 to i64 - %ptroffset = getelementptr inbounds i32, i32* %9, i64 %sisiext1 - %11 = load i32, i32* %ptroffset, align 4 - %add = add i32 %7, %11 - store i32 %add, i32* %sum, align 4 - %12 = load i32, i32* %i, align 4 - %add2 = add i32 %12, 1 - store i32 %add2, i32* %i, align 4 - br label %loop.cond + loop.body: ; preds = %loop.cond + %7 = load i32, ptr %sum, align 4 + %8 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 + %9 = load ptr, ptr %8, align 8 + %10 = load i32, ptr %i, align 4 + %sisiext1 = sext i32 %10 to i64 + %ptroffset = getelementptr inbounds i32, ptr %9, i64 %sisiext1 + %11 = load i32, ptr %ptroffset, align 4 + %add = add i32 %7, %11 + store i32 %add, ptr %sum, align 4 + %12 = load i32, ptr %i, align 4 + %add2 = add i32 %12, 1 + store i32 %add2, ptr %i, align 4 + br label %loop.cond -loop.exit: ; preds = %loop.cond - %13 = load i32, i32* %sum, align 4 - ret i32 %13 -} + loop.exit: ; preds = %loop.cond + %13 = load i32, ptr %sum, align 4 + ret i32 %13 + } -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %list = alloca %LinkedList, align 8 - %i = alloca i32, align 4 - %elements = alloca i32, align 4 - %array = alloca %List, align 8 - %i1 = alloca i32, align 4 - %a = alloca %Blob, align 4 - %b = alloca %Blob.0, align 8 - %ddx = alloca %Foo, align 4 - %fro = alloca i32, align 4 - %x = alloca [4 x i32], align 16 - %taddr = alloca %"int[]", align 8 - %z = alloca %"int[]", align 8 - %de = alloca [3 x i32], align 4 - %taddr10 = alloca %"int[]", align 8 - %varargslots = alloca [4 x i32], align 16 - %taddr15 = alloca %"int[]", align 8 - %varargslots18 = alloca [1 x i32], align 4 - %taddr19 = alloca %"int[]", align 8 - %taddr22 = alloca %"int[]", align 8 - %a1 = alloca i32 (double, %Bobo*)*, align 8 - %b2 = alloca i32 (double, %Bobo*)*, align 8 - %0 = call i32 @test_test_static() - %1 = call i32 @test_test_static() - %2 = call i32 @test_test_static() - call void @hello_world_hello() - %3 = bitcast %LinkedList* %list to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 24, i1 false) - call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 10) - call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 15) - call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 30) - store i32 0, i32* %i, align 4 - br label %loop.cond + ; Function Attrs: nounwind + define void @test_main() #0 { + entry: + %list = alloca %LinkedList, align 8 + %i = alloca i32, align 4 + %elements = alloca i32, align 4 + %array = alloca %List, align 8 + %i1 = alloca i32, align 4 + %a = alloca %Blob, align 4 + %b = alloca %Blob.0, align 8 + %ddx = alloca %Foo, align 4 + %fro = alloca i32, align 4 + %x = alloca [4 x i32], align 16 + %z = alloca %"int[]", align 8 + %de = alloca [3 x i32], align 4 + %varargslots = alloca [4 x i32], align 16 + %varargslots10 = alloca [1 x i32], align 4 + %a1 = alloca ptr, align 8 + %b2 = alloca ptr, align 8 + %0 = call i32 @test_test_static() + %1 = call i32 @test_test_static() + %2 = call i32 @test_test_static() + call void @hello_world_hello() + call void @llvm.memset.p0.i64(ptr align 8 %list, i8 0, i64 24, i1 false) + call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 10) + call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 15) + call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 30) + store i32 0, ptr %i, align 4 + br label %loop.cond -loop.cond: ; preds = %loop.body, %entry - %4 = load i32, i32* %i, align 4 - %5 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(%LinkedList* %list) #3 - %uisitrunc = trunc i64 %5 to i32 - %lt = icmp slt i32 %4, %uisitrunc - br i1 %lt, label %loop.body, label %loop.exit + loop.cond: ; preds = %loop.body, %entry + %3 = load i32, ptr %i, align 4 + %4 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(ptr %list) #3 + %uisitrunc = trunc i64 %4 to i32 + %lt = icmp slt i32 %3, %uisitrunc + br i1 %lt, label %loop.body, label %loop.exit -loop.body: ; preds = %loop.cond - %6 = load i32, i32* %i, align 4 - %7 = load i32, i32* %i, align 4 - %siuiext = sext i32 %7 to i64 - %8 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(%LinkedList* %list, i64 %siuiext) - %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %6, i32 %8) - %10 = load i32, i32* %i, align 4 - %add = add i32 %10, 1 - store i32 %add, i32* %i, align 4 - br label %loop.cond + loop.body: ; preds = %loop.cond + %5 = load i32, ptr %i, align 4 + %6 = load i32, ptr %i, align 4 + %siuiext = sext i32 %6 to i64 + %7 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(ptr %list, i64 %siuiext) + %8 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %5, i32 %7) + %9 = load i32, ptr %i, align 4 + %add = add i32 %9, 1 + store i32 %add, ptr %i, align 4 + br label %loop.cond -loop.exit: ; preds = %loop.cond - call void @"std_array_linkedlist$$int_LinkedList_free"(%LinkedList* %list) - %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 3) - store i32 3, i32* %elements, align 4 - %12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - %13 = bitcast %List* %array to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %13, i8 0, i64 32, i1 false) - call void @"std_array_list$$int_List_append"(%List* %array, i32 100) - call void @"std_array_list$$int_List_append"(%List* %array, i32 200) - call void @"std_array_list$$int_List_append"(%List* %array, i32 400) - call void @"std_array_list$$int_List_push"(%List* %array, i32 600) #3 - call void @"std_array_list$$int_List_insert_at"(%List* %array, i64 2, i32 300) - store i32 0, i32* %i1, align 4 - br label %loop.cond2 + loop.exit: ; preds = %loop.cond + call void @"std_array_linkedlist$$int_LinkedList_free"(ptr %list) + %10 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 3) + store i32 3, ptr %elements, align 4 + %11 = call i32 (ptr, ...) @printf(ptr @.str.4) + call void @llvm.memset.p0.i64(ptr align 8 %array, i8 0, i64 32, i1 false) + call void @"std_array_list$$int_List_append"(ptr %array, i32 100) + call void @"std_array_list$$int_List_append"(ptr %array, i32 200) + call void @"std_array_list$$int_List_append"(ptr %array, i32 400) + call void @"std_array_list$$int_List_push"(ptr %array, i32 600) #3 + call void @"std_array_list$$int_List_insert_at"(ptr %array, i64 2, i32 300) + store i32 0, ptr %i1, align 4 + br label %loop.cond2 -loop.cond2: ; preds = %loop.body5, %loop.exit - %14 = load i32, i32* %i1, align 4 - %15 = call i64 @"std_array_list$$int_List_len"(%List* %array) - %uisitrunc3 = trunc i64 %15 to i32 - %lt4 = icmp slt i32 %14, %uisitrunc3 - br i1 %lt4, label %loop.body5, label %loop.exit8 + loop.cond2: ; preds = %loop.body5, %loop.exit + %12 = load i32, ptr %i1, align 4 + %13 = call i64 @"std_array_list$$int_List_len"(ptr %array) + %uisitrunc3 = trunc i64 %13 to i32 + %lt4 = icmp slt i32 %12, %uisitrunc3 + br i1 %lt4, label %loop.body5, label %loop.exit8 -loop.body5: ; preds = %loop.cond2 - %16 = load i32, i32* %i1, align 4 - %17 = load i32, i32* %i1, align 4 - %siuiext6 = sext i32 %17 to i64 - %18 = call i32 @"std_array_list$$int_List_get"(%List* %array, i64 %siuiext6) - %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %16, i32 %18) - %20 = load i32, i32* %i1, align 4 - %add7 = add i32 %20, 1 - store i32 %add7, i32* %i1, align 4 - br label %loop.cond2 - -loop.exit8: ; preds = %loop.cond2 - call void @"std_array_list$$int_List_free"(%List* %array) - %21 = bitcast %Blob* %a to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %21, i8* align 4 bitcast (%Blob* @.__const.6 to i8*), i32 4, i1 false) - %22 = bitcast %Blob.0* %b to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %22, i8* align 8 bitcast (%Blob.0* @.__const.7 to i8*), i32 8, i1 false) - %23 = getelementptr inbounds %Blob, %Blob* %a, i32 0, i32 0 - %24 = load i32, i32* %23, align 4 - %25 = call i32 @"test2$$int_getValue"(i32 %24) - %26 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i32 0, i32 0), i32 %25) - %27 = getelementptr inbounds %Blob.0, %Blob.0* %b, i32 0, i32 0 - %28 = load double, double* %27, align 8 - %29 = call double @"test2$$double_getValue"(double %28) - %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), double %29) - %31 = call i32 @"test2$$int_getMult"(i32 25) - %32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i32 0, i32 0), i32 %31) - %33 = call double @"test2$$double_getMult"(double 3.300000e+00) - %34 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.11, i32 0, i32 0), double %33) - call void @test_helloWorld() - %35 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 0 - store i32 0, i32* %35, align 4 - %36 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 1 - store i32 0, i32* %36, align 4 - store i32 3, i32* %fro, align 4 - %37 = bitcast [4 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %37, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false) - %38 = load i32, i32* %fro, align 4 - %39 = bitcast [4 x i32]* %x to i32* - %40 = insertvalue %"int[]" undef, i32* %39, 0 - %41 = insertvalue %"int[]" %40, i64 4, 1 - store %"int[]" %41, %"int[]"* %taddr, align 8 - %42 = bitcast %"int[]"* %taddr to { i8*, i64 }* - %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 0 - %lo = load i8*, i8** %43, align 8 - %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 1 - %hi = load i64, i64* %44, align 8 - %45 = call i32 @test_sum_us(i8* %lo, i64 %hi) - %46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.13, i32 0, i32 0), i32 %45) - %add9 = add i32 %38, %46 - store i32 %add9, i32* %fro, align 4 - %47 = load i32, i32* %fro, align 4 - %48 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %47) - %49 = bitcast [4 x i32]* %x to i32* - %50 = insertvalue %"int[]" undef, i32* %49, 0 - %51 = insertvalue %"int[]" %50, i64 4, 1 - store %"int[]" %51, %"int[]"* %z, align 8 - %52 = bitcast [3 x i32]* %de to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %52, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false) - %53 = bitcast [4 x i32]* %x to i32* - %54 = insertvalue %"int[]" undef, i32* %53, 0 - %55 = insertvalue %"int[]" %54, i64 4, 1 - store %"int[]" %55, %"int[]"* %taddr10, align 8 - %56 = bitcast %"int[]"* %taddr10 to { i8*, i64 }* - %57 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 0 - %lo11 = load i8*, i8** %57, align 8 - %58 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 1 - %hi12 = load i64, i64* %58, align 8 - %59 = call i32 @test_sum_us(i8* %lo11, i64 %hi12) - %60 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.16, i32 0, i32 0), i32 %59) - %61 = bitcast %"int[]"* %z to { i8*, i64 }* - %62 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 0 - %lo13 = load i8*, i8** %62, align 8 - %63 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 1 - %hi14 = load i64, i64* %63, align 8 - %64 = call i32 @test_sum_us(i8* %lo13, i64 %hi14) - %65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.17, i32 0, i32 0), i32 %64) - %66 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0 - store i32 1, i32* %66, align 4 - %67 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1 - store i32 2, i32* %67, align 4 - %68 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2 - store i32 4, i32* %68, align 4 - %69 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3 - store i32 5, i32* %69, align 4 - %70 = bitcast [4 x i32]* %varargslots to i32* - %71 = insertvalue %"int[]" undef, i32* %70, 0 - %72 = insertvalue %"int[]" %71, i64 4, 1 - store %"int[]" %72, %"int[]"* %taddr15, align 8 - %73 = bitcast %"int[]"* %taddr15 to { i8*, i64 }* - %74 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %73, i32 0, i32 0 - %lo16 = load i8*, i8** %74, align 8 - %75 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %73, i32 0, i32 1 - %hi17 = load i64, i64* %75, align 8 - %76 = call i32 @test_sum_us(i8* %lo16, i64 %hi17) - %77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %76) - %78 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots18, i64 0, i64 0 - store i32 1, i32* %78, align 4 - %79 = bitcast [1 x i32]* %varargslots18 to i32* - %80 = insertvalue %"int[]" undef, i32* %79, 0 - %81 = insertvalue %"int[]" %80, i64 1, 1 - store %"int[]" %81, %"int[]"* %taddr19, align 8 - %82 = bitcast %"int[]"* %taddr19 to { i8*, i64 }* - %83 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %82, i32 0, i32 0 - %lo20 = load i8*, i8** %83, align 8 - %84 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %82, i32 0, i32 1 - %hi21 = load i64, i64* %84, align 8 - %85 = call i32 @test_sum_us(i8* %lo20, i64 %hi21) - %86 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %85) - store %"int[]" zeroinitializer, %"int[]"* %taddr22, align 8 - %87 = bitcast %"int[]"* %taddr22 to { i8*, i64 }* - %88 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %87, i32 0, i32 0 - %lo23 = load i8*, i8** %88, align 8 - %89 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %87, i32 0, i32 1 - %hi24 = load i64, i64* %89, align 8 - %90 = call i32 @test_sum_us(i8* %lo23, i64 %hi24) - %91 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %90) - store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8 - store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8 - ret void -} + loop.body5: ; preds = %loop.cond2 + %14 = load i32, ptr %i1, align 4 + %15 = load i32, ptr %i1, align 4 + %siuiext6 = sext i32 %15 to i64 + %16 = call i32 @"std_array_list$$int_List_get"(ptr %array, i64 %siuiext6) + %17 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %14, i32 %16) + %18 = load i32, ptr %i1, align 4 + %add7 = add i32 %18, 1 + store i32 %add7, ptr %i1, align 4 + br label %loop.cond2 + loop.exit8: ; preds = %loop.cond2 + call void @"std_array_list$$int_List_free"(ptr %array) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 @.__const.6, i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %b, ptr align 8 @.__const.7, i32 8, i1 false) + %19 = getelementptr inbounds %Blob, ptr %a, i32 0, i32 0 + %20 = load i32, ptr %19, align 4 + %21 = call i32 @"test2$$int_getValue"(i32 %20) + %22 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %21) + %23 = getelementptr inbounds %Blob.0, ptr %b, i32 0, i32 0 + %24 = load double, ptr %23, align 8 + %25 = call double @"test2$$double_getValue"(double %24) + %26 = call i32 (ptr, ...) @printf(ptr @.str.9, double %25) + %27 = call i32 @"test2$$int_getMult"(i32 25) + %28 = call i32 (ptr, ...) @printf(ptr @.str.10, i32 %27) + %29 = call double @"test2$$double_getMult"(double 3.300000e+00) + %30 = call i32 (ptr, ...) @printf(ptr @.str.11, double %29) + call void @test_helloWorld() + %31 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 0 + store i32 0, ptr %31, align 4 + %32 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 1 + store i32 0, ptr %32, align 4 + store i32 3, ptr %fro, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 16 @.__const.12, i32 16, i1 false) + %33 = load i32, ptr %fro, align 4 + %34 = call i32 @test_sum_us(ptr %x, i64 4) + %35 = call i32 (ptr, ...) @printf(ptr @.str.13, i32 %34) + %add9 = add i32 %33, %35 + store i32 %add9, ptr %fro, align 4 + %36 = load i32, ptr %fro, align 4 + %37 = call i32 (ptr, ...) @printf(ptr @.str.14, i32 %36) + %38 = insertvalue %"int[]" undef, ptr %x, 0 + %39 = insertvalue %"int[]" %38, i64 4, 1 + store %"int[]" %39, ptr %z, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const.15, i32 12, i1 false) + %40 = call i32 @test_sum_us(ptr %x, i64 4) + %41 = call i32 (ptr, ...) @printf(ptr @.str.16, i32 %40) + %42 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 0 + %lo = load ptr, ptr %42, align 8 + %43 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 1 + %hi = load i64, ptr %43, align 8 + %44 = call i32 @test_sum_us(ptr %lo, i64 %hi) + %45 = call i32 (ptr, ...) @printf(ptr @.str.17, i32 %44) + %46 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 0 + store i32 1, ptr %46, align 4 + %47 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 1 + store i32 2, ptr %47, align 4 + %48 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 2 + store i32 4, ptr %48, align 4 + %49 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 3 + store i32 5, ptr %49, align 4 + %50 = call i32 @test_sum_us(ptr %varargslots, i64 4) + %51 = call i32 (ptr, ...) @printf(ptr @.str.18, i32 %50) + %52 = getelementptr inbounds [1 x i32], ptr %varargslots10, i64 0, i64 0 + store i32 1, ptr %52, align 4 + %53 = call i32 @test_sum_us(ptr %varargslots10, i64 1) + %54 = call i32 (ptr, ...) @printf(ptr @.str.19, i32 %53) + %55 = call i32 @test_sum_us(ptr null, i64 0) + %56 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %55) + store ptr null, ptr %a1, align 8 + store ptr null, ptr %b2, align 8 + ret void + } // #expect: hello_world.ll define void @hello_world_hello() entry: - %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0)) + %0 = call i32 (ptr, ...) @printf(ptr @.str) %1 = call double @"foo$$double_check"(double 1.110000e+01) - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), double %1) + %2 = call i32 (ptr, ...) @printf(ptr @.str.1, double %1) ret void // #expect: foo.double.ll @@ -660,10 +587,10 @@ entry: define i32 @"test2$$int_getValue"(i32 %0) #0 { entry: %blob = alloca %Blob, align 4 - %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - store i32 %0, i32* %1, align 4 - %2 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - %3 = load i32, i32* %2, align 4 + %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + store i32 %0, ptr %1, align 4 + %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + %3 = load i32, ptr %2, align 4 ret i32 %3 } @@ -682,10 +609,10 @@ entry: ret i32 1 define double @"test2$$double_getValue"(double %0) -entry: + entry: %blob = alloca %Blob, align 8 - %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - store double %0, double* %1, align 8 - %2 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - %3 = load double, double* %2, align 8 + %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + store double %0, ptr %1, align 8 + %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + %3 = load double, ptr %2, align 8 ret double %3 \ No newline at end of file diff --git a/test/test_suite/functions/test_regression_mingw.c3t b/test/test_suite/functions/test_regression_mingw.c3t index 35c13b155..feb7dd13e 100644 --- a/test/test_suite/functions/test_regression_mingw.c3t +++ b/test/test_suite/functions/test_regression_mingw.c3t @@ -240,10 +240,9 @@ fn Type getValue(Blob blob) %Blob.0 = type { double } %Foo2 = type { i32 } %Bobo = type { i16, float, i16, i16, float, i16 } -%"int[]" = type { i32*, i64 } -%LinkedList = type { i64, %Node*, %Node* } -%Node = type { %Node*, %Node*, i32 } -%List = type { i64, i64, %Allocator*, i32* } +%"int[]" = type { ptr, i64 } +%LinkedList = type { i64, ptr, ptr } +%List = type { i64, i64, ptr, ptr } %Foo = type { i32, i32 } $"ct$test_Bobo" = comdat any @@ -266,7 +265,7 @@ $"ct$test_MyEnum" = comdat any @"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 @"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 @"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (%.introspect* @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.enum.0, i64 0, i64 0), i64 4 }, %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.enum.1, i64 0, i64 0), i64 5 }, %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.enum.2, i64 0, i64 0), i64 3 }] }, comdat, align 8 +@"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (ptr @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 4 }, %"char[]" { ptr @.enum.1, i64 5 }, %"char[]" { ptr @.enum.2, i64 3 }] }, comdat, align 8 @.str = private unnamed_addr constant [13 x i8] c"helloWorld!\0A\00", align 1 @"test_static$x" = internal unnamed_addr global i32 1, align 4 @.str.1 = private unnamed_addr constant [16 x i8] c"Test static %d\0A\00", align 1 @@ -294,62 +293,57 @@ $"ct$test_MyEnum" = comdat any @.str.22 = private unnamed_addr constant [9 x i8] c"Mutating\00", align 1 ; Function Attrs: nounwind -define void @test_Foo2_printme(%Foo2* %0) #0 { +define void @test_Foo2_printme(ptr %0) #0 { entry: - %1 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 - %2 = load i32, i32* %1, align 8 - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.21, i32 0, i32 0), i32 %2) + %1 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 + %2 = load i32, ptr %1, align 8 + %3 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %2) ret void } ; Function Attrs: nounwind -define i32 @test_Foo2_mutate(%Foo2* %0) #0 { +define i32 @test_Foo2_mutate(ptr %0) #0 { entry: - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.22, i32 0, i32 0)) - %2 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 - %3 = load i32, i32* %2, align 8 + %1 = call i32 (ptr, ...) @printf(ptr @.str.22) + %2 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 + %3 = load i32, ptr %2, align 8 %add = add i32 %3, 1 - store i32 %add, i32* %2, align 8 + store i32 %add, ptr %2, align 8 ret i32 %add } ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind define void @test_helloWorld() #0 { entry: - %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0)) + %0 = call i32 (ptr, ...) @printf(ptr @.str) ret void } ; Function Attrs: nounwind define i32 @test_test_static() #0 { entry: - %0 = load i32, i32* @"test_static$x", align 4 + %0 = load i32, ptr @"test_static$x", align 4 %add = add i32 %0, 1 - store i32 %add, i32* @"test_static$x", align 4 - %1 = load i32, i32* @"test_static$x", align 4 - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i32 0, i32 0), i32 %1) - %3 = load i32, i32* @"test_static$x", align 4 + store i32 %add, ptr @"test_static$x", align 4 + %1 = load i32, ptr @"test_static$x", align 4 + %2 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %1) + %3 = load i32, ptr @"test_static$x", align 4 ret i32 %3 } ; Function Attrs: nounwind -define i32 @test_helo(double %0, %Bobo* align 4 %1) #0 { +define i32 @test_helo(double %0, ptr align 4 %1) #0 { entry: %de = alloca [3 x i32], align 4 %c = alloca %Bobo, align 4 %indirectarg = alloca %Bobo, align 4 - %2 = bitcast [3 x i32]* %de to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %3 = bitcast %Bobo* %c to i8* - %4 = bitcast %Bobo* %1 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 20, i1 false) - %5 = bitcast %Bobo* %indirectarg to i8* - %6 = bitcast %Bobo* %c to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 20, i1 false) - %7 = call i32 @test_helo(double 1.000000e+00, %Bobo* align 4 %indirectarg) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const, i32 12, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %c, ptr align 4 %1, i32 20, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %indirectarg, ptr align 4 %c, i32 20, i1 false) + %2 = call i32 @test_helo(double 1.000000e+00, ptr align 4 %indirectarg) ret i32 1 } @@ -357,11 +351,11 @@ entry: define i32 @test_test1(i32 %0, i32 %1) #0 { entry: %a = alloca i32, align 4 - store i32 %0, i32* %a, align 4 - %2 = load i32, i32* %a, align 4 + store i32 %0, ptr %a, align 4 + %2 = load i32, ptr %a, align 4 %ashr = ashr i32 %2, %1 %3 = freeze i32 %ashr - store i32 %3, i32* %a, align 4 + store i32 %3, ptr %a, align 4 %gt = icmp sgt i32 %1, 128 br i1 %gt, label %if.then, label %if.exit @@ -369,18 +363,18 @@ if.then: ; preds = %entry ret i32 -1 if.exit: ; preds = %entry - %4 = load i32, i32* %a, align 4 + %4 = load i32, ptr %a, align 4 ret i32 %4 } ; Function Attrs: nounwind -define i32 @test_sum_us(%"int[]"* align 8 %0) #0 { +define i32 @test_sum_us(ptr align 8 %0) #0 { entry: %sum = alloca i32, align 4 %indirectarg = alloca %"int[]", align 8 - store i32 0, i32* %sum, align 4 - %1 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 1 - %2 = load i64, i64* %1, align 8 + store i32 0, ptr %sum, align 4 + %1 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 1 + %2 = load i64, ptr %1, align 8 %eq = icmp eq i64 0, %2 br i1 %eq, label %if.then, label %if.exit @@ -388,65 +382,65 @@ if.then: ; preds = %entry ret i32 0 if.exit: ; preds = %entry - %3 = load i32, i32* %sum, align 4 - %4 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 0 - %5 = load i32*, i32** %4, align 8 - %ptroffset = getelementptr inbounds i32, i32* %5, i64 0 - %6 = load i32, i32* %ptroffset, align 4 - %7 = load %"int[]", %"int[]"* %0, align 8 + %3 = load i32, ptr %sum, align 4 + %4 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 0 + %5 = load ptr, ptr %4, align 8 + %ptroffset = getelementptr inbounds i32, ptr %5, i64 0 + %6 = load i32, ptr %ptroffset, align 4 + %7 = load %"int[]", ptr %0, align 8 %8 = extractvalue %"int[]" %7, 0 %9 = extractvalue %"int[]" %7, 1 %sub = sub i64 %9, 1 %10 = add i64 %sub, 1 %size = sub i64 %10, 1 - %ptroffset1 = getelementptr inbounds i32, i32* %8, i64 1 - %11 = insertvalue %"int[]" undef, i32* %ptroffset1, 0 + %ptroffset1 = getelementptr inbounds i32, ptr %8, i64 1 + %11 = insertvalue %"int[]" undef, ptr %ptroffset1, 0 %12 = insertvalue %"int[]" %11, i64 %size, 1 - store %"int[]" %12, %"int[]"* %indirectarg, align 8 - %13 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg) + store %"int[]" %12, ptr %indirectarg, align 8 + %13 = call i32 @test_sum_us(ptr align 8 %indirectarg) %add = add i32 %6, %13 %add2 = add i32 %3, %add - store i32 %add2, i32* %sum, align 4 - %14 = load i32, i32* %sum, align 4 + store i32 %add2, ptr %sum, align 4 + %14 = load i32, ptr %sum, align 4 ret i32 %14 } ; Function Attrs: nounwind -define i32 @test_sumd(%"int[]"* align 8 %0) #0 { +define i32 @test_sumd(ptr align 8 %0) #0 { entry: %sum = alloca i32, align 4 %i = alloca i32, align 4 - store i32 0, i32* %sum, align 4 - store i32 0, i32* %i, align 4 + store i32 0, ptr %sum, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %1 = load i32, i32* %i, align 4 + %1 = load i32, ptr %i, align 4 %sisiext = sext i32 %1 to i64 - %2 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 1 - %3 = load i64, i64* %2, align 8 + %2 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 1 + %3 = load i64, ptr %2, align 8 %lt = icmp slt i64 %sisiext, %3 %check = icmp slt i64 %3, 0 %siui-lt = or i1 %check, %lt br i1 %siui-lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %4 = load i32, i32* %sum, align 4 - %5 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 0 - %6 = load i32*, i32** %5, align 8 - %7 = load i32, i32* %i, align 4 + %4 = load i32, ptr %sum, align 4 + %5 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 0 + %6 = load ptr, ptr %5, align 8 + %7 = load i32, ptr %i, align 4 %sisiext1 = sext i32 %7 to i64 - %ptroffset = getelementptr inbounds i32, i32* %6, i64 %sisiext1 - %8 = load i32, i32* %ptroffset, align 4 + %ptroffset = getelementptr inbounds i32, ptr %6, i64 %sisiext1 + %8 = load i32, ptr %ptroffset, align 4 %add = add i32 %4, %8 - store i32 %add, i32* %sum, align 4 - %9 = load i32, i32* %i, align 4 + store i32 %add, ptr %sum, align 4 + %9 = load i32, ptr %i, align 4 %add2 = add i32 %9, 1 - store i32 %add2, i32* %i, align 4 + store i32 %add2, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - %10 = load i32, i32* %sum, align 4 + %10 = load i32, ptr %sum, align 4 ret i32 %10 } @@ -473,187 +467,165 @@ entry: %varargslots13 = alloca [1 x i32], align 4 %indirectarg14 = alloca %"int[]", align 8 %indirectarg15 = alloca %"int[]", align 8 - %a1 = alloca i32 (double, %Bobo*)*, align 8 - %b2 = alloca i32 (double, %Bobo*)*, align 8 + %a1 = alloca ptr, align 8 + %b2 = alloca ptr, align 8 %0 = call i32 @test_test_static() %1 = call i32 @test_test_static() %2 = call i32 @test_test_static() call void @hello_world_hello() - %3 = bitcast %LinkedList* %list to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 24, i1 false) - call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 10) - call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 15) - call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 30) - store i32 0, i32* %i, align 4 + call void @llvm.memset.p0.i64(ptr align 8 %list, i8 0, i64 24, i1 false) + call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 10) + call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 15) + call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 30) + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %4 = load i32, i32* %i, align 4 - %5 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(%LinkedList* %list) #3 - %uisitrunc = trunc i64 %5 to i32 - %lt = icmp slt i32 %4, %uisitrunc + %3 = load i32, ptr %i, align 4 + %4 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(ptr %list) #3 + %uisitrunc = trunc i64 %4 to i32 + %lt = icmp slt i32 %3, %uisitrunc br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %6 = load i32, i32* %i, align 4 - %7 = load i32, i32* %i, align 4 - %siuiext = sext i32 %7 to i64 - %8 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(%LinkedList* %list, i64 %siuiext) - %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %6, i32 %8) - %10 = load i32, i32* %i, align 4 - %add = add i32 %10, 1 - store i32 %add, i32* %i, align 4 + %5 = load i32, ptr %i, align 4 + %6 = load i32, ptr %i, align 4 + %siuiext = sext i32 %6 to i64 + %7 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(ptr %list, i64 %siuiext) + %8 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %5, i32 %7) + %9 = load i32, ptr %i, align 4 + %add = add i32 %9, 1 + store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - call void @"std_array_linkedlist$$int_LinkedList_free"(%LinkedList* %list) - %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 3) - store i32 3, i32* %elements, align 4 - %12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) - %13 = bitcast %List* %array to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %13, i8 0, i64 32, i1 false) - call void @"std_array_list$$int_List_append"(%List* %array, i32 100) - call void @"std_array_list$$int_List_append"(%List* %array, i32 200) - call void @"std_array_list$$int_List_append"(%List* %array, i32 400) - call void @"std_array_list$$int_List_push"(%List* %array, i32 600) #3 - call void @"std_array_list$$int_List_insert_at"(%List* %array, i64 2, i32 300) - store i32 0, i32* %i1, align 4 + call void @"std_array_linkedlist$$int_LinkedList_free"(ptr %list) + %10 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 3) + store i32 3, ptr %elements, align 4 + %11 = call i32 (ptr, ...) @printf(ptr @.str.4) + call void @llvm.memset.p0.i64(ptr align 8 %array, i8 0, i64 32, i1 false) + call void @"std_array_list$$int_List_append"(ptr %array, i32 100) + call void @"std_array_list$$int_List_append"(ptr %array, i32 200) + call void @"std_array_list$$int_List_append"(ptr %array, i32 400) + call void @"std_array_list$$int_List_push"(ptr %array, i32 600) #3 + call void @"std_array_list$$int_List_insert_at"(ptr %array, i64 2, i32 300) + store i32 0, ptr %i1, align 4 br label %loop.cond2 loop.cond2: ; preds = %loop.body5, %loop.exit - %14 = load i32, i32* %i1, align 4 - %15 = call i64 @"std_array_list$$int_List_len"(%List* %array) - %uisitrunc3 = trunc i64 %15 to i32 - %lt4 = icmp slt i32 %14, %uisitrunc3 + %12 = load i32, ptr %i1, align 4 + %13 = call i64 @"std_array_list$$int_List_len"(ptr %array) + %uisitrunc3 = trunc i64 %13 to i32 + %lt4 = icmp slt i32 %12, %uisitrunc3 br i1 %lt4, label %loop.body5, label %loop.exit8 loop.body5: ; preds = %loop.cond2 - %16 = load i32, i32* %i1, align 4 - %17 = load i32, i32* %i1, align 4 - %siuiext6 = sext i32 %17 to i64 - %18 = call i32 @"std_array_list$$int_List_get"(%List* %array, i64 %siuiext6) - %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %16, i32 %18) - %20 = load i32, i32* %i1, align 4 - %add7 = add i32 %20, 1 - store i32 %add7, i32* %i1, align 4 + %14 = load i32, ptr %i1, align 4 + %15 = load i32, ptr %i1, align 4 + %siuiext6 = sext i32 %15 to i64 + %16 = call i32 @"std_array_list$$int_List_get"(ptr %array, i64 %siuiext6) + %17 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %14, i32 %16) + %18 = load i32, ptr %i1, align 4 + %add7 = add i32 %18, 1 + store i32 %add7, ptr %i1, align 4 br label %loop.cond2 loop.exit8: ; preds = %loop.cond2 - call void @"std_array_list$$int_List_free"(%List* %array) - %21 = bitcast %Blob* %a to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %21, i8* align 4 bitcast (%Blob* @.__const.6 to i8*), i32 4, i1 false) - %22 = bitcast %Blob.0* %b to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %22, i8* align 8 bitcast (%Blob.0* @.__const.7 to i8*), i32 8, i1 false) - %23 = getelementptr inbounds %Blob, %Blob* %a, i32 0, i32 0 - %24 = load i32, i32* %23, align 4 - %25 = call i32 @"test2$$int_getValue"(i32 %24) - %26 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i32 0, i32 0), i32 %25) - %27 = getelementptr inbounds %Blob.0, %Blob.0* %b, i32 0, i32 0 - %28 = bitcast double* %27 to i64* - %29 = load i64, i64* %28, align 8 - %30 = call double @"test2$$double_getValue"(i64 %29) - %31 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), double %30) - %32 = call i32 @"test2$$int_getMult"(i32 25) - %33 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i32 0, i32 0), i32 %32) - %34 = call double @"test2$$double_getMult"(double 3.300000e+00) - %35 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.11, i32 0, i32 0), double %34) + call void @"std_array_list$$int_List_free"(ptr %array) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 @.__const.6, i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %b, ptr align 8 @.__const.7, i32 8, i1 false) + %19 = getelementptr inbounds %Blob, ptr %a, i32 0, i32 0 + %20 = load i32, ptr %19, align 4 + %21 = call i32 @"test2$$int_getValue"(i32 %20) + %22 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %21) + %23 = getelementptr inbounds %Blob.0, ptr %b, i32 0, i32 0 + %24 = load i64, ptr %23, align 8 + %25 = call double @"test2$$double_getValue"(i64 %24) + %26 = call i32 (ptr, ...) @printf(ptr @.str.9, double %25) + %27 = call i32 @"test2$$int_getMult"(i32 25) + %28 = call i32 (ptr, ...) @printf(ptr @.str.10, i32 %27) + %29 = call double @"test2$$double_getMult"(double 3.300000e+00) + %30 = call i32 (ptr, ...) @printf(ptr @.str.11, double %29) call void @test_helloWorld() - %36 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 0 - store i32 0, i32* %36, align 4 - %37 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 1 - store i32 0, i32* %37, align 4 - store i32 3, i32* %fro, align 4 - %38 = bitcast [4 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %38, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false) - %39 = load i32, i32* %fro, align 4 - %40 = bitcast [4 x i32]* %x to i32* - %41 = insertvalue %"int[]" undef, i32* %40, 0 - %42 = insertvalue %"int[]" %41, i64 4, 1 - store %"int[]" %42, %"int[]"* %indirectarg, align 8 - %43 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg) - %44 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.13, i32 0, i32 0), i32 %43) - %add9 = add i32 %39, %44 - store i32 %add9, i32* %fro, align 4 - %45 = load i32, i32* %fro, align 4 - %46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %45) - %47 = bitcast [4 x i32]* %x to i32* - %48 = insertvalue %"int[]" undef, i32* %47, 0 - %49 = insertvalue %"int[]" %48, i64 4, 1 - store %"int[]" %49, %"int[]"* %z, align 8 - %50 = bitcast [3 x i32]* %de to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %50, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false) - %51 = bitcast [4 x i32]* %x to i32* - %52 = insertvalue %"int[]" undef, i32* %51, 0 + %31 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 0 + store i32 0, ptr %31, align 4 + %32 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 1 + store i32 0, ptr %32, align 4 + store i32 3, ptr %fro, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 16 @.__const.12, i32 16, i1 false) + %33 = load i32, ptr %fro, align 4 + %34 = insertvalue %"int[]" undef, ptr %x, 0 + %35 = insertvalue %"int[]" %34, i64 4, 1 + store %"int[]" %35, ptr %indirectarg, align 8 + %36 = call i32 @test_sum_us(ptr align 8 %indirectarg) + %37 = call i32 (ptr, ...) @printf(ptr @.str.13, i32 %36) + %add9 = add i32 %33, %37 + store i32 %add9, ptr %fro, align 4 + %38 = load i32, ptr %fro, align 4 + %39 = call i32 (ptr, ...) @printf(ptr @.str.14, i32 %38) + %40 = insertvalue %"int[]" undef, ptr %x, 0 + %41 = insertvalue %"int[]" %40, i64 4, 1 + store %"int[]" %41, ptr %z, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const.15, i32 12, i1 false) + %42 = insertvalue %"int[]" undef, ptr %x, 0 + %43 = insertvalue %"int[]" %42, i64 4, 1 + store %"int[]" %43, ptr %indirectarg10, align 8 + %44 = call i32 @test_sum_us(ptr align 8 %indirectarg10) + %45 = call i32 (ptr, ...) @printf(ptr @.str.16, i32 %44) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg11, ptr align 8 %z, i32 16, i1 false) + %46 = call i32 @test_sum_us(ptr align 8 %indirectarg11) + %47 = call i32 (ptr, ...) @printf(ptr @.str.17, i32 %46) + %48 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 0 + store i32 1, ptr %48, align 4 + %49 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 1 + store i32 2, ptr %49, align 4 + %50 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 2 + store i32 4, ptr %50, align 4 + %51 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 3 + store i32 5, ptr %51, align 4 + %52 = insertvalue %"int[]" undef, ptr %varargslots, 0 %53 = insertvalue %"int[]" %52, i64 4, 1 - store %"int[]" %53, %"int[]"* %indirectarg10, align 8 - %54 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg10) - %55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.16, i32 0, i32 0), i32 %54) - %56 = bitcast %"int[]"* %indirectarg11 to i8* - %57 = bitcast %"int[]"* %z to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %56, i8* align 8 %57, i32 16, i1 false) - %58 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg11) - %59 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.17, i32 0, i32 0), i32 %58) - %60 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0 - store i32 1, i32* %60, align 4 - %61 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1 - store i32 2, i32* %61, align 4 - %62 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2 - store i32 4, i32* %62, align 4 - %63 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3 - store i32 5, i32* %63, align 4 - %64 = bitcast [4 x i32]* %varargslots to i32* - %65 = insertvalue %"int[]" undef, i32* %64, 0 - %66 = insertvalue %"int[]" %65, i64 4, 1 - store %"int[]" %66, %"int[]"* %indirectarg12, align 8 - %67 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg12) - %68 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %67) - %69 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots13, i64 0, i64 0 - store i32 1, i32* %69, align 4 - %70 = bitcast [1 x i32]* %varargslots13 to i32* - %71 = insertvalue %"int[]" undef, i32* %70, 0 - %72 = insertvalue %"int[]" %71, i64 1, 1 - store %"int[]" %72, %"int[]"* %indirectarg14, align 8 - %73 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg14) - %74 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %73) - store %"int[]" zeroinitializer, %"int[]"* %indirectarg15, align 8 - %75 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg15) - %76 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %75) - store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8 - store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8 + store %"int[]" %53, ptr %indirectarg12, align 8 + %54 = call i32 @test_sum_us(ptr align 8 %indirectarg12) + %55 = call i32 (ptr, ...) @printf(ptr @.str.18, i32 %54) + %56 = getelementptr inbounds [1 x i32], ptr %varargslots13, i64 0, i64 0 + store i32 1, ptr %56, align 4 + %57 = insertvalue %"int[]" undef, ptr %varargslots13, 0 + %58 = insertvalue %"int[]" %57, i64 1, 1 + store %"int[]" %58, ptr %indirectarg14, align 8 + %59 = call i32 @test_sum_us(ptr align 8 %indirectarg14) + %60 = call i32 (ptr, ...) @printf(ptr @.str.19, i32 %59) + store %"int[]" zeroinitializer, ptr %indirectarg15, align 8 + %61 = call i32 @test_sum_us(ptr align 8 %indirectarg15) + %62 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %61) + store ptr null, ptr %a1, align 8 + store ptr null, ptr %b2, align 8 ret void } -declare void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i32, i1 immarg) #1 +declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg) #1 declare void @hello_world_hello() -declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #2 +declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2 -declare void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList*, i32) +declare void @"std_array_linkedlist$$int_LinkedList_push"(ptr, i32) -declare i64 @"std_array_linkedlist$$int_LinkedList_len"(%LinkedList*) +declare i64 @"std_array_linkedlist$$int_LinkedList_len"(ptr) -declare i32 @"std_array_linkedlist$$int_LinkedList_get"(%LinkedList*, i64) +declare i32 @"std_array_linkedlist$$int_LinkedList_get"(ptr, i64) -declare void @"std_array_linkedlist$$int_LinkedList_free"(%LinkedList*) +declare void @"std_array_linkedlist$$int_LinkedList_free"(ptr) -declare void @"std_array_list$$int_List_append"(%List*, i32) +declare void @"std_array_list$$int_List_append"(ptr, i32) -declare void @"std_array_list$$int_List_push"(%List*, i32) +declare void @"std_array_list$$int_List_push"(ptr, i32) -declare void @"std_array_list$$int_List_insert_at"(%List*, i64, i32) +declare void @"std_array_list$$int_List_insert_at"(ptr, i64, i32) -declare i64 @"std_array_list$$int_List_len"(%List*) +declare i64 @"std_array_list$$int_List_len"(ptr) -declare i32 @"std_array_list$$int_List_get"(%List*, i64) - -declare void @"std_array_list$$int_List_free"(%List*) - -declare i32 @"test2$$int_getValue"(i32) - -declare double @"test2$$double_getValue"(i64) - -declare i32 @"test2$$int_getMult"(i32) +declare i32 @"std_array_list$$int_List_get"(ptr, i64) declare double @"test2$$double_getMult"(double) @@ -662,9 +634,9 @@ declare double @"test2$$double_getMult"(double) define void @hello_world_hello() #0 { entry: - %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0)) + %0 = call i32 (ptr, ...) @printf(ptr @.str) %1 = call double @"foo$$double_check"(double 1.110000e+01) - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), double %1) + %2 = call i32 (ptr, ...) @printf(ptr @.str.1, double %1) ret void } @@ -694,10 +666,10 @@ entry: define i32 @"test2$$int_getValue"(i32 %0) entry: %blob = alloca %Blob, align 4 - %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - store i32 %0, i32* %1, align 4 - %2 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - %3 = load i32, i32* %2, align 4 + %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + store i32 %0, ptr %1, align 4 + %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + %3 = load i32, ptr %2, align 4 ret i32 %3 @@ -719,10 +691,9 @@ entry: define double @"test2$$double_getValue"(i64 %0) entry: %blob = alloca %Blob, align 8 - %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - %2 = bitcast double* %1 to i64* - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 - %4 = load double, double* %3, align 8 - ret double %4 + %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + store i64 %0, ptr %1, align 8 + %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 + %3 = load double, ptr %2, align 8 + ret double %3 diff --git a/test/test_suite/functions/typeless_varargs.c3t b/test/test_suite/functions/typeless_varargs.c3t index 39019d43c..3bb818d89 100644 --- a/test/test_suite/functions/typeless_varargs.c3t +++ b/test/test_suite/functions/typeless_varargs.c3t @@ -22,85 +22,59 @@ fn int main() /* #expect: test.ll -define void @test_retest(i8* %0, i64 %1) #0 { +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @test_retest(ptr %0, i64 %1) #0 { entry: %foo = alloca %"variant[]", align 8 - %pair = bitcast %"variant[]"* %foo to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - %4 = bitcast %"variant[]"* %foo to { i8*, i64 }* - %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %4, i32 0, i32 0 - %lo = load i8*, i8** %5, align 8 - %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %4, i32 0, i32 1 - %hi = load i64, i64* %6, align 8 - call void @test_test(i8* %lo, i64 %hi) + %2 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + %4 = getelementptr inbounds %"variant[]", ptr %foo, i32 0, i32 0 + %lo = load ptr, ptr %4, align 8 + %5 = getelementptr inbounds %"variant[]", ptr %foo, i32 0, i32 1 + %hi = load i64, ptr %5, align 8 + call void @test_test(ptr %lo, i64 %hi) ret void } -; Function Attrs: nounwind -define void @test_test(i8* %0, i64 %1) #0 { +define void @test_test(ptr %0, i64 %1) #0 { entry: %foo = alloca %"variant[]", align 8 - %pair = bitcast %"variant[]"* %foo to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - %4 = getelementptr inbounds %"variant[]", %"variant[]"* %foo, i32 0, i32 0 - %5 = load %variant*, %variant** %4, align 8 - %ptroffset = getelementptr inbounds %variant, %variant* %5, i64 0 - %6 = getelementptr inbounds %variant, %variant* %ptroffset, i32 0, i32 0 - %7 = bitcast i8** %6 to i32** - %8 = load i32*, i32** %7, align 8 - %9 = load i32, i32* %8, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i32 0, i32 0), i32 %9) + %2 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + %4 = getelementptr inbounds %"variant[]", ptr %foo, i32 0, i32 0 + %5 = load ptr, ptr %4, align 8 + %ptroffset = getelementptr inbounds %variant, ptr %5, i64 0 + %6 = getelementptr inbounds %variant, ptr %ptroffset, i32 0, i32 0 + %7 = load ptr, ptr %6, align 8 + %8 = load i32, ptr %7, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %8) ret void } -; Function Attrs: nounwind define i32 @main() #0 { entry: %i = alloca i32, align 4 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %taddr3 = alloca i32, align 4 - %taddr4 = alloca %"variant[]", align 8 - store i32 1, i32* %i, align 4 - store i32 1, i32* %taddr, align 4 - %0 = bitcast i32* %taddr to i8* - %1 = insertvalue %variant undef, i8* %0, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %2, %variant* %3, align 16 - %4 = bitcast [1 x %variant]* %varargslots to %variant* - %5 = insertvalue %"variant[]" undef, %variant* %4, 0 - %6 = insertvalue %"variant[]" %5, i64 1, 1 - store %"variant[]" %6, %"variant[]"* %taddr1, align 8 - %7 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 0 - %lo = load i8*, i8** %8, align 8 - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 1 - %hi = load i64, i64* %9, align 8 - call void @test_test(i8* %lo, i64 %hi) - store i32 1, i32* %taddr3, align 4 - %10 = bitcast i32* %taddr3 to i8* - %11 = insertvalue %variant undef, i8* %10, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %13 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots2, i64 0, i64 0 - store %variant %12, %variant* %13, align 16 - %14 = bitcast [1 x %variant]* %varargslots2 to %variant* - %15 = insertvalue %"variant[]" undef, %variant* %14, 0 - %16 = insertvalue %"variant[]" %15, i64 1, 1 - store %"variant[]" %16, %"variant[]"* %taddr4, align 8 - %17 = bitcast %"variant[]"* %taddr4 to { i8*, i64 }* - %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 - %lo5 = load i8*, i8** %18, align 8 - %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 - %hi6 = load i64, i64* %19, align 8 - call void @test_retest(i8* %lo5, i64 %hi6) + %varargslots1 = alloca [1 x %variant], align 16 + %taddr2 = alloca i32, align 4 + store i32 1, ptr %i, align 4 + store i32 1, ptr %taddr, align 4 + %0 = insertvalue %variant undef, ptr %taddr, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %2 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %1, ptr %2, align 16 + call void @test_test(ptr %varargslots, i64 1) + store i32 1, ptr %taddr2, align 4 + %3 = insertvalue %variant undef, ptr %taddr2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %5 = getelementptr inbounds [1 x %variant], ptr %varargslots1, i64 0, i64 0 + store %variant %4, ptr %5, align 16 + call void @test_retest(ptr %varargslots1, i64 1) ret i32 1 -} +} \ No newline at end of file diff --git a/test/test_suite/functions/varargs.c3t b/test/test_suite/functions/varargs.c3t index 75ac34113..1147930f1 100644 --- a/test/test_suite/functions/varargs.c3t +++ b/test/test_suite/functions/varargs.c3t @@ -15,24 +15,28 @@ fn void test() printf("%f\n", z1); } -// #expect: varargs.ll +/* #expect: varargs.ll +define void @varargs_test() #0 { +entry: %x1 = alloca i8, align 1 %b = alloca i8, align 1 %z1 = alloca float, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 1) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 123) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), double 1.230000e+01) - store i8 -123, i8* %x1, align 1 - store i8 0, i8* %b, align 1 - store float 0x40289999A0000000, float* %z1, align 4 - %0 = load i8, i8* %b, align 1 + call void (ptr, ...) @printf(ptr @.str, i32 1) + call void (ptr, ...) @printf(ptr @.str.1, i32 123) + call void (ptr, ...) @printf(ptr @.str.2, double 1.230000e+01) + store i8 -123, ptr %x1, align 1 + store i8 0, ptr %b, align 1 + store float 0x40289999A0000000, ptr %z1, align 4 + %0 = load i8, ptr %b, align 1 %1 = trunc i8 %0 to i1 %boolsi = zext i1 %1 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %boolsi) - %2 = load i8, i8* %x1, align 1 + call void (ptr, ...) @printf(ptr @.str.3, i32 %boolsi) + %2 = load i8, ptr %x1, align 1 %sisiext = sext i8 %2 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), i32 %sisiext) - %3 = load float, float* %z1, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %sisiext) + %3 = load float, ptr %z1, align 4 %fpfpext = fpext float %3 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), double %fpfpext) \ No newline at end of file + call void (ptr, ...) @printf(ptr @.str.5, double %fpfpext) + ret void +} diff --git a/test/test_suite/functions/varargs_followed_by_named.c3t b/test/test_suite/functions/varargs_followed_by_named.c3t index fdb21d683..10eb6f76e 100644 --- a/test/test_suite/functions/varargs_followed_by_named.c3t +++ b/test/test_suite/functions/varargs_followed_by_named.c3t @@ -22,128 +22,81 @@ fn void main() /* #expect: foo.ll - -define void @foo_test(i32 %0, i8* %1, i64 %2, i32 %3) #0 { +define void @foo_test(i32 %0, ptr %1, i64 %2, i32 %3) #0 { entry: %y = alloca %"int[]", align 8 - %pair = bitcast %"int[]"* %y to { i8*, i64 }* - %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %1, i8** %4, align 8 - %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %2, i64* %5, align 8 - %6 = getelementptr inbounds %"int[]", %"int[]"* %y, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 + %4 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 0 + store ptr %1, ptr %4, align 8 + %5 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 1 + store i64 %2, ptr %5, align 8 + %6 = getelementptr inbounds %"int[]", ptr %y, i32 0, i32 1 + %7 = load i64, ptr %6, align 8 %uisitrunc = trunc i64 %7 to i32 - %8 = getelementptr inbounds %"int[]", %"int[]"* %y, i32 0, i32 0 - %9 = load i32*, i32** %8, align 8 - %ptroffset = getelementptr inbounds i32, i32* %9, i64 0 - %10 = load i32, i32* %ptroffset, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i32 0, i32 0), i32 %0, i32 %uisitrunc, i32 %3, i32 %10) + %8 = getelementptr inbounds %"int[]", ptr %y, i32 0, i32 0 + %9 = load ptr, ptr %8, align 8 + %ptroffset = getelementptr inbounds i32, ptr %9, i64 0 + %10 = load i32, ptr %ptroffset, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %0, i32 %uisitrunc, i32 %3, i32 %10) ret void } -define void @foo_test2(i32 %0, i8* %1, i64 %2, i32 %3) #0 { +; Function Attrs: nounwind +define void @foo_test2(i32 %0, ptr %1, i64 %2, i32 %3) #0 { entry: %y = alloca %"variant[]", align 8 - %pair = bitcast %"variant[]"* %y to { i8*, i64 }* - %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %1, i8** %4, align 8 - %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %2, i64* %5, align 8 - %6 = getelementptr inbounds %"variant[]", %"variant[]"* %y, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 + %4 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 0 + store ptr %1, ptr %4, align 8 + %5 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 1 + store i64 %2, ptr %5, align 8 + %6 = getelementptr inbounds %"variant[]", ptr %y, i32 0, i32 1 + %7 = load i64, ptr %6, align 8 %uisitrunc = trunc i64 %7 to i32 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i32 %0, i32 %uisitrunc, i32 %3) + call void (ptr, ...) @printf(ptr @.str.1, i32 %0, i32 %uisitrunc, i32 %3) ret void } +; Function Attrs: nounwind define void @foo_main() #0 { entry: %varargslots = alloca [2 x i32], align 4 - %taddr = alloca %"int[]", align 8 %varargslots1 = alloca [2 x %variant], align 16 + %taddr = alloca i32, align 4 %taddr2 = alloca i32, align 4 - %taddr3 = alloca i32, align 4 - %taddr4 = alloca %"variant[]", align 8 - %varargslots7 = alloca [2 x i32], align 4 - %taddr8 = alloca %"int[]", align 8 - %varargslots11 = alloca [2 x %variant], align 16 - %taddr12 = alloca i32, align 4 - %taddr13 = alloca i32, align 4 - %taddr14 = alloca %"variant[]", align 8 - %0 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots, i64 0, i64 0 - store i32 4, i32* %0, align 4 - %1 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots, i64 0, i64 1 - store i32 5, i32* %1, align 4 - %2 = bitcast [2 x i32]* %varargslots to i32* - %3 = insertvalue %"int[]" undef, i32* %2, 0 - %4 = insertvalue %"int[]" %3, i64 2, 1 - store %"int[]" %4, %"int[]"* %taddr, align 8 - %5 = bitcast %"int[]"* %taddr to { i8*, i64 }* - %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %5, i32 0, i32 0 - %lo = load i8*, i8** %6, align 8 - %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %5, i32 0, i32 1 - %hi = load i64, i64* %7, align 8 - call void @foo_test(i32 3, i8* %lo, i64 %hi, i32 123) - store i32 4, i32* %taddr2, align 4 - %8 = bitcast i32* %taddr2 to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %11 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots1, i64 0, i64 0 - store %variant %10, %variant* %11, align 16 - store i32 5, i32* %taddr3, align 4 - %12 = bitcast i32* %taddr3 to i8* - %13 = insertvalue %variant undef, i8* %12, 0 - %14 = insertvalue %variant %13, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %15 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots1, i64 0, i64 1 - store %variant %14, %variant* %15, align 16 - %16 = bitcast [2 x %variant]* %varargslots1 to %variant* - %17 = insertvalue %"variant[]" undef, %variant* %16, 0 - %18 = insertvalue %"variant[]" %17, i64 2, 1 - store %"variant[]" %18, %"variant[]"* %taddr4, align 8 - %19 = bitcast %"variant[]"* %taddr4 to { i8*, i64 }* - %20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %19, i32 0, i32 0 - %lo5 = load i8*, i8** %20, align 8 - %21 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %19, i32 0, i32 1 - %hi6 = load i64, i64* %21, align 8 - call void @foo_test2(i32 3, i8* %lo5, i64 %hi6, i32 123) - %22 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots7, i64 0, i64 0 - store i32 4, i32* %22, align 4 - %23 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots7, i64 0, i64 1 - store i32 5, i32* %23, align 4 - %24 = bitcast [2 x i32]* %varargslots7 to i32* - %25 = insertvalue %"int[]" undef, i32* %24, 0 - %26 = insertvalue %"int[]" %25, i64 2, 1 - store %"int[]" %26, %"int[]"* %taddr8, align 8 - %27 = bitcast %"int[]"* %taddr8 to { i8*, i64 }* - %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 0 - %lo9 = load i8*, i8** %28, align 8 - %29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 1 - %hi10 = load i64, i64* %29, align 8 - call void @foo_test(i32 3, i8* %lo9, i64 %hi10, i32 2) - store i32 4, i32* %taddr12, align 4 - %30 = bitcast i32* %taddr12 to i8* - %31 = insertvalue %variant undef, i8* %30, 0 - %32 = insertvalue %variant %31, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %33 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots11, i64 0, i64 0 - store %variant %32, %variant* %33, align 16 - store i32 5, i32* %taddr13, align 4 - %34 = bitcast i32* %taddr13 to i8* - %35 = insertvalue %variant undef, i8* %34, 0 - %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %37 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots11, i64 0, i64 1 - store %variant %36, %variant* %37, align 16 - %38 = bitcast [2 x %variant]* %varargslots11 to %variant* - %39 = insertvalue %"variant[]" undef, %variant* %38, 0 - %40 = insertvalue %"variant[]" %39, i64 2, 1 - store %"variant[]" %40, %"variant[]"* %taddr14, align 8 - %41 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* - %42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0 - %lo15 = load i8*, i8** %42, align 8 - %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1 - %hi16 = load i64, i64* %43, align 8 - call void @foo_test2(i32 3, i8* %lo15, i64 %hi16, i32 2) + %varargslots3 = alloca [2 x i32], align 4 + %varargslots4 = alloca [2 x %variant], align 16 + %taddr5 = alloca i32, align 4 + %taddr6 = alloca i32, align 4 + %0 = getelementptr inbounds [2 x i32], ptr %varargslots, i64 0, i64 0 + store i32 4, ptr %0, align 4 + %1 = getelementptr inbounds [2 x i32], ptr %varargslots, i64 0, i64 1 + store i32 5, ptr %1, align 4 + call void @foo_test(i32 3, ptr %varargslots, i64 2, i32 123) + store i32 4, ptr %taddr, align 4 + %2 = insertvalue %variant undef, ptr %taddr, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %4 = getelementptr inbounds [2 x %variant], ptr %varargslots1, i64 0, i64 0 + store %variant %3, ptr %4, align 16 + store i32 5, ptr %taddr2, align 4 + %5 = insertvalue %variant undef, ptr %taddr2, 0 + %6 = insertvalue %variant %5, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %7 = getelementptr inbounds [2 x %variant], ptr %varargslots1, i64 0, i64 1 + store %variant %6, ptr %7, align 16 + call void @foo_test2(i32 3, ptr %varargslots1, i64 2, i32 123) + %8 = getelementptr inbounds [2 x i32], ptr %varargslots3, i64 0, i64 0 + store i32 4, ptr %8, align 4 + %9 = getelementptr inbounds [2 x i32], ptr %varargslots3, i64 0, i64 1 + store i32 5, ptr %9, align 4 + call void @foo_test(i32 3, ptr %varargslots3, i64 2, i32 2) + store i32 4, ptr %taddr5, align 4 + %10 = insertvalue %variant undef, ptr %taddr5, 0 + %11 = insertvalue %variant %10, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %12 = getelementptr inbounds [2 x %variant], ptr %varargslots4, i64 0, i64 0 + store %variant %11, ptr %12, align 16 + store i32 5, ptr %taddr6, align 4 + %13 = insertvalue %variant undef, ptr %taddr6, 0 + %14 = insertvalue %variant %13, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %15 = getelementptr inbounds [2 x %variant], ptr %varargslots4, i64 0, i64 1 + store %variant %14, ptr %15, align 16 + call void @foo_test2(i32 3, ptr %varargslots4, i64 2, i32 2) ret void -} - - +} \ No newline at end of file diff --git a/test/test_suite/generic/enum_set_test.c3t b/test/test_suite/generic/enum_set_test.c3t index f42e7993b..88ba51c23 100644 --- a/test/test_suite/generic/enum_set_test.c3t +++ b/test/test_suite/generic/enum_set_test.c3t @@ -33,146 +33,96 @@ entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i8, align 1 - %taddr1 = alloca %"variant[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [1 x %variant], align 16 - %taddr4 = alloca i8, align 1 - %taddr5 = alloca %"variant[]", align 8 - %retparam11 = alloca i64, align 8 - %varargslots12 = alloca [1 x %variant], align 16 - %taddr13 = alloca i8, align 1 - %taddr14 = alloca %"variant[]", align 8 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %taddr3 = alloca i8, align 1 + %retparam7 = alloca i64, align 8 + %varargslots8 = alloca [1 x %variant], align 16 + %taddr9 = alloca i8, align 1 %set2 = alloca i32, align 4 - %retparam20 = alloca i64, align 8 - %varargslots21 = alloca [1 x %variant], align 16 - %taddr22 = alloca i8, align 1 - %taddr23 = alloca %"variant[]", align 8 - %retparam29 = alloca i64, align 8 - %varargslots30 = alloca [1 x %variant], align 16 - %taddr31 = alloca i8, align 1 - %taddr32 = alloca %"variant[]", align 8 - store i32 0, i32* %set, align 4 - %0 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) - store i8 %0, i8* %taddr, align 1 - %1 = insertvalue %variant undef, i8* %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %2, %variant* %3, align 16 - %4 = bitcast [1 x %variant]* %varargslots to %variant* - %5 = insertvalue %"variant[]" undef, %variant* %4, 0 - %6 = insertvalue %"variant[]" %5, i64 1, 1 - store %"variant[]" %6, %"variant[]"* %taddr1, align 8 - %7 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 0 - %lo = load i8*, i8** %8, align 8 - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 1 - %hi = load i64, i64* %9, align 8 - %10 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0), i64 14, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %10, 0 + %retparam13 = alloca i64, align 8 + %varargslots14 = alloca [1 x %variant], align 16 + %taddr15 = alloca i8, align 1 + %retparam19 = alloca i64, align 8 + %varargslots20 = alloca [1 x %variant], align 16 + %taddr21 = alloca i8, align 1 + store i32 0, ptr %set, align 4 + %0 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) + store i8 %0, ptr %taddr, align 1 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 14, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - call void @"std_enumset$$test_Abc_EnumSet_add"(i32* %set, i32 0) - %11 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) - store i8 %11, i8* %taddr4, align 1 - %12 = insertvalue %variant undef, i8* %taddr4, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %14 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 - store %variant %13, %variant* %14, align 16 - %15 = bitcast [1 x %variant]* %varargslots3 to %variant* - %16 = insertvalue %"variant[]" undef, %variant* %15, 0 - %17 = insertvalue %"variant[]" %16, i64 1, 1 - store %"variant[]" %17, %"variant[]"* %taddr5, align 8 - %18 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 0 - %lo6 = load i8*, i8** %19, align 8 - %20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 1 - %hi7 = load i64, i64* %20, align 8 - %21 = call i64 @std_io_printf(i64* %retparam2, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0), i64 14, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %21, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + call void @"std_enumset$$test_Abc_EnumSet_add"(ptr %set, i32 0) + %5 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) + store i8 %5, ptr %taddr3, align 1 + %6 = insertvalue %variant undef, ptr %taddr3, 0 + %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %8 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %7, ptr %8, align 16 + %9 = call i64 @std_io_printf(ptr %retparam1, ptr @.str.1, i64 14, ptr %varargslots2, i64 1) + %not_err4 = icmp eq i64 %9, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %voiderr - br label %voiderr10 +after_check5: ; preds = %voiderr + br label %voiderr6 -voiderr10: ; preds = %after_check9, %voiderr - call void @"std_enumset$$test_Abc_EnumSet_add"(i32* %set, i32 1) - %22 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) - store i8 %22, i8* %taddr13, align 1 - %23 = insertvalue %variant undef, i8* %taddr13, 0 - %24 = insertvalue %variant %23, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %25 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 - store %variant %24, %variant* %25, align 16 - %26 = bitcast [1 x %variant]* %varargslots12 to %variant* - %27 = insertvalue %"variant[]" undef, %variant* %26, 0 - %28 = insertvalue %"variant[]" %27, i64 1, 1 - store %"variant[]" %28, %"variant[]"* %taddr14, align 8 - %29 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* - %30 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %29, i32 0, i32 0 - %lo15 = load i8*, i8** %30, align 8 - %31 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %29, i32 0, i32 1 - %hi16 = load i64, i64* %31, align 8 - %32 = call i64 @std_io_printf(i64* %retparam11, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i32 0, i32 0), i64 14, i8* %lo15, i64 %hi16) - %not_err17 = icmp eq i64 %32, 0 - br i1 %not_err17, label %after_check18, label %voiderr19 +voiderr6: ; preds = %after_check5, %voiderr + call void @"std_enumset$$test_Abc_EnumSet_add"(ptr %set, i32 1) + %10 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) + store i8 %10, ptr %taddr9, align 1 + %11 = insertvalue %variant undef, ptr %taddr9, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %13 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 + store %variant %12, ptr %13, align 16 + %14 = call i64 @std_io_printf(ptr %retparam7, ptr @.str.2, i64 14, ptr %varargslots8, i64 1) + %not_err10 = icmp eq i64 %14, 0 + br i1 %not_err10, label %after_check11, label %voiderr12 -after_check18: ; preds = %voiderr10 - br label %voiderr19 +after_check11: ; preds = %voiderr6 + br label %voiderr12 -voiderr19: ; preds = %after_check18, %voiderr10 - store i32 0, i32* %set2, align 4 - %33 = load i32, i32* %set, align 4 - call void @"std_enumset$$test_Abc_EnumSet_add_all"(i32* %set2, i32 %33) - %34 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set2, i32 1) - store i8 %34, i8* %taddr22, align 1 - %35 = insertvalue %variant undef, i8* %taddr22, 0 - %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %37 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots21, i64 0, i64 0 - store %variant %36, %variant* %37, align 16 - %38 = bitcast [1 x %variant]* %varargslots21 to %variant* - %39 = insertvalue %"variant[]" undef, %variant* %38, 0 - %40 = insertvalue %"variant[]" %39, i64 1, 1 - store %"variant[]" %40, %"variant[]"* %taddr23, align 8 - %41 = bitcast %"variant[]"* %taddr23 to { i8*, i64 }* - %42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0 - %lo24 = load i8*, i8** %42, align 8 - %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1 - %hi25 = load i64, i64* %43, align 8 - %44 = call i64 @std_io_printf(i64* %retparam20, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 14, i8* %lo24, i64 %hi25) - %not_err26 = icmp eq i64 %44, 0 - br i1 %not_err26, label %after_check27, label %voiderr28 +voiderr12: ; preds = %after_check11, %voiderr6 + store i32 0, ptr %set2, align 4 + %15 = load i32, ptr %set, align 4 + call void @"std_enumset$$test_Abc_EnumSet_add_all"(ptr %set2, i32 %15) + %16 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set2, i32 1) + store i8 %16, ptr %taddr15, align 1 + %17 = insertvalue %variant undef, ptr %taddr15, 0 + %18 = insertvalue %variant %17, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %19 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 + store %variant %18, ptr %19, align 16 + %20 = call i64 @std_io_printf(ptr %retparam13, ptr @.str.3, i64 14, ptr %varargslots14, i64 1) + %not_err16 = icmp eq i64 %20, 0 + br i1 %not_err16, label %after_check17, label %voiderr18 -after_check27: ; preds = %voiderr19 - br label %voiderr28 +after_check17: ; preds = %voiderr12 + br label %voiderr18 -voiderr28: ; preds = %after_check27, %voiderr19 - %45 = load i32, i32* %set2, align 4 - call void @"std_enumset$$test_Abc_EnumSet_remove_all"(i32* %set, i32 %45) - %46 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) - store i8 %46, i8* %taddr31, align 1 - %47 = insertvalue %variant undef, i8* %taddr31, 0 - %48 = insertvalue %variant %47, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %49 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots30, i64 0, i64 0 - store %variant %48, %variant* %49, align 16 - %50 = bitcast [1 x %variant]* %varargslots30 to %variant* - %51 = insertvalue %"variant[]" undef, %variant* %50, 0 - %52 = insertvalue %"variant[]" %51, i64 1, 1 - store %"variant[]" %52, %"variant[]"* %taddr32, align 8 - %53 = bitcast %"variant[]"* %taddr32 to { i8*, i64 }* - %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 0 - %lo33 = load i8*, i8** %54, align 8 - %55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 1 - %hi34 = load i64, i64* %55, align 8 - %56 = call i64 @std_io_printf(i64* %retparam29, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i32 0, i32 0), i64 14, i8* %lo33, i64 %hi34) - %not_err35 = icmp eq i64 %56, 0 - br i1 %not_err35, label %after_check36, label %voiderr37 +voiderr18: ; preds = %after_check17, %voiderr12 + %21 = load i32, ptr %set2, align 4 + call void @"std_enumset$$test_Abc_EnumSet_remove_all"(ptr %set, i32 %21) + %22 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) + store i8 %22, ptr %taddr21, align 1 + %23 = insertvalue %variant undef, ptr %taddr21, 0 + %24 = insertvalue %variant %23, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %25 = getelementptr inbounds [1 x %variant], ptr %varargslots20, i64 0, i64 0 + store %variant %24, ptr %25, align 16 + %26 = call i64 @std_io_printf(ptr %retparam19, ptr @.str.4, i64 14, ptr %varargslots20, i64 1) + %not_err22 = icmp eq i64 %26, 0 + br i1 %not_err22, label %after_check23, label %voiderr24 -after_check36: ; preds = %voiderr28 - br label %voiderr37 +after_check23: ; preds = %voiderr18 + br label %voiderr24 -voiderr37: ; preds = %after_check36, %voiderr28 +voiderr24: ; preds = %after_check23, %voiderr18 ret void } diff --git a/test/test_suite/generic/generic_idents.c3t b/test/test_suite/generic/generic_idents.c3t index 0cdd133a5..9b8e5acc3 100644 --- a/test/test_suite/generic/generic_idents.c3t +++ b/test/test_suite/generic/generic_idents.c3t @@ -64,6 +64,5 @@ declare double @"gen$$double_addMult"(double, double, double) // #expect: gen.double.ll define double @"gen$$double_addMult"(double %0, double %1, double %2) -entry: %3 = call double @llvm.fmuladd.f64(double %0, double %1, double %2) ret double %3 diff --git a/test/test_suite/generic/generic_num.c3t b/test/test_suite/generic/generic_num.c3t index 86e498a98..5f2526db0 100644 --- a/test/test_suite/generic/generic_num.c3t +++ b/test/test_suite/generic/generic_num.c3t @@ -14,7 +14,7 @@ import std::io; fn void main() { - io::printfln("%d", xint(4)); + io::printfn("%d", xint(4)); } /* #expect: test.ll @@ -24,25 +24,14 @@ entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 %0 = call i32 @"hello$$int._123_x"(i32 4) - store i32 %0, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr1, align 8 - %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %11, 0 + store i32 %0, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry @@ -50,4 +39,5 @@ after_check: ; preds = %entry voiderr: ; preds = %after_check, %entry ret void -} \ No newline at end of file +} + diff --git a/test/test_suite/globals/external_global.c3t b/test/test_suite/globals/external_global.c3t index eca23cf05..358c132e1 100644 --- a/test/test_suite/globals/external_global.c3t +++ b/test/test_suite/globals/external_global.c3t @@ -21,14 +21,15 @@ fn int extract_or_test_files() return 0; } -// #expect: test.ll +/* #expect: test.ll -%UzGlobs = type { i8, [1 x %MinInfo], %MinInfo* } + +%UzGlobs = type { i8, [1 x %MinInfo], ptr } %MinInfo = type { i64, i32 } @g = external global %UzGlobs, align 8 entry: - store %MinInfo* getelementptr inbounds (%UzGlobs, %UzGlobs* @g, i32 0, i32 1, i32 0), %MinInfo** getelementptr inbounds (%UzGlobs, %UzGlobs* @g, i32 0, i32 2), align 8 + store ptr getelementptr inbounds (%UzGlobs, ptr @g, i32 0, i32 1), ptr getelementptr inbounds (%UzGlobs, ptr @g, i32 0, i32 2), align 8 ret i32 0 -} \ No newline at end of file +} diff --git a/test/test_suite/globals/global_align.c3t b/test/test_suite/globals/global_align.c3t index 9efcc00b0..d53034854 100644 --- a/test/test_suite/globals/global_align.c3t +++ b/test/test_suite/globals/global_align.c3t @@ -16,7 +16,7 @@ fn void test() define void @abc_test() #0 { entry: %x = alloca i32, align 4 - %0 = load i32, i32* @abc_foo, align 32 - store i32 %0, i32* %x, align 4 + %0 = load i32, ptr @abc_foo, align 32 + store i32 %0, ptr %x, align 4 ret void } diff --git a/test/test_suite/globals/static_global.c3 b/test/test_suite/globals/static_global.c3 index cdeaf9872..b8fdf0397 100644 --- a/test/test_suite/globals/static_global.c3 +++ b/test/test_suite/globals/static_global.c3 @@ -1 +1 @@ -static int ifej; // #error: 'static' can only used with local variables \ No newline at end of file +static int ifej; // #error: 'static' can only used with local variables, to hide global variables \ No newline at end of file diff --git a/test/test_suite/import/access_other_module.c3t b/test/test_suite/import/access_other_module.c3t index 71cf2d00d..afc52275e 100644 --- a/test/test_suite/import/access_other_module.c3t +++ b/test/test_suite/import/access_other_module.c3t @@ -13,11 +13,11 @@ fn void main() define void @foo_main() #0 { entry: - %foekf = alloca i8*, align 8 - %xok = alloca i32*, align 8 - store i8* bitcast (i32 (i8*, ...)* @printf to i8*), i8** %foekf, align 8 - store i32* @libc_EXIT_SUCCESS, i32** %xok, align 8 + %foekf = alloca ptr, align 8 + %xok = alloca ptr, align 8 + store ptr @printf, ptr %foekf, align 8 + store ptr @libc_EXIT_SUCCESS, ptr %xok, align 8 ret void } -declare i32 @printf(i8*, ...) \ No newline at end of file +declare i32 @printf(ptr, ...) \ No newline at end of file diff --git a/test/test_suite/initialize/initialize_finalize.c3t b/test/test_suite/initialize/initialize_finalize.c3t index 7e15bce28..a3df1e4e2 100644 --- a/test/test_suite/initialize/initialize_finalize.c3t +++ b/test/test_suite/initialize/initialize_finalize.c3t @@ -31,32 +31,32 @@ static finalize /* #expect: test.ll -@llvm.global_ctors = appending global [3 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 300, void ()* @.static_initialize.0, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @.static_initialize.1, i8* null }, { i32, void ()*, i8* } { i32 200, void ()* @.static_initialize.2, i8* null }] -@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @.static_finalize.0, i8* null }] +@llvm.global_ctors = appending global [3 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 300, ptr @.static_initialize.0, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @.static_initialize.1, ptr null }, { i32, ptr, ptr } { i32 200, ptr @.static_initialize.2, ptr null }] +@llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @.static_finalize.0, ptr null }] define internal void @.static_initialize.0() { entry: - call void @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0)) + call void @puts(ptr @.str) ret void } ; Function Attrs: nounwind -declare void @puts(i8*) #0 +declare void @puts(ptr) #0 define internal void @.static_initialize.1() { entry: - call void @puts(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.1, i32 0, i32 0)) + call void @puts(ptr @.str.1) ret void } define internal void @.static_initialize.2() { entry: - call void @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i32 0, i32 0)) + call void @puts(ptr @.str.2) ret void } define internal void @.static_finalize.0() { entry: - call void @puts(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i32 0, i32 0)) + call void @puts(ptr @.str.3) ret void -} +} \ No newline at end of file diff --git a/test/test_suite/initializer_lists/fasta.c3t b/test/test_suite/initializer_lists/fasta.c3t index 233708ece..bb38c3c9c 100644 --- a/test/test_suite/initializer_lists/fasta.c3t +++ b/test/test_suite/initializer_lists/fasta.c3t @@ -107,8 +107,8 @@ fn void main(int argc, char **argv) /* #expect: fasta.ll -%"char[]" = type { i8*, i64 } -%"double[]" = type { double*, i64 } +%"char[]" = type { ptr, i64 } +%"double[]" = type { ptr, i64 } @fasta_IM = local_unnamed_addr constant i32 139968, align 4 @fasta_IA = local_unnamed_addr constant i32 3877, align 4 @@ -116,15 +116,15 @@ fn void main(int argc, char **argv) @fasta_SEED = local_unnamed_addr constant i32 42, align 4 @fasta_seed = local_unnamed_addr global i32 42, align 4 @.str = private unnamed_addr constant [288 x i8] c"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA\00", align 1 -@fasta_alu = protected unnamed_addr global %"char[]" { i8* getelementptr inbounds ([288 x i8], [288 x i8]* @.str, i32 0, i32 0), i64 287 }, align 8 +@fasta_alu = protected unnamed_addr global %"char[]" { ptr @.str, i64 287 }, align 8 @.str.11 = private unnamed_addr constant [16 x i8] c"acgtBDHKMNRSVWY\00", align 1 -@fasta_iub = local_unnamed_addr global %"char[]" { i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.11, i32 0, i32 0), i64 15 }, align 8 +@fasta_iub = local_unnamed_addr global %"char[]" { ptr @.str.11, i64 15 }, align 8 @.taddr = private global [15 x double] [double 2.700000e-01, double 1.200000e-01, double 1.200000e-01, double 2.700000e-01, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02], align 8 -@fasta_iub_p = local_unnamed_addr global %"double[]" { double* getelementptr inbounds ([15 x double], [15 x double]* @.taddr, i32 0, i32 0), i64 15 }, align 8 +@fasta_iub_p = local_unnamed_addr global %"double[]" { ptr @.taddr, i64 15 }, align 8 @.str.12 = private unnamed_addr constant [5 x i8] c"acgt\00", align 1 -@fasta_homosapiens = local_unnamed_addr global %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i32 0, i32 0), i64 4 }, align 8 +@fasta_homosapiens = local_unnamed_addr global %"char[]" { ptr @.str.12, i64 4 }, align 8 @.taddr.13 = private global [4 x double] [double 0x3FD3639D20BAEB5B, double 0x3FC957AE3DCD561B, double 0x3FC9493AEAB6C2BF, double 0x3FD34BEE4B030838], align 8 -@fasta_homosapiens_p = local_unnamed_addr global %"double[]" { double* getelementptr inbounds ([4 x double], [4 x double]* @.taddr.13, i32 0, i32 0), i64 4 }, align 8 +@fasta_homosapiens_p = local_unnamed_addr global %"double[]" { ptr @.taddr.13, i64 4 }, align 8 @fasta_LINELEN = local_unnamed_addr constant i32 60, align 4 @.str.14 = private unnamed_addr constant [23 x i8] c">ONE Homo sapiens alu\0A\00", align 1 @.str.15 = private unnamed_addr constant [26 x i8] c">TWO IUB ambiguity codes\0A\00", align 1 @@ -133,12 +133,12 @@ fn void main(int argc, char **argv) ; Function Attrs: nounwind define float @fasta_fasta_rand(float %0) #0 { entry: - %1 = load i32, i32* @fasta_seed, align 4 + %1 = load i32, ptr @fasta_seed, align 4 %mul = mul i32 %1, 3877 %add = add i32 %mul, 29573 %umod = urem i32 %add, 139968 - store i32 %umod, i32* @fasta_seed, align 4 - %2 = load i32, i32* @fasta_seed, align 4 + store i32 %umod, ptr @fasta_seed, align 4 + %2 = load i32, ptr @fasta_seed, align 4 %uifp = uitofp i32 %2 to float %fmul = fmul float %0, %uifp %fdiv = fdiv float %fmul, 1.399680e+05 @@ -146,48 +146,47 @@ entry: } ; Function Attrs: nounwind -declare i32 @atoi(i8*) #0 +declare i32 @atoi(ptr) #0 ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind declare void @putchar(i32) #0 ; Function Attrs: nounwind -define void @fasta_repeat_fasta(i8* %0, i64 %1, i32 %2) #0 { +define void @fasta_repeat_fasta(ptr %0, i64 %1, i32 %2) #0 { entry: %seq = alloca %"char[]", align 8 %len = alloca i64, align 8 %i = alloca i32, align 4 - %pair = bitcast %"char[]"* %seq to { i8*, i64 }* - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %3, align 8 - %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %4, align 8 - %5 = getelementptr inbounds %"char[]", %"char[]"* %seq, i32 0, i32 1 - %6 = load i64, i64* %5, align 8 - store i64 %6, i64* %len, align 8 - store i32 0, i32* %i, align 4 + %3 = getelementptr inbounds { ptr, i64 }, ptr %seq, i32 0, i32 0 + store ptr %0, ptr %3, align 8 + %4 = getelementptr inbounds { ptr, i64 }, ptr %seq, i32 0, i32 1 + store i64 %1, ptr %4, align 8 + %5 = getelementptr inbounds %"char[]", ptr %seq, i32 0, i32 1 + %6 = load i64, ptr %5, align 8 + store i64 %6, ptr %len, align 8 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %if.exit, %entry - %7 = load i32, i32* %i, align 4 + %7 = load i32, ptr %i, align 4 %lt = icmp slt i32 %7, %2 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %8 = getelementptr inbounds %"char[]", %"char[]"* %seq, i32 0, i32 0 - %9 = load i8*, i8** %8, align 8 - %10 = load i32, i32* %i, align 4 + %8 = getelementptr inbounds %"char[]", ptr %seq, i32 0, i32 0 + %9 = load ptr, ptr %8, align 8 + %10 = load i32, ptr %i, align 4 %sisiext = sext i32 %10 to i64 - %11 = load i64, i64* %len, align 8 + %11 = load i64, ptr %len, align 8 %smod = srem i64 %sisiext, %11 - %ptroffset = getelementptr inbounds i8, i8* %9, i64 %smod - %12 = load i8, i8* %ptroffset, align 1 + %ptroffset = getelementptr inbounds i8, ptr %9, i64 %smod + %12 = load i8, ptr %ptroffset, align 1 %uisiext = zext i8 %12 to i32 call void @putchar(i32 %uisiext) - %13 = load i32, i32* %i, align 4 + %13 = load i32, ptr %i, align 4 %smod1 = srem i32 %13, 60 %eq = icmp eq i32 %smod1, 59 br i1 %eq, label %if.then, label %if.exit @@ -197,13 +196,13 @@ if.then: ; preds = %loop.body br label %if.exit if.exit: ; preds = %if.then, %loop.body - %14 = load i32, i32* %i, align 4 + %14 = load i32, ptr %i, align 4 %add = add i32 %14, 1 - store i32 %add, i32* %i, align 4 + store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - %15 = load i32, i32* %i, align 4 + %15 = load i32, ptr %i, align 4 %smod2 = srem i32 %15, 60 %neq = icmp ne i32 %smod2, 0 br i1 %neq, label %if.then3, label %if.exit4 @@ -217,7 +216,7 @@ if.exit4: ; preds = %if.then3, %loop.exi } ; Function Attrs: nounwind -define void @fasta_random_fasta(i8* %0, i64 %1, i8* %2, i64 %3, i32 %4) #0 { +define void @fasta_random_fasta(ptr %0, i64 %1, ptr %2, i64 %3, i32 %4) #0 { entry: %symb = alloca %"char[]", align 8 %probability = alloca %"double[]", align 8 @@ -225,152 +224,150 @@ entry: %i = alloca i32, align 4 %v = alloca double, align 8 %j = alloca i32, align 4 - %pair = bitcast %"char[]"* %symb to { i8*, i64 }* - %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %5, align 8 - %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %6, align 8 - %pair1 = bitcast %"double[]"* %probability to { i8*, i64 }* - %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 0 - store i8* %2, i8** %7, align 8 - %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 1 - store i64 %3, i64* %8, align 8 - %9 = getelementptr inbounds %"char[]", %"char[]"* %symb, i32 0, i32 1 - %10 = load i64, i64* %9, align 8 - %11 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 1 - %12 = load i64, i64* %11, align 8 + %5 = getelementptr inbounds { ptr, i64 }, ptr %symb, i32 0, i32 0 + store ptr %0, ptr %5, align 8 + %6 = getelementptr inbounds { ptr, i64 }, ptr %symb, i32 0, i32 1 + store i64 %1, ptr %6, align 8 + %7 = getelementptr inbounds { ptr, i64 }, ptr %probability, i32 0, i32 0 + store ptr %2, ptr %7, align 8 + %8 = getelementptr inbounds { ptr, i64 }, ptr %probability, i32 0, i32 1 + store i64 %3, ptr %8, align 8 + %9 = getelementptr inbounds %"char[]", ptr %symb, i32 0, i32 1 + %10 = load i64, ptr %9, align 8 + %11 = getelementptr inbounds %"double[]", ptr %probability, i32 0, i32 1 + %12 = load i64, ptr %11, align 8 %eq = icmp eq i64 %10, %12 call void @llvm.assume(i1 %eq) - %13 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 1 - %14 = load i64, i64* %13, align 8 + %13 = getelementptr inbounds %"double[]", ptr %probability, i32 0, i32 1 + %14 = load i64, ptr %13, align 8 %uisitrunc = trunc i64 %14 to i32 - store i32 %uisitrunc, i32* %len, align 4 - store i32 0, i32* %i, align 4 + store i32 %uisitrunc, ptr %len, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond -loop.cond: ; preds = %if.exit10, %entry - %15 = load i32, i32* %i, align 4 +loop.cond: ; preds = %if.exit9, %entry + %15 = load i32, ptr %i, align 4 %lt = icmp slt i32 %15, %4 - br i1 %lt, label %loop.body, label %loop.exit12 + br i1 %lt, label %loop.body, label %loop.exit11 loop.body: ; preds = %loop.cond %16 = call float @fasta_fasta_rand(float 1.000000e+00) %fpfpext = fpext float %16 to double - store double %fpfpext, double* %v, align 8 - store i32 0, i32* %j, align 4 - br label %loop.cond2 + store double %fpfpext, ptr %v, align 8 + store i32 0, ptr %j, align 4 + br label %loop.cond1 -loop.cond2: ; preds = %if.exit, %loop.body - %17 = load i32, i32* %j, align 4 - %18 = load i32, i32* %len, align 4 +loop.cond1: ; preds = %if.exit, %loop.body + %17 = load i32, ptr %j, align 4 + %18 = load i32, ptr %len, align 4 %sub = sub i32 %18, 1 - %lt3 = icmp slt i32 %17, %sub - br i1 %lt3, label %loop.body4, label %loop.exit + %lt2 = icmp slt i32 %17, %sub + br i1 %lt2, label %loop.body3, label %loop.exit -loop.body4: ; preds = %loop.cond2 - %19 = load double, double* %v, align 8 - %20 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 0 - %21 = load double*, double** %20, align 8 - %22 = load i32, i32* %j, align 4 +loop.body3: ; preds = %loop.cond1 + %19 = load double, ptr %v, align 8 + %20 = getelementptr inbounds %"double[]", ptr %probability, i32 0, i32 0 + %21 = load ptr, ptr %20, align 8 + %22 = load i32, ptr %j, align 4 %sisiext = sext i32 %22 to i64 - %ptroffset = getelementptr inbounds double, double* %21, i64 %sisiext - %23 = load double, double* %ptroffset, align 8 + %ptroffset = getelementptr inbounds double, ptr %21, i64 %sisiext + %23 = load double, ptr %ptroffset, align 8 %fsub = fsub double %19, %23 - store double %fsub, double* %v, align 8 - %24 = load double, double* %v, align 8 - %lt5 = fcmp olt double %24, 0.000000e+00 - br i1 %lt5, label %if.then, label %if.exit + store double %fsub, ptr %v, align 8 + %24 = load double, ptr %v, align 8 + %lt4 = fcmp olt double %24, 0.000000e+00 + br i1 %lt4, label %if.then, label %if.exit -if.then: ; preds = %loop.body4 +if.then: ; preds = %loop.body3 br label %loop.exit -if.exit: ; preds = %loop.body4 - %25 = load i32, i32* %j, align 4 +if.exit: ; preds = %loop.body3 + %25 = load i32, ptr %j, align 4 %add = add i32 %25, 1 - store i32 %add, i32* %j, align 4 - br label %loop.cond2 + store i32 %add, ptr %j, align 4 + br label %loop.cond1 -loop.exit: ; preds = %if.then, %loop.cond2 - %26 = getelementptr inbounds %"char[]", %"char[]"* %symb, i32 0, i32 0 - %27 = load i8*, i8** %26, align 8 - %28 = load i32, i32* %j, align 4 - %sisiext6 = sext i32 %28 to i64 - %ptroffset7 = getelementptr inbounds i8, i8* %27, i64 %sisiext6 - %29 = load i8, i8* %ptroffset7, align 1 +loop.exit: ; preds = %if.then, %loop.cond1 + %26 = getelementptr inbounds %"char[]", ptr %symb, i32 0, i32 0 + %27 = load ptr, ptr %26, align 8 + %28 = load i32, ptr %j, align 4 + %sisiext5 = sext i32 %28 to i64 + %ptroffset6 = getelementptr inbounds i8, ptr %27, i64 %sisiext5 + %29 = load i8, ptr %ptroffset6, align 1 %uisiext = zext i8 %29 to i32 call void @putchar(i32 %uisiext) - %30 = load i32, i32* %i, align 4 + %30 = load i32, ptr %i, align 4 %smod = srem i32 %30, 60 - %eq8 = icmp eq i32 %smod, 59 - br i1 %eq8, label %if.then9, label %if.exit10 + %eq7 = icmp eq i32 %smod, 59 + br i1 %eq7, label %if.then8, label %if.exit9 -if.then9: ; preds = %loop.exit +if.then8: ; preds = %loop.exit call void @putchar(i32 10) - br label %if.exit10 + br label %if.exit9 -if.exit10: ; preds = %if.then9, %loop.exit - %31 = load i32, i32* %i, align 4 - %add11 = add i32 %31, 1 - store i32 %add11, i32* %i, align 4 +if.exit9: ; preds = %if.then8, %loop.exit + %31 = load i32, ptr %i, align 4 + %add10 = add i32 %31, 1 + store i32 %add10, ptr %i, align 4 br label %loop.cond -loop.exit12: ; preds = %loop.cond - %32 = load i32, i32* %i, align 4 - %smod13 = srem i32 %32, 60 - %neq = icmp ne i32 %smod13, 0 - br i1 %neq, label %if.then14, label %if.exit15 +loop.exit11: ; preds = %loop.cond + %32 = load i32, ptr %i, align 4 + %smod12 = srem i32 %32, 60 + %neq = icmp ne i32 %smod12, 0 + br i1 %neq, label %if.then13, label %if.exit14 -if.then14: ; preds = %loop.exit12 +if.then13: ; preds = %loop.exit11 call void @putchar(i32 10) - br label %if.exit15 + br label %if.exit14 -if.exit15: ; preds = %if.then14, %loop.exit12 +if.exit14: ; preds = %if.then13, %loop.exit11 ret void } ; Function Attrs: nounwind -define void @fasta_main(i32 %0, i8** %1) #0 { +define void @fasta_main(i32 %0, ptr %1) #0 { entry: %n = alloca i32, align 4 - store i32 1000, i32* %n, align 4 + store i32 1000, ptr %n, align 4 %gt = icmp sgt i32 %0, 1 br i1 %gt, label %if.then, label %if.exit if.then: ; preds = %entry - %ptroffset = getelementptr inbounds i8*, i8** %1, i64 1 - %2 = load i8*, i8** %ptroffset, align 8 - %3 = call i32 @atoi(i8* %2) - store i32 %3, i32* %n, align 4 + %ptroffset = getelementptr inbounds ptr, ptr %1, i64 1 + %2 = load ptr, ptr %ptroffset, align 8 + %3 = call i32 @atoi(ptr %2) + store i32 %3, ptr %n, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.14, i32 0, i32 0)) - %lo = load i8*, i8** getelementptr inbounds (%"char[]", %"char[]"* @fasta_alu, i32 0, i32 0), align 8 - %hi = load i64, i64* getelementptr inbounds (%"char[]", %"char[]"* @fasta_alu, i32 0, i32 1), align 8 - %5 = load i32, i32* %n, align 4 + %4 = call i32 (ptr, ...) @printf(ptr @.str.14) + %lo = load ptr, ptr @fasta_alu, align 8 + %hi = load i64, ptr getelementptr inbounds (%"char[]", ptr @fasta_alu, i32 0, i32 1), align 8 + %5 = load i32, ptr %n, align 4 %mul = mul i32 %5, 2 - call void @fasta_repeat_fasta(i8* %lo, i64 %hi, i32 %mul) - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.15, i32 0, i32 0)) - %lo1 = load i8*, i8** getelementptr inbounds (%"char[]", %"char[]"* @fasta_iub, i32 0, i32 0), align 8 - %hi2 = load i64, i64* getelementptr inbounds (%"char[]", %"char[]"* @fasta_iub, i32 0, i32 1), align 8 - %lo3 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_iub_p to { i8*, i64 }*), i32 0, i32 0), align 8 - %hi4 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_iub_p to { i8*, i64 }*), i32 0, i32 1), align 8 - %7 = load i32, i32* %n, align 4 + call void @fasta_repeat_fasta(ptr %lo, i64 %hi, i32 %mul) + %6 = call i32 (ptr, ...) @printf(ptr @.str.15) + %lo1 = load ptr, ptr @fasta_iub, align 8 + %hi2 = load i64, ptr getelementptr inbounds (%"char[]", ptr @fasta_iub, i32 0, i32 1), align 8 + %lo3 = load ptr, ptr @fasta_iub_p, align 8 + %hi4 = load i64, ptr getelementptr inbounds (%"double[]", ptr @fasta_iub_p, i32 0, i32 1), align 8 + %7 = load i32, ptr %n, align 4 %mul5 = mul i32 %7, 3 - call void @fasta_random_fasta(i8* %lo1, i64 %hi2, i8* %lo3, i64 %hi4, i32 %mul5) - %8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.16, i32 0, i32 0)) - %lo6 = load i8*, i8** getelementptr inbounds (%"char[]", %"char[]"* @fasta_homosapiens, i32 0, i32 0), align 8 - %hi7 = load i64, i64* getelementptr inbounds (%"char[]", %"char[]"* @fasta_homosapiens, i32 0, i32 1), align 8 - %lo8 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_homosapiens_p to { i8*, i64 }*), i32 0, i32 0), align 8 - %hi9 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_homosapiens_p to { i8*, i64 }*), i32 0, i32 1), align 8 - %9 = load i32, i32* %n, align 4 + call void @fasta_random_fasta(ptr %lo1, i64 %hi2, ptr %lo3, i64 %hi4, i32 %mul5) + %8 = call i32 (ptr, ...) @printf(ptr @.str.16) + %lo6 = load ptr, ptr @fasta_homosapiens, align 8 + %hi7 = load i64, ptr getelementptr inbounds (%"char[]", ptr @fasta_homosapiens, i32 0, i32 1), align 8 + %lo8 = load ptr, ptr @fasta_homosapiens_p, align 8 + %hi9 = load i64, ptr getelementptr inbounds (%"double[]", ptr @fasta_homosapiens_p, i32 0, i32 1), align 8 + %9 = load i32, ptr %n, align 4 %mul10 = mul i32 %9, 5 - call void @fasta_random_fasta(i8* %lo6, i64 %hi7, i8* %lo8, i64 %hi9, i32 %mul10) + call void @fasta_random_fasta(ptr %lo6, i64 %hi7, ptr %lo8, i64 %hi9, i32 %mul10) ret void } -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: - call void @fasta_main(i32 %0, i8** %1) + call void @fasta_main(i32 %0, ptr %1) ret i32 0 } \ No newline at end of file diff --git a/test/test_suite/initializer_lists/general_tests.c3t b/test/test_suite/initializer_lists/general_tests.c3t index 13fe0bba3..0789d91ef 100644 --- a/test/test_suite/initializer_lists/general_tests.c3t +++ b/test/test_suite/initializer_lists/general_tests.c3t @@ -34,8 +34,8 @@ fn int test() %Baz = type { double } %Bar = type { i32, i32 } -%"int[]" = type { i32*, i64 } -%"Bar[]" = type { %Bar*, i64 } +%"int[]" = type { ptr, i64 } +%"Bar[]" = type { ptr, i64 } @"ct$general_tests_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @"ct$general_tests_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @@ -49,7 +49,7 @@ entry: %ffe = alloca %Baz, align 8 %azz = alloca [1 x i32], align 4 %foo2 = alloca i32, align 4 - %str = alloca i8*, align 8 + %str = alloca ptr, align 8 %x = alloca i8, align 1 %literal = alloca [3 x i32], align 4 %b = alloca %Bar, align 4 @@ -57,34 +57,30 @@ entry: %sub = alloca %"int[]", align 8 %foo = alloca %"Bar[]", align 8 %baz = alloca [3 x %Baz], align 16 - %0 = bitcast %Baz* %ffe to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %0, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false) - %1 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0 - store i32 0, i32* %1, align 4 - store i32 33, i32* %foo2, align 4 - store i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i8** %str, align 8 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0 - store i32 1, i32* %2, align 4 - %3 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1 - store i32 2, i32* %3, align 4 - %4 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2 - store i32 3, i32* %4, align 4 - %5 = bitcast [3 x i32]* %literal to i32* - %6 = insertvalue %"int[]" undef, i32* %5, 0 - %7 = insertvalue %"int[]" %6, i64 3, 1 - %8 = extractvalue %"int[]" %7, 1 - %not = icmp eq i64 %8, 0 - %9 = zext i1 %not to i8 - store i8 %9, i8* %x, align 1 - %10 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0 - store i32 0, i32* %10, align 4 - %11 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 - store i32 0, i32* %11, align 4 - %12 = bitcast %Baz* %z to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %12, i8 0, i64 8, i1 false) - store %"int[]" zeroinitializer, %"int[]"* %sub, align 8 - store %"Bar[]" zeroinitializer, %"Bar[]"* %foo, align 8 - %13 = bitcast [3 x %Baz]* %baz to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %13, i8 0, i64 24, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %ffe, ptr align 8 @.__const, i32 8, i1 false) + %0 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0 + store i32 0, ptr %0, align 4 + store i32 33, ptr %foo2, align 4 + store ptr @.str, ptr %str, align 8 + %1 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 0 + store i32 1, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 1 + store i32 2, ptr %2, align 4 + %3 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 2 + store i32 3, ptr %3, align 4 + %4 = insertvalue %"int[]" undef, ptr %literal, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + %6 = extractvalue %"int[]" %5, 1 + %not = icmp eq i64 %6, 0 + %7 = zext i1 %not to i8 + store i8 %7, ptr %x, align 1 + %8 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0 + store i32 0, ptr %8, align 4 + %9 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 + store i32 0, ptr %9, align 4 + call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false) + store %"int[]" zeroinitializer, ptr %sub, align 8 + store %"Bar[]" zeroinitializer, ptr %foo, align 8 + call void @llvm.memset.p0.i64(ptr align 16 %baz, i8 0, i64 24, i1 false) ret i32 1 -} \ No newline at end of file +} diff --git a/test/test_suite/initializer_lists/ranges_to_dynamic.c3t b/test/test_suite/initializer_lists/ranges_to_dynamic.c3t index 8d64221af..e5a62f0af 100644 --- a/test/test_suite/initializer_lists/ranges_to_dynamic.c3t +++ b/test/test_suite/initializer_lists/ranges_to_dynamic.c3t @@ -24,40 +24,39 @@ entry: %y = alloca [10 x i32], align 16 %.anon = alloca i64, align 8 %v = alloca i32, align 4 - %1 = bitcast [10 x i32]* %y to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %1, i8 0, i64 40, i1 false) - %2 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 0 - store i32 4, i32* %2, align 4 - %3 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 1 - store i32 4, i32* %3, align 4 - %4 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 2 - store i32 4, i32* %4, align 4 - %5 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 3 - store i32 4, i32* %5, align 4 - %6 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 6 - store i32 %0, i32* %6, align 4 - %7 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 7 - store i32 %0, i32* %7, align 4 - %8 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 8 - store i32 %0, i32* %8, align 4 - store i64 0, i64* %.anon, align 8 + call void @llvm.memset.p0.i64(ptr align 16 %y, i8 0, i64 40, i1 false) + %1 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 0 + store i32 4, ptr %1, align 4 + %2 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 1 + store i32 4, ptr %2, align 4 + %3 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 2 + store i32 4, ptr %3, align 4 + %4 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 3 + store i32 4, ptr %4, align 4 + %5 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 6 + store i32 %0, ptr %5, align 4 + %6 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 7 + store i32 %0, ptr %6, align 4 + %7 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 8 + store i32 %0, ptr %7, align 4 + store i64 0, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %9 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 10, %9 + %8 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 10, %8 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %10 = load i64, i64* %.anon, align 8 - %11 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 %10 - %12 = load i32, i32* %11, align 4 - store i32 %12, i32* %v, align 4 - %13 = load i32, i32* %v, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %13) - %14 = load i64, i64* %.anon, align 8 - %add = add i64 %14, 1 - store i64 %add, i64* %.anon, align 8 + %9 = load i64, ptr %.anon, align 8 + %10 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 %9 + %11 = load i32, ptr %10, align 4 + store i32 %11, ptr %v, align 4 + %12 = load i32, ptr %v, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %12) + %13 = load i64, ptr %.anon, align 8 + %add = add i64 %13, 1 + store i64 %add, ptr %.anon, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond diff --git a/test/test_suite/initializer_lists/statics.c3t b/test/test_suite/initializer_lists/statics.c3t index 6f906bd51..899956ca0 100644 --- a/test/test_suite/initializer_lists/statics.c3t +++ b/test/test_suite/initializer_lists/statics.c3t @@ -33,54 +33,52 @@ fn int main() /* #expect: statics.ll %Bar = type { i32, i32 } -%"Bar[]" = type { %Bar*, i64 } +%"Bar[]" = type { ptr, i64 } @"ct$statics_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @"ct$statics_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.taddr = private global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 8 -@"test$c" = internal unnamed_addr global %"Bar[]" { %Bar* getelementptr inbounds ([1 x %Bar], [1 x %Bar]* @.taddr, i32 0, i32 0), i64 1 }, align 8 +@"test$c" = internal unnamed_addr global %"Bar[]" { ptr @.taddr, i64 1 }, align 8 @.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 define void @statics_test() #0 { entry: %b = alloca %"Bar[]", align 8 %literal = alloca [1 x %Bar], align 4 - %0 = getelementptr inbounds [1 x %Bar], [1 x %Bar]* %literal, i64 0, i64 0 - %1 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 0 - store i32 1, i32* %1, align 4 - %2 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 1 - store i32 2, i32* %2, align 4 - %3 = bitcast [1 x %Bar]* %literal to %Bar* - %4 = insertvalue %"Bar[]" undef, %Bar* %3, 0 - %5 = insertvalue %"Bar[]" %4, i64 1, 1 - store %"Bar[]" %5, %"Bar[]"* %b, align 8 - %6 = getelementptr inbounds %"Bar[]", %"Bar[]"* %b, i32 0, i32 0 - %7 = load %Bar*, %Bar** %6, align 8 - %ptroffset = getelementptr inbounds %Bar, %Bar* %7, i64 0 - %8 = getelementptr inbounds %Bar, %Bar* %ptroffset, i32 0, i32 1 - %9 = load i32, i32* %8, align 4 - %10 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @"test$c", i32 0, i32 0), align 8 - %ptroffset1 = getelementptr inbounds %Bar, %Bar* %10, i64 0 - %11 = getelementptr inbounds %Bar, %Bar* %ptroffset1, i32 0, i32 1 - %12 = load i32, i32* %11, align 4 - %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i32 %9, i32 %12) - %14 = getelementptr inbounds %"Bar[]", %"Bar[]"* %b, i32 0, i32 0 - %15 = load %Bar*, %Bar** %14, align 8 - %ptroffset2 = getelementptr inbounds %Bar, %Bar* %15, i64 0 - %16 = getelementptr inbounds %Bar, %Bar* %ptroffset2, i32 0, i32 1 - %17 = load i32, i32* %16, align 4 - %add = add i32 %17, 1 - store i32 %add, i32* %16, align 4 - %18 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @"test$c", i32 0, i32 0), align 8 - %ptroffset3 = getelementptr inbounds %Bar, %Bar* %18, i64 0 - %19 = getelementptr inbounds %Bar, %Bar* %ptroffset3, i32 0, i32 1 - %20 = load i32, i32* %19, align 4 - %add4 = add i32 %20, 1 - store i32 %add4, i32* %19, align 4 + %0 = getelementptr inbounds [1 x %Bar], ptr %literal, i64 0, i64 0 + %1 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 0 + store i32 1, ptr %1, align 4 + %2 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 1 + store i32 2, ptr %2, align 4 + %3 = insertvalue %"Bar[]" undef, ptr %literal, 0 + %4 = insertvalue %"Bar[]" %3, i64 1, 1 + store %"Bar[]" %4, ptr %b, align 8 + %5 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0 + %6 = load ptr, ptr %5, align 8 + %ptroffset = getelementptr inbounds %Bar, ptr %6, i64 0 + %7 = getelementptr inbounds %Bar, ptr %ptroffset, i32 0, i32 1 + %8 = load i32, ptr %7, align 4 + %9 = load ptr, ptr @"test$c", align 8 + %ptroffset1 = getelementptr inbounds %Bar, ptr %9, i64 0 + %10 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 1 + %11 = load i32, ptr %10, align 4 + %12 = call i32 (ptr, ...) @printf(ptr @.str, i32 %8, i32 %11) + %13 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0 + %14 = load ptr, ptr %13, align 8 + %ptroffset2 = getelementptr inbounds %Bar, ptr %14, i64 0 + %15 = getelementptr inbounds %Bar, ptr %ptroffset2, i32 0, i32 1 + %16 = load i32, ptr %15, align 4 + %add = add i32 %16, 1 + store i32 %add, ptr %15, align 4 + %17 = load ptr, ptr @"test$c", align 8 + %ptroffset3 = getelementptr inbounds %Bar, ptr %17, i64 0 + %18 = getelementptr inbounds %Bar, ptr %ptroffset3, i32 0, i32 1 + %19 = load i32, ptr %18, align 4 + %add4 = add i32 %19, 1 + store i32 %add4, ptr %18, align 4 ret void } -; Function Attrs: nounwind define i32 @main() #0 { entry: call void @statics_test() @@ -89,4 +87,4 @@ entry: ret i32 1 } -declare i32 @printf(i8*, ...) +declare i32 @printf(ptr, ...) \ No newline at end of file diff --git a/test/test_suite/initializer_lists/subarrays.c3t b/test/test_suite/initializer_lists/subarrays.c3t index 9696251ad..e850895e1 100644 --- a/test/test_suite/initializer_lists/subarrays.c3t +++ b/test/test_suite/initializer_lists/subarrays.c3t @@ -46,18 +46,18 @@ fn int main() /* #expect: subarrays.ll %Bar = type { i32, i32 } -%"Bar[]" = type { %Bar*, i64 } -%"int[]" = type { i32*, i64 } +%"Bar[]" = type { ptr, i64 } +%"int[]" = type { ptr, i64 } %Baz = type { double } @"ct$subarrays_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @"ct$subarrays_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @.taddr = private global [2 x %Bar] [%Bar { i32 3, i32 4 }, %Bar { i32 8, i32 9 }], align 8 -@subarrays_arrbar = local_unnamed_addr global %"Bar[]" { %Bar* getelementptr inbounds ([2 x %Bar], [2 x %Bar]* @.taddr, i32 0, i32 0), i64 2 }, align 8 +@subarrays_arrbar = local_unnamed_addr global %"Bar[]" { ptr @.taddr, i64 2 }, align 8 @.taddr.3 = private global [2 x i32] [i32 1, i32 2], align 4 -@subarrays_xd = local_unnamed_addr global %"int[]" { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.3, i32 0, i32 0), i64 2 }, align 8 +@subarrays_xd = local_unnamed_addr global %"int[]" { ptr @.taddr.3, i64 2 }, align 8 @.taddr.4 = private global [2 x i32] [i32 3, i32 4], align 4 -@subarrays_fofeo = local_unnamed_addr global i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.4, i32 0, i32 0), align 8 +@subarrays_fofeo = local_unnamed_addr global ptr @.taddr.4, align 8 @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @.str.5 = private unnamed_addr constant [7 x i8] c"Start:\00", align 1 @.str.6 = private unnamed_addr constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1 @@ -66,13 +66,12 @@ fn int main() @.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8 @.str.9 = private unnamed_addr constant [3 x i8] c"Ok\00", align 1 -; Function Attrs: nounwind define i32 @main() #0 { entry: %w = alloca %Bar, align 4 %x = alloca %"int[]", align 8 %literal = alloca [3 x i32], align 4 - %y = alloca i32*, align 8 + %y = alloca ptr, align 8 %literal2 = alloca [3 x i32], align 4 %ffe = alloca %Baz, align 8 %azz = alloca [1 x i32], align 4 @@ -83,87 +82,79 @@ entry: %sub = alloca %"int[]", align 8 %foo = alloca %"Bar[]", align 8 %baz = alloca [3 x %Baz], align 16 - %0 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays_arrbar, i32 0, i32 0), align 8 - %ptroffset = getelementptr inbounds %Bar, %Bar* %0, i64 1 - %1 = bitcast %Bar* %w to i8* - %2 = bitcast %Bar* %ptroffset to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 8, i1 false) - %3 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays_arrbar, i32 0, i32 0), align 8 - %ptroffset1 = getelementptr inbounds %Bar, %Bar* %3, i64 1 - %4 = getelementptr inbounds %Bar, %Bar* %ptroffset1, i32 0, i32 0 - %5 = load i32, i32* %4, align 4 - %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %5) - %7 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0 - store i32 1, i32* %7, align 4 - %8 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1 - store i32 2, i32* %8, align 4 - %9 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2 - store i32 3, i32* %9, align 4 - %10 = bitcast [3 x i32]* %literal to i32* - %11 = insertvalue %"int[]" undef, i32* %10, 0 - %12 = insertvalue %"int[]" %11, i64 3, 1 - store %"int[]" %12, %"int[]"* %x, align 8 - %13 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 0 - store i32 123, i32* %13, align 4 - %14 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 1 - store i32 234, i32* %14, align 4 - %15 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 2 - store i32 567, i32* %15, align 4 - %ptrptr = bitcast [3 x i32]* %literal2 to i32* - store i32* %ptrptr, i32** %y, align 8 - %16 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #3 - %17 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 - %18 = load i64, i64* %17, align 8 - %uisitrunc = trunc i64 %18 to i32 - %19 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 - %20 = load i32*, i32** %19, align 8 - %ptroffset3 = getelementptr inbounds i32, i32* %20, i64 1 - %21 = load i32, i32* %ptroffset3, align 4 - %22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.6, i32 0, i32 0), i32 %uisitrunc, i32 %21) - %23 = load i32*, i32** %y, align 8 - %ptroffset4 = getelementptr inbounds i32, i32* %23, i64 1 - %24 = load i32, i32* %ptroffset4, align 4 - %25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.7, i32 0, i32 0), i32 %24) - %26 = load i32*, i32** @subarrays_fofeo, align 8 - %ptroffset5 = getelementptr inbounds i32, i32* %26, i64 1 - %27 = load i32, i32* %ptroffset5, align 4 - %28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0), i32 %27) - %29 = bitcast %Baz* %ffe to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %29, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false) - %30 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0 - store i32 0, i32* %30, align 4 - %31 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 0 - store i32 1, i32* %31, align 4 - %32 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 1 - store i32 2, i32* %32, align 4 - %33 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 2 - store i32 3, i32* %33, align 4 - %34 = bitcast [3 x i32]* %literal6 to i32* - %35 = insertvalue %"int[]" undef, i32* %34, 0 - %36 = insertvalue %"int[]" %35, i64 3, 1 - %37 = extractvalue %"int[]" %36, 1 - %not = icmp eq i64 %37, 0 - %38 = zext i1 %not to i8 - store i8 %38, i8* %xy, align 1 - %39 = load i8, i8* %xy, align 1 - %40 = trunc i8 %39 to i1 - %not7 = xor i1 %40, true + %0 = load ptr, ptr @subarrays_arrbar, align 8 + %ptroffset = getelementptr inbounds %Bar, ptr %0, i64 1 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %w, ptr align 4 %ptroffset, i32 8, i1 false) + %1 = load ptr, ptr @subarrays_arrbar, align 8 + %ptroffset1 = getelementptr inbounds %Bar, ptr %1, i64 1 + %2 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 0 + %3 = load i32, ptr %2, align 4 + %4 = call i32 (ptr, ...) @printf(ptr @.str, i32 %3) + %5 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 0 + store i32 1, ptr %5, align 4 + %6 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 1 + store i32 2, ptr %6, align 4 + %7 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 2 + store i32 3, ptr %7, align 4 + %8 = insertvalue %"int[]" undef, ptr %literal, 0 + %9 = insertvalue %"int[]" %8, i64 3, 1 + store %"int[]" %9, ptr %x, align 8 + %10 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 0 + store i32 123, ptr %10, align 4 + %11 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 1 + store i32 234, ptr %11, align 4 + %12 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 2 + store i32 567, ptr %12, align 4 + store ptr %literal2, ptr %y, align 8 + %13 = call i32 @std_io_println(ptr @.str.5) #3 + %14 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 + %15 = load i64, ptr %14, align 8 + %uisitrunc = trunc i64 %15 to i32 + %16 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 + %17 = load ptr, ptr %16, align 8 + %ptroffset3 = getelementptr inbounds i32, ptr %17, i64 1 + %18 = load i32, ptr %ptroffset3, align 4 + %19 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %uisitrunc, i32 %18) + %20 = load ptr, ptr %y, align 8 + %ptroffset4 = getelementptr inbounds i32, ptr %20, i64 1 + %21 = load i32, ptr %ptroffset4, align 4 + %22 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %21) + %23 = load ptr, ptr @subarrays_fofeo, align 8 + %ptroffset5 = getelementptr inbounds i32, ptr %23, i64 1 + %24 = load i32, ptr %ptroffset5, align 4 + %25 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %24) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %ffe, ptr align 8 @.__const, i32 8, i1 false) + %26 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0 + store i32 0, ptr %26, align 4 + %27 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 0 + store i32 1, ptr %27, align 4 + %28 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 1 + store i32 2, ptr %28, align 4 + %29 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 2 + store i32 3, ptr %29, align 4 + %30 = insertvalue %"int[]" undef, ptr %literal6, 0 + %31 = insertvalue %"int[]" %30, i64 3, 1 + %32 = extractvalue %"int[]" %31, 1 + %not = icmp eq i64 %32, 0 + %33 = zext i1 %not to i8 + store i8 %33, ptr %xy, align 1 + %34 = load i8, ptr %xy, align 1 + %35 = trunc i8 %34 to i1 + %not7 = xor i1 %35, true br i1 %not7, label %if.then, label %if.exit if.then: ; preds = %entry - %41 = call i32 @std_io_println(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) #3 + %36 = call i32 @std_io_println(ptr @.str.9) #3 br label %if.exit if.exit: ; preds = %if.then, %entry - %42 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0 - store i32 0, i32* %42, align 4 - %43 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 - store i32 0, i32* %43, align 4 - %44 = bitcast %Baz* %z to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %44, i8 0, i64 8, i1 false) - store %"int[]" zeroinitializer, %"int[]"* %sub, align 8 - store %"Bar[]" zeroinitializer, %"Bar[]"* %foo, align 8 - %45 = bitcast [3 x %Baz]* %baz to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %45, i8 0, i64 24, i1 false) + %37 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0 + store i32 0, ptr %37, align 4 + %38 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 + store i32 0, ptr %38, align 4 + call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false) + store %"int[]" zeroinitializer, ptr %sub, align 8 + store %"Bar[]" zeroinitializer, ptr %foo, align 8 + call void @llvm.memset.p0.i64(ptr align 16 %baz, i8 0, i64 24, i1 false) ret i32 1 } diff --git a/test/test_suite/initializer_lists/zero_init.c3t b/test/test_suite/initializer_lists/zero_init.c3t index 78605540f..7c6fbf1bc 100644 --- a/test/test_suite/initializer_lists/zero_init.c3t +++ b/test/test_suite/initializer_lists/zero_init.c3t @@ -28,7 +28,7 @@ fn int test() return 1; } -// #expect: zero_init.ll +/* #expect: zero_init.ll %Mega = type { [10 x i32] } %Bar = type { i32, i32 } @@ -43,19 +43,16 @@ entry: %sub = alloca %"int[]", align 8 %foo = alloca %"Bar[]", align 8 %baz = alloca [3 x %Baz], align 16 - %0 = bitcast %Mega* %m to i8* - call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 40, i1 false) - %1 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0 - store i32 0, i32* %2, align 4 - %3 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 - store i32 0, i32* %3, align 4 - %4 = bitcast %Baz* %z to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %4, i8 0, i64 8, i1 false) - store %"int[]" zeroinitializer, %"int[]"* %sub, align 8 - store %"Bar[]" zeroinitializer, %"Bar[]"* %foo, align 8 - %5 = bitcast [3 x %Baz]* %baz to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %5, i8 0, i64 24, i1 false) + call void @llvm.memset.p0.i64(ptr align 4 %m, i8 0, i64 40, i1 false) + %0 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0 + store i32 0, ptr %0, align 4 + %1 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 + store i32 0, ptr %2, align 4 + call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false) + store %"int[]" zeroinitializer, ptr %sub, align 8 + store %"Bar[]" zeroinitializer, ptr %foo, align 8 + call void @llvm.memset.p0.i64(ptr align 16 %baz, i8 0, i64 24, i1 false) ret i32 1 } diff --git a/test/test_suite/literals/bin_literal.c3t b/test/test_suite/literals/bin_literal.c3t index 8aac74286..3dd034aad 100644 --- a/test/test_suite/literals/bin_literal.c3t +++ b/test/test_suite/literals/bin_literal.c3t @@ -8,9 +8,9 @@ fn void main() int b = -23; int c = $$min(a, b); int d = $$max(a, b); - io::printfln("%d %d", c, d); + io::printfn("%d %d", c, d); char z = 0b1101_1101; - io::printfln("%b %b %b", z, z.rotr(1), z.rotl(1)); + io::printfn("%b %b %b", z, z.rotr(1), z.rotl(1)); } /* #expect: test.ll @@ -23,99 +23,77 @@ entry: %d = alloca i32, align 4 %retparam = alloca i64, align 8 %varargslots = alloca [2 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %z = alloca i8, align 1 %retparam1 = alloca i64, align 8 %varargslots2 = alloca [3 x %variant], align 16 %i = alloca i8, align 1 %shift = alloca i8, align 1 - %taddr3 = alloca i8, align 1 - %i4 = alloca i8, align 1 - %shift5 = alloca i8, align 1 - %taddr6 = alloca i8, align 1 - %taddr7 = alloca %"variant[]", align 8 - store i32 123, i32* %a, align 4 - store i32 -23, i32* %b, align 4 - %0 = load i32, i32* %a, align 4 - %1 = load i32, i32* %b, align 4 + %taddr = alloca i8, align 1 + %i3 = alloca i8, align 1 + %shift4 = alloca i8, align 1 + %taddr5 = alloca i8, align 1 + store i32 123, ptr %a, align 4 + store i32 -23, ptr %b, align 4 + %0 = load i32, ptr %a, align 4 + %1 = load i32, ptr %b, align 4 %2 = call i32 @llvm.smin.i32(i32 %0, i32 %1) - store i32 %2, i32* %c, align 4 - %3 = load i32, i32* %a, align 4 - %4 = load i32, i32* %b, align 4 + store i32 %2, ptr %c, align 4 + %3 = load i32, ptr %a, align 4 + %4 = load i32, ptr %b, align 4 %5 = call i32 @llvm.smax.i32(i32 %3, i32 %4) - store i32 %5, i32* %d, align 4 - %6 = bitcast i32* %c to i8* - %7 = insertvalue %variant undef, i8* %6, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %9 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %8, %variant* %9, align 16 - %10 = bitcast i32* %d to i8* - %11 = insertvalue %variant undef, i8* %10, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %13 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %12, %variant* %13, align 16 - %14 = bitcast [2 x %variant]* %varargslots to %variant* - %15 = insertvalue %"variant[]" undef, %variant* %14, 0 - %16 = insertvalue %"variant[]" %15, i64 2, 1 - store %"variant[]" %16, %"variant[]"* %taddr, align 8 - %17 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 - %lo = load i8*, i8** %18, align 8 - %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 - %hi = load i64, i64* %19, align 8 - %20 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %20, 0 + store i32 %5, ptr %d, align 4 + %6 = insertvalue %variant undef, ptr %c, 0 + %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %8 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %7, ptr %8, align 16 + %9 = insertvalue %variant undef, ptr %d, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %11 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %10, ptr %11, align 16 + %12 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 5, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %12, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - store i8 -35, i8* %z, align 1 - %21 = insertvalue %variant undef, i8* %z, 0 - %22 = insertvalue %variant %21, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - %23 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots2, i64 0, i64 0 - store %variant %22, %variant* %23, align 16 - %24 = load i8, i8* %z, align 1 - store i8 %24, i8* %i, align 1 - store i8 1, i8* %shift, align 1 - %25 = load i8, i8* %i, align 1 - %26 = load i8, i8* %i, align 1 - %27 = load i8, i8* %shift, align 1 - %28 = call i8 @llvm.fshr.i8(i8 %25, i8 %26, i8 %27) - store i8 %28, i8* %taddr3, align 1 - %29 = insertvalue %variant undef, i8* %taddr3, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - %31 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots2, i64 0, i64 1 - store %variant %30, %variant* %31, align 16 - %32 = load i8, i8* %z, align 1 - store i8 %32, i8* %i4, align 1 - store i8 1, i8* %shift5, align 1 - %33 = load i8, i8* %i4, align 1 - %34 = load i8, i8* %i4, align 1 - %35 = load i8, i8* %shift5, align 1 - %36 = call i8 @llvm.fshl.i8(i8 %33, i8 %34, i8 %35) - store i8 %36, i8* %taddr6, align 1 - %37 = insertvalue %variant undef, i8* %taddr6, 0 - %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 - %39 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots2, i64 0, i64 2 - store %variant %38, %variant* %39, align 16 - %40 = bitcast [3 x %variant]* %varargslots2 to %variant* - %41 = insertvalue %"variant[]" undef, %variant* %40, 0 - %42 = insertvalue %"variant[]" %41, i64 3, 1 - store %"variant[]" %42, %"variant[]"* %taddr7, align 8 - %43 = bitcast %"variant[]"* %taddr7 to { i8*, i64 }* - %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0 - %lo8 = load i8*, i8** %44, align 8 - %45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1 - %hi9 = load i64, i64* %45, align 8 - %46 = call i64 @std_io_printfln(i64* %retparam1, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), i64 8, i8* %lo8, i64 %hi9) - %not_err10 = icmp eq i64 %46, 0 - br i1 %not_err10, label %after_check11, label %voiderr12 + store i8 -35, ptr %z, align 1 + %13 = insertvalue %variant undef, ptr %z, 0 + %14 = insertvalue %variant %13, i64 ptrtoint (ptr @"ct$char" to i64), 1 + %15 = getelementptr inbounds [3 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %14, ptr %15, align 16 + %16 = load i8, ptr %z, align 1 + store i8 %16, ptr %i, align 1 + store i8 1, ptr %shift, align 1 + %17 = load i8, ptr %i, align 1 + %18 = load i8, ptr %i, align 1 + %19 = load i8, ptr %shift, align 1 + %20 = call i8 @llvm.fshr.i8(i8 %17, i8 %18, i8 %19) + store i8 %20, ptr %taddr, align 1 + %21 = insertvalue %variant undef, ptr %taddr, 0 + %22 = insertvalue %variant %21, i64 ptrtoint (ptr @"ct$char" to i64), 1 + %23 = getelementptr inbounds [3 x %variant], ptr %varargslots2, i64 0, i64 1 + store %variant %22, ptr %23, align 16 + %24 = load i8, ptr %z, align 1 + store i8 %24, ptr %i3, align 1 + store i8 1, ptr %shift4, align 1 + %25 = load i8, ptr %i3, align 1 + %26 = load i8, ptr %i3, align 1 + %27 = load i8, ptr %shift4, align 1 + %28 = call i8 @llvm.fshl.i8(i8 %25, i8 %26, i8 %27) + store i8 %28, ptr %taddr5, align 1 + %29 = insertvalue %variant undef, ptr %taddr5, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$char" to i64), 1 + %31 = getelementptr inbounds [3 x %variant], ptr %varargslots2, i64 0, i64 2 + store %variant %30, ptr %31, align 16 + %32 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.1, i64 8, ptr %varargslots2, i64 3) + %not_err6 = icmp eq i64 %32, 0 + br i1 %not_err6, label %after_check7, label %voiderr8 -after_check11: ; preds = %voiderr - br label %voiderr12 +after_check7: ; preds = %voiderr + br label %voiderr8 -voiderr12: ; preds = %after_check11, %voiderr +voiderr8: ; preds = %after_check7, %voiderr ret void } diff --git a/test/test_suite/macro_methods/macro_method_different_args.c3t b/test/test_suite/macro_methods/macro_method_different_args.c3t index 89e030d88..f9bbb4540 100644 --- a/test/test_suite/macro_methods/macro_method_different_args.c3t +++ b/test/test_suite/macro_methods/macro_method_different_args.c3t @@ -27,39 +27,36 @@ fn void main() define void @foo_main() #0 { entry: %a = alloca %Foo, align 4 - %this = alloca %Foo*, align 8 + %this = alloca ptr, align 8 %this1 = alloca %Foo, align 4 - %0 = bitcast %Foo* %a to i32* - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 - store i32 3, i32* %1, align 4 - %2 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 - %3 = load i32, i32* %2, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i32 %3) - %4 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 - %5 = load i32, i32* %4, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %5) - store %Foo* %a, %Foo** %this, align 8 - %6 = load %Foo*, %Foo** %this, align 8 - %7 = getelementptr inbounds %Foo, %Foo* %6, i32 0, i32 0 - store i32 4, i32* %7, align 8 - %8 = load %Foo*, %Foo** %this, align 8 - %9 = getelementptr inbounds %Foo, %Foo* %8, i32 0, i32 0 - %10 = load i32, i32* %9, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i32 %10) - %11 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 - %12 = load i32, i32* %11, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %12) - %13 = bitcast %Foo* %this1 to i8* - %14 = bitcast %Foo* %a to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %13, i8* align 4 %14, i32 4, i1 false) - %15 = getelementptr inbounds %Foo, %Foo* %this1, i32 0, i32 0 - store i32 5, i32* %15, align 4 - %16 = getelementptr inbounds %Foo, %Foo* %this1, i32 0, i32 0 - %17 = load i32, i32* %16, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0), i32 %17) - %18 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 - %19 = load i32, i32* %18, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), i32 %19) + store i32 0, ptr %a, align 4 + %0 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 + store i32 3, ptr %0, align 4 + %1 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 + %2 = load i32, ptr %1, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %2) + %3 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 + %4 = load i32, ptr %3, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %4) + store ptr %a, ptr %this, align 8 + %5 = load ptr, ptr %this, align 8 + %6 = getelementptr inbounds %Foo, ptr %5, i32 0, i32 0 + store i32 4, ptr %6, align 8 + %7 = load ptr, ptr %this, align 8 + %8 = getelementptr inbounds %Foo, ptr %7, i32 0, i32 0 + %9 = load i32, ptr %8, align 8 + call void (ptr, ...) @printf(ptr @.str.2, i32 %9) + %10 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 + %11 = load i32, ptr %10, align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %11) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %this1, ptr align 4 %a, i32 4, i1 false) + %12 = getelementptr inbounds %Foo, ptr %this1, i32 0, i32 0 + store i32 5, ptr %12, align 4 + %13 = getelementptr inbounds %Foo, ptr %this1, i32 0, i32 0 + %14 = load i32, ptr %13, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %14) + %15 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 + %16 = load i32, ptr %15, align 4 + call void (ptr, ...) @printf(ptr @.str.5, i32 %16) ret void } \ No newline at end of file diff --git a/test/test_suite/macros/macro_body_defer.c3t b/test/test_suite/macros/macro_body_defer.c3t index 0671f184c..ed32f42fc 100644 --- a/test/test_suite/macros/macro_body_defer.c3t +++ b/test/test_suite/macros/macro_body_defer.c3t @@ -49,10 +49,10 @@ fn void! main() /* #expect: foo.ll -define i64 @foo_foo(i32* %0) #0 { +define i64 @foo_foo(ptr %0) #0 { entry: %reterr = alloca i64, align 8 - store i32 1, i32* %0, align 4 + store i32 1, ptr %0, align 4 ret i64 0 } @@ -63,46 +63,46 @@ entry: %i3 = alloca i32, align 4 %reterr = alloca i64, align 8 %reterr5 = alloca i64, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0)) - store i32 34, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0)) - %0 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i32 %0) - %1 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), i32 %1) + call void (ptr, ...) @printf(ptr @.str) + call void (ptr, ...) @printf(ptr @.str.1) + call void (ptr, ...) @printf(ptr @.str.2) + store i32 34, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.3) + %0 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %0) + %1 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.5, i32 %1) br label %loop.body loop.body: ; preds = %entry - store i32 3, i32* %i1, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.7, i32 0, i32 0)) - %2 = load i32, i32* %i1, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.8, i32 0, i32 0), i32 %2) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.9, i32 0, i32 0)) + store i32 3, ptr %i1, align 4 + call void (ptr, ...) @printf(ptr @.str.6) + call void (ptr, ...) @printf(ptr @.str.7) + %2 = load i32, ptr %i1, align 4 + call void (ptr, ...) @printf(ptr @.str.8, i32 %2) + call void (ptr, ...) @printf(ptr @.str.9) br label %loop.exit loop.exit: ; preds = %loop.body br label %loop.body2 loop.body2: ; preds = %loop.exit - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i32 0, i32 0)) - store i32 3, i32* %i3, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.11, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.12, i32 0, i32 0)) - %3 = load i32, i32* %i3, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.13, i32 0, i32 0), i32 %3) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.10) + store i32 3, ptr %i3, align 4 + call void (ptr, ...) @printf(ptr @.str.11) + call void (ptr, ...) @printf(ptr @.str.12) + %3 = load i32, ptr %i3, align 4 + call void (ptr, ...) @printf(ptr @.str.13, i32 %3) + call void (ptr, ...) @printf(ptr @.str.14) ret i64 0 loop.exit4: ; No predecessors! - call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.15, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.15) ret i64 0 } ; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: %2 = call i64 @foo_main() %not_err = icmp eq i64 %2, 0 diff --git a/test/test_suite/macros/macro_common.c3t b/test/test_suite/macros/macro_common.c3t index 1d477bde1..e3cbf3ff6 100644 --- a/test/test_suite/macros/macro_common.c3t +++ b/test/test_suite/macros/macro_common.c3t @@ -20,31 +20,31 @@ entry: %blockret = alloca double, align 8 %x1 = alloca i32, align 4 %blockret2 = alloca double, align 8 - store i32 1, i32* %x, align 4 - %0 = load i32, i32* %x, align 4 + store i32 1, ptr %x, align 4 + %0 = load i32, ptr %x, align 4 %not = icmp eq i32 %0, 0 br i1 %not, label %if.then, label %if.exit if.then: ; preds = %entry - store double 0.000000e+00, double* %blockret, align 8 + store double 0.000000e+00, ptr %blockret, align 8 br label %expr_block.exit if.exit: ; preds = %entry - store double 0.000000e+00, double* %blockret, align 8 + store double 0.000000e+00, ptr %blockret, align 8 br label %expr_block.exit expr_block.exit: ; preds = %if.exit, %if.then - store i32 0, i32* %x1, align 4 - %1 = load i32, i32* %x1, align 4 + store i32 0, ptr %x1, align 4 + %1 = load i32, ptr %x1, align 4 %not3 = icmp eq i32 %1, 0 br i1 %not3, label %if.then4, label %if.exit5 if.then4: ; preds = %expr_block.exit - store double 0.000000e+00, double* %blockret2, align 8 + store double 0.000000e+00, ptr %blockret2, align 8 br label %expr_block.exit6 if.exit5: ; preds = %expr_block.exit - store double 0.000000e+00, double* %blockret2, align 8 + store double 0.000000e+00, ptr %blockret2, align 8 br label %expr_block.exit6 expr_block.exit6: ; preds = %if.exit5, %if.then4 diff --git a/test/test_suite/macros/macro_defer_exit.c3t b/test/test_suite/macros/macro_defer_exit.c3t index 27506384a..dac68826c 100644 --- a/test/test_suite/macros/macro_defer_exit.c3t +++ b/test/test_suite/macros/macro_defer_exit.c3t @@ -26,58 +26,58 @@ entry: %blockret = alloca i32, align 4 %x1 = alloca i32, align 4 %blockret2 = alloca i32, align 4 - store i32 123, i32* %x, align 4 - %0 = load i32, i32* %x, align 4 + store i32 123, ptr %x, align 4 + %0 = load i32, ptr %x, align 4 %mul = mul i32 %0, 2 - store i32 %mul, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %mul, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %1, 100 br i1 %gt, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, i32* %x, align 4 + %2 = load i32, ptr %x, align 4 %sub = sub i32 %2, 100 - store i32 %sub, i32* %x, align 4 - %3 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i32 %3) - store i32 %sub, i32* %blockret, align 4 + store i32 %sub, ptr %x, align 4 + %3 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %3) + store i32 %sub, ptr %blockret, align 4 br label %expr_block.exit if.exit: ; preds = %entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i32 0, i32 0)) - %4 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %4) - %5 = load i32, i32* %x, align 4 - store i32 %5, i32* %blockret, align 4 + call void (ptr, ...) @printf(ptr @.str.1) + %4 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.2, i32 %4) + %5 = load i32, ptr %x, align 4 + store i32 %5, ptr %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %if.exit, %if.then - store i32 3, i32* %x1, align 4 - %6 = load i32, i32* %x1, align 4 + store i32 3, ptr %x1, align 4 + %6 = load i32, ptr %x1, align 4 %mul3 = mul i32 %6, 2 - store i32 %mul3, i32* %x1, align 4 - %7 = load i32, i32* %x1, align 4 + store i32 %mul3, ptr %x1, align 4 + %7 = load i32, ptr %x1, align 4 %gt4 = icmp sgt i32 %7, 100 br i1 %gt4, label %if.then5, label %if.exit7 if.then5: ; preds = %expr_block.exit - %8 = load i32, i32* %x1, align 4 + %8 = load i32, ptr %x1, align 4 %sub6 = sub i32 %8, 100 - store i32 %sub6, i32* %x1, align 4 - %9 = load i32, i32* %x1, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i32 %9) - store i32 %sub6, i32* %blockret2, align 4 + store i32 %sub6, ptr %x1, align 4 + %9 = load i32, ptr %x1, align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %9) + store i32 %sub6, ptr %blockret2, align 4 br label %expr_block.exit8 if.exit7: ; preds = %expr_block.exit - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i32 0, i32 0)) - %10 = load i32, i32* %x1, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 %10) - %11 = load i32, i32* %x1, align 4 - store i32 %11, i32* %blockret2, align 4 + call void (ptr, ...) @printf(ptr @.str.4) + %10 = load i32, ptr %x1, align 4 + call void (ptr, ...) @printf(ptr @.str.5, i32 %10) + %11 = load i32, ptr %x1, align 4 + store i32 %11, ptr %blockret2, align 4 br label %expr_block.exit8 expr_block.exit8: ; preds = %if.exit7, %if.then5 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.6, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.6) ret void } diff --git a/test/test_suite/macros/macro_defer_scope.c3t b/test/test_suite/macros/macro_defer_scope.c3t index 9fa2788a2..3e8b4804a 100644 --- a/test/test_suite/macros/macro_defer_scope.c3t +++ b/test/test_suite/macros/macro_defer_scope.c3t @@ -23,21 +23,21 @@ entry: %x = alloca i32, align 4 %blockret = alloca i32, align 4 %x1 = alloca i32, align 4 - store i32 0, i32* %x, align 4 - store i32 0, i32* %x1, align 4 - %0 = load i32, i32* %x, align 4 + store i32 0, ptr %x, align 4 + store i32 0, ptr %x1, align 4 + %0 = load i32, ptr %x, align 4 %add = add i32 %0, 1 - store i32 %add, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %add, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %add2 = add i32 %1, 1 - store i32 %add2, i32* %x, align 4 + store i32 %add2, ptr %x, align 4 %add3 = add i32 %add, %add2 - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0)) - store i32 %add3, i32* %blockret, align 4 + %2 = call i32 (ptr, ...) @printf(ptr @.str) + store i32 %add3, ptr %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %entry - %3 = load i32, i32* %x, align 4 - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %3) + %3 = load i32, ptr %x, align 4 + %4 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %3) ret void } diff --git a/test/test_suite/macros/macro_defer_with_body.c3t b/test/test_suite/macros/macro_defer_with_body.c3t index bf7698fc3..fc1932c92 100644 --- a/test/test_suite/macros/macro_defer_with_body.c3t +++ b/test/test_suite/macros/macro_defer_with_body.c3t @@ -26,29 +26,29 @@ entry: %x = alloca i32, align 4 %a = alloca i32, align 4 %y = alloca i32, align 4 - store i32 0, i32* %x, align 4 - store i32 1, i32* %a, align 4 - %0 = load i32, i32* %a, align 4 - store i32 %0, i32* %y, align 4 - %1 = load i32, i32* %x, align 4 + store i32 0, ptr %x, align 4 + store i32 1, ptr %a, align 4 + %0 = load i32, ptr %a, align 4 + store i32 %0, ptr %y, align 4 + %1 = load i32, ptr %x, align 4 %add = add i32 %1, 1 - store i32 %add, i32* %x, align 4 - %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) - %3 = load i32, i32* %x, align 4 + store i32 %add, ptr %x, align 4 + %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) + %3 = load i32, ptr %x, align 4 %add1 = add i32 %3, 1 - store i32 %add1, i32* %x, align 4 - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %3) - %5 = load i32, i32* %a, align 4 - store i32 %5, i32* %y, align 4 - %6 = load i32, i32* %x, align 4 + store i32 %add1, ptr %x, align 4 + %4 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %3) + %5 = load i32, ptr %a, align 4 + store i32 %5, ptr %y, align 4 + %6 = load i32, ptr %x, align 4 %add2 = add i32 %6, 1 - store i32 %add2, i32* %x, align 4 - %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %6) - %8 = load i32, i32* %x, align 4 + store i32 %add2, ptr %x, align 4 + %7 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %6) + %8 = load i32, ptr %x, align 4 %add3 = add i32 %8, 1 - store i32 %add3, i32* %x, align 4 - %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 %8) - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + store i32 %add3, ptr %x, align 4 + %9 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 %8) + %10 = call i32 (ptr, ...) @printf(ptr @.str.4) ret void } diff --git a/test/test_suite/macros/macro_failable_return_rethrow.c3t b/test/test_suite/macros/macro_failable_return_rethrow.c3t index 0366af5d7..8d1f7f67e 100644 --- a/test/test_suite/macros/macro_failable_return_rethrow.c3t +++ b/test/test_suite/macros/macro_failable_return_rethrow.c3t @@ -22,12 +22,12 @@ entry: %blockret = alloca i32, align 4 %error_var1 = alloca i64, align 8 %retparam = alloca i32, align 4 - %0 = call i64 @test_xy(i32* %retparam) + %0 = call i64 @test_xy(ptr %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, i64* %error_var1, align 8 + store i64 %0, ptr %error_var1, align 8 br label %guard_block after_check: ; preds = %entry @@ -37,11 +37,11 @@ guard_block: ; preds = %assign_optional ret void noerr_block: ; preds = %after_check - store i32 1, i32* %blockret, align 4 + store i32 1, ptr %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %noerr_block - %1 = load i32, i32* %blockret, align 4 + %1 = load i32, ptr %blockret, align 4 br label %noerr_block2 noerr_block2: ; preds = %expr_block.exit diff --git a/test/test_suite/macros/macro_nested_labels.c3t b/test/test_suite/macros/macro_nested_labels.c3t index 40f919364..42133c4e7 100644 --- a/test/test_suite/macros/macro_nested_labels.c3t +++ b/test/test_suite/macros/macro_nested_labels.c3t @@ -47,196 +47,196 @@ entry: %i72 = alloca i32, align 4 %i83 = alloca i32, align 4 %i94 = alloca i32, align 4 - store i32 7, i32* %ab, align 4 - %0 = load i32, i32* %ab, align 4 - store i32 %0, i32* %x, align 4 - store i32 0, i32* %i, align 4 + store i32 7, ptr %ab, align 4 + %0 = load i32, ptr %ab, align 4 + store i32 %0, ptr %x, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %1 = load i32, i32* %i, align 4 + %1 = load i32, ptr %i, align 4 %lt = icmp slt i32 %1, 0 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) - %2 = load i32, i32* %i, align 4 + call void (ptr, ...) @printf(ptr @.str) + %2 = load i32, ptr %i, align 4 %add = add i32 %2, 1 - store i32 %add, i32* %i, align 4 + store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 3) + call void (ptr, ...) @printf(ptr @.str.1, i32 3) br label %loop.cond1 loop.cond1: ; preds = %if.exit92, %loop.exit - %3 = load i32, i32* %x, align 4 + %3 = load i32, ptr %x, align 4 %sub = sub i32 %3, 1 - store i32 %sub, i32* %x, align 4 + store i32 %sub, ptr %x, align 4 %gt = icmp sgt i32 %3, 0 br i1 %gt, label %loop.body2, label %loop.exit93 loop.body2: ; preds = %loop.cond1 - store i32 0, i32* %i3, align 4 + store i32 0, ptr %i3, align 4 br label %loop.cond4 loop.cond4: ; preds = %loop.body6, %loop.body2 - %4 = load i32, i32* %i3, align 4 + %4 = load i32, ptr %i3, align 4 %lt5 = icmp slt i32 %4, 0 br i1 %lt5, label %loop.body6, label %loop.exit8 loop.body6: ; preds = %loop.cond4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i32 0, i32 0)) - %5 = load i32, i32* %i3, align 4 + call void (ptr, ...) @printf(ptr @.str.2) + %5 = load i32, ptr %i3, align 4 %add7 = add i32 %5, 1 - store i32 %add7, i32* %i3, align 4 + store i32 %add7, ptr %i3, align 4 br label %loop.cond4 loop.exit8: ; preds = %loop.cond4 - %6 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %6) - %7 = load i32, i32* %x, align 4 - store i32 %7, i32* %x9, align 4 - store i32 0, i32* %i10, align 4 + %6 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %6) + %7 = load i32, ptr %x, align 4 + store i32 %7, ptr %x9, align 4 + store i32 0, ptr %i10, align 4 br label %loop.cond11 loop.cond11: ; preds = %loop.body13, %loop.exit8 - %8 = load i32, i32* %i10, align 4 + %8 = load i32, ptr %i10, align 4 %lt12 = icmp slt i32 %8, 1 br i1 %lt12, label %loop.body13, label %loop.exit15 loop.body13: ; preds = %loop.cond11 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.4, i32 0, i32 0)) - %9 = load i32, i32* %i10, align 4 + call void (ptr, ...) @printf(ptr @.str.4) + %9 = load i32, ptr %i10, align 4 %add14 = add i32 %9, 1 - store i32 %add14, i32* %i10, align 4 + store i32 %add14, ptr %i10, align 4 br label %loop.cond11 loop.exit15: ; preds = %loop.cond11 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 2) + call void (ptr, ...) @printf(ptr @.str.5, i32 2) br label %loop.cond16 loop.cond16: ; preds = %if.exit81, %loop.exit15 - %10 = load i32, i32* %x9, align 4 + %10 = load i32, ptr %x9, align 4 %sub17 = sub i32 %10, 1 - store i32 %sub17, i32* %x9, align 4 + store i32 %sub17, ptr %x9, align 4 %gt18 = icmp sgt i32 %10, 0 br i1 %gt18, label %loop.body19, label %loop.exit82 loop.body19: ; preds = %loop.cond16 - store i32 0, i32* %i20, align 4 + store i32 0, ptr %i20, align 4 br label %loop.cond21 loop.cond21: ; preds = %loop.body23, %loop.body19 - %11 = load i32, i32* %i20, align 4 + %11 = load i32, ptr %i20, align 4 %lt22 = icmp slt i32 %11, 1 br i1 %lt22, label %loop.body23, label %loop.exit25 loop.body23: ; preds = %loop.cond21 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) - %12 = load i32, i32* %i20, align 4 + call void (ptr, ...) @printf(ptr @.str.6) + %12 = load i32, ptr %i20, align 4 %add24 = add i32 %12, 1 - store i32 %add24, i32* %i20, align 4 + store i32 %add24, ptr %i20, align 4 br label %loop.cond21 loop.exit25: ; preds = %loop.cond21 - %13 = load i32, i32* %x9, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.7, i32 0, i32 0), i32 %13) - %14 = load i32, i32* %x9, align 4 - store i32 %14, i32* %x26, align 4 - store i32 0, i32* %i27, align 4 + %13 = load i32, ptr %x9, align 4 + call void (ptr, ...) @printf(ptr @.str.7, i32 %13) + %14 = load i32, ptr %x9, align 4 + store i32 %14, ptr %x26, align 4 + store i32 0, ptr %i27, align 4 br label %loop.cond28 loop.cond28: ; preds = %loop.body30, %loop.exit25 - %15 = load i32, i32* %i27, align 4 + %15 = load i32, ptr %i27, align 4 %lt29 = icmp slt i32 %15, 2 br i1 %lt29, label %loop.body30, label %loop.exit32 loop.body30: ; preds = %loop.cond28 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.8, i32 0, i32 0)) - %16 = load i32, i32* %i27, align 4 + call void (ptr, ...) @printf(ptr @.str.8) + %16 = load i32, ptr %i27, align 4 %add31 = add i32 %16, 1 - store i32 %add31, i32* %i27, align 4 + store i32 %add31, ptr %i27, align 4 br label %loop.cond28 loop.exit32: ; preds = %loop.cond28 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), i32 1) + call void (ptr, ...) @printf(ptr @.str.9, i32 1) br label %loop.cond33 loop.cond33: ; preds = %if.exit70, %loop.exit32 - %17 = load i32, i32* %x26, align 4 + %17 = load i32, ptr %x26, align 4 %sub34 = sub i32 %17, 1 - store i32 %sub34, i32* %x26, align 4 + store i32 %sub34, ptr %x26, align 4 %gt35 = icmp sgt i32 %17, 0 br i1 %gt35, label %loop.body36, label %loop.exit71 loop.body36: ; preds = %loop.cond33 - store i32 0, i32* %i37, align 4 + store i32 0, ptr %i37, align 4 br label %loop.cond38 loop.cond38: ; preds = %loop.body40, %loop.body36 - %18 = load i32, i32* %i37, align 4 + %18 = load i32, ptr %i37, align 4 %lt39 = icmp slt i32 %18, 2 br i1 %lt39, label %loop.body40, label %loop.exit42 loop.body40: ; preds = %loop.cond38 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.10, i32 0, i32 0)) - %19 = load i32, i32* %i37, align 4 + call void (ptr, ...) @printf(ptr @.str.10) + %19 = load i32, ptr %i37, align 4 %add41 = add i32 %19, 1 - store i32 %add41, i32* %i37, align 4 + store i32 %add41, ptr %i37, align 4 br label %loop.cond38 loop.exit42: ; preds = %loop.cond38 - %20 = load i32, i32* %x26, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.11, i32 0, i32 0), i32 %20) - %21 = load i32, i32* %x26, align 4 - store i32 %21, i32* %x43, align 4 - store i32 0, i32* %i44, align 4 + %20 = load i32, ptr %x26, align 4 + call void (ptr, ...) @printf(ptr @.str.11, i32 %20) + %21 = load i32, ptr %x26, align 4 + store i32 %21, ptr %x43, align 4 + store i32 0, ptr %i44, align 4 br label %loop.cond45 loop.cond45: ; preds = %loop.body47, %loop.exit42 - %22 = load i32, i32* %i44, align 4 + %22 = load i32, ptr %i44, align 4 %lt46 = icmp slt i32 %22, 3 br i1 %lt46, label %loop.body47, label %loop.exit49 loop.body47: ; preds = %loop.cond45 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.12, i32 0, i32 0)) - %23 = load i32, i32* %i44, align 4 + call void (ptr, ...) @printf(ptr @.str.12) + %23 = load i32, ptr %i44, align 4 %add48 = add i32 %23, 1 - store i32 %add48, i32* %i44, align 4 + store i32 %add48, ptr %i44, align 4 br label %loop.cond45 loop.exit49: ; preds = %loop.cond45 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i32 0, i32 0), i32 0) + call void (ptr, ...) @printf(ptr @.str.13, i32 0) br label %loop.cond50 loop.cond50: ; preds = %if.exit, %loop.exit49 - %24 = load i32, i32* %x43, align 4 + %24 = load i32, ptr %x43, align 4 %sub51 = sub i32 %24, 1 - store i32 %sub51, i32* %x43, align 4 + store i32 %sub51, ptr %x43, align 4 %gt52 = icmp sgt i32 %24, 0 br i1 %gt52, label %loop.body53, label %loop.exit60 loop.body53: ; preds = %loop.cond50 - store i32 0, i32* %i54, align 4 + store i32 0, ptr %i54, align 4 br label %loop.cond55 loop.cond55: ; preds = %loop.body57, %loop.body53 - %25 = load i32, i32* %i54, align 4 + %25 = load i32, ptr %i54, align 4 %lt56 = icmp slt i32 %25, 3 br i1 %lt56, label %loop.body57, label %loop.exit59 loop.body57: ; preds = %loop.cond55 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i32 0, i32 0)) - %26 = load i32, i32* %i54, align 4 + call void (ptr, ...) @printf(ptr @.str.14) + %26 = load i32, ptr %i54, align 4 %add58 = add i32 %26, 1 - store i32 %add58, i32* %i54, align 4 + store i32 %add58, ptr %i54, align 4 br label %loop.cond55 loop.exit59: ; preds = %loop.cond55 - %27 = load i32, i32* %x43, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i32 0, i32 0), i32 %27) - %28 = load i32, i32* %x43, align 4 + %27 = load i32, ptr %x43, align 4 + call void (ptr, ...) @printf(ptr @.str.15, i32 %27) + %28 = load i32, ptr %x43, align 4 %smod = srem i32 %28, 2 %eq = icmp eq i32 %smod, 0 br i1 %eq, label %if.then, label %if.exit @@ -248,24 +248,24 @@ if.exit: ; preds = %loop.exit59 br label %loop.cond50 loop.exit60: ; preds = %if.then, %loop.cond50 - store i32 0, i32* %i61, align 4 + store i32 0, ptr %i61, align 4 br label %loop.cond62 loop.cond62: ; preds = %loop.body64, %loop.exit60 - %29 = load i32, i32* %i61, align 4 + %29 = load i32, ptr %i61, align 4 %lt63 = icmp slt i32 %29, 3 br i1 %lt63, label %loop.body64, label %loop.exit66 loop.body64: ; preds = %loop.cond62 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.16, i32 0, i32 0)) - %30 = load i32, i32* %i61, align 4 + call void (ptr, ...) @printf(ptr @.str.16) + %30 = load i32, ptr %i61, align 4 %add65 = add i32 %30, 1 - store i32 %add65, i32* %i61, align 4 + store i32 %add65, ptr %i61, align 4 br label %loop.cond62 loop.exit66: ; preds = %loop.cond62 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.17, i32 0, i32 0), i32 0) - %31 = load i32, i32* %x26, align 4 + call void (ptr, ...) @printf(ptr @.str.17, i32 0) + %31 = load i32, ptr %x26, align 4 %smod67 = srem i32 %31, 2 %eq68 = icmp eq i32 %smod67, 0 br i1 %eq68, label %if.then69, label %if.exit70 @@ -277,24 +277,24 @@ if.exit70: ; preds = %loop.exit66 br label %loop.cond33 loop.exit71: ; preds = %if.then69, %loop.cond33 - store i32 0, i32* %i72, align 4 + store i32 0, ptr %i72, align 4 br label %loop.cond73 loop.cond73: ; preds = %loop.body75, %loop.exit71 - %32 = load i32, i32* %i72, align 4 + %32 = load i32, ptr %i72, align 4 %lt74 = icmp slt i32 %32, 2 br i1 %lt74, label %loop.body75, label %loop.exit77 loop.body75: ; preds = %loop.cond73 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) - %33 = load i32, i32* %i72, align 4 + call void (ptr, ...) @printf(ptr @.str.18) + %33 = load i32, ptr %i72, align 4 %add76 = add i32 %33, 1 - store i32 %add76, i32* %i72, align 4 + store i32 %add76, ptr %i72, align 4 br label %loop.cond73 loop.exit77: ; preds = %loop.cond73 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.19, i32 0, i32 0), i32 1) - %34 = load i32, i32* %x9, align 4 + call void (ptr, ...) @printf(ptr @.str.19, i32 1) + %34 = load i32, ptr %x9, align 4 %smod78 = srem i32 %34, 2 %eq79 = icmp eq i32 %smod78, 0 br i1 %eq79, label %if.then80, label %if.exit81 @@ -306,24 +306,24 @@ if.exit81: ; preds = %loop.exit77 br label %loop.cond16 loop.exit82: ; preds = %if.then80, %loop.cond16 - store i32 0, i32* %i83, align 4 + store i32 0, ptr %i83, align 4 br label %loop.cond84 loop.cond84: ; preds = %loop.body86, %loop.exit82 - %35 = load i32, i32* %i83, align 4 + %35 = load i32, ptr %i83, align 4 %lt85 = icmp slt i32 %35, 1 br i1 %lt85, label %loop.body86, label %loop.exit88 loop.body86: ; preds = %loop.cond84 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.20, i32 0, i32 0)) - %36 = load i32, i32* %i83, align 4 + call void (ptr, ...) @printf(ptr @.str.20) + %36 = load i32, ptr %i83, align 4 %add87 = add i32 %36, 1 - store i32 %add87, i32* %i83, align 4 + store i32 %add87, ptr %i83, align 4 br label %loop.cond84 loop.exit88: ; preds = %loop.cond84 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.21, i32 0, i32 0), i32 2) - %37 = load i32, i32* %x, align 4 + call void (ptr, ...) @printf(ptr @.str.21, i32 2) + %37 = load i32, ptr %x, align 4 %smod89 = srem i32 %37, 2 %eq90 = icmp eq i32 %smod89, 0 br i1 %eq90, label %if.then91, label %if.exit92 @@ -335,22 +335,22 @@ if.exit92: ; preds = %loop.exit88 br label %loop.cond1 loop.exit93: ; preds = %if.then91, %loop.cond1 - store i32 0, i32* %i94, align 4 + store i32 0, ptr %i94, align 4 br label %loop.cond95 loop.cond95: ; preds = %loop.body97, %loop.exit93 - %38 = load i32, i32* %i94, align 4 + %38 = load i32, ptr %i94, align 4 %lt96 = icmp slt i32 %38, 0 br i1 %lt96, label %loop.body97, label %loop.exit99 loop.body97: ; preds = %loop.cond95 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.22, i32 0, i32 0)) - %39 = load i32, i32* %i94, align 4 + call void (ptr, ...) @printf(ptr @.str.22) + %39 = load i32, ptr %i94, align 4 %add98 = add i32 %39, 1 - store i32 %add98, i32* %i94, align 4 + store i32 %add98, ptr %i94, align 4 br label %loop.cond95 loop.exit99: ; preds = %loop.cond95 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.23, i32 0, i32 0), i32 3) + call void (ptr, ...) @printf(ptr @.str.23, i32 3) ret void } diff --git a/test/test_suite/macros/macro_typed_varargs.c3t b/test/test_suite/macros/macro_typed_varargs.c3t index a67da50df..35edde6bc 100644 --- a/test/test_suite/macros/macro_typed_varargs.c3t +++ b/test/test_suite/macros/macro_typed_varargs.c3t @@ -8,7 +8,7 @@ macro foo(int... x) { foreach (i : x) { - io::printfln("%d", i); + io::printfn("%d", i); } } @@ -16,7 +16,7 @@ macro foo2(x...) { foreach (i : x) { - io::printfln("%d", *(int*)i); + io::printfn("%d", *(int*)i); } } @@ -28,7 +28,6 @@ fn void main() /* #expect: test.ll - define void @test_main() #0 { entry: %x = alloca %"int[]", align 8 @@ -38,157 +37,125 @@ entry: %i = alloca i32, align 4 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %x2 = alloca %"variant[]", align 8 %literal3 = alloca [4 x %variant], align 16 + %taddr = alloca i32, align 4 %taddr4 = alloca i32, align 4 %taddr5 = alloca i32, align 4 %taddr6 = alloca i32, align 4 - %taddr7 = alloca i32, align 4 + %.anon7 = alloca i64, align 8 %.anon8 = alloca i64, align 8 - %.anon9 = alloca i64, align 8 - %i13 = alloca %variant, align 8 - %retparam15 = alloca i64, align 8 - %varargslots16 = alloca [1 x %variant], align 16 - %taddr17 = alloca %"variant[]", align 8 - %0 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 0 - store i32 1, i32* %0, align 4 - %1 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 1 - store i32 -1, i32* %1, align 4 - %2 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 2 - store i32 3141, i32* %2, align 4 - %3 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 3 - store i32 1000, i32* %3, align 4 - %4 = bitcast [4 x i32]* %literal to i32* - %5 = insertvalue %"int[]" undef, i32* %4, 0 - %6 = insertvalue %"int[]" %5, i64 4, 1 - store %"int[]" %6, %"int[]"* %x, align 8 - %7 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 - %8 = load i64, i64* %7, align 8 - store i64 %8, i64* %.anon, align 8 - store i64 0, i64* %.anon1, align 8 + %i12 = alloca %variant, align 8 + %retparam14 = alloca i64, align 8 + %varargslots15 = alloca [1 x %variant], align 16 + %0 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 0 + store i32 1, ptr %0, align 4 + %1 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 1 + store i32 -1, ptr %1, align 4 + %2 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 2 + store i32 3141, ptr %2, align 4 + %3 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 3 + store i32 1000, ptr %3, align 4 + %4 = insertvalue %"int[]" undef, ptr %literal, 0 + %5 = insertvalue %"int[]" %4, i64 4, 1 + store %"int[]" %5, ptr %x, align 8 + %6 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 + %7 = load i64, ptr %6, align 8 + store i64 %7, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond loop.cond: ; preds = %voiderr, %entry - %9 = load i64, i64* %.anon1, align 8 - %10 = load i64, i64* %.anon, align 8 - %lt = icmp ult i64 %9, %10 + %8 = load i64, ptr %.anon1, align 8 + %9 = load i64, ptr %.anon, align 8 + %lt = icmp ult i64 %8, %9 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %11 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 - %12 = load i32*, i32** %11, align 8 - %13 = load i64, i64* %.anon1, align 8 - %ptroffset = getelementptr inbounds i32, i32* %12, i64 %13 - %14 = load i32, i32* %ptroffset, align 4 - store i32 %14, i32* %i, align 4 - %15 = bitcast i32* %i to i8* - %16 = insertvalue %variant undef, i8* %15, 0 - %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %18 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %17, %variant* %18, align 16 - %19 = bitcast [1 x %variant]* %varargslots to %variant* - %20 = insertvalue %"variant[]" undef, %variant* %19, 0 - %21 = insertvalue %"variant[]" %20, i64 1, 1 - store %"variant[]" %21, %"variant[]"* %taddr, align 8 - %22 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 0 - %lo = load i8*, i8** %23, align 8 - %24 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 1 - %hi = load i64, i64* %24, align 8 - %25 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %25, 0 + %10 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 + %11 = load ptr, ptr %10, align 8 + %12 = load i64, ptr %.anon1, align 8 + %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 + %13 = load i32, ptr %ptroffset, align 4 + store i32 %13, ptr %i, align 4 + %14 = insertvalue %variant undef, ptr %i, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %16 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %15, ptr %16, align 16 + %17 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %17, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %loop.body br label %voiderr voiderr: ; preds = %after_check, %loop.body - %26 = load i64, i64* %.anon1, align 8 - %add = add i64 %26, 1 - store i64 %add, i64* %.anon1, align 8 + %18 = load i64, ptr %.anon1, align 8 + %add = add i64 %18, 1 + store i64 %add, ptr %.anon1, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %27 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 0 - store i32 1, i32* %taddr4, align 4 - %28 = bitcast i32* %taddr4 to i8* - %29 = insertvalue %variant undef, i8* %28, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %30, %variant* %27, align 8 - %31 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 1 - store i32 -1, i32* %taddr5, align 4 - %32 = bitcast i32* %taddr5 to i8* - %33 = insertvalue %variant undef, i8* %32, 0 - %34 = insertvalue %variant %33, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %34, %variant* %31, align 8 - %35 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 2 - store i32 3141, i32* %taddr6, align 4 - %36 = bitcast i32* %taddr6 to i8* - %37 = insertvalue %variant undef, i8* %36, 0 - %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %38, %variant* %35, align 8 - %39 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 3 - store i32 1000, i32* %taddr7, align 4 - %40 = bitcast i32* %taddr7 to i8* - %41 = insertvalue %variant undef, i8* %40, 0 - %42 = insertvalue %variant %41, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %42, %variant* %39, align 8 - %43 = bitcast [4 x %variant]* %literal3 to %variant* - %44 = insertvalue %"variant[]" undef, %variant* %43, 0 - %45 = insertvalue %"variant[]" %44, i64 4, 1 - store %"variant[]" %45, %"variant[]"* %x2, align 8 - %46 = getelementptr inbounds %"variant[]", %"variant[]"* %x2, i32 0, i32 1 - %47 = load i64, i64* %46, align 8 - store i64 %47, i64* %.anon8, align 8 - store i64 0, i64* %.anon9, align 8 - br label %loop.cond10 + %19 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 0 + store i32 1, ptr %taddr, align 4 + %20 = insertvalue %variant undef, ptr %taddr, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %21, ptr %19, align 8 + %22 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 1 + store i32 -1, ptr %taddr4, align 4 + %23 = insertvalue %variant undef, ptr %taddr4, 0 + %24 = insertvalue %variant %23, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %24, ptr %22, align 8 + %25 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 2 + store i32 3141, ptr %taddr5, align 4 + %26 = insertvalue %variant undef, ptr %taddr5, 0 + %27 = insertvalue %variant %26, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %27, ptr %25, align 8 + %28 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 3 + store i32 1000, ptr %taddr6, align 4 + %29 = insertvalue %variant undef, ptr %taddr6, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %30, ptr %28, align 8 + %31 = insertvalue %"variant[]" undef, ptr %literal3, 0 + %32 = insertvalue %"variant[]" %31, i64 4, 1 + store %"variant[]" %32, ptr %x2, align 8 + %33 = getelementptr inbounds %"variant[]", ptr %x2, i32 0, i32 1 + %34 = load i64, ptr %33, align 8 + store i64 %34, ptr %.anon7, align 8 + store i64 0, ptr %.anon8, align 8 + br label %loop.cond9 -loop.cond10: ; preds = %voiderr22, %loop.exit - %48 = load i64, i64* %.anon9, align 8 - %49 = load i64, i64* %.anon8, align 8 - %lt11 = icmp ult i64 %48, %49 - br i1 %lt11, label %loop.body12, label %loop.exit24 +loop.cond9: ; preds = %voiderr18, %loop.exit + %35 = load i64, ptr %.anon8, align 8 + %36 = load i64, ptr %.anon7, align 8 + %lt10 = icmp ult i64 %35, %36 + br i1 %lt10, label %loop.body11, label %loop.exit20 -loop.body12: ; preds = %loop.cond10 - %50 = getelementptr inbounds %"variant[]", %"variant[]"* %x2, i32 0, i32 0 - %51 = load %variant*, %variant** %50, align 8 - %52 = load i64, i64* %.anon9, align 8 - %ptroffset14 = getelementptr inbounds %variant, %variant* %51, i64 %52 - %53 = bitcast %variant* %i13 to i8* - %54 = bitcast %variant* %ptroffset14 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %53, i8* align 8 %54, i32 16, i1 false) - %55 = getelementptr inbounds %variant, %variant* %i13, i32 0, i32 0 - %56 = bitcast i8** %55 to i32** - %57 = load i32*, i32** %56, align 8 - %58 = bitcast i32* %57 to i8* - %59 = insertvalue %variant undef, i8* %58, 0 - %60 = insertvalue %variant %59, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %61 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots16, i64 0, i64 0 - store %variant %60, %variant* %61, align 16 - %62 = bitcast [1 x %variant]* %varargslots16 to %variant* - %63 = insertvalue %"variant[]" undef, %variant* %62, 0 - %64 = insertvalue %"variant[]" %63, i64 1, 1 - store %"variant[]" %64, %"variant[]"* %taddr17, align 8 - %65 = bitcast %"variant[]"* %taddr17 to { i8*, i64 }* - %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 - %lo18 = load i8*, i8** %66, align 8 - %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 - %hi19 = load i64, i64* %67, align 8 - %68 = call i64 @std_io_printfln(i64* %retparam15, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2, i8* %lo18, i64 %hi19) - %not_err20 = icmp eq i64 %68, 0 - br i1 %not_err20, label %after_check21, label %voiderr22 +loop.body11: ; preds = %loop.cond9 + %37 = getelementptr inbounds %"variant[]", ptr %x2, i32 0, i32 0 + %38 = load ptr, ptr %37, align 8 + %39 = load i64, ptr %.anon8, align 8 + %ptroffset13 = getelementptr inbounds %variant, ptr %38, i64 %39 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %i12, ptr align 8 %ptroffset13, i32 16, i1 false) + %40 = getelementptr inbounds %variant, ptr %i12, i32 0, i32 0 + %41 = load ptr, ptr %40, align 8 + %42 = insertvalue %variant undef, ptr %41, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %44 = getelementptr inbounds [1 x %variant], ptr %varargslots15, i64 0, i64 0 + store %variant %43, ptr %44, align 16 + %45 = call i64 @std_io_printfn(ptr %retparam14, ptr @.str.1, i64 2, ptr %varargslots15, i64 1) + %not_err16 = icmp eq i64 %45, 0 + br i1 %not_err16, label %after_check17, label %voiderr18 -after_check21: ; preds = %loop.body12 - br label %voiderr22 +after_check17: ; preds = %loop.body11 + br label %voiderr18 -voiderr22: ; preds = %after_check21, %loop.body12 - %69 = load i64, i64* %.anon9, align 8 - %add23 = add i64 %69, 1 - store i64 %add23, i64* %.anon9, align 8 - br label %loop.cond10 +voiderr18: ; preds = %after_check17, %loop.body11 + %46 = load i64, ptr %.anon8, align 8 + %add19 = add i64 %46, 1 + store i64 %add19, ptr %.anon8, align 8 + br label %loop.cond9 -loop.exit24: ; preds = %loop.cond10 +loop.exit20: ; preds = %loop.cond9 ret void } - diff --git a/test/test_suite/macros/macro_untyped_varargs_2.c3t b/test/test_suite/macros/macro_untyped_varargs_2.c3t index d64333fe1..e779fc55c 100644 --- a/test/test_suite/macros/macro_untyped_varargs_2.c3t +++ b/test/test_suite/macros/macro_untyped_varargs_2.c3t @@ -9,7 +9,7 @@ macro @foo(...) int i = $vaarg(1) + $vaarg(1); int j = $vaexpr(2) + $vaexpr(2); $for (var $i = 0; $i < $vacount; $i++): - io::printfln("%d", $vaarg($i)); + io::printfn("%d", $vaarg($i)); $endfor; } @@ -19,7 +19,7 @@ macro foo2(...) { $vatype($i) x; } - io::printfln("%s", $vatype($i).nameof); + io::printfn("%s", $vatype($i).nameof); $endfor; } @@ -40,7 +40,7 @@ macro @foo4(...) } fn int ping(int val) { - io::printfln("Ping[%d]", val); + io::printfn("Ping[%d]", val); return val; } @@ -49,13 +49,13 @@ fn void main() @foo(ping(1), ping(-1), ping(3141), ping(999 + 1)); foo2(int, double); var $x = foo3(1, 4, 100); - io::printfln("%d", $x); + io::printfn("%d", $x); int x = 123; int y = 33; @foo4(x, y); - io::printfln("%d, %d", x, y); + io::printfn("%d, %d", x, y); @foo4(x, y); - io::printfln("%d, %d", x, y); + io::printfn("%d, %d", x, y); } /* #expect: test.ll @@ -65,24 +65,13 @@ entry: %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 %taddr = alloca i32, align 4 - %taddr1 = alloca %"variant[]", align 8 - store i32 %0, i32* %taddr, align 4 - %1 = bitcast i32* %taddr to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %3, %variant* %4, align 16 - %5 = bitcast [1 x %variant]* %varargslots to %variant* - %6 = insertvalue %"variant[]" undef, %variant* %5, 0 - %7 = insertvalue %"variant[]" %6, i64 1, 1 - store %"variant[]" %7, %"variant[]"* %taddr1, align 8 - %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 - %lo = load i8*, i8** %9, align 8 - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 - %hi = load i64, i64* %10, align 8 - %11 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %11, 0 + store i32 %0, ptr %taddr, align 4 + %1 = insertvalue %variant undef, ptr %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %2, ptr %3, align 16 + %4 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %4, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry @@ -92,7 +81,6 @@ voiderr: ; preds = %after_check, %entry ret i32 %0 } -; Function Attrs: nounwind define void @test_main() #0 { entry: %.anon = alloca i32, align 4 @@ -103,282 +91,181 @@ entry: %j = alloca i32, align 4 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %retparam5 = alloca i64, align 8 %varargslots6 = alloca [1 x %variant], align 16 - %taddr7 = alloca %"variant[]", align 8 - %retparam13 = alloca i64, align 8 - %varargslots14 = alloca [1 x %variant], align 16 - %taddr15 = alloca %"variant[]", align 8 - %retparam21 = alloca i64, align 8 - %varargslots22 = alloca [1 x %variant], align 16 - %taddr23 = alloca %"variant[]", align 8 + %retparam10 = alloca i64, align 8 + %varargslots11 = alloca [1 x %variant], align 16 + %retparam15 = alloca i64, align 8 + %varargslots16 = alloca [1 x %variant], align 16 %x = alloca i32, align 4 - %retparam29 = alloca i64, align 8 - %varargslots30 = alloca [1 x %variant], align 16 - %taddr31 = alloca [3 x i8]*, align 8 - %taddr32 = alloca %"variant[]", align 8 - %x38 = alloca double, align 8 - %retparam39 = alloca i64, align 8 - %varargslots40 = alloca [1 x %variant], align 16 - %taddr41 = alloca [6 x i8]*, align 8 - %taddr42 = alloca %"variant[]", align 8 - %retparam48 = alloca i64, align 8 - %varargslots49 = alloca [1 x %variant], align 16 - %taddr50 = alloca i32, align 4 - %taddr51 = alloca %"variant[]", align 8 - %x57 = alloca i32, align 4 + %retparam20 = alloca i64, align 8 + %varargslots21 = alloca [1 x %variant], align 16 + %taddr = alloca ptr, align 8 + %x25 = alloca double, align 8 + %retparam26 = alloca i64, align 8 + %varargslots27 = alloca [1 x %variant], align 16 + %taddr28 = alloca ptr, align 8 + %retparam32 = alloca i64, align 8 + %varargslots33 = alloca [1 x %variant], align 16 + %taddr34 = alloca i32, align 4 + %x38 = alloca i32, align 4 %y = alloca i32, align 4 %a = alloca i32, align 4 - %retparam58 = alloca i64, align 8 - %varargslots59 = alloca [2 x %variant], align 16 - %taddr60 = alloca %"variant[]", align 8 - %a66 = alloca i32, align 4 - %retparam67 = alloca i64, align 8 - %varargslots68 = alloca [2 x %variant], align 16 - %taddr69 = alloca %"variant[]", align 8 + %retparam39 = alloca i64, align 8 + %varargslots40 = alloca [2 x %variant], align 16 + %a44 = alloca i32, align 4 + %retparam45 = alloca i64, align 8 + %varargslots46 = alloca [2 x %variant], align 16 %0 = call i32 @test_ping(i32 -1) - store i32 %0, i32* %.anon, align 4 + store i32 %0, ptr %.anon, align 4 %1 = call i32 @test_ping(i32 1) - store i32 %1, i32* %.anon1, align 4 + store i32 %1, ptr %.anon1, align 4 %2 = call i32 @test_ping(i32 3141) - store i32 %2, i32* %.anon2, align 4 + store i32 %2, ptr %.anon2, align 4 %3 = call i32 @test_ping(i32 1000) - store i32 %3, i32* %.anon3, align 4 - %4 = load i32, i32* %.anon, align 4 - %5 = load i32, i32* %.anon, align 4 + store i32 %3, ptr %.anon3, align 4 + %4 = load i32, ptr %.anon, align 4 + %5 = load i32, ptr %.anon, align 4 %add = add i32 %4, %5 - store i32 %add, i32* %i, align 4 + store i32 %add, ptr %i, align 4 %6 = call i32 @test_ping(i32 3141) %7 = call i32 @test_ping(i32 3141) %add4 = add i32 %6, %7 - store i32 %add4, i32* %j, align 4 - %8 = bitcast i32* %.anon1 to i8* - %9 = insertvalue %variant undef, i8* %8, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %11 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %10, %variant* %11, align 16 - %12 = bitcast [1 x %variant]* %varargslots to %variant* - %13 = insertvalue %"variant[]" undef, %variant* %12, 0 - %14 = insertvalue %"variant[]" %13, i64 1, 1 - store %"variant[]" %14, %"variant[]"* %taddr, align 8 - %15 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 - %lo = load i8*, i8** %16, align 8 - %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 - %hi = load i64, i64* %17, align 8 - %18 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %18, 0 + store i32 %add4, ptr %j, align 4 + %8 = insertvalue %variant undef, ptr %.anon1, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %10 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %9, ptr %10, align 16 + %11 = call i64 @std_io_printfn(ptr %retparam, ptr @.str.1, i64 2, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %11, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %19 = bitcast i32* %.anon to i8* - %20 = insertvalue %variant undef, i8* %19, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %22 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots6, i64 0, i64 0 - store %variant %21, %variant* %22, align 16 - %23 = bitcast [1 x %variant]* %varargslots6 to %variant* - %24 = insertvalue %"variant[]" undef, %variant* %23, 0 - %25 = insertvalue %"variant[]" %24, i64 1, 1 - store %"variant[]" %25, %"variant[]"* %taddr7, align 8 - %26 = bitcast %"variant[]"* %taddr7 to { i8*, i64 }* - %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0 - %lo8 = load i8*, i8** %27, align 8 - %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1 - %hi9 = load i64, i64* %28, align 8 - %29 = call i64 @std_io_printfln(i64* %retparam5, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo8, i64 %hi9) - %not_err10 = icmp eq i64 %29, 0 - br i1 %not_err10, label %after_check11, label %voiderr12 + %12 = insertvalue %variant undef, ptr %.anon, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %14 = getelementptr inbounds [1 x %variant], ptr %varargslots6, i64 0, i64 0 + store %variant %13, ptr %14, align 16 + %15 = call i64 @std_io_printfn(ptr %retparam5, ptr @.str.2, i64 2, ptr %varargslots6, i64 1) + %not_err7 = icmp eq i64 %15, 0 + br i1 %not_err7, label %after_check8, label %voiderr9 -after_check11: ; preds = %voiderr - br label %voiderr12 +after_check8: ; preds = %voiderr + br label %voiderr9 -voiderr12: ; preds = %after_check11, %voiderr - %30 = bitcast i32* %.anon2 to i8* - %31 = insertvalue %variant undef, i8* %30, 0 - %32 = insertvalue %variant %31, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %33 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots14, i64 0, i64 0 - store %variant %32, %variant* %33, align 16 - %34 = bitcast [1 x %variant]* %varargslots14 to %variant* - %35 = insertvalue %"variant[]" undef, %variant* %34, 0 - %36 = insertvalue %"variant[]" %35, i64 1, 1 - store %"variant[]" %36, %"variant[]"* %taddr15, align 8 - %37 = bitcast %"variant[]"* %taddr15 to { i8*, i64 }* - %38 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %37, i32 0, i32 0 - %lo16 = load i8*, i8** %38, align 8 - %39 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %37, i32 0, i32 1 - %hi17 = load i64, i64* %39, align 8 - %40 = call i64 @std_io_printfln(i64* %retparam13, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo16, i64 %hi17) - %not_err18 = icmp eq i64 %40, 0 - br i1 %not_err18, label %after_check19, label %voiderr20 +voiderr9: ; preds = %after_check8, %voiderr + %16 = insertvalue %variant undef, ptr %.anon2, 0 + %17 = insertvalue %variant %16, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %18 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 + store %variant %17, ptr %18, align 16 + %19 = call i64 @std_io_printfn(ptr %retparam10, ptr @.str.3, i64 2, ptr %varargslots11, i64 1) + %not_err12 = icmp eq i64 %19, 0 + br i1 %not_err12, label %after_check13, label %voiderr14 -after_check19: ; preds = %voiderr12 - br label %voiderr20 +after_check13: ; preds = %voiderr9 + br label %voiderr14 -voiderr20: ; preds = %after_check19, %voiderr12 - %41 = bitcast i32* %.anon3 to i8* - %42 = insertvalue %variant undef, i8* %41, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %44 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots22, i64 0, i64 0 - store %variant %43, %variant* %44, align 16 - %45 = bitcast [1 x %variant]* %varargslots22 to %variant* - %46 = insertvalue %"variant[]" undef, %variant* %45, 0 - %47 = insertvalue %"variant[]" %46, i64 1, 1 - store %"variant[]" %47, %"variant[]"* %taddr23, align 8 - %48 = bitcast %"variant[]"* %taddr23 to { i8*, i64 }* - %49 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 0 - %lo24 = load i8*, i8** %49, align 8 - %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 1 - %hi25 = load i64, i64* %50, align 8 - %51 = call i64 @std_io_printfln(i64* %retparam21, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo24, i64 %hi25) - %not_err26 = icmp eq i64 %51, 0 - br i1 %not_err26, label %after_check27, label %voiderr28 +voiderr14: ; preds = %after_check13, %voiderr9 + %20 = insertvalue %variant undef, ptr %.anon3, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %22 = getelementptr inbounds [1 x %variant], ptr %varargslots16, i64 0, i64 0 + store %variant %21, ptr %22, align 16 + %23 = call i64 @std_io_printfn(ptr %retparam15, ptr @.str.4, i64 2, ptr %varargslots16, i64 1) + %not_err17 = icmp eq i64 %23, 0 + br i1 %not_err17, label %after_check18, label %voiderr19 -after_check27: ; preds = %voiderr20 - br label %voiderr28 +after_check18: ; preds = %voiderr14 + br label %voiderr19 -voiderr28: ; preds = %after_check27, %voiderr20 - store i32 0, i32* %x, align 4 - store [3 x i8]* bitcast ([4 x i8]* @.str.6 to [3 x i8]*), [3 x i8]** %taddr31, align 8 - %52 = bitcast [3 x i8]** %taddr31 to i8* - %53 = insertvalue %variant undef, i8* %52, 0 - %54 = insertvalue %variant %53, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 - %55 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots30, i64 0, i64 0 - store %variant %54, %variant* %55, align 16 - %56 = bitcast [1 x %variant]* %varargslots30 to %variant* - %57 = insertvalue %"variant[]" undef, %variant* %56, 0 - %58 = insertvalue %"variant[]" %57, i64 1, 1 - store %"variant[]" %58, %"variant[]"* %taddr32, align 8 - %59 = bitcast %"variant[]"* %taddr32 to { i8*, i64 }* - %60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %59, i32 0, i32 0 - %lo33 = load i8*, i8** %60, align 8 - %61 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %59, i32 0, i32 1 - %hi34 = load i64, i64* %61, align 8 - %62 = call i64 @std_io_printfln(i64* %retparam29, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i32 0, i32 0), i64 2, i8* %lo33, i64 %hi34) - %not_err35 = icmp eq i64 %62, 0 +voiderr19: ; preds = %after_check18, %voiderr14 + store i32 0, ptr %x, align 4 + store ptr @.str.6, ptr %taddr, align 8 + %24 = insertvalue %variant undef, ptr %taddr, 0 + %25 = insertvalue %variant %24, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 + %26 = getelementptr inbounds [1 x %variant], ptr %varargslots21, i64 0, i64 0 + store %variant %25, ptr %26, align 16 + %27 = call i64 @std_io_printfn(ptr %retparam20, ptr @.str.5, i64 2, ptr %varargslots21, i64 1) + %not_err22 = icmp eq i64 %27, 0 + br i1 %not_err22, label %after_check23, label %voiderr24 + +after_check23: ; preds = %voiderr19 + br label %voiderr24 + +voiderr24: ; preds = %after_check23, %voiderr19 + store double 0.000000e+00, ptr %x25, align 8 + store ptr @.str.8, ptr %taddr28, align 8 + %28 = insertvalue %variant undef, ptr %taddr28, 0 + %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$p$a6$char" to i64), 1 + %30 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0 + store %variant %29, ptr %30, align 16 + %31 = call i64 @std_io_printfn(ptr %retparam26, ptr @.str.7, i64 2, ptr %varargslots27, i64 1) + %not_err29 = icmp eq i64 %31, 0 + br i1 %not_err29, label %after_check30, label %voiderr31 + +after_check30: ; preds = %voiderr24 + br label %voiderr31 + +voiderr31: ; preds = %after_check30, %voiderr24 + store i32 105, ptr %taddr34, align 4 + %32 = insertvalue %variant undef, ptr %taddr34, 0 + %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %34 = getelementptr inbounds [1 x %variant], ptr %varargslots33, i64 0, i64 0 + store %variant %33, ptr %34, align 16 + %35 = call i64 @std_io_printfn(ptr %retparam32, ptr @.str.9, i64 2, ptr %varargslots33, i64 1) + %not_err35 = icmp eq i64 %35, 0 br i1 %not_err35, label %after_check36, label %voiderr37 -after_check36: ; preds = %voiderr28 +after_check36: ; preds = %voiderr31 br label %voiderr37 -voiderr37: ; preds = %after_check36, %voiderr28 - store double 0.000000e+00, double* %x38, align 8 - store [6 x i8]* bitcast ([7 x i8]* @.str.8 to [6 x i8]*), [6 x i8]** %taddr41, align 8 - %63 = bitcast [6 x i8]** %taddr41 to i8* - %64 = insertvalue %variant undef, i8* %63, 0 - %65 = insertvalue %variant %64, i64 ptrtoint (%.introspect* @"ct$p$a6$char" to i64), 1 - %66 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots40, i64 0, i64 0 - store %variant %65, %variant* %66, align 16 - %67 = bitcast [1 x %variant]* %varargslots40 to %variant* - %68 = insertvalue %"variant[]" undef, %variant* %67, 0 - %69 = insertvalue %"variant[]" %68, i64 1, 1 - store %"variant[]" %69, %"variant[]"* %taddr42, align 8 - %70 = bitcast %"variant[]"* %taddr42 to { i8*, i64 }* - %71 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %70, i32 0, i32 0 - %lo43 = load i8*, i8** %71, align 8 - %72 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %70, i32 0, i32 1 - %hi44 = load i64, i64* %72, align 8 - %73 = call i64 @std_io_printfln(i64* %retparam39, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.7, i32 0, i32 0), i64 2, i8* %lo43, i64 %hi44) - %not_err45 = icmp eq i64 %73, 0 - br i1 %not_err45, label %after_check46, label %voiderr47 +voiderr37: ; preds = %after_check36, %voiderr31 + store i32 123, ptr %x38, align 4 + store i32 33, ptr %y, align 4 + %36 = load i32, ptr %x38, align 4 + store i32 %36, ptr %a, align 4 + %37 = load i32, ptr %y, align 4 + store i32 %37, ptr %x38, align 4 + %38 = load i32, ptr %a, align 4 + store i32 %38, ptr %y, align 4 + %39 = insertvalue %variant undef, ptr %x38, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %41 = getelementptr inbounds [2 x %variant], ptr %varargslots40, i64 0, i64 0 + store %variant %40, ptr %41, align 16 + %42 = insertvalue %variant undef, ptr %y, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %44 = getelementptr inbounds [2 x %variant], ptr %varargslots40, i64 0, i64 1 + store %variant %43, ptr %44, align 16 + %45 = call i64 @std_io_printfn(ptr %retparam39, ptr @.str.10, i64 6, ptr %varargslots40, i64 2) + %not_err41 = icmp eq i64 %45, 0 + br i1 %not_err41, label %after_check42, label %voiderr43 -after_check46: ; preds = %voiderr37 - br label %voiderr47 +after_check42: ; preds = %voiderr37 + br label %voiderr43 -voiderr47: ; preds = %after_check46, %voiderr37 - store i32 105, i32* %taddr50, align 4 - %74 = bitcast i32* %taddr50 to i8* - %75 = insertvalue %variant undef, i8* %74, 0 - %76 = insertvalue %variant %75, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %77 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots49, i64 0, i64 0 - store %variant %76, %variant* %77, align 16 - %78 = bitcast [1 x %variant]* %varargslots49 to %variant* - %79 = insertvalue %"variant[]" undef, %variant* %78, 0 - %80 = insertvalue %"variant[]" %79, i64 1, 1 - store %"variant[]" %80, %"variant[]"* %taddr51, align 8 - %81 = bitcast %"variant[]"* %taddr51 to { i8*, i64 }* - %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 0 - %lo52 = load i8*, i8** %82, align 8 - %83 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 1 - %hi53 = load i64, i64* %83, align 8 - %84 = call i64 @std_io_printfln(i64* %retparam48, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0), i64 2, i8* %lo52, i64 %hi53) - %not_err54 = icmp eq i64 %84, 0 - br i1 %not_err54, label %after_check55, label %voiderr56 +voiderr43: ; preds = %after_check42, %voiderr37 + %46 = load i32, ptr %x38, align 4 + store i32 %46, ptr %a44, align 4 + %47 = load i32, ptr %y, align 4 + store i32 %47, ptr %x38, align 4 + %48 = load i32, ptr %a44, align 4 + store i32 %48, ptr %y, align 4 + %49 = insertvalue %variant undef, ptr %x38, 0 + %50 = insertvalue %variant %49, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %51 = getelementptr inbounds [2 x %variant], ptr %varargslots46, i64 0, i64 0 + store %variant %50, ptr %51, align 16 + %52 = insertvalue %variant undef, ptr %y, 0 + %53 = insertvalue %variant %52, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %54 = getelementptr inbounds [2 x %variant], ptr %varargslots46, i64 0, i64 1 + store %variant %53, ptr %54, align 16 + %55 = call i64 @std_io_printfn(ptr %retparam45, ptr @.str.11, i64 6, ptr %varargslots46, i64 2) + %not_err47 = icmp eq i64 %55, 0 + br i1 %not_err47, label %after_check48, label %voiderr49 -after_check55: ; preds = %voiderr47 - br label %voiderr56 +after_check48: ; preds = %voiderr43 + br label %voiderr49 -voiderr56: ; preds = %after_check55, %voiderr47 - store i32 123, i32* %x57, align 4 - store i32 33, i32* %y, align 4 - %85 = load i32, i32* %x57, align 4 - store i32 %85, i32* %a, align 4 - %86 = load i32, i32* %y, align 4 - store i32 %86, i32* %x57, align 4 - %87 = load i32, i32* %a, align 4 - store i32 %87, i32* %y, align 4 - %88 = bitcast i32* %x57 to i8* - %89 = insertvalue %variant undef, i8* %88, 0 - %90 = insertvalue %variant %89, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %91 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots59, i64 0, i64 0 - store %variant %90, %variant* %91, align 16 - %92 = bitcast i32* %y to i8* - %93 = insertvalue %variant undef, i8* %92, 0 - %94 = insertvalue %variant %93, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %95 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots59, i64 0, i64 1 - store %variant %94, %variant* %95, align 16 - %96 = bitcast [2 x %variant]* %varargslots59 to %variant* - %97 = insertvalue %"variant[]" undef, %variant* %96, 0 - %98 = insertvalue %"variant[]" %97, i64 2, 1 - store %"variant[]" %98, %"variant[]"* %taddr60, align 8 - %99 = bitcast %"variant[]"* %taddr60 to { i8*, i64 }* - %100 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %99, i32 0, i32 0 - %lo61 = load i8*, i8** %100, align 8 - %101 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %99, i32 0, i32 1 - %hi62 = load i64, i64* %101, align 8 - %102 = call i64 @std_io_printfln(i64* %retparam58, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i32 0, i32 0), i64 6, i8* %lo61, i64 %hi62) - %not_err63 = icmp eq i64 %102, 0 - br i1 %not_err63, label %after_check64, label %voiderr65 - -after_check64: ; preds = %voiderr56 - br label %voiderr65 - -voiderr65: ; preds = %after_check64, %voiderr56 - %103 = load i32, i32* %x57, align 4 - store i32 %103, i32* %a66, align 4 - %104 = load i32, i32* %y, align 4 - store i32 %104, i32* %x57, align 4 - %105 = load i32, i32* %a66, align 4 - store i32 %105, i32* %y, align 4 - %106 = bitcast i32* %x57 to i8* - %107 = insertvalue %variant undef, i8* %106, 0 - %108 = insertvalue %variant %107, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %109 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots68, i64 0, i64 0 - store %variant %108, %variant* %109, align 16 - %110 = bitcast i32* %y to i8* - %111 = insertvalue %variant undef, i8* %110, 0 - %112 = insertvalue %variant %111, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %113 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots68, i64 0, i64 1 - store %variant %112, %variant* %113, align 16 - %114 = bitcast [2 x %variant]* %varargslots68 to %variant* - %115 = insertvalue %"variant[]" undef, %variant* %114, 0 - %116 = insertvalue %"variant[]" %115, i64 2, 1 - store %"variant[]" %116, %"variant[]"* %taddr69, align 8 - %117 = bitcast %"variant[]"* %taddr69 to { i8*, i64 }* - %118 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %117, i32 0, i32 0 - %lo70 = load i8*, i8** %118, align 8 - %119 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %117, i32 0, i32 1 - %hi71 = load i64, i64* %119, align 8 - %120 = call i64 @std_io_printfln(i64* %retparam67, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i32 0, i32 0), i64 6, i8* %lo70, i64 %hi71) - %not_err72 = icmp eq i64 %120, 0 - br i1 %not_err72, label %after_check73, label %voiderr74 - -after_check73: ; preds = %voiderr65 - br label %voiderr74 - -voiderr74: ; preds = %after_check73, %voiderr65 +voiderr49: ; preds = %after_check48, %voiderr43 ret void -} +} \ No newline at end of file diff --git a/test/test_suite/macros/macro_vasplat.c3t b/test/test_suite/macros/macro_vasplat.c3t index 5bc8188b9..1b35114b2 100644 --- a/test/test_suite/macros/macro_vasplat.c3t +++ b/test/test_suite/macros/macro_vasplat.c3t @@ -5,41 +5,41 @@ import std::io; macro @hello(...) { int[*] a = { 1, $vasplat(), 3 }; - foreach (i, x : a) io::printfln("%d: %d", i, x); + foreach (i, x : a) io::printfn("%d: %d", i, x); } macro @hello1(...) { int[*] a = { 1, $vasplat() }; - foreach (i, x : a) io::printfln("x:%d: %d", i, x); + foreach (i, x : a) io::printfn("x:%d: %d", i, x); } macro @hello2(...) { int[*] a = { $vasplat(), 888 }; - foreach (i, x : a) io::printfln("x:%d: %d", i, x); + foreach (i, x : a) io::printfn("x:%d: %d", i, x); } macro @hello3(...) { int[*] a = { $vasplat() }; - foreach (i, x : a) io::printfln("x:%d: %d", i, x); + foreach (i, x : a) io::printfn("x:%d: %d", i, x); } macro @hello4(...) { int[*] a = { 5, $vasplat(2..4), 77 }; - foreach (i, x : a) io::printfln("y:%d: %d", i, x); + foreach (i, x : a) io::printfn("y:%d: %d", i, x); } macro @hello5(...) { int[*] a = { 5, $vasplat(2..), 77 }; - foreach (i, x : a) io::printfln("y:%d: %d", i, x); + foreach (i, x : a) io::printfn("y:%d: %d", i, x); int[*] b = { 55, $vasplat(2..^2), 88 }; - foreach (i, x : b) io::printfln("z:%d: %d", i, x); + foreach (i, x : b) io::printfn("z:%d: %d", i, x); int[*] c = { 55, $vasplat(0:^2), 88 }; - foreach (i, x : c) io::printfln("zz:%d: %d", i, x); + foreach (i, x : c) io::printfn("zz:%d: %d", i, x); } macro @hello6(...) @@ -70,684 +70,527 @@ entry: %x = alloca i32, align 4 %retparam = alloca i64, align 8 %varargslots = alloca [2 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %a1 = alloca [1 x i32], align 4 %.anon2 = alloca i64, align 8 %i6 = alloca i64, align 8 %x7 = alloca i32, align 4 %retparam8 = alloca i64, align 8 %varargslots9 = alloca [2 x %variant], align 16 - %taddr10 = alloca %"variant[]", align 8 - %a18 = alloca [4 x i32], align 16 - %.anon19 = alloca i64, align 8 - %i23 = alloca i64, align 8 - %x24 = alloca i32, align 4 - %retparam25 = alloca i64, align 8 - %varargslots26 = alloca [2 x %variant], align 16 - %taddr27 = alloca %"variant[]", align 8 - %a35 = alloca [2 x i32], align 4 - %.anon36 = alloca i64, align 8 - %i40 = alloca i64, align 8 - %x41 = alloca i32, align 4 - %retparam42 = alloca i64, align 8 - %varargslots43 = alloca [2 x %variant], align 16 - %taddr44 = alloca %"variant[]", align 8 - %a52 = alloca [3 x i32], align 4 - %.anon53 = alloca i64, align 8 - %i57 = alloca i64, align 8 - %x58 = alloca i32, align 4 - %retparam59 = alloca i64, align 8 - %varargslots60 = alloca [2 x %variant], align 16 - %taddr61 = alloca %"variant[]", align 8 - %a69 = alloca [1 x i32], align 4 - %.anon70 = alloca i64, align 8 - %i74 = alloca i64, align 8 - %x75 = alloca i32, align 4 - %retparam76 = alloca i64, align 8 - %varargslots77 = alloca [2 x %variant], align 16 - %taddr78 = alloca %"variant[]", align 8 - %a86 = alloca [2 x i32], align 4 - %.anon87 = alloca i64, align 8 - %i91 = alloca i64, align 8 - %x92 = alloca i32, align 4 - %retparam93 = alloca i64, align 8 - %varargslots94 = alloca [2 x %variant], align 16 - %taddr95 = alloca %"variant[]", align 8 - %a103 = alloca [5 x i32], align 16 - %.anon104 = alloca i64, align 8 - %i108 = alloca i64, align 8 - %x109 = alloca i32, align 4 - %retparam110 = alloca i64, align 8 - %varargslots111 = alloca [2 x %variant], align 16 - %taddr112 = alloca %"variant[]", align 8 - %a120 = alloca [8 x i32], align 16 - %.anon121 = alloca i64, align 8 - %i125 = alloca i64, align 8 - %x126 = alloca i32, align 4 - %retparam127 = alloca i64, align 8 - %varargslots128 = alloca [2 x %variant], align 16 - %taddr129 = alloca %"variant[]", align 8 + %a15 = alloca [4 x i32], align 16 + %.anon16 = alloca i64, align 8 + %i20 = alloca i64, align 8 + %x21 = alloca i32, align 4 + %retparam22 = alloca i64, align 8 + %varargslots23 = alloca [2 x %variant], align 16 + %a29 = alloca [2 x i32], align 4 + %.anon30 = alloca i64, align 8 + %i34 = alloca i64, align 8 + %x35 = alloca i32, align 4 + %retparam36 = alloca i64, align 8 + %varargslots37 = alloca [2 x %variant], align 16 + %a43 = alloca [3 x i32], align 4 + %.anon44 = alloca i64, align 8 + %i48 = alloca i64, align 8 + %x49 = alloca i32, align 4 + %retparam50 = alloca i64, align 8 + %varargslots51 = alloca [2 x %variant], align 16 + %a57 = alloca [1 x i32], align 4 + %.anon58 = alloca i64, align 8 + %i62 = alloca i64, align 8 + %x63 = alloca i32, align 4 + %retparam64 = alloca i64, align 8 + %varargslots65 = alloca [2 x %variant], align 16 + %a71 = alloca [2 x i32], align 4 + %.anon72 = alloca i64, align 8 + %i76 = alloca i64, align 8 + %x77 = alloca i32, align 4 + %retparam78 = alloca i64, align 8 + %varargslots79 = alloca [2 x %variant], align 16 + %a85 = alloca [5 x i32], align 16 + %.anon86 = alloca i64, align 8 + %i90 = alloca i64, align 8 + %x91 = alloca i32, align 4 + %retparam92 = alloca i64, align 8 + %varargslots93 = alloca [2 x %variant], align 16 + %a99 = alloca [8 x i32], align 16 + %.anon100 = alloca i64, align 8 + %i104 = alloca i64, align 8 + %x105 = alloca i32, align 4 + %retparam106 = alloca i64, align 8 + %varargslots107 = alloca [2 x %variant], align 16 %b = alloca [7 x i32], align 16 - %.anon137 = alloca i64, align 8 - %i141 = alloca i64, align 8 - %x142 = alloca i32, align 4 - %retparam143 = alloca i64, align 8 - %varargslots144 = alloca [2 x %variant], align 16 - %taddr145 = alloca %"variant[]", align 8 + %.anon113 = alloca i64, align 8 + %i117 = alloca i64, align 8 + %x118 = alloca i32, align 4 + %retparam119 = alloca i64, align 8 + %varargslots120 = alloca [2 x %variant], align 16 %c = alloca [8 x i32], align 16 - %.anon153 = alloca i64, align 8 - %i157 = alloca i64, align 8 - %x158 = alloca i32, align 4 - %retparam159 = alloca i64, align 8 - %varargslots160 = alloca [2 x %variant], align 16 - %taddr161 = alloca %"variant[]", align 8 - %a169 = alloca [6 x i32], align 16 - %.anon170 = alloca i64, align 8 - %i174 = alloca i64, align 8 - %x175 = alloca i32, align 4 - %retparam176 = alloca i64, align 8 - %varargslots177 = alloca [2 x %variant], align 16 - %taddr178 = alloca %"variant[]", align 8 - %0 = bitcast [3 x i32]* %a to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - store i64 0, i64* %.anon, align 8 + %.anon126 = alloca i64, align 8 + %i130 = alloca i64, align 8 + %x131 = alloca i32, align 4 + %retparam132 = alloca i64, align 8 + %varargslots133 = alloca [2 x %variant], align 16 + %a139 = alloca [6 x i32], align 16 + %.anon140 = alloca i64, align 8 + %i144 = alloca i64, align 8 + %x145 = alloca i32, align 4 + %retparam146 = alloca i64, align 8 + %varargslots147 = alloca [2 x %variant], align 16 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 @.__const, i32 12, i1 false) + store i64 0, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %voiderr, %entry - %1 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 3, %1 + %0 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 3, %0 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %2 = load i64, i64* %.anon, align 8 - store i64 %2, i64* %i, align 8 - %3 = load i64, i64* %.anon, align 8 - %4 = getelementptr inbounds [3 x i32], [3 x i32]* %a, i64 0, i64 %3 - %5 = load i32, i32* %4, align 4 - store i32 %5, i32* %x, align 4 - %6 = bitcast i64* %i to i8* - %7 = insertvalue %variant undef, i8* %6, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %9 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %8, %variant* %9, align 16 - %10 = bitcast i32* %x to i8* - %11 = insertvalue %variant undef, i8* %10, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %13 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %12, %variant* %13, align 16 - %14 = bitcast [2 x %variant]* %varargslots to %variant* - %15 = insertvalue %"variant[]" undef, %variant* %14, 0 - %16 = insertvalue %"variant[]" %15, i64 2, 1 - store %"variant[]" %16, %"variant[]"* %taddr, align 8 - %17 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 - %lo = load i8*, i8** %18, align 8 - %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 - %hi = load i64, i64* %19, align 8 - %20 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %20, 0 + %1 = load i64, ptr %.anon, align 8 + store i64 %1, ptr %i, align 8 + %2 = load i64, ptr %.anon, align 8 + %3 = getelementptr inbounds [3 x i32], ptr %a, i64 0, i64 %2 + %4 = load i32, ptr %3, align 4 + store i32 %4, ptr %x, align 4 + %5 = insertvalue %variant undef, ptr %i, 0 + %6 = insertvalue %variant %5, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %7 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %6, ptr %7, align 16 + %8 = insertvalue %variant undef, ptr %x, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %10 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %9, ptr %10, align 16 + %11 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %11, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %loop.body br label %voiderr voiderr: ; preds = %after_check, %loop.body - %21 = load i64, i64* %.anon, align 8 - %add = add i64 %21, 1 - store i64 %add, i64* %.anon, align 8 + %12 = load i64, ptr %.anon, align 8 + %add = add i64 %12, 1 + store i64 %add, ptr %.anon, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %22 = bitcast [1 x i32]* %a1 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %22, i8* align 4 bitcast ([1 x i32]* @.__const.1 to i8*), i32 4, i1 false) - store i64 0, i64* %.anon2, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a1, ptr align 4 @.__const.1, i32 4, i1 false) + store i64 0, ptr %.anon2, align 8 br label %loop.cond3 -loop.cond3: ; preds = %voiderr15, %loop.exit - %23 = load i64, i64* %.anon2, align 8 - %gt4 = icmp ugt i64 1, %23 - br i1 %gt4, label %loop.body5, label %loop.exit17 +loop.cond3: ; preds = %voiderr12, %loop.exit + %13 = load i64, ptr %.anon2, align 8 + %gt4 = icmp ugt i64 1, %13 + br i1 %gt4, label %loop.body5, label %loop.exit14 loop.body5: ; preds = %loop.cond3 - %24 = load i64, i64* %.anon2, align 8 - store i64 %24, i64* %i6, align 8 - %25 = load i64, i64* %.anon2, align 8 - %26 = getelementptr inbounds [1 x i32], [1 x i32]* %a1, i64 0, i64 %25 - %27 = load i32, i32* %26, align 4 - store i32 %27, i32* %x7, align 4 - %28 = bitcast i64* %i6 to i8* - %29 = insertvalue %variant undef, i8* %28, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %31 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots9, i64 0, i64 0 - store %variant %30, %variant* %31, align 16 - %32 = bitcast i32* %x7 to i8* - %33 = insertvalue %variant undef, i8* %32, 0 - %34 = insertvalue %variant %33, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %35 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots9, i64 0, i64 1 - store %variant %34, %variant* %35, align 16 - %36 = bitcast [2 x %variant]* %varargslots9 to %variant* - %37 = insertvalue %"variant[]" undef, %variant* %36, 0 - %38 = insertvalue %"variant[]" %37, i64 2, 1 - store %"variant[]" %38, %"variant[]"* %taddr10, align 8 - %39 = bitcast %"variant[]"* %taddr10 to { i8*, i64 }* - %40 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %39, i32 0, i32 0 - %lo11 = load i8*, i8** %40, align 8 - %41 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %39, i32 0, i32 1 - %hi12 = load i64, i64* %41, align 8 - %42 = call i64 @std_io_printfln(i64* %retparam8, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i32 0, i32 0), i64 8, i8* %lo11, i64 %hi12) - %not_err13 = icmp eq i64 %42, 0 - br i1 %not_err13, label %after_check14, label %voiderr15 + %14 = load i64, ptr %.anon2, align 8 + store i64 %14, ptr %i6, align 8 + %15 = load i64, ptr %.anon2, align 8 + %16 = getelementptr inbounds [1 x i32], ptr %a1, i64 0, i64 %15 + %17 = load i32, ptr %16, align 4 + store i32 %17, ptr %x7, align 4 + %18 = insertvalue %variant undef, ptr %i6, 0 + %19 = insertvalue %variant %18, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %20 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 0 + store %variant %19, ptr %20, align 16 + %21 = insertvalue %variant undef, ptr %x7, 0 + %22 = insertvalue %variant %21, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %23 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 1 + store %variant %22, ptr %23, align 16 + %24 = call i64 @std_io_printfn(ptr %retparam8, ptr @.str.2, i64 8, ptr %varargslots9, i64 2) + %not_err10 = icmp eq i64 %24, 0 + br i1 %not_err10, label %after_check11, label %voiderr12 -after_check14: ; preds = %loop.body5 - br label %voiderr15 +after_check11: ; preds = %loop.body5 + br label %voiderr12 -voiderr15: ; preds = %after_check14, %loop.body5 - %43 = load i64, i64* %.anon2, align 8 - %add16 = add i64 %43, 1 - store i64 %add16, i64* %.anon2, align 8 +voiderr12: ; preds = %after_check11, %loop.body5 + %25 = load i64, ptr %.anon2, align 8 + %add13 = add i64 %25, 1 + store i64 %add13, ptr %.anon2, align 8 br label %loop.cond3 -loop.exit17: ; preds = %loop.cond3 - %44 = bitcast [4 x i32]* %a18 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %44, i8* align 16 bitcast ([4 x i32]* @.__const.3 to i8*), i32 16, i1 false) - store i64 0, i64* %.anon19, align 8 - br label %loop.cond20 +loop.exit14: ; preds = %loop.cond3 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a15, ptr align 16 @.__const.3, i32 16, i1 false) + store i64 0, ptr %.anon16, align 8 + br label %loop.cond17 -loop.cond20: ; preds = %voiderr32, %loop.exit17 - %45 = load i64, i64* %.anon19, align 8 - %gt21 = icmp ugt i64 4, %45 - br i1 %gt21, label %loop.body22, label %loop.exit34 +loop.cond17: ; preds = %voiderr26, %loop.exit14 + %26 = load i64, ptr %.anon16, align 8 + %gt18 = icmp ugt i64 4, %26 + br i1 %gt18, label %loop.body19, label %loop.exit28 -loop.body22: ; preds = %loop.cond20 - %46 = load i64, i64* %.anon19, align 8 - store i64 %46, i64* %i23, align 8 - %47 = load i64, i64* %.anon19, align 8 - %48 = getelementptr inbounds [4 x i32], [4 x i32]* %a18, i64 0, i64 %47 - %49 = load i32, i32* %48, align 4 - store i32 %49, i32* %x24, align 4 - %50 = bitcast i64* %i23 to i8* - %51 = insertvalue %variant undef, i8* %50, 0 - %52 = insertvalue %variant %51, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %53 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots26, i64 0, i64 0 - store %variant %52, %variant* %53, align 16 - %54 = bitcast i32* %x24 to i8* - %55 = insertvalue %variant undef, i8* %54, 0 - %56 = insertvalue %variant %55, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %57 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots26, i64 0, i64 1 - store %variant %56, %variant* %57, align 16 - %58 = bitcast [2 x %variant]* %varargslots26 to %variant* - %59 = insertvalue %"variant[]" undef, %variant* %58, 0 - %60 = insertvalue %"variant[]" %59, i64 2, 1 - store %"variant[]" %60, %"variant[]"* %taddr27, align 8 - %61 = bitcast %"variant[]"* %taddr27 to { i8*, i64 }* - %62 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 0 - %lo28 = load i8*, i8** %62, align 8 - %63 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 1 - %hi29 = load i64, i64* %63, align 8 - %64 = call i64 @std_io_printfln(i64* %retparam25, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0), i64 6, i8* %lo28, i64 %hi29) - %not_err30 = icmp eq i64 %64, 0 - br i1 %not_err30, label %after_check31, label %voiderr32 +loop.body19: ; preds = %loop.cond17 + %27 = load i64, ptr %.anon16, align 8 + store i64 %27, ptr %i20, align 8 + %28 = load i64, ptr %.anon16, align 8 + %29 = getelementptr inbounds [4 x i32], ptr %a15, i64 0, i64 %28 + %30 = load i32, ptr %29, align 4 + store i32 %30, ptr %x21, align 4 + %31 = insertvalue %variant undef, ptr %i20, 0 + %32 = insertvalue %variant %31, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %33 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 0 + store %variant %32, ptr %33, align 16 + %34 = insertvalue %variant undef, ptr %x21, 0 + %35 = insertvalue %variant %34, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %36 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 1 + store %variant %35, ptr %36, align 16 + %37 = call i64 @std_io_printfn(ptr %retparam22, ptr @.str.4, i64 6, ptr %varargslots23, i64 2) + %not_err24 = icmp eq i64 %37, 0 + br i1 %not_err24, label %after_check25, label %voiderr26 -after_check31: ; preds = %loop.body22 - br label %voiderr32 +after_check25: ; preds = %loop.body19 + br label %voiderr26 -voiderr32: ; preds = %after_check31, %loop.body22 - %65 = load i64, i64* %.anon19, align 8 - %add33 = add i64 %65, 1 - store i64 %add33, i64* %.anon19, align 8 - br label %loop.cond20 +voiderr26: ; preds = %after_check25, %loop.body19 + %38 = load i64, ptr %.anon16, align 8 + %add27 = add i64 %38, 1 + store i64 %add27, ptr %.anon16, align 8 + br label %loop.cond17 -loop.exit34: ; preds = %loop.cond20 - %66 = bitcast [2 x i32]* %a35 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %66, i8* align 4 bitcast ([2 x i32]* @.__const.5 to i8*), i32 8, i1 false) - store i64 0, i64* %.anon36, align 8 - br label %loop.cond37 +loop.exit28: ; preds = %loop.cond17 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a29, ptr align 4 @.__const.5, i32 8, i1 false) + store i64 0, ptr %.anon30, align 8 + br label %loop.cond31 -loop.cond37: ; preds = %voiderr49, %loop.exit34 - %67 = load i64, i64* %.anon36, align 8 - %gt38 = icmp ugt i64 2, %67 - br i1 %gt38, label %loop.body39, label %loop.exit51 +loop.cond31: ; preds = %voiderr40, %loop.exit28 + %39 = load i64, ptr %.anon30, align 8 + %gt32 = icmp ugt i64 2, %39 + br i1 %gt32, label %loop.body33, label %loop.exit42 -loop.body39: ; preds = %loop.cond37 - %68 = load i64, i64* %.anon36, align 8 - store i64 %68, i64* %i40, align 8 - %69 = load i64, i64* %.anon36, align 8 - %70 = getelementptr inbounds [2 x i32], [2 x i32]* %a35, i64 0, i64 %69 - %71 = load i32, i32* %70, align 4 - store i32 %71, i32* %x41, align 4 - %72 = bitcast i64* %i40 to i8* - %73 = insertvalue %variant undef, i8* %72, 0 - %74 = insertvalue %variant %73, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %75 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots43, i64 0, i64 0 - store %variant %74, %variant* %75, align 16 - %76 = bitcast i32* %x41 to i8* - %77 = insertvalue %variant undef, i8* %76, 0 - %78 = insertvalue %variant %77, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %79 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots43, i64 0, i64 1 - store %variant %78, %variant* %79, align 16 - %80 = bitcast [2 x %variant]* %varargslots43 to %variant* - %81 = insertvalue %"variant[]" undef, %variant* %80, 0 - %82 = insertvalue %"variant[]" %81, i64 2, 1 - store %"variant[]" %82, %"variant[]"* %taddr44, align 8 - %83 = bitcast %"variant[]"* %taddr44 to { i8*, i64 }* - %84 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %83, i32 0, i32 0 - %lo45 = load i8*, i8** %84, align 8 - %85 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %83, i32 0, i32 1 - %hi46 = load i64, i64* %85, align 8 - %86 = call i64 @std_io_printfln(i64* %retparam42, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i32 0, i32 0), i64 6, i8* %lo45, i64 %hi46) - %not_err47 = icmp eq i64 %86, 0 - br i1 %not_err47, label %after_check48, label %voiderr49 +loop.body33: ; preds = %loop.cond31 + %40 = load i64, ptr %.anon30, align 8 + store i64 %40, ptr %i34, align 8 + %41 = load i64, ptr %.anon30, align 8 + %42 = getelementptr inbounds [2 x i32], ptr %a29, i64 0, i64 %41 + %43 = load i32, ptr %42, align 4 + store i32 %43, ptr %x35, align 4 + %44 = insertvalue %variant undef, ptr %i34, 0 + %45 = insertvalue %variant %44, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %46 = getelementptr inbounds [2 x %variant], ptr %varargslots37, i64 0, i64 0 + store %variant %45, ptr %46, align 16 + %47 = insertvalue %variant undef, ptr %x35, 0 + %48 = insertvalue %variant %47, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %49 = getelementptr inbounds [2 x %variant], ptr %varargslots37, i64 0, i64 1 + store %variant %48, ptr %49, align 16 + %50 = call i64 @std_io_printfn(ptr %retparam36, ptr @.str.6, i64 6, ptr %varargslots37, i64 2) + %not_err38 = icmp eq i64 %50, 0 + br i1 %not_err38, label %after_check39, label %voiderr40 -after_check48: ; preds = %loop.body39 - br label %voiderr49 +after_check39: ; preds = %loop.body33 + br label %voiderr40 -voiderr49: ; preds = %after_check48, %loop.body39 - %87 = load i64, i64* %.anon36, align 8 - %add50 = add i64 %87, 1 - store i64 %add50, i64* %.anon36, align 8 - br label %loop.cond37 +voiderr40: ; preds = %after_check39, %loop.body33 + %51 = load i64, ptr %.anon30, align 8 + %add41 = add i64 %51, 1 + store i64 %add41, ptr %.anon30, align 8 + br label %loop.cond31 -loop.exit51: ; preds = %loop.cond37 - %88 = bitcast [3 x i32]* %a52 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %88, i8* align 4 bitcast ([3 x i32]* @.__const.7 to i8*), i32 12, i1 false) - store i64 0, i64* %.anon53, align 8 - br label %loop.cond54 +loop.exit42: ; preds = %loop.cond31 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a43, ptr align 4 @.__const.7, i32 12, i1 false) + store i64 0, ptr %.anon44, align 8 + br label %loop.cond45 -loop.cond54: ; preds = %voiderr66, %loop.exit51 - %89 = load i64, i64* %.anon53, align 8 - %gt55 = icmp ugt i64 3, %89 - br i1 %gt55, label %loop.body56, label %loop.exit68 +loop.cond45: ; preds = %voiderr54, %loop.exit42 + %52 = load i64, ptr %.anon44, align 8 + %gt46 = icmp ugt i64 3, %52 + br i1 %gt46, label %loop.body47, label %loop.exit56 -loop.body56: ; preds = %loop.cond54 - %90 = load i64, i64* %.anon53, align 8 - store i64 %90, i64* %i57, align 8 - %91 = load i64, i64* %.anon53, align 8 - %92 = getelementptr inbounds [3 x i32], [3 x i32]* %a52, i64 0, i64 %91 - %93 = load i32, i32* %92, align 4 - store i32 %93, i32* %x58, align 4 - %94 = bitcast i64* %i57 to i8* - %95 = insertvalue %variant undef, i8* %94, 0 - %96 = insertvalue %variant %95, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %97 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots60, i64 0, i64 0 - store %variant %96, %variant* %97, align 16 - %98 = bitcast i32* %x58 to i8* - %99 = insertvalue %variant undef, i8* %98, 0 - %100 = insertvalue %variant %99, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %101 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots60, i64 0, i64 1 - store %variant %100, %variant* %101, align 16 - %102 = bitcast [2 x %variant]* %varargslots60 to %variant* - %103 = insertvalue %"variant[]" undef, %variant* %102, 0 - %104 = insertvalue %"variant[]" %103, i64 2, 1 - store %"variant[]" %104, %"variant[]"* %taddr61, align 8 - %105 = bitcast %"variant[]"* %taddr61 to { i8*, i64 }* - %106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 0 - %lo62 = load i8*, i8** %106, align 8 - %107 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 1 - %hi63 = load i64, i64* %107, align 8 - %108 = call i64 @std_io_printfln(i64* %retparam59, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.8, i32 0, i32 0), i64 8, i8* %lo62, i64 %hi63) - %not_err64 = icmp eq i64 %108, 0 - br i1 %not_err64, label %after_check65, label %voiderr66 +loop.body47: ; preds = %loop.cond45 + %53 = load i64, ptr %.anon44, align 8 + store i64 %53, ptr %i48, align 8 + %54 = load i64, ptr %.anon44, align 8 + %55 = getelementptr inbounds [3 x i32], ptr %a43, i64 0, i64 %54 + %56 = load i32, ptr %55, align 4 + store i32 %56, ptr %x49, align 4 + %57 = insertvalue %variant undef, ptr %i48, 0 + %58 = insertvalue %variant %57, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %59 = getelementptr inbounds [2 x %variant], ptr %varargslots51, i64 0, i64 0 + store %variant %58, ptr %59, align 16 + %60 = insertvalue %variant undef, ptr %x49, 0 + %61 = insertvalue %variant %60, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %62 = getelementptr inbounds [2 x %variant], ptr %varargslots51, i64 0, i64 1 + store %variant %61, ptr %62, align 16 + %63 = call i64 @std_io_printfn(ptr %retparam50, ptr @.str.8, i64 8, ptr %varargslots51, i64 2) + %not_err52 = icmp eq i64 %63, 0 + br i1 %not_err52, label %after_check53, label %voiderr54 -after_check65: ; preds = %loop.body56 - br label %voiderr66 +after_check53: ; preds = %loop.body47 + br label %voiderr54 -voiderr66: ; preds = %after_check65, %loop.body56 - %109 = load i64, i64* %.anon53, align 8 - %add67 = add i64 %109, 1 - store i64 %add67, i64* %.anon53, align 8 - br label %loop.cond54 +voiderr54: ; preds = %after_check53, %loop.body47 + %64 = load i64, ptr %.anon44, align 8 + %add55 = add i64 %64, 1 + store i64 %add55, ptr %.anon44, align 8 + br label %loop.cond45 -loop.exit68: ; preds = %loop.cond54 - %110 = bitcast [1 x i32]* %a69 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %110, i8* align 4 bitcast ([1 x i32]* @.__const.9 to i8*), i32 4, i1 false) - store i64 0, i64* %.anon70, align 8 - br label %loop.cond71 +loop.exit56: ; preds = %loop.cond45 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a57, ptr align 4 @.__const.9, i32 4, i1 false) + store i64 0, ptr %.anon58, align 8 + br label %loop.cond59 -loop.cond71: ; preds = %voiderr83, %loop.exit68 - %111 = load i64, i64* %.anon70, align 8 - %gt72 = icmp ugt i64 1, %111 - br i1 %gt72, label %loop.body73, label %loop.exit85 +loop.cond59: ; preds = %voiderr68, %loop.exit56 + %65 = load i64, ptr %.anon58, align 8 + %gt60 = icmp ugt i64 1, %65 + br i1 %gt60, label %loop.body61, label %loop.exit70 -loop.body73: ; preds = %loop.cond71 - %112 = load i64, i64* %.anon70, align 8 - store i64 %112, i64* %i74, align 8 - %113 = load i64, i64* %.anon70, align 8 - %114 = getelementptr inbounds [1 x i32], [1 x i32]* %a69, i64 0, i64 %113 - %115 = load i32, i32* %114, align 4 - store i32 %115, i32* %x75, align 4 - %116 = bitcast i64* %i74 to i8* - %117 = insertvalue %variant undef, i8* %116, 0 - %118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %119 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots77, i64 0, i64 0 - store %variant %118, %variant* %119, align 16 - %120 = bitcast i32* %x75 to i8* - %121 = insertvalue %variant undef, i8* %120, 0 - %122 = insertvalue %variant %121, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %123 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots77, i64 0, i64 1 - store %variant %122, %variant* %123, align 16 - %124 = bitcast [2 x %variant]* %varargslots77 to %variant* - %125 = insertvalue %"variant[]" undef, %variant* %124, 0 - %126 = insertvalue %"variant[]" %125, i64 2, 1 - store %"variant[]" %126, %"variant[]"* %taddr78, align 8 - %127 = bitcast %"variant[]"* %taddr78 to { i8*, i64 }* - %128 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %127, i32 0, i32 0 - %lo79 = load i8*, i8** %128, align 8 - %129 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %127, i32 0, i32 1 - %hi80 = load i64, i64* %129, align 8 - %130 = call i64 @std_io_printfln(i64* %retparam76, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.10, i32 0, i32 0), i64 8, i8* %lo79, i64 %hi80) - %not_err81 = icmp eq i64 %130, 0 - br i1 %not_err81, label %after_check82, label %voiderr83 +loop.body61: ; preds = %loop.cond59 + %66 = load i64, ptr %.anon58, align 8 + store i64 %66, ptr %i62, align 8 + %67 = load i64, ptr %.anon58, align 8 + %68 = getelementptr inbounds [1 x i32], ptr %a57, i64 0, i64 %67 + %69 = load i32, ptr %68, align 4 + store i32 %69, ptr %x63, align 4 + %70 = insertvalue %variant undef, ptr %i62, 0 + %71 = insertvalue %variant %70, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %72 = getelementptr inbounds [2 x %variant], ptr %varargslots65, i64 0, i64 0 + store %variant %71, ptr %72, align 16 + %73 = insertvalue %variant undef, ptr %x63, 0 + %74 = insertvalue %variant %73, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %75 = getelementptr inbounds [2 x %variant], ptr %varargslots65, i64 0, i64 1 + store %variant %74, ptr %75, align 16 + %76 = call i64 @std_io_printfn(ptr %retparam64, ptr @.str.10, i64 8, ptr %varargslots65, i64 2) + %not_err66 = icmp eq i64 %76, 0 + br i1 %not_err66, label %after_check67, label %voiderr68 -after_check82: ; preds = %loop.body73 - br label %voiderr83 +after_check67: ; preds = %loop.body61 + br label %voiderr68 -voiderr83: ; preds = %after_check82, %loop.body73 - %131 = load i64, i64* %.anon70, align 8 - %add84 = add i64 %131, 1 - store i64 %add84, i64* %.anon70, align 8 - br label %loop.cond71 +voiderr68: ; preds = %after_check67, %loop.body61 + %77 = load i64, ptr %.anon58, align 8 + %add69 = add i64 %77, 1 + store i64 %add69, ptr %.anon58, align 8 + br label %loop.cond59 -loop.exit85: ; preds = %loop.cond71 - %132 = bitcast [2 x i32]* %a86 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %132, i8* align 4 bitcast ([2 x i32]* @.__const.11 to i8*), i32 8, i1 false) - store i64 0, i64* %.anon87, align 8 - br label %loop.cond88 +loop.exit70: ; preds = %loop.cond59 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a71, ptr align 4 @.__const.11, i32 8, i1 false) + store i64 0, ptr %.anon72, align 8 + br label %loop.cond73 -loop.cond88: ; preds = %voiderr100, %loop.exit85 - %133 = load i64, i64* %.anon87, align 8 - %gt89 = icmp ugt i64 2, %133 - br i1 %gt89, label %loop.body90, label %loop.exit102 +loop.cond73: ; preds = %voiderr82, %loop.exit70 + %78 = load i64, ptr %.anon72, align 8 + %gt74 = icmp ugt i64 2, %78 + br i1 %gt74, label %loop.body75, label %loop.exit84 -loop.body90: ; preds = %loop.cond88 - %134 = load i64, i64* %.anon87, align 8 - store i64 %134, i64* %i91, align 8 - %135 = load i64, i64* %.anon87, align 8 - %136 = getelementptr inbounds [2 x i32], [2 x i32]* %a86, i64 0, i64 %135 - %137 = load i32, i32* %136, align 4 - store i32 %137, i32* %x92, align 4 - %138 = bitcast i64* %i91 to i8* - %139 = insertvalue %variant undef, i8* %138, 0 - %140 = insertvalue %variant %139, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %141 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots94, i64 0, i64 0 - store %variant %140, %variant* %141, align 16 - %142 = bitcast i32* %x92 to i8* - %143 = insertvalue %variant undef, i8* %142, 0 - %144 = insertvalue %variant %143, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %145 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots94, i64 0, i64 1 - store %variant %144, %variant* %145, align 16 - %146 = bitcast [2 x %variant]* %varargslots94 to %variant* - %147 = insertvalue %"variant[]" undef, %variant* %146, 0 - %148 = insertvalue %"variant[]" %147, i64 2, 1 - store %"variant[]" %148, %"variant[]"* %taddr95, align 8 - %149 = bitcast %"variant[]"* %taddr95 to { i8*, i64 }* - %150 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 0 - %lo96 = load i8*, i8** %150, align 8 - %151 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 1 - %hi97 = load i64, i64* %151, align 8 - %152 = call i64 @std_io_printfln(i64* %retparam93, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i32 0, i32 0), i64 8, i8* %lo96, i64 %hi97) - %not_err98 = icmp eq i64 %152, 0 - br i1 %not_err98, label %after_check99, label %voiderr100 +loop.body75: ; preds = %loop.cond73 + %79 = load i64, ptr %.anon72, align 8 + store i64 %79, ptr %i76, align 8 + %80 = load i64, ptr %.anon72, align 8 + %81 = getelementptr inbounds [2 x i32], ptr %a71, i64 0, i64 %80 + %82 = load i32, ptr %81, align 4 + store i32 %82, ptr %x77, align 4 + %83 = insertvalue %variant undef, ptr %i76, 0 + %84 = insertvalue %variant %83, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %85 = getelementptr inbounds [2 x %variant], ptr %varargslots79, i64 0, i64 0 + store %variant %84, ptr %85, align 16 + %86 = insertvalue %variant undef, ptr %x77, 0 + %87 = insertvalue %variant %86, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %88 = getelementptr inbounds [2 x %variant], ptr %varargslots79, i64 0, i64 1 + store %variant %87, ptr %88, align 16 + %89 = call i64 @std_io_printfn(ptr %retparam78, ptr @.str.12, i64 8, ptr %varargslots79, i64 2) + %not_err80 = icmp eq i64 %89, 0 + br i1 %not_err80, label %after_check81, label %voiderr82 -after_check99: ; preds = %loop.body90 - br label %voiderr100 +after_check81: ; preds = %loop.body75 + br label %voiderr82 -voiderr100: ; preds = %after_check99, %loop.body90 - %153 = load i64, i64* %.anon87, align 8 - %add101 = add i64 %153, 1 - store i64 %add101, i64* %.anon87, align 8 - br label %loop.cond88 +voiderr82: ; preds = %after_check81, %loop.body75 + %90 = load i64, ptr %.anon72, align 8 + %add83 = add i64 %90, 1 + store i64 %add83, ptr %.anon72, align 8 + br label %loop.cond73 -loop.exit102: ; preds = %loop.cond88 - %154 = bitcast [5 x i32]* %a103 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %154, i8* align 16 bitcast ([5 x i32]* @.__const.13 to i8*), i32 20, i1 false) - store i64 0, i64* %.anon104, align 8 - br label %loop.cond105 +loop.exit84: ; preds = %loop.cond73 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a85, ptr align 16 @.__const.13, i32 20, i1 false) + store i64 0, ptr %.anon86, align 8 + br label %loop.cond87 -loop.cond105: ; preds = %voiderr117, %loop.exit102 - %155 = load i64, i64* %.anon104, align 8 - %gt106 = icmp ugt i64 5, %155 - br i1 %gt106, label %loop.body107, label %loop.exit119 +loop.cond87: ; preds = %voiderr96, %loop.exit84 + %91 = load i64, ptr %.anon86, align 8 + %gt88 = icmp ugt i64 5, %91 + br i1 %gt88, label %loop.body89, label %loop.exit98 -loop.body107: ; preds = %loop.cond105 - %156 = load i64, i64* %.anon104, align 8 - store i64 %156, i64* %i108, align 8 - %157 = load i64, i64* %.anon104, align 8 - %158 = getelementptr inbounds [5 x i32], [5 x i32]* %a103, i64 0, i64 %157 - %159 = load i32, i32* %158, align 4 - store i32 %159, i32* %x109, align 4 - %160 = bitcast i64* %i108 to i8* - %161 = insertvalue %variant undef, i8* %160, 0 - %162 = insertvalue %variant %161, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %163 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 0 - store %variant %162, %variant* %163, align 16 - %164 = bitcast i32* %x109 to i8* - %165 = insertvalue %variant undef, i8* %164, 0 - %166 = insertvalue %variant %165, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %167 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 1 - store %variant %166, %variant* %167, align 16 - %168 = bitcast [2 x %variant]* %varargslots111 to %variant* - %169 = insertvalue %"variant[]" undef, %variant* %168, 0 - %170 = insertvalue %"variant[]" %169, i64 2, 1 - store %"variant[]" %170, %"variant[]"* %taddr112, align 8 - %171 = bitcast %"variant[]"* %taddr112 to { i8*, i64 }* - %172 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %171, i32 0, i32 0 - %lo113 = load i8*, i8** %172, align 8 - %173 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %171, i32 0, i32 1 - %hi114 = load i64, i64* %173, align 8 - %174 = call i64 @std_io_printfln(i64* %retparam110, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.14, i32 0, i32 0), i64 8, i8* %lo113, i64 %hi114) - %not_err115 = icmp eq i64 %174, 0 - br i1 %not_err115, label %after_check116, label %voiderr117 +loop.body89: ; preds = %loop.cond87 + %92 = load i64, ptr %.anon86, align 8 + store i64 %92, ptr %i90, align 8 + %93 = load i64, ptr %.anon86, align 8 + %94 = getelementptr inbounds [5 x i32], ptr %a85, i64 0, i64 %93 + %95 = load i32, ptr %94, align 4 + store i32 %95, ptr %x91, align 4 + %96 = insertvalue %variant undef, ptr %i90, 0 + %97 = insertvalue %variant %96, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %98 = getelementptr inbounds [2 x %variant], ptr %varargslots93, i64 0, i64 0 + store %variant %97, ptr %98, align 16 + %99 = insertvalue %variant undef, ptr %x91, 0 + %100 = insertvalue %variant %99, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %101 = getelementptr inbounds [2 x %variant], ptr %varargslots93, i64 0, i64 1 + store %variant %100, ptr %101, align 16 + %102 = call i64 @std_io_printfn(ptr %retparam92, ptr @.str.14, i64 8, ptr %varargslots93, i64 2) + %not_err94 = icmp eq i64 %102, 0 + br i1 %not_err94, label %after_check95, label %voiderr96 -after_check116: ; preds = %loop.body107 - br label %voiderr117 +after_check95: ; preds = %loop.body89 + br label %voiderr96 -voiderr117: ; preds = %after_check116, %loop.body107 - %175 = load i64, i64* %.anon104, align 8 - %add118 = add i64 %175, 1 - store i64 %add118, i64* %.anon104, align 8 - br label %loop.cond105 +voiderr96: ; preds = %after_check95, %loop.body89 + %103 = load i64, ptr %.anon86, align 8 + %add97 = add i64 %103, 1 + store i64 %add97, ptr %.anon86, align 8 + br label %loop.cond87 -loop.exit119: ; preds = %loop.cond105 - %176 = bitcast [8 x i32]* %a120 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %176, i8* align 16 bitcast ([8 x i32]* @.__const.15 to i8*), i32 32, i1 false) - store i64 0, i64* %.anon121, align 8 - br label %loop.cond122 +loop.exit98: ; preds = %loop.cond87 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a99, ptr align 16 @.__const.15, i32 32, i1 false) + store i64 0, ptr %.anon100, align 8 + br label %loop.cond101 -loop.cond122: ; preds = %voiderr134, %loop.exit119 - %177 = load i64, i64* %.anon121, align 8 - %gt123 = icmp ugt i64 8, %177 - br i1 %gt123, label %loop.body124, label %loop.exit136 +loop.cond101: ; preds = %voiderr110, %loop.exit98 + %104 = load i64, ptr %.anon100, align 8 + %gt102 = icmp ugt i64 8, %104 + br i1 %gt102, label %loop.body103, label %loop.exit112 -loop.body124: ; preds = %loop.cond122 - %178 = load i64, i64* %.anon121, align 8 - store i64 %178, i64* %i125, align 8 - %179 = load i64, i64* %.anon121, align 8 - %180 = getelementptr inbounds [8 x i32], [8 x i32]* %a120, i64 0, i64 %179 - %181 = load i32, i32* %180, align 4 - store i32 %181, i32* %x126, align 4 - %182 = bitcast i64* %i125 to i8* - %183 = insertvalue %variant undef, i8* %182, 0 - %184 = insertvalue %variant %183, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %185 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots128, i64 0, i64 0 - store %variant %184, %variant* %185, align 16 - %186 = bitcast i32* %x126 to i8* - %187 = insertvalue %variant undef, i8* %186, 0 - %188 = insertvalue %variant %187, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %189 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots128, i64 0, i64 1 - store %variant %188, %variant* %189, align 16 - %190 = bitcast [2 x %variant]* %varargslots128 to %variant* - %191 = insertvalue %"variant[]" undef, %variant* %190, 0 - %192 = insertvalue %"variant[]" %191, i64 2, 1 - store %"variant[]" %192, %"variant[]"* %taddr129, align 8 - %193 = bitcast %"variant[]"* %taddr129 to { i8*, i64 }* - %194 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %193, i32 0, i32 0 - %lo130 = load i8*, i8** %194, align 8 - %195 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %193, i32 0, i32 1 - %hi131 = load i64, i64* %195, align 8 - %196 = call i64 @std_io_printfln(i64* %retparam127, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.16, i32 0, i32 0), i64 8, i8* %lo130, i64 %hi131) - %not_err132 = icmp eq i64 %196, 0 - br i1 %not_err132, label %after_check133, label %voiderr134 +loop.body103: ; preds = %loop.cond101 + %105 = load i64, ptr %.anon100, align 8 + store i64 %105, ptr %i104, align 8 + %106 = load i64, ptr %.anon100, align 8 + %107 = getelementptr inbounds [8 x i32], ptr %a99, i64 0, i64 %106 + %108 = load i32, ptr %107, align 4 + store i32 %108, ptr %x105, align 4 + %109 = insertvalue %variant undef, ptr %i104, 0 + %110 = insertvalue %variant %109, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %111 = getelementptr inbounds [2 x %variant], ptr %varargslots107, i64 0, i64 0 + store %variant %110, ptr %111, align 16 + %112 = insertvalue %variant undef, ptr %x105, 0 + %113 = insertvalue %variant %112, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %114 = getelementptr inbounds [2 x %variant], ptr %varargslots107, i64 0, i64 1 + store %variant %113, ptr %114, align 16 + %115 = call i64 @std_io_printfn(ptr %retparam106, ptr @.str.16, i64 8, ptr %varargslots107, i64 2) + %not_err108 = icmp eq i64 %115, 0 + br i1 %not_err108, label %after_check109, label %voiderr110 -after_check133: ; preds = %loop.body124 - br label %voiderr134 +after_check109: ; preds = %loop.body103 + br label %voiderr110 -voiderr134: ; preds = %after_check133, %loop.body124 - %197 = load i64, i64* %.anon121, align 8 - %add135 = add i64 %197, 1 - store i64 %add135, i64* %.anon121, align 8 - br label %loop.cond122 +voiderr110: ; preds = %after_check109, %loop.body103 + %116 = load i64, ptr %.anon100, align 8 + %add111 = add i64 %116, 1 + store i64 %add111, ptr %.anon100, align 8 + br label %loop.cond101 -loop.exit136: ; preds = %loop.cond122 - %198 = bitcast [7 x i32]* %b to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %198, i8* align 16 bitcast ([7 x i32]* @.__const.17 to i8*), i32 28, i1 false) - store i64 0, i64* %.anon137, align 8 - br label %loop.cond138 +loop.exit112: ; preds = %loop.cond101 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %b, ptr align 16 @.__const.17, i32 28, i1 false) + store i64 0, ptr %.anon113, align 8 + br label %loop.cond114 -loop.cond138: ; preds = %voiderr150, %loop.exit136 - %199 = load i64, i64* %.anon137, align 8 - %gt139 = icmp ugt i64 7, %199 - br i1 %gt139, label %loop.body140, label %loop.exit152 +loop.cond114: ; preds = %voiderr123, %loop.exit112 + %117 = load i64, ptr %.anon113, align 8 + %gt115 = icmp ugt i64 7, %117 + br i1 %gt115, label %loop.body116, label %loop.exit125 -loop.body140: ; preds = %loop.cond138 - %200 = load i64, i64* %.anon137, align 8 - store i64 %200, i64* %i141, align 8 - %201 = load i64, i64* %.anon137, align 8 - %202 = getelementptr inbounds [7 x i32], [7 x i32]* %b, i64 0, i64 %201 - %203 = load i32, i32* %202, align 4 - store i32 %203, i32* %x142, align 4 - %204 = bitcast i64* %i141 to i8* - %205 = insertvalue %variant undef, i8* %204, 0 - %206 = insertvalue %variant %205, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %207 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots144, i64 0, i64 0 - store %variant %206, %variant* %207, align 16 - %208 = bitcast i32* %x142 to i8* - %209 = insertvalue %variant undef, i8* %208, 0 - %210 = insertvalue %variant %209, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %211 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots144, i64 0, i64 1 - store %variant %210, %variant* %211, align 16 - %212 = bitcast [2 x %variant]* %varargslots144 to %variant* - %213 = insertvalue %"variant[]" undef, %variant* %212, 0 - %214 = insertvalue %"variant[]" %213, i64 2, 1 - store %"variant[]" %214, %"variant[]"* %taddr145, align 8 - %215 = bitcast %"variant[]"* %taddr145 to { i8*, i64 }* - %216 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %215, i32 0, i32 0 - %lo146 = load i8*, i8** %216, align 8 - %217 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %215, i32 0, i32 1 - %hi147 = load i64, i64* %217, align 8 - %218 = call i64 @std_io_printfln(i64* %retparam143, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.18, i32 0, i32 0), i64 8, i8* %lo146, i64 %hi147) - %not_err148 = icmp eq i64 %218, 0 +loop.body116: ; preds = %loop.cond114 + %118 = load i64, ptr %.anon113, align 8 + store i64 %118, ptr %i117, align 8 + %119 = load i64, ptr %.anon113, align 8 + %120 = getelementptr inbounds [7 x i32], ptr %b, i64 0, i64 %119 + %121 = load i32, ptr %120, align 4 + store i32 %121, ptr %x118, align 4 + %122 = insertvalue %variant undef, ptr %i117, 0 + %123 = insertvalue %variant %122, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %124 = getelementptr inbounds [2 x %variant], ptr %varargslots120, i64 0, i64 0 + store %variant %123, ptr %124, align 16 + %125 = insertvalue %variant undef, ptr %x118, 0 + %126 = insertvalue %variant %125, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %127 = getelementptr inbounds [2 x %variant], ptr %varargslots120, i64 0, i64 1 + store %variant %126, ptr %127, align 16 + %128 = call i64 @std_io_printfn(ptr %retparam119, ptr @.str.18, i64 8, ptr %varargslots120, i64 2) + %not_err121 = icmp eq i64 %128, 0 + br i1 %not_err121, label %after_check122, label %voiderr123 + +after_check122: ; preds = %loop.body116 + br label %voiderr123 + +voiderr123: ; preds = %after_check122, %loop.body116 + %129 = load i64, ptr %.anon113, align 8 + %add124 = add i64 %129, 1 + store i64 %add124, ptr %.anon113, align 8 + br label %loop.cond114 + +loop.exit125: ; preds = %loop.cond114 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %c, ptr align 16 @.__const.19, i32 32, i1 false) + store i64 0, ptr %.anon126, align 8 + br label %loop.cond127 + +loop.cond127: ; preds = %voiderr136, %loop.exit125 + %130 = load i64, ptr %.anon126, align 8 + %gt128 = icmp ugt i64 8, %130 + br i1 %gt128, label %loop.body129, label %loop.exit138 + +loop.body129: ; preds = %loop.cond127 + %131 = load i64, ptr %.anon126, align 8 + store i64 %131, ptr %i130, align 8 + %132 = load i64, ptr %.anon126, align 8 + %133 = getelementptr inbounds [8 x i32], ptr %c, i64 0, i64 %132 + %134 = load i32, ptr %133, align 4 + store i32 %134, ptr %x131, align 4 + %135 = insertvalue %variant undef, ptr %i130, 0 + %136 = insertvalue %variant %135, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %137 = getelementptr inbounds [2 x %variant], ptr %varargslots133, i64 0, i64 0 + store %variant %136, ptr %137, align 16 + %138 = insertvalue %variant undef, ptr %x131, 0 + %139 = insertvalue %variant %138, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %140 = getelementptr inbounds [2 x %variant], ptr %varargslots133, i64 0, i64 1 + store %variant %139, ptr %140, align 16 + %141 = call i64 @std_io_printfn(ptr %retparam132, ptr @.str.20, i64 9, ptr %varargslots133, i64 2) + %not_err134 = icmp eq i64 %141, 0 + br i1 %not_err134, label %after_check135, label %voiderr136 + +after_check135: ; preds = %loop.body129 + br label %voiderr136 + +voiderr136: ; preds = %after_check135, %loop.body129 + %142 = load i64, ptr %.anon126, align 8 + %add137 = add i64 %142, 1 + store i64 %add137, ptr %.anon126, align 8 + br label %loop.cond127 + +loop.exit138: ; preds = %loop.cond127 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a139, ptr align 16 @.__const.21, i32 24, i1 false) + store i64 0, ptr %.anon140, align 8 + br label %loop.cond141 + +loop.cond141: ; preds = %voiderr150, %loop.exit138 + %143 = load i64, ptr %.anon140, align 8 + %gt142 = icmp ugt i64 6, %143 + br i1 %gt142, label %loop.body143, label %loop.exit152 + +loop.body143: ; preds = %loop.cond141 + %144 = load i64, ptr %.anon140, align 8 + store i64 %144, ptr %i144, align 8 + %145 = load i64, ptr %.anon140, align 8 + %146 = getelementptr inbounds [6 x i32], ptr %a139, i64 0, i64 %145 + %147 = load i32, ptr %146, align 4 + store i32 %147, ptr %x145, align 4 + %148 = insertvalue %variant undef, ptr %i144, 0 + %149 = insertvalue %variant %148, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 + %150 = getelementptr inbounds [2 x %variant], ptr %varargslots147, i64 0, i64 0 + store %variant %149, ptr %150, align 16 + %151 = insertvalue %variant undef, ptr %x145, 0 + %152 = insertvalue %variant %151, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %153 = getelementptr inbounds [2 x %variant], ptr %varargslots147, i64 0, i64 1 + store %variant %152, ptr %153, align 16 + %154 = call i64 @std_io_printfn(ptr %retparam146, ptr @.str.22, i64 6, ptr %varargslots147, i64 2) + %not_err148 = icmp eq i64 %154, 0 br i1 %not_err148, label %after_check149, label %voiderr150 -after_check149: ; preds = %loop.body140 +after_check149: ; preds = %loop.body143 br label %voiderr150 -voiderr150: ; preds = %after_check149, %loop.body140 - %219 = load i64, i64* %.anon137, align 8 - %add151 = add i64 %219, 1 - store i64 %add151, i64* %.anon137, align 8 - br label %loop.cond138 +voiderr150: ; preds = %after_check149, %loop.body143 + %155 = load i64, ptr %.anon140, align 8 + %add151 = add i64 %155, 1 + store i64 %add151, ptr %.anon140, align 8 + br label %loop.cond141 -loop.exit152: ; preds = %loop.cond138 - %220 = bitcast [8 x i32]* %c to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %220, i8* align 16 bitcast ([8 x i32]* @.__const.19 to i8*), i32 32, i1 false) - store i64 0, i64* %.anon153, align 8 - br label %loop.cond154 - -loop.cond154: ; preds = %voiderr166, %loop.exit152 - %221 = load i64, i64* %.anon153, align 8 - %gt155 = icmp ugt i64 8, %221 - br i1 %gt155, label %loop.body156, label %loop.exit168 - -loop.body156: ; preds = %loop.cond154 - %222 = load i64, i64* %.anon153, align 8 - store i64 %222, i64* %i157, align 8 - %223 = load i64, i64* %.anon153, align 8 - %224 = getelementptr inbounds [8 x i32], [8 x i32]* %c, i64 0, i64 %223 - %225 = load i32, i32* %224, align 4 - store i32 %225, i32* %x158, align 4 - %226 = bitcast i64* %i157 to i8* - %227 = insertvalue %variant undef, i8* %226, 0 - %228 = insertvalue %variant %227, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %229 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots160, i64 0, i64 0 - store %variant %228, %variant* %229, align 16 - %230 = bitcast i32* %x158 to i8* - %231 = insertvalue %variant undef, i8* %230, 0 - %232 = insertvalue %variant %231, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %233 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots160, i64 0, i64 1 - store %variant %232, %variant* %233, align 16 - %234 = bitcast [2 x %variant]* %varargslots160 to %variant* - %235 = insertvalue %"variant[]" undef, %variant* %234, 0 - %236 = insertvalue %"variant[]" %235, i64 2, 1 - store %"variant[]" %236, %"variant[]"* %taddr161, align 8 - %237 = bitcast %"variant[]"* %taddr161 to { i8*, i64 }* - %238 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %237, i32 0, i32 0 - %lo162 = load i8*, i8** %238, align 8 - %239 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %237, i32 0, i32 1 - %hi163 = load i64, i64* %239, align 8 - %240 = call i64 @std_io_printfln(i64* %retparam159, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.20, i32 0, i32 0), i64 9, i8* %lo162, i64 %hi163) - %not_err164 = icmp eq i64 %240, 0 - br i1 %not_err164, label %after_check165, label %voiderr166 - -after_check165: ; preds = %loop.body156 - br label %voiderr166 - -voiderr166: ; preds = %after_check165, %loop.body156 - %241 = load i64, i64* %.anon153, align 8 - %add167 = add i64 %241, 1 - store i64 %add167, i64* %.anon153, align 8 - br label %loop.cond154 - -loop.exit168: ; preds = %loop.cond154 - %242 = bitcast [6 x i32]* %a169 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %242, i8* align 16 bitcast ([6 x i32]* @.__const.21 to i8*), i32 24, i1 false) - store i64 0, i64* %.anon170, align 8 - br label %loop.cond171 - -loop.cond171: ; preds = %voiderr183, %loop.exit168 - %243 = load i64, i64* %.anon170, align 8 - %gt172 = icmp ugt i64 6, %243 - br i1 %gt172, label %loop.body173, label %loop.exit185 - -loop.body173: ; preds = %loop.cond171 - %244 = load i64, i64* %.anon170, align 8 - store i64 %244, i64* %i174, align 8 - %245 = load i64, i64* %.anon170, align 8 - %246 = getelementptr inbounds [6 x i32], [6 x i32]* %a169, i64 0, i64 %245 - %247 = load i32, i32* %246, align 4 - store i32 %247, i32* %x175, align 4 - %248 = bitcast i64* %i174 to i8* - %249 = insertvalue %variant undef, i8* %248, 0 - %250 = insertvalue %variant %249, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 - %251 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots177, i64 0, i64 0 - store %variant %250, %variant* %251, align 16 - %252 = bitcast i32* %x175 to i8* - %253 = insertvalue %variant undef, i8* %252, 0 - %254 = insertvalue %variant %253, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %255 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots177, i64 0, i64 1 - store %variant %254, %variant* %255, align 16 - %256 = bitcast [2 x %variant]* %varargslots177 to %variant* - %257 = insertvalue %"variant[]" undef, %variant* %256, 0 - %258 = insertvalue %"variant[]" %257, i64 2, 1 - store %"variant[]" %258, %"variant[]"* %taddr178, align 8 - %259 = bitcast %"variant[]"* %taddr178 to { i8*, i64 }* - %260 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %259, i32 0, i32 0 - %lo179 = load i8*, i8** %260, align 8 - %261 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %259, i32 0, i32 1 - %hi180 = load i64, i64* %261, align 8 - %262 = call i64 @std_io_printfln(i64* %retparam176, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.22, i32 0, i32 0), i64 6, i8* %lo179, i64 %hi180) - %not_err181 = icmp eq i64 %262, 0 - br i1 %not_err181, label %after_check182, label %voiderr183 - -after_check182: ; preds = %loop.body173 - br label %voiderr183 - -voiderr183: ; preds = %after_check182, %loop.body173 - %263 = load i64, i64* %.anon170, align 8 - %add184 = add i64 %263, 1 - store i64 %add184, i64* %.anon170, align 8 - br label %loop.cond171 - -loop.exit185: ; preds = %loop.cond171 +loop.exit152: ; preds = %loop.cond141 ret void } - diff --git a/test/test_suite/macros/macro_with_body.c3t b/test/test_suite/macros/macro_with_body.c3t index d15233bc8..ba165e9da 100644 --- a/test/test_suite/macros/macro_with_body.c3t +++ b/test/test_suite/macros/macro_with_body.c3t @@ -45,13 +45,13 @@ fn void main() /* #expect: withbody.ll -define i32 @withbody_Foo_mutate(%Foo* %0) #0 { +define i32 @withbody_Foo_mutate(ptr %0) #0 { entry: - %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0)) - %2 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 0 - %3 = load i32, i32* %2, align 8 + %1 = call i32 (ptr, ...) @printf(ptr @.str.2) + %2 = getelementptr inbounds %Foo, ptr %0, i32 0, i32 0 + %3 = load i32, ptr %2, align 8 %add = add i32 %3, 1 - store i32 %add, i32* %2, align 8 + store i32 %add, ptr %2, align 8 %mul = mul i32 10, %add ret i32 %mul } @@ -66,41 +66,38 @@ entry: %times = alloca i32, align 4 %i = alloca i32, align 4 %loop = alloca i32, align 4 - %0 = bitcast %Foo* %f to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 4, i1 false) - store i32 0, i32* %y, align 4 - %1 = bitcast %Foo* %foo to i8* - %2 = bitcast %Foo* %f to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 4, i1 false) - %3 = getelementptr inbounds %Foo, %Foo* %foo, i32 0, i32 0 - %4 = load i32, i32* %3, align 4 - store i32 %4, i32* %y, align 4 - %5 = call i32 @withbody_Foo_mutate(%Foo* %foo) - store i32 %5, i32* %x, align 4 - %6 = load i32, i32* %y, align 4 - store i32 %6, i32* %dy, align 4 - %7 = load i32, i32* %x, align 4 - %8 = load i32, i32* %dy, align 4 - %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i32 %7, i32 %8) - store i32 10, i32* %times, align 4 - store i32 0, i32* %i, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %f, ptr align 4 @.__const, i32 4, i1 false) + store i32 0, ptr %y, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 %f, i32 4, i1 false) + %0 = getelementptr inbounds %Foo, ptr %foo, i32 0, i32 0 + %1 = load i32, ptr %0, align 4 + store i32 %1, ptr %y, align 4 + %2 = call i32 @withbody_Foo_mutate(ptr %foo) + store i32 %2, ptr %x, align 4 + %3 = load i32, ptr %y, align 4 + store i32 %3, ptr %dy, align 4 + %4 = load i32, ptr %x, align 4 + %5 = load i32, ptr %dy, align 4 + %6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %4, i32 %5) + store i32 10, ptr %times, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %10 = load i32, i32* %i, align 4 - %11 = load i32, i32* %times, align 4 - %lt = icmp slt i32 %10, %11 + %7 = load i32, ptr %i, align 4 + %8 = load i32, ptr %times, align 4 + %lt = icmp slt i32 %7, %8 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %12 = load i32, i32* %i, align 4 - %add = add i32 %12, 1 - store i32 %add, i32* %loop, align 4 - %13 = load i32, i32* %loop, align 4 - %14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %13) - %15 = load i32, i32* %i, align 4 - %add1 = add i32 %15, 1 - store i32 %add1, i32* %i, align 4 + %9 = load i32, ptr %i, align 4 + %add = add i32 %9, 1 + store i32 %add, ptr %loop, align 4 + %10 = load i32, ptr %loop, align 4 + %11 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %10) + %12 = load i32, ptr %i, align 4 + %add1 = add i32 %12, 1 + store i32 %add1, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond diff --git a/test/test_suite/macros/type_params.c3t b/test/test_suite/macros/type_params.c3t index d364460be..1430897b6 100644 --- a/test/test_suite/macros/type_params.c3t +++ b/test/test_suite/macros/type_params.c3t @@ -26,17 +26,17 @@ fn void test() %a2 = alloca double, align 8 %z = alloca i16, align 2 %a3 = alloca i16, align 2 - store i32 0, i32* %a, align 4 - %0 = load i32, i32* %a, align 4 - store i32 %0, i32* %x, align 4 - store double 0.000000e+00, double* %a1, align 8 - %1 = load double, double* %a1, align 8 - store double %1, double* %d, align 8 - store double 0.000000e+00, double* %a2, align 8 - %2 = load double, double* %a2, align 8 - store double %2, double* %d2, align 8 - store i16 0, i16* %a3, align 2 - %3 = load i16, i16* %a3, align 2 - store i16 %3, i16* %z, align 2 + store i32 0, ptr %a, align 4 + %0 = load i32, ptr %a, align 4 + store i32 %0, ptr %x, align 4 + store double 0.000000e+00, ptr %a1, align 8 + %1 = load double, ptr %a1, align 8 + store double %1, ptr %d, align 8 + store double 0.000000e+00, ptr %a2, align 8 + %2 = load double, ptr %a2, align 8 + store double %2, ptr %d2, align 8 + store i16 0, ptr %a3, align 2 + %3 = load i16, ptr %a3, align 2 + store i16 %3, ptr %z, align 2 ret void } diff --git a/test/test_suite/macros/userland_bitcast.c3t b/test/test_suite/macros/userland_bitcast.c3t index 9816bbfc8..bc1d944fe 100644 --- a/test/test_suite/macros/userland_bitcast.c3t +++ b/test/test_suite/macros/userland_bitcast.c3t @@ -87,258 +87,244 @@ entry: %z = alloca %Foo, align 2 %expr = alloca %Foo, align 2 %x = alloca i64, align 8 - %b = alloca i16*, align 8 - %to = alloca i16*, align 8 + %b = alloca ptr, align 8 + %to = alloca ptr, align 8 %i = alloca i64, align 8 - %1 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0 - store i16 0, i16* %1, align 2 - %2 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 1 - store i8 0, i8* %2, align 2 - %3 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 2 - store i8 0, i8* %3, align 1 - %4 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 3 - store i16 0, i16* %4, align 2 - %5 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 4 - store i16 0, i16* %5, align 2 - %6 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0 - store i16 %0, i16* %6, align 2 - %7 = bitcast %Foo* %expr to i8* - %8 = bitcast %Foo* %z to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %7, i8* align 2 %8, i32 8, i1 false) - %ptrptr = bitcast %Foo* %expr to i16* - store i16* %ptrptr, i16** %b, align 8 - %ptrptr1 = bitcast i64* %x to i16* - store i16* %ptrptr1, i16** %to, align 8 - store i64 0, i64* %i, align 8 + %1 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 0 + store i16 0, ptr %1, align 2 + %2 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 1 + store i8 0, ptr %2, align 2 + %3 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 2 + store i8 0, ptr %3, align 1 + %4 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 3 + store i16 0, ptr %4, align 2 + %5 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 4 + store i16 0, ptr %5, align 2 + %6 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 0 + store i16 %0, ptr %6, align 2 + call void @llvm.memcpy.p0.p0.i32(ptr align 2 %expr, ptr align 2 %z, i32 8, i1 false) + store ptr %expr, ptr %b, align 8 + store ptr %x, ptr %to, align 8 + store i64 0, ptr %i, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %9 = load i64, i64* %i, align 8 - %lt = icmp ult i64 %9, 8 + %7 = load i64, ptr %i, align 8 + %lt = icmp ult i64 %7, 8 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %10 = load i16*, i16** %to, align 8 - %11 = load i64, i64* %i, align 8 - %ptroffset = getelementptr inbounds i16, i16* %10, i64 %11 - %12 = load i16*, i16** %b, align 8 - %13 = load i64, i64* %i, align 8 - %ptroffset2 = getelementptr inbounds i16, i16* %12, i64 %13 - %14 = load i16, i16* %ptroffset2, align 2 - store i16 %14, i16* %ptroffset, align 2 - %15 = load i64, i64* %i, align 8 - %add = add i64 %15, 2 - store i64 %add, i64* %i, align 8 + %8 = load ptr, ptr %to, align 8 + %9 = load i64, ptr %i, align 8 + %ptroffset = getelementptr inbounds i16, ptr %8, i64 %9 + %10 = load ptr, ptr %b, align 8 + %11 = load i64, ptr %i, align 8 + %ptroffset1 = getelementptr inbounds i16, ptr %10, i64 %11 + %12 = load i16, ptr %ptroffset1, align 2 + store i16 %12, ptr %ptroffset, align 2 + %13 = load i64, ptr %i, align 8 + %add = add i64 %13, 2 + store i64 %add, ptr %i, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %16 = load i64, i64* %x, align 8 - ret i64 %16 + %14 = load i64, ptr %x, align 8 + ret i64 %14 } -; Function Attrs: nounwind define i32 @userland_bitcast_test(float %0) #0 { entry: %expr = alloca float, align 4 %x = alloca [4 x i8], align 1 - %b = alloca i8*, align 8 - %to = alloca i8*, align 8 + %b = alloca ptr, align 8 + %to = alloca ptr, align 8 %i = alloca i64, align 8 - store float %0, float* %expr, align 4 - %ptrptr = bitcast float* %expr to i8* - store i8* %ptrptr, i8** %b, align 8 - %ptrptr1 = bitcast [4 x i8]* %x to i8* - store i8* %ptrptr1, i8** %to, align 8 - store i64 0, i64* %i, align 8 + store float %0, ptr %expr, align 4 + store ptr %expr, ptr %b, align 8 + store ptr %x, ptr %to, align 8 + store i64 0, ptr %i, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %1 = load i64, i64* %i, align 8 + %1 = load i64, ptr %i, align 8 %lt = icmp ult i64 %1, 4 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %2 = load i8*, i8** %to, align 8 - %3 = load i64, i64* %i, align 8 - %ptroffset = getelementptr inbounds i8, i8* %2, i64 %3 - %4 = load i8*, i8** %b, align 8 - %5 = load i64, i64* %i, align 8 - %ptroffset2 = getelementptr inbounds i8, i8* %4, i64 %5 - %6 = load i8, i8* %ptroffset2, align 1 - store i8 %6, i8* %ptroffset, align 1 - %7 = load i64, i64* %i, align 8 + %2 = load ptr, ptr %to, align 8 + %3 = load i64, ptr %i, align 8 + %ptroffset = getelementptr inbounds i8, ptr %2, i64 %3 + %4 = load ptr, ptr %b, align 8 + %5 = load i64, ptr %i, align 8 + %ptroffset1 = getelementptr inbounds i8, ptr %4, i64 %5 + %6 = load i8, ptr %ptroffset1, align 1 + store i8 %6, ptr %ptroffset, align 1 + %7 = load i64, ptr %i, align 8 %add = add i64 %7, 1 - store i64 %add, i64* %i, align 8 + store i64 %add, ptr %i, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %8 = bitcast [4 x i8]* %x to i32* - %9 = load i32, i32* %8, align 1 - ret i32 %9 + %8 = load i32, ptr %x, align 1 + ret i32 %8 } -; Function Attrs: nounwind define void @userland_bitcast_main() #0 { entry: %f = alloca float, align 4 %i = alloca i32, align 4 %expr = alloca float, align 4 %x = alloca i32, align 4 - %b = alloca i32*, align 8 - %to = alloca i32*, align 8 + %b = alloca ptr, align 8 + %to = alloca ptr, align 8 %i1 = alloca i64, align 8 %f2 = alloca float, align 4 %expr3 = alloca i32, align 4 %x4 = alloca float, align 4 - %b5 = alloca i32*, align 8 - %to6 = alloca i32*, align 8 - %i8 = alloca i64, align 8 + %b5 = alloca ptr, align 8 + %to6 = alloca ptr, align 8 + %i7 = alloca i64, align 8 %d = alloca double, align 8 %l = alloca i64, align 8 - %expr17 = alloca double, align 8 - %x18 = alloca i64, align 8 - %b19 = alloca i64*, align 8 - %to21 = alloca i64*, align 8 - %i22 = alloca i64, align 8 + %expr16 = alloca double, align 8 + %x17 = alloca i64, align 8 + %b18 = alloca ptr, align 8 + %to19 = alloca ptr, align 8 + %i20 = alloca i64, align 8 %d2 = alloca double, align 8 - %expr30 = alloca double, align 8 - %x31 = alloca double, align 8 - %b32 = alloca i64*, align 8 - %to34 = alloca i64*, align 8 - %i36 = alloca i64, align 8 - store float 0x4028B4BC60000000, float* %f, align 4 - %0 = load float, float* %f, align 4 - store float %0, float* %expr, align 4 - %ptrptr = bitcast float* %expr to i32* - store i32* %ptrptr, i32** %b, align 8 - store i32* %x, i32** %to, align 8 - store i64 0, i64* %i1, align 8 + %expr28 = alloca double, align 8 + %x29 = alloca double, align 8 + %b30 = alloca ptr, align 8 + %to31 = alloca ptr, align 8 + %i32 = alloca i64, align 8 + store float 0x4028B4BC60000000, ptr %f, align 4 + %0 = load float, ptr %f, align 4 + store float %0, ptr %expr, align 4 + store ptr %expr, ptr %b, align 8 + store ptr %x, ptr %to, align 8 + store i64 0, ptr %i1, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %1 = load i64, i64* %i1, align 8 + %1 = load i64, ptr %i1, align 8 %lt = icmp ult i64 %1, 4 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %2 = load i32*, i32** %to, align 8 - %3 = load i64, i64* %i1, align 8 - %ptroffset = getelementptr inbounds i32, i32* %2, i64 %3 - %4 = load i32*, i32** %b, align 8 - %5 = load i64, i64* %i1, align 8 - %ptroffset2 = getelementptr inbounds i32, i32* %4, i64 %5 - %6 = load i32, i32* %ptroffset2, align 4 - store i32 %6, i32* %ptroffset, align 4 - %7 = load i64, i64* %i1, align 8 + %2 = load ptr, ptr %to, align 8 + %3 = load i64, ptr %i1, align 8 + %ptroffset = getelementptr inbounds i32, ptr %2, i64 %3 + %4 = load ptr, ptr %b, align 8 + %5 = load i64, ptr %i1, align 8 + %ptroffset2 = getelementptr inbounds i32, ptr %4, i64 %5 + %6 = load i32, ptr %ptroffset2, align 4 + store i32 %6, ptr %ptroffset, align 4 + %7 = load i64, ptr %i1, align 8 %add = add i64 %7, 4 - store i64 %add, i64* %i1, align 8 + store i64 %add, ptr %i1, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %8 = load i32, i32* %x, align 4 - store i32 %8, i32* %i, align 4 - %9 = load i32, i32* %i, align 4 - store i32 %9, i32* %expr3, align 4 - store i32* %expr3, i32** %b5, align 8 - %ptrptr7 = bitcast float* %x4 to i32* - store i32* %ptrptr7, i32** %to6, align 8 - store i64 0, i64* %i8, align 8 - br label %loop.cond9 + %8 = load i32, ptr %x, align 4 + store i32 %8, ptr %i, align 4 + %9 = load i32, ptr %i, align 4 + store i32 %9, ptr %expr3, align 4 + store ptr %expr3, ptr %b5, align 8 + store ptr %x4, ptr %to6, align 8 + store i64 0, ptr %i7, align 8 + br label %loop.cond8 -loop.cond9: ; preds = %loop.body11, %loop.exit - %10 = load i64, i64* %i8, align 8 - %lt10 = icmp ult i64 %10, 4 - br i1 %lt10, label %loop.body11, label %loop.exit15 +loop.cond8: ; preds = %loop.body10, %loop.exit + %10 = load i64, ptr %i7, align 8 + %lt9 = icmp ult i64 %10, 4 + br i1 %lt9, label %loop.body10, label %loop.exit14 -loop.body11: ; preds = %loop.cond9 - %11 = load i32*, i32** %to6, align 8 - %12 = load i64, i64* %i8, align 8 - %ptroffset12 = getelementptr inbounds i32, i32* %11, i64 %12 - %13 = load i32*, i32** %b5, align 8 - %14 = load i64, i64* %i8, align 8 - %ptroffset13 = getelementptr inbounds i32, i32* %13, i64 %14 - %15 = load i32, i32* %ptroffset13, align 4 - store i32 %15, i32* %ptroffset12, align 4 - %16 = load i64, i64* %i8, align 8 - %add14 = add i64 %16, 4 - store i64 %add14, i64* %i8, align 8 - br label %loop.cond9 +loop.body10: ; preds = %loop.cond8 + %11 = load ptr, ptr %to6, align 8 + %12 = load i64, ptr %i7, align 8 + %ptroffset11 = getelementptr inbounds i32, ptr %11, i64 %12 + %13 = load ptr, ptr %b5, align 8 + %14 = load i64, ptr %i7, align 8 + %ptroffset12 = getelementptr inbounds i32, ptr %13, i64 %14 + %15 = load i32, ptr %ptroffset12, align 4 + store i32 %15, ptr %ptroffset11, align 4 + %16 = load i64, ptr %i7, align 8 + %add13 = add i64 %16, 4 + store i64 %add13, ptr %i7, align 8 + br label %loop.cond8 -loop.exit15: ; preds = %loop.cond9 - %17 = load float, float* %x4, align 4 - store float %17, float* %f2, align 4 - %18 = load float, float* %f, align 4 +loop.exit14: ; preds = %loop.cond8 + %17 = load float, ptr %x4, align 4 + store float %17, ptr %f2, align 4 + %18 = load float, ptr %f, align 4 %fpfpext = fpext float %18 to double - %19 = load i32, i32* %i, align 4 - %20 = load float, float* %f2, align 4 - %fpfpext16 = fpext float %20 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i32 0, i32 0), double %fpfpext, i32 %19, double %fpfpext16) - store double 1.235300e+268, double* %d, align 8 - %21 = load double, double* %d, align 8 - store double %21, double* %expr17, align 8 - %ptrptr20 = bitcast double* %expr17 to i64* - store i64* %ptrptr20, i64** %b19, align 8 - store i64* %x18, i64** %to21, align 8 - store i64 0, i64* %i22, align 8 - br label %loop.cond23 + %19 = load i32, ptr %i, align 4 + %20 = load float, ptr %f2, align 4 + %fpfpext15 = fpext float %20 to double + call void (ptr, ...) @printf(ptr @.str, double %fpfpext, i32 %19, double %fpfpext15) + store double 1.235300e+268, ptr %d, align 8 + %21 = load double, ptr %d, align 8 + store double %21, ptr %expr16, align 8 + store ptr %expr16, ptr %b18, align 8 + store ptr %x17, ptr %to19, align 8 + store i64 0, ptr %i20, align 8 + br label %loop.cond21 -loop.cond23: ; preds = %loop.body25, %loop.exit15 - %22 = load i64, i64* %i22, align 8 - %lt24 = icmp ult i64 %22, 8 - br i1 %lt24, label %loop.body25, label %loop.exit29 +loop.cond21: ; preds = %loop.body23, %loop.exit14 + %22 = load i64, ptr %i20, align 8 + %lt22 = icmp ult i64 %22, 8 + br i1 %lt22, label %loop.body23, label %loop.exit27 -loop.body25: ; preds = %loop.cond23 - %23 = load i64*, i64** %to21, align 8 - %24 = load i64, i64* %i22, align 8 - %ptroffset26 = getelementptr inbounds i64, i64* %23, i64 %24 - %25 = load i64*, i64** %b19, align 8 - %26 = load i64, i64* %i22, align 8 - %ptroffset27 = getelementptr inbounds i64, i64* %25, i64 %26 - %27 = load i64, i64* %ptroffset27, align 8 - store i64 %27, i64* %ptroffset26, align 8 - %28 = load i64, i64* %i22, align 8 - %add28 = add i64 %28, 8 - store i64 %add28, i64* %i22, align 8 - br label %loop.cond23 +loop.body23: ; preds = %loop.cond21 + %23 = load ptr, ptr %to19, align 8 + %24 = load i64, ptr %i20, align 8 + %ptroffset24 = getelementptr inbounds i64, ptr %23, i64 %24 + %25 = load ptr, ptr %b18, align 8 + %26 = load i64, ptr %i20, align 8 + %ptroffset25 = getelementptr inbounds i64, ptr %25, i64 %26 + %27 = load i64, ptr %ptroffset25, align 8 + store i64 %27, ptr %ptroffset24, align 8 + %28 = load i64, ptr %i20, align 8 + %add26 = add i64 %28, 8 + store i64 %add26, ptr %i20, align 8 + br label %loop.cond21 -loop.exit29: ; preds = %loop.cond23 - %29 = load i64, i64* %x18, align 8 - store i64 %29, i64* %l, align 8 - %30 = load double, double* %d, align 8 - store double %30, double* %expr30, align 8 - %ptrptr33 = bitcast double* %expr30 to i64* - store i64* %ptrptr33, i64** %b32, align 8 - %ptrptr35 = bitcast double* %x31 to i64* - store i64* %ptrptr35, i64** %to34, align 8 - store i64 0, i64* %i36, align 8 - br label %loop.cond37 +loop.exit27: ; preds = %loop.cond21 + %29 = load i64, ptr %x17, align 8 + store i64 %29, ptr %l, align 8 + %30 = load double, ptr %d, align 8 + store double %30, ptr %expr28, align 8 + store ptr %expr28, ptr %b30, align 8 + store ptr %x29, ptr %to31, align 8 + store i64 0, ptr %i32, align 8 + br label %loop.cond33 -loop.cond37: ; preds = %loop.body39, %loop.exit29 - %31 = load i64, i64* %i36, align 8 - %lt38 = icmp ult i64 %31, 8 - br i1 %lt38, label %loop.body39, label %loop.exit43 +loop.cond33: ; preds = %loop.body35, %loop.exit27 + %31 = load i64, ptr %i32, align 8 + %lt34 = icmp ult i64 %31, 8 + br i1 %lt34, label %loop.body35, label %loop.exit39 -loop.body39: ; preds = %loop.cond37 - %32 = load i64*, i64** %to34, align 8 - %33 = load i64, i64* %i36, align 8 - %ptroffset40 = getelementptr inbounds i64, i64* %32, i64 %33 - %34 = load i64*, i64** %b32, align 8 - %35 = load i64, i64* %i36, align 8 - %ptroffset41 = getelementptr inbounds i64, i64* %34, i64 %35 - %36 = load i64, i64* %ptroffset41, align 8 - store i64 %36, i64* %ptroffset40, align 8 - %37 = load i64, i64* %i36, align 8 - %add42 = add i64 %37, 8 - store i64 %add42, i64* %i36, align 8 - br label %loop.cond37 +loop.body35: ; preds = %loop.cond33 + %32 = load ptr, ptr %to31, align 8 + %33 = load i64, ptr %i32, align 8 + %ptroffset36 = getelementptr inbounds i64, ptr %32, i64 %33 + %34 = load ptr, ptr %b30, align 8 + %35 = load i64, ptr %i32, align 8 + %ptroffset37 = getelementptr inbounds i64, ptr %34, i64 %35 + %36 = load i64, ptr %ptroffset37, align 8 + store i64 %36, ptr %ptroffset36, align 8 + %37 = load i64, ptr %i32, align 8 + %add38 = add i64 %37, 8 + store i64 %add38, ptr %i32, align 8 + br label %loop.cond33 -loop.exit43: ; preds = %loop.cond37 - %38 = load double, double* %x31, align 8 - store double %38, double* %d2, align 8 - %39 = load double, double* %d, align 8 - %40 = load i64, i64* %l, align 8 - %41 = load double, double* %d2, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i32 0, i32 0), double %39, i64 %40, double %41) +loop.exit39: ; preds = %loop.cond33 + %38 = load double, ptr %x29, align 8 + store double %38, ptr %d2, align 8 + %39 = load double, ptr %d, align 8 + %40 = load i64, ptr %l, align 8 + %41 = load double, ptr %d2, align 8 + call void (ptr, ...) @printf(ptr @.str.1, double %39, i64 %40, double %41) ret void } diff --git a/test/test_suite/methods/enum_distinct_err_methods.c3t b/test/test_suite/methods/enum_distinct_err_methods.c3t index fa30379b2..dd1127d7d 100644 --- a/test/test_suite/methods/enum_distinct_err_methods.c3t +++ b/test/test_suite/methods/enum_distinct_err_methods.c3t @@ -43,21 +43,21 @@ fn int main() /* #expect: foo.ll -define void @foo_Foo_hello(i64* %0) #0 { +define void @foo_Foo_hello(ptr %0) #0 { entry: - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0)) #1 + %1 = call i32 @std_io_println(ptr @.str) #1 ret void } -define void @foo_Bar_hello(i32* %0) #0 { +define void @foo_Bar_hello(ptr %0) #0 { entry: - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0)) #1 + %1 = call i32 @std_io_println(ptr @.str.1) #1 ret void } -define void @foo_MyEnum_hello(i32* %0) #0 { +define void @foo_MyEnum_hello(ptr %0) #0 { entry: - %1 = call i32 @std_io_println(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.2, i32 0, i32 0)) #1 + %1 = call i32 @std_io_println(ptr @.str.2) #1 ret void } @@ -66,11 +66,11 @@ entry: %f = alloca i64, align 8 %b = alloca i32, align 4 %a = alloca i32, align 4 - store i64 0, i64* %f, align 8 - store i32 0, i32* %b, align 4 - store i32 0, i32* %a, align 4 - call void @foo_Foo_hello(i64* %f) - call void @foo_Bar_hello(i32* %b) - call void @foo_MyEnum_hello(i32* %a) + store i64 0, ptr %f, align 8 + store i32 0, ptr %b, align 4 + store i32 0, ptr %a, align 4 + call void @foo_Foo_hello(ptr %f) + call void @foo_Bar_hello(ptr %b) + call void @foo_MyEnum_hello(ptr %a) ret i32 0 } diff --git a/test/test_suite/methods/extension_method.c3t b/test/test_suite/methods/extension_method.c3t index c1a3a9a02..4e795cbc1 100644 --- a/test/test_suite/methods/extension_method.c3t +++ b/test/test_suite/methods/extension_method.c3t @@ -25,15 +25,16 @@ fn int main() return 0; } -// #expect: abc.ll +/* #expect: abc.ll +%Bar = type { i32 } -define i32 @main() +define i32 @main() #0 { entry: %bar = alloca %Bar, align 4 - %0 = bitcast %Bar* %bar to i32* - store i32 0, i32* %0, align 4 - call void @foo_Bar_test(%Bar* %bar) + store i32 0, ptr %bar, align 4 + call void @foo_Bar_test(ptr %bar) ret i32 0 +} -declare void @foo_Bar_test(%Bar*) +declare void @foo_Bar_test(ptr) diff --git a/test/test_suite/methods/extension_method_in_other_modules.c3t b/test/test_suite/methods/extension_method_in_other_modules.c3t index 771549b60..d890ade5f 100644 --- a/test/test_suite/methods/extension_method_in_other_modules.c3t +++ b/test/test_suite/methods/extension_method_in_other_modules.c3t @@ -20,14 +20,14 @@ fn void main() /* #expect: foob.ll -define void @foob_Foo_test(%Foo* %0) #0 { +define void @foob_Foo_test(ptr %0) #0 { entry: ret void } // #expect: baz.ll -define void @foob_Foo_test2(%Foo* %0, i32 %1) #0 { +define void @foob_Foo_test2(ptr %0, i32 %1) #0 { entry: ret void } @@ -35,9 +35,8 @@ entry: define void @baz_main() #0 { entry: %f = alloca %Foo, align 4 - %0 = bitcast %Foo* %f to i32* - store i32 0, i32* %0, align 4 - call void @foob_Foo_test(%Foo* %f) - call void @foob_Foo_test2(%Foo* %f, i32 123) + store i32 0, ptr %f, align 4 + call void @foob_Foo_test(ptr %f) + call void @foob_Foo_test2(ptr %f, i32 123) ret void } diff --git a/test/test_suite/overloading/set_overload.c3t b/test/test_suite/overloading/set_overload.c3t index 88d086303..fa73fd475 100644 --- a/test/test_suite/overloading/set_overload.c3t +++ b/test/test_suite/overloading/set_overload.c3t @@ -17,9 +17,8 @@ fn void main() define void @test_main() #0 { entry: %map = alloca %HashMap, align 8 - %0 = bitcast %HashMap* %map to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 40, i1 false) - %1 = call i8 @"std_map$$sa$char.int_HashMap_set"(%HashMap* %map, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i32 4) - %2 = call i8 @"std_map$$sa$char.int_HashMap_set"(%HashMap* %map, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3, i32 5) + call void @llvm.memset.p0.i64(ptr align 8 %map, i8 0, i64 40, i1 false) + %0 = call i8 @"std_map$$sa$char.int_HashMap_set"(ptr %map, ptr @.str, i64 5, i32 4) + %1 = call i8 @"std_map$$sa$char.int_HashMap_set"(ptr %map, ptr @.str.1, i64 3, i32 5) ret void -} +} \ No newline at end of file diff --git a/test/test_suite/pointers/array_pointer_decay.c3t b/test/test_suite/pointers/array_pointer_decay.c3t index 377c1c4b3..2cf06ed23 100644 --- a/test/test_suite/pointers/array_pointer_decay.c3t +++ b/test/test_suite/pointers/array_pointer_decay.c3t @@ -18,67 +18,61 @@ fn void main() printf("%d = %d\n", x[1], z[1]); } + /* #expect: foo.ll define void @foo_main() #0 { entry: %x = alloca [3 x i32], align 4 - %y = alloca [3 x i32]*, align 8 - %z = alloca i32*, align 8 + %y = alloca ptr, align 8 + %z = alloca ptr, align 8 %sub = alloca %"int[]", align 8 %y1 = alloca [3 x i32], align 4 %z1 = alloca i32, align 4 - %xx = alloca i32*, align 8 - %yy = alloca [3 x i32]*, align 8 - %zz = alloca i32*, align 8 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 - store i32 0, i32* %2, align 4 - store [3 x i32]* %x, [3 x i32]** %y, align 8 - %3 = load [3 x i32]*, [3 x i32]** %y, align 8 - %ptrptr = bitcast [3 x i32]* %3 to i32* - store i32* %ptrptr, i32** %z, align 8 - %4 = load [3 x i32]*, [3 x i32]** %y, align 8 - %5 = bitcast [3 x i32]* %4 to i32* - %6 = insertvalue %"int[]" undef, i32* %5, 0 - %7 = insertvalue %"int[]" %6, i64 3, 1 - store %"int[]" %7, %"int[]"* %sub, align 8 - %8 = load [3 x i32]*, [3 x i32]** %y, align 8 - %ptroffset = getelementptr inbounds [3 x i32], [3 x i32]* %8, i64 1 - %9 = bitcast [3 x i32]* %y1 to i8* - %10 = bitcast [3 x i32]* %ptroffset to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 4 %10, i32 12, i1 false) - %11 = load i32*, i32** %z, align 8 - %ptroffset1 = getelementptr inbounds i32, i32* %11, i64 1 - %12 = load i32, i32* %ptroffset1, align 4 - store i32 %12, i32* %z1, align 4 - %ptrptr2 = bitcast [3 x i32]* %x to i32* - %ptroffset3 = getelementptr i32, i32* %ptrptr2, i64 1 - store i32* %ptroffset3, i32** %xx, align 8 - %13 = load i32*, i32** %xx, align 8 - %ptrptr4 = bitcast i32* %13 to [3 x i32]* - store [3 x i32]* %ptrptr4, [3 x i32]** %yy, align 8 - %14 = load [3 x i32]*, [3 x i32]** %yy, align 8 - %ptrptr5 = bitcast [3 x i32]* %14 to i32* - %ptroffset6 = getelementptr i32, i32* %ptrptr5, i64 -1 - store i32* %ptroffset6, i32** %zz, align 8 - %15 = load [3 x i32]*, [3 x i32]** %y, align 8 - %16 = load i32*, i32** %z, align 8 - %17 = load i32*, i32** %zz, align 8 - %18 = load [3 x i32]*, [3 x i32]** %y, align 8 - %19 = getelementptr inbounds [3 x i32], [3 x i32]* %18, i64 0, i64 1 - %20 = load i32*, i32** %xx, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0), [3 x i32]* %15, i32* %16, i32* %17, i32* %19, i32* %20) - %21 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - store i32 123, i32* %21, align 4 - %22 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - %23 = load i32, i32* %22, align 4 - %24 = load i32*, i32** %z, align 8 - %ptroffset7 = getelementptr inbounds i32, i32* %24, i64 1 - %25 = load i32, i32* %ptroffset7, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), i32 %23, i32 %25) + %xx = alloca ptr, align 8 + %yy = alloca ptr, align 8 + %zz = alloca ptr, align 8 + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 + store i32 0, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 + store i32 0, ptr %2, align 4 + store ptr %x, ptr %y, align 8 + %3 = load ptr, ptr %y, align 8 + store ptr %3, ptr %z, align 8 + %4 = load ptr, ptr %y, align 8 + %5 = insertvalue %"int[]" undef, ptr %4, 0 + %6 = insertvalue %"int[]" %5, i64 3, 1 + store %"int[]" %6, ptr %sub, align 8 + %7 = load ptr, ptr %y, align 8 + %ptroffset = getelementptr inbounds [3 x i32], ptr %7, i64 1 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y1, ptr align 4 %ptroffset, i32 12, i1 false) + %8 = load ptr, ptr %z, align 8 + %ptroffset1 = getelementptr inbounds i32, ptr %8, i64 1 + %9 = load i32, ptr %ptroffset1, align 4 + store i32 %9, ptr %z1, align 4 + %ptroffset2 = getelementptr i32, ptr %x, i64 1 + store ptr %ptroffset2, ptr %xx, align 8 + %10 = load ptr, ptr %xx, align 8 + store ptr %10, ptr %yy, align 8 + %11 = load ptr, ptr %yy, align 8 + %ptroffset3 = getelementptr i32, ptr %11, i64 -1 + store ptr %ptroffset3, ptr %zz, align 8 + %12 = load ptr, ptr %y, align 8 + %13 = load ptr, ptr %z, align 8 + %14 = load ptr, ptr %zz, align 8 + %15 = load ptr, ptr %y, align 8 + %16 = getelementptr inbounds [3 x i32], ptr %15, i64 0, i64 1 + %17 = load ptr, ptr %xx, align 8 + call void (ptr, ...) @printf(ptr @.str, ptr %12, ptr %13, ptr %14, ptr %16, ptr %17) + %18 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + store i32 123, ptr %18, align 4 + %19 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + %20 = load i32, ptr %19, align 4 + %21 = load ptr, ptr %z, align 8 + %ptroffset4 = getelementptr inbounds i32, ptr %21, i64 1 + %22 = load i32, ptr %ptroffset4, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %20, i32 %22) ret void } \ No newline at end of file diff --git a/test/test_suite/pointers/const_pointer.c3t b/test/test_suite/pointers/const_pointer.c3t index 3bbc0fa69..b8feacb81 100644 --- a/test/test_suite/pointers/const_pointer.c3t +++ b/test/test_suite/pointers/const_pointer.c3t @@ -13,4 +13,4 @@ private void*[3] data = { &foo, &bar, &xx }; @const_pointer_foo = protected global double 1.700000e+01, align 8 @const_pointer_bar = protected global double 1.200000e+01, align 8 @const_pointer_xx = protected global float 1.200000e+01, align 4 -@const_pointer_data = protected unnamed_addr global [3 x i8*] [i8* bitcast (double* @const_pointer_foo to i8*), i8* bitcast (double* @const_pointer_bar to i8*), i8* bitcast (float* @const_pointer_xx to i8*)], align 16 +@const_pointer_data = protected unnamed_addr global [3 x ptr] [ptr @const_pointer_foo, ptr @const_pointer_bar, ptr @const_pointer_xx], align 16 diff --git a/test/test_suite/pointers/pointer_index.c3t b/test/test_suite/pointers/pointer_index.c3t index 13b7aa314..53d8e973a 100644 --- a/test/test_suite/pointers/pointer_index.c3t +++ b/test/test_suite/pointers/pointer_index.c3t @@ -24,55 +24,55 @@ fn void test3(long* x) // #expect: pointer_index.ll -define void @pointer_index_test1(i32* %0) #0 { +define void @pointer_index_test1(ptr %0) #0 { entry: %a = alloca i32, align 4 %b = alloca i32, align 4 %c = alloca i32, align 4 %d = alloca i32, align 4 - %ptroffset = getelementptr inbounds i32, i32* %0, i64 0 - %1 = load i32, i32* %ptroffset, align 4 - store i32 %1, i32* %a, align 4 - %2 = load i32, i32* %0, align 8 - store i32 %2, i32* %b, align 4 - %ptroffset1 = getelementptr inbounds i32, i32* %0, i64 1 - %3 = load i32, i32* %ptroffset1, align 4 - store i32 %3, i32* %c, align 4 - %ptroffset2 = getelementptr inbounds i32, i32* %0, i64 -1 - %4 = load i32, i32* %ptroffset2, align 4 - store i32 %4, i32* %d, align 4 + %ptroffset = getelementptr inbounds i32, ptr %0, i64 0 + %1 = load i32, ptr %ptroffset, align 4 + store i32 %1, ptr %a, align 4 + %2 = load i32, ptr %0, align 8 + store i32 %2, ptr %b, align 4 + %ptroffset1 = getelementptr inbounds i32, ptr %0, i64 1 + %3 = load i32, ptr %ptroffset1, align 4 + store i32 %3, ptr %c, align 4 + %ptroffset2 = getelementptr inbounds i32, ptr %0, i64 -1 + %4 = load i32, ptr %ptroffset2, align 4 + store i32 %4, ptr %d, align 4 ret void } ; Function Attrs: nounwind -define void @pointer_index_test2(i8* %0) #0 { +define void @pointer_index_test2(ptr %0) #0 { entry: %a = alloca i8, align 1 %b = alloca i8, align 1 %c = alloca i8, align 1 - %ptroffset = getelementptr inbounds i8, i8* %0, i64 0 - %1 = load i8, i8* %ptroffset, align 1 - store i8 %1, i8* %a, align 1 - %2 = load i8, i8* %0, align 8 - store i8 %2, i8* %b, align 1 - %ptroffset1 = getelementptr inbounds i8, i8* %0, i64 1 - %3 = load i8, i8* %ptroffset1, align 1 - store i8 %3, i8* %c, align 1 + %ptroffset = getelementptr inbounds i8, ptr %0, i64 0 + %1 = load i8, ptr %ptroffset, align 1 + store i8 %1, ptr %a, align 1 + %2 = load i8, ptr %0, align 8 + store i8 %2, ptr %b, align 1 + %ptroffset1 = getelementptr inbounds i8, ptr %0, i64 1 + %3 = load i8, ptr %ptroffset1, align 1 + store i8 %3, ptr %c, align 1 ret void } -define void @pointer_index_test3(i64* %0) #0 { +define void @pointer_index_test3(ptr %0) #0 { entry: %a = alloca i64, align 8 %b = alloca i64, align 8 %c = alloca i64, align 8 - %ptroffset = getelementptr inbounds i64, i64* %0, i64 0 - %1 = load i64, i64* %ptroffset, align 8 - store i64 %1, i64* %a, align 8 - %2 = load i64, i64* %0, align 8 - store i64 %2, i64* %b, align 8 - %ptroffset1 = getelementptr inbounds i64, i64* %0, i64 1 - %3 = load i64, i64* %ptroffset1, align 8 - store i64 %3, i64* %c, align 8 + %ptroffset = getelementptr inbounds i64, ptr %0, i64 0 + %1 = load i64, ptr %ptroffset, align 8 + store i64 %1, ptr %a, align 8 + %2 = load i64, ptr %0, align 8 + store i64 %2, ptr %b, align 8 + %ptroffset1 = getelementptr inbounds i64, ptr %0, i64 1 + %3 = load i64, ptr %ptroffset1, align 8 + store i64 %3, ptr %c, align 8 ret void } diff --git a/test/test_suite/pointers/subarray_variant_to_ptr.c3t b/test/test_suite/pointers/subarray_variant_to_ptr.c3t index 6b9841930..198403bd9 100644 --- a/test/test_suite/pointers/subarray_variant_to_ptr.c3t +++ b/test/test_suite/pointers/subarray_variant_to_ptr.c3t @@ -26,80 +26,63 @@ fn void main() /* #expect: foo.ll -%variant = type { i8*, i64 } -%"int[]" = type { i32*, i64 } +%variant = type { ptr, i64 } +%"int[]" = type { ptr, i64 } @"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -define void @foo_test1(i64 %0, i8* %1) #0 { +define void @foo_test1(i64 %0, ptr %1) #0 { entry: %z = alloca %variant, align 8 - %w = alloca i32*, align 8 - %pair = bitcast %variant* %z to { i64, i8* }* - %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 - store i8* %1, i8** %3, align 8 - %4 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 - %5 = load i8*, i8** %4, align 8 - %ptrptr = bitcast i8* %5 to i32* - store i32* %ptrptr, i32** %w, align 8 - %6 = load i32*, i32** %w, align 8 - %7 = load i32, i32* %6, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %7) + %w = alloca ptr, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 1 + store ptr %1, ptr %3, align 8 + %4 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 + %5 = load ptr, ptr %4, align 8 + store ptr %5, ptr %w, align 8 + %6 = load ptr, ptr %w, align 8 + %7 = load i32, ptr %6, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %7) ret void } -; Function Attrs: nounwind -define void @foo_test2(i8* %0, i64 %1) #0 { +define void @foo_test2(ptr %0, i64 %1) #0 { entry: %z = alloca %"int[]", align 8 - %w = alloca i32*, align 8 - %pair = bitcast %"int[]"* %z to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - %4 = getelementptr inbounds %"int[]", %"int[]"* %z, i32 0, i32 0 - %5 = load i32*, i32** %4, align 8 - store i32* %5, i32** %w, align 8 - %6 = load i32*, i32** %w, align 8 - %7 = load i32, i32* %6, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %7) + %w = alloca ptr, align 8 + %2 = getelementptr inbounds { ptr, i64 }, ptr %z, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %z, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + %4 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 0 + %5 = load ptr, ptr %4, align 8 + store ptr %5, ptr %w, align 8 + %6 = load ptr, ptr %w, align 8 + %7 = load i32, ptr %6, align 8 + call void (ptr, ...) @printf(ptr @.str.1, i32 %7) ret void } -; Function Attrs: nounwind define void @foo_main() #0 { entry: %x = alloca i32, align 4 %y = alloca i32, align 4 %w = alloca [2 x i32], align 4 %taddr = alloca %variant, align 8 - %taddr1 = alloca %"int[]", align 8 - store i32 123, i32* %x, align 4 - store i32 293483, i32* %y, align 4 - %0 = bitcast [2 x i32]* %w to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([2 x i32]* @.__const to i8*), i32 8, i1 false) - %1 = bitcast i32* %x to i8* - %2 = insertvalue %variant undef, i8* %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %3, %variant* %taddr, align 8 - %4 = bitcast %variant* %taddr to { i64, i8* }* - %5 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %4, i32 0, i32 0 - %lo = load i64, i64* %5, align 8 - %6 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %4, i32 0, i32 1 - %hi = load i8*, i8** %6, align 8 - call void @foo_test1(i64 %lo, i8* %hi) - %7 = getelementptr inbounds [2 x i32], [2 x i32]* %w, i64 0, i64 0 - %8 = insertvalue %"int[]" undef, i32* %7, 0 - %9 = insertvalue %"int[]" %8, i64 2, 1 - store %"int[]" %9, %"int[]"* %taddr1, align 8 - %10 = bitcast %"int[]"* %taddr1 to { i8*, i64 }* - %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %10, i32 0, i32 0 - %lo2 = load i8*, i8** %11, align 8 - %12 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %10, i32 0, i32 1 - %hi3 = load i64, i64* %12, align 8 - call void @foo_test2(i8* %lo2, i64 %hi3) + store i32 123, ptr %x, align 4 + store i32 293483, ptr %y, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %w, ptr align 4 @.__const, i32 8, i1 false) + %0 = insertvalue %variant undef, ptr %x, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %1, ptr %taddr, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %taddr, i32 0, i32 0 + %lo = load i64, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %taddr, i32 0, i32 1 + %hi = load ptr, ptr %3, align 8 + call void @foo_test1(i64 %lo, ptr %hi) + %4 = getelementptr inbounds [2 x i32], ptr %w, i64 0, i64 0 + call void @foo_test2(ptr %4, i64 2) ret void } \ No newline at end of file diff --git a/test/test_suite/safe/deref.c3t b/test/test_suite/safe/deref.c3t index 8929aa549..2760e9973 100644 --- a/test/test_suite/safe/deref.c3t +++ b/test/test_suite/safe/deref.c3t @@ -12,20 +12,21 @@ fn void main() define void @foo_main() #0 { entry: - %x = alloca i32*, align 8 + %x = alloca ptr, align 8 %y = alloca i32, align 4 - store i32* null, i32** %x, align 8 - %0 = load i32*, i32** %x, align 8 - %checknull = icmp eq i32* %0, null + store ptr null, ptr %x, align 8 + %0 = load ptr, ptr %x, align 8 + %checknull = icmp eq ptr %0, null br i1 %checknull, label %panic, label %checkok panic: ; preds = %entry - %1 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %1(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.file, i64 0, i64 0), i64 8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4, i32 6) + %1 = load ptr, ptr @std_core_builtin_panic, align 8 + call void %1(ptr @.panic_msg, i64 27, ptr @.file, i64 8, ptr @.func, i64 4, i32 6) br label %checkok checkok: ; preds = %panic, %entry - %2 = load i32, i32* %0, align 8 - store i32 %2, i32* %y, align 4 + %2 = load i32, ptr %0, align 8 + store i32 %2, ptr %y, align 4 ret void } + diff --git a/test/test_suite/slices/slice_assign.c3t b/test/test_suite/slices/slice_assign.c3t index f89d4f9a4..13df9b6f6 100644 --- a/test/test_suite/slices/slice_assign.c3t +++ b/test/test_suite/slices/slice_assign.c3t @@ -18,62 +18,72 @@ fn void main() /* #expect: test.ll +@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 + +; Function Attrs: nounwind +declare void @printf(ptr, ...) #0 + define void @test_main() #0 { entry: %x = alloca [8 x i32], align 16 %.anon = alloca i64, align 8 %i = alloca i32, align 4 - %0 = bitcast [8 x i32]* %x to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 32, i1 false) - %1 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 0 - store i32 3, i32* %1, align 4 - %2 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 1 - store i32 3, i32* %2, align 4 - %3 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 1 - store i32 5, i32* %3, align 4 - %4 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 2 - store i32 5, i32* %4, align 4 - %5 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 5 - store i32 52, i32* %5, align 4 - %6 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 6 - store i32 52, i32* %6, align 4 - %7 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 7 - store i32 52, i32* %7, align 4 - store i64 0, i64* %.anon, align 8 + call void @llvm.memset.p0.i64(ptr align 16 %x, i8 0, i64 32, i1 false) + %0 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 0 + store i32 3, ptr %0, align 4 + %1 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 1 + store i32 3, ptr %1, align 4 + %2 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 1 + store i32 5, ptr %2, align 4 + %3 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 2 + store i32 5, ptr %3, align 4 + %4 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 5 + store i32 52, ptr %4, align 4 + %5 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 6 + store i32 52, ptr %5, align 4 + %6 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 7 + store i32 52, ptr %6, align 4 + store i64 0, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %8 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 8, %8 + %7 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 8, %7 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %9 = load i64, i64* %.anon, align 8 - %10 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %9 - %11 = load i32, i32* %10, align 4 - store i32 %11, i32* %i, align 4 - %12 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %12) - %13 = load i64, i64* %.anon, align 8 - %add = add i64 %13, 1 - store i64 %add, i64* %.anon, align 8 + %8 = load i64, ptr %.anon, align 8 + %9 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 %8 + %10 = load i32, ptr %9, align 4 + store i32 %10, ptr %i, align 4 + %11 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %11) + %12 = load i64, ptr %.anon, align 8 + %add = add i64 %12, 1 + store i64 %add, ptr %.anon, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond br label %cond cond: ; preds = %assign, %loop.exit - %14 = phi i64 [ 0, %loop.exit ], [ %add1, %assign ] - %lt = icmp slt i64 %14, 8 + %13 = phi i64 [ 0, %loop.exit ], [ %add1, %assign ] + %lt = icmp slt i64 %13, 8 br i1 %lt, label %assign, label %exit assign: ; preds = %cond - %15 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %14 - store i32 123, i32* %15, align 4 - %add1 = add i64 %14, 1 + %14 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 %13 + store i32 123, ptr %14, align 4 + %add1 = add i64 %13, 1 br label %cond exit: ; preds = %cond ret void } +; Function Attrs: nounwind +define i32 @main(i32 %0, ptr %1) #0 { +entry: + call void @test_main() + ret i32 0 +} diff --git a/test/test_suite/slices/slice_to_slice_assign.c3t b/test/test_suite/slices/slice_to_slice_assign.c3t index ffe3bbf3e..a6329087d 100644 --- a/test/test_suite/slices/slice_to_slice_assign.c3t +++ b/test/test_suite/slices/slice_to_slice_assign.c3t @@ -7,16 +7,16 @@ fn void main() int[*] z = { 1, 2, 3, 4, 5, 6, 7 }; int[6] y; y[1..3] = z[3..5]; - io::printfln("%s %s", y, z); + io::printfn("%s %s", y, z); y[4..] = z[5..6]; - io::printfln("%s %s", y, z); + io::printfn("%s %s", y, z); int[][] a = { int[] { 1 } }; int[][] b = { int[] { 2 } }; - io::printfln("%s", a); + io::printfn("%s", a); a[0..0] = b[0..0]; - io::printfln("%s", a); + io::printfn("%s", a); a[0..0] = y[2..4]; - io::printfln("%s", a); + io::printfn("%s", a); } /* #expect: test.ll @@ -27,228 +27,159 @@ entry: %taddr = alloca %"int[]", align 8 %retparam = alloca i64, align 8 %varargslots = alloca [2 x %variant], align 16 - %taddr1 = alloca %"variant[]", align 8 - %taddr2 = alloca %"int[]", align 8 - %retparam3 = alloca i64, align 8 - %varargslots4 = alloca [2 x %variant], align 16 - %taddr5 = alloca %"variant[]", align 8 + %taddr1 = alloca %"int[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [2 x %variant], align 16 %a = alloca %"int[][]", align 8 %literal = alloca [1 x %"int[]"], align 16 - %literal11 = alloca [1 x i32], align 4 + %literal7 = alloca [1 x i32], align 4 %b = alloca %"int[][]", align 8 - %literal12 = alloca [1 x %"int[]"], align 16 - %literal13 = alloca [1 x i32], align 4 - %retparam14 = alloca i64, align 8 - %varargslots15 = alloca [1 x %variant], align 16 - %taddr16 = alloca %"variant[]", align 8 - %taddr23 = alloca %"int[][]", align 8 - %retparam24 = alloca i64, align 8 - %varargslots25 = alloca [1 x %variant], align 16 - %taddr26 = alloca %"variant[]", align 8 - %retparam33 = alloca i64, align 8 - %varargslots34 = alloca [1 x %variant], align 16 - %taddr35 = alloca %"variant[]", align 8 - %0 = bitcast [7 x i32]* %z to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %0, i8* align 16 bitcast ([7 x i32]* @.__const to i8*), i32 28, i1 false) - %1 = bitcast [6 x i32]* %y to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %1, i8 0, i64 24, i1 false) - %2 = getelementptr inbounds [7 x i32], [7 x i32]* %z, i64 0, i64 3 - %3 = insertvalue %"int[]" undef, i32* %2, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - %5 = getelementptr inbounds [6 x i32], [6 x i32]* %y, i64 0, i64 1 - %6 = insertvalue %"int[]" undef, i32* %5, 0 - %7 = insertvalue %"int[]" %6, i64 3, 1 - %8 = extractvalue %"int[]" %7, 0 - %9 = extractvalue %"int[]" %4, 0 - store %"int[]" %4, %"int[]"* %taddr, align 8 - %10 = getelementptr inbounds %"int[]", %"int[]"* %taddr, i32 0, i32 1 - %11 = load i64, i64* %10, align 8 - %12 = mul i64 %11, 4 - %13 = bitcast i32* %8 to i8* - %14 = bitcast i32* %9 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %13, i8* align 4 %14, i64 %12, i1 false) - %15 = bitcast [6 x i32]* %y to i8* - %16 = insertvalue %variant undef, i8* %15, 0 - %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$a6$int" to i64), 1 - %18 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %17, %variant* %18, align 16 - %19 = bitcast [7 x i32]* %z to i8* - %20 = insertvalue %variant undef, i8* %19, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$a7$int" to i64), 1 - %22 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %21, %variant* %22, align 16 - %23 = bitcast [2 x %variant]* %varargslots to %variant* - %24 = insertvalue %"variant[]" undef, %variant* %23, 0 - %25 = insertvalue %"variant[]" %24, i64 2, 1 - store %"variant[]" %25, %"variant[]"* %taddr1, align 8 - %26 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0 - %lo = load i8*, i8** %27, align 8 - %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1 - %hi = load i64, i64* %28, align 8 - %29 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %29, 0 + %literal8 = alloca [1 x %"int[]"], align 16 + %literal9 = alloca [1 x i32], align 4 + %retparam10 = alloca i64, align 8 + %varargslots11 = alloca [1 x %variant], align 16 + %taddr16 = alloca %"int[][]", align 8 + %retparam17 = alloca i64, align 8 + %varargslots18 = alloca [1 x %variant], align 16 + %retparam23 = alloca i64, align 8 + %varargslots24 = alloca [1 x %variant], align 16 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %z, ptr align 16 @.__const, i32 28, i1 false) + call void @llvm.memset.p0.i64(ptr align 16 %y, i8 0, i64 24, i1 false) + %0 = getelementptr inbounds [7 x i32], ptr %z, i64 0, i64 3 + %1 = insertvalue %"int[]" undef, ptr %0, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + %3 = getelementptr inbounds [6 x i32], ptr %y, i64 0, i64 1 + %4 = insertvalue %"int[]" undef, ptr %3, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + %6 = extractvalue %"int[]" %5, 0 + %7 = extractvalue %"int[]" %2, 0 + store %"int[]" %2, ptr %taddr, align 8 + %8 = getelementptr inbounds %"int[]", ptr %taddr, i32 0, i32 1 + %9 = load i64, ptr %8, align 8 + %10 = mul i64 %9, 4 + call void @llvm.memcpy.p0.p0.i64(ptr align 4 %6, ptr align 4 %7, i64 %10, i1 false) + %11 = insertvalue %variant undef, ptr %y, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$a6$int" to i64), 1 + %13 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %12, ptr %13, align 16 + %14 = insertvalue %variant undef, ptr %z, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$a7$int" to i64), 1 + %16 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %15, ptr %16, align 16 + %17 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 5, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %17, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %30 = getelementptr inbounds [7 x i32], [7 x i32]* %z, i64 0, i64 5 - %31 = insertvalue %"int[]" undef, i32* %30, 0 - %32 = insertvalue %"int[]" %31, i64 2, 1 - %33 = getelementptr inbounds [6 x i32], [6 x i32]* %y, i64 0, i64 4 - %34 = insertvalue %"int[]" undef, i32* %33, 0 - %35 = insertvalue %"int[]" %34, i64 2, 1 - %36 = extractvalue %"int[]" %35, 0 - %37 = extractvalue %"int[]" %32, 0 - store %"int[]" %32, %"int[]"* %taddr2, align 8 - %38 = getelementptr inbounds %"int[]", %"int[]"* %taddr2, i32 0, i32 1 - %39 = load i64, i64* %38, align 8 - %40 = mul i64 %39, 4 - %41 = bitcast i32* %36 to i8* - %42 = bitcast i32* %37 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %41, i8* align 4 %42, i64 %40, i1 false) - %43 = bitcast [6 x i32]* %y to i8* - %44 = insertvalue %variant undef, i8* %43, 0 - %45 = insertvalue %variant %44, i64 ptrtoint (%.introspect* @"ct$a6$int" to i64), 1 - %46 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 0 - store %variant %45, %variant* %46, align 16 - %47 = bitcast [7 x i32]* %z to i8* - %48 = insertvalue %variant undef, i8* %47, 0 - %49 = insertvalue %variant %48, i64 ptrtoint (%.introspect* @"ct$a7$int" to i64), 1 - %50 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 1 - store %variant %49, %variant* %50, align 16 - %51 = bitcast [2 x %variant]* %varargslots4 to %variant* - %52 = insertvalue %"variant[]" undef, %variant* %51, 0 - %53 = insertvalue %"variant[]" %52, i64 2, 1 - store %"variant[]" %53, %"variant[]"* %taddr5, align 8 - %54 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %54, i32 0, i32 0 - %lo6 = load i8*, i8** %55, align 8 - %56 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %54, i32 0, i32 1 - %hi7 = load i64, i64* %56, align 8 - %57 = call i64 @std_io_printfln(i64* %retparam3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 5, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %57, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + %18 = getelementptr inbounds [7 x i32], ptr %z, i64 0, i64 5 + %19 = insertvalue %"int[]" undef, ptr %18, 0 + %20 = insertvalue %"int[]" %19, i64 2, 1 + %21 = getelementptr inbounds [6 x i32], ptr %y, i64 0, i64 4 + %22 = insertvalue %"int[]" undef, ptr %21, 0 + %23 = insertvalue %"int[]" %22, i64 2, 1 + %24 = extractvalue %"int[]" %23, 0 + %25 = extractvalue %"int[]" %20, 0 + store %"int[]" %20, ptr %taddr1, align 8 + %26 = getelementptr inbounds %"int[]", ptr %taddr1, i32 0, i32 1 + %27 = load i64, ptr %26, align 8 + %28 = mul i64 %27, 4 + call void @llvm.memcpy.p0.p0.i64(ptr align 4 %24, ptr align 4 %25, i64 %28, i1 false) + %29 = insertvalue %variant undef, ptr %y, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$a6$int" to i64), 1 + %31 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 0 + store %variant %30, ptr %31, align 16 + %32 = insertvalue %variant undef, ptr %z, 0 + %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$a7$int" to i64), 1 + %34 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 1 + store %variant %33, ptr %34, align 16 + %35 = call i64 @std_io_printfn(ptr %retparam2, ptr @.str.1, i64 5, ptr %varargslots3, i64 2) + %not_err4 = icmp eq i64 %35, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %voiderr - br label %voiderr10 +after_check5: ; preds = %voiderr + br label %voiderr6 -voiderr10: ; preds = %after_check9, %voiderr - %58 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal, i64 0, i64 0 - %59 = getelementptr inbounds [1 x i32], [1 x i32]* %literal11, i64 0, i64 0 - store i32 1, i32* %59, align 4 - %60 = bitcast [1 x i32]* %literal11 to i32* - %61 = insertvalue %"int[]" undef, i32* %60, 0 - %62 = insertvalue %"int[]" %61, i64 1, 1 - store %"int[]" %62, %"int[]"* %58, align 8 - %63 = bitcast [1 x %"int[]"]* %literal to %"int[]"* - %64 = insertvalue %"int[][]" undef, %"int[]"* %63, 0 - %65 = insertvalue %"int[][]" %64, i64 1, 1 - store %"int[][]" %65, %"int[][]"* %a, align 8 - %66 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal12, i64 0, i64 0 - %67 = getelementptr inbounds [1 x i32], [1 x i32]* %literal13, i64 0, i64 0 - store i32 2, i32* %67, align 4 - %68 = bitcast [1 x i32]* %literal13 to i32* - %69 = insertvalue %"int[]" undef, i32* %68, 0 - %70 = insertvalue %"int[]" %69, i64 1, 1 - store %"int[]" %70, %"int[]"* %66, align 8 - %71 = bitcast [1 x %"int[]"]* %literal12 to %"int[]"* - %72 = insertvalue %"int[][]" undef, %"int[]"* %71, 0 - %73 = insertvalue %"int[][]" %72, i64 1, 1 - store %"int[][]" %73, %"int[][]"* %b, align 8 - %74 = bitcast %"int[][]"* %a to i8* - %75 = insertvalue %variant undef, i8* %74, 0 - %76 = insertvalue %variant %75, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 - %77 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots15, i64 0, i64 0 - store %variant %76, %variant* %77, align 16 - %78 = bitcast [1 x %variant]* %varargslots15 to %variant* - %79 = insertvalue %"variant[]" undef, %variant* %78, 0 - %80 = insertvalue %"variant[]" %79, i64 1, 1 - store %"variant[]" %80, %"variant[]"* %taddr16, align 8 - %81 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* - %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 0 - %lo17 = load i8*, i8** %82, align 8 - %83 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 1 - %hi18 = load i64, i64* %83, align 8 - %84 = call i64 @std_io_printfln(i64* %retparam14, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo17, i64 %hi18) - %not_err19 = icmp eq i64 %84, 0 +voiderr6: ; preds = %after_check5, %voiderr + %36 = getelementptr inbounds [1 x %"int[]"], ptr %literal, i64 0, i64 0 + %37 = getelementptr inbounds [1 x i32], ptr %literal7, i64 0, i64 0 + store i32 1, ptr %37, align 4 + %38 = insertvalue %"int[]" undef, ptr %literal7, 0 + %39 = insertvalue %"int[]" %38, i64 1, 1 + store %"int[]" %39, ptr %36, align 8 + %40 = insertvalue %"int[][]" undef, ptr %literal, 0 + %41 = insertvalue %"int[][]" %40, i64 1, 1 + store %"int[][]" %41, ptr %a, align 8 + %42 = getelementptr inbounds [1 x %"int[]"], ptr %literal8, i64 0, i64 0 + %43 = getelementptr inbounds [1 x i32], ptr %literal9, i64 0, i64 0 + store i32 2, ptr %43, align 4 + %44 = insertvalue %"int[]" undef, ptr %literal9, 0 + %45 = insertvalue %"int[]" %44, i64 1, 1 + store %"int[]" %45, ptr %42, align 8 + %46 = insertvalue %"int[][]" undef, ptr %literal8, 0 + %47 = insertvalue %"int[][]" %46, i64 1, 1 + store %"int[][]" %47, ptr %b, align 8 + %48 = insertvalue %variant undef, ptr %a, 0 + %49 = insertvalue %variant %48, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 + %50 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 + store %variant %49, ptr %50, align 16 + %51 = call i64 @std_io_printfn(ptr %retparam10, ptr @.str.2, i64 2, ptr %varargslots11, i64 1) + %not_err12 = icmp eq i64 %51, 0 + br i1 %not_err12, label %after_check13, label %voiderr14 + +after_check13: ; preds = %voiderr6 + br label %voiderr14 + +voiderr14: ; preds = %after_check13, %voiderr6 + %52 = load %"int[][]", ptr %b, align 8 + %53 = extractvalue %"int[][]" %52, 0 + %ptroffset = getelementptr inbounds %"int[]", ptr %53, i64 0 + %54 = insertvalue %"int[][]" undef, ptr %ptroffset, 0 + %55 = insertvalue %"int[][]" %54, i64 1, 1 + %56 = load %"int[][]", ptr %a, align 8 + %57 = extractvalue %"int[][]" %56, 0 + %ptroffset15 = getelementptr inbounds %"int[]", ptr %57, i64 0 + %58 = insertvalue %"int[][]" undef, ptr %ptroffset15, 0 + %59 = insertvalue %"int[][]" %58, i64 1, 1 + %60 = extractvalue %"int[][]" %59, 0 + %61 = extractvalue %"int[][]" %55, 0 + store %"int[][]" %55, ptr %taddr16, align 8 + %62 = getelementptr inbounds %"int[][]", ptr %taddr16, i32 0, i32 1 + %63 = load i64, ptr %62, align 8 + %64 = mul i64 %63, 16 + call void @llvm.memcpy.p0.p0.i64(ptr align 8 %60, ptr align 8 %61, i64 %64, i1 false) + %65 = insertvalue %variant undef, ptr %a, 0 + %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 + %67 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 + store %variant %66, ptr %67, align 16 + %68 = call i64 @std_io_printfn(ptr %retparam17, ptr @.str.3, i64 2, ptr %varargslots18, i64 1) + %not_err19 = icmp eq i64 %68, 0 br i1 %not_err19, label %after_check20, label %voiderr21 -after_check20: ; preds = %voiderr10 +after_check20: ; preds = %voiderr14 br label %voiderr21 -voiderr21: ; preds = %after_check20, %voiderr10 - %85 = load %"int[][]", %"int[][]"* %b, align 8 - %86 = extractvalue %"int[][]" %85, 0 - %ptroffset = getelementptr inbounds %"int[]", %"int[]"* %86, i64 0 - %87 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset, 0 - %88 = insertvalue %"int[][]" %87, i64 1, 1 - %89 = load %"int[][]", %"int[][]"* %a, align 8 - %90 = extractvalue %"int[][]" %89, 0 - %ptroffset22 = getelementptr inbounds %"int[]", %"int[]"* %90, i64 0 - %91 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset22, 0 - %92 = insertvalue %"int[][]" %91, i64 1, 1 - %93 = extractvalue %"int[][]" %92, 0 - %94 = extractvalue %"int[][]" %88, 0 - store %"int[][]" %88, %"int[][]"* %taddr23, align 8 - %95 = getelementptr inbounds %"int[][]", %"int[][]"* %taddr23, i32 0, i32 1 - %96 = load i64, i64* %95, align 8 - %97 = mul i64 %96, 16 - %98 = bitcast %"int[]"* %93 to i8* - %99 = bitcast %"int[]"* %94 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %98, i8* align 8 %99, i64 %97, i1 false) - %100 = bitcast %"int[][]"* %a to i8* - %101 = insertvalue %variant undef, i8* %100, 0 - %102 = insertvalue %variant %101, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 - %103 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots25, i64 0, i64 0 - store %variant %102, %variant* %103, align 16 - %104 = bitcast [1 x %variant]* %varargslots25 to %variant* - %105 = insertvalue %"variant[]" undef, %variant* %104, 0 - %106 = insertvalue %"variant[]" %105, i64 1, 1 - store %"variant[]" %106, %"variant[]"* %taddr26, align 8 - %107 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* - %108 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %107, i32 0, i32 0 - %lo27 = load i8*, i8** %108, align 8 - %109 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %107, i32 0, i32 1 - %hi28 = load i64, i64* %109, align 8 - %110 = call i64 @std_io_printfln(i64* %retparam24, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo27, i64 %hi28) - %not_err29 = icmp eq i64 %110, 0 - br i1 %not_err29, label %after_check30, label %voiderr31 +voiderr21: ; preds = %after_check20, %voiderr14 + %69 = getelementptr inbounds [6 x i32], ptr %y, i64 0, i64 2 + %70 = insertvalue %"int[]" undef, ptr %69, 0 + %71 = insertvalue %"int[]" %70, i64 3, 1 + %72 = load %"int[][]", ptr %a, align 8 + %73 = extractvalue %"int[][]" %72, 0 + %ptroffset22 = getelementptr inbounds %"int[]", ptr %73, i64 0 + store %"int[]" %71, ptr %ptroffset22, align 8 + %74 = insertvalue %variant undef, ptr %a, 0 + %75 = insertvalue %variant %74, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 + %76 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 + store %variant %75, ptr %76, align 16 + %77 = call i64 @std_io_printfn(ptr %retparam23, ptr @.str.4, i64 2, ptr %varargslots24, i64 1) + %not_err25 = icmp eq i64 %77, 0 + br i1 %not_err25, label %after_check26, label %voiderr27 -after_check30: ; preds = %voiderr21 - br label %voiderr31 +after_check26: ; preds = %voiderr21 + br label %voiderr27 -voiderr31: ; preds = %after_check30, %voiderr21 - %111 = getelementptr inbounds [6 x i32], [6 x i32]* %y, i64 0, i64 2 - %112 = insertvalue %"int[]" undef, i32* %111, 0 - %113 = insertvalue %"int[]" %112, i64 3, 1 - %114 = load %"int[][]", %"int[][]"* %a, align 8 - %115 = extractvalue %"int[][]" %114, 0 - %ptroffset32 = getelementptr inbounds %"int[]", %"int[]"* %115, i64 0 - store %"int[]" %113, %"int[]"* %ptroffset32, align 8 - %116 = bitcast %"int[][]"* %a to i8* - %117 = insertvalue %variant undef, i8* %116, 0 - %118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 - %119 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots34, i64 0, i64 0 - store %variant %118, %variant* %119, align 16 - %120 = bitcast [1 x %variant]* %varargslots34 to %variant* - %121 = insertvalue %"variant[]" undef, %variant* %120, 0 - %122 = insertvalue %"variant[]" %121, i64 1, 1 - store %"variant[]" %122, %"variant[]"* %taddr35, align 8 - %123 = bitcast %"variant[]"* %taddr35 to { i8*, i64 }* - %124 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 0 - %lo36 = load i8*, i8** %124, align 8 - %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 1 - %hi37 = load i64, i64* %125, align 8 - %126 = call i64 @std_io_printfln(i64* %retparam33, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo36, i64 %hi37) - %not_err38 = icmp eq i64 %126, 0 - br i1 %not_err38, label %after_check39, label %voiderr40 - -after_check39: ; preds = %voiderr31 - br label %voiderr40 - -voiderr40: ; preds = %after_check39, %voiderr31 +voiderr27: ; preds = %after_check26, %voiderr21 ret void } diff --git a/test/test_suite/slices/slice_to_slice_vector_assign.c3t b/test/test_suite/slices/slice_to_slice_vector_assign.c3t index 2c2654f3a..c00ca9c89 100644 --- a/test/test_suite/slices/slice_to_slice_vector_assign.c3t +++ b/test/test_suite/slices/slice_to_slice_vector_assign.c3t @@ -7,17 +7,18 @@ fn void main() int[<*>] z = { 1, 2, 3, 4, 5, 6, 7 }; int[<6>] y; y[1..3] = z[3..5]; - io::printfln("%s %s", y, z); + io::printfn("%s %s", y, z); y[4..] = z[5..6]; - io::printfln("%s %s", y, z); + io::printfn("%s %s", y, z); int[][] a = { int[] { 1 } }; int[][] b = { int[] { 2 } }; - io::printfln("%s", a); + io::printfn("%s", a); a[0..0] = b[0..0]; - io::printfln("%s", a); + io::printfn("%s", a); a[0..0] = y[2..4]; - io::printfln("%s", a); + io::printfn("%s", a); } + /* #expect: test.ll define void @test_main() #0 { @@ -27,226 +28,159 @@ entry: %taddr = alloca %"int[]", align 8 %retparam = alloca i64, align 8 %varargslots = alloca [2 x %variant], align 16 - %taddr1 = alloca %"variant[]", align 8 - %taddr2 = alloca %"int[]", align 8 - %retparam3 = alloca i64, align 8 - %varargslots4 = alloca [2 x %variant], align 16 - %taddr5 = alloca %"variant[]", align 8 + %taddr1 = alloca %"int[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [2 x %variant], align 16 %a = alloca %"int[][]", align 8 %literal = alloca [1 x %"int[]"], align 16 - %literal11 = alloca [1 x i32], align 4 + %literal7 = alloca [1 x i32], align 4 %b = alloca %"int[][]", align 8 - %literal12 = alloca [1 x %"int[]"], align 16 - %literal13 = alloca [1 x i32], align 4 - %retparam14 = alloca i64, align 8 - %varargslots15 = alloca [1 x %variant], align 16 - %taddr16 = alloca %"variant[]", align 8 - %taddr23 = alloca %"int[][]", align 8 - %retparam24 = alloca i64, align 8 - %varargslots25 = alloca [1 x %variant], align 16 - %taddr26 = alloca %"variant[]", align 8 - %retparam33 = alloca i64, align 8 - %varargslots34 = alloca [1 x %variant], align 16 - %taddr35 = alloca %"variant[]", align 8 - store <7 x i32> , <7 x i32>* %z, align 32 - store <6 x i32> zeroinitializer, <6 x i32>* %y, align 32 - %0 = getelementptr inbounds <7 x i32>, <7 x i32>* %z, i64 0, i64 3 - %1 = insertvalue %"int[]" undef, i32* %0, 0 + %literal8 = alloca [1 x %"int[]"], align 16 + %literal9 = alloca [1 x i32], align 4 + %retparam10 = alloca i64, align 8 + %varargslots11 = alloca [1 x %variant], align 16 + %taddr16 = alloca %"int[][]", align 8 + %retparam17 = alloca i64, align 8 + %varargslots18 = alloca [1 x %variant], align 16 + %retparam23 = alloca i64, align 8 + %varargslots24 = alloca [1 x %variant], align 16 + store <7 x i32> , ptr %z, align 32 + store <6 x i32> zeroinitializer, ptr %y, align 32 + %0 = getelementptr inbounds <7 x i32>, ptr %z, i64 0, i64 3 + %1 = insertvalue %"int[]" undef, ptr %0, 0 %2 = insertvalue %"int[]" %1, i64 3, 1 - %3 = getelementptr inbounds <6 x i32>, <6 x i32>* %y, i64 0, i64 1 - %4 = insertvalue %"int[]" undef, i32* %3, 0 + %3 = getelementptr inbounds <6 x i32>, ptr %y, i64 0, i64 1 + %4 = insertvalue %"int[]" undef, ptr %3, 0 %5 = insertvalue %"int[]" %4, i64 3, 1 %6 = extractvalue %"int[]" %5, 0 %7 = extractvalue %"int[]" %2, 0 - store %"int[]" %2, %"int[]"* %taddr, align 8 - %8 = getelementptr inbounds %"int[]", %"int[]"* %taddr, i32 0, i32 1 - %9 = load i64, i64* %8, align 8 + store %"int[]" %2, ptr %taddr, align 8 + %8 = getelementptr inbounds %"int[]", ptr %taddr, i32 0, i32 1 + %9 = load i64, ptr %8, align 8 %10 = mul i64 %9, 4 - %11 = bitcast i32* %6 to i8* - %12 = bitcast i32* %7 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %11, i8* align 4 %12, i64 %10, i1 false) - %13 = bitcast <6 x i32>* %y to i8* - %14 = insertvalue %variant undef, i8* %13, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (%.introspect* @"ct$v6$int" to i64), 1 - %16 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %15, %variant* %16, align 16 - %17 = bitcast <7 x i32>* %z to i8* - %18 = insertvalue %variant undef, i8* %17, 0 - %19 = insertvalue %variant %18, i64 ptrtoint (%.introspect* @"ct$v7$int" to i64), 1 - %20 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %19, %variant* %20, align 16 - %21 = bitcast [2 x %variant]* %varargslots to %variant* - %22 = insertvalue %"variant[]" undef, %variant* %21, 0 - %23 = insertvalue %"variant[]" %22, i64 2, 1 - store %"variant[]" %23, %"variant[]"* %taddr1, align 8 - %24 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* - %25 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %24, i32 0, i32 0 - %lo = load i8*, i8** %25, align 8 - %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %24, i32 0, i32 1 - %hi = load i64, i64* %26, align 8 - %27 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %27, 0 + call void @llvm.memcpy.p0.p0.i64(ptr align 4 %6, ptr align 4 %7, i64 %10, i1 false) + %11 = insertvalue %variant undef, ptr %y, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$v6$int" to i64), 1 + %13 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %12, ptr %13, align 16 + %14 = insertvalue %variant undef, ptr %z, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$v7$int" to i64), 1 + %16 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %15, ptr %16, align 16 + %17 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 5, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %17, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %28 = getelementptr inbounds <7 x i32>, <7 x i32>* %z, i64 0, i64 5 - %29 = insertvalue %"int[]" undef, i32* %28, 0 - %30 = insertvalue %"int[]" %29, i64 2, 1 - %31 = getelementptr inbounds <6 x i32>, <6 x i32>* %y, i64 0, i64 4 - %32 = insertvalue %"int[]" undef, i32* %31, 0 - %33 = insertvalue %"int[]" %32, i64 2, 1 - %34 = extractvalue %"int[]" %33, 0 - %35 = extractvalue %"int[]" %30, 0 - store %"int[]" %30, %"int[]"* %taddr2, align 8 - %36 = getelementptr inbounds %"int[]", %"int[]"* %taddr2, i32 0, i32 1 - %37 = load i64, i64* %36, align 8 - %38 = mul i64 %37, 4 - %39 = bitcast i32* %34 to i8* - %40 = bitcast i32* %35 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %39, i8* align 4 %40, i64 %38, i1 false) - %41 = bitcast <6 x i32>* %y to i8* - %42 = insertvalue %variant undef, i8* %41, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$v6$int" to i64), 1 - %44 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 0 - store %variant %43, %variant* %44, align 16 - %45 = bitcast <7 x i32>* %z to i8* - %46 = insertvalue %variant undef, i8* %45, 0 - %47 = insertvalue %variant %46, i64 ptrtoint (%.introspect* @"ct$v7$int" to i64), 1 - %48 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 1 - store %variant %47, %variant* %48, align 16 - %49 = bitcast [2 x %variant]* %varargslots4 to %variant* - %50 = insertvalue %"variant[]" undef, %variant* %49, 0 - %51 = insertvalue %"variant[]" %50, i64 2, 1 - store %"variant[]" %51, %"variant[]"* %taddr5, align 8 - %52 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %53 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 0 - %lo6 = load i8*, i8** %53, align 8 - %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 1 - %hi7 = load i64, i64* %54, align 8 - %55 = call i64 @std_io_printfln(i64* %retparam3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 5, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %55, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + %18 = getelementptr inbounds <7 x i32>, ptr %z, i64 0, i64 5 + %19 = insertvalue %"int[]" undef, ptr %18, 0 + %20 = insertvalue %"int[]" %19, i64 2, 1 + %21 = getelementptr inbounds <6 x i32>, ptr %y, i64 0, i64 4 + %22 = insertvalue %"int[]" undef, ptr %21, 0 + %23 = insertvalue %"int[]" %22, i64 2, 1 + %24 = extractvalue %"int[]" %23, 0 + %25 = extractvalue %"int[]" %20, 0 + store %"int[]" %20, ptr %taddr1, align 8 + %26 = getelementptr inbounds %"int[]", ptr %taddr1, i32 0, i32 1 + %27 = load i64, ptr %26, align 8 + %28 = mul i64 %27, 4 + call void @llvm.memcpy.p0.p0.i64(ptr align 4 %24, ptr align 4 %25, i64 %28, i1 false) + %29 = insertvalue %variant undef, ptr %y, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$v6$int" to i64), 1 + %31 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 0 + store %variant %30, ptr %31, align 16 + %32 = insertvalue %variant undef, ptr %z, 0 + %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$v7$int" to i64), 1 + %34 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 1 + store %variant %33, ptr %34, align 16 + %35 = call i64 @std_io_printfn(ptr %retparam2, ptr @.str.1, i64 5, ptr %varargslots3, i64 2) + %not_err4 = icmp eq i64 %35, 0 + br i1 %not_err4, label %after_check5, label %voiderr6 -after_check9: ; preds = %voiderr - br label %voiderr10 +after_check5: ; preds = %voiderr + br label %voiderr6 -voiderr10: ; preds = %after_check9, %voiderr - %56 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal, i64 0, i64 0 - %57 = getelementptr inbounds [1 x i32], [1 x i32]* %literal11, i64 0, i64 0 - store i32 1, i32* %57, align 4 - %58 = bitcast [1 x i32]* %literal11 to i32* - %59 = insertvalue %"int[]" undef, i32* %58, 0 - %60 = insertvalue %"int[]" %59, i64 1, 1 - store %"int[]" %60, %"int[]"* %56, align 8 - %61 = bitcast [1 x %"int[]"]* %literal to %"int[]"* - %62 = insertvalue %"int[][]" undef, %"int[]"* %61, 0 - %63 = insertvalue %"int[][]" %62, i64 1, 1 - store %"int[][]" %63, %"int[][]"* %a, align 8 - %64 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal12, i64 0, i64 0 - %65 = getelementptr inbounds [1 x i32], [1 x i32]* %literal13, i64 0, i64 0 - store i32 2, i32* %65, align 4 - %66 = bitcast [1 x i32]* %literal13 to i32* - %67 = insertvalue %"int[]" undef, i32* %66, 0 - %68 = insertvalue %"int[]" %67, i64 1, 1 - store %"int[]" %68, %"int[]"* %64, align 8 - %69 = bitcast [1 x %"int[]"]* %literal12 to %"int[]"* - %70 = insertvalue %"int[][]" undef, %"int[]"* %69, 0 - %71 = insertvalue %"int[][]" %70, i64 1, 1 - store %"int[][]" %71, %"int[][]"* %b, align 8 - %72 = bitcast %"int[][]"* %a to i8* - %73 = insertvalue %variant undef, i8* %72, 0 - %74 = insertvalue %variant %73, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 - %75 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots15, i64 0, i64 0 - store %variant %74, %variant* %75, align 16 - %76 = bitcast [1 x %variant]* %varargslots15 to %variant* - %77 = insertvalue %"variant[]" undef, %variant* %76, 0 - %78 = insertvalue %"variant[]" %77, i64 1, 1 - store %"variant[]" %78, %"variant[]"* %taddr16, align 8 - %79 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* - %80 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %79, i32 0, i32 0 - %lo17 = load i8*, i8** %80, align 8 - %81 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %79, i32 0, i32 1 - %hi18 = load i64, i64* %81, align 8 - %82 = call i64 @std_io_printfln(i64* %retparam14, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo17, i64 %hi18) - %not_err19 = icmp eq i64 %82, 0 +voiderr6: ; preds = %after_check5, %voiderr + %36 = getelementptr inbounds [1 x %"int[]"], ptr %literal, i64 0, i64 0 + %37 = getelementptr inbounds [1 x i32], ptr %literal7, i64 0, i64 0 + store i32 1, ptr %37, align 4 + %38 = insertvalue %"int[]" undef, ptr %literal7, 0 + %39 = insertvalue %"int[]" %38, i64 1, 1 + store %"int[]" %39, ptr %36, align 8 + %40 = insertvalue %"int[][]" undef, ptr %literal, 0 + %41 = insertvalue %"int[][]" %40, i64 1, 1 + store %"int[][]" %41, ptr %a, align 8 + %42 = getelementptr inbounds [1 x %"int[]"], ptr %literal8, i64 0, i64 0 + %43 = getelementptr inbounds [1 x i32], ptr %literal9, i64 0, i64 0 + store i32 2, ptr %43, align 4 + %44 = insertvalue %"int[]" undef, ptr %literal9, 0 + %45 = insertvalue %"int[]" %44, i64 1, 1 + store %"int[]" %45, ptr %42, align 8 + %46 = insertvalue %"int[][]" undef, ptr %literal8, 0 + %47 = insertvalue %"int[][]" %46, i64 1, 1 + store %"int[][]" %47, ptr %b, align 8 + %48 = insertvalue %variant undef, ptr %a, 0 + %49 = insertvalue %variant %48, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 + %50 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 + store %variant %49, ptr %50, align 16 + %51 = call i64 @std_io_printfn(ptr %retparam10, ptr @.str.2, i64 2, ptr %varargslots11, i64 1) + %not_err12 = icmp eq i64 %51, 0 + br i1 %not_err12, label %after_check13, label %voiderr14 + +after_check13: ; preds = %voiderr6 + br label %voiderr14 + +voiderr14: ; preds = %after_check13, %voiderr6 + %52 = load %"int[][]", ptr %b, align 8 + %53 = extractvalue %"int[][]" %52, 0 + %ptroffset = getelementptr inbounds %"int[]", ptr %53, i64 0 + %54 = insertvalue %"int[][]" undef, ptr %ptroffset, 0 + %55 = insertvalue %"int[][]" %54, i64 1, 1 + %56 = load %"int[][]", ptr %a, align 8 + %57 = extractvalue %"int[][]" %56, 0 + %ptroffset15 = getelementptr inbounds %"int[]", ptr %57, i64 0 + %58 = insertvalue %"int[][]" undef, ptr %ptroffset15, 0 + %59 = insertvalue %"int[][]" %58, i64 1, 1 + %60 = extractvalue %"int[][]" %59, 0 + %61 = extractvalue %"int[][]" %55, 0 + store %"int[][]" %55, ptr %taddr16, align 8 + %62 = getelementptr inbounds %"int[][]", ptr %taddr16, i32 0, i32 1 + %63 = load i64, ptr %62, align 8 + %64 = mul i64 %63, 16 + call void @llvm.memcpy.p0.p0.i64(ptr align 8 %60, ptr align 8 %61, i64 %64, i1 false) + %65 = insertvalue %variant undef, ptr %a, 0 + %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 + %67 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 + store %variant %66, ptr %67, align 16 + %68 = call i64 @std_io_printfn(ptr %retparam17, ptr @.str.3, i64 2, ptr %varargslots18, i64 1) + %not_err19 = icmp eq i64 %68, 0 br i1 %not_err19, label %after_check20, label %voiderr21 -after_check20: ; preds = %voiderr10 +after_check20: ; preds = %voiderr14 br label %voiderr21 -voiderr21: ; preds = %after_check20, %voiderr10 - %83 = load %"int[][]", %"int[][]"* %b, align 8 - %84 = extractvalue %"int[][]" %83, 0 - %ptroffset = getelementptr inbounds %"int[]", %"int[]"* %84, i64 0 - %85 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset, 0 - %86 = insertvalue %"int[][]" %85, i64 1, 1 - %87 = load %"int[][]", %"int[][]"* %a, align 8 - %88 = extractvalue %"int[][]" %87, 0 - %ptroffset22 = getelementptr inbounds %"int[]", %"int[]"* %88, i64 0 - %89 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset22, 0 - %90 = insertvalue %"int[][]" %89, i64 1, 1 - %91 = extractvalue %"int[][]" %90, 0 - %92 = extractvalue %"int[][]" %86, 0 - store %"int[][]" %86, %"int[][]"* %taddr23, align 8 - %93 = getelementptr inbounds %"int[][]", %"int[][]"* %taddr23, i32 0, i32 1 - %94 = load i64, i64* %93, align 8 - %95 = mul i64 %94, 16 - %96 = bitcast %"int[]"* %91 to i8* - %97 = bitcast %"int[]"* %92 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %96, i8* align 8 %97, i64 %95, i1 false) - %98 = bitcast %"int[][]"* %a to i8* - %99 = insertvalue %variant undef, i8* %98, 0 - %100 = insertvalue %variant %99, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 - %101 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots25, i64 0, i64 0 - store %variant %100, %variant* %101, align 16 - %102 = bitcast [1 x %variant]* %varargslots25 to %variant* - %103 = insertvalue %"variant[]" undef, %variant* %102, 0 - %104 = insertvalue %"variant[]" %103, i64 1, 1 - store %"variant[]" %104, %"variant[]"* %taddr26, align 8 - %105 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* - %106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 0 - %lo27 = load i8*, i8** %106, align 8 - %107 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 1 - %hi28 = load i64, i64* %107, align 8 - %108 = call i64 @std_io_printfln(i64* %retparam24, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo27, i64 %hi28) - %not_err29 = icmp eq i64 %108, 0 - br i1 %not_err29, label %after_check30, label %voiderr31 +voiderr21: ; preds = %after_check20, %voiderr14 + %69 = getelementptr inbounds <6 x i32>, ptr %y, i64 0, i64 2 + %70 = insertvalue %"int[]" undef, ptr %69, 0 + %71 = insertvalue %"int[]" %70, i64 3, 1 + %72 = load %"int[][]", ptr %a, align 8 + %73 = extractvalue %"int[][]" %72, 0 + %ptroffset22 = getelementptr inbounds %"int[]", ptr %73, i64 0 + store %"int[]" %71, ptr %ptroffset22, align 8 + %74 = insertvalue %variant undef, ptr %a, 0 + %75 = insertvalue %variant %74, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 + %76 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 + store %variant %75, ptr %76, align 16 + %77 = call i64 @std_io_printfn(ptr %retparam23, ptr @.str.4, i64 2, ptr %varargslots24, i64 1) + %not_err25 = icmp eq i64 %77, 0 + br i1 %not_err25, label %after_check26, label %voiderr27 -after_check30: ; preds = %voiderr21 - br label %voiderr31 +after_check26: ; preds = %voiderr21 + br label %voiderr27 -voiderr31: ; preds = %after_check30, %voiderr21 - %109 = getelementptr inbounds <6 x i32>, <6 x i32>* %y, i64 0, i64 2 - %110 = insertvalue %"int[]" undef, i32* %109, 0 - %111 = insertvalue %"int[]" %110, i64 3, 1 - %112 = load %"int[][]", %"int[][]"* %a, align 8 - %113 = extractvalue %"int[][]" %112, 0 - %ptroffset32 = getelementptr inbounds %"int[]", %"int[]"* %113, i64 0 - store %"int[]" %111, %"int[]"* %ptroffset32, align 8 - %114 = bitcast %"int[][]"* %a to i8* - %115 = insertvalue %variant undef, i8* %114, 0 - %116 = insertvalue %variant %115, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 - %117 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots34, i64 0, i64 0 - store %variant %116, %variant* %117, align 16 - %118 = bitcast [1 x %variant]* %varargslots34 to %variant* - %119 = insertvalue %"variant[]" undef, %variant* %118, 0 - %120 = insertvalue %"variant[]" %119, i64 1, 1 - store %"variant[]" %120, %"variant[]"* %taddr35, align 8 - %121 = bitcast %"variant[]"* %taddr35 to { i8*, i64 }* - %122 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %121, i32 0, i32 0 - %lo36 = load i8*, i8** %122, align 8 - %123 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %121, i32 0, i32 1 - %hi37 = load i64, i64* %123, align 8 - %124 = call i64 @std_io_printfln(i64* %retparam33, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo36, i64 %hi37) - %not_err38 = icmp eq i64 %124, 0 - br i1 %not_err38, label %after_check39, label %voiderr40 - -after_check39: ; preds = %voiderr31 - br label %voiderr40 - -voiderr40: ; preds = %after_check39, %voiderr31 +voiderr27: ; preds = %after_check26, %voiderr21 ret void } diff --git a/test/test_suite/statements/comparison_widening.c3t b/test/test_suite/statements/comparison_widening.c3t index 2ceef4f9a..5e873dbb8 100644 --- a/test/test_suite/statements/comparison_widening.c3t +++ b/test/test_suite/statements/comparison_widening.c3t @@ -16,19 +16,19 @@ entry: %b = alloca i32, align 4 %c = alloca i8, align 1 %d = alloca i32, align 4 - store i8 1, i8* %a, align 1 - store i32 2, i32* %b, align 4 - %0 = load i32, i32* %b, align 4 - %1 = load i8, i8* %a, align 1 + store i8 1, ptr %a, align 1 + store i32 2, ptr %b, align 4 + %0 = load i32, ptr %b, align 4 + %1 = load i8, ptr %a, align 1 %zext = zext i8 %1 to i32 %gt = icmp sgt i32 %0, %zext %check = icmp sge i32 %zext, 0 %siui-gt = and i1 %check, %gt %ternary = select i1 %siui-gt, i8 1, i8 0 - store i8 %ternary, i8* %c, align 1 - %2 = load i32, i32* %b, align 4 + store i8 %ternary, ptr %c, align 1 + %2 = load i32, ptr %b, align 4 %intbool = icmp ne i32 %2, 0 %ternary1 = select i1 %intbool, i32 %2, i32 1 - store i32 %ternary1, i32* %d, align 4 + store i32 %ternary1, ptr %d, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite/statements/custom_foreach_with_ref.c3t b/test/test_suite/statements/custom_foreach_with_ref.c3t index b45996738..965410748 100644 --- a/test/test_suite/statements/custom_foreach_with_ref.c3t +++ b/test/test_suite/statements/custom_foreach_with_ref.c3t @@ -102,39 +102,37 @@ fn void main() @.str.12 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 @.str.13 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 -define void @foo_getFields([5 x i32]* noalias sret([5 x i32]) align 4 %0) #0 { +define void @foo_getFields(ptr noalias sret([5 x i32]) align 4 %0) #0 { entry: %literal = alloca [5 x i32], align 16 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) - %1 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 0 - store i32 3, i32* %1, align 4 - %2 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 1 - store i32 5, i32* %2, align 4 - %3 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 2 - store i32 2, i32* %3, align 4 - %4 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 3 - store i32 10, i32* %4, align 4 - %5 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 4 - store i32 111, i32* %5, align 4 - %6 = bitcast [5 x i32]* %0 to i8* - %7 = bitcast [5 x i32]* %literal to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %6, i8* align 4 %7, i32 20, i1 false) + call void (ptr, ...) @printf(ptr @.str) + %1 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 0 + store i32 3, ptr %1, align 4 + %2 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 1 + store i32 5, ptr %2, align 4 + %3 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 2 + store i32 2, ptr %3, align 4 + %4 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 3 + store i32 10, ptr %4, align 4 + %5 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 4 + store i32 111, ptr %5, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 20, i1 false) ret void } -; Function Attrs: nounwind -define %Foo* @foo_call(%Foo* %0) #0 { +define ptr @foo_call(ptr %0) #0 { entry: - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0)) - ret %Foo* %0 + call void (ptr, ...) @printf(ptr @.str.1) + ret ptr %0 } + define void @foo_main() #0 { entry: %x = alloca %Foo, align 4 %a = alloca i32, align 4 %a1 = alloca i32, align 4 %a3 = alloca i32, align 4 - %.anon = alloca %Foo*, align 8 + %.anon = alloca ptr, align 8 %.anon5 = alloca i32, align 4 %.anon6 = alloca i32, align 4 %i = alloca i32, align 4 @@ -143,7 +141,7 @@ entry: %.anon9 = alloca i32, align 4 %.anon10 = alloca i32, align 4 %i14 = alloca i32, align 4 - %y15 = alloca i32*, align 8 + %y15 = alloca ptr, align 8 %a16 = alloca i32, align 4 %.anon21 = alloca i32, align 4 %.anon22 = alloca i32, align 4 @@ -168,314 +166,312 @@ entry: %.anon65 = alloca i64, align 8 %i69 = alloca i64, align 8 %y70 = alloca i32, align 4 - %.anon73 = alloca [5 x i32]*, align 8 + %.anon73 = alloca ptr, align 8 %sretparam = alloca [5 x i32], align 4 %.anon74 = alloca i64, align 8 %i78 = alloca i64, align 8 %y79 = alloca i32, align 4 %a82 = alloca i32, align 4 %a84 = alloca i32, align 4 - %y86 = alloca i32*, align 8 + %y86 = alloca ptr, align 8 %a87 = alloca i32, align 4 %a90 = alloca i32, align 4 %a92 = alloca i32, align 4 - %0 = bitcast %Foo* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 12, i1 false) - store i32 0, i32* %a, align 4 - %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %2 = load i32, i32* %a, align 4 - %sisiext = sext i32 %2 to i64 - %3 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 0, i64 %sisiext - %4 = load i32, i32* %3, align 4 - store i32 1, i32* %a1, align 4 - %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %6 = load i32, i32* %a1, align 4 - %sisiext2 = sext i32 %6 to i64 - %7 = getelementptr inbounds [3 x i32], [3 x i32]* %5, i64 0, i64 %sisiext2 - %8 = load i32, i32* %7, align 4 - store i32 2, i32* %a3, align 4 - %9 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %10 = load i32, i32* %a3, align 4 - %sisiext4 = sext i32 %10 to i64 - %11 = getelementptr inbounds [3 x i32], [3 x i32]* %9, i64 0, i64 %sisiext4 - %12 = load i32, i32* %11, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %4, i32 %8, i32 %12) - %13 = call %Foo* @foo_call(%Foo* %x) - store %Foo* %13, %Foo** %.anon, align 8 - store i32 3, i32* %.anon5, align 4 - store i32 0, i32* %.anon6, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + store i32 0, ptr %a, align 4 + %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %1 = load i32, ptr %a, align 4 + %sisiext = sext i32 %1 to i64 + %2 = getelementptr inbounds [3 x i32], ptr %0, i64 0, i64 %sisiext + %3 = load i32, ptr %2, align 4 + store i32 1, ptr %a1, align 4 + %4 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %5 = load i32, ptr %a1, align 4 + %sisiext2 = sext i32 %5 to i64 + %6 = getelementptr inbounds [3 x i32], ptr %4, i64 0, i64 %sisiext2 + %7 = load i32, ptr %6, align 4 + store i32 2, ptr %a3, align 4 + %8 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %9 = load i32, ptr %a3, align 4 + %sisiext4 = sext i32 %9 to i64 + %10 = getelementptr inbounds [3 x i32], ptr %8, i64 0, i64 %sisiext4 + %11 = load i32, ptr %10, align 4 + call void (ptr, ...) @printf(ptr @.str.2, i32 %3, i32 %7, i32 %11) + %12 = call ptr @foo_call(ptr %x) + store ptr %12, ptr %.anon, align 8 + store i32 3, ptr %.anon5, align 4 + store i32 0, ptr %.anon6, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %14 = load i32, i32* %.anon6, align 4 - %15 = load i32, i32* %.anon5, align 4 - %lt = icmp slt i32 %14, %15 + %13 = load i32, ptr %.anon6, align 4 + %14 = load i32, ptr %.anon5, align 4 + %lt = icmp slt i32 %13, %14 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %16 = load i32, i32* %.anon6, align 4 - store i32 %16, i32* %i, align 4 - %17 = load %Foo*, %Foo** %.anon, align 8 - %18 = load i32, i32* %.anon6, align 4 - store i32 %18, i32* %a7, align 4 - %19 = getelementptr inbounds %Foo, %Foo* %17, i32 0, i32 0 - %20 = load i32, i32* %a7, align 4 - %sisiext8 = sext i32 %20 to i64 - %21 = getelementptr inbounds [3 x i32], [3 x i32]* %19, i64 0, i64 %sisiext8 - %22 = load i32, i32* %21, align 4 - store i32 %22, i32* %y, align 4 - %23 = load i32, i32* %i, align 4 - %24 = load i32, i32* %y, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 %23, i32 %24) - %25 = load i32, i32* %.anon6, align 4 - %add = add i32 %25, 1 - store i32 %add, i32* %.anon6, align 4 + %15 = load i32, ptr %.anon6, align 4 + store i32 %15, ptr %i, align 4 + %16 = load ptr, ptr %.anon, align 8 + %17 = load i32, ptr %.anon6, align 4 + store i32 %17, ptr %a7, align 4 + %18 = getelementptr inbounds %Foo, ptr %16, i32 0, i32 0 + %19 = load i32, ptr %a7, align 4 + %sisiext8 = sext i32 %19 to i64 + %20 = getelementptr inbounds [3 x i32], ptr %18, i64 0, i64 %sisiext8 + %21 = load i32, ptr %20, align 4 + store i32 %21, ptr %y, align 4 + %22 = load i32, ptr %i, align 4 + %23 = load i32, ptr %y, align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %22, i32 %23) + %24 = load i32, ptr %.anon6, align 4 + %add = add i32 %24, 1 + store i32 %add, ptr %.anon6, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - store i32 3, i32* %.anon9, align 4 - store i32 0, i32* %.anon10, align 4 + store i32 3, ptr %.anon9, align 4 + store i32 0, ptr %.anon10, align 4 br label %loop.cond11 loop.cond11: ; preds = %loop.body13, %loop.exit - %26 = load i32, i32* %.anon10, align 4 - %27 = load i32, i32* %.anon9, align 4 - %lt12 = icmp slt i32 %26, %27 + %25 = load i32, ptr %.anon10, align 4 + %26 = load i32, ptr %.anon9, align 4 + %lt12 = icmp slt i32 %25, %26 br i1 %lt12, label %loop.body13, label %loop.exit20 loop.body13: ; preds = %loop.cond11 - %28 = load i32, i32* %.anon10, align 4 - store i32 %28, i32* %i14, align 4 - %29 = load i32, i32* %.anon10, align 4 - store i32 %29, i32* %a16, align 4 - %30 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %31 = load i32, i32* %a16, align 4 - %sisiext17 = sext i32 %31 to i64 - %32 = getelementptr inbounds [3 x i32], [3 x i32]* %30, i64 0, i64 %sisiext17 - store i32* %32, i32** %y15, align 8 - %33 = load i32*, i32** %y15, align 8 - %34 = load i32, i32* %33, align 8 - %add18 = add i32 %34, 1 - store i32 %add18, i32* %33, align 8 - %35 = load i32, i32* %i14, align 4 - %36 = load i32*, i32** %y15, align 8 - %37 = load i32, i32* %36, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37) - %38 = load i32, i32* %.anon10, align 4 - %add19 = add i32 %38, 1 - store i32 %add19, i32* %.anon10, align 4 + %27 = load i32, ptr %.anon10, align 4 + store i32 %27, ptr %i14, align 4 + %28 = load i32, ptr %.anon10, align 4 + store i32 %28, ptr %a16, align 4 + %29 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %30 = load i32, ptr %a16, align 4 + %sisiext17 = sext i32 %30 to i64 + %31 = getelementptr inbounds [3 x i32], ptr %29, i64 0, i64 %sisiext17 + store ptr %31, ptr %y15, align 8 + %32 = load ptr, ptr %y15, align 8 + %33 = load i32, ptr %32, align 8 + %add18 = add i32 %33, 1 + store i32 %add18, ptr %32, align 8 + %34 = load i32, ptr %i14, align 4 + %35 = load ptr, ptr %y15, align 8 + %36 = load i32, ptr %35, align 8 + call void (ptr, ...) @printf(ptr @.str.4, i32 %34, i32 %36) + %37 = load i32, ptr %.anon10, align 4 + %add19 = add i32 %37, 1 + store i32 %add19, ptr %.anon10, align 4 br label %loop.cond11 loop.exit20: ; preds = %loop.cond11 - store i32 3, i32* %.anon21, align 4 - store i32 0, i32* %.anon22, align 4 + store i32 3, ptr %.anon21, align 4 + store i32 0, ptr %.anon22, align 4 br label %loop.cond23 loop.cond23: ; preds = %loop.body25, %loop.exit20 - %39 = load i32, i32* %.anon22, align 4 - %40 = load i32, i32* %.anon21, align 4 - %lt24 = icmp slt i32 %39, %40 + %38 = load i32, ptr %.anon22, align 4 + %39 = load i32, ptr %.anon21, align 4 + %lt24 = icmp slt i32 %38, %39 br i1 %lt24, label %loop.body25, label %loop.exit31 loop.body25: ; preds = %loop.cond23 - %41 = load i32, i32* %.anon22, align 4 - store i32 %41, i32* %i26, align 4 - %42 = load i32, i32* %.anon22, align 4 - store i32 %42, i32* %a28, align 4 - %43 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %44 = load i32, i32* %a28, align 4 - %sisiext29 = sext i32 %44 to i64 - %45 = getelementptr inbounds [3 x i32], [3 x i32]* %43, i64 0, i64 %sisiext29 - %46 = load i32, i32* %45, align 4 - store i32 %46, i32* %y27, align 4 - %47 = load i32, i32* %i26, align 4 - %48 = load i32, i32* %y27, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.5, i32 0, i32 0), i32 %47, i32 %48) - %49 = load i32, i32* %.anon22, align 4 - %add30 = add i32 %49, 1 - store i32 %add30, i32* %.anon22, align 4 + %40 = load i32, ptr %.anon22, align 4 + store i32 %40, ptr %i26, align 4 + %41 = load i32, ptr %.anon22, align 4 + store i32 %41, ptr %a28, align 4 + %42 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %43 = load i32, ptr %a28, align 4 + %sisiext29 = sext i32 %43 to i64 + %44 = getelementptr inbounds [3 x i32], ptr %42, i64 0, i64 %sisiext29 + %45 = load i32, ptr %44, align 4 + store i32 %45, ptr %y27, align 4 + %46 = load i32, ptr %i26, align 4 + %47 = load i32, ptr %y27, align 4 + call void (ptr, ...) @printf(ptr @.str.5, i32 %46, i32 %47) + %48 = load i32, ptr %.anon22, align 4 + %add30 = add i32 %48, 1 + store i32 %add30, ptr %.anon22, align 4 br label %loop.cond23 loop.exit31: ; preds = %loop.cond23 - store i32 3, i32* %.anon32, align 4 - store i32 0, i32* %.anon33, align 4 + store i32 3, ptr %.anon32, align 4 + store i32 0, ptr %.anon33, align 4 br label %loop.cond34 loop.cond34: ; preds = %loop.body36, %loop.exit31 - %50 = load i32, i32* %.anon33, align 4 - %51 = load i32, i32* %.anon32, align 4 - %lt35 = icmp slt i32 %50, %51 + %49 = load i32, ptr %.anon33, align 4 + %50 = load i32, ptr %.anon32, align 4 + %lt35 = icmp slt i32 %49, %50 br i1 %lt35, label %loop.body36, label %loop.exit42 loop.body36: ; preds = %loop.cond34 - %52 = load i32, i32* %.anon33, align 4 - store i32 %52, i32* %i37, align 4 - %53 = load i32, i32* %.anon33, align 4 - store i32 %53, i32* %a39, align 4 - %54 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %55 = load i32, i32* %a39, align 4 - %sisiext40 = sext i32 %55 to i64 - %56 = getelementptr inbounds [3 x i32], [3 x i32]* %54, i64 0, i64 %sisiext40 - %57 = load i32, i32* %56, align 4 - store i32 %57, i32* %y38, align 4 - %58 = load i32, i32* %i37, align 4 - %59 = load i32, i32* %y38, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.6, i32 0, i32 0), i32 %58, i32 %59) - %60 = load i32, i32* %.anon33, align 4 - %add41 = add i32 %60, 1 - store i32 %add41, i32* %.anon33, align 4 + %51 = load i32, ptr %.anon33, align 4 + store i32 %51, ptr %i37, align 4 + %52 = load i32, ptr %.anon33, align 4 + store i32 %52, ptr %a39, align 4 + %53 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %54 = load i32, ptr %a39, align 4 + %sisiext40 = sext i32 %54 to i64 + %55 = getelementptr inbounds [3 x i32], ptr %53, i64 0, i64 %sisiext40 + %56 = load i32, ptr %55, align 4 + store i32 %56, ptr %y38, align 4 + %57 = load i32, ptr %i37, align 4 + %58 = load i32, ptr %y38, align 4 + call void (ptr, ...) @printf(ptr @.str.6, i32 %57, i32 %58) + %59 = load i32, ptr %.anon33, align 4 + %add41 = add i32 %59, 1 + store i32 %add41, ptr %.anon33, align 4 br label %loop.cond34 loop.exit42: ; preds = %loop.cond34 - store i32 3, i32* %.anon43, align 4 - store i32 0, i32* %.anon44, align 4 + store i32 3, ptr %.anon43, align 4 + store i32 0, ptr %.anon44, align 4 br label %loop.cond45 loop.cond45: ; preds = %loop.body47, %loop.exit42 - %61 = load i32, i32* %.anon44, align 4 - %62 = load i32, i32* %.anon43, align 4 - %lt46 = icmp slt i32 %61, %62 + %60 = load i32, ptr %.anon44, align 4 + %61 = load i32, ptr %.anon43, align 4 + %lt46 = icmp slt i32 %60, %61 br i1 %lt46, label %loop.body47, label %loop.exit54 loop.body47: ; preds = %loop.cond45 - %63 = load i32, i32* %.anon44, align 4 - store i32 %63, i32* %i48, align 4 - %64 = load i32, i32* %.anon44, align 4 - store i32 %64, i32* %a50, align 4 - %65 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %66 = load i32, i32* %a50, align 4 - %sisiext51 = sext i32 %66 to i64 - %67 = getelementptr inbounds [3 x i32], [3 x i32]* %65, i64 0, i64 %sisiext51 - %68 = load i32, i32* %67, align 4 - store i32 %68, i32* %y49, align 4 - %69 = load i32, i32* %i48, align 4 - %70 = load i32, i32* %y49, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.7, i32 0, i32 0), i32 %69, i32 %70) - %71 = load i32, i32* %i48, align 4 - %add52 = add i32 %71, 1 - store i32 %add52, i32* %i48, align 4 - %72 = load i32, i32* %.anon44, align 4 - %add53 = add i32 %72, 1 - store i32 %add53, i32* %.anon44, align 4 + %62 = load i32, ptr %.anon44, align 4 + store i32 %62, ptr %i48, align 4 + %63 = load i32, ptr %.anon44, align 4 + store i32 %63, ptr %a50, align 4 + %64 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %65 = load i32, ptr %a50, align 4 + %sisiext51 = sext i32 %65 to i64 + %66 = getelementptr inbounds [3 x i32], ptr %64, i64 0, i64 %sisiext51 + %67 = load i32, ptr %66, align 4 + store i32 %67, ptr %y49, align 4 + %68 = load i32, ptr %i48, align 4 + %69 = load i32, ptr %y49, align 4 + call void (ptr, ...) @printf(ptr @.str.7, i32 %68, i32 %69) + %70 = load i32, ptr %i48, align 4 + %add52 = add i32 %70, 1 + store i32 %add52, ptr %i48, align 4 + %71 = load i32, ptr %.anon44, align 4 + %add53 = add i32 %71, 1 + store i32 %add53, ptr %.anon44, align 4 br label %loop.cond45 loop.exit54: ; preds = %loop.cond45 - %73 = bitcast [5 x i32]* %.anon55 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %73, i8* align 16 bitcast ([5 x i32]* @.__const.8 to i8*), i32 20, i1 false) - store i64 0, i64* %.anon56, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %.anon55, ptr align 16 @.__const.8, i32 20, i1 false) + store i64 0, ptr %.anon56, align 8 br label %loop.cond57 loop.cond57: ; preds = %loop.body58, %loop.exit54 - %74 = load i64, i64* %.anon56, align 8 - %gt = icmp ugt i64 5, %74 + %72 = load i64, ptr %.anon56, align 8 + %gt = icmp ugt i64 5, %72 br i1 %gt, label %loop.body58, label %loop.exit63 loop.body58: ; preds = %loop.cond57 - %75 = load i64, i64* %.anon56, align 8 - store i64 %75, i64* %i59, align 8 - %76 = load i64, i64* %.anon56, align 8 - %77 = getelementptr inbounds [5 x i32], [5 x i32]* %.anon55, i64 0, i64 %76 - %78 = load i32, i32* %77, align 4 - store i32 %78, i32* %y60, align 4 - %79 = load i64, i64* %i59, align 8 - %80 = load i32, i32* %y60, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.9, i32 0, i32 0), i64 %79, i32 %80) - %81 = load i64, i64* %i59, align 8 - %add61 = add i64 %81, 1 - store i64 %add61, i64* %i59, align 8 - %82 = load i64, i64* %.anon56, align 8 - %add62 = add i64 %82, 1 - store i64 %add62, i64* %.anon56, align 8 + %73 = load i64, ptr %.anon56, align 8 + store i64 %73, ptr %i59, align 8 + %74 = load i64, ptr %.anon56, align 8 + %75 = getelementptr inbounds [5 x i32], ptr %.anon55, i64 0, i64 %74 + %76 = load i32, ptr %75, align 4 + store i32 %76, ptr %y60, align 4 + %77 = load i64, ptr %i59, align 8 + %78 = load i32, ptr %y60, align 4 + call void (ptr, ...) @printf(ptr @.str.9, i64 %77, i32 %78) + %79 = load i64, ptr %i59, align 8 + %add61 = add i64 %79, 1 + store i64 %add61, ptr %i59, align 8 + %80 = load i64, ptr %.anon56, align 8 + %add62 = add i64 %80, 1 + store i64 %add62, ptr %.anon56, align 8 br label %loop.cond57 loop.exit63: ; preds = %loop.cond57 - call void @foo_getFields([5 x i32]* sret([5 x i32]) align 4 %.anon64) - store i64 0, i64* %.anon65, align 8 + call void @foo_getFields(ptr sret([5 x i32]) align 4 %.anon64) + store i64 0, ptr %.anon65, align 8 br label %loop.cond66 loop.cond66: ; preds = %loop.body68, %loop.exit63 - %83 = load i64, i64* %.anon65, align 8 - %gt67 = icmp ugt i64 5, %83 + %81 = load i64, ptr %.anon65, align 8 + %gt67 = icmp ugt i64 5, %81 br i1 %gt67, label %loop.body68, label %loop.exit72 loop.body68: ; preds = %loop.cond66 - %84 = load i64, i64* %.anon65, align 8 - store i64 %84, i64* %i69, align 8 - %85 = load i64, i64* %.anon65, align 8 - %86 = getelementptr inbounds [5 x i32], [5 x i32]* %.anon64, i64 0, i64 %85 - %87 = load i32, i32* %86, align 4 - store i32 %87, i32* %y70, align 4 - %88 = load i64, i64* %i69, align 8 - %89 = load i32, i32* %y70, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.10, i32 0, i32 0), i64 %88, i32 %89) - %90 = load i64, i64* %.anon65, align 8 - %add71 = add i64 %90, 1 - store i64 %add71, i64* %.anon65, align 8 + %82 = load i64, ptr %.anon65, align 8 + store i64 %82, ptr %i69, align 8 + %83 = load i64, ptr %.anon65, align 8 + %84 = getelementptr inbounds [5 x i32], ptr %.anon64, i64 0, i64 %83 + %85 = load i32, ptr %84, align 4 + store i32 %85, ptr %y70, align 4 + %86 = load i64, ptr %i69, align 8 + %87 = load i32, ptr %y70, align 4 + call void (ptr, ...) @printf(ptr @.str.10, i64 %86, i32 %87) + %88 = load i64, ptr %.anon65, align 8 + %add71 = add i64 %88, 1 + store i64 %add71, ptr %.anon65, align 8 br label %loop.cond66 loop.exit72: ; preds = %loop.cond66 - call void @foo_getFields([5 x i32]* sret([5 x i32]) align 4 %sretparam) - store [5 x i32]* %sretparam, [5 x i32]** %.anon73, align 8 - store i64 0, i64* %.anon74, align 8 + call void @foo_getFields(ptr sret([5 x i32]) align 4 %sretparam) + store ptr %sretparam, ptr %.anon73, align 8 + store i64 0, ptr %.anon74, align 8 br label %loop.cond75 loop.cond75: ; preds = %loop.body77, %loop.exit72 - %91 = load i64, i64* %.anon74, align 8 - %gt76 = icmp ugt i64 5, %91 + %89 = load i64, ptr %.anon74, align 8 + %gt76 = icmp ugt i64 5, %89 br i1 %gt76, label %loop.body77, label %loop.exit81 loop.body77: ; preds = %loop.cond75 - %92 = load i64, i64* %.anon74, align 8 - store i64 %92, i64* %i78, align 8 - %93 = load [5 x i32]*, [5 x i32]** %.anon73, align 8 - %94 = load i64, i64* %.anon74, align 8 - %95 = getelementptr inbounds [5 x i32], [5 x i32]* %93, i64 0, i64 %94 - %96 = load i32, i32* %95, align 4 - store i32 %96, i32* %y79, align 4 - %97 = load i64, i64* %i78, align 8 - %98 = load i32, i32* %y79, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i32 0, i32 0), i64 %97, i32 %98) - %99 = load i64, i64* %.anon74, align 8 - %add80 = add i64 %99, 1 - store i64 %add80, i64* %.anon74, align 8 + %90 = load i64, ptr %.anon74, align 8 + store i64 %90, ptr %i78, align 8 + %91 = load ptr, ptr %.anon73, align 8 + %92 = load i64, ptr %.anon74, align 8 + %93 = getelementptr inbounds [5 x i32], ptr %91, i64 0, i64 %92 + %94 = load i32, ptr %93, align 4 + store i32 %94, ptr %y79, align 4 + %95 = load i64, ptr %i78, align 8 + %96 = load i32, ptr %y79, align 4 + call void (ptr, ...) @printf(ptr @.str.11, i64 %95, i32 %96) + %97 = load i64, ptr %.anon74, align 8 + %add80 = add i64 %97, 1 + store i64 %add80, ptr %.anon74, align 8 br label %loop.cond75 loop.exit81: ; preds = %loop.cond75 - store i32 0, i32* %a82, align 4 - %100 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %101 = load i32, i32* %a82, align 4 - %sisiext83 = sext i32 %101 to i64 - %102 = getelementptr inbounds [3 x i32], [3 x i32]* %100, i64 0, i64 %sisiext83 - %103 = load i32, i32* %102, align 4 - store i32 1, i32* %a84, align 4 - %104 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %105 = load i32, i32* %a84, align 4 - %sisiext85 = sext i32 %105 to i64 - %106 = getelementptr inbounds [3 x i32], [3 x i32]* %104, i64 0, i64 %sisiext85 - %107 = load i32, i32* %106, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i32 0, i32 0), i32 %103, i32 %107) - store i32 1, i32* %a87, align 4 - %108 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %109 = load i32, i32* %a87, align 4 - %sisiext88 = sext i32 %109 to i64 - %110 = getelementptr inbounds [3 x i32], [3 x i32]* %108, i64 0, i64 %sisiext88 - store i32* %110, i32** %y86, align 8 - %111 = load i32*, i32** %y86, align 8 - %112 = load i32, i32* %111, align 8 - %add89 = add i32 %112, 1 - store i32 %add89, i32* %111, align 8 - store i32 0, i32* %a90, align 4 - %113 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %114 = load i32, i32* %a90, align 4 - %sisiext91 = sext i32 %114 to i64 - %115 = getelementptr inbounds [3 x i32], [3 x i32]* %113, i64 0, i64 %sisiext91 - %116 = load i32, i32* %115, align 4 - store i32 1, i32* %a92, align 4 - %117 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %118 = load i32, i32* %a92, align 4 - %sisiext93 = sext i32 %118 to i64 - %119 = getelementptr inbounds [3 x i32], [3 x i32]* %117, i64 0, i64 %sisiext93 - %120 = load i32, i32* %119, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.13, i32 0, i32 0), i32 %116, i32 %120) + store i32 0, ptr %a82, align 4 + %98 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %99 = load i32, ptr %a82, align 4 + %sisiext83 = sext i32 %99 to i64 + %100 = getelementptr inbounds [3 x i32], ptr %98, i64 0, i64 %sisiext83 + %101 = load i32, ptr %100, align 4 + store i32 1, ptr %a84, align 4 + %102 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %103 = load i32, ptr %a84, align 4 + %sisiext85 = sext i32 %103 to i64 + %104 = getelementptr inbounds [3 x i32], ptr %102, i64 0, i64 %sisiext85 + %105 = load i32, ptr %104, align 4 + call void (ptr, ...) @printf(ptr @.str.12, i32 %101, i32 %105) + store i32 1, ptr %a87, align 4 + %106 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %107 = load i32, ptr %a87, align 4 + %sisiext88 = sext i32 %107 to i64 + %108 = getelementptr inbounds [3 x i32], ptr %106, i64 0, i64 %sisiext88 + store ptr %108, ptr %y86, align 8 + %109 = load ptr, ptr %y86, align 8 + %110 = load i32, ptr %109, align 8 + %add89 = add i32 %110, 1 + store i32 %add89, ptr %109, align 8 + store i32 0, ptr %a90, align 4 + %111 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %112 = load i32, ptr %a90, align 4 + %sisiext91 = sext i32 %112 to i64 + %113 = getelementptr inbounds [3 x i32], ptr %111, i64 0, i64 %sisiext91 + %114 = load i32, ptr %113, align 4 + store i32 1, ptr %a92, align 4 + %115 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %116 = load i32, ptr %a92, align 4 + %sisiext93 = sext i32 %116 to i64 + %117 = getelementptr inbounds [3 x i32], ptr %115, i64 0, i64 %sisiext93 + %118 = load i32, ptr %117, align 4 + call void (ptr, ...) @printf(ptr @.str.13, i32 %114, i32 %118) ret void } diff --git a/test/test_suite/statements/defer_break.c3t b/test/test_suite/statements/defer_break.c3t index 33eb2c9f6..50260f094 100644 --- a/test/test_suite/statements/defer_break.c3t +++ b/test/test_suite/statements/defer_break.c3t @@ -47,12 +47,12 @@ fn int main(int argc, char** argv) /* #expect: foo.ll -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: %a = alloca i32, align 4 - store i32 0, i32* %a, align 4 + store i32 0, ptr %a, align 4 call void @foo_defer2() - %2 = load i32, i32* %a, align 4 + %2 = load i32, ptr %a, align 4 %eq = icmp eq i32 %2, 1 br i1 %eq, label %if.then, label %if.exit @@ -67,7 +67,7 @@ loop.exit: ; preds = %if.exit, %if.then br label %loop.cond loop.cond: ; preds = %if.exit3, %loop.exit - %3 = load i32, i32* %a, align 4 + %3 = load i32, ptr %a, align 4 %intbool = icmp ne i32 %3, 0 br i1 %intbool, label %loop.body, label %loop.exit4 @@ -89,7 +89,7 @@ loop.exit4: ; preds = %if.then2, %loop.con br label %loop.cond5 loop.cond5: ; preds = %loop.exit4 - %4 = load i32, i32* %a, align 4 + %4 = load i32, ptr %a, align 4 %intbool6 = icmp ne i32 %4, 0 br i1 %intbool6, label %loop.body7, label %loop.exit11 diff --git a/test/test_suite/statements/defer_break_simple.c3t b/test/test_suite/statements/defer_break_simple.c3t index d361d72b8..ccf939509 100644 --- a/test/test_suite/statements/defer_break_simple.c3t +++ b/test/test_suite/statements/defer_break_simple.c3t @@ -25,16 +25,14 @@ fn int main(int argc, char** argv) /* #expect: test.ll - - -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: %a = alloca i32, align 4 - store i32 0, i32* %a, align 4 + store i32 0, ptr %a, align 4 br label %loop.cond loop.cond: ; preds = %if.exit, %entry - %2 = load i32, i32* %a, align 4 + %2 = load i32, ptr %a, align 4 %intbool = icmp ne i32 %2, 0 br i1 %intbool, label %loop.body, label %loop.exit diff --git a/test/test_suite/statements/defer_break_switch.c3t b/test/test_suite/statements/defer_break_switch.c3t index 76be862d3..d70f10eb4 100644 --- a/test/test_suite/statements/defer_break_switch.c3t +++ b/test/test_suite/statements/defer_break_switch.c3t @@ -25,19 +25,19 @@ define void @defer_break_switch_test(i32 %0) #0 { entry: %b = alloca i8, align 1 %switch = alloca i32, align 4 - store i8 1, i8* %b, align 1 - store i32 %0, i32* %switch, align 4 + store i8 1, ptr %b, align 1 + store i32 %0, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i32, i32* %switch, align 4 + %1 = load i32, ptr %switch, align 4 switch i32 %1, label %switch.exit [ i32 1, label %switch.case i32 2, label %switch.case1 ] switch.case: ; preds = %switch.entry - %2 = load i8, i8* %b, align 1 + %2 = load i8, ptr %b, align 1 %3 = trunc i8 %2 to i1 br i1 %3, label %if.then, label %if.exit diff --git a/test/test_suite/statements/defer_do_while.c3t b/test/test_suite/statements/defer_do_while.c3t index 0902d19c7..3cd84eaae 100644 --- a/test/test_suite/statements/defer_do_while.c3t +++ b/test/test_suite/statements/defer_do_while.c3t @@ -16,21 +16,21 @@ fn void test() define void @foo_test() #0 { entry: %a = alloca i32, align 4 - store i32 0, i32* %a, align 4 + store i32 0, ptr %a, align 4 br label %loop.body loop.cond: ; preds = %loop.body - %0 = load i32, i32* %a, align 4 + %0 = load i32, ptr %a, align 4 %lt = icmp slt i32 %0, 10 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond, %entry - %1 = load i32, i32* %a, align 4 + %1 = load i32, ptr %a, align 4 %add = add i32 %1, 1 - store i32 %add, i32* %a, align 4 - %2 = load i32, i32* %a, align 4 + store i32 %add, ptr %a, align 4 + %2 = load i32, ptr %a, align 4 %add1 = add i32 %2, 1 - store i32 %add1, i32* %a, align 4 + store i32 %add1, ptr %a, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond diff --git a/test/test_suite/statements/defer_in_block.c3t b/test/test_suite/statements/defer_in_block.c3t index f21d4509d..df2e63eed 100644 --- a/test/test_suite/statements/defer_in_block.c3t +++ b/test/test_suite/statements/defer_in_block.c3t @@ -31,41 +31,57 @@ fn void main() define void @foo_test(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %0, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %mul = mul i32 %1, 2 - store i32 %mul, i32* %x, align 4 - %2 = load i32, i32* %x, align 4 + store i32 %mul, ptr %x, align 4 + %2 = load i32, ptr %x, align 4 %lt = icmp slt i32 %2, 100 br i1 %lt, label %if.then, label %if.exit + if.then: ; preds = %entry - %3 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i32 %3) + %3 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %3) br label %expr_block.exit + if.exit: ; preds = %entry - %4 = load i32, i32* %x, align 4 + %4 = load i32, ptr %x, align 4 %mul1 = mul i32 %4, 10000 - store i32 %mul1, i32* %x, align 4 - %5 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 %5) + store i32 %mul1, ptr %x, align 4 + %5 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %5) br label %expr_block.exit + expr_block.exit: ; preds = %if.exit, %if.then - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0)) - %6 = load i32, i32* %x, align 4 + call void (ptr, ...) @printf(ptr @.str.2) + %6 = load i32, ptr %x, align 4 %eq = icmp eq i32 %6, 0 br i1 %eq, label %if.then2, label %if.exit3 + if.then2: ; preds = %expr_block.exit - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0)) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.3) + call void (ptr, ...) @printf(ptr @.str.4) ret void + if.exit3: ; preds = %expr_block.exit - %7 = load i32, i32* %x, align 4 + %7 = load i32, ptr %x, align 4 %eq4 = icmp eq i32 %7, 1 br i1 %eq4, label %if.then5, label %if.exit6 + if.then5: ; preds = %if.exit3 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.5) ret void + if.exit6: ; preds = %if.exit3 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.6) + ret void +} + +; Function Attrs: nounwind +define void @foo_main() #0 { +entry: + call void @foo_test(i32 123) + call void @foo_test(i32 1) + call void @foo_test(i32 0) ret void } diff --git a/test/test_suite/statements/defer_in_defer2.c3t b/test/test_suite/statements/defer_in_defer2.c3t index 78223bc23..173cb87e8 100644 --- a/test/test_suite/statements/defer_in_defer2.c3t +++ b/test/test_suite/statements/defer_in_defer2.c3t @@ -35,86 +35,86 @@ fn void main() define void @test_test(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %0, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %eq = icmp eq i32 %1, 1 br i1 %eq, label %if.then, label %if.exit3 if.then: ; preds = %entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0)) - %2 = load i32, i32* %x, align 4 + call void (ptr, ...) @printf(ptr @.str) + %2 = load i32, ptr %x, align 4 %mul = mul i32 %2, 2 - store i32 %mul, i32* %x, align 4 - %3 = load i32, i32* %x, align 4 + store i32 %mul, ptr %x, align 4 + %3 = load i32, ptr %x, align 4 %lt = icmp slt i32 %3, 100 br i1 %lt, label %if.then1, label %if.exit if.then1: ; preds = %if.then - %4 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 %4) + %4 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %4) br label %loop.exit if.exit: ; preds = %if.then - %5 = load i32, i32* %x, align 4 + %5 = load i32, ptr %x, align 4 %mul2 = mul i32 %5, 10000 - store i32 %mul2, i32* %x, align 4 - %6 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %6) + store i32 %mul2, ptr %x, align 4 + %6 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.2, i32 %6) br label %loop.exit loop.exit: ; preds = %if.exit, %if.then1 ret void if.exit3: ; preds = %entry - %7 = load i32, i32* %x, align 4 + %7 = load i32, ptr %x, align 4 %eq4 = icmp eq i32 %7, 0 br i1 %eq4, label %if.then5, label %if.exit12 if.then5: ; preds = %if.exit3 - %8 = load i32, i32* %x, align 4 + %8 = load i32, ptr %x, align 4 %mul6 = mul i32 %8, 2 - store i32 %mul6, i32* %x, align 4 - %9 = load i32, i32* %x, align 4 + store i32 %mul6, ptr %x, align 4 + %9 = load i32, ptr %x, align 4 %lt7 = icmp slt i32 %9, 100 br i1 %lt7, label %if.then8, label %if.exit9 if.then8: ; preds = %if.then5 - %10 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i32 %10) + %10 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %10) br label %loop.exit11 if.exit9: ; preds = %if.then5 - %11 = load i32, i32* %x, align 4 + %11 = load i32, ptr %x, align 4 %mul10 = mul i32 %11, 10000 - store i32 %mul10, i32* %x, align 4 - %12 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i32 0, i32 0), i32 %12) + store i32 %mul10, ptr %x, align 4 + %12 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %12) br label %loop.exit11 loop.exit11: ; preds = %if.exit9, %if.then8 ret void if.exit12: ; preds = %if.exit3 - %13 = load i32, i32* %x, align 4 + %13 = load i32, ptr %x, align 4 %mul13 = mul i32 %13, 2 - store i32 %mul13, i32* %x, align 4 - %14 = load i32, i32* %x, align 4 + store i32 %mul13, ptr %x, align 4 + %14 = load i32, ptr %x, align 4 %lt14 = icmp slt i32 %14, 100 br i1 %lt14, label %if.then15, label %if.exit16 if.then15: ; preds = %if.exit12 - %15 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 %15) + %15 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.5, i32 %15) br label %loop.exit18 if.exit16: ; preds = %if.exit12 - %16 = load i32, i32* %x, align 4 + %16 = load i32, ptr %x, align 4 %mul17 = mul i32 %16, 10000 - store i32 %mul17, i32* %x, align 4 - %17 = load i32, i32* %x, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i32 %17) + store i32 %mul17, ptr %x, align 4 + %17 = load i32, ptr %x, align 4 + call void (ptr, ...) @printf(ptr @.str.6, i32 %17) br label %loop.exit18 loop.exit18: ; preds = %if.exit16, %if.then15 ret void -} \ No newline at end of file +} diff --git a/test/test_suite/statements/defer_next_switch.c3t b/test/test_suite/statements/defer_next_switch.c3t index f752ba0df..649c25d55 100644 --- a/test/test_suite/statements/defer_next_switch.c3t +++ b/test/test_suite/statements/defer_next_switch.c3t @@ -25,19 +25,19 @@ define void @defer_next_switch_test(i32 %0) #0 { entry: %b = alloca i8, align 1 %switch = alloca i32, align 4 - store i8 1, i8* %b, align 1 - store i32 %0, i32* %switch, align 4 + store i8 1, ptr %b, align 1 + store i32 %0, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i32, i32* %switch, align 4 + %1 = load i32, ptr %switch, align 4 switch i32 %1, label %switch.exit [ i32 1, label %switch.case i32 2, label %switch.case1 ] switch.case: ; preds = %switch.entry - %2 = load i8, i8* %b, align 1 + %2 = load i8, ptr %b, align 1 %3 = trunc i8 %2 to i1 br i1 %3, label %if.then, label %if.exit diff --git a/test/test_suite/statements/defer_return.c3t b/test/test_suite/statements/defer_return.c3t index b20533e6f..28e12ff6e 100644 --- a/test/test_suite/statements/defer_return.c3t +++ b/test/test_suite/statements/defer_return.c3t @@ -36,14 +36,14 @@ fn int main(int argc, char **argv) /* #expect: test.ll -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: %a = alloca i32, align 4 - store i32 0, i32* %a, align 4 + store i32 0, ptr %a, align 4 br label %loop.cond loop.cond: ; preds = %if.exit, %entry - %2 = load i32, i32* %a, align 4 + %2 = load i32, ptr %a, align 4 %intbool = icmp ne i32 %2, 0 br i1 %intbool, label %loop.body, label %loop.exit @@ -52,7 +52,7 @@ loop.body: ; preds = %loop.cond br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %loop.body - %3 = load i32, i32* %a, align 4 + %3 = load i32, ptr %a, align 4 %add = add i32 %3, %0 call void @test_test2() call void @test_test1() @@ -68,7 +68,7 @@ loop.exit: ; preds = %loop.cond br label %loop.cond1 loop.cond1: ; preds = %loop.exit - %4 = load i32, i32* %a, align 4 + %4 = load i32, ptr %a, align 4 %intbool2 = icmp ne i32 %4, 0 br i1 %intbool2, label %loop.body3, label %loop.exit8 @@ -77,7 +77,7 @@ loop.body3: ; preds = %loop.cond1 br i1 %eq4, label %if.then5, label %if.exit7 if.then5: ; preds = %loop.body3 - %5 = load i32, i32* %a, align 4 + %5 = load i32, ptr %a, align 4 %add6 = add i32 %5, 2 call void @test_test6() call void @test_test5() diff --git a/test/test_suite/statements/defer_with_loop.c3t b/test/test_suite/statements/defer_with_loop.c3t index 67da269ef..717e5f771 100644 --- a/test/test_suite/statements/defer_with_loop.c3t +++ b/test/test_suite/statements/defer_with_loop.c3t @@ -38,22 +38,22 @@ entry: 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 + 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, i32* %i, align 4 + %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, i32* %i, align 4 + %2 = load i32, ptr %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 + call void (ptr, ...) @printf(ptr @.str.1, i32 %add) + %3 = load i32, ptr %i, align 4 %add1 = add i32 %3, 1 - store i32 %add1, i32* %i, align 4 + store i32 %add1, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond @@ -64,42 +64,42 @@ if.exit: ; preds = %entry br i1 %eq2, label %if.then3, label %if.exit11 if.then3: ; preds = %if.exit - store i32 0, i32* %i4, align 4 + store i32 0, ptr %i4, align 4 br label %loop.cond5 loop.cond5: ; preds = %loop.body7, %if.then3 - %4 = load i32, i32* %i4, align 4 + %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, i32* %i4, align 4 + %5 = load i32, ptr %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 + call void (ptr, ...) @printf(ptr @.str.2, i32 %add8) + %6 = load i32, ptr %i4, align 4 %add9 = add i32 %6, 1 - store i32 %add9, i32* %i4, align 4 + 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, i32* %i12, align 4 + store i32 0, ptr %i12, align 4 br label %loop.cond13 loop.cond13: ; preds = %loop.body15, %if.exit11 - %7 = load i32, i32* %i12, align 4 + %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, i32* %i12, align 4 + %8 = load i32, ptr %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 + call void (ptr, ...) @printf(ptr @.str.3, i32 %add16) + %9 = load i32, ptr %i12, align 4 %add17 = add i32 %9, 1 - store i32 %add17, i32* %i12, align 4 + store i32 %add17, ptr %i12, align 4 br label %loop.cond13 loop.exit18: ; preds = %loop.cond13 diff --git a/test/test_suite/statements/fallthough_do.c3t b/test/test_suite/statements/fallthough_do.c3t index d37601048..65c2bfb6b 100644 --- a/test/test_suite/statements/fallthough_do.c3t +++ b/test/test_suite/statements/fallthough_do.c3t @@ -42,13 +42,13 @@ fn void main() define void @foo_main() #0 { entry: %i = alloca i32, align 4 - store i32 10, i32* %i, align 4 + store i32 10, ptr %i, align 4 %0 = call i32 @foo_test() - call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %0) - %1 = load i32, i32* %i, align 4 + call void (ptr, ...) @printf(ptr @.str, i32 %0) + %1 = load i32, ptr %i, align 4 %2 = call i32 @foo_test() - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %1, i32 %2) - %3 = load i32, i32* %i, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %1, i32 %2) + %3 = load i32, ptr %i, align 4 %lt = icmp slt i32 %3, 0 br i1 %lt, label %if.then, label %if.exit @@ -56,13 +56,13 @@ if.then: ; preds = %entry br label %loop.exit if.exit: ; preds = %entry - %4 = load i32, i32* %i, align 4 + %4 = load i32, ptr %i, align 4 %5 = call i32 @foo_test() - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i32 %4, i32 %5) + call void (ptr, ...) @printf(ptr @.str.2, i32 %4, i32 %5) br label %loop.exit loop.exit: ; preds = %if.exit, %if.then - %6 = load i32, i32* %i, align 4 + %6 = load i32, ptr %i, align 4 %lt1 = icmp slt i32 %6, 0 br i1 %lt1, label %if.then2, label %if.exit3 @@ -70,9 +70,9 @@ if.then2: ; preds = %loop.exit br label %loop.exit4 if.exit3: ; preds = %loop.exit - %7 = load i32, i32* %i, align 4 + %7 = load i32, ptr %i, align 4 %8 = call i32 @foo_test() - call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i32 %7, i32 %8) + call void (ptr, ...) @printf(ptr @.str.3, i32 %7, i32 %8) br label %loop.exit4 loop.exit4: ; preds = %if.exit3, %if.then2 diff --git a/test/test_suite/statements/foreach_break.c3t b/test/test_suite/statements/foreach_break.c3t index c735dbc40..000e6b1a5 100644 --- a/test/test_suite/statements/foreach_break.c3t +++ b/test/test_suite/statements/foreach_break.c3t @@ -21,27 +21,27 @@ entry: %g = alloca i32, align 4 %.anon = alloca i64, align 8 %z = alloca i32, align 4 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 - store i32 0, i32* %2, align 4 - store i32 0, i32* %g, align 4 - store i64 0, i64* %.anon, align 8 + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 + store i32 0, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 + store i32 0, ptr %2, align 4 + store i32 0, ptr %g, align 4 + store i64 0, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %loop.inc, %entry - %3 = load i64, i64* %.anon, align 8 + %3 = load i64, ptr %.anon, align 8 %gt = icmp ugt i64 3, %3 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %4 = load i64, i64* %.anon, align 8 - %5 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 %4 - %6 = load i32, i32* %5, align 4 - store i32 %6, i32* %z, align 4 - %7 = load i32, i32* %z, align 4 + %4 = load i64, ptr %.anon, align 8 + %5 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 %4 + %6 = load i32, ptr %5, align 4 + store i32 %6, ptr %z, align 4 + %7 = load i32, ptr %z, align 4 %gt1 = icmp sgt i32 %7, 0 br i1 %gt1, label %if.then, label %if.exit @@ -49,7 +49,7 @@ if.then: ; preds = %loop.body br label %loop.exit if.exit: ; preds = %loop.body - %8 = load i32, i32* %z, align 4 + %8 = load i32, ptr %z, align 4 %eq = icmp eq i32 %8, 1 br i1 %eq, label %if.then2, label %if.exit3 @@ -57,16 +57,16 @@ if.then2: ; preds = %if.exit br label %loop.inc if.exit3: ; preds = %if.exit - %9 = load i32, i32* %g, align 4 - %10 = load i32, i32* %z, align 4 + %9 = load i32, ptr %g, align 4 + %10 = load i32, ptr %z, align 4 %add = add i32 %9, %10 - store i32 %add, i32* %g, align 4 + store i32 %add, ptr %g, align 4 br label %loop.inc loop.inc: ; preds = %if.exit3, %if.then2 - %11 = load i64, i64* %.anon, align 8 + %11 = load i64, ptr %.anon, align 8 %add4 = add i64 %11, 1 - store i64 %add4, i64* %.anon, align 8 + store i64 %add4, ptr %.anon, align 8 br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond diff --git a/test/test_suite/statements/foreach_common.c3t b/test/test_suite/statements/foreach_common.c3t index a5f1918f8..8cdbb6fc0 100644 --- a/test/test_suite/statements/foreach_common.c3t +++ b/test/test_suite/statements/foreach_common.c3t @@ -64,314 +64,311 @@ entry: %.anon = alloca i64, align 8 %a = alloca float, align 4 %.anon1 = alloca i64, align 8 - %a5 = alloca float*, align 8 + %a5 = alloca ptr, align 8 %.anon9 = alloca i64, align 8 - %a13 = alloca i8*, align 8 - %.anon18 = alloca i64, align 8 + %a13 = alloca ptr, align 8 + %.anon17 = alloca i64, align 8 %i = alloca i64, align 8 - %a22 = alloca float, align 4 - %.anon26 = alloca i64, align 8 - %i30 = alloca i8, align 1 - %a31 = alloca double, align 8 - %.anon35 = alloca i64, align 8 - %a39 = alloca double, align 8 + %a21 = alloca float, align 4 + %.anon25 = alloca i64, align 8 + %i29 = alloca i8, align 1 + %a30 = alloca double, align 8 + %.anon34 = alloca i64, align 8 + %a38 = alloca double, align 8 + %.anon42 = alloca i64, align 8 %.anon43 = alloca i64, align 8 - %.anon44 = alloca i64, align 8 - %a47 = alloca float, align 4 + %a46 = alloca float, align 4 + %.anon50 = alloca i64, align 8 %.anon51 = alloca i64, align 8 - %.anon52 = alloca i64, align 8 - %a56 = alloca float*, align 8 + %a55 = alloca ptr, align 8 + %.anon60 = alloca i64, align 8 %.anon61 = alloca i64, align 8 - %.anon62 = alloca i64, align 8 - %i66 = alloca i64, align 8 - %a67 = alloca float, align 4 + %i65 = alloca i64, align 8 + %a66 = alloca float, align 4 + %.anon70 = alloca i64, align 8 %.anon71 = alloca i64, align 8 - %.anon72 = alloca i64, align 8 - %i76 = alloca i8, align 1 - %a78 = alloca double, align 8 + %i75 = alloca i8, align 1 + %a77 = alloca double, align 8 + %.anon82 = alloca i64, align 8 %.anon83 = alloca i64, align 8 - %.anon84 = alloca i64, align 8 - %a88 = alloca double, align 8 - %0 = bitcast [3 x float]* %foo to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x float]* @.__const to i8*), i32 12, i1 false) - store <3 x float> , <3 x float>* %foo2, align 16 - store i64 0, i64* %.anon, align 8 + %a87 = alloca double, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 12, i1 false) + store <3 x float> , ptr %foo2, align 16 + store i64 0, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %1 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 3, %1 + %0 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 3, %0 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %2 = load i64, i64* %.anon, align 8 - %3 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %2 - %4 = load float, float* %3, align 4 - store float %4, float* %a, align 4 - %5 = load float, float* %a, align 4 - %fpfpext = fpext float %5 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), double %fpfpext) - %6 = load i64, i64* %.anon, align 8 - %add = add i64 %6, 1 - store i64 %add, i64* %.anon, align 8 + %1 = load i64, ptr %.anon, align 8 + %2 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %1 + %3 = load float, ptr %2, align 4 + store float %3, ptr %a, align 4 + %4 = load float, ptr %a, align 4 + %fpfpext = fpext float %4 to double + call void (ptr, ...) @printf(ptr @.str, double %fpfpext) + %5 = load i64, ptr %.anon, align 8 + %add = add i64 %5, 1 + store i64 %add, ptr %.anon, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - store i64 0, i64* %.anon1, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond2 loop.cond2: ; preds = %loop.body4, %loop.exit - %7 = load i64, i64* %.anon1, align 8 - %gt3 = icmp ugt i64 3, %7 + %6 = load i64, ptr %.anon1, align 8 + %gt3 = icmp ugt i64 3, %6 br i1 %gt3, label %loop.body4, label %loop.exit8 loop.body4: ; preds = %loop.cond2 - %8 = load i64, i64* %.anon1, align 8 - %9 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %8 - store float* %9, float** %a5, align 8 - %10 = load float*, float** %a5, align 8 - %11 = load float, float* %10, align 8 - %fmul = fmul float %11, 2.000000e+00 - store float %fmul, float* %10, align 8 - %12 = load float*, float** %a5, align 8 - %13 = load float, float* %12, align 8 - %fpfpext6 = fpext float %13 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %fpfpext6) - %14 = load i64, i64* %.anon1, align 8 - %add7 = add i64 %14, 1 - store i64 %add7, i64* %.anon1, align 8 + %7 = load i64, ptr %.anon1, align 8 + %8 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %7 + store ptr %8, ptr %a5, align 8 + %9 = load ptr, ptr %a5, align 8 + %10 = load float, ptr %9, align 8 + %fmul = fmul float %10, 2.000000e+00 + store float %fmul, ptr %9, align 8 + %11 = load ptr, ptr %a5, align 8 + %12 = load float, ptr %11, align 8 + %fpfpext6 = fpext float %12 to double + call void (ptr, ...) @printf(ptr @.str.1, double %fpfpext6) + %13 = load i64, ptr %.anon1, align 8 + %add7 = add i64 %13, 1 + store i64 %add7, ptr %.anon1, align 8 br label %loop.cond2 loop.exit8: ; preds = %loop.cond2 - store i64 0, i64* %.anon9, align 8 + store i64 0, ptr %.anon9, align 8 br label %loop.cond10 loop.cond10: ; preds = %loop.body12, %loop.exit8 - %15 = load i64, i64* %.anon9, align 8 - %gt11 = icmp ugt i64 3, %15 - br i1 %gt11, label %loop.body12, label %loop.exit17 + %14 = load i64, ptr %.anon9, align 8 + %gt11 = icmp ugt i64 3, %14 + br i1 %gt11, label %loop.body12, label %loop.exit16 loop.body12: ; preds = %loop.cond10 - %16 = load i64, i64* %.anon9, align 8 - %17 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %16 - %ptrptr = bitcast float* %17 to i8* - store i8* %ptrptr, i8** %a13, align 8 - %18 = load i8*, i8** %a13, align 8 - %ptrptr14 = bitcast i8* %18 to float* - %19 = load float, float* %ptrptr14, align 8 - %fpfpext15 = fpext float %19 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), double %fpfpext15) - %20 = load i64, i64* %.anon9, align 8 - %add16 = add i64 %20, 1 - store i64 %add16, i64* %.anon9, align 8 + %15 = load i64, ptr %.anon9, align 8 + %16 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %15 + store ptr %16, ptr %a13, align 8 + %17 = load ptr, ptr %a13, align 8 + %18 = load float, ptr %17, align 8 + %fpfpext14 = fpext float %18 to double + call void (ptr, ...) @printf(ptr @.str.2, double %fpfpext14) + %19 = load i64, ptr %.anon9, align 8 + %add15 = add i64 %19, 1 + store i64 %add15, ptr %.anon9, align 8 br label %loop.cond10 -loop.exit17: ; preds = %loop.cond10 - store i64 0, i64* %.anon18, align 8 - br label %loop.cond19 +loop.exit16: ; preds = %loop.cond10 + store i64 0, ptr %.anon17, align 8 + br label %loop.cond18 -loop.cond19: ; preds = %loop.body21, %loop.exit17 - %21 = load i64, i64* %.anon18, align 8 - %gt20 = icmp ugt i64 3, %21 - br i1 %gt20, label %loop.body21, label %loop.exit25 +loop.cond18: ; preds = %loop.body20, %loop.exit16 + %20 = load i64, ptr %.anon17, align 8 + %gt19 = icmp ugt i64 3, %20 + br i1 %gt19, label %loop.body20, label %loop.exit24 -loop.body21: ; preds = %loop.cond19 - %22 = load i64, i64* %.anon18, align 8 - store i64 %22, i64* %i, align 8 - %23 = load i64, i64* %.anon18, align 8 - %24 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %23 - %25 = load float, float* %24, align 4 - store float %25, float* %a22, align 4 - %26 = load i64, i64* %i, align 8 - %27 = load float, float* %a22, align 4 - %fpfpext23 = fpext float %27 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 %26, double %fpfpext23) - %28 = load i64, i64* %.anon18, align 8 - %add24 = add i64 %28, 1 - store i64 %add24, i64* %.anon18, align 8 - br label %loop.cond19 +loop.body20: ; preds = %loop.cond18 + %21 = load i64, ptr %.anon17, align 8 + store i64 %21, ptr %i, align 8 + %22 = load i64, ptr %.anon17, align 8 + %23 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %22 + %24 = load float, ptr %23, align 4 + store float %24, ptr %a21, align 4 + %25 = load i64, ptr %i, align 8 + %26 = load float, ptr %a21, align 4 + %fpfpext22 = fpext float %26 to double + call void (ptr, ...) @printf(ptr @.str.3, i64 %25, double %fpfpext22) + %27 = load i64, ptr %.anon17, align 8 + %add23 = add i64 %27, 1 + store i64 %add23, ptr %.anon17, align 8 + br label %loop.cond18 -loop.exit25: ; preds = %loop.cond19 - store i64 0, i64* %.anon26, align 8 - br label %loop.cond27 +loop.exit24: ; preds = %loop.cond18 + store i64 0, ptr %.anon25, align 8 + br label %loop.cond26 -loop.cond27: ; preds = %loop.body29, %loop.exit25 - %29 = load i64, i64* %.anon26, align 8 - %gt28 = icmp ugt i64 3, %29 - br i1 %gt28, label %loop.body29, label %loop.exit34 +loop.cond26: ; preds = %loop.body28, %loop.exit24 + %28 = load i64, ptr %.anon25, align 8 + %gt27 = icmp ugt i64 3, %28 + br i1 %gt27, label %loop.body28, label %loop.exit33 -loop.body29: ; preds = %loop.cond27 - %30 = load i64, i64* %.anon26, align 8 - %ztrunc = trunc i64 %30 to i8 - store i8 %ztrunc, i8* %i30, align 1 - %31 = load i64, i64* %.anon26, align 8 - %32 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %31 - %33 = load float, float* %32, align 4 - %fpfpext32 = fpext float %33 to double - store double %fpfpext32, double* %a31, align 8 - %34 = load i8, i8* %i30, align 1 - %uisiext = zext i8 %34 to i32 - %35 = load double, double* %a31, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i32 0, i32 0), i32 %uisiext, double %35) - %36 = load i64, i64* %.anon26, align 8 - %add33 = add i64 %36, 1 - store i64 %add33, i64* %.anon26, align 8 - br label %loop.cond27 +loop.body28: ; preds = %loop.cond26 + %29 = load i64, ptr %.anon25, align 8 + %ztrunc = trunc i64 %29 to i8 + store i8 %ztrunc, ptr %i29, align 1 + %30 = load i64, ptr %.anon25, align 8 + %31 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %30 + %32 = load float, ptr %31, align 4 + %fpfpext31 = fpext float %32 to double + store double %fpfpext31, ptr %a30, align 8 + %33 = load i8, ptr %i29, align 1 + %uisiext = zext i8 %33 to i32 + %34 = load double, ptr %a30, align 8 + call void (ptr, ...) @printf(ptr @.str.4, i32 %uisiext, double %34) + %35 = load i64, ptr %.anon25, align 8 + %add32 = add i64 %35, 1 + store i64 %add32, ptr %.anon25, align 8 + br label %loop.cond26 -loop.exit34: ; preds = %loop.cond27 - store i64 0, i64* %.anon35, align 8 - br label %loop.cond36 +loop.exit33: ; preds = %loop.cond26 + store i64 0, ptr %.anon34, align 8 + br label %loop.cond35 -loop.cond36: ; preds = %loop.body38, %loop.exit34 - %37 = load i64, i64* %.anon35, align 8 - %gt37 = icmp ugt i64 3, %37 - br i1 %gt37, label %loop.body38, label %loop.exit42 +loop.cond35: ; preds = %loop.body37, %loop.exit33 + %36 = load i64, ptr %.anon34, align 8 + %gt36 = icmp ugt i64 3, %36 + br i1 %gt36, label %loop.body37, label %loop.exit41 -loop.body38: ; preds = %loop.cond36 - %38 = load i64, i64* %.anon35, align 8 - %39 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %38 - %40 = load float, float* %39, align 4 - %fpfpext40 = fpext float %40 to double - store double %fpfpext40, double* %a39, align 8 - %41 = load double, double* %a39, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.5, i32 0, i32 0), double %41) - %42 = load i64, i64* %.anon35, align 8 - %add41 = add i64 %42, 1 - store i64 %add41, i64* %.anon35, align 8 - br label %loop.cond36 +loop.body37: ; preds = %loop.cond35 + %37 = load i64, ptr %.anon34, align 8 + %38 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %37 + %39 = load float, ptr %38, align 4 + %fpfpext39 = fpext float %39 to double + store double %fpfpext39, ptr %a38, align 8 + %40 = load double, ptr %a38, align 8 + call void (ptr, ...) @printf(ptr @.str.5, double %40) + %41 = load i64, ptr %.anon34, align 8 + %add40 = add i64 %41, 1 + store i64 %add40, ptr %.anon34, align 8 + br label %loop.cond35 -loop.exit42: ; preds = %loop.cond36 - store i64 3, i64* %.anon43, align 8 - store i64 0, i64* %.anon44, align 8 - br label %loop.cond45 +loop.exit41: ; preds = %loop.cond35 + store i64 3, ptr %.anon42, align 8 + store i64 0, ptr %.anon43, align 8 + br label %loop.cond44 -loop.cond45: ; preds = %loop.body46, %loop.exit42 - %43 = load i64, i64* %.anon44, align 8 - %44 = load i64, i64* %.anon43, align 8 - %lt = icmp ult i64 %43, %44 - br i1 %lt, label %loop.body46, label %loop.exit50 +loop.cond44: ; preds = %loop.body45, %loop.exit41 + %42 = load i64, ptr %.anon43, align 8 + %43 = load i64, ptr %.anon42, align 8 + %lt = icmp ult i64 %42, %43 + br i1 %lt, label %loop.body45, label %loop.exit49 -loop.body46: ; preds = %loop.cond45 - %45 = load <3 x float>, <3 x float>* %foo2, align 16 - %46 = load i64, i64* %.anon44, align 8 - %47 = extractelement <3 x float> %45, i64 %46 - store float %47, float* %a47, align 4 - %48 = load float, float* %a47, align 4 - %fpfpext48 = fpext float %48 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i32 0, i32 0), double %fpfpext48) - %49 = load i64, i64* %.anon44, align 8 - %add49 = add i64 %49, 1 - store i64 %add49, i64* %.anon44, align 8 - br label %loop.cond45 +loop.body45: ; preds = %loop.cond44 + %44 = load <3 x float>, ptr %foo2, align 16 + %45 = load i64, ptr %.anon43, align 8 + %46 = extractelement <3 x float> %44, i64 %45 + store float %46, ptr %a46, align 4 + %47 = load float, ptr %a46, align 4 + %fpfpext47 = fpext float %47 to double + call void (ptr, ...) @printf(ptr @.str.6, double %fpfpext47) + %48 = load i64, ptr %.anon43, align 8 + %add48 = add i64 %48, 1 + store i64 %add48, ptr %.anon43, align 8 + br label %loop.cond44 -loop.exit50: ; preds = %loop.cond45 - store i64 3, i64* %.anon51, align 8 - store i64 0, i64* %.anon52, align 8 - br label %loop.cond53 +loop.exit49: ; preds = %loop.cond44 + store i64 3, ptr %.anon50, align 8 + store i64 0, ptr %.anon51, align 8 + br label %loop.cond52 -loop.cond53: ; preds = %loop.body55, %loop.exit50 - %50 = load i64, i64* %.anon52, align 8 - %51 = load i64, i64* %.anon51, align 8 - %lt54 = icmp ult i64 %50, %51 - br i1 %lt54, label %loop.body55, label %loop.exit60 +loop.cond52: ; preds = %loop.body54, %loop.exit49 + %49 = load i64, ptr %.anon51, align 8 + %50 = load i64, ptr %.anon50, align 8 + %lt53 = icmp ult i64 %49, %50 + br i1 %lt53, label %loop.body54, label %loop.exit59 -loop.body55: ; preds = %loop.cond53 - %52 = load i64, i64* %.anon52, align 8 - %53 = getelementptr inbounds <3 x float>, <3 x float>* %foo2, i64 0, i64 %52 - store float* %53, float** %a56, align 8 - %54 = load float*, float** %a56, align 8 - %55 = load float, float* %54, align 8 - %fmul57 = fmul float %55, 2.000000e+00 - store float %fmul57, float* %54, align 8 - %56 = load float*, float** %a56, align 8 - %57 = load float, float* %56, align 8 - %fpfpext58 = fpext float %57 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i32 0, i32 0), double %fpfpext58) - %58 = load i64, i64* %.anon52, align 8 - %add59 = add i64 %58, 1 - store i64 %add59, i64* %.anon52, align 8 - br label %loop.cond53 +loop.body54: ; preds = %loop.cond52 + %51 = load i64, ptr %.anon51, align 8 + %52 = getelementptr inbounds <3 x float>, ptr %foo2, i64 0, i64 %51 + store ptr %52, ptr %a55, align 8 + %53 = load ptr, ptr %a55, align 8 + %54 = load float, ptr %53, align 8 + %fmul56 = fmul float %54, 2.000000e+00 + store float %fmul56, ptr %53, align 8 + %55 = load ptr, ptr %a55, align 8 + %56 = load float, ptr %55, align 8 + %fpfpext57 = fpext float %56 to double + call void (ptr, ...) @printf(ptr @.str.7, double %fpfpext57) + %57 = load i64, ptr %.anon51, align 8 + %add58 = add i64 %57, 1 + store i64 %add58, ptr %.anon51, align 8 + br label %loop.cond52 -loop.exit60: ; preds = %loop.cond53 - store i64 3, i64* %.anon61, align 8 - store i64 0, i64* %.anon62, align 8 - br label %loop.cond63 +loop.exit59: ; preds = %loop.cond52 + store i64 3, ptr %.anon60, align 8 + store i64 0, ptr %.anon61, align 8 + br label %loop.cond62 -loop.cond63: ; preds = %loop.body65, %loop.exit60 - %59 = load i64, i64* %.anon62, align 8 - %60 = load i64, i64* %.anon61, align 8 - %lt64 = icmp ult i64 %59, %60 - br i1 %lt64, label %loop.body65, label %loop.exit70 +loop.cond62: ; preds = %loop.body64, %loop.exit59 + %58 = load i64, ptr %.anon61, align 8 + %59 = load i64, ptr %.anon60, align 8 + %lt63 = icmp ult i64 %58, %59 + br i1 %lt63, label %loop.body64, label %loop.exit69 -loop.body65: ; preds = %loop.cond63 - %61 = load i64, i64* %.anon62, align 8 - store i64 %61, i64* %i66, align 8 - %62 = load <3 x float>, <3 x float>* %foo2, align 16 - %63 = load i64, i64* %.anon62, align 8 - %64 = extractelement <3 x float> %62, i64 %63 - store float %64, float* %a67, align 4 - %65 = load i64, i64* %i66, align 8 - %66 = load float, float* %a67, align 4 - %fpfpext68 = fpext float %66 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i32 0, i32 0), i64 %65, double %fpfpext68) - %67 = load i64, i64* %.anon62, align 8 - %add69 = add i64 %67, 1 - store i64 %add69, i64* %.anon62, align 8 - br label %loop.cond63 +loop.body64: ; preds = %loop.cond62 + %60 = load i64, ptr %.anon61, align 8 + store i64 %60, ptr %i65, align 8 + %61 = load <3 x float>, ptr %foo2, align 16 + %62 = load i64, ptr %.anon61, align 8 + %63 = extractelement <3 x float> %61, i64 %62 + store float %63, ptr %a66, align 4 + %64 = load i64, ptr %i65, align 8 + %65 = load float, ptr %a66, align 4 + %fpfpext67 = fpext float %65 to double + call void (ptr, ...) @printf(ptr @.str.8, i64 %64, double %fpfpext67) + %66 = load i64, ptr %.anon61, align 8 + %add68 = add i64 %66, 1 + store i64 %add68, ptr %.anon61, align 8 + br label %loop.cond62 -loop.exit70: ; preds = %loop.cond63 - store i64 3, i64* %.anon71, align 8 - store i64 0, i64* %.anon72, align 8 - br label %loop.cond73 +loop.exit69: ; preds = %loop.cond62 + store i64 3, ptr %.anon70, align 8 + store i64 0, ptr %.anon71, align 8 + br label %loop.cond72 -loop.cond73: ; preds = %loop.body75, %loop.exit70 - %68 = load i64, i64* %.anon72, align 8 - %69 = load i64, i64* %.anon71, align 8 - %lt74 = icmp ult i64 %68, %69 - br i1 %lt74, label %loop.body75, label %loop.exit82 +loop.cond72: ; preds = %loop.body74, %loop.exit69 + %67 = load i64, ptr %.anon71, align 8 + %68 = load i64, ptr %.anon70, align 8 + %lt73 = icmp ult i64 %67, %68 + br i1 %lt73, label %loop.body74, label %loop.exit81 -loop.body75: ; preds = %loop.cond73 - %70 = load i64, i64* %.anon72, align 8 - %ztrunc77 = trunc i64 %70 to i8 - store i8 %ztrunc77, i8* %i76, align 1 - %71 = load <3 x float>, <3 x float>* %foo2, align 16 - %72 = load i64, i64* %.anon72, align 8 - %73 = extractelement <3 x float> %71, i64 %72 - %fpfpext79 = fpext float %73 to double - store double %fpfpext79, double* %a78, align 8 - %74 = load i8, i8* %i76, align 1 - %uisiext80 = zext i8 %74 to i32 - %75 = load double, double* %a78, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.9, i32 0, i32 0), i32 %uisiext80, double %75) - %76 = load i64, i64* %.anon72, align 8 - %add81 = add i64 %76, 1 - store i64 %add81, i64* %.anon72, align 8 - br label %loop.cond73 +loop.body74: ; preds = %loop.cond72 + %69 = load i64, ptr %.anon71, align 8 + %ztrunc76 = trunc i64 %69 to i8 + store i8 %ztrunc76, ptr %i75, align 1 + %70 = load <3 x float>, ptr %foo2, align 16 + %71 = load i64, ptr %.anon71, align 8 + %72 = extractelement <3 x float> %70, i64 %71 + %fpfpext78 = fpext float %72 to double + store double %fpfpext78, ptr %a77, align 8 + %73 = load i8, ptr %i75, align 1 + %uisiext79 = zext i8 %73 to i32 + %74 = load double, ptr %a77, align 8 + call void (ptr, ...) @printf(ptr @.str.9, i32 %uisiext79, double %74) + %75 = load i64, ptr %.anon71, align 8 + %add80 = add i64 %75, 1 + store i64 %add80, ptr %.anon71, align 8 + br label %loop.cond72 -loop.exit82: ; preds = %loop.cond73 - store i64 3, i64* %.anon83, align 8 - store i64 0, i64* %.anon84, align 8 - br label %loop.cond85 +loop.exit81: ; preds = %loop.cond72 + store i64 3, ptr %.anon82, align 8 + store i64 0, ptr %.anon83, align 8 + br label %loop.cond84 -loop.cond85: ; preds = %loop.body87, %loop.exit82 - %77 = load i64, i64* %.anon84, align 8 - %78 = load i64, i64* %.anon83, align 8 - %lt86 = icmp ult i64 %77, %78 - br i1 %lt86, label %loop.body87, label %loop.exit91 +loop.cond84: ; preds = %loop.body86, %loop.exit81 + %76 = load i64, ptr %.anon83, align 8 + %77 = load i64, ptr %.anon82, align 8 + %lt85 = icmp ult i64 %76, %77 + br i1 %lt85, label %loop.body86, label %loop.exit90 -loop.body87: ; preds = %loop.cond85 - %79 = load <3 x float>, <3 x float>* %foo2, align 16 - %80 = load i64, i64* %.anon84, align 8 - %81 = extractelement <3 x float> %79, i64 %80 - %fpfpext89 = fpext float %81 to double - store double %fpfpext89, double* %a88, align 8 - %82 = load double, double* %a88, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.10, i32 0, i32 0), double %82) - %83 = load i64, i64* %.anon84, align 8 - %add90 = add i64 %83, 1 - store i64 %add90, i64* %.anon84, align 8 - br label %loop.cond85 +loop.body86: ; preds = %loop.cond84 + %78 = load <3 x float>, ptr %foo2, align 16 + %79 = load i64, ptr %.anon83, align 8 + %80 = extractelement <3 x float> %78, i64 %79 + %fpfpext88 = fpext float %80 to double + store double %fpfpext88, ptr %a87, align 8 + %81 = load double, ptr %a87, align 8 + call void (ptr, ...) @printf(ptr @.str.10, double %81) + %82 = load i64, ptr %.anon83, align 8 + %add89 = add i64 %82, 1 + store i64 %add89, ptr %.anon83, align 8 + br label %loop.cond84 -loop.exit91: ; preds = %loop.cond85 +loop.exit90: ; preds = %loop.cond84 ret void } diff --git a/test/test_suite/statements/foreach_custom.c3t b/test/test_suite/statements/foreach_custom.c3t index 481036d1a..2c76f8bfa 100644 --- a/test/test_suite/statements/foreach_custom.c3t +++ b/test/test_suite/statements/foreach_custom.c3t @@ -42,38 +42,36 @@ entry: %.anon1 = alloca i64, align 8 %f = alloca i32, align 4 %index = alloca i64, align 8 - %0 = bitcast [3 x i32]* %i to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %2 = bitcast [3 x i32]* %i to i32* - %3 = insertvalue %"int[]" undef, i32* %2, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, %"int[]"* %1, align 8 - %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %.anon, align 8 - store i64 0, i64* %.anon1, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %1 = insertvalue %"int[]" undef, ptr %i, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + store %"int[]" %2, ptr %0, align 8 + %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond loop.cond: ; preds = %entry - %8 = load i64, i64* %.anon1, align 8 - %9 = load i64, i64* %.anon, align 8 - %lt = icmp ult i64 %8, %9 + %6 = load i64, ptr %.anon1, align 8 + %7 = load i64, ptr %.anon, align 8 + %lt = icmp ult i64 %6, %7 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %10 = load i64, i64* %.anon1, align 8 - store i64 %10, i64* %index, align 8 - %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 - %13 = load i32*, i32** %12, align 8 - %14 = load i64, i64* %index, align 8 - %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 - %15 = load i32, i32* %ptroffset, align 4 - store i32 %15, i32* %f, align 4 - %16 = load i32, i32* %f, align 4 - %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + %8 = load i64, ptr %.anon1, align 8 + store i64 %8, ptr %index, align 8 + %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 + %11 = load ptr, ptr %10, align 8 + %12 = load i64, ptr %index, align 8 + %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 + %13 = load i32, ptr %ptroffset, align 4 + store i32 %13, ptr %f, align 4 + %14 = load i32, ptr %f, align 4 + %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) br label %loop.body2 loop.body2: ; preds = %loop.body @@ -84,10 +82,10 @@ loop.exit: ; preds = %loop.body2, %loop.c } ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: call void @test_main() ret i32 0 diff --git a/test/test_suite/statements/foreach_custom_macro.c3t b/test/test_suite/statements/foreach_custom_macro.c3t index 449c9be9e..47347644a 100644 --- a/test/test_suite/statements/foreach_custom_macro.c3t +++ b/test/test_suite/statements/foreach_custom_macro.c3t @@ -32,6 +32,14 @@ extern fn int printf(char *fmt, ...); /* #expect: foo.ll +%Foo = type { %"int[]" } +%"int[]" = type { ptr, i64 } + +@"ct$foo_Foo" = linkonce constant %.introspect { i8 10, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@.__const = private unnamed_addr constant [3 x i32] [i32 1, i32 3, i32 10], align 4 +@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 + +; Function Attrs: nounwind define void @foo_main() #0 { entry: %i = alloca [3 x i32], align 4 @@ -40,38 +48,36 @@ entry: %.anon1 = alloca i64, align 8 %f = alloca i32, align 4 %index = alloca i64, align 8 - %0 = bitcast [3 x i32]* %i to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %2 = bitcast [3 x i32]* %i to i32* - %3 = insertvalue %"int[]" undef, i32* %2, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, %"int[]"* %1, align 8 - %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %.anon, align 8 - store i64 0, i64* %.anon1, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %1 = insertvalue %"int[]" undef, ptr %i, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + store %"int[]" %2, ptr %0, align 8 + %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond loop.cond: ; preds = %entry - %8 = load i64, i64* %.anon1, align 8 - %9 = load i64, i64* %.anon, align 8 - %lt = icmp ult i64 %8, %9 + %6 = load i64, ptr %.anon1, align 8 + %7 = load i64, ptr %.anon, align 8 + %lt = icmp ult i64 %6, %7 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %10 = load i64, i64* %.anon1, align 8 - store i64 %10, i64* %index, align 8 - %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 - %13 = load i32*, i32** %12, align 8 - %14 = load i64, i64* %index, align 8 - %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 - %15 = load i32, i32* %ptroffset, align 4 - store i32 %15, i32* %f, align 4 - %16 = load i32, i32* %f, align 4 - %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + %8 = load i64, ptr %.anon1, align 8 + store i64 %8, ptr %index, align 8 + %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 + %11 = load ptr, ptr %10, align 8 + %12 = load i64, ptr %index, align 8 + %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 + %13 = load i32, ptr %ptroffset, align 4 + store i32 %13, ptr %f, align 4 + %14 = load i32, ptr %f, align 4 + %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) br label %loop.body2 loop.body2: ; preds = %loop.body @@ -80,3 +86,13 @@ loop.body2: ; preds = %loop.body loop.exit: ; preds = %loop.body2, %loop.cond ret void } + +; Function Attrs: nounwind +declare i32 @printf(ptr, ...) #0 + +; Function Attrs: nounwind +define i32 @main(i32 %0, ptr %1) #0 { +entry: + call void @foo_main() + ret i32 0 +} \ No newline at end of file diff --git a/test/test_suite/statements/foreach_more_implementations.c3t b/test/test_suite/statements/foreach_more_implementations.c3t index 8008fed16..fbff1e940 100644 --- a/test/test_suite/statements/foreach_more_implementations.c3t +++ b/test/test_suite/statements/foreach_more_implementations.c3t @@ -47,139 +47,111 @@ entry: %.anon = alloca i64, align 8 %vector = alloca %Vector, align 8 %.anon1 = alloca i64, align 8 - %ref = alloca i32*, align 8 - %vector2 = alloca %Vector*, align 8 + %ref = alloca ptr, align 8 + %vector2 = alloca ptr, align 8 %element = alloca i64, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %.anon4 = alloca i64, align 8 %vector5 = alloca %Vector, align 8 %.anon6 = alloca i64, align 8 %i = alloca i32, align 4 - %vector10 = alloca %Vector*, align 8 + %vector10 = alloca ptr, align 8 %element11 = alloca i64, align 8 %retparam13 = alloca i64, align 8 %varargslots14 = alloca [1 x %variant], align 16 - %taddr15 = alloca %"variant[]", align 8 - %0 = bitcast [2 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([2 x i32]* @.__const to i8*), i32 8, i1 false) - %1 = getelementptr inbounds %Vector, %Vector* %v, i32 0, i32 0 - store i64 2, i64* %1, align 8 - %2 = getelementptr inbounds %Vector, %Vector* %v, i32 0, i32 1 - %ptrptr = bitcast [2 x i32]* %x to i32* - store i32* %ptrptr, i32** %2, align 8 - %3 = bitcast %Vector* %vector to i8* - %4 = bitcast %Vector* %v to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 16, i1 false) - %5 = getelementptr inbounds %Vector, %Vector* %vector, i32 0, i32 0 - %6 = load i64, i64* %5, align 8 - store i64 %6, i64* %.anon, align 8 - store i64 0, i64* %.anon1, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 8, i1 false) + %0 = getelementptr inbounds %Vector, ptr %v, i32 0, i32 0 + store i64 2, ptr %0, align 8 + %1 = getelementptr inbounds %Vector, ptr %v, i32 0, i32 1 + store ptr %x, ptr %1, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %vector, ptr align 8 %v, i32 16, i1 false) + %2 = getelementptr inbounds %Vector, ptr %vector, i32 0, i32 0 + %3 = load i64, ptr %2, align 8 + store i64 %3, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond loop.cond: ; preds = %voiderr, %entry - %7 = load i64, i64* %.anon1, align 8 - %8 = load i64, i64* %.anon, align 8 - %lt = icmp ult i64 %7, %8 + %4 = load i64, ptr %.anon1, align 8 + %5 = load i64, ptr %.anon, align 8 + %lt = icmp ult i64 %4, %5 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - store %Vector* %v, %Vector** %vector2, align 8 - %9 = load i64, i64* %.anon1, align 8 - store i64 %9, i64* %element, align 8 - %10 = load %Vector*, %Vector** %vector2, align 8 - %11 = getelementptr inbounds %Vector, %Vector* %10, i32 0, i32 1 - %12 = load i32*, i32** %11, align 8 - %13 = load i64, i64* %element, align 8 - %ptroffset = getelementptr inbounds i32, i32* %12, i64 %13 - store i32* %ptroffset, i32** %ref, align 8 - %14 = load i32*, i32** %ref, align 8 - %15 = bitcast i32* %14 to i8* - %16 = insertvalue %variant undef, i8* %15, 0 - %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %18 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %17, %variant* %18, align 16 - %19 = bitcast [1 x %variant]* %varargslots to %variant* - %20 = insertvalue %"variant[]" undef, %variant* %19, 0 - %21 = insertvalue %"variant[]" %20, i64 1, 1 - store %"variant[]" %21, %"variant[]"* %taddr, align 8 - %22 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 0 - %lo = load i8*, i8** %23, align 8 - %24 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 1 - %hi = load i64, i64* %24, align 8 - %25 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 3, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %25, 0 + store ptr %v, ptr %vector2, align 8 + %6 = load i64, ptr %.anon1, align 8 + store i64 %6, ptr %element, align 8 + %7 = load ptr, ptr %vector2, align 8 + %8 = getelementptr inbounds %Vector, ptr %7, i32 0, i32 1 + %9 = load ptr, ptr %8, align 8 + %10 = load i64, ptr %element, align 8 + %ptroffset = getelementptr inbounds i32, ptr %9, i64 %10 + store ptr %ptroffset, ptr %ref, align 8 + %11 = load ptr, ptr %ref, align 8 + %12 = insertvalue %variant undef, ptr %11, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %14 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %13, ptr %14, align 16 + %15 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 3, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %15, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %loop.body br label %voiderr voiderr: ; preds = %after_check, %loop.body - %26 = load i32*, i32** %ref, align 8 - %27 = load i32, i32* %26, align 8 - %add = add i32 %27, 2 - store i32 %add, i32* %26, align 8 - %28 = load i64, i64* %.anon1, align 8 - %add3 = add i64 %28, 1 - store i64 %add3, i64* %.anon1, align 8 + %16 = load ptr, ptr %ref, align 8 + %17 = load i32, ptr %16, align 8 + %add = add i32 %17, 2 + store i32 %add, ptr %16, align 8 + %18 = load i64, ptr %.anon1, align 8 + %add3 = add i64 %18, 1 + store i64 %add3, ptr %.anon1, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %29 = bitcast %Vector* %vector5 to i8* - %30 = bitcast %Vector* %v to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %29, i8* align 8 %30, i32 16, i1 false) - %31 = getelementptr inbounds %Vector, %Vector* %vector5, i32 0, i32 0 - %32 = load i64, i64* %31, align 8 - store i64 %32, i64* %.anon4, align 8 - store i64 0, i64* %.anon6, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %vector5, ptr align 8 %v, i32 16, i1 false) + %19 = getelementptr inbounds %Vector, ptr %vector5, i32 0, i32 0 + %20 = load i64, ptr %19, align 8 + store i64 %20, ptr %.anon4, align 8 + store i64 0, ptr %.anon6, align 8 br label %loop.cond7 -loop.cond7: ; preds = %voiderr20, %loop.exit - %33 = load i64, i64* %.anon6, align 8 - %34 = load i64, i64* %.anon4, align 8 - %lt8 = icmp ult i64 %33, %34 - br i1 %lt8, label %loop.body9, label %loop.exit22 +loop.cond7: ; preds = %voiderr17, %loop.exit + %21 = load i64, ptr %.anon6, align 8 + %22 = load i64, ptr %.anon4, align 8 + %lt8 = icmp ult i64 %21, %22 + br i1 %lt8, label %loop.body9, label %loop.exit19 loop.body9: ; preds = %loop.cond7 - store %Vector* %v, %Vector** %vector10, align 8 - %35 = load i64, i64* %.anon6, align 8 - store i64 %35, i64* %element11, align 8 - %36 = load %Vector*, %Vector** %vector10, align 8 - %37 = getelementptr inbounds %Vector, %Vector* %36, i32 0, i32 1 - %38 = load i32*, i32** %37, align 8 - %39 = load i64, i64* %element11, align 8 - %ptroffset12 = getelementptr inbounds i32, i32* %38, i64 %39 - %40 = load i32, i32* %ptroffset12, align 4 - store i32 %40, i32* %i, align 4 - %41 = bitcast i32* %i to i8* - %42 = insertvalue %variant undef, i8* %41, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %44 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots14, i64 0, i64 0 - store %variant %43, %variant* %44, align 16 - %45 = bitcast [1 x %variant]* %varargslots14 to %variant* - %46 = insertvalue %"variant[]" undef, %variant* %45, 0 - %47 = insertvalue %"variant[]" %46, i64 1, 1 - store %"variant[]" %47, %"variant[]"* %taddr15, align 8 - %48 = bitcast %"variant[]"* %taddr15 to { i8*, i64 }* - %49 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 0 - %lo16 = load i8*, i8** %49, align 8 - %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 1 - %hi17 = load i64, i64* %50, align 8 - %51 = call i64 @std_io_printf(i64* %retparam13, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3, i8* %lo16, i64 %hi17) - %not_err18 = icmp eq i64 %51, 0 - br i1 %not_err18, label %after_check19, label %voiderr20 + store ptr %v, ptr %vector10, align 8 + %23 = load i64, ptr %.anon6, align 8 + store i64 %23, ptr %element11, align 8 + %24 = load ptr, ptr %vector10, align 8 + %25 = getelementptr inbounds %Vector, ptr %24, i32 0, i32 1 + %26 = load ptr, ptr %25, align 8 + %27 = load i64, ptr %element11, align 8 + %ptroffset12 = getelementptr inbounds i32, ptr %26, i64 %27 + %28 = load i32, ptr %ptroffset12, align 4 + store i32 %28, ptr %i, align 4 + %29 = insertvalue %variant undef, ptr %i, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %31 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 + store %variant %30, ptr %31, align 16 + %32 = call i64 @std_io_printf(ptr %retparam13, ptr @.str.1, i64 3, ptr %varargslots14, i64 1) + %not_err15 = icmp eq i64 %32, 0 + br i1 %not_err15, label %after_check16, label %voiderr17 -after_check19: ; preds = %loop.body9 - br label %voiderr20 +after_check16: ; preds = %loop.body9 + br label %voiderr17 -voiderr20: ; preds = %after_check19, %loop.body9 - %52 = load i64, i64* %.anon6, align 8 - %add21 = add i64 %52, 1 - store i64 %add21, i64* %.anon6, align 8 +voiderr17: ; preds = %after_check16, %loop.body9 + %33 = load i64, ptr %.anon6, align 8 + %add18 = add i64 %33, 1 + store i64 %add18, ptr %.anon6, align 8 br label %loop.cond7 -loop.exit22: ; preds = %loop.cond7 +loop.exit19: ; preds = %loop.cond7 ret void } \ No newline at end of file diff --git a/test/test_suite/statements/foreach_r_break.c3t b/test/test_suite/statements/foreach_r_break.c3t index 7254b5908..a626decf6 100644 --- a/test/test_suite/statements/foreach_r_break.c3t +++ b/test/test_suite/statements/foreach_r_break.c3t @@ -22,30 +22,30 @@ entry: %g = alloca i32, align 4 %.anon = alloca i64, align 8 %z = alloca i32, align 4 - %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 - store i32 0, i32* %0, align 4 - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - store i32 0, i32* %1, align 4 - %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 - store i32 0, i32* %2, align 4 - store i32 0, i32* %g, align 4 - store i64 3, i64* %.anon, align 8 + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 + store i32 0, ptr %0, align 4 + %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + store i32 0, ptr %1, align 4 + %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 + store i32 0, ptr %2, align 4 + store i32 0, ptr %g, align 4 + store i64 3, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %if.exit3, %if.then2, %entry - %3 = load i64, i64* %.anon, align 8 + %3 = load i64, ptr %.anon, align 8 %gt = icmp ugt i64 %3, 0 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %4 = load i64, i64* %.anon, align 8 + %4 = load i64, ptr %.anon, align 8 %sub = sub i64 %4, 1 - store i64 %sub, i64* %.anon, align 8 - %5 = load i64, i64* %.anon, align 8 - %6 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 %5 - %7 = load i32, i32* %6, align 4 - store i32 %7, i32* %z, align 4 - %8 = load i32, i32* %z, align 4 + store i64 %sub, ptr %.anon, align 8 + %5 = load i64, ptr %.anon, align 8 + %6 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 %5 + %7 = load i32, ptr %6, align 4 + store i32 %7, ptr %z, align 4 + %8 = load i32, ptr %z, align 4 %gt1 = icmp sgt i32 %8, 0 br i1 %gt1, label %if.then, label %if.exit @@ -53,7 +53,7 @@ if.then: ; preds = %loop.body br label %loop.exit if.exit: ; preds = %loop.body - %9 = load i32, i32* %z, align 4 + %9 = load i32, ptr %z, align 4 %eq = icmp eq i32 %9, 1 br i1 %eq, label %if.then2, label %if.exit3 @@ -61,10 +61,10 @@ if.then2: ; preds = %if.exit br label %loop.cond if.exit3: ; preds = %if.exit - %10 = load i32, i32* %g, align 4 - %11 = load i32, i32* %z, align 4 + %10 = load i32, ptr %g, align 4 + %11 = load i32, ptr %z, align 4 %add = add i32 %10, %11 - store i32 %add, i32* %g, align 4 + store i32 %add, ptr %g, align 4 br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond diff --git a/test/test_suite/statements/foreach_r_common.c3t b/test/test_suite/statements/foreach_r_common.c3t index 46bc068e7..c8d675458 100644 --- a/test/test_suite/statements/foreach_r_common.c3t +++ b/test/test_suite/statements/foreach_r_common.c3t @@ -64,49 +64,296 @@ entry: %.anon = alloca i64, align 8 %a = alloca float, align 4 %.anon1 = alloca i64, align 8 - %a6 = alloca float*, align 8 + %a6 = alloca ptr, align 8 %.anon9 = alloca i64, align 8 - %a14 = alloca i8*, align 8 - %.anon18 = alloca i64, align 8 - %66 = load i64, i64* %.anon69, align 8 - %sub73 = sub i64 %66, 1 - store i64 %sub73, i64* %.anon69, align 8 - %67 = load i64, i64* %.anon69, align 8 - %ztrunc75 = trunc i64 %67 to i8 - store i8 %ztrunc75, i8* %i74, align 1 - %68 = load <3 x float>, <3 x float>* %foo2, align 16 - %69 = load i64, i64* %.anon69, align 8 - %70 = extractelement <3 x float> %68, i64 %69 - %fpfpext77 = fpext float %70 to double - store double %fpfpext77, double* %a76, align 8 - %71 = load i8, i8* %i74, align 1 - %uisiext78 = zext i8 %71 to i32 - %72 = load double, double* %a76, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.9, i32 0, i32 0), i32 %uisiext78, double %72) - br label %loop.cond70 + %a14 = alloca ptr, align 8 + %.anon17 = alloca i64, align 8 + %i = alloca i64, align 8 + %a22 = alloca float, align 4 + %.anon25 = alloca i64, align 8 + %i30 = alloca i8, align 1 + %a31 = alloca double, align 8 + %.anon34 = alloca i64, align 8 + %a39 = alloca double, align 8 + %.anon42 = alloca i64, align 8 + %a47 = alloca float, align 4 + %.anon50 = alloca i64, align 8 + %a55 = alloca ptr, align 8 + %.anon59 = alloca i64, align 8 + %i64 = alloca i64, align 8 + %a65 = alloca float, align 4 + %.anon68 = alloca i64, align 8 + %i73 = alloca i8, align 1 + %a75 = alloca double, align 8 + %.anon79 = alloca i64, align 8 + %a84 = alloca double, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 12, i1 false) + store <3 x float> , ptr %foo2, align 16 + store i64 3, ptr %.anon, align 8 + br label %loop.cond -loop.exit79: ; preds = %loop.cond70 - store i64 3, i64* %.anon80, align 8 - br label %loop.cond81 +loop.cond: ; preds = %loop.body, %entry + %0 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 %0, 0 + br i1 %gt, label %loop.body, label %loop.exit -loop.cond81: ; preds = %loop.body83, %loop.exit79 - %73 = load i64, i64* %.anon80, align 8 - %gt82 = icmp ugt i64 %73, 0 - br i1 %gt82, label %loop.body83, label %loop.exit87 +loop.body: ; preds = %loop.cond + %1 = load i64, ptr %.anon, align 8 + %sub = sub i64 %1, 1 + store i64 %sub, ptr %.anon, align 8 + %2 = load i64, ptr %.anon, align 8 + %3 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %2 + %4 = load float, ptr %3, align 4 + store float %4, ptr %a, align 4 + %5 = load float, ptr %a, align 4 + %fpfpext = fpext float %5 to double + call void (ptr, ...) @printf(ptr @.str, double %fpfpext) + br label %loop.cond -loop.body83: ; preds = %loop.cond81 - %74 = load i64, i64* %.anon80, align 8 - %sub84 = sub i64 %74, 1 - store i64 %sub84, i64* %.anon80, align 8 - %75 = load <3 x float>, <3 x float>* %foo2, align 16 - %76 = load i64, i64* %.anon80, align 8 - %77 = extractelement <3 x float> %75, i64 %76 - %fpfpext86 = fpext float %77 to double - store double %fpfpext86, double* %a85, align 8 - %78 = load double, double* %a85, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.10, i32 0, i32 0), double %78) - br label %loop.cond81 +loop.exit: ; preds = %loop.cond + store i64 3, ptr %.anon1, align 8 + br label %loop.cond2 -loop.exit87: ; preds = %loop.cond81 +loop.cond2: ; preds = %loop.body4, %loop.exit + %6 = load i64, ptr %.anon1, align 8 + %gt3 = icmp ugt i64 %6, 0 + br i1 %gt3, label %loop.body4, label %loop.exit8 + +loop.body4: ; preds = %loop.cond2 + %7 = load i64, ptr %.anon1, align 8 + %sub5 = sub i64 %7, 1 + store i64 %sub5, ptr %.anon1, align 8 + %8 = load i64, ptr %.anon1, align 8 + %9 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %8 + store ptr %9, ptr %a6, align 8 + %10 = load ptr, ptr %a6, align 8 + %11 = load float, ptr %10, align 8 + %fmul = fmul float %11, 2.000000e+00 + store float %fmul, ptr %10, align 8 + %12 = load ptr, ptr %a6, align 8 + %13 = load float, ptr %12, align 8 + %fpfpext7 = fpext float %13 to double + call void (ptr, ...) @printf(ptr @.str.1, double %fpfpext7) + br label %loop.cond2 + +loop.exit8: ; preds = %loop.cond2 + store i64 3, ptr %.anon9, align 8 + br label %loop.cond10 + +loop.cond10: ; preds = %loop.body12, %loop.exit8 + %14 = load i64, ptr %.anon9, align 8 + %gt11 = icmp ugt i64 %14, 0 + br i1 %gt11, label %loop.body12, label %loop.exit16 + +loop.body12: ; preds = %loop.cond10 + %15 = load i64, ptr %.anon9, align 8 + %sub13 = sub i64 %15, 1 + store i64 %sub13, ptr %.anon9, align 8 + %16 = load i64, ptr %.anon9, align 8 + %17 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %16 + store ptr %17, ptr %a14, align 8 + %18 = load ptr, ptr %a14, align 8 + %19 = load float, ptr %18, align 8 + %fpfpext15 = fpext float %19 to double + call void (ptr, ...) @printf(ptr @.str.2, double %fpfpext15) + br label %loop.cond10 + +loop.exit16: ; preds = %loop.cond10 + store i64 3, ptr %.anon17, align 8 + br label %loop.cond18 + +loop.cond18: ; preds = %loop.body20, %loop.exit16 + %20 = load i64, ptr %.anon17, align 8 + %gt19 = icmp ugt i64 %20, 0 + br i1 %gt19, label %loop.body20, label %loop.exit24 + +loop.body20: ; preds = %loop.cond18 + %21 = load i64, ptr %.anon17, align 8 + %sub21 = sub i64 %21, 1 + store i64 %sub21, ptr %.anon17, align 8 + %22 = load i64, ptr %.anon17, align 8 + store i64 %22, ptr %i, align 8 + %23 = load i64, ptr %.anon17, align 8 + %24 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %23 + %25 = load float, ptr %24, align 4 + store float %25, ptr %a22, align 4 + %26 = load i64, ptr %i, align 8 + %27 = load float, ptr %a22, align 4 + %fpfpext23 = fpext float %27 to double + call void (ptr, ...) @printf(ptr @.str.3, i64 %26, double %fpfpext23) + br label %loop.cond18 + +loop.exit24: ; preds = %loop.cond18 + store i64 3, ptr %.anon25, align 8 + br label %loop.cond26 + +loop.cond26: ; preds = %loop.body28, %loop.exit24 + %28 = load i64, ptr %.anon25, align 8 + %gt27 = icmp ugt i64 %28, 0 + br i1 %gt27, label %loop.body28, label %loop.exit33 + +loop.body28: ; preds = %loop.cond26 + %29 = load i64, ptr %.anon25, align 8 + %sub29 = sub i64 %29, 1 + store i64 %sub29, ptr %.anon25, align 8 + %30 = load i64, ptr %.anon25, align 8 + %ztrunc = trunc i64 %30 to i8 + store i8 %ztrunc, ptr %i30, align 1 + %31 = load i64, ptr %.anon25, align 8 + %32 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %31 + %33 = load float, ptr %32, align 4 + %fpfpext32 = fpext float %33 to double + store double %fpfpext32, ptr %a31, align 8 + %34 = load i8, ptr %i30, align 1 + %uisiext = zext i8 %34 to i32 + %35 = load double, ptr %a31, align 8 + call void (ptr, ...) @printf(ptr @.str.4, i32 %uisiext, double %35) + br label %loop.cond26 + +loop.exit33: ; preds = %loop.cond26 + store i64 3, ptr %.anon34, align 8 + br label %loop.cond35 + +loop.cond35: ; preds = %loop.body37, %loop.exit33 + %36 = load i64, ptr %.anon34, align 8 + %gt36 = icmp ugt i64 %36, 0 + br i1 %gt36, label %loop.body37, label %loop.exit41 + +loop.body37: ; preds = %loop.cond35 + %37 = load i64, ptr %.anon34, align 8 + %sub38 = sub i64 %37, 1 + store i64 %sub38, ptr %.anon34, align 8 + %38 = load i64, ptr %.anon34, align 8 + %39 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %38 + %40 = load float, ptr %39, align 4 + %fpfpext40 = fpext float %40 to double + store double %fpfpext40, ptr %a39, align 8 + %41 = load double, ptr %a39, align 8 + call void (ptr, ...) @printf(ptr @.str.5, double %41) + br label %loop.cond35 + +loop.exit41: ; preds = %loop.cond35 + store i64 3, ptr %.anon42, align 8 + br label %loop.cond43 + +loop.cond43: ; preds = %loop.body45, %loop.exit41 + %42 = load i64, ptr %.anon42, align 8 + %gt44 = icmp ugt i64 %42, 0 + br i1 %gt44, label %loop.body45, label %loop.exit49 + +loop.body45: ; preds = %loop.cond43 + %43 = load i64, ptr %.anon42, align 8 + %sub46 = sub i64 %43, 1 + store i64 %sub46, ptr %.anon42, align 8 + %44 = load <3 x float>, ptr %foo2, align 16 + %45 = load i64, ptr %.anon42, align 8 + %46 = extractelement <3 x float> %44, i64 %45 + store float %46, ptr %a47, align 4 + %47 = load float, ptr %a47, align 4 + %fpfpext48 = fpext float %47 to double + call void (ptr, ...) @printf(ptr @.str.6, double %fpfpext48) + br label %loop.cond43 + +loop.exit49: ; preds = %loop.cond43 + store i64 3, ptr %.anon50, align 8 + br label %loop.cond51 + +loop.cond51: ; preds = %loop.body53, %loop.exit49 + %48 = load i64, ptr %.anon50, align 8 + %gt52 = icmp ugt i64 %48, 0 + br i1 %gt52, label %loop.body53, label %loop.exit58 + +loop.body53: ; preds = %loop.cond51 + %49 = load i64, ptr %.anon50, align 8 + %sub54 = sub i64 %49, 1 + store i64 %sub54, ptr %.anon50, align 8 + %50 = load i64, ptr %.anon50, align 8 + %51 = getelementptr inbounds <3 x float>, ptr %foo2, i64 0, i64 %50 + store ptr %51, ptr %a55, align 8 + %52 = load ptr, ptr %a55, align 8 + %53 = load float, ptr %52, align 8 + %fmul56 = fmul float %53, 2.000000e+00 + store float %fmul56, ptr %52, align 8 + %54 = load ptr, ptr %a55, align 8 + %55 = load float, ptr %54, align 8 + %fpfpext57 = fpext float %55 to double + call void (ptr, ...) @printf(ptr @.str.7, double %fpfpext57) + br label %loop.cond51 + +loop.exit58: ; preds = %loop.cond51 + store i64 3, ptr %.anon59, align 8 + br label %loop.cond60 + +loop.cond60: ; preds = %loop.body62, %loop.exit58 + %56 = load i64, ptr %.anon59, align 8 + %gt61 = icmp ugt i64 %56, 0 + br i1 %gt61, label %loop.body62, label %loop.exit67 + +loop.body62: ; preds = %loop.cond60 + %57 = load i64, ptr %.anon59, align 8 + %sub63 = sub i64 %57, 1 + store i64 %sub63, ptr %.anon59, align 8 + %58 = load i64, ptr %.anon59, align 8 + store i64 %58, ptr %i64, align 8 + %59 = load <3 x float>, ptr %foo2, align 16 + %60 = load i64, ptr %.anon59, align 8 + %61 = extractelement <3 x float> %59, i64 %60 + store float %61, ptr %a65, align 4 + %62 = load i64, ptr %i64, align 8 + %63 = load float, ptr %a65, align 4 + %fpfpext66 = fpext float %63 to double + call void (ptr, ...) @printf(ptr @.str.8, i64 %62, double %fpfpext66) + br label %loop.cond60 + +loop.exit67: ; preds = %loop.cond60 + store i64 3, ptr %.anon68, align 8 + br label %loop.cond69 + +loop.cond69: ; preds = %loop.body71, %loop.exit67 + %64 = load i64, ptr %.anon68, align 8 + %gt70 = icmp ugt i64 %64, 0 + br i1 %gt70, label %loop.body71, label %loop.exit78 + +loop.body71: ; preds = %loop.cond69 + %65 = load i64, ptr %.anon68, align 8 + %sub72 = sub i64 %65, 1 + store i64 %sub72, ptr %.anon68, align 8 + %66 = load i64, ptr %.anon68, align 8 + %ztrunc74 = trunc i64 %66 to i8 + store i8 %ztrunc74, ptr %i73, align 1 + %67 = load <3 x float>, ptr %foo2, align 16 + %68 = load i64, ptr %.anon68, align 8 + %69 = extractelement <3 x float> %67, i64 %68 + %fpfpext76 = fpext float %69 to double + store double %fpfpext76, ptr %a75, align 8 + %70 = load i8, ptr %i73, align 1 + %uisiext77 = zext i8 %70 to i32 + %71 = load double, ptr %a75, align 8 + call void (ptr, ...) @printf(ptr @.str.9, i32 %uisiext77, double %71) + br label %loop.cond69 + +loop.exit78: ; preds = %loop.cond69 + store i64 3, ptr %.anon79, align 8 + br label %loop.cond80 + +loop.cond80: ; preds = %loop.body82, %loop.exit78 + %72 = load i64, ptr %.anon79, align 8 + %gt81 = icmp ugt i64 %72, 0 + br i1 %gt81, label %loop.body82, label %loop.exit86 + +loop.body82: ; preds = %loop.cond80 + %73 = load i64, ptr %.anon79, align 8 + %sub83 = sub i64 %73, 1 + store i64 %sub83, ptr %.anon79, align 8 + %74 = load <3 x float>, ptr %foo2, align 16 + %75 = load i64, ptr %.anon79, align 8 + %76 = extractelement <3 x float> %74, i64 %75 + %fpfpext85 = fpext float %76 to double + store double %fpfpext85, ptr %a84, align 8 + %77 = load double, ptr %a84, align 8 + call void (ptr, ...) @printf(ptr @.str.10, double %77) + br label %loop.cond80 + +loop.exit86: ; preds = %loop.cond80 ret void } diff --git a/test/test_suite/statements/foreach_r_custom.c3t b/test/test_suite/statements/foreach_r_custom.c3t index 646ae4287..9540756fa 100644 --- a/test/test_suite/statements/foreach_r_custom.c3t +++ b/test/test_suite/statements/foreach_r_custom.c3t @@ -41,39 +41,37 @@ entry: %.anon = alloca i64, align 8 %f = alloca i32, align 4 %index = alloca i64, align 8 - %0 = bitcast [3 x i32]* %i to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %2 = bitcast [3 x i32]* %i to i32* - %3 = insertvalue %"int[]" undef, i32* %2, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, %"int[]"* %1, align 8 - %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %.anon, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %1 = insertvalue %"int[]" undef, ptr %i, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + store %"int[]" %2, ptr %0, align 8 + %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %entry - %8 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 %8, 0 + %6 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 %6, 0 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %9 = load i64, i64* %.anon, align 8 - %sub = sub i64 %9, 1 - store i64 %sub, i64* %.anon, align 8 - %10 = load i64, i64* %.anon, align 8 - store i64 %10, i64* %index, align 8 - %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 - %13 = load i32*, i32** %12, align 8 - %14 = load i64, i64* %index, align 8 - %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 - %15 = load i32, i32* %ptroffset, align 4 - store i32 %15, i32* %f, align 4 - %16 = load i32, i32* %f, align 4 - %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + %7 = load i64, ptr %.anon, align 8 + %sub = sub i64 %7, 1 + store i64 %sub, ptr %.anon, align 8 + %8 = load i64, ptr %.anon, align 8 + store i64 %8, ptr %index, align 8 + %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 + %11 = load ptr, ptr %10, align 8 + %12 = load i64, ptr %index, align 8 + %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 + %13 = load i32, ptr %ptroffset, align 4 + store i32 %13, ptr %f, align 4 + %14 = load i32, ptr %f, align 4 + %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) br label %loop.body1 loop.body1: ; preds = %loop.body @@ -84,10 +82,10 @@ loop.exit: ; preds = %loop.body1, %loop.c } ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: call void @test_main() ret i32 0 diff --git a/test/test_suite/statements/foreach_r_custom_macro.c3t b/test/test_suite/statements/foreach_r_custom_macro.c3t index 72bd73583..7133b7456 100644 --- a/test/test_suite/statements/foreach_r_custom_macro.c3t +++ b/test/test_suite/statements/foreach_r_custom_macro.c3t @@ -40,39 +40,37 @@ entry: %.anon = alloca i64, align 8 %f = alloca i32, align 4 %index = alloca i64, align 8 - %0 = bitcast [3 x i32]* %i to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %2 = bitcast [3 x i32]* %i to i32* - %3 = insertvalue %"int[]" undef, i32* %2, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, %"int[]"* %1, align 8 - %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %.anon, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %1 = insertvalue %"int[]" undef, ptr %i, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + store %"int[]" %2, ptr %0, align 8 + %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %entry - %8 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 %8, 0 + %6 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 %6, 0 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %9 = load i64, i64* %.anon, align 8 - %sub = sub i64 %9, 1 - store i64 %sub, i64* %.anon, align 8 - %10 = load i64, i64* %.anon, align 8 - store i64 %10, i64* %index, align 8 - %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 - %13 = load i32*, i32** %12, align 8 - %14 = load i64, i64* %index, align 8 - %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 - %15 = load i32, i32* %ptroffset, align 4 - store i32 %15, i32* %f, align 4 - %16 = load i32, i32* %f, align 4 - %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + %7 = load i64, ptr %.anon, align 8 + %sub = sub i64 %7, 1 + store i64 %sub, ptr %.anon, align 8 + %8 = load i64, ptr %.anon, align 8 + store i64 %8, ptr %index, align 8 + %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 + %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 + %11 = load ptr, ptr %10, align 8 + %12 = load i64, ptr %index, align 8 + %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 + %13 = load i32, ptr %ptroffset, align 4 + store i32 %13, ptr %f, align 4 + %14 = load i32, ptr %f, align 4 + %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) br label %loop.body1 loop.body1: ; preds = %loop.body @@ -83,10 +81,10 @@ loop.exit: ; preds = %loop.body1, %loop.c } ; Function Attrs: nounwind -declare i32 @printf(i8*, ...) #0 +declare i32 @printf(ptr, ...) #0 ; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: call void @test_main() ret i32 0 diff --git a/test/test_suite/statements/foreach_wrong_index.c3 b/test/test_suite/statements/foreach_wrong_index.c3 index a89041c8b..67f1580b3 100644 --- a/test/test_suite/statements/foreach_wrong_index.c3 +++ b/test/test_suite/statements/foreach_wrong_index.c3 @@ -19,9 +19,9 @@ fn void main() { Foo f; - io::printfln("%s", f[12.2]); + io::printfn("%s", f[12.2]); foreach (int i, value : f) // #error: Only integer { - io::printfln("v[%s] = %s", i, value); + io::printfn("v[%s] = %s", i, value); } } \ No newline at end of file diff --git a/test/test_suite/statements/if_tests.c3t b/test/test_suite/statements/if_tests.c3t index 153203ad7..472808f28 100644 --- a/test/test_suite/statements/if_tests.c3t +++ b/test/test_suite/statements/if_tests.c3t @@ -31,15 +31,15 @@ fn void test3(int x) define void @iftest_test1(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %0, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %1, 0 br i1 %gt, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, i32* %x, align 4 + %2 = load i32, ptr %x, align 4 %add = add i32 %2, 1 - store i32 %add, i32* %x, align 4 + store i32 %add, ptr %x, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry @@ -55,15 +55,15 @@ entry: define void @iftest_test3(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, i32* %x, align 4 - %1 = load i32, i32* %x, align 4 + store i32 %0, ptr %x, align 4 + %1 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %1, 0 br i1 %gt, label %if.exit, label %if.else if.else: ; preds = %entry - %2 = load i32, i32* %x, align 4 + %2 = load i32, ptr %x, align 4 %add = add i32 %2, 1 - store i32 %add, i32* %x, align 4 + store i32 %add, ptr %x, align 4 br label %if.exit if.exit: ; preds = %if.else, %entry diff --git a/test/test_suite/statements/labelled_continue_for.c3t b/test/test_suite/statements/labelled_continue_for.c3t index 5ceb5be9b..c5b3c254c 100644 --- a/test/test_suite/statements/labelled_continue_for.c3t +++ b/test/test_suite/statements/labelled_continue_for.c3t @@ -29,24 +29,24 @@ entry: %i = alloca i32, align 4 %j = alloca i32, align 4 %k = alloca i32, align 4 - store i32 0, i32* %i, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.inc, %entry - %0 = load i32, i32* %i, align 4 + %0 = load i32, ptr %i, align 4 %lt = icmp slt i32 %0, 10 br i1 %lt, label %loop.body, label %loop.exit9 loop.body: ; preds = %loop.cond - store i32 0, i32* %j, align 4 + store i32 0, ptr %j, align 4 br label %loop.cond1 loop.cond1: ; preds = %loop.exit, %loop.body - %1 = load i32, i32* %j, align 4 + %1 = load i32, ptr %j, align 4 %lt2 = icmp slt i32 %1, 10 br i1 %lt2, label %loop.body3, label %loop.exit7 loop.body3: ; preds = %loop.cond1 - store i32 0, i32* %k, align 4 + store i32 0, ptr %k, align 4 br label %loop.cond4 loop.cond4: ; preds = %loop.body3 - %2 = load i32, i32* %k, align 4 + %2 = load i32, ptr %k, align 4 %lt5 = icmp slt i32 %2, 10 br i1 %lt5, label %loop.body6, label %loop.exit loop.body6: ; preds = %loop.cond4 @@ -54,17 +54,17 @@ loop.body6: ; preds = %loop.cond4 br label %loop.inc loop.exit: ; preds = %loop.cond4 call void @labelled_continue_for_errored() - %3 = load i32, i32* %j, align 4 + %3 = load i32, ptr %j, align 4 %add = add i32 %3, 1 - store i32 %add, i32* %j, align 4 + store i32 %add, ptr %j, align 4 br label %loop.cond1 loop.exit7: ; preds = %loop.cond1 call void @labelled_continue_for_errored() br label %loop.inc loop.inc: ; preds = %loop.exit7, %loop.body6 - %4 = load i32, i32* %i, align 4 + %4 = load i32, ptr %i, align 4 %add8 = add i32 %4, 1 - store i32 %add8, i32* %i, align 4 + store i32 %add8, ptr %i, align 4 br label %loop.cond loop.exit9: ; preds = %loop.cond ret void diff --git a/test/test_suite/statements/ranged_switch.c3t b/test/test_suite/statements/ranged_switch.c3t index 4b36be425..1dd39bef2 100644 --- a/test/test_suite/statements/ranged_switch.c3t +++ b/test/test_suite/statements/ranged_switch.c3t @@ -48,6 +48,25 @@ fn void main() /* #expect: foo.ll +source_filename = "foo" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" + +@.str = private unnamed_addr constant [5 x i8] c"1-3\0A\00", align 1 +@.str.1 = private unnamed_addr constant [10 x i8] c"7-277 %d\0A\00", align 1 +@.str.2 = private unnamed_addr constant [8 x i8] c"4-5 %d\0A\00", align 1 +@.str.3 = private unnamed_addr constant [6 x i8] c"6 %d\0A\00", align 1 +@.str.4 = private unnamed_addr constant [20 x i8] c"Something else: %d\0A\00", align 1 +@.str.5 = private unnamed_addr constant [5 x i8] c"1-3\0A\00", align 1 +@.str.6 = private unnamed_addr constant [8 x i8] c"4-6 %d\0A\00", align 1 +@.str.7 = private unnamed_addr constant [20 x i8] c"Something else: %d\0A\00", align 1 +@.str.8 = private unnamed_addr constant [11 x i8] c"Was true!\0A\00", align 1 +@.str.9 = private unnamed_addr constant [12 x i8] c"Was false!\0A\00", align 1 + +; Function Attrs: nounwind +declare void @printf(ptr, ...) #0 + +; Function Attrs: nounwind define void @foo_main() #0 { entry: %i = alloca i32, align 4 @@ -56,28 +75,28 @@ entry: %switch15 = alloca i32, align 4 %x = alloca i8, align 1 %switch23 = alloca i8, align 1 - store i32 0, i32* %i, align 4 + store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %switch.exit, %entry - %0 = load i32, i32* %i, align 4 + %0 = load i32, ptr %i, align 4 %lt = icmp slt i32 %0, 12 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %1 = load i32, i32* %i, align 4 - store i32 %1, i32* %switch, align 4 + %1 = load i32, ptr %i, align 4 + store i32 %1, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body - %2 = load i32, i32* %switch, align 4 + %2 = load i32, ptr %switch, align 4 %le = icmp sle i32 1, %2 %ge = icmp sge i32 3, %2 %3 = and i1 %le, %ge br i1 %3, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str) br label %switch.exit next_if: ; preds = %switch.entry @@ -87,8 +106,8 @@ next_if: ; preds = %switch.entry br i1 %4, label %switch.case3, label %next_if4 switch.case3: ; preds = %next_if - %5 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 %5) + %5 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %5) br label %switch.exit next_if4: ; preds = %next_if @@ -98,8 +117,8 @@ next_if4: ; preds = %next_if br i1 %6, label %switch.case7, label %next_if8 switch.case7: ; preds = %switch.default, %next_if4 - %7 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 %7) + %7 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.2, i32 %7) br label %switch.exit next_if8: ; preds = %next_if4 @@ -107,40 +126,40 @@ next_if8: ; preds = %next_if4 br i1 %eq, label %switch.case9, label %next_if10 switch.case9: ; preds = %next_if8 - %8 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i32 %8) + %8 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.3, i32 %8) br label %switch.exit next_if10: ; preds = %next_if8 br label %switch.default switch.default: ; preds = %next_if10 - %9 = load i32, i32* %i, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %9) + %9 = load i32, ptr %i, align 4 + call void (ptr, ...) @printf(ptr @.str.4, i32 %9) br label %switch.case7 switch.exit: ; preds = %switch.case9, %switch.case7, %switch.case3, %switch.case - %10 = load i32, i32* %i, align 4 + %10 = load i32, ptr %i, align 4 %add = add i32 %10, 1 - store i32 %add, i32* %i, align 4 + store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - store i32 0, i32* %i11, align 4 + store i32 0, ptr %i11, align 4 br label %loop.cond12 loop.cond12: ; preds = %switch.exit20, %loop.exit - %11 = load i32, i32* %i11, align 4 + %11 = load i32, ptr %i11, align 4 %lt13 = icmp slt i32 %11, 12 br i1 %lt13, label %loop.body14, label %loop.exit22 loop.body14: ; preds = %loop.cond12 - %12 = load i32, i32* %i11, align 4 - store i32 %12, i32* %switch15, align 4 + %12 = load i32, ptr %i11, align 4 + store i32 %12, ptr %switch15, align 4 br label %switch.entry16 switch.entry16: ; preds = %loop.body14 - %13 = load i32, i32* %switch15, align 4 + %13 = load i32, ptr %switch15, align 4 switch i32 %13, label %switch.default19 [ i32 1, label %switch.case17 i32 2, label %switch.case17 @@ -151,39 +170,39 @@ switch.entry16: ; preds = %loop.body14 ] switch.case17: ; preds = %switch.entry16, %switch.entry16, %switch.entry16 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.5) br label %switch.exit20 switch.case18: ; preds = %switch.default19, %switch.entry16, %switch.entry16, %switch.entry16 - %14 = load i32, i32* %i11, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0), i32 %14) + %14 = load i32, ptr %i11, align 4 + call void (ptr, ...) @printf(ptr @.str.6, i32 %14) br label %switch.exit20 switch.default19: ; preds = %switch.entry16 - %15 = load i32, i32* %i11, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.7, i32 0, i32 0), i32 %15) + %15 = load i32, ptr %i11, align 4 + call void (ptr, ...) @printf(ptr @.str.7, i32 %15) br label %switch.case18 switch.exit20: ; preds = %switch.case18, %switch.case17 - %16 = load i32, i32* %i11, align 4 + %16 = load i32, ptr %i11, align 4 %add21 = add i32 %16, 1 - store i32 %add21, i32* %i11, align 4 + store i32 %add21, ptr %i11, align 4 br label %loop.cond12 loop.exit22: ; preds = %loop.cond12 - store i8 0, i8* %x, align 1 - %17 = load i8, i8* %x, align 1 - store i8 %17, i8* %switch23, align 1 + store i8 0, ptr %x, align 1 + %17 = load i8, ptr %x, align 1 + store i8 %17, ptr %switch23, align 1 br label %switch.entry24 switch.entry24: ; preds = %loop.exit22 - %18 = load i8, i8* %switch23, align 1 + %18 = load i8, ptr %switch23, align 1 %19 = trunc i8 %18 to i1 %eq25 = icmp eq i1 true, %19 br i1 %eq25, label %switch.case26, label %next_if27 switch.case26: ; preds = %switch.entry24 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.8, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.8) br label %switch.exit31 next_if27: ; preds = %switch.entry24 @@ -191,7 +210,7 @@ next_if27: ; preds = %switch.entry24 br i1 %eq28, label %switch.case29, label %next_if30 switch.case29: ; preds = %next_if27 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.9) br label %switch.exit31 next_if30: ; preds = %next_if27 @@ -200,3 +219,12 @@ next_if30: ; preds = %next_if27 switch.exit31: ; preds = %next_if30, %switch.case29, %switch.case26 ret void } + +; Function Attrs: nounwind +define i32 @main(i32 %0, ptr %1) #0 { +entry: + call void @foo_main() + ret i32 0 +} + +attributes #0 = { nounwind } diff --git a/test/test_suite/statements/return_switch.c3t b/test/test_suite/statements/return_switch.c3t index 40b43ea6b..4b8295f83 100644 --- a/test/test_suite/statements/return_switch.c3t +++ b/test/test_suite/statements/return_switch.c3t @@ -17,7 +17,7 @@ fn int testReturnSwitch() // #expect: return_switch.ll switch.entry: - %1 = load i32, i32* %switch + %1 = load i32, ptr %switch switch i32 %1, label %switch.default [ i32 0, label %switch.case i32 3, label %switch.case diff --git a/test/test_suite/statements/simple_do.c3t b/test/test_suite/statements/simple_do.c3t index 132605831..e2e4a18a3 100644 --- a/test/test_suite/statements/simple_do.c3t +++ b/test/test_suite/statements/simple_do.c3t @@ -25,25 +25,46 @@ fn void main() } while (i++ < 100); } -// #expect: foo.ll +/* #expect: foo.ll +source_filename = "foo" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" +@"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 + +; Function Attrs: nounwind +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 +} + +; Function Attrs: nounwind +declare void @printf(ptr, ...) #0 + +; Function Attrs: nounwind define void @foo_main() #0 { entry: %i = alloca i32, align 4 - store i32 10, i32* %i, align 4 + store i32 10, ptr %i, align 4 br label %loop.body loop.cond: ; preds = %if.exit - %0 = load i32, i32* %i, align 4 + %0 = load i32, ptr %i, align 4 %sub = sub i32 %0, 1 - store i32 %sub, i32* %i, align 4 + 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 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) - %2 = load i32, i32* %i, align 4 + 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 @@ -54,21 +75,21 @@ if.exit: ; preds = %loop.body br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond - store i32 1, i32* %i, align 4 + store i32 1, ptr %i, align 4 br label %loop.body3 loop.cond2: ; preds = %if.exit5 - %3 = load i32, i32* %i, align 4 + %3 = load i32, ptr %i, align 4 %add = add i32 %3, 1 - store i32 %add, i32* %i, align 4 + 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 = load i32, i32* %i, align 4 + %4 = load i32, ptr %i, align 4 %5 = call i32 @foo_test() - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %4, i32 %5) - %6 = load i32, i32* %i, align 4 + call void (ptr, ...) @printf(ptr @.str.1, i32 %4, i32 %5) + %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 @@ -81,4 +102,11 @@ if.exit5: ; preds = %loop.body3 loop.exit6: ; preds = %if.then4, %loop.cond2 ret void -} \ No newline at end of file +} + +; Function Attrs: nounwind +define i32 @main(i32 %0, ptr %1) #0 { +entry: + call void @foo_main() + ret i32 0 +} diff --git a/test/test_suite/statements/various_switching.c3t b/test/test_suite/statements/various_switching.c3t index 758c6c146..8962c0bb4 100644 --- a/test/test_suite/statements/various_switching.c3t +++ b/test/test_suite/statements/various_switching.c3t @@ -81,82 +81,82 @@ entry: %zy = alloca i32, align 4 %switch17 = alloca i32, align 4 %switch27 = alloca i8, align 1 - store i64 ptrtoint (%.fault* @"mymodule_ByeErr$BAR" to i64), i64* %x.f, align 8 - store i64 ptrtoint (%.introspect* @"ct$int" to i64), i64* %z, align 8 + store i64 ptrtoint (ptr @"mymodule_ByeErr$BAR" to i64), ptr %x.f, align 8 + store i64 ptrtoint (ptr @"ct$int" to i64), ptr %z, align 8 br label %testblock testblock: ; preds = %entry - %optval = load i64, i64* %x.f, align 8 + %optval = load i64, ptr %x.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 + store i64 %optval, ptr %err, align 8 br label %end_block after_check: ; preds = %testblock - store i64 0, i64* %err, align 8 + store i64 0, ptr %err, align 8 br label %end_block end_block: ; preds = %after_check, %assign_optional - %0 = load i64, i64* %err, align 8 + %0 = load i64, ptr %err, align 8 %neq = icmp ne i64 %0, 0 br i1 %neq, label %if.then, label %if.exit if.then: ; preds = %end_block - store i64 %0, i64* %switch, align 8 + store i64 %0, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %if.then - %1 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.fault* @"mymodule_HelloErr$FOO" to i64), %1 + %1 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"mymodule_HelloErr$FOO" to i64), %1 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str) br label %switch.exit next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (%.fault* @"mymodule_ByeErr$BAR" to i64), %1 + %eq1 = icmp eq i64 ptrtoint (ptr @"mymodule_ByeErr$BAR" to i64), %1 br i1 %eq1, label %switch.case2, label %next_if3 switch.case2: ; preds = %next_if - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.3) br label %switch.exit next_if3: ; preds = %next_if br label %switch.default switch.default: ; preds = %next_if3 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.4) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case2, %switch.case br label %if.exit if.exit: ; preds = %switch.exit, %end_block - %2 = load i64, i64* %z, align 8 - store i64 %2, i64* %switch4, align 8 + %2 = load i64, ptr %z, align 8 + store i64 %2, ptr %switch4, align 8 br label %switch.entry5 switch.entry5: ; preds = %if.exit - %3 = load i64, i64* %switch4, align 8 - %eq6 = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %3 + %3 = load i64, ptr %switch4, align 8 + %eq6 = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %3 br i1 %eq6, label %switch.case7, label %next_if8 switch.case7: ; preds = %switch.entry5 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.5) br label %switch.exit16 next_if8: ; preds = %switch.entry5 - %eq9 = icmp eq i64 ptrtoint (%.introspect* @"ct$bool" to i64), %3 + %eq9 = icmp eq i64 ptrtoint (ptr @"ct$bool" to i64), %3 br i1 %eq9, label %switch.case10, label %next_if11 switch.case10: ; preds = %next_if8 br label %switch.case13 next_if11: ; preds = %next_if8 - %eq12 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %3 + %eq12 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %3 br i1 %eq12, label %switch.case13, label %next_if14 switch.case13: ; preds = %next_if11, %switch.case10 @@ -166,79 +166,79 @@ next_if14: ; preds = %next_if11 br label %switch.default15 switch.default15: ; preds = %next_if14, %switch.case13 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.6, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.6) br label %switch.exit16 switch.exit16: ; preds = %switch.default15, %switch.case7 - store i32 1, i32* %a, align 4 - store i32 2, i32* %b, align 4 - %4 = load i32, i32* %b, align 4 - %5 = load i32, i32* %a, align 4 + store i32 1, ptr %a, align 4 + store i32 2, ptr %b, align 4 + %4 = load i32, ptr %b, align 4 + %5 = load i32, ptr %a, align 4 %add = add i32 %4, %5 - store i32 %add, i32* %zy, align 4 - %6 = load i32, i32* %zy, align 4 - store i32 %6, i32* %switch17, align 4 + store i32 %add, ptr %zy, align 4 + %6 = load i32, ptr %zy, align 4 + store i32 %6, ptr %switch17, align 4 br label %switch.entry18 switch.entry18: ; preds = %switch.exit16 - %7 = load i32, i32* %switch17, align 4 - %8 = load i32, i32* %a, align 4 + %7 = load i32, ptr %switch17, align 4 + %8 = load i32, ptr %a, align 4 %eq19 = icmp eq i32 %8, %7 br i1 %eq19, label %switch.case20, label %next_if21 switch.case20: ; preds = %switch.entry18 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.7) br label %switch.exit26 next_if21: ; preds = %switch.entry18 - %9 = load i32, i32* %b, align 4 + %9 = load i32, ptr %b, align 4 %eq22 = icmp eq i32 %9, %7 br i1 %eq22, label %switch.case23, label %next_if24 switch.case23: ; preds = %next_if21 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.8, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.8) br label %switch.exit26 next_if24: ; preds = %next_if21 br label %switch.default25 switch.default25: ; preds = %next_if24 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.9, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.9) br label %switch.exit26 switch.exit26: ; preds = %switch.default25, %switch.case23, %switch.case20 - store i8 1, i8* %switch27, align 1 + store i8 1, ptr %switch27, align 1 br label %switch.entry28 switch.entry28: ; preds = %switch.exit26 - %10 = load i8, i8* %switch27, align 1 + %10 = load i8, ptr %switch27, align 1 %11 = trunc i8 %10 to i1 - %12 = load i32, i32* %a, align 4 + %12 = load i32, ptr %a, align 4 %lt = icmp slt i32 %12, 0 %eq29 = icmp eq i1 %lt, %11 br i1 %eq29, label %switch.case30, label %next_if31 switch.case30: ; preds = %switch.entry28 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.10, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.10) br label %switch.exit37 next_if31: ; preds = %switch.entry28 - %13 = load i32, i32* %a, align 4 + %13 = load i32, ptr %a, align 4 %eq32 = icmp eq i32 %13, 1 %eq33 = icmp eq i1 %eq32, %11 br i1 %eq33, label %switch.case34, label %next_if35 switch.case34: ; preds = %next_if31 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.11, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.11) br label %switch.exit37 next_if35: ; preds = %next_if31 br label %switch.default36 switch.default36: ; preds = %next_if35 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.12) br label %switch.exit37 switch.exit37: ; preds = %switch.default36, %switch.case34, %switch.case30 ret void -} \ No newline at end of file +} diff --git a/test/test_suite/statements/while_switch.c3t b/test/test_suite/statements/while_switch.c3t index 855ddbfa7..0167e2c3b 100644 --- a/test/test_suite/statements/while_switch.c3t +++ b/test/test_suite/statements/while_switch.c3t @@ -30,10 +30,20 @@ fn int main() /* #expect: test.ll +source_filename = "test" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" @.str = private unnamed_addr constant [2 x i8] c"3\00", align 1 @.str.1 = private unnamed_addr constant [2 x i8] c"4\00", align 1 +; Function Attrs: nounwind +declare i32 @printf(ptr, ...) #0 + +; Function Attrs: nounwind +declare i32 @foo() #0 + +; Function Attrs: nounwind define i32 @main() #0 { entry: %switch = alloca i32, align 4 @@ -46,11 +56,11 @@ loop.cond: ; preds = %switch.exit, %entry loop.body: ; preds = %loop.cond %1 = call i32 @foo() - store i32 %1, i32* %switch, align 4 + store i32 %1, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body - %2 = load i32, i32* %switch, align 4 + %2 = load i32, ptr %switch, align 4 switch i32 %2, label %switch.default [ i32 0, label %switch.case i32 1, label %switch.case @@ -62,11 +72,11 @@ switch.entry: ; preds = %loop.body ] switch.case: ; preds = %switch.entry, %switch.entry, %switch.entry, %switch.entry - %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) + %3 = call i32 (ptr, ...) @printf(ptr @.str) br label %switch.case1 switch.case1: ; preds = %switch.entry, %switch.case - %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) + %4 = call i32 (ptr, ...) @printf(ptr @.str.1) br label %switch.default switch.default: ; preds = %switch.entry, %switch.entry, %switch.case1, %switch.entry @@ -79,3 +89,4 @@ loop.exit: ; preds = %loop.cond ret i32 0 } +attributes #0 = { nounwind } \ No newline at end of file diff --git a/test/test_suite/stdlib/ascii.c3 b/test/test_suite/stdlib/ascii.c3 index 345569d91..8390b1160 100644 --- a/test/test_suite/stdlib/ascii.c3 +++ b/test/test_suite/stdlib/ascii.c3 @@ -5,19 +5,19 @@ fn void main() { for(char c = 0; c < 255; c++) { - io::printfln("%c (%s) is...:", c, c); - io::printfln("lower: %s; upper: %s; digit: %s; bdigit: %s; odigit: %s; xdigit: %s; alpha: %s; print: %s; graph: %s; space: %s; alnum: %s; punct: %s; blank: %s; cntrl: %s;", + io::printfn("%c (%s) is...:", c, c); + io::printfn("lower: %s; upper: %s; digit: %s; bdigit: %s; odigit: %s; xdigit: %s; alpha: %s; print: %s; graph: %s; space: %s; alnum: %s; punct: %s; blank: %s; cntrl: %s;", c.is_lower(), c.is_upper(), c.is_digit(), c.is_bdigit(), c.is_odigit(), c.is_xdigit(), c.is_alpha(), c.is_print(), c.is_graph(), c.is_space(), c.is_alnum(), c.is_punct(), c.is_blank(), c.is_cntrl()); } foreach(c : "0123456789abcdefghijklmnopqrstuvwxyz") { - io::printfln("'%c'.to_upper(): %c", c, c.to_upper()); + io::printfn("'%c'.to_upper(): %c", c, c.to_upper()); } foreach(c : "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") { - io::printfln("'%c'.to_lower(): %c", c, c.to_lower()); + io::printfn("'%c'.to_lower(): %c", c, c.to_lower()); } } diff --git a/test/test_suite/stdlib/map.c3t b/test/test_suite/stdlib/map.c3t index 2ec384bb5..680a287e6 100644 --- a/test/test_suite/stdlib/map.c3t +++ b/test/test_suite/stdlib/map.c3t @@ -24,106 +24,86 @@ static initialize fn void main() { IntFooMap map; - map.tinit(); - io::printfln("Map size: %d", map.count); + map.init(); + io::printfn("Map size: %d", map.count); map.set(1, Foo { 1, null }); - io::printfln("Map size: %d", map.count); + io::printfn("Map size: %d", map.count); map.set(1, Foo { 2, null }); - io::printfln("Map size: %d", map.count); - io::printfln("Val: %d", map.get(1).x); - io::printfln("Has 1: %s", map.has_key(1)); - io::printfln("Has 2: %s", map.has_key(2)); + io::printfn("Map size: %d", map.count); + io::printfn("Val: %d", map.get(1).x); + io::printfn("Has 1: %s", map.has_key(1)); + io::printfn("Has 2: %s", map.has_key(2)); map.set(7, Foo { 4, null }); - io::printfln("Values: %s", map.value_list()); + io::printfn("Values: %s", map.value_list()); IntDoubleMap map2; - map2.tinit(); + map2.init(); map2.set(4, 1.3); - io::printfln("Map find: %s", map2.has_value(1.3)); - io::printfln("Map find: %s", map2.has_value(1.2)); + io::printfn("Map find: %s", map2.has_value(1.3)); + io::printfn("Map find: %s", map2.has_value(1.2)); map2.set(100, 3.4); - io::printfln("%s", map2.key_list()); - io::printfln("%s", map2.value_list()); + io::printfn("%s", map2.key_list()); + io::printfn("%s", map2.value_list()); @pool() { IntDoubleMap map3; - map3.tinit(); + map3.init(); map3.set(5, 3.2); map3.set(7, 5.2); - io::printfln("%s", map3.key_list()); + io::printfn("%s", map3.key_list()); }; } /* #expect: test.ll - -@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @.static_initialize.0, i8* null }] +@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @.static_initialize.0, ptr null }] define internal void @.static_initialize.0() { entry: - %0 = load i64, i64* getelementptr inbounds (%HashMap, %HashMap* @std_io_tostring_functions, i32 0, i32 0, i32 1), align 8 + %0 = load i64, ptr getelementptr inbounds (%"Entry*[]", ptr @std_io_tostring_functions, i32 0, i32 1), align 8 %not = icmp eq i64 %0, 0 br i1 %not, label %if.then, label %if.exit if.then: ; preds = %entry - %1 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 - call void @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_init"(%HashMap* @std_io_tostring_functions, i32 512, float 7.500000e-01, %Allocator* %1) + %1 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + call void @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_init"(ptr @std_io_tostring_functions, i32 512, float 7.500000e-01, ptr %1) br label %if.exit if.exit: ; preds = %if.then, %entry - %2 = call i8 @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_set"(%HashMap* @std_io_tostring_functions, i64 ptrtoint (%.introspect* @"ct$test_Foo" to i64), { i8*, i64 } (i8*, %Allocator*)* bitcast ({ i8*, i64 } (%Foo*, %Allocator*)* @test_Foo_to_string to { i8*, i64 } (i8*, %Allocator*)*)) + %2 = call i8 @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_set"(ptr @std_io_tostring_functions, i64 ptrtoint (ptr @"ct$test_Foo" to i64), ptr @test_Foo_to_string) ret void } -declare void @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_init"(%HashMap*, i32, float, %Allocator*) - -declare i8 @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_set"(%HashMap*, i64, { i8*, i64 } (i8*, %Allocator*)*) - -; Function Attrs: nounwind -define { i8*, i64 } @test_Foo_to_string(%Foo* %0, %Allocator* %1) #0 { +define { ptr, i64 } @test_Foo_to_string(ptr %0, ptr %1) #0 { entry: - %s = alloca i8*, align 8 + %s = alloca ptr, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [2 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %result = alloca %"char[]", align 8 - %2 = call i8* @std_core_string_new_with_capacity(i64 128, %Allocator* %1) - store i8* %2, i8** %s, align 8 - %3 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 0 - %4 = bitcast i32* %3 to i8* - %5 = insertvalue %variant undef, i8* %4, 0 - %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %7 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 - store %variant %6, %variant* %7, align 16 - %8 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 1 - %9 = bitcast i8** %8 to i8* - %10 = insertvalue %variant undef, i8* %9, 0 - %11 = insertvalue %variant %10, i64 ptrtoint (%.introspect* @"ct$p$void" to i64), 1 - %12 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 - store %variant %11, %variant* %12, align 16 - %13 = bitcast [2 x %variant]* %varargslots to %variant* - %14 = insertvalue %"variant[]" undef, %variant* %13, 0 - %15 = insertvalue %"variant[]" %14, i64 2, 1 - store %"variant[]" %15, %"variant[]"* %taddr, align 8 - %16 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 0 - %lo = load i8*, i8** %17, align 8 - %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 1 - %hi = load i64, i64* %18, align 8 - %19 = call i64 @std_core_string_VarString_printf(i64* %retparam, i8** %s, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %19, 0 + %2 = call ptr @std_core_string_new_with_capacity(i64 128, ptr %1) + store ptr %2, ptr %s, align 8 + %3 = getelementptr inbounds %Foo, ptr %0, i32 0, i32 0 + %4 = insertvalue %variant undef, ptr %3, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %6 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %5, ptr %6, align 16 + %7 = getelementptr inbounds %Foo, ptr %0, i32 0, i32 1 + %8 = insertvalue %variant undef, ptr %7, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$p$void" to i64), 1 + %10 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 + store %variant %9, ptr %10, align 16 + %11 = call i64 @std_core_string_VarString_printf(ptr %retparam, ptr %s, ptr @.str.12, i64 8, ptr %varargslots, i64 2) + %not_err = icmp eq i64 %11, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %20 = load i8*, i8** %s, align 8 - %21 = call { i8*, i64 } @std_core_string_VarString_str(i8* %20) - %22 = bitcast %"char[]"* %result to { i8*, i64 }* - store { i8*, i64 } %21, { i8*, i64 }* %22, align 8 - %23 = bitcast %"char[]"* %result to { i8*, i64 }* - %24 = load { i8*, i64 }, { i8*, i64 }* %23, align 8 - ret { i8*, i64 } %24 + %12 = load ptr, ptr %s, align 8 + %13 = call { ptr, i64 } @std_core_string_VarString_str(ptr %12) + store { ptr, i64 } %13, ptr %result, align 8 + %14 = load { ptr, i64 }, ptr %result, align 8 + ret { ptr, i64 } %14 } ; Function Attrs: nounwind @@ -132,456 +112,295 @@ entry: %map = alloca %HashMap.0, align 8 %retparam = alloca i64, align 8 %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca %"variant[]", align 8 %literal = alloca %Foo, align 8 - %retparam3 = alloca i64, align 8 - %varargslots4 = alloca [1 x %variant], align 16 - %taddr5 = alloca %"variant[]", align 8 - %literal11 = alloca %Foo, align 8 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %literal6 = alloca %Foo, align 8 + %retparam9 = alloca i64, align 8 + %varargslots10 = alloca [1 x %variant], align 16 %retparam14 = alloca i64, align 8 %varargslots15 = alloca [1 x %variant], align 16 - %taddr16 = alloca %"variant[]", align 8 + %retparam16 = alloca %Foo, align 8 %retparam22 = alloca i64, align 8 %varargslots23 = alloca [1 x %variant], align 16 - %retparam24 = alloca %Foo, align 8 - %taddr27 = alloca %"variant[]", align 8 - %retparam33 = alloca i64, align 8 - %varargslots34 = alloca [1 x %variant], align 16 - %taddr35 = alloca i8, align 1 - %taddr36 = alloca %"variant[]", align 8 - %retparam42 = alloca i64, align 8 - %varargslots43 = alloca [1 x %variant], align 16 - %taddr44 = alloca i8, align 1 - %taddr45 = alloca %"variant[]", align 8 - %literal51 = alloca %Foo, align 8 - %retparam54 = alloca i64, align 8 - %varargslots55 = alloca [1 x %variant], align 16 + %taddr = alloca i8, align 1 + %retparam27 = alloca i64, align 8 + %varargslots28 = alloca [1 x %variant], align 16 + %taddr29 = alloca i8, align 1 + %literal33 = alloca %Foo, align 8 + %retparam36 = alloca i64, align 8 + %varargslots37 = alloca [1 x %variant], align 16 %result = alloca %"Foo[]", align 8 - %taddr56 = alloca %"variant[]", align 8 %map2 = alloca %HashMap.3, align 8 - %retparam62 = alloca i64, align 8 - %varargslots63 = alloca [1 x %variant], align 16 - %taddr64 = alloca i8, align 1 - %taddr65 = alloca %"variant[]", align 8 - %retparam71 = alloca i64, align 8 - %varargslots72 = alloca [1 x %variant], align 16 - %taddr73 = alloca i8, align 1 - %taddr74 = alloca %"variant[]", align 8 - %retparam80 = alloca i64, align 8 - %varargslots81 = alloca [1 x %variant], align 16 - %result82 = alloca %"int[]", align 8 - %taddr83 = alloca %"variant[]", align 8 - %retparam89 = alloca i64, align 8 - %varargslots90 = alloca [1 x %variant], align 16 - %result91 = alloca %"double[]", align 8 - %taddr92 = alloca %"variant[]", align 8 - %temp = alloca %TempAllocator*, align 8 + %retparam41 = alloca i64, align 8 + %varargslots42 = alloca [1 x %variant], align 16 + %taddr43 = alloca i8, align 1 + %retparam47 = alloca i64, align 8 + %varargslots48 = alloca [1 x %variant], align 16 + %taddr49 = alloca i8, align 1 + %retparam53 = alloca i64, align 8 + %varargslots54 = alloca [1 x %variant], align 16 + %result55 = alloca %"int[]", align 8 + %retparam59 = alloca i64, align 8 + %varargslots60 = alloca [1 x %variant], align 16 + %result61 = alloca %"double[]", align 8 + %temp = alloca ptr, align 8 %error_var = alloca i64, align 8 - %retparam98 = alloca %TempAllocator*, align 8 + %retparam65 = alloca ptr, align 8 %mark = alloca i64, align 8 %map3 = alloca %HashMap.3, align 8 - %retparam101 = alloca i64, align 8 - %varargslots102 = alloca [1 x %variant], align 16 - %result103 = alloca %"int[]", align 8 - %taddr104 = alloca %"variant[]", align 8 - %0 = bitcast %HashMap.0* %map to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 40, i1 false) - call void @"std_map$$int.test_Foo_HashMap_tinit"(%HashMap.0* %map, i32 16, float 7.500000e-01) - %1 = getelementptr inbounds %HashMap.0, %HashMap.0* %map, i32 0, i32 2 - %2 = bitcast i32* %1 to i8* - %3 = insertvalue %variant undef, i8* %2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 - store %variant %4, %variant* %5, align 16 - %6 = bitcast [1 x %variant]* %varargslots to %variant* - %7 = insertvalue %"variant[]" undef, %variant* %6, 0 - %8 = insertvalue %"variant[]" %7, i64 1, 1 - store %"variant[]" %8, %"variant[]"* %taddr, align 8 - %9 = bitcast %"variant[]"* %taddr to { i8*, i64 }* - %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 - %lo = load i8*, i8** %10, align 8 - %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 - %hi = load i64, i64* %11, align 8 - %12 = call i64 @std_io_printfln(i64* %retparam, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), i64 12, i8* %lo, i64 %hi) - %not_err = icmp eq i64 %12, 0 + %retparam68 = alloca i64, align 8 + %varargslots69 = alloca [1 x %variant], align 16 + %result70 = alloca %"int[]", align 8 + call void @llvm.memset.p0.i64(ptr align 8 %map, i8 0, i64 40, i1 false) + %0 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + call void @"std_map$$int.test_Foo_HashMap_init"(ptr %map, i32 16, float 7.500000e-01, ptr %0) + %1 = getelementptr inbounds %HashMap.0, ptr %map, i32 0, i32 2 + %2 = insertvalue %variant undef, ptr %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 + store %variant %3, ptr %4, align 16 + %5 = call i64 @std_io_printfn(ptr %retparam, ptr @.str, i64 12, ptr %varargslots, i64 1) + %not_err = icmp eq i64 %5, 0 br i1 %not_err, label %after_check, label %voiderr after_check: ; preds = %entry br label %voiderr voiderr: ; preds = %after_check, %entry - %13 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 - store i32 1, i32* %13, align 8 - %14 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 - store i8* null, i8** %14, align 8 - %15 = bitcast %Foo* %literal to { i64, i8* }* - %16 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %15, i32 0, i32 0 - %lo1 = load i64, i64* %16, align 8 - %17 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %15, i32 0, i32 1 - %hi2 = load i8*, i8** %17, align 8 - %18 = call i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0* %map, i32 1, i64 %lo1, i8* %hi2) - %19 = getelementptr inbounds %HashMap.0, %HashMap.0* %map, i32 0, i32 2 - %20 = bitcast i32* %19 to i8* - %21 = insertvalue %variant undef, i8* %20, 0 - %22 = insertvalue %variant %21, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %23 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots4, i64 0, i64 0 - store %variant %22, %variant* %23, align 16 - %24 = bitcast [1 x %variant]* %varargslots4 to %variant* - %25 = insertvalue %"variant[]" undef, %variant* %24, 0 - %26 = insertvalue %"variant[]" %25, i64 1, 1 - store %"variant[]" %26, %"variant[]"* %taddr5, align 8 - %27 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* - %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 0 - %lo6 = load i8*, i8** %28, align 8 - %29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 1 - %hi7 = load i64, i64* %29, align 8 - %30 = call i64 @std_io_printfln(i64* %retparam3, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i32 0, i32 0), i64 12, i8* %lo6, i64 %hi7) - %not_err8 = icmp eq i64 %30, 0 - br i1 %not_err8, label %after_check9, label %voiderr10 + %6 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 + store i32 1, ptr %6, align 8 + %7 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 + store ptr null, ptr %7, align 8 + %8 = getelementptr inbounds { i64, ptr }, ptr %literal, i32 0, i32 0 + %lo = load i64, ptr %8, align 8 + %9 = getelementptr inbounds { i64, ptr }, ptr %literal, i32 0, i32 1 + %hi = load ptr, ptr %9, align 8 + %10 = call i8 @"std_map$$int.test_Foo_HashMap_set"(ptr %map, i32 1, i64 %lo, ptr %hi) + %11 = getelementptr inbounds %HashMap.0, ptr %map, i32 0, i32 2 + %12 = insertvalue %variant undef, ptr %11, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %14 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 + store %variant %13, ptr %14, align 16 + %15 = call i64 @std_io_printfn(ptr %retparam1, ptr @.str.1, i64 12, ptr %varargslots2, i64 1) + %not_err3 = icmp eq i64 %15, 0 + br i1 %not_err3, label %after_check4, label %voiderr5 -after_check9: ; preds = %voiderr - br label %voiderr10 +after_check4: ; preds = %voiderr + br label %voiderr5 -voiderr10: ; preds = %after_check9, %voiderr - %31 = getelementptr inbounds %Foo, %Foo* %literal11, i32 0, i32 0 - store i32 2, i32* %31, align 8 - %32 = getelementptr inbounds %Foo, %Foo* %literal11, i32 0, i32 1 - store i8* null, i8** %32, align 8 - %33 = bitcast %Foo* %literal11 to { i64, i8* }* - %34 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %33, i32 0, i32 0 - %lo12 = load i64, i64* %34, align 8 - %35 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %33, i32 0, i32 1 - %hi13 = load i8*, i8** %35, align 8 - %36 = call i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0* %map, i32 1, i64 %lo12, i8* %hi13) - %37 = getelementptr inbounds %HashMap.0, %HashMap.0* %map, i32 0, i32 2 - %38 = bitcast i32* %37 to i8* - %39 = insertvalue %variant undef, i8* %38, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 - %41 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots15, i64 0, i64 0 - store %variant %40, %variant* %41, align 16 - %42 = bitcast [1 x %variant]* %varargslots15 to %variant* - %43 = insertvalue %"variant[]" undef, %variant* %42, 0 - %44 = insertvalue %"variant[]" %43, i64 1, 1 - store %"variant[]" %44, %"variant[]"* %taddr16, align 8 - %45 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* - %46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0 - %lo17 = load i8*, i8** %46, align 8 - %47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1 - %hi18 = load i64, i64* %47, align 8 - %48 = call i64 @std_io_printfln(i64* %retparam14, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0), i64 12, i8* %lo17, i64 %hi18) - %not_err19 = icmp eq i64 %48, 0 +voiderr5: ; preds = %after_check4, %voiderr + %16 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 0 + store i32 2, ptr %16, align 8 + %17 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 1 + store ptr null, ptr %17, align 8 + %18 = getelementptr inbounds { i64, ptr }, ptr %literal6, i32 0, i32 0 + %lo7 = load i64, ptr %18, align 8 + %19 = getelementptr inbounds { i64, ptr }, ptr %literal6, i32 0, i32 1 + %hi8 = load ptr, ptr %19, align 8 + %20 = call i8 @"std_map$$int.test_Foo_HashMap_set"(ptr %map, i32 1, i64 %lo7, ptr %hi8) + %21 = getelementptr inbounds %HashMap.0, ptr %map, i32 0, i32 2 + %22 = insertvalue %variant undef, ptr %21, 0 + %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$uint" to i64), 1 + %24 = getelementptr inbounds [1 x %variant], ptr %varargslots10, i64 0, i64 0 + store %variant %23, ptr %24, align 16 + %25 = call i64 @std_io_printfn(ptr %retparam9, ptr @.str.2, i64 12, ptr %varargslots10, i64 1) + %not_err11 = icmp eq i64 %25, 0 + br i1 %not_err11, label %after_check12, label %voiderr13 + +after_check12: ; preds = %voiderr5 + br label %voiderr13 + +voiderr13: ; preds = %after_check12, %voiderr5 + %26 = call i64 @"std_map$$int.test_Foo_HashMap_get"(ptr %retparam16, ptr %map, i32 1) + %not_err17 = icmp eq i64 %26, 0 + br i1 %not_err17, label %after_check18, label %voiderr21 + +after_check18: ; preds = %voiderr13 + %27 = getelementptr inbounds %Foo, ptr %retparam16, i32 0, i32 0 + %28 = insertvalue %variant undef, ptr %27, 0 + %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$int" to i64), 1 + %30 = getelementptr inbounds [1 x %variant], ptr %varargslots15, i64 0, i64 0 + store %variant %29, ptr %30, align 16 + %31 = call i64 @std_io_printfn(ptr %retparam14, ptr @.str.3, i64 7, ptr %varargslots15, i64 1) + %not_err19 = icmp eq i64 %31, 0 br i1 %not_err19, label %after_check20, label %voiderr21 -after_check20: ; preds = %voiderr10 +after_check20: ; preds = %after_check18 br label %voiderr21 -voiderr21: ; preds = %after_check20, %voiderr10 - %49 = call i64 @"std_map$$int.test_Foo_HashMap_get"(%Foo* %retparam24, %HashMap.0* %map, i32 1) - %not_err25 = icmp eq i64 %49, 0 - br i1 %not_err25, label %after_check26, label %voiderr32 +voiderr21: ; preds = %after_check20, %after_check18, %voiderr13 + %32 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(ptr %map, i32 1) + store i8 %32, ptr %taddr, align 1 + %33 = insertvalue %variant undef, ptr %taddr, 0 + %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %35 = getelementptr inbounds [1 x %variant], ptr %varargslots23, i64 0, i64 0 + store %variant %34, ptr %35, align 16 + %36 = call i64 @std_io_printfn(ptr %retparam22, ptr @.str.4, i64 9, ptr %varargslots23, i64 1) + %not_err24 = icmp eq i64 %36, 0 + br i1 %not_err24, label %after_check25, label %voiderr26 -after_check26: ; preds = %voiderr21 - %50 = getelementptr inbounds %Foo, %Foo* %retparam24, i32 0, i32 0 - %51 = bitcast i32* %50 to i8* - %52 = insertvalue %variant undef, i8* %51, 0 - %53 = insertvalue %variant %52, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - %54 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots23, i64 0, i64 0 - store %variant %53, %variant* %54, align 16 - %55 = bitcast [1 x %variant]* %varargslots23 to %variant* - %56 = insertvalue %"variant[]" undef, %variant* %55, 0 - %57 = insertvalue %"variant[]" %56, i64 1, 1 - store %"variant[]" %57, %"variant[]"* %taddr27, align 8 - %58 = bitcast %"variant[]"* %taddr27 to { i8*, i64 }* - %59 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 0 - %lo28 = load i8*, i8** %59, align 8 - %60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 1 - %hi29 = load i64, i64* %60, align 8 - %61 = call i64 @std_io_printfln(i64* %retparam22, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i32 0, i32 0), i64 7, i8* %lo28, i64 %hi29) - %not_err30 = icmp eq i64 %61, 0 +after_check25: ; preds = %voiderr21 + br label %voiderr26 + +voiderr26: ; preds = %after_check25, %voiderr21 + %37 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(ptr %map, i32 2) + store i8 %37, ptr %taddr29, align 1 + %38 = insertvalue %variant undef, ptr %taddr29, 0 + %39 = insertvalue %variant %38, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %40 = getelementptr inbounds [1 x %variant], ptr %varargslots28, i64 0, i64 0 + store %variant %39, ptr %40, align 16 + %41 = call i64 @std_io_printfn(ptr %retparam27, ptr @.str.5, i64 9, ptr %varargslots28, i64 1) + %not_err30 = icmp eq i64 %41, 0 br i1 %not_err30, label %after_check31, label %voiderr32 -after_check31: ; preds = %after_check26 +after_check31: ; preds = %voiderr26 br label %voiderr32 -voiderr32: ; preds = %after_check31, %after_check26, %voiderr21 - %62 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(%HashMap.0* %map, i32 1) - store i8 %62, i8* %taddr35, align 1 - %63 = insertvalue %variant undef, i8* %taddr35, 0 - %64 = insertvalue %variant %63, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %65 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots34, i64 0, i64 0 - store %variant %64, %variant* %65, align 16 - %66 = bitcast [1 x %variant]* %varargslots34 to %variant* - %67 = insertvalue %"variant[]" undef, %variant* %66, 0 - %68 = insertvalue %"variant[]" %67, i64 1, 1 - store %"variant[]" %68, %"variant[]"* %taddr36, align 8 - %69 = bitcast %"variant[]"* %taddr36 to { i8*, i64 }* - %70 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %69, i32 0, i32 0 - %lo37 = load i8*, i8** %70, align 8 - %71 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %69, i32 0, i32 1 - %hi38 = load i64, i64* %71, align 8 - %72 = call i64 @std_io_printfln(i64* %retparam33, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i32 0, i32 0), i64 9, i8* %lo37, i64 %hi38) - %not_err39 = icmp eq i64 %72, 0 - br i1 %not_err39, label %after_check40, label %voiderr41 +voiderr32: ; preds = %after_check31, %voiderr26 + %42 = getelementptr inbounds %Foo, ptr %literal33, i32 0, i32 0 + store i32 4, ptr %42, align 8 + %43 = getelementptr inbounds %Foo, ptr %literal33, i32 0, i32 1 + store ptr null, ptr %43, align 8 + %44 = getelementptr inbounds { i64, ptr }, ptr %literal33, i32 0, i32 0 + %lo34 = load i64, ptr %44, align 8 + %45 = getelementptr inbounds { i64, ptr }, ptr %literal33, i32 0, i32 1 + %hi35 = load ptr, ptr %45, align 8 + %46 = call i8 @"std_map$$int.test_Foo_HashMap_set"(ptr %map, i32 7, i64 %lo34, ptr %hi35) + %47 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + %48 = call { ptr, i64 } @"std_map$$int.test_Foo_HashMap_value_list"(ptr %map, ptr %47) + store { ptr, i64 } %48, ptr %result, align 8 + %49 = insertvalue %variant undef, ptr %result, 0 + %50 = insertvalue %variant %49, i64 ptrtoint (ptr @"ct$sa$test_Foo" to i64), 1 + %51 = getelementptr inbounds [1 x %variant], ptr %varargslots37, i64 0, i64 0 + store %variant %50, ptr %51, align 16 + %52 = call i64 @std_io_printfn(ptr %retparam36, ptr @.str.6, i64 10, ptr %varargslots37, i64 1) + %not_err38 = icmp eq i64 %52, 0 + br i1 %not_err38, label %after_check39, label %voiderr40 -after_check40: ; preds = %voiderr32 - br label %voiderr41 +after_check39: ; preds = %voiderr32 + br label %voiderr40 -voiderr41: ; preds = %after_check40, %voiderr32 - %73 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(%HashMap.0* %map, i32 2) - store i8 %73, i8* %taddr44, align 1 - %74 = insertvalue %variant undef, i8* %taddr44, 0 - %75 = insertvalue %variant %74, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %76 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots43, i64 0, i64 0 - store %variant %75, %variant* %76, align 16 - %77 = bitcast [1 x %variant]* %varargslots43 to %variant* - %78 = insertvalue %"variant[]" undef, %variant* %77, 0 - %79 = insertvalue %"variant[]" %78, i64 1, 1 - store %"variant[]" %79, %"variant[]"* %taddr45, align 8 - %80 = bitcast %"variant[]"* %taddr45 to { i8*, i64 }* - %81 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 0 - %lo46 = load i8*, i8** %81, align 8 - %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 1 - %hi47 = load i64, i64* %82, align 8 - %83 = call i64 @std_io_printfln(i64* %retparam42, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i64 9, i8* %lo46, i64 %hi47) - %not_err48 = icmp eq i64 %83, 0 - br i1 %not_err48, label %after_check49, label %voiderr50 +voiderr40: ; preds = %after_check39, %voiderr32 + call void @llvm.memset.p0.i64(ptr align 8 %map2, i8 0, i64 40, i1 false) + %53 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + call void @"std_map$$int.double_HashMap_init"(ptr %map2, i32 16, float 7.500000e-01, ptr %53) + %54 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map2, i32 4, double 1.300000e+00) + %55 = call i8 @"std_map$$int.double_HashMap_has_value"(ptr %map2, double 1.300000e+00) + store i8 %55, ptr %taddr43, align 1 + %56 = insertvalue %variant undef, ptr %taddr43, 0 + %57 = insertvalue %variant %56, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %58 = getelementptr inbounds [1 x %variant], ptr %varargslots42, i64 0, i64 0 + store %variant %57, ptr %58, align 16 + %59 = call i64 @std_io_printfn(ptr %retparam41, ptr @.str.7, i64 12, ptr %varargslots42, i64 1) + %not_err44 = icmp eq i64 %59, 0 + br i1 %not_err44, label %after_check45, label %voiderr46 -after_check49: ; preds = %voiderr41 - br label %voiderr50 +after_check45: ; preds = %voiderr40 + br label %voiderr46 -voiderr50: ; preds = %after_check49, %voiderr41 - %84 = getelementptr inbounds %Foo, %Foo* %literal51, i32 0, i32 0 - store i32 4, i32* %84, align 8 - %85 = getelementptr inbounds %Foo, %Foo* %literal51, i32 0, i32 1 - store i8* null, i8** %85, align 8 - %86 = bitcast %Foo* %literal51 to { i64, i8* }* - %87 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %86, i32 0, i32 0 - %lo52 = load i64, i64* %87, align 8 - %88 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %86, i32 0, i32 1 - %hi53 = load i8*, i8** %88, align 8 - %89 = call i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0* %map, i32 7, i64 %lo52, i8* %hi53) - %90 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 - %91 = call { i8*, i64 } @"std_map$$int.test_Foo_HashMap_value_list"(%HashMap.0* %map, %Allocator* %90) - %92 = bitcast %"Foo[]"* %result to { i8*, i64 }* - store { i8*, i64 } %91, { i8*, i64 }* %92, align 8 - %93 = bitcast %"Foo[]"* %result to i8* - %94 = insertvalue %variant undef, i8* %93, 0 - %95 = insertvalue %variant %94, i64 ptrtoint (%.introspect* @"ct$sa$test_Foo" to i64), 1 - %96 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots55, i64 0, i64 0 - store %variant %95, %variant* %96, align 16 - %97 = bitcast [1 x %variant]* %varargslots55 to %variant* - %98 = insertvalue %"variant[]" undef, %variant* %97, 0 - %99 = insertvalue %"variant[]" %98, i64 1, 1 - store %"variant[]" %99, %"variant[]"* %taddr56, align 8 - %100 = bitcast %"variant[]"* %taddr56 to { i8*, i64 }* - %101 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %100, i32 0, i32 0 - %lo57 = load i8*, i8** %101, align 8 - %102 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %100, i32 0, i32 1 - %hi58 = load i64, i64* %102, align 8 - %103 = call i64 @std_io_printfln(i64* %retparam54, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i32 0, i32 0), i64 10, i8* %lo57, i64 %hi58) - %not_err59 = icmp eq i64 %103, 0 - br i1 %not_err59, label %after_check60, label %voiderr61 +voiderr46: ; preds = %after_check45, %voiderr40 + %60 = call i8 @"std_map$$int.double_HashMap_has_value"(ptr %map2, double 1.200000e+00) + store i8 %60, ptr %taddr49, align 1 + %61 = insertvalue %variant undef, ptr %taddr49, 0 + %62 = insertvalue %variant %61, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + %63 = getelementptr inbounds [1 x %variant], ptr %varargslots48, i64 0, i64 0 + store %variant %62, ptr %63, align 16 + %64 = call i64 @std_io_printfn(ptr %retparam47, ptr @.str.8, i64 12, ptr %varargslots48, i64 1) + %not_err50 = icmp eq i64 %64, 0 + br i1 %not_err50, label %after_check51, label %voiderr52 -after_check60: ; preds = %voiderr50 - br label %voiderr61 +after_check51: ; preds = %voiderr46 + br label %voiderr52 -voiderr61: ; preds = %after_check60, %voiderr50 - %104 = bitcast %HashMap.3* %map2 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %104, i8 0, i64 40, i1 false) - call void @"std_map$$int.double_HashMap_tinit"(%HashMap.3* %map2, i32 16, float 7.500000e-01) - %105 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map2, i32 4, double 1.300000e+00) - %106 = call i8 @"std_map$$int.double_HashMap_has_value"(%HashMap.3* %map2, double 1.300000e+00) - store i8 %106, i8* %taddr64, align 1 - %107 = insertvalue %variant undef, i8* %taddr64, 0 - %108 = insertvalue %variant %107, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %109 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots63, i64 0, i64 0 - store %variant %108, %variant* %109, align 16 - %110 = bitcast [1 x %variant]* %varargslots63 to %variant* - %111 = insertvalue %"variant[]" undef, %variant* %110, 0 - %112 = insertvalue %"variant[]" %111, i64 1, 1 - store %"variant[]" %112, %"variant[]"* %taddr65, align 8 - %113 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* - %114 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %113, i32 0, i32 0 - %lo66 = load i8*, i8** %114, align 8 - %115 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %113, i32 0, i32 1 - %hi67 = load i64, i64* %115, align 8 - %116 = call i64 @std_io_printfln(i64* %retparam62, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0), i64 12, i8* %lo66, i64 %hi67) - %not_err68 = icmp eq i64 %116, 0 - br i1 %not_err68, label %after_check69, label %voiderr70 +voiderr52: ; preds = %after_check51, %voiderr46 + %65 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map2, i32 100, double 3.400000e+00) + %66 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + %67 = call { ptr, i64 } @"std_map$$int.double_HashMap_key_list"(ptr %map2, ptr %66) + store { ptr, i64 } %67, ptr %result55, align 8 + %68 = insertvalue %variant undef, ptr %result55, 0 + %69 = insertvalue %variant %68, i64 ptrtoint (ptr @"ct$sa$int" to i64), 1 + %70 = getelementptr inbounds [1 x %variant], ptr %varargslots54, i64 0, i64 0 + store %variant %69, ptr %70, align 16 + %71 = call i64 @std_io_printfn(ptr %retparam53, ptr @.str.9, i64 2, ptr %varargslots54, i64 1) + %not_err56 = icmp eq i64 %71, 0 + br i1 %not_err56, label %after_check57, label %voiderr58 -after_check69: ; preds = %voiderr61 - br label %voiderr70 +after_check57: ; preds = %voiderr52 + br label %voiderr58 -voiderr70: ; preds = %after_check69, %voiderr61 - %117 = call i8 @"std_map$$int.double_HashMap_has_value"(%HashMap.3* %map2, double 1.200000e+00) - store i8 %117, i8* %taddr73, align 1 - %118 = insertvalue %variant undef, i8* %taddr73, 0 - %119 = insertvalue %variant %118, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - %120 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots72, i64 0, i64 0 - store %variant %119, %variant* %120, align 16 - %121 = bitcast [1 x %variant]* %varargslots72 to %variant* - %122 = insertvalue %"variant[]" undef, %variant* %121, 0 - %123 = insertvalue %"variant[]" %122, i64 1, 1 - store %"variant[]" %123, %"variant[]"* %taddr74, align 8 - %124 = bitcast %"variant[]"* %taddr74 to { i8*, i64 }* - %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 0 - %lo75 = load i8*, i8** %125, align 8 - %126 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 1 - %hi76 = load i64, i64* %126, align 8 - %127 = call i64 @std_io_printfln(i64* %retparam71, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0), i64 12, i8* %lo75, i64 %hi76) - %not_err77 = icmp eq i64 %127, 0 - br i1 %not_err77, label %after_check78, label %voiderr79 +voiderr58: ; preds = %after_check57, %voiderr52 + %72 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + %73 = call { ptr, i64 } @"std_map$$int.double_HashMap_value_list"(ptr %map2, ptr %72) + store { ptr, i64 } %73, ptr %result61, align 8 + %74 = insertvalue %variant undef, ptr %result61, 0 + %75 = insertvalue %variant %74, i64 ptrtoint (ptr @"ct$sa$double" to i64), 1 + %76 = getelementptr inbounds [1 x %variant], ptr %varargslots60, i64 0, i64 0 + store %variant %75, ptr %76, align 16 + %77 = call i64 @std_io_printfn(ptr %retparam59, ptr @.str.10, i64 2, ptr %varargslots60, i64 1) + %not_err62 = icmp eq i64 %77, 0 + br i1 %not_err62, label %after_check63, label %voiderr64 -after_check78: ; preds = %voiderr70 - br label %voiderr79 +after_check63: ; preds = %voiderr58 + br label %voiderr64 -voiderr79: ; preds = %after_check78, %voiderr70 - %128 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map2, i32 100, double 3.400000e+00) - %129 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 - %130 = call { i8*, i64 } @"std_map$$int.double_HashMap_key_list"(%HashMap.3* %map2, %Allocator* %129) - %131 = bitcast %"int[]"* %result82 to { i8*, i64 }* - store { i8*, i64 } %130, { i8*, i64 }* %131, align 8 - %132 = bitcast %"int[]"* %result82 to i8* - %133 = insertvalue %variant undef, i8* %132, 0 - %134 = insertvalue %variant %133, i64 ptrtoint (%.introspect* @"ct$sa$int" to i64), 1 - %135 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots81, i64 0, i64 0 - store %variant %134, %variant* %135, align 16 - %136 = bitcast [1 x %variant]* %varargslots81 to %variant* - %137 = insertvalue %"variant[]" undef, %variant* %136, 0 - %138 = insertvalue %"variant[]" %137, i64 1, 1 - store %"variant[]" %138, %"variant[]"* %taddr83, align 8 - %139 = bitcast %"variant[]"* %taddr83 to { i8*, i64 }* - %140 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %139, i32 0, i32 0 - %lo84 = load i8*, i8** %140, align 8 - %141 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %139, i32 0, i32 1 - %hi85 = load i64, i64* %141, align 8 - %142 = call i64 @std_io_printfln(i64* %retparam80, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0), i64 2, i8* %lo84, i64 %hi85) - %not_err86 = icmp eq i64 %142, 0 - br i1 %not_err86, label %after_check87, label %voiderr88 - -after_check87: ; preds = %voiderr79 - br label %voiderr88 - -voiderr88: ; preds = %after_check87, %voiderr79 - %143 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 - %144 = call { i8*, i64 } @"std_map$$int.double_HashMap_value_list"(%HashMap.3* %map2, %Allocator* %143) - %145 = bitcast %"double[]"* %result91 to { i8*, i64 }* - store { i8*, i64 } %144, { i8*, i64 }* %145, align 8 - %146 = bitcast %"double[]"* %result91 to i8* - %147 = insertvalue %variant undef, i8* %146, 0 - %148 = insertvalue %variant %147, i64 ptrtoint (%.introspect* @"ct$sa$double" to i64), 1 - %149 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots90, i64 0, i64 0 - store %variant %148, %variant* %149, align 16 - %150 = bitcast [1 x %variant]* %varargslots90 to %variant* - %151 = insertvalue %"variant[]" undef, %variant* %150, 0 - %152 = insertvalue %"variant[]" %151, i64 1, 1 - store %"variant[]" %152, %"variant[]"* %taddr92, align 8 - %153 = bitcast %"variant[]"* %taddr92 to { i8*, i64 }* - %154 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %153, i32 0, i32 0 - %lo93 = load i8*, i8** %154, align 8 - %155 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %153, i32 0, i32 1 - %hi94 = load i64, i64* %155, align 8 - %156 = call i64 @std_io_printfln(i64* %retparam89, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.10, i32 0, i32 0), i64 2, i8* %lo93, i64 %hi94) - %not_err95 = icmp eq i64 %156, 0 - br i1 %not_err95, label %after_check96, label %voiderr97 - -after_check96: ; preds = %voiderr88 - br label %voiderr97 - -voiderr97: ; preds = %after_check96, %voiderr88 - %157 = load %TempAllocator*, %TempAllocator** @std_core_mem_thread_temp_allocator, align 8 - %not = icmp eq %TempAllocator* %157, null +voiderr64: ; preds = %after_check63, %voiderr58 + %78 = load ptr, ptr @std_core_mem_thread_temp_allocator, align 8 + %not = icmp eq ptr %78, null br i1 %not, label %if.then, label %if.exit -if.then: ; preds = %voiderr97 - %158 = call i64 @std_core_mem_allocator_new_temp(%TempAllocator** %retparam98, i64 131072, %Allocator* @std_core_mem_allocator__SYSTEM_ALLOCATOR) - %not_err99 = icmp eq i64 %158, 0 - br i1 %not_err99, label %after_check100, label %assign_optional +if.then: ; preds = %voiderr64 + %79 = call i64 @std_core_mem_allocator_new_temp(ptr %retparam65, i64 131072, ptr @std_core_mem_allocator__SYSTEM_ALLOCATOR) + %not_err66 = icmp eq i64 %79, 0 + br i1 %not_err66, label %after_check67, label %assign_optional assign_optional: ; preds = %if.then - store i64 %158, i64* %error_var, align 8 + store i64 %79, ptr %error_var, align 8 br label %panic_block -after_check100: ; preds = %if.then - %159 = load %TempAllocator*, %TempAllocator** %retparam98, align 8 +after_check67: ; preds = %if.then + %80 = load ptr, ptr %retparam65, align 8 br label %noerr_block panic_block: ; preds = %assign_optional - %160 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %160(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.file, i64 0, i64 0), i64 6, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4, + %81 = load ptr, ptr @std_core_builtin_panic, align 8 + call void %81(ptr @.panic_msg, i64 27, ptr @.file, i64 6, ptr @.func, i64 4, unreachable -noerr_block: ; preds = %after_check100 - store %TempAllocator* %159, %TempAllocator** @std_core_mem_thread_temp_allocator, align 8 +noerr_block: ; preds = %after_check67 + store ptr %80, ptr @std_core_mem_thread_temp_allocator, align 8 br label %if.exit -if.exit: ; preds = %noerr_block, %voiderr97 - %161 = load %TempAllocator*, %TempAllocator** @std_core_mem_thread_temp_allocator, align 8 - store %TempAllocator* %161, %TempAllocator** %temp, align 8 - %162 = load %TempAllocator*, %TempAllocator** %temp, align 8 - %163 = getelementptr inbounds %TempAllocator, %TempAllocator* %162, i32 0, i32 3 - %164 = load i64, i64* %163, align 8 - store i64 %164, i64* %mark, align 8 - %165 = bitcast %HashMap.3* %map3 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %165, i8 0, i64 40, i1 false) - call void @"std_map$$int.double_HashMap_tinit"(%HashMap.3* %map3, i32 16, float 7.500000e-01) - %166 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map3, i32 5, double 3.200000e+00) - %167 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map3, i32 7, double 5.200000e+00) - %168 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 - %169 = call { i8*, i64 } @"std_map$$int.double_HashMap_key_list"(%HashMap.3* %map3, %Allocator* %168) - %170 = bitcast %"int[]"* %result103 to { i8*, i64 }* - store { i8*, i64 } %169, { i8*, i64 }* %170, align 8 - %171 = bitcast %"int[]"* %result103 to i8* - %172 = insertvalue %variant undef, i8* %171, 0 - %173 = insertvalue %variant %172, i64 ptrtoint (%.introspect* @"ct$sa$int" to i64), 1 - %174 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots102, i64 0, i64 0 - store %variant %173, %variant* %174, align 16 - %175 = bitcast [1 x %variant]* %varargslots102 to %variant* - %176 = insertvalue %"variant[]" undef, %variant* %175, 0 - %177 = insertvalue %"variant[]" %176, i64 1, 1 - store %"variant[]" %177, %"variant[]"* %taddr104, align 8 - %178 = bitcast %"variant[]"* %taddr104 to { i8*, i64 }* - %179 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %178, i32 0, i32 0 - %lo105 = load i8*, i8** %179, align 8 - %180 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %178, i32 0, i32 1 - %hi106 = load i64, i64* %180, align 8 - %181 = call i64 @std_io_printfln(i64* %retparam101, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.11, i32 0, i32 0), i64 2, i8* %lo105, i64 %hi106) - %not_err107 = icmp eq i64 %181, 0 - br i1 %not_err107, label %after_check108, label %voiderr109 +if.exit: ; preds = %noerr_block, %voiderr64 + %82 = load ptr, ptr @std_core_mem_thread_temp_allocator, align 8 + store ptr %82, ptr %temp, align 8 + %83 = load ptr, ptr %temp, align 8 + %84 = getelementptr inbounds %TempAllocator, ptr %83, i32 0, i32 3 + %85 = load i64, ptr %84, align 8 + store i64 %85, ptr %mark, align 8 + call void @llvm.memset.p0.i64(ptr align 8 %map3, i8 0, i64 40, i1 false) + %86 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + call void @"std_map$$int.double_HashMap_init"(ptr %map3, i32 16, float 7.500000e-01, ptr %86) + %87 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map3, i32 5, double 3.200000e+00) + %88 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map3, i32 7, double 5.200000e+00) + %89 = load ptr, ptr @std_core_mem_thread_allocator, align 8 + %90 = call { ptr, i64 } @"std_map$$int.double_HashMap_key_list"(ptr %map3, ptr %89) + store { ptr, i64 } %90, ptr %result70, align 8 + %91 = insertvalue %variant undef, ptr %result70, 0 + %92 = insertvalue %variant %91, i64 ptrtoint (ptr @"ct$sa$int" to i64), 1 + %93 = getelementptr inbounds [1 x %variant], ptr %varargslots69, i64 0, i64 0 + store %variant %92, ptr %93, align 16 + %94 = call i64 @std_io_printfn(ptr %retparam68, ptr @.str.11, i64 2, ptr %varargslots69, i64 1) + %not_err71 = icmp eq i64 %94, 0 + br i1 %not_err71, label %after_check72, label %voiderr73 -after_check108: ; preds = %if.exit - br label %voiderr109 +after_check72: ; preds = %if.exit + br label %voiderr73 -voiderr109: ; preds = %after_check108, %if.exit - %182 = load %TempAllocator*, %TempAllocator** %temp, align 8 - %183 = getelementptr inbounds %TempAllocator, %TempAllocator* %182, i32 0, i32 0 - %184 = load i64, i64* %mark, align 8 - call void @std_core_mem_allocator_Allocator_reset(%Allocator* %183, i64 %184) +voiderr73: ; preds = %after_check72, %if.exit + %95 = load ptr, ptr %temp, align 8 + %96 = getelementptr inbounds %TempAllocator, ptr %95, i32 0, i32 0 + %97 = load i64, ptr %mark, align 8 + call void @std_core_mem_allocator_Allocator_reset(ptr %96, i64 %97) ret void } - -; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { -entry: - call void @test_main() - ret i32 0 -} - -; Function Attrs: argmemonly nofree nounwind willreturn writeonly -declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #1 - -declare void @"std_map$$int.test_Foo_HashMap_tinit"(%HashMap.0*, i32, float) - -declare i64 @std_io_printfln(i64*, i8*, i64, i8*, i64) - -declare i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0*, i32, i64, i8*) - -declare i64 @"std_map$$int.test_Foo_HashMap_get"(%Foo*, %HashMap.0*, i32) - -declare i8 @"std_map$$int.test_Foo_HashMap_has_key"(%HashMap.0*, i32) - -declare { i8*, i64 } @"std_map$$int.test_Foo_HashMap_value_list"(%HashMap.0*, %Allocator*) - -declare void @"std_map$$int.double_HashMap_tinit"(%HashMap.3*, i32, float) - -declare i8 @"std_map$$int.double_HashMap_set"(%HashMap.3*, i32, double) diff --git a/test/test_suite/stdlib/memcomp.c3t b/test/test_suite/stdlib/memcomp.c3t index 4a8cfb9a3..1b9dfd516 100644 --- a/test/test_suite/stdlib/memcomp.c3t +++ b/test/test_suite/stdlib/memcomp.c3t @@ -9,8 +9,8 @@ fn void main() int[] cd = { 3, 5, 6, 10, 0x0b2399 }; char[] x = "hello world!"; char[] y = "hello world?"; - io::printfln("is matching: %s", mem::equals(ab, cd)); - io::printfln("is matching: %s", mem::equals(x, y)); - io::printfln("is matching: %s", mem::equals(x.ptr, y.ptr, x.len)); - io::printfln("is matching: %s", mem::equals(ab.ptr, cd.ptr, ab.len * 4, 4)); + io::printfn("is matching: %s", mem::equals(ab, cd)); + io::printfn("is matching: %s", mem::equals(x, y)); + io::printfn("is matching: %s", mem::equals(x.ptr, y.ptr, x.len)); + io::printfn("is matching: %s", mem::equals(ab.ptr, cd.ptr, ab.len * 4, 4)); } \ No newline at end of file diff --git a/test/test_suite/stdlib/minmax.c3 b/test/test_suite/stdlib/minmax.c3 index 517d76a24..b8bfa7446 100644 --- a/test/test_suite/stdlib/minmax.c3 +++ b/test/test_suite/stdlib/minmax.c3 @@ -2,8 +2,8 @@ import std::io; fn void main() { - io::printfln("min(-1, 1) == %s", min(-1, 1)); - io::printfln("max(-1, 1) == %s", max(-1, 1)); - io::printfln("min(-1, 0, 1) == %s", min(-1, 0, 1)); - io::printfln("max(-1, 0, 1) == %s", max(-1, 0, 1)); + io::printfn("min(-1, 1) == %s", min(-1, 1)); + io::printfn("max(-1, 1) == %s", max(-1, 1)); + io::printfn("min(-1, 0, 1) == %s", min(-1, 0, 1)); + io::printfn("max(-1, 0, 1) == %s", max(-1, 0, 1)); } diff --git a/test/test_suite/stdlib/print_env_defines.c3 b/test/test_suite/stdlib/print_env_defines.c3 index e9b704208..e764da65e 100644 --- a/test/test_suite/stdlib/print_env_defines.c3 +++ b/test/test_suite/stdlib/print_env_defines.c3 @@ -2,14 +2,14 @@ import std::io; fn void main() { - io::printfln("LLVM version: %s", env::LLVM_VERSION); - io::printfln("Optimization level: %s", env::COMPILER_OPT_LEVEL); - io::printfln("Safe mode: %s", env::COMPILER_SAFE_MODE); - io::printfln("OS type: %s", env::OS_TYPE); - io::printfln("Big endian: %s", env::BIG_ENDIAN); - io::printfln("i128 support: %s", env::I128_NATIVE_SUPPORT); - io::printfln("f16 support: %s", env::F16_SUPPORT); - io::printfln("f128 support: %s", env::F128_SUPPORT); - io::printfln("Benchmarking: %s", env::BENCHMARKING); - io::printfln("Testing: %s", env::TESTING); + io::printfn("LLVM version: %s", env::LLVM_VERSION); + io::printfn("Optimization level: %s", env::COMPILER_OPT_LEVEL); + io::printfn("Safe mode: %s", env::COMPILER_SAFE_MODE); + io::printfn("OS type: %s", env::OS_TYPE); + io::printfn("Big endian: %s", env::BIG_ENDIAN); + io::printfn("i128 support: %s", env::I128_NATIVE_SUPPORT); + io::printfn("f16 support: %s", env::F16_SUPPORT); + io::printfn("f128 support: %s", env::F128_SUPPORT); + io::printfn("Benchmarking: %s", env::BENCHMARKING); + io::printfn("Testing: %s", env::TESTING); } \ No newline at end of file diff --git a/test/test_suite/stdlib/rounding_mode.c3 b/test/test_suite/stdlib/rounding_mode.c3 deleted file mode 100644 index 0027c6595..000000000 --- a/test/test_suite/stdlib/rounding_mode.c3 +++ /dev/null @@ -1,30 +0,0 @@ -import std::io; -import std::math; - -fn void main() -{ - io::printfln("Current rounding mode: %s", $$get_rounding_mode()); - float f1 = 11.5; - float f2 = -11.5; - - foreach (int mode : RoundingMode.values) - { - $$set_rounding_mode(mode); - io::printfln("Rounding mode: %s", $$get_rounding_mode()); - - io::printfln(" ceil(%s) == %s", f1, math::ceil(f1)); - io::printfln(" ceil(%s) == %s", f2, math::ceil(f2)); - io::printfln(" floor(%s) == %s", f1, math::floor(f1)); - io::printfln(" floor(%s) == %s", f2, math::floor(f2)); - io::printfln(" nearbyint(%s) == %s", f1, math::nearbyint(f1)); - io::printfln(" nearbyint(%s) == %s", f2, math::nearbyint(f2)); - io::printfln(" rint(%s) == %s", f1, math::rint(f1)); - io::printfln(" rint(%s) == %s", f2, math::rint(f2)); - io::printfln(" round(%s) == %s", f1, math::round(f1)); - io::printfln(" round(%s) == %s", f2, math::round(f2)); - io::printfln(" roundeven(%s) == %s", f1, math::roundeven(f1)); - io::printfln(" roundeven(%s) == %s", f2, math::roundeven(f2)); - io::printfln(" trunc(%s) == %s", f1, math::trunc(f1)); - io::printfln(" trunc(%s) == %s", f2, math::trunc(f2)); - } -} diff --git a/test/test_suite/strings/literal_to_subarray.c3t b/test/test_suite/strings/literal_to_subarray.c3t index 15477a67d..4a7efe479 100644 --- a/test/test_suite/strings/literal_to_subarray.c3t +++ b/test/test_suite/strings/literal_to_subarray.c3t @@ -9,14 +9,16 @@ fn void test() /* #expect: literal_to_subarray.ll -%"char[]" = type { i8*, i64 } +%"char[]" = type { ptr, i64 } + @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@literal_to_subarray_y = local_unnamed_addr global %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5 }, align 8 +@literal_to_subarray_y = local_unnamed_addr global %"char[]" { ptr @.str, i64 5 }, align 8 @.str.1 = private unnamed_addr constant [6 x i8] c"world\00", align 1 + ; Function Attrs: nounwind define void @literal_to_subarray_test() #0 { entry: %x = alloca %"char[]", align 8 - store %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 5 }, %"char[]"* %x, align 8 + store %"char[]" { ptr @.str.1, i64 5 }, ptr %x, align 8 ret void } diff --git a/test/test_suite/strings/string_escape.c3t b/test/test_suite/strings/string_escape.c3t index 404136fa3..448a0a796 100644 --- a/test/test_suite/strings/string_escape.c3t +++ b/test/test_suite/strings/string_escape.c3t @@ -10,12 +10,12 @@ fn void main() define void @string_escape_main() #0 { entry: - %s = alloca i8*, align 8 - store i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str, i32 0, i32 0), i8** %s, align 8 + %s = alloca ptr, align 8 + store ptr @.str, ptr %s, align 8 ret void } -define i32 @main(i32 %0, i8** %1) #0 { +define i32 @main(i32 %0, ptr %1) #0 { entry: call void @string_escape_main() ret i32 0 diff --git a/test/test_suite/strings/string_to_array.c3t b/test/test_suite/strings/string_to_array.c3t index c5cdd6308..bc0f90b5a 100644 --- a/test/test_suite/strings/string_to_array.c3t +++ b/test/test_suite/strings/string_to_array.c3t @@ -17,9 +17,7 @@ define i32 @main() #0 { entry: %x = alloca [2 x i8], align 1 %y = alloca [3 x i8], align 1 - %0 = bitcast [2 x i8]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %0, i8* align 1 getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i32 2, i1 false) - %1 = bitcast [3 x i8]* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %1, i8* align 1 getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 3, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 1 %x, ptr align 1 @.str, i32 2, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 1 %y, ptr align 1 @.str.1, i32 3, i1 false) ret i32 0 } diff --git a/test/test_suite/struct/nested_struct_init.c3t b/test/test_suite/struct/nested_struct_init.c3t index fff61d8fc..fcb8e549c 100644 --- a/test/test_suite/struct/nested_struct_init.c3t +++ b/test/test_suite/struct/nested_struct_init.c3t @@ -53,37 +53,24 @@ define void @foo_main() #0 { entry: %m = alloca %Matrix2x2, align 4 %m2 = alloca %Matrix2x2_b, align 4 - %0 = bitcast %Matrix2x2* %m to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Matrix2x2* @.__const to i8*), i32 16, i1 false) - %1 = bitcast %Matrix2x2_b* %m2 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Matrix2x2_b* @.__const.8 to i8*), i32 16, i1 false) - %2 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 - %3 = bitcast %.anon* %2 to %.anon.0* - %4 = getelementptr inbounds %.anon.0, %.anon.0* %3, i32 0, i32 0 - %5 = load float, float* %4, align 4 - %fpfpext = fpext float %5 to double - %6 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 - %7 = bitcast %.anon* %6 to [4 x float]* - %8 = getelementptr inbounds [4 x float], [4 x float]* %7, i64 0, i64 1 - %9 = load float, float* %8, align 4 - %fpfpext1 = fpext float %9 to double - %10 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 - %11 = bitcast %.anon* %10 to %.anon.0* - %12 = getelementptr inbounds %.anon.0, %.anon.0* %11, i32 0, i32 2 - %13 = load float, float* %12, align 4 - %fpfpext2 = fpext float %13 to double - %14 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 - %15 = bitcast %.anon* %14 to [4 x float]* - %16 = getelementptr inbounds [4 x float], [4 x float]* %15, i64 0, i64 3 - %17 = load float, float* %16, align 4 - %fpfpext3 = fpext float %17 to double - %18 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m, ptr align 4 @.__const, i32 16, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m2, ptr align 4 @.__const.8, i32 16, i1 false) + %0 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 + %1 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 0 + %2 = load float, ptr %1, align 4 + %fpfpext = fpext float %2 to double + %3 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 + %4 = getelementptr inbounds [4 x float], ptr %3, i64 0, i64 1 + %5 = load float, ptr %4, align 4 + %fpfpext1 = fpext float %5 to double + %6 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 + %7 = getelementptr inbounds %.anon.0, ptr %6, i32 0, i32 2 + %8 = load float, ptr %7, align 4 + %fpfpext2 = fpext float %8 to double + %9 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 + %10 = getelementptr inbounds [4 x float], ptr %9, i64 0, i64 3 + %11 = load float, ptr %10, align 4 + %fpfpext3 = fpext float %11 to double + %12 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) ret void } - -; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { -entry: - call void @foo_main() - ret i32 0 -} \ No newline at end of file diff --git a/test/test_suite/struct/nested_struct_union_init.c3t b/test/test_suite/struct/nested_struct_union_init.c3t index 3b78a2e60..74da5fe7c 100644 --- a/test/test_suite/struct/nested_struct_union_init.c3t +++ b/test/test_suite/struct/nested_struct_union_init.c3t @@ -67,50 +67,43 @@ entry: %x = alloca %Matrix3x3, align 4 %m = alloca %Matrix2x2, align 4 %m2 = alloca %Matrix2x2_b, align 4 - %0 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 - %1 = bitcast %.anon* %0 to %.anon.0* - %2 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 0 - store float 1.000000e+00, float* %2, align 4 - %3 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 1 - store float 2.000000e+00, float* %3, align 4 - %4 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 2 - store float 3.000000e+00, float* %4, align 4 - %5 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 3 - store float 4.000000e+00, float* %5, align 4 - %6 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 4 - store float 5.000000e+00, float* %6, align 4 - %7 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 5 - store float 6.000000e+00, float* %7, align 4 - %8 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 6 - store float 7.000000e+00, float* %8, align 4 - %9 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 7 - store float 8.000000e+00, float* %9, align 4 - %10 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 8 - store float 9.000000e+00, float* %10, align 4 - %11 = bitcast %Matrix2x2* %m to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %11, i8* align 4 bitcast (%Matrix2x2* @.__const to i8*), i32 16, i1 false) - %12 = bitcast %Matrix2x2_b* %m2 to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %12, i8* align 4 bitcast (%Matrix2x2_b* @.__const.16 to i8*), i32 16, i1 false) - %13 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 - %14 = bitcast %.anon* %13 to %.anon.0* - %15 = getelementptr inbounds %.anon.0, %.anon.0* %14, i32 0, i32 0 - %16 = load float, float* %15, align 4 - %fpfpext = fpext float %16 to double - %17 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 - %18 = bitcast %.anon* %17 to [9 x float]* - %19 = getelementptr inbounds [9 x float], [9 x float]* %18, i64 0, i64 1 - %20 = load float, float* %19, align 4 - %fpfpext1 = fpext float %20 to double - %21 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 - %22 = bitcast %.anon* %21 to %.anon.0* - %23 = getelementptr inbounds %.anon.0, %.anon.0* %22, i32 0, i32 3 - %24 = load float, float* %23, align 4 - %fpfpext2 = fpext float %24 to double - %25 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 - %26 = bitcast %.anon* %25 to [9 x float]* - %27 = getelementptr inbounds [9 x float], [9 x float]* %26, i64 0, i64 3 - %28 = load float, float* %27, align 4 - %fpfpext3 = fpext float %28 to double - %29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) + %0 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 + %1 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 0 + store float 1.000000e+00, ptr %1, align 4 + %2 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 1 + store float 2.000000e+00, ptr %2, align 4 + %3 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 2 + store float 3.000000e+00, ptr %3, align 4 + %4 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 3 + store float 4.000000e+00, ptr %4, align 4 + %5 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 4 + store float 5.000000e+00, ptr %5, align 4 + %6 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 5 + store float 6.000000e+00, ptr %6, align 4 + %7 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 6 + store float 7.000000e+00, ptr %7, align 4 + %8 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 7 + store float 8.000000e+00, ptr %8, align 4 + %9 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 8 + store float 9.000000e+00, ptr %9, align 4 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m, ptr align 4 @.__const, i32 16, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m2, ptr align 4 @.__const.16, i32 16, i1 false) + %10 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 + %11 = getelementptr inbounds %.anon.0, ptr %10, i32 0, i32 0 + %12 = load float, ptr %11, align 4 + %fpfpext = fpext float %12 to double + %13 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 + %14 = getelementptr inbounds [9 x float], ptr %13, i64 0, i64 1 + %15 = load float, ptr %14, align 4 + %fpfpext1 = fpext float %15 to double + %16 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 + %17 = getelementptr inbounds %.anon.0, ptr %16, i32 0, i32 3 + %18 = load float, ptr %17, align 4 + %fpfpext2 = fpext float %18 to double + %19 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 + %20 = getelementptr inbounds [9 x float], ptr %19, i64 0, i64 3 + %21 = load float, ptr %20, align 4 + %fpfpext3 = fpext float %21 to double + %22 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) ret void } diff --git a/test/test_suite/struct/struct_as_value.c3t b/test/test_suite/struct/struct_as_value.c3t index c5d19f659..e8d2156b0 100644 --- a/test/test_suite/struct/struct_as_value.c3t +++ b/test/test_suite/struct/struct_as_value.c3t @@ -14,7 +14,6 @@ fn Event test(int x) } /* #expect: test.ll - %Event = type { i32 } @"ct$test_Event" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @@ -26,25 +25,23 @@ entry: %foo = alloca %Event, align 4 %bar = alloca %Event, align 4 %taddr = alloca %Event, align 4 - %1 = bitcast %Event* %foo to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Event* @.__const to i8*), i32 4, i1 false) - %2 = bitcast %Event* %bar to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast (%Event* @.__const.1 to i8*), i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %bar, ptr align 4 @.__const.1, i32 4, i1 false) %intbool = icmp ne i32 %0, 0 br i1 %intbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %3 = load %Event, %Event* %foo, align 4 + %1 = load %Event, ptr %foo, align 4 br label %cond.phi cond.rhs: ; preds = %entry - %4 = load %Event, %Event* %bar, align 4 + %2 = load %Event, ptr %bar, align 4 br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %Event [ %3, %cond.lhs ], [ %4, %cond.rhs ] - store %Event %val, %Event* %taddr, align 4 - %5 = getelementptr inbounds %Event, %Event* %taddr, i32 0, i32 0 - %6 = load i32, i32* %5, align 4 - ret i32 %6 -} + %val = phi %Event [ %1, %cond.lhs ], [ %2, %cond.rhs ] + store %Event %val, ptr %taddr, align 4 + %3 = getelementptr inbounds %Event, ptr %taddr, i32 0, i32 0 + %4 = load i32, ptr %3, align 4 + ret i32 %4 +} \ No newline at end of file diff --git a/test/test_suite/struct/struct_as_value_aarch64.c3t b/test/test_suite/struct/struct_as_value_aarch64.c3t index 43ed1c9e9..54740fa84 100644 --- a/test/test_suite/struct/struct_as_value_aarch64.c3t +++ b/test/test_suite/struct/struct_as_value_aarch64.c3t @@ -20,25 +20,23 @@ entry: %foo = alloca %Event, align 4 %bar = alloca %Event, align 4 %taddr = alloca %Event, align 4 - %1 = bitcast %Event* %foo to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Event* @.__const to i8*), i32 4, i1 false) - %2 = bitcast %Event* %bar to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast (%Event* @.__const.1 to i8*), i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 4, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %bar, ptr align 4 @.__const.1, i32 4, i1 false) %intbool = icmp ne i32 %0, 0 br i1 %intbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %3 = load %Event, %Event* %foo, align 4 + %1 = load %Event, ptr %foo, align 4 br label %cond.phi cond.rhs: ; preds = %entry - %4 = load %Event, %Event* %bar, align 4 + %2 = load %Event, ptr %bar, align 4 br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %Event [ %3, %cond.lhs ], [ %4, %cond.rhs ] - store %Event %val, %Event* %taddr, align 4 - %5 = getelementptr inbounds %Event, %Event* %taddr, i32 0, i32 0 - %6 = load i32, i32* %5, align 4 - ret i32 %6 -} \ No newline at end of file + %val = phi %Event [ %1, %cond.lhs ], [ %2, %cond.rhs ] + store %Event %val, ptr %taddr, align 4 + %3 = getelementptr inbounds %Event, ptr %taddr, i32 0, i32 0 + %4 = load i32, ptr %3, align 4 + ret i32 %4 +} diff --git a/test/test_suite/struct/struct_codegen.c3t b/test/test_suite/struct/struct_codegen.c3t index 4b2519125..9cefb4e9a 100644 --- a/test/test_suite/struct/struct_codegen.c3t +++ b/test/test_suite/struct/struct_codegen.c3t @@ -22,7 +22,6 @@ fn void test1() define void @test_test1() #0 { entry: %p = alloca %Point, align 4 - %0 = bitcast %Point* %p to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Point* @.__const to i8*), i32 8, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %p, ptr align 4 @.__const, i32 8, i1 false) ret void -} +} \ No newline at end of file diff --git a/test/test_suite/struct/struct_codegen_empty.c3t b/test/test_suite/struct/struct_codegen_empty.c3t index bdcc6c909..71c59354a 100644 --- a/test/test_suite/struct/struct_codegen_empty.c3t +++ b/test/test_suite/struct/struct_codegen_empty.c3t @@ -23,19 +23,17 @@ fn void test() /* #expect: struct_codegen_empty.ll - %a = alloca %StructA, align 4 - %a2 = alloca %StructA, align 4 - %b = alloca %StructB, align 4 - %b2 = alloca %StructB, align 4 - %b3 = alloca %StructB, align 4 - %0 = bitcast %StructA* %a to i32* - store i32 0, i32* %0, align 4 - %1 = bitcast %StructA* %a2 to i32* - store i32 0, i32* %1, align 4 - %2 = bitcast %StructB* %b to i32* - store i32 0, i32* %2, align 4 - %3 = bitcast %StructB* %b2 to i32* - store i32 0, i32* %3, align 4 - %4 = bitcast %StructB* %b3 to i32* - store i32 0, i32* %4, align 4 - ret void \ No newline at end of file + define void @struct_codegen_empty_test() #0 { + entry: + %a = alloca %StructA, align 4 + %a2 = alloca %StructA, align 4 + %b = alloca %StructB, align 4 + %b2 = alloca %StructB, align 4 + %b3 = alloca %StructB, align 4 + store i32 0, ptr %a, align 4 + store i32 0, ptr %a2, align 4 + store i32 0, ptr %b, align 4 + store i32 0, ptr %b2, align 4 + store i32 0, ptr %b3, align 4 + ret void + } \ No newline at end of file diff --git a/test/test_suite/struct/struct_codegen_fam.c3t b/test/test_suite/struct/struct_codegen_fam.c3t index 68b9945a2..a056ab326 100644 --- a/test/test_suite/struct/struct_codegen_fam.c3t +++ b/test/test_suite/struct/struct_codegen_fam.c3t @@ -22,9 +22,9 @@ fn void test(Bar b) %Bar = type { %.anon, i32, [0 x i32] } %.anon = type { i32 } -define void @foo_test(%Bar* byval(%Bar) align 8 %0) #0 { +define void @foo_test(ptr byval(%Bar) align 8 %0) #0 { entry: - %1 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 2 - %2 = getelementptr inbounds [0 x i32], [0 x i32]* %1, i64 0, i64 1 + %1 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 2 + %2 = getelementptr inbounds [0 x i32], ptr %1, i64 0, i64 1 ret void } \ No newline at end of file diff --git a/test/test_suite/struct/struct_const_construct_simple.c3t b/test/test_suite/struct/struct_const_construct_simple.c3t index badb3449d..0f3192eb8 100644 --- a/test/test_suite/struct/struct_const_construct_simple.c3t +++ b/test/test_suite/struct/struct_const_construct_simple.c3t @@ -19,7 +19,6 @@ private const Foo FOO7 = { 1, 2 }; private Foo foo8 = FOO7; /* #expect: structo.ll -%Foo = type { i32, i64 } @"ct$structo_Foo" = linkonce constant %.introspect { i8 10, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @structo_x = protected unnamed_addr global i64 16, align 8 diff --git a/test/test_suite/struct/struct_pack_and_align.c3t b/test/test_suite/struct/struct_pack_and_align.c3t index 3e868d33e..a2b58755f 100644 --- a/test/test_suite/struct/struct_pack_and_align.c3t +++ b/test/test_suite/struct/struct_pack_and_align.c3t @@ -88,14 +88,14 @@ Foo6 foo6 = { 1, 2, 3 }; define i32 @struct2_test5(i8 signext %0) #0 { entry: %y = alloca %Foo5, align 16 - %1 = bitcast %Foo5* %y to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %1, i8 0, i64 32, i1 false) - %2 = getelementptr inbounds %Foo5, %Foo5* %y, i32 0, i32 2 - store i8 %0, i8* %2, align 16 - %3 = getelementptr inbounds %Foo5, %Foo5* %y, i32 0, i32 2 - %4 = load i8, i8* %3, align 16 - %sisiext = sext i8 %4 to i32 - %5 = getelementptr inbounds %Foo5, %Foo5* %y, i32 0, i32 0 - %6 = load i32, i32* %5, align 16 - %add = add i32 %sisiext, %6 + call void @llvm.memset.p0.i64(ptr align 16 %y, i8 0, i64 32, i1 false) + %1 = getelementptr inbounds %Foo5, ptr %y, i32 0, i32 2 + store i8 %0, ptr %1, align 16 + %2 = getelementptr inbounds %Foo5, ptr %y, i32 0, i32 2 + %3 = load i8, ptr %2, align 16 + %sisiext = sext i8 %3 to i32 + %4 = getelementptr inbounds %Foo5, ptr %y, i32 0, i32 0 + %5 = load i32, ptr %4, align 16 + %add = add i32 %sisiext, %5 ret i32 %add +} diff --git a/test/test_suite/subarrays/slice_comparison.c3t b/test/test_suite/subarrays/slice_comparison.c3t index 1d55c5ff6..b7e4b5d72 100644 --- a/test/test_suite/subarrays/slice_comparison.c3t +++ b/test/test_suite/subarrays/slice_comparison.c3t @@ -31,7 +31,8 @@ fn void main() } -// #expect: mymodule.ll +/* #expect: mymodule.ll + define void @mymodule_main() #0 { entry: @@ -43,31 +44,31 @@ entry: %cmp.idx18 = alloca i64, align 8 %cmp.idx29 = alloca i64, align 8 %cmp.idx42 = alloca i64, align 8 - store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 4 }, %"char[]"* %y, align 8 - store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i32 0, i32 0), i64 4 }, %"char[]"* %z, align 8 - %0 = load %"char[]", %"char[]"* %y, align 8 + store %"char[]" { ptr @.str, i64 4 }, ptr %y, align 8 + store %"char[]" { ptr @.str.1, i64 4 }, ptr %z, align 8 + %0 = load %"char[]", ptr %y, align 8 %1 = extractvalue %"char[]" %0, 1 %2 = extractvalue %"char[]" %0, 0 %eq = icmp eq i64 %1, 4 br i1 %eq, label %subarray_cmp_values, label %subarray_cmp_exit subarray_cmp_values: ; preds = %entry - store i64 0, i64* %cmp.idx, align 8 + store i64 0, ptr %cmp.idx, align 8 br label %subarray_loop_start subarray_loop_start: ; preds = %subarray_loop_comparison, %subarray_cmp_values - %3 = load i64, i64* %cmp.idx, align 8 + %3 = load i64, ptr %cmp.idx, align 8 %lt = icmp ult i64 %3, %1 br i1 %lt, label %subarray_loop_comparison, label %subarray_cmp_exit subarray_loop_comparison: ; preds = %subarray_loop_start - %ptroffset = getelementptr inbounds i8, i8* %2, i64 %3 - %ptroffset1 = getelementptr inbounds i8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i64 %3 - %4 = load i8, i8* %ptroffset, align 1 - %5 = load i8, i8* %ptroffset1, align 1 + %ptroffset = getelementptr inbounds i8, ptr %2, i64 %3 + %ptroffset1 = getelementptr inbounds i8, ptr @.str.2, i64 %3 + %4 = load i8, ptr %ptroffset, align 1 + %5 = load i8, ptr %ptroffset1, align 1 %eq2 = icmp eq i8 %4, %5 %6 = add i64 %3, 1 - store i64 %6, i64* %cmp.idx, align 8 + store i64 %6, ptr %cmp.idx, align 8 br i1 %eq2, label %subarray_loop_start, label %subarray_cmp_exit subarray_cmp_exit: ; preds = %subarray_loop_comparison, %subarray_loop_start, %entry @@ -75,12 +76,12 @@ subarray_cmp_exit: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi, label %if.then, label %if.exit if.then: ; preds = %subarray_cmp_exit - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.3, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.3) br label %if.exit if.exit: ; preds = %if.then, %subarray_cmp_exit - %7 = load %"char[]", %"char[]"* %y, align 8 - %8 = load %"char[]", %"char[]"* %z, align 8 + %7 = load %"char[]", ptr %y, align 8 + %8 = load %"char[]", ptr %z, align 8 %9 = extractvalue %"char[]" %7, 1 %10 = extractvalue %"char[]" %8, 1 %11 = extractvalue %"char[]" %7, 0 @@ -89,22 +90,22 @@ if.exit: ; preds = %if.then, %subarray_ br i1 %eq3, label %subarray_cmp_values4, label %subarray_cmp_exit12 subarray_cmp_values4: ; preds = %if.exit - store i64 0, i64* %cmp.idx5, align 8 + store i64 0, ptr %cmp.idx5, align 8 br label %subarray_loop_start6 subarray_loop_start6: ; preds = %subarray_loop_comparison8, %subarray_cmp_values4 - %13 = load i64, i64* %cmp.idx5, align 8 + %13 = load i64, ptr %cmp.idx5, align 8 %lt7 = icmp ult i64 %13, %9 br i1 %lt7, label %subarray_loop_comparison8, label %subarray_cmp_exit12 subarray_loop_comparison8: ; preds = %subarray_loop_start6 - %ptroffset9 = getelementptr inbounds i8, i8* %11, i64 %13 - %ptroffset10 = getelementptr inbounds i8, i8* %12, i64 %13 - %14 = load i8, i8* %ptroffset9, align 1 - %15 = load i8, i8* %ptroffset10, align 1 + %ptroffset9 = getelementptr inbounds i8, ptr %11, i64 %13 + %ptroffset10 = getelementptr inbounds i8, ptr %12, i64 %13 + %14 = load i8, ptr %ptroffset9, align 1 + %15 = load i8, ptr %ptroffset10, align 1 %eq11 = icmp eq i8 %14, %15 %16 = add i64 %13, 1 - store i64 %16, i64* %cmp.idx5, align 8 + store i64 %16, ptr %cmp.idx5, align 8 br i1 %eq11, label %subarray_loop_start6, label %subarray_cmp_exit12 subarray_cmp_exit12: ; preds = %subarray_loop_comparison8, %subarray_loop_start6, %if.exit @@ -112,39 +113,37 @@ subarray_cmp_exit12: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi13, label %if.then14, label %if.exit15 if.then14: ; preds = %subarray_cmp_exit12 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.4) br label %if.exit15 if.exit15: ; preds = %if.then14, %subarray_cmp_exit12 - %17 = bitcast %"char[]"* %switch to i8* - %18 = bitcast %"char[]"* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %17, i8* align 8 %18, i32 16, i1 false) + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %switch, ptr align 8 %y, i32 16, i1 false) br label %switch.entry switch.entry: ; preds = %if.exit15 - %19 = load %"char[]", %"char[]"* %switch, align 8 - %20 = extractvalue %"char[]" %19, 1 - %21 = extractvalue %"char[]" %19, 0 - %eq16 = icmp eq i64 4, %20 + %17 = load %"char[]", ptr %switch, align 8 + %18 = extractvalue %"char[]" %17, 1 + %19 = extractvalue %"char[]" %17, 0 + %eq16 = icmp eq i64 4, %18 br i1 %eq16, label %subarray_cmp_values17, label %subarray_cmp_exit25 subarray_cmp_values17: ; preds = %switch.entry - store i64 0, i64* %cmp.idx18, align 8 + store i64 0, ptr %cmp.idx18, align 8 br label %subarray_loop_start19 subarray_loop_start19: ; preds = %subarray_loop_comparison21, %subarray_cmp_values17 - %22 = load i64, i64* %cmp.idx18, align 8 - %lt20 = icmp ult i64 %22, 4 + %20 = load i64, ptr %cmp.idx18, align 8 + %lt20 = icmp ult i64 %20, 4 br i1 %lt20, label %subarray_loop_comparison21, label %subarray_cmp_exit25 subarray_loop_comparison21: ; preds = %subarray_loop_start19 - %ptroffset22 = getelementptr inbounds i8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0), i64 %22 - %ptroffset23 = getelementptr inbounds i8, i8* %21, i64 %22 - %23 = load i8, i8* %ptroffset22, align 1 - %24 = load i8, i8* %ptroffset23, align 1 - %eq24 = icmp eq i8 %23, %24 - %25 = add i64 %22, 1 - store i64 %25, i64* %cmp.idx18, align 8 + %ptroffset22 = getelementptr inbounds i8, ptr @.str.5, i64 %20 + %ptroffset23 = getelementptr inbounds i8, ptr %19, i64 %20 + %21 = load i8, ptr %ptroffset22, align 1 + %22 = load i8, ptr %ptroffset23, align 1 + %eq24 = icmp eq i8 %21, %22 + %23 = add i64 %20, 1 + store i64 %23, ptr %cmp.idx18, align 8 br i1 %eq24, label %subarray_loop_start19, label %subarray_cmp_exit25 subarray_cmp_exit25: ; preds = %subarray_loop_comparison21, %subarray_loop_start19, %switch.entry @@ -152,32 +151,32 @@ subarray_cmp_exit25: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi26, label %switch.case, label %next_if switch.case: ; preds = %subarray_cmp_exit25 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.6) br label %switch.exit next_if: ; preds = %subarray_cmp_exit25 - %26 = extractvalue %"char[]" %19, 1 - %27 = extractvalue %"char[]" %19, 0 - %eq27 = icmp eq i64 5, %26 + %24 = extractvalue %"char[]" %17, 1 + %25 = extractvalue %"char[]" %17, 0 + %eq27 = icmp eq i64 5, %24 br i1 %eq27, label %subarray_cmp_values28, label %subarray_cmp_exit36 subarray_cmp_values28: ; preds = %next_if - store i64 0, i64* %cmp.idx29, align 8 + store i64 0, ptr %cmp.idx29, align 8 br label %subarray_loop_start30 subarray_loop_start30: ; preds = %subarray_loop_comparison32, %subarray_cmp_values28 - %28 = load i64, i64* %cmp.idx29, align 8 - %lt31 = icmp ult i64 %28, 5 + %26 = load i64, ptr %cmp.idx29, align 8 + %lt31 = icmp ult i64 %26, 5 br i1 %lt31, label %subarray_loop_comparison32, label %subarray_cmp_exit36 subarray_loop_comparison32: ; preds = %subarray_loop_start30 - %ptroffset33 = getelementptr inbounds i8, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i32 0, i32 0), i64 %28 - %ptroffset34 = getelementptr inbounds i8, i8* %27, i64 %28 - %29 = load i8, i8* %ptroffset33, align 1 - %30 = load i8, i8* %ptroffset34, align 1 - %eq35 = icmp eq i8 %29, %30 - %31 = add i64 %28, 1 - store i64 %31, i64* %cmp.idx29, align 8 + %ptroffset33 = getelementptr inbounds i8, ptr @.str.7, i64 %26 + %ptroffset34 = getelementptr inbounds i8, ptr %25, i64 %26 + %27 = load i8, ptr %ptroffset33, align 1 + %28 = load i8, ptr %ptroffset34, align 1 + %eq35 = icmp eq i8 %27, %28 + %29 = add i64 %26, 1 + store i64 %29, ptr %cmp.idx29, align 8 br i1 %eq35, label %subarray_loop_start30, label %subarray_cmp_exit36 subarray_cmp_exit36: ; preds = %subarray_loop_comparison32, %subarray_loop_start30, %next_if @@ -185,32 +184,32 @@ subarray_cmp_exit36: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi37, label %switch.case38, label %next_if39 switch.case38: ; preds = %subarray_cmp_exit36 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.8, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.8) br label %switch.exit next_if39: ; preds = %subarray_cmp_exit36 - %32 = extractvalue %"char[]" %19, 1 - %33 = extractvalue %"char[]" %19, 0 - %eq40 = icmp eq i64 4, %32 + %30 = extractvalue %"char[]" %17, 1 + %31 = extractvalue %"char[]" %17, 0 + %eq40 = icmp eq i64 4, %30 br i1 %eq40, label %subarray_cmp_values41, label %subarray_cmp_exit49 subarray_cmp_values41: ; preds = %next_if39 - store i64 0, i64* %cmp.idx42, align 8 + store i64 0, ptr %cmp.idx42, align 8 br label %subarray_loop_start43 subarray_loop_start43: ; preds = %subarray_loop_comparison45, %subarray_cmp_values41 - %34 = load i64, i64* %cmp.idx42, align 8 - %lt44 = icmp ult i64 %34, 4 + %32 = load i64, ptr %cmp.idx42, align 8 + %lt44 = icmp ult i64 %32, 4 br i1 %lt44, label %subarray_loop_comparison45, label %subarray_cmp_exit49 subarray_loop_comparison45: ; preds = %subarray_loop_start43 - %ptroffset46 = getelementptr inbounds i8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.9, i32 0, i32 0), i64 %34 - %ptroffset47 = getelementptr inbounds i8, i8* %33, i64 %34 - %35 = load i8, i8* %ptroffset46, align 1 - %36 = load i8, i8* %ptroffset47, align 1 - %eq48 = icmp eq i8 %35, %36 - %37 = add i64 %34, 1 - store i64 %37, i64* %cmp.idx42, align 8 + %ptroffset46 = getelementptr inbounds i8, ptr @.str.9, i64 %32 + %ptroffset47 = getelementptr inbounds i8, ptr %31, i64 %32 + %33 = load i8, ptr %ptroffset46, align 1 + %34 = load i8, ptr %ptroffset47, align 1 + %eq48 = icmp eq i8 %33, %34 + %35 = add i64 %32, 1 + store i64 %35, ptr %cmp.idx42, align 8 br i1 %eq48, label %subarray_loop_start43, label %subarray_cmp_exit49 subarray_cmp_exit49: ; preds = %subarray_loop_comparison45, %subarray_loop_start43, %next_if39 @@ -218,16 +217,16 @@ subarray_cmp_exit49: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi50, label %switch.case51, label %next_if52 switch.case51: ; preds = %subarray_cmp_exit49 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.10) br label %switch.exit next_if52: ; preds = %subarray_cmp_exit49 br label %switch.default switch.default: ; preds = %next_if52 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.11) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case51, %switch.case38, %switch.case ret void -} \ No newline at end of file +} diff --git a/test/test_suite/subarrays/slice_offset.c3t b/test/test_suite/subarrays/slice_offset.c3t index 8b4aeff47..5f5a740fd 100644 --- a/test/test_suite/subarrays/slice_offset.c3t +++ b/test/test_suite/subarrays/slice_offset.c3t @@ -4,13 +4,16 @@ fn void test() int[] y = x[1..2]; } -// #expect: slice_offset.ll +/* #expect: slice_offset.ll +define void @slice_offset_test() #0 { +entry: %x = alloca [3 x i32], align 4 %y = alloca %"int[]", align 8 - %0 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - %2 = insertvalue %"int[]" undef, i32* %1, 0 - %3 = insertvalue %"int[]" %2, i64 2, 1 - store %"int[]" %3, %"int[]"* %y, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + %1 = insertvalue %"int[]" undef, ptr %0, 0 + %2 = insertvalue %"int[]" %1, i64 2, 1 + store %"int[]" %2, ptr %y, align 8 + ret void +} diff --git a/test/test_suite/subarrays/slice_offset_neg_end.c3t b/test/test_suite/subarrays/slice_offset_neg_end.c3t index 5e33af0f3..a3f8657e1 100644 --- a/test/test_suite/subarrays/slice_offset_neg_end.c3t +++ b/test/test_suite/subarrays/slice_offset_neg_end.c3t @@ -5,14 +5,16 @@ fn void test() int[] y = x[1..^1]; } -// #expect: slice_offset_neg_end.ll +/* #expect: slice_offset_neg_end.ll +define void @slice_offset_neg_end_test() #0 { +entry: %x = alloca [3 x i32], align 4 %y = alloca %"int[]", align 8 - %0 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - %2 = insertvalue %"int[]" undef, i32* %1, 0 - %3 = insertvalue %"int[]" %2, i64 2, 1 - store %"int[]" %3, %"int[]"* %y, align 8 - + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + %1 = insertvalue %"int[]" undef, ptr %0, 0 + %2 = insertvalue %"int[]" %1, i64 2, 1 + store %"int[]" %2, ptr %y, align 8 + ret void +} diff --git a/test/test_suite/subarrays/slice_offset_neg_start.c3t b/test/test_suite/subarrays/slice_offset_neg_start.c3t index 13a406179..eb0a54489 100644 --- a/test/test_suite/subarrays/slice_offset_neg_start.c3t +++ b/test/test_suite/subarrays/slice_offset_neg_start.c3t @@ -4,13 +4,16 @@ fn void test() int[] y = x[^2..1]; } -// #expect: slice_offset_neg_start.ll +/* #expect: slice_offset_neg_start.ll +define void @slice_offset_neg_start_test() #0 { +entry: %x = alloca [3 x i32], align 4 %y = alloca %"int[]", align 8 - %0 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 - %2 = insertvalue %"int[]" undef, i32* %1, 0 - %3 = insertvalue %"int[]" %2, i64 1, 1 - store %"int[]" %3, %"int[]"* %y, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 + %1 = insertvalue %"int[]" undef, ptr %0, 0 + %2 = insertvalue %"int[]" %1, i64 1, 1 + store %"int[]" %2, ptr %y, align 8 + ret void +} diff --git a/test/test_suite/subarrays/slice_start.c3t b/test/test_suite/subarrays/slice_start.c3t index 6f94e5d7c..de9aa96a5 100644 --- a/test/test_suite/subarrays/slice_start.c3t +++ b/test/test_suite/subarrays/slice_start.c3t @@ -4,13 +4,16 @@ fn void test() int[] y = x[..]; } -// #expect: slice_start.ll +/* #expect: slice_start.ll +define void @slice_start_test() #0 { +entry: %x = alloca [3 x i32], align 4 %y = alloca %"int[]", align 8 - %0 = bitcast [3 x i32]* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) - %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 - %2 = insertvalue %"int[]" undef, i32* %1, 0 - %3 = insertvalue %"int[]" %2, i64 3, 1 - store %"int[]" %3, %"int[]"* %y, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) + %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 + %1 = insertvalue %"int[]" undef, ptr %0, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + store %"int[]" %2, ptr %y, align 8 + ret void +} \ No newline at end of file diff --git a/test/test_suite/symbols/various.c3 b/test/test_suite/symbols/various.c3 index 2dd2fe1e9..db36e6479 100644 --- a/test/test_suite/symbols/various.c3 +++ b/test/test_suite/symbols/various.c3 @@ -184,3 +184,6 @@ fn void test24() { int a = b123; // #error: 'int[2][3]' to 'int' } + + + diff --git a/test/test_suite/union/union_codegen_empty.c3t b/test/test_suite/union/union_codegen_empty.c3t index f52d5aa4e..7acc48b84 100644 --- a/test/test_suite/union/union_codegen_empty.c3t +++ b/test/test_suite/union/union_codegen_empty.c3t @@ -23,24 +23,22 @@ fn void test() UnionB b4 = { .b.a = 23, .c = 4, .d = 0.4, .b = {} }; } -// #expect: union_codegen_empty.ll +/* #expect: union_codegen_empty.ll +source_filena +define void @union_codegen_empty_test() #0 { +entry: %a = alloca %UnionA, align 4 %a2 = alloca %UnionA, align 4 %b = alloca %UnionB, align 8 %b2 = alloca %UnionB, align 8 %b3 = alloca %UnionB, align 8 %b4 = alloca %UnionB, align 8 - %0 = bitcast %UnionA* %a to i32* - store i32 0, i32* %0, align 4 - %1 = bitcast %UnionA* %a2 to i32* - store i32 0, i32* %1, align 4 - %2 = bitcast %UnionB* %b to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %2, i8 0, i64 8, i1 false) - %3 = bitcast %UnionB* %b2 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 8, i1 false) - %4 = bitcast %UnionB* %b3 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %4, i8 0, i64 8, i1 false) - %5 = bitcast %UnionB* %b4 to i8* - call void @llvm.memset.p0i8.i64(i8* align 8 %5, i8 0, i64 8, i1 false) + store i32 0, ptr %a, align 4 + store i32 0, ptr %a2, align 4 + call void @llvm.memset.p0.i64(ptr align 8 %b, i8 0, i64 8, i1 false) + call void @llvm.memset.p0.i64(ptr align 8 %b2, i8 0, i64 8, i1 false) + call void @llvm.memset.p0.i64(ptr align 8 %b3, i8 0, i64 8, i1 false) + call void @llvm.memset.p0.i64(ptr align 8 %b4, i8 0, i64 8, i1 false) ret void +} \ No newline at end of file diff --git a/test/test_suite/union/union_codegen_overwrite_call.c3t b/test/test_suite/union/union_codegen_overwrite_call.c3t index 01521672c..25a5bf02c 100644 --- a/test/test_suite/union/union_codegen_overwrite_call.c3t +++ b/test/test_suite/union/union_codegen_overwrite_call.c3t @@ -17,15 +17,13 @@ fn void test() UnionB b = { .c = bar(), .b = {} }; } -// #expect: test.ll +/* #expect: test.ll +define void @test_test() #0 { entry: %b = alloca %UnionB, align 8 - %0 = bitcast %UnionB* %b to i32* - %1 = call i32 @bar() - store i32 %1, i32* %0, align 8 - %2 = bitcast %UnionB* %b to %b* - %3 = bitcast %b* %2 to i32* - store i32 0, i32* %3, align 8 + %0 = call i32 @bar() + store i32 %0, ptr %b, align 8 + store i32 0, ptr %b, align 8 ret void - +} diff --git a/test/test_suite/variant/variant_assign.c3t b/test/test_suite/variant/variant_assign.c3t index 0077353ed..9c494ac70 100644 --- a/test/test_suite/variant/variant_assign.c3t +++ b/test/test_suite/variant/variant_assign.c3t @@ -62,190 +62,174 @@ fn int main() @"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -define void @foo_test(i64 %0, i8* %1) #0 { +define void @foo_test(i64 %0, ptr %1) #0 { entry: %z = alloca %variant, align 8 %switch = alloca i64, align 8 - %z1 = alloca i32*, align 8 - %z4 = alloca double*, align 8 - %pair = bitcast %variant* %z to { i64, i8* }* - %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 - store i8* %1, i8** %3, align 8 - %4 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 1 - %5 = load i64, i64* %4, align 8 - store i64 %5, i64* %switch, align 8 + %z1 = alloca ptr, align 8 + %z4 = alloca ptr, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 1 + store ptr %1, ptr %3, align 8 + %4 = getelementptr inbounds %variant, ptr %z, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %entry - %6 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %6 + %6 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - %7 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 - %8 = bitcast i8** %7 to i32** - %9 = load i32*, i32** %8, align 8 - store i32* %9, i32** %z1, align 8 - %10 = load i32*, i32** %z1, align 8 - %11 = load i32, i32* %10, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %11) + %7 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + store ptr %8, ptr %z1, align 8 + %9 = load ptr, ptr %z1, align 8 + %10 = load i32, ptr %9, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %10) br label %switch.exit next_if: ; preds = %switch.entry - %eq2 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %6 + %eq2 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 br i1 %eq2, label %switch.case3, label %next_if5 switch.case3: ; preds = %next_if - %12 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 - %13 = bitcast i8** %12 to double** - %14 = load double*, double** %13, align 8 - store double* %14, double** %z4, align 8 - %15 = load double*, double** %z4, align 8 - %16 = load double, double* %15, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %16) + %11 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 + %12 = load ptr, ptr %11, align 8 + store ptr %12, ptr %z4, align 8 + %13 = load ptr, ptr %z4, align 8 + %14 = load double, ptr %13, align 8 + call void (ptr, ...) @printf(ptr @.str.1, double %14) br label %switch.exit next_if5: ; preds = %next_if br label %switch.default switch.default: ; preds = %next_if5 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.2) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case3, %switch.case ret void } -define void @foo_test2(i64 %0, i8* %1) #0 { +define void @foo_test2(i64 %0, ptr %1) #0 { entry: %y = alloca %variant, align 8 %.anon = alloca %variant, align 8 %switch = alloca i64, align 8 - %z = alloca i32*, align 8 + %z = alloca ptr, align 8 %taddr = alloca i32, align 4 - %z3 = alloca double*, align 8 - %pair = bitcast %variant* %y to { i64, i8* }* - %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 - store i8* %1, i8** %3, align 8 - %4 = bitcast %variant* %.anon to i8* - %5 = bitcast %variant* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 16, i1 false) - %6 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %switch, align 8 + %z3 = alloca ptr, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 1 + store ptr %1, ptr %3, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %.anon, ptr align 8 %y, i32 16, i1 false) + %4 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %entry - %8 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %8 + %6 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - %9 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 - %10 = bitcast i8** %9 to i32** - %11 = load i32*, i32** %10, align 8 - store i32* %11, i32** %z, align 8 - store i32 12, i32* %taddr, align 4 - %12 = bitcast i32* %taddr to i8* - %13 = insertvalue %variant undef, i8* %12, 0 - %14 = insertvalue %variant %13, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %14, %variant* %y, align 8 - %15 = load i32*, i32** %z, align 8 - %16 = load i32, i32* %15, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %16) + %7 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + store ptr %8, ptr %z, align 8 + store i32 12, ptr %taddr, align 4 + %9 = insertvalue %variant undef, ptr %taddr, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %10, ptr %y, align 8 + %11 = load ptr, ptr %z, align 8 + %12 = load i32, ptr %11, align 8 + call void (ptr, ...) @printf(ptr @.str.3, i32 %12) br label %switch.exit next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %8 + %eq1 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 br i1 %eq1, label %switch.case2, label %next_if4 switch.case2: ; preds = %next_if - %17 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 - %18 = bitcast i8** %17 to double** - %19 = load double*, double** %18, align 8 - store double* %19, double** %z3, align 8 - %20 = load double*, double** %z3, align 8 - %21 = load double, double* %20, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), double %21) + %13 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 + %14 = load ptr, ptr %13, align 8 + store ptr %14, ptr %z3, align 8 + %15 = load ptr, ptr %z3, align 8 + %16 = load double, ptr %15, align 8 + call void (ptr, ...) @printf(ptr @.str.4, double %16) br label %switch.exit next_if4: ; preds = %next_if br label %switch.default switch.default: ; preds = %next_if4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.5) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case2, %switch.case ret void } -; Function Attrs: nounwind -define void @foo_test3(i64 %0, i8* %1) #0 { +define void @foo_test3(i64 %0, ptr %1) #0 { entry: %y = alloca %variant, align 8 %.anon = alloca %variant, align 8 %switch = alloca i64, align 8 %z = alloca i32, align 4 %z3 = alloca double, align 8 - %pair = bitcast %variant* %y to { i64, i8* }* - %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 - store i8* %1, i8** %3, align 8 - %4 = bitcast %variant* %.anon to i8* - %5 = bitcast %variant* %y to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 16, i1 false) - %6 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %switch, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 1 + store ptr %1, ptr %3, align 8 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %.anon, ptr align 8 %y, i32 16, i1 false) + %4 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %entry - %8 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %8 + %6 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - %9 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 - %10 = bitcast i8** %9 to i32** - %11 = load i32*, i32** %10, align 8 - %12 = load i32, i32* %11, align 8 - store i32 %12, i32* %z, align 4 - %13 = load i32, i32* %z, align 4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.6, i32 0, i32 0), i32 %13) + %7 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + %9 = load i32, ptr %8, align 8 + store i32 %9, ptr %z, align 4 + %10 = load i32, ptr %z, align 4 + call void (ptr, ...) @printf(ptr @.str.6, i32 %10) br label %switch.exit next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %8 + %eq1 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 br i1 %eq1, label %switch.case2, label %next_if4 switch.case2: ; preds = %next_if - %14 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 - %15 = bitcast i8** %14 to double** - %16 = load double*, double** %15, align 8 - %17 = load double, double* %16, align 8 - store double %17, double* %z3, align 8 - %18 = load double, double* %z3, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i32 0, i32 0), double %18) + %11 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 + %12 = load ptr, ptr %11, align 8 + %13 = load double, ptr %12, align 8 + store double %13, ptr %z3, align 8 + %14 = load double, ptr %z3, align 8 + call void (ptr, ...) @printf(ptr @.str.7, double %14) br label %switch.exit next_if4: ; preds = %next_if br label %switch.default switch.default: ; preds = %next_if4 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.8) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case2, %switch.case ret void } -; Function Attrs: nounwind define i32 @main() #0 { entry: %taddr = alloca double, align 8 @@ -266,102 +250,86 @@ entry: %taddr27 = alloca %variant, align 8 %taddr30 = alloca i8, align 1 %taddr31 = alloca %variant, align 8 - store double 1.230000e+02, double* %taddr, align 8 - %0 = bitcast double* %taddr to i8* - %1 = insertvalue %variant undef, i8* %0, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - store %variant %2, %variant* %taddr1, align 8 - %3 = bitcast %variant* %taddr1 to { i64, i8* }* - %4 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 0 - %lo = load i64, i64* %4, align 8 - %5 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 1 - %hi = load i8*, i8** %5, align 8 - call void @foo_test(i64 %lo, i8* %hi) - store i32 1, i32* %taddr2, align 4 - %6 = bitcast i32* %taddr2 to i8* - %7 = insertvalue %variant undef, i8* %6, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %8, %variant* %taddr3, align 8 - %9 = bitcast %variant* %taddr3 to { i64, i8* }* - %10 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 0 - %lo4 = load i64, i64* %10, align 8 - %11 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 1 - %hi5 = load i8*, i8** %11, align 8 - call void @foo_test(i64 %lo4, i8* %hi5) - store i8 1, i8* %taddr6, align 1 - %12 = insertvalue %variant undef, i8* %taddr6, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - store %variant %13, %variant* %taddr7, align 8 - %14 = bitcast %variant* %taddr7 to { i64, i8* }* - %15 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 0 - %lo8 = load i64, i64* %15, align 8 - %16 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 1 - %hi9 = load i8*, i8** %16, align 8 - call void @foo_test(i64 %lo8, i8* %hi9) - store double 1.235000e+02, double* %taddr10, align 8 - %17 = bitcast double* %taddr10 to i8* - %18 = insertvalue %variant undef, i8* %17, 0 - %19 = insertvalue %variant %18, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - store %variant %19, %variant* %taddr11, align 8 - %20 = bitcast %variant* %taddr11 to { i64, i8* }* - %21 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %20, i32 0, i32 0 - %lo12 = load i64, i64* %21, align 8 - %22 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %20, i32 0, i32 1 - %hi13 = load i8*, i8** %22, align 8 - call void @foo_test2(i64 %lo12, i8* %hi13) - store i32 1, i32* %taddr14, align 4 - %23 = bitcast i32* %taddr14 to i8* - %24 = insertvalue %variant undef, i8* %23, 0 - %25 = insertvalue %variant %24, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %25, %variant* %taddr15, align 8 - %26 = bitcast %variant* %taddr15 to { i64, i8* }* - %27 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %26, i32 0, i32 0 - %lo16 = load i64, i64* %27, align 8 - %28 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %26, i32 0, i32 1 - %hi17 = load i8*, i8** %28, align 8 - call void @foo_test2(i64 %lo16, i8* %hi17) - store i8 1, i8* %taddr18, align 1 - %29 = insertvalue %variant undef, i8* %taddr18, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - store %variant %30, %variant* %taddr19, align 8 - %31 = bitcast %variant* %taddr19 to { i64, i8* }* - %32 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %31, i32 0, i32 0 - %lo20 = load i64, i64* %32, align 8 - %33 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %31, i32 0, i32 1 - %hi21 = load i8*, i8** %33, align 8 - call void @foo_test2(i64 %lo20, i8* %hi21) - store double 1.240000e+02, double* %taddr22, align 8 - %34 = bitcast double* %taddr22 to i8* - %35 = insertvalue %variant undef, i8* %34, 0 - %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - store %variant %36, %variant* %taddr23, align 8 - %37 = bitcast %variant* %taddr23 to { i64, i8* }* - %38 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %37, i32 0, i32 0 - %lo24 = load i64, i64* %38, align 8 - %39 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %37, i32 0, i32 1 - %hi25 = load i8*, i8** %39, align 8 - call void @foo_test3(i64 %lo24, i8* %hi25) - store i32 2, i32* %taddr26, align 4 - %40 = bitcast i32* %taddr26 to i8* - %41 = insertvalue %variant undef, i8* %40, 0 - %42 = insertvalue %variant %41, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %42, %variant* %taddr27, align 8 - %43 = bitcast %variant* %taddr27 to { i64, i8* }* - %44 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %43, i32 0, i32 0 - %lo28 = load i64, i64* %44, align 8 - %45 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %43, i32 0, i32 1 - %hi29 = load i8*, i8** %45, align 8 - call void @foo_test3(i64 %lo28, i8* %hi29) - store i8 1, i8* %taddr30, align 1 - %46 = insertvalue %variant undef, i8* %taddr30, 0 - %47 = insertvalue %variant %46, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - store %variant %47, %variant* %taddr31, align 8 - %48 = bitcast %variant* %taddr31 to { i64, i8* }* - %49 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %48, i32 0, i32 0 - %lo32 = load i64, i64* %49, align 8 - %50 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %48, i32 0, i32 1 - %hi33 = load i8*, i8** %50, align 8 - call void @foo_test3(i64 %lo32, i8* %hi33) + store double 1.230000e+02, ptr %taddr, align 8 + %0 = insertvalue %variant undef, ptr %taddr, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$double" to i64), 1 + store %variant %1, ptr %taddr1, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 0 + %lo = load i64, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 1 + %hi = load ptr, ptr %3, align 8 + call void @foo_test(i64 %lo, ptr %hi) + store i32 1, ptr %taddr2, align 4 + %4 = insertvalue %variant undef, ptr %taddr2, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %5, ptr %taddr3, align 8 + %6 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 0 + %lo4 = load i64, ptr %6, align 8 + %7 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 1 + %hi5 = load ptr, ptr %7, align 8 + call void @foo_test(i64 %lo4, ptr %hi5) + store i8 1, ptr %taddr6, align 1 + %8 = insertvalue %variant undef, ptr %taddr6, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + store %variant %9, ptr %taddr7, align 8 + %10 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 0 + %lo8 = load i64, ptr %10, align 8 + %11 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 1 + %hi9 = load ptr, ptr %11, align 8 + call void @foo_test(i64 %lo8, ptr %hi9) + store double 1.235000e+02, ptr %taddr10, align 8 + %12 = insertvalue %variant undef, ptr %taddr10, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$double" to i64), 1 + store %variant %13, ptr %taddr11, align 8 + %14 = getelementptr inbounds { i64, ptr }, ptr %taddr11, i32 0, i32 0 + %lo12 = load i64, ptr %14, align 8 + %15 = getelementptr inbounds { i64, ptr }, ptr %taddr11, i32 0, i32 1 + %hi13 = load ptr, ptr %15, align 8 + call void @foo_test2(i64 %lo12, ptr %hi13) + store i32 1, ptr %taddr14, align 4 + %16 = insertvalue %variant undef, ptr %taddr14, 0 + %17 = insertvalue %variant %16, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %17, ptr %taddr15, align 8 + %18 = getelementptr inbounds { i64, ptr }, ptr %taddr15, i32 0, i32 0 + %lo16 = load i64, ptr %18, align 8 + %19 = getelementptr inbounds { i64, ptr }, ptr %taddr15, i32 0, i32 1 + %hi17 = load ptr, ptr %19, align 8 + call void @foo_test2(i64 %lo16, ptr %hi17) + store i8 1, ptr %taddr18, align 1 + %20 = insertvalue %variant undef, ptr %taddr18, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + store %variant %21, ptr %taddr19, align 8 + %22 = getelementptr inbounds { i64, ptr }, ptr %taddr19, i32 0, i32 0 + %lo20 = load i64, ptr %22, align 8 + %23 = getelementptr inbounds { i64, ptr }, ptr %taddr19, i32 0, i32 1 + %hi21 = load ptr, ptr %23, align 8 + call void @foo_test2(i64 %lo20, ptr %hi21) + store double 1.240000e+02, ptr %taddr22, align 8 + %24 = insertvalue %variant undef, ptr %taddr22, 0 + %25 = insertvalue %variant %24, i64 ptrtoint (ptr @"ct$double" to i64), 1 + store %variant %25, ptr %taddr23, align 8 + %26 = getelementptr inbounds { i64, ptr }, ptr %taddr23, i32 0, i32 0 + %lo24 = load i64, ptr %26, align 8 + %27 = getelementptr inbounds { i64, ptr }, ptr %taddr23, i32 0, i32 1 + %hi25 = load ptr, ptr %27, align 8 + call void @foo_test3(i64 %lo24, ptr %hi25) + store i32 2, ptr %taddr26, align 4 + %28 = insertvalue %variant undef, ptr %taddr26, 0 + %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %29, ptr %taddr27, align 8 + %30 = getelementptr inbounds { i64, ptr }, ptr %taddr27, i32 0, i32 0 + %lo28 = load i64, ptr %30, align 8 + %31 = getelementptr inbounds { i64, ptr }, ptr %taddr27, i32 0, i32 1 + %hi29 = load ptr, ptr %31, align 8 + call void @foo_test3(i64 %lo28, ptr %hi29) + store i8 1, ptr %taddr30, align 1 + %32 = insertvalue %variant undef, ptr %taddr30, 0 + %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + store %variant %33, ptr %taddr31, align 8 + %34 = getelementptr inbounds { i64, ptr }, ptr %taddr31, i32 0, i32 0 + %lo32 = load i64, ptr %34, align 8 + %35 = getelementptr inbounds { i64, ptr }, ptr %taddr31, i32 0, i32 1 + %hi33 = load ptr, ptr %35, align 8 + call void @foo_test3(i64 %lo32, ptr %hi33) ret i32 0 } - diff --git a/test/test_suite/variant/variant_switch.c3t b/test/test_suite/variant/variant_switch.c3t index 0de5b2d8e..fdfd3c94c 100644 --- a/test/test_suite/variant/variant_switch.c3t +++ b/test/test_suite/variant/variant_switch.c3t @@ -34,72 +34,68 @@ fn int main() @"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -define void @foo_test(i64 %0, i8* %1) #0 { +define void @foo_test(i64 %0, ptr %1) #0 { entry: %z = alloca %variant, align 8 %switch = alloca i64, align 8 - %z1 = alloca i32*, align 8 - %z4 = alloca double*, align 8 - %pair = bitcast %variant* %z to { i64, i8* }* - %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 - store i8* %1, i8** %3, align 8 - %4 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 1 - %5 = load i64, i64* %4, align 8 - store i64 %5, i64* %switch, align 8 + %z1 = alloca ptr, align 8 + %z4 = alloca ptr, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 1 + store ptr %1, ptr %3, align 8 + %4 = getelementptr inbounds %variant, ptr %z, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %entry - %6 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %6 + %6 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - %7 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 - %8 = bitcast i8** %7 to i32** - %9 = load i32*, i32** %8, align 8 - store i32* %9, i32** %z1, align 8 - %10 = load i32*, i32** %z1, align 8 - %11 = load i32, i32* %10, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %11) - %12 = load i32*, i32** %z1, align 8 - store i32 3, i32* %12, align 8 + %7 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + store ptr %8, ptr %z1, align 8 + %9 = load ptr, ptr %z1, align 8 + %10 = load i32, ptr %9, align 8 + call void (ptr, ...) @printf(ptr @.str, i32 %10) + %11 = load ptr, ptr %z1, align 8 + store i32 3, ptr %11, align 8 br label %switch.exit next_if: ; preds = %switch.entry - %eq2 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %6 + %eq2 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 br i1 %eq2, label %switch.case3, label %next_if5 switch.case3: ; preds = %next_if - %13 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 - %14 = bitcast i8** %13 to double** - %15 = load double*, double** %14, align 8 - store double* %15, double** %z4, align 8 - %16 = load double*, double** %z4, align 8 - %17 = load double, double* %16, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %17) + %12 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 + %13 = load ptr, ptr %12, align 8 + store ptr %13, ptr %z4, align 8 + %14 = load ptr, ptr %z4, align 8 + %15 = load double, ptr %14, align 8 + call void (ptr, ...) @printf(ptr @.str.1, double %15) br label %switch.exit next_if5: ; preds = %next_if br label %switch.default switch.default: ; preds = %next_if5 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.2) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case3, %switch.case - %18 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 1 - %19 = load i64, i64* %18, align 8 - %eq6 = icmp eq i64 %19, ptrtoint (%.introspect* @"ct$int" to i64) + %16 = getelementptr inbounds %variant, ptr %z, i32 0, i32 1 + %17 = load i64, ptr %16, align 8 + %eq6 = icmp eq i64 %17, ptrtoint (ptr @"ct$int" to i64) br i1 %eq6, label %if.then, label %if.exit if.then: ; preds = %switch.exit - %20 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 - %21 = bitcast i8** %20 to i32** - %22 = load i32*, i32** %21, align 8 - %23 = load i32, i32* %22, align 8 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %23) + %18 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 + %19 = load ptr, ptr %18, align 8 + %20 = load i32, ptr %19, align 8 + call void (ptr, ...) @printf(ptr @.str.3, i32 %20) br label %if.exit if.exit: ; preds = %if.then, %switch.exit @@ -115,37 +111,32 @@ entry: %taddr3 = alloca %variant, align 8 %taddr6 = alloca i8, align 1 %taddr7 = alloca %variant, align 8 - store double 1.230000e+02, double* %taddr, align 8 - %0 = bitcast double* %taddr to i8* - %1 = insertvalue %variant undef, i8* %0, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - store %variant %2, %variant* %taddr1, align 8 - %3 = bitcast %variant* %taddr1 to { i64, i8* }* - %4 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 0 - %lo = load i64, i64* %4, align 8 - %5 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 1 - %hi = load i8*, i8** %5, align 8 - call void @foo_test(i64 %lo, i8* %hi) - store i32 1, i32* %taddr2, align 4 - %6 = bitcast i32* %taddr2 to i8* - %7 = insertvalue %variant undef, i8* %6, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %8, %variant* %taddr3, align 8 - %9 = bitcast %variant* %taddr3 to { i64, i8* }* - %10 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 0 - %lo4 = load i64, i64* %10, align 8 - %11 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 1 - %hi5 = load i8*, i8** %11, align 8 - call void @foo_test(i64 %lo4, i8* %hi5) - store i8 1, i8* %taddr6, align 1 - %12 = insertvalue %variant undef, i8* %taddr6, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - store %variant %13, %variant* %taddr7, align 8 - %14 = bitcast %variant* %taddr7 to { i64, i8* }* - %15 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 0 - %lo8 = load i64, i64* %15, align 8 - %16 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 1 - %hi9 = load i8*, i8** %16, align 8 - call void @foo_test(i64 %lo8, i8* %hi9) + store double 1.230000e+02, ptr %taddr, align 8 + %0 = insertvalue %variant undef, ptr %taddr, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$double" to i64), 1 + store %variant %1, ptr %taddr1, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 0 + %lo = load i64, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 1 + %hi = load ptr, ptr %3, align 8 + call void @foo_test(i64 %lo, ptr %hi) + store i32 1, ptr %taddr2, align 4 + %4 = insertvalue %variant undef, ptr %taddr2, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %5, ptr %taddr3, align 8 + %6 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 0 + %lo4 = load i64, ptr %6, align 8 + %7 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 1 + %hi5 = load ptr, ptr %7, align 8 + call void @foo_test(i64 %lo4, ptr %hi5) + store i8 1, ptr %taddr6, align 1 + %8 = insertvalue %variant undef, ptr %taddr6, 0 + %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + store %variant %9, ptr %taddr7, align 8 + %10 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 0 + %lo8 = load i64, ptr %10, align 8 + %11 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 1 + %hi9 = load ptr, ptr %11, align 8 + call void @foo_test(i64 %lo8, ptr %hi9) ret i32 0 } diff --git a/test/test_suite/variant/variant_test.c3t b/test/test_suite/variant/variant_test.c3t index fcc4464c3..dfdee6d08 100644 --- a/test/test_suite/variant/variant_test.c3t +++ b/test/test_suite/variant/variant_test.c3t @@ -63,67 +63,66 @@ fn void main() /* #expect: foo.ll -%variant = type { i8*, i64 } -%"variant[]" = type { %variant*, i64 } +%variant = type { ptr, i64 } +%"variant[]" = type { ptr, i64 } @"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 @"ct$variant" = linkonce constant %.introspect { i8 7, i64 16, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$p$int" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$p$int" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 @"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -define void @foo_test(i64 %0, i8* %1) #0 { +define void @foo_test(i64 %0, ptr %1) #0 { entry: %x = alloca %variant, align 8 %switch = alloca i64, align 8 - %pair = bitcast %variant* %x to { i64, i8* }* - %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 - store i64 %0, i64* %2, align 8 - %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 - store i8* %1, i8** %3, align 8 - %4 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 - %5 = load i64, i64* %4, align 8 - store i64 %5, i64* %switch, align 8 + %2 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 0 + store i64 %0, ptr %2, align 8 + %3 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 1 + store ptr %1, ptr %3, align 8 + %4 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %switch, align 8 br label %switch.entry switch.entry: ; preds = %entry - %6 = load i64, i64* %switch, align 8 - %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %6 + %6 = load i64, ptr %switch, align 8 + %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str) br label %switch.exit next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %6 + %eq1 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 br i1 %eq1, label %switch.case2, label %next_if3 switch.case2: ; preds = %next_if - call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.1) br label %switch.exit next_if3: ; preds = %next_if - %eq4 = icmp eq i64 ptrtoint (%.introspect* @"ct$variant" to i64), %6 + %eq4 = icmp eq i64 ptrtoint (ptr @"ct$variant" to i64), %6 br i1 %eq4, label %switch.case5, label %next_if6 switch.case5: ; preds = %next_if3 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.2) br label %switch.exit next_if6: ; preds = %next_if3 - %eq7 = icmp eq i64 ptrtoint (%.introspect* @"ct$p$int" to i64), %6 + %eq7 = icmp eq i64 ptrtoint (ptr @"ct$p$int" to i64), %6 br i1 %eq7, label %switch.case8, label %next_if9 switch.case8: ; preds = %next_if6 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.3) br label %switch.exit next_if9: ; preds = %next_if6 br label %switch.default switch.default: ; preds = %next_if9 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.4) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case8, %switch.case5, %switch.case2, %switch.case @@ -131,46 +130,42 @@ switch.exit: ; preds = %switch.default, %sw } ; Function Attrs: nounwind -define void @foo_test_all(i8* %0, i64 %1) #0 { +define void @foo_test_all(ptr %0, i64 %1) #0 { entry: %y = alloca %"variant[]", align 8 %.anon = alloca i64, align 8 %.anon1 = alloca i64, align 8 %element = alloca %variant, align 8 - %pair = bitcast %"variant[]"* %y to { i8*, i64 }* - %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 - store i8* %0, i8** %2, align 8 - %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 - store i64 %1, i64* %3, align 8 - %4 = getelementptr inbounds %"variant[]", %"variant[]"* %y, i32 0, i32 1 - %5 = load i64, i64* %4, align 8 - store i64 %5, i64* %.anon, align 8 - store i64 0, i64* %.anon1, align 8 + %2 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 0 + store ptr %0, ptr %2, align 8 + %3 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 1 + store i64 %1, ptr %3, align 8 + %4 = getelementptr inbounds %"variant[]", ptr %y, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %.anon, align 8 + store i64 0, ptr %.anon1, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %6 = load i64, i64* %.anon1, align 8 - %7 = load i64, i64* %.anon, align 8 + %6 = load i64, ptr %.anon1, align 8 + %7 = load i64, ptr %.anon, align 8 %lt = icmp ult i64 %6, %7 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %8 = getelementptr inbounds %"variant[]", %"variant[]"* %y, i32 0, i32 0 - %9 = load %variant*, %variant** %8, align 8 - %10 = load i64, i64* %.anon1, align 8 - %ptroffset = getelementptr inbounds %variant, %variant* %9, i64 %10 - %11 = bitcast %variant* %element to i8* - %12 = bitcast %variant* %ptroffset to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %11, i8* align 8 %12, i32 16, i1 false) - %13 = bitcast %variant* %element to { i64, i8* }* - %14 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %13, i32 0, i32 0 - %lo = load i64, i64* %14, align 8 - %15 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %13, i32 0, i32 1 - %hi = load i8*, i8** %15, align 8 - call void @foo_test(i64 %lo, i8* %hi) - %16 = load i64, i64* %.anon1, align 8 - %add = add i64 %16, 1 - store i64 %add, i64* %.anon1, align 8 + %8 = getelementptr inbounds %"variant[]", ptr %y, i32 0, i32 0 + %9 = load ptr, ptr %8, align 8 + %10 = load i64, ptr %.anon1, align 8 + %ptroffset = getelementptr inbounds %variant, ptr %9, i64 %10 + call void @llvm.memcpy.p0.p0.i32(ptr align 8 %element, ptr align 8 %ptroffset, i32 16, i1 false) + %11 = getelementptr inbounds { i64, ptr }, ptr %element, i32 0, i32 0 + %lo = load i64, ptr %11, align 8 + %12 = getelementptr inbounds { i64, ptr }, ptr %element, i32 0, i32 1 + %hi = load ptr, ptr %12, align 8 + call void @foo_test(i64 %lo, ptr %hi) + %13 = load i64, ptr %.anon1, align 8 + %add = add i64 %13, 1 + store i64 %add, ptr %.anon1, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond @@ -193,148 +188,121 @@ entry: %taddr16 = alloca %variant, align 8 %taddr19 = alloca i8, align 1 %taddr20 = alloca %variant, align 8 - %df = alloca i32*, align 8 + %df = alloca ptr, align 8 %varargslots = alloca [5 x %variant], align 16 %taddr23 = alloca double, align 8 - %taddr24 = alloca %"variant[]", align 8 - store i32 1, i32* %taddr, align 4 - %0 = bitcast i32* %taddr to i8* - %1 = insertvalue %variant undef, i8* %0, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %2, %variant* %x, align 8 - store i32 0, i32* %z, align 4 - %3 = bitcast i32* %z to i8* - %4 = insertvalue %variant undef, i8* %3, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %5, %variant* %y, align 8 - %6 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 - %7 = load i64, i64* %6, align 8 - store i64 %7, i64* %g, align 8 - %8 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 - %9 = load i64, i64* %8, align 8 - store i64 %9, i64* %h, align 8 - %10 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 - %11 = load i64, i64* %10, align 8 - %eq = icmp eq i64 %11, ptrtoint (%.introspect* @"ct$int" to i64) + store i32 1, ptr %taddr, align 4 + %0 = insertvalue %variant undef, ptr %taddr, 0 + %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %1, ptr %x, align 8 + store i32 0, ptr %z, align 4 + %2 = insertvalue %variant undef, ptr %z, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %3, ptr %y, align 8 + %4 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 + %5 = load i64, ptr %4, align 8 + store i64 %5, ptr %g, align 8 + %6 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 + %7 = load i64, ptr %6, align 8 + store i64 %7, ptr %h, align 8 + %8 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 + %9 = load i64, ptr %8, align 8 + %eq = icmp eq i64 %9, ptrtoint (ptr @"ct$int" to i64) br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.5) br label %if.exit if.exit: ; preds = %if.then, %entry - %12 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 - %13 = load i64, i64* %12, align 8 - %eq1 = icmp eq i64 %13, ptrtoint (%.introspect* @"ct$int" to i64) + %10 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 + %11 = load i64, ptr %10, align 8 + %eq1 = icmp eq i64 %11, ptrtoint (ptr @"ct$int" to i64) br i1 %eq1, label %if.then2, label %if.exit3 if.then2: ; preds = %if.exit - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.6) br label %if.exit3 if.exit3: ; preds = %if.then2, %if.exit - store double 1.000000e+00, double* %taddr4, align 8 - %14 = bitcast double* %taddr4 to i8* - %15 = insertvalue %variant undef, i8* %14, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - store %variant %16, %variant* %y, align 8 - %17 = bitcast %variant* %x to i8* - %18 = insertvalue %variant undef, i8* %17, 0 - %19 = insertvalue %variant %18, i64 ptrtoint (%.introspect* @"ct$variant" to i64), 1 - store %variant %19, %variant* %x, align 8 - %20 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 - %21 = load i64, i64* %20, align 8 - %eq5 = icmp eq i64 %21, ptrtoint (%.introspect* @"ct$int" to i64) + store double 1.000000e+00, ptr %taddr4, align 8 + %12 = insertvalue %variant undef, ptr %taddr4, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$double" to i64), 1 + store %variant %13, ptr %y, align 8 + %14 = insertvalue %variant undef, ptr %x, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$variant" to i64), 1 + store %variant %15, ptr %x, align 8 + %16 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 + %17 = load i64, ptr %16, align 8 + %eq5 = icmp eq i64 %17, ptrtoint (ptr @"ct$int" to i64) br i1 %eq5, label %if.then6, label %if.exit7 if.then6: ; preds = %if.exit3 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.7) br label %if.exit7 if.exit7: ; preds = %if.then6, %if.exit3 - %22 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 - %23 = load i64, i64* %22, align 8 - %eq8 = icmp eq i64 %23, ptrtoint (%.introspect* @"ct$int" to i64) + %18 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 + %19 = load i64, ptr %18, align 8 + %eq8 = icmp eq i64 %19, ptrtoint (ptr @"ct$int" to i64) br i1 %eq8, label %if.then9, label %if.exit10 if.then9: ; preds = %if.exit7 - call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0)) + call void (ptr, ...) @printf(ptr @.str.8) br label %if.exit10 if.exit10: ; preds = %if.then9, %if.exit7 - %24 = bitcast %variant* %x to { i64, i8* }* - %25 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %24, i32 0, i32 0 - %lo = load i64, i64* %25, align 8 - %26 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %24, i32 0, i32 1 - %hi = load i8*, i8** %26, align 8 - call void @foo_test(i64 %lo, i8* %hi) - store double 1.000000e+00, double* %taddr11, align 8 - %27 = bitcast double* %taddr11 to i8* - %28 = insertvalue %variant undef, i8* %27, 0 - %29 = insertvalue %variant %28, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - store %variant %29, %variant* %taddr12, align 8 - %30 = bitcast %variant* %taddr12 to { i64, i8* }* - %31 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %30, i32 0, i32 0 - %lo13 = load i64, i64* %31, align 8 - %32 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %30, i32 0, i32 1 - %hi14 = load i8*, i8** %32, align 8 - call void @foo_test(i64 %lo13, i8* %hi14) - store i32 1, i32* %taddr15, align 4 - %33 = bitcast i32* %taddr15 to i8* - %34 = insertvalue %variant undef, i8* %33, 0 - %35 = insertvalue %variant %34, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 - store %variant %35, %variant* %taddr16, align 8 - %36 = bitcast %variant* %taddr16 to { i64, i8* }* - %37 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %36, i32 0, i32 0 - %lo17 = load i64, i64* %37, align 8 - %38 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %36, i32 0, i32 1 - %hi18 = load i8*, i8** %38, align 8 - call void @foo_test(i64 %lo17, i8* %hi18) - store i8 1, i8* %taddr19, align 1 - %39 = insertvalue %variant undef, i8* %taddr19, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 - store %variant %40, %variant* %taddr20, align 8 - %41 = bitcast %variant* %taddr20 to { i64, i8* }* - %42 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %41, i32 0, i32 0 - %lo21 = load i64, i64* %42, align 8 - %43 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %41, i32 0, i32 1 - %hi22 = load i8*, i8** %43, align 8 - call void @foo_test(i64 %lo21, i8* %hi22) - call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.9, i32 0, i32 0)) - store i32* null, i32** %df, align 8 - %44 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 0 - %45 = bitcast %variant* %44 to i8* - %46 = bitcast %variant* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %45, i8* align 8 %46, i32 16, i1 false) - %47 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 1 - %48 = bitcast %variant* %47 to i8* - %49 = bitcast %variant* %x to i8* - call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %48, i8* align 8 %49, i32 16, i1 false) - store double 1.000000e+00, double* %taddr23, align 8 - %50 = bitcast double* %taddr23 to i8* - %51 = insertvalue %variant undef, i8* %50, 0 - %52 = insertvalue %variant %51, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 - %53 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 2 - store %variant %52, %variant* %53, align 16 - %54 = bitcast %variant* %x to i8* - %55 = insertvalue %variant undef, i8* %54, 0 - %56 = insertvalue %variant %55, i64 ptrtoint (%.introspect* @"ct$variant" to i64), 1 - %57 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 3 - store %variant %56, %variant* %57, align 16 - %58 = bitcast i32** %df to i8* - %59 = insertvalue %variant undef, i8* %58, 0 - %60 = insertvalue %variant %59, i64 ptrtoint (%.introspect* @"ct$p$int" to i64), 1 - %61 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 4 - store %variant %60, %variant* %61, align 16 - %62 = bitcast [5 x %variant]* %varargslots to %variant* - %63 = insertvalue %"variant[]" undef, %variant* %62, 0 - %64 = insertvalue %"variant[]" %63, i64 5, 1 - store %"variant[]" %64, %"variant[]"* %taddr24, align 8 - %65 = bitcast %"variant[]"* %taddr24 to { i8*, i64 }* - %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 - %lo25 = load i8*, i8** %66, align 8 - %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 - %hi26 = load i64, i64* %67, align 8 - call void @foo_test_all(i8* %lo25, i64 %hi26) + %20 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 0 + %lo = load i64, ptr %20, align 8 + %21 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 1 + %hi = load ptr, ptr %21, align 8 + call void @foo_test(i64 %lo, ptr %hi) + store double 1.000000e+00, ptr %taddr11, align 8 + %22 = insertvalue %variant undef, ptr %taddr11, 0 + %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$double" to i64), 1 + store %variant %23, ptr %taddr12, align 8 + %24 = getelementptr inbounds { i64, ptr }, ptr %taddr12, i32 0, i32 0 + %lo13 = load i64, ptr %24, align 8 + %25 = getelementptr inbounds { i64, ptr }, ptr %taddr12, i32 0, i32 1 + %hi14 = load ptr, ptr %25, align 8 + call void @foo_test(i64 %lo13, ptr %hi14) + store i32 1, ptr %taddr15, align 4 + %26 = insertvalue %variant undef, ptr %taddr15, 0 + %27 = insertvalue %variant %26, i64 ptrtoint (ptr @"ct$int" to i64), 1 + store %variant %27, ptr %taddr16, align 8 + %28 = getelementptr inbounds { i64, ptr }, ptr %taddr16, i32 0, i32 0 + %lo17 = load i64, ptr %28, align 8 + %29 = getelementptr inbounds { i64, ptr }, ptr %taddr16, i32 0, i32 1 + %hi18 = load ptr, ptr %29, align 8 + call void @foo_test(i64 %lo17, ptr %hi18) + store i8 1, ptr %taddr19, align 1 + %30 = insertvalue %variant undef, ptr %taddr19, 0 + %31 = insertvalue %variant %30, i64 ptrtoint (ptr @"ct$bool" to i64), 1 + store %variant %31, ptr %taddr20, align 8 + %32 = getelementptr inbounds { i64, ptr }, ptr %taddr20, i32 0, i32 0 + %lo21 = load i64, ptr %32, align 8 + %33 = getelementptr inbounds { i64, ptr }, ptr %taddr20, i32 0, i32 1 + %hi22 = load ptr, ptr %33, align 8 + call void @foo_test(i64 %lo21, ptr %hi22) + call void (ptr, ...) @printf(ptr @.str.9) + store ptr null, ptr %df, align 8 + %34 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 0 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %34, ptr align 8 %x, i32 16, i1 false) + %35 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 1 + call void @llvm.memcpy.p0.p0.i32(ptr align 16 %35, ptr align 8 %x, i32 16, i1 false) + store double 1.000000e+00, ptr %taddr23, align 8 + %36 = insertvalue %variant undef, ptr %taddr23, 0 + %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$double" to i64), 1 + %38 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 2 + store %variant %37, ptr %38, align 16 + %39 = insertvalue %variant undef, ptr %x, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (ptr @"ct$variant" to i64), 1 + %41 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 3 + store %variant %40, ptr %41, align 16 + %42 = insertvalue %variant undef, ptr %df, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (ptr @"ct$p$int" to i64), 1 + %44 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 4 + store %variant %43, ptr %44, align 16 + call void @foo_test_all(ptr %varargslots, i64 5) ret void } diff --git a/test/test_suite/vector/vector_bit.c3t b/test/test_suite/vector/vector_bit.c3t index a415568da..6727d6eda 100644 --- a/test/test_suite/vector/vector_bit.c3t +++ b/test/test_suite/vector/vector_bit.c3t @@ -38,25 +38,24 @@ fn void main() /* #expect: vector_bit.ll -; Function Attrs: nounwind define void @vector_bit_testf() #0 { entry: %y = alloca <4 x float>, align 16 %w = alloca <4 x i32>, align 16 - store <4 x float> , <4 x float>* %y, align 16 - %0 = load <4 x float>, <4 x float>* %y, align 16 + store <4 x float> , ptr %y, align 16 + %0 = load <4 x float>, ptr %y, align 16 %not = fcmp une <4 x float> %0, zeroinitializer %1 = sext <4 x i1> %not to <4 x i32> - store <4 x i32> %1, <4 x i32>* %w, align 16 - %2 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %1, ptr %w, align 16 + %2 = load <4 x i32>, ptr %w, align 16 %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, <4 x i32>* %w, align 16 + %4 = load <4 x i32>, ptr %w, align 16 %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, <4 x i32>* %w, align 16 + %6 = load <4 x i32>, ptr %w, align 16 %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, <4 x i32>* %w, align 16 + %8 = load <4 x i32>, ptr %w, align 16 %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9) + %10 = call i32 (ptr, ...) @printf(ptr @.str, i32 %3, i32 %5, i32 %7, i32 %9) ret void } @@ -66,90 +65,90 @@ entry: %y = alloca <4 x i32>, align 16 %z = alloca <4 x i32>, align 16 %w = alloca <4 x i32>, align 16 - store <4 x i32> , <4 x i32>* %y, align 16 - store <4 x i32> , <4 x i32>* %z, align 16 - store <4 x i32> zeroinitializer, <4 x i32>* %w, align 16 - %0 = load <4 x i32>, <4 x i32>* %y, align 16 - %1 = load <4 x i32>, <4 x i32>* %z, align 16 + store <4 x i32> , ptr %y, align 16 + store <4 x i32> , ptr %z, align 16 + store <4 x i32> zeroinitializer, ptr %w, align 16 + %0 = load <4 x i32>, ptr %y, align 16 + %1 = load <4 x i32>, ptr %z, align 16 %and = and <4 x i32> %0, %1 - store <4 x i32> %and, <4 x i32>* %w, align 16 - %2 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %and, ptr %w, align 16 + %2 = load <4 x i32>, ptr %w, align 16 %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, <4 x i32>* %w, align 16 + %4 = load <4 x i32>, ptr %w, align 16 %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, <4 x i32>* %w, align 16 + %6 = load <4 x i32>, ptr %w, align 16 %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, <4 x i32>* %w, align 16 + %8 = load <4 x i32>, ptr %w, align 16 %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9) - %11 = load <4 x i32>, <4 x i32>* %y, align 16 - %12 = load <4 x i32>, <4 x i32>* %z, align 16 + %10 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %3, i32 %5, i32 %7, i32 %9) + %11 = load <4 x i32>, ptr %y, align 16 + %12 = load <4 x i32>, ptr %z, align 16 %or = or <4 x i32> %11, %12 - store <4 x i32> %or, <4 x i32>* %w, align 16 - %13 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %or, ptr %w, align 16 + %13 = load <4 x i32>, ptr %w, align 16 %14 = extractelement <4 x i32> %13, i64 0 - %15 = load <4 x i32>, <4 x i32>* %w, align 16 + %15 = load <4 x i32>, ptr %w, align 16 %16 = extractelement <4 x i32> %15, i64 1 - %17 = load <4 x i32>, <4 x i32>* %w, align 16 + %17 = load <4 x i32>, ptr %w, align 16 %18 = extractelement <4 x i32> %17, i64 2 - %19 = load <4 x i32>, <4 x i32>* %w, align 16 + %19 = load <4 x i32>, ptr %w, align 16 %20 = extractelement <4 x i32> %19, i64 3 - %21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), i32 %14, i32 %16, i32 %18, i32 %20) - %22 = load <4 x i32>, <4 x i32>* %y, align 16 - %23 = load <4 x i32>, <4 x i32>* %z, align 16 + %21 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %14, i32 %16, i32 %18, i32 %20) + %22 = load <4 x i32>, ptr %y, align 16 + %23 = load <4 x i32>, ptr %z, align 16 %xor = xor <4 x i32> %22, %23 - store <4 x i32> %xor, <4 x i32>* %w, align 16 - %24 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %xor, ptr %w, align 16 + %24 = load <4 x i32>, ptr %w, align 16 %25 = extractelement <4 x i32> %24, i64 0 - %26 = load <4 x i32>, <4 x i32>* %w, align 16 + %26 = load <4 x i32>, ptr %w, align 16 %27 = extractelement <4 x i32> %26, i64 1 - %28 = load <4 x i32>, <4 x i32>* %w, align 16 + %28 = load <4 x i32>, ptr %w, align 16 %29 = extractelement <4 x i32> %28, i64 2 - %30 = load <4 x i32>, <4 x i32>* %w, align 16 + %30 = load <4 x i32>, ptr %w, align 16 %31 = extractelement <4 x i32> %30, i64 3 - %32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i32 %25, i32 %27, i32 %29, i32 %31) - %33 = load <4 x i32>, <4 x i32>* %y, align 16 + %32 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 %25, i32 %27, i32 %29, i32 %31) + %33 = load <4 x i32>, ptr %y, align 16 %bnot = xor <4 x i32> %33, - store <4 x i32> %bnot, <4 x i32>* %w, align 16 - %34 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %bnot, ptr %w, align 16 + %34 = load <4 x i32>, ptr %w, align 16 %35 = extractelement <4 x i32> %34, i64 0 - %36 = load <4 x i32>, <4 x i32>* %w, align 16 + %36 = load <4 x i32>, ptr %w, align 16 %37 = extractelement <4 x i32> %36, i64 1 - %38 = load <4 x i32>, <4 x i32>* %w, align 16 + %38 = load <4 x i32>, ptr %w, align 16 %39 = extractelement <4 x i32> %38, i64 2 - %40 = load <4 x i32>, <4 x i32>* %w, align 16 + %40 = load <4 x i32>, ptr %w, align 16 %41 = extractelement <4 x i32> %40, i64 3 - %42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37, i32 %39, i32 %41) - %43 = load <4 x i32>, <4 x i32>* %y, align 16 - %44 = load <4 x i32>, <4 x i32>* %y, align 16 + %42 = call i32 (ptr, ...) @printf(ptr @.str.4, i32 %35, i32 %37, i32 %39, i32 %41) + %43 = load <4 x i32>, ptr %y, align 16 + %44 = load <4 x i32>, ptr %y, align 16 %neg = sub <4 x i32> zeroinitializer, %44 - store <4 x i32> %neg, <4 x i32>* %w, align 16 - %45 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %neg, ptr %w, align 16 + %45 = load <4 x i32>, ptr %w, align 16 %46 = extractelement <4 x i32> %45, i64 0 - %47 = load <4 x i32>, <4 x i32>* %w, align 16 + %47 = load <4 x i32>, ptr %w, align 16 %48 = extractelement <4 x i32> %47, i64 1 - %49 = load <4 x i32>, <4 x i32>* %w, align 16 + %49 = load <4 x i32>, ptr %w, align 16 %50 = extractelement <4 x i32> %49, i64 2 - %51 = load <4 x i32>, <4 x i32>* %w, align 16 + %51 = load <4 x i32>, ptr %w, align 16 %52 = extractelement <4 x i32> %51, i64 3 - %53 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %46, i32 %48, i32 %50, i32 %52) - %54 = load <4 x i32>, <4 x i32>* %y, align 16 + %53 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %46, i32 %48, i32 %50, i32 %52) + %54 = load <4 x i32>, ptr %y, align 16 %not = icmp eq <4 x i32> %54, zeroinitializer %55 = sext <4 x i1> %not to <4 x i32> - store <4 x i32> %55, <4 x i32>* %w, align 16 - store <4 x i32> , <4 x i32>* %w, align 16 - %56 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %55, ptr %w, align 16 + store <4 x i32> , ptr %w, align 16 + %56 = load <4 x i32>, ptr %w, align 16 %not1 = icmp eq <4 x i32> %56, zeroinitializer %57 = sext <4 x i1> %not1 to <4 x i32> - store <4 x i32> %57, <4 x i32>* %w, align 16 - %58 = load <4 x i32>, <4 x i32>* %w, align 16 + store <4 x i32> %57, ptr %w, align 16 + %58 = load <4 x i32>, ptr %w, align 16 %59 = extractelement <4 x i32> %58, i64 0 - %60 = load <4 x i32>, <4 x i32>* %w, align 16 + %60 = load <4 x i32>, ptr %w, align 16 %61 = extractelement <4 x i32> %60, i64 1 - %62 = load <4 x i32>, <4 x i32>* %w, align 16 + %62 = load <4 x i32>, ptr %w, align 16 %63 = extractelement <4 x i32> %62, i64 2 - %64 = load <4 x i32>, <4 x i32>* %w, align 16 + %64 = load <4 x i32>, ptr %w, align 16 %65 = extractelement <4 x i32> %64, i64 3 - %66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %59, i32 %61, i32 %63, i32 %65) + %66 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %59, i32 %61, i32 %63, i32 %65) ret void } diff --git a/test/test_suite/vector/vector_incdec.c3t b/test/test_suite/vector/vector_incdec.c3t index 75c1132b6..0b083468c 100644 --- a/test/test_suite/vector/vector_incdec.c3t +++ b/test/test_suite/vector/vector_incdec.c3t @@ -42,73 +42,73 @@ define void @vector_incdec_testf() #0 { entry: %y = alloca <4 x float>, align 16 %z = alloca <4 x float>, align 16 - store <4 x float> , <4 x float>* %y, align 16 - store <4 x float> , <4 x float>* %z, align 16 - %0 = load <4 x float>, <4 x float>* %y, align 16 - %1 = load <4 x float>, <4 x float>* %z, align 16 + store <4 x float> , ptr %y, align 16 + store <4 x float> , ptr %z, align 16 + %0 = load <4 x float>, ptr %y, align 16 + %1 = load <4 x float>, ptr %z, align 16 %fadd = fadd <4 x float> %0, %1 - store <4 x float> %fadd, <4 x float>* %y, align 16 - %2 = load <4 x float>, <4 x float>* %y, align 16 + store <4 x float> %fadd, ptr %y, align 16 + %2 = load <4 x float>, ptr %y, align 16 %3 = extractelement <4 x float> %2, i64 0 %fpfpext = fpext float %3 to double - %4 = load <4 x float>, <4 x float>* %y, align 16 + %4 = load <4 x float>, ptr %y, align 16 %5 = extractelement <4 x float> %4, i64 1 %fpfpext1 = fpext float %5 to double - %6 = load <4 x float>, <4 x float>* %y, align 16 + %6 = load <4 x float>, ptr %y, align 16 %7 = extractelement <4 x float> %6, i64 2 %fpfpext2 = fpext float %7 to double - %8 = load <4 x float>, <4 x float>* %y, align 16 + %8 = load <4 x float>, ptr %y, align 16 %9 = extractelement <4 x float> %8, i64 3 %fpfpext3 = fpext float %9 to double - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) - %11 = load <4 x float>, <4 x float>* %y, align 16 + %10 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) + %11 = load <4 x float>, ptr %y, align 16 %fincdec = fadd <4 x float> %11, - store <4 x float> %fincdec, <4 x float>* %y, align 16 - %12 = load <4 x float>, <4 x float>* %y, align 16 + store <4 x float> %fincdec, ptr %y, align 16 + %12 = load <4 x float>, ptr %y, align 16 %13 = extractelement <4 x float> %12, i64 0 %fpfpext4 = fpext float %13 to double - %14 = load <4 x float>, <4 x float>* %y, align 16 + %14 = load <4 x float>, ptr %y, align 16 %15 = extractelement <4 x float> %14, i64 1 %fpfpext5 = fpext float %15 to double - %16 = load <4 x float>, <4 x float>* %y, align 16 + %16 = load <4 x float>, ptr %y, align 16 %17 = extractelement <4 x float> %16, i64 2 %fpfpext6 = fpext float %17 to double - %18 = load <4 x float>, <4 x float>* %y, align 16 + %18 = load <4 x float>, ptr %y, align 16 %19 = extractelement <4 x float> %18, i64 3 %fpfpext7 = fpext float %19 to double - %20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7) - %21 = load <4 x float>, <4 x float>* %y, align 16 + %20 = call i32 (ptr, ...) @printf(ptr @.str.1, double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7) + %21 = load <4 x float>, ptr %y, align 16 %fincdec8 = fadd <4 x float> %21, - store <4 x float> %fincdec8, <4 x float>* %y, align 16 - %22 = load <4 x float>, <4 x float>* %y, align 16 + store <4 x float> %fincdec8, ptr %y, align 16 + %22 = load <4 x float>, ptr %y, align 16 %23 = extractelement <4 x float> %22, i64 0 %fpfpext9 = fpext float %23 to double - %24 = load <4 x float>, <4 x float>* %y, align 16 + %24 = load <4 x float>, ptr %y, align 16 %25 = extractelement <4 x float> %24, i64 1 %fpfpext10 = fpext float %25 to double - %26 = load <4 x float>, <4 x float>* %y, align 16 + %26 = load <4 x float>, ptr %y, align 16 %27 = extractelement <4 x float> %26, i64 2 %fpfpext11 = fpext float %27 to double - %28 = load <4 x float>, <4 x float>* %y, align 16 + %28 = load <4 x float>, ptr %y, align 16 %29 = extractelement <4 x float> %28, i64 3 %fpfpext12 = fpext float %29 to double - %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), double %fpfpext9, double %fpfpext10, double %fpfpext11, double %fpfpext12) - %31 = load <4 x float>, <4 x float>* %y, align 16 + %30 = call i32 (ptr, ...) @printf(ptr @.str.2, double %fpfpext9, double %fpfpext10, double %fpfpext11, double %fpfpext12) + %31 = load <4 x float>, ptr %y, align 16 %fincdec13 = fadd <4 x float> %31, - store <4 x float> %fincdec13, <4 x float>* %y, align 16 - %32 = load <4 x float>, <4 x float>* %y, align 16 + store <4 x float> %fincdec13, ptr %y, align 16 + %32 = load <4 x float>, ptr %y, align 16 %33 = extractelement <4 x float> %32, i64 0 %fpfpext14 = fpext float %33 to double - %34 = load <4 x float>, <4 x float>* %y, align 16 + %34 = load <4 x float>, ptr %y, align 16 %35 = extractelement <4 x float> %34, i64 1 %fpfpext15 = fpext float %35 to double - %36 = load <4 x float>, <4 x float>* %y, align 16 + %36 = load <4 x float>, ptr %y, align 16 %37 = extractelement <4 x float> %36, i64 2 %fpfpext16 = fpext float %37 to double - %38 = load <4 x float>, <4 x float>* %y, align 16 + %38 = load <4 x float>, ptr %y, align 16 %39 = extractelement <4 x float> %38, i64 3 %fpfpext17 = fpext float %39 to double - %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), double %fpfpext14, double %fpfpext15, double %fpfpext16, double %fpfpext17) + %40 = call i32 (ptr, ...) @printf(ptr @.str.3, double %fpfpext14, double %fpfpext15, double %fpfpext16, double %fpfpext17) ret void } @@ -118,67 +118,67 @@ entry: %y = alloca <4 x i32>, align 16 %z = alloca <4 x i32>, align 16 %w = alloca <4 x i32>, align 16 - store <4 x i32> , <4 x i32>* %y, align 16 - store <4 x i32> , <4 x i32>* %z, align 16 - %0 = load <4 x i32>, <4 x i32>* %y, align 16 - %1 = load <4 x i32>, <4 x i32>* %z, align 16 + store <4 x i32> , ptr %y, align 16 + store <4 x i32> , ptr %z, align 16 + %0 = load <4 x i32>, ptr %y, align 16 + %1 = load <4 x i32>, ptr %z, align 16 %add = add <4 x i32> %0, %1 - store <4 x i32> %add, <4 x i32>* %y, align 16 - %2 = load <4 x i32>, <4 x i32>* %y, align 16 + store <4 x i32> %add, ptr %y, align 16 + %2 = load <4 x i32>, ptr %y, align 16 %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, <4 x i32>* %y, align 16 + %4 = load <4 x i32>, ptr %y, align 16 %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, <4 x i32>* %y, align 16 + %6 = load <4 x i32>, ptr %y, align 16 %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, <4 x i32>* %y, align 16 + %8 = load <4 x i32>, ptr %y, align 16 %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.4, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9) - %11 = load <4 x i32>, <4 x i32>* %y, align 16 + %10 = call i32 (ptr, ...) @printf(ptr @.str.4, i32 %3, i32 %5, i32 %7, i32 %9) + %11 = load <4 x i32>, ptr %y, align 16 %add1 = add <4 x i32> %11, - store <4 x i32> %add1, <4 x i32>* %y, align 16 - %12 = load <4 x i32>, <4 x i32>* %y, align 16 + store <4 x i32> %add1, ptr %y, align 16 + %12 = load <4 x i32>, ptr %y, align 16 %13 = extractelement <4 x i32> %12, i64 0 - %14 = load <4 x i32>, <4 x i32>* %y, align 16 + %14 = load <4 x i32>, ptr %y, align 16 %15 = extractelement <4 x i32> %14, i64 1 - %16 = load <4 x i32>, <4 x i32>* %y, align 16 + %16 = load <4 x i32>, ptr %y, align 16 %17 = extractelement <4 x i32> %16, i64 2 - %18 = load <4 x i32>, <4 x i32>* %y, align 16 + %18 = load <4 x i32>, ptr %y, align 16 %19 = extractelement <4 x i32> %18, i64 3 - %20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %13, i32 %15, i32 %17, i32 %19) - %21 = load <4 x i32>, <4 x i32>* %y, align 16 + %20 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %13, i32 %15, i32 %17, i32 %19) + %21 = load <4 x i32>, ptr %y, align 16 %add2 = add <4 x i32> %21, - store <4 x i32> %add2, <4 x i32>* %y, align 16 - %22 = load <4 x i32>, <4 x i32>* %y, align 16 + store <4 x i32> %add2, ptr %y, align 16 + %22 = load <4 x i32>, ptr %y, align 16 %23 = extractelement <4 x i32> %22, i64 0 - %24 = load <4 x i32>, <4 x i32>* %y, align 16 + %24 = load <4 x i32>, ptr %y, align 16 %25 = extractelement <4 x i32> %24, i64 1 - %26 = load <4 x i32>, <4 x i32>* %y, align 16 + %26 = load <4 x i32>, ptr %y, align 16 %27 = extractelement <4 x i32> %26, i64 2 - %28 = load <4 x i32>, <4 x i32>* %y, align 16 + %28 = load <4 x i32>, ptr %y, align 16 %29 = extractelement <4 x i32> %28, i64 3 - %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %23, i32 %25, i32 %27, i32 %29) - %31 = load <4 x i32>, <4 x i32>* %y, align 16 + %30 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %23, i32 %25, i32 %27, i32 %29) + %31 = load <4 x i32>, ptr %y, align 16 %sub = sub <4 x i32> %31, - store <4 x i32> %sub, <4 x i32>* %y, align 16 - store <4 x i32> %31, <4 x i32>* %w, align 16 - %32 = load <4 x i32>, <4 x i32>* %y, align 16 + store <4 x i32> %sub, ptr %y, align 16 + store <4 x i32> %31, ptr %w, align 16 + %32 = load <4 x i32>, ptr %y, align 16 %33 = extractelement <4 x i32> %32, i64 0 - %34 = load <4 x i32>, <4 x i32>* %y, align 16 + %34 = load <4 x i32>, ptr %y, align 16 %35 = extractelement <4 x i32> %34, i64 1 - %36 = load <4 x i32>, <4 x i32>* %y, align 16 + %36 = load <4 x i32>, ptr %y, align 16 %37 = extractelement <4 x i32> %36, i64 2 - %38 = load <4 x i32>, <4 x i32>* %y, align 16 + %38 = load <4 x i32>, ptr %y, align 16 %39 = extractelement <4 x i32> %38, i64 3 - %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.7, i32 0, i32 0), i32 %33, i32 %35, i32 %37, i32 %39) - %41 = load <4 x i32>, <4 x i32>* %w, align 16 + %40 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %33, i32 %35, i32 %37, i32 %39) + %41 = load <4 x i32>, ptr %w, align 16 %42 = extractelement <4 x i32> %41, i64 0 - %43 = load <4 x i32>, <4 x i32>* %w, align 16 + %43 = load <4 x i32>, ptr %w, align 16 %44 = extractelement <4 x i32> %43, i64 1 - %45 = load <4 x i32>, <4 x i32>* %w, align 16 + %45 = load <4 x i32>, ptr %w, align 16 %46 = extractelement <4 x i32> %45, i64 2 - %47 = load <4 x i32>, <4 x i32>* %w, align 16 + %47 = load <4 x i32>, ptr %w, align 16 %48 = extractelement <4 x i32> %47, i64 3 - %49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.8, i32 0, i32 0), i32 %42, i32 %44, i32 %46, i32 %48) + %49 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %42, i32 %44, i32 %46, i32 %48) ret void } diff --git a/test/test_suite/vector/vector_init.c3t b/test/test_suite/vector/vector_init.c3t index e1ed717de..04ab6c6e8 100644 --- a/test/test_suite/vector/vector_init.c3t +++ b/test/test_suite/vector/vector_init.c3t @@ -25,29 +25,29 @@ entry: %bar2 = alloca <4 x i32>, align 16 %bar3 = alloca <4 x i32>, align 16 %bar4 = alloca <4 x i32>, align 16 - store <4 x i32> , <4 x i32>* %foo, align 16 - %0 = load <4 x i32>, <4 x i32>* %foo, align 16 + store <4 x i32> , ptr %foo, align 16 + %0 = load <4 x i32>, ptr %foo, align 16 %1 = extractelement <4 x i32> %0, i64 0 - store i32 %1, i32* %z, align 4 - %2 = load <4 x i32>, <4 x i32>* %foo, align 16 - %3 = load i32, i32* %z, align 4 + store i32 %1, ptr %z, align 4 + %2 = load <4 x i32>, ptr %foo, align 16 + %3 = load i32, ptr %z, align 4 %add = add i32 %3, 1 %elemset = insertelement <4 x i32> %2, i32 %add, i64 2 - store <4 x i32> %elemset, <4 x i32>* %foo, align 16 - store <4 x i32> zeroinitializer, <4 x i32>* %bar, align 16 - %4 = load i32, i32* %z, align 4 + store <4 x i32> %elemset, ptr %foo, align 16 + store <4 x i32> zeroinitializer, ptr %bar, align 16 + %4 = load i32, ptr %z, align 4 %5 = insertelement <4 x i32> , i32 %4, i64 1 %6 = insertelement <4 x i32> %5, i32 3, i64 2 %7 = insertelement <4 x i32> %6, i32 4, i64 3 - store <4 x i32> %7, <4 x i32>* %bar2, align 16 - %8 = load i32, i32* %z, align 4 + store <4 x i32> %7, ptr %bar2, align 16 + %8 = load i32, ptr %z, align 4 %9 = insertelement <4 x i32> zeroinitializer, i32 %8, i64 1 - store <4 x i32> %9, <4 x i32>* %bar3, align 16 - %10 = load i32, i32* %z, align 4 + store <4 x i32> %9, ptr %bar3, align 16 + %10 = load i32, ptr %z, align 4 %11 = insertelement <4 x i32> zeroinitializer, i32 %10, i64 0 %12 = insertelement <4 x i32> %11, i32 %10, i64 1 %13 = insertelement <4 x i32> %12, i32 %10, i64 2 %14 = insertelement <4 x i32> %13, i32 %10, i64 3 - store <4 x i32> %14, <4 x i32>* %bar4, align 16 + store <4 x i32> %14, ptr %bar4, align 16 ret void } \ No newline at end of file diff --git a/test/test_suite/vector/vector_init_regression.c3t b/test/test_suite/vector/vector_init_regression.c3t index 55b243b35..fa2b0dff5 100644 --- a/test/test_suite/vector/vector_init_regression.c3t +++ b/test/test_suite/vector/vector_init_regression.c3t @@ -96,319 +96,318 @@ entry: %v = alloca <4 x float>, align 16 %.anon85 = alloca i64, align 8 %v89 = alloca <4 x float>, align 16 - store float 0x3FE921CAC0000000, float* %radians, align 4 - store <3 x float> , <3 x float>* %axis, align 16 - %0 = load float, float* %radians, align 4 + store float 0x3FE921CAC0000000, ptr %radians, align 4 + store <3 x float> , ptr %axis, align 16 + %0 = load float, ptr %radians, align 4 %1 = call float @llvm.cos.f32(float %0) - store float %1, float* %cosr, align 4 - %2 = load float, float* %radians, align 4 + store float %1, ptr %cosr, align 4 + %2 = load float, ptr %radians, align 4 %3 = call float @llvm.sin.f32(float %2) - store float %3, float* %sinr, align 4 - %4 = load <3 x float>, <3 x float>* %axis, align 16 + store float %3, ptr %sinr, align 4 + %4 = load <3 x float>, ptr %axis, align 16 %5 = extractelement <3 x float> %4, i64 0 - store float %5, float* %x, align 4 - %6 = load <3 x float>, <3 x float>* %axis, align 16 + store float %5, ptr %x, align 4 + %6 = load <3 x float>, ptr %axis, align 16 %7 = extractelement <3 x float> %6, i64 1 - store float %7, float* %y, align 4 - %8 = load <3 x float>, <3 x float>* %axis, align 16 + store float %7, ptr %y, align 4 + %8 = load <3 x float>, ptr %axis, align 16 %9 = extractelement <3 x float> %8, i64 2 - store float %9, float* %z, align 4 - %10 = bitcast [4 x <4 x float>]* %a to i8* - call void @llvm.memset.p0i8.i64(i8* align 16 %10, i8 0, i64 64, i1 false) - %11 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 0 - %12 = load float, float* %cosr, align 4 - %13 = load float, float* %x, align 4 - %14 = load float, float* %x, align 4 - %fmul = fmul float %13, %14 - %15 = load float, float* %cosr, align 4 - %fpfpext = fpext float %15 to double + store float %9, ptr %z, align 4 + call void @llvm.memset.p0.i64(ptr align 16 %a, i8 0, i64 64, i1 false) + %10 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 0 + %11 = load float, ptr %cosr, align 4 + %12 = load float, ptr %x, align 4 + %13 = load float, ptr %x, align 4 + %fmul = fmul float %12, %13 + %14 = load float, ptr %cosr, align 4 + %fpfpext = fpext float %14 to double %fsub = fsub double 1.000000e+00, %fpfpext %fpfptrunc = fptrunc double %fsub to float - %16 = call float @llvm.fmuladd.f32(float %fmul, float %fpfptrunc, float %12) - %17 = insertelement <4 x float> undef, float %16, i64 0 - %18 = load float, float* %x, align 4 - %19 = load float, float* %y, align 4 - %fmul1 = fmul float %18, %19 - %20 = load float, float* %cosr, align 4 - %fpfpext2 = fpext float %20 to double + %15 = call float @llvm.fmuladd.f32(float %fmul, float %fpfptrunc, float %11) + %16 = insertelement <4 x float> undef, float %15, i64 0 + %17 = load float, ptr %x, align 4 + %18 = load float, ptr %y, align 4 + %fmul1 = fmul float %17, %18 + %19 = load float, ptr %cosr, align 4 + %fpfpext2 = fpext float %19 to double %fsub3 = fsub double 1.000000e+00, %fpfpext2 %fpfptrunc4 = fptrunc double %fsub3 to float - %21 = load float, float* %z, align 4 - %22 = load float, float* %sinr, align 4 - %fmul5 = fmul float %21, %22 - %23 = fneg float %fmul5 - %24 = call float @llvm.fmuladd.f32(float %fmul1, float %fpfptrunc4, float %23) - %25 = insertelement <4 x float> %17, float %24, i64 1 - %26 = load float, float* %x, align 4 - %27 = load float, float* %z, align 4 - %fmul6 = fmul float %26, %27 - %28 = load float, float* %cosr, align 4 - %fpfpext7 = fpext float %28 to double + %20 = load float, ptr %z, align 4 + %21 = load float, ptr %sinr, align 4 + %fmul5 = fmul float %20, %21 + %22 = fneg float %fmul5 + %23 = call float @llvm.fmuladd.f32(float %fmul1, float %fpfptrunc4, float %22) + %24 = insertelement <4 x float> %16, float %23, i64 1 + %25 = load float, ptr %x, align 4 + %26 = load float, ptr %z, align 4 + %fmul6 = fmul float %25, %26 + %27 = load float, ptr %cosr, align 4 + %fpfpext7 = fpext float %27 to double %fsub8 = fsub double 1.000000e+00, %fpfpext7 %fpfptrunc9 = fptrunc double %fsub8 to float - %29 = load float, float* %y, align 4 - %30 = load float, float* %sinr, align 4 - %fmul10 = fmul float %29, %30 - %31 = call float @llvm.fmuladd.f32(float %fmul6, float %fpfptrunc9, float %fmul10) - %32 = insertelement <4 x float> %25, float %31, i64 2 - %33 = insertelement <4 x float> %32, float 0.000000e+00, i64 3 - store <4 x float> %33, <4 x float>* %11, align 16 - %34 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 1 - %35 = load float, float* %y, align 4 - %36 = load float, float* %x, align 4 - %fmul11 = fmul float %35, %36 - %37 = load float, float* %cosr, align 4 - %fpfpext12 = fpext float %37 to double + %28 = load float, ptr %y, align 4 + %29 = load float, ptr %sinr, align 4 + %fmul10 = fmul float %28, %29 + %30 = call float @llvm.fmuladd.f32(float %fmul6, float %fpfptrunc9, float %fmul10) + %31 = insertelement <4 x float> %24, float %30, i64 2 + %32 = insertelement <4 x float> %31, float 0.000000e+00, i64 3 + store <4 x float> %32, ptr %10, align 16 + %33 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 1 + %34 = load float, ptr %y, align 4 + %35 = load float, ptr %x, align 4 + %fmul11 = fmul float %34, %35 + %36 = load float, ptr %cosr, align 4 + %fpfpext12 = fpext float %36 to double %fsub13 = fsub double 1.000000e+00, %fpfpext12 %fpfptrunc14 = fptrunc double %fsub13 to float - %38 = load float, float* %z, align 4 - %39 = load float, float* %sinr, align 4 - %fmul15 = fmul float %38, %39 - %40 = call float @llvm.fmuladd.f32(float %fmul11, float %fpfptrunc14, float %fmul15) - %41 = insertelement <4 x float> undef, float %40, i64 0 - %42 = load float, float* %cosr, align 4 - %43 = load float, float* %y, align 4 - %44 = load float, float* %y, align 4 - %fmul16 = fmul float %43, %44 - %45 = load float, float* %cosr, align 4 - %fpfpext17 = fpext float %45 to double + %37 = load float, ptr %z, align 4 + %38 = load float, ptr %sinr, align 4 + %fmul15 = fmul float %37, %38 + %39 = call float @llvm.fmuladd.f32(float %fmul11, float %fpfptrunc14, float %fmul15) + %40 = insertelement <4 x float> undef, float %39, i64 0 + %41 = load float, ptr %cosr, align 4 + %42 = load float, ptr %y, align 4 + %43 = load float, ptr %y, align 4 + %fmul16 = fmul float %42, %43 + %44 = load float, ptr %cosr, align 4 + %fpfpext17 = fpext float %44 to double %fsub18 = fsub double 1.000000e+00, %fpfpext17 %fpfptrunc19 = fptrunc double %fsub18 to float - %46 = call float @llvm.fmuladd.f32(float %fmul16, float %fpfptrunc19, float %42) - %47 = insertelement <4 x float> %41, float %46, i64 1 - %48 = load float, float* %y, align 4 - %49 = load float, float* %z, align 4 - %fmul20 = fmul float %48, %49 - %50 = load float, float* %cosr, align 4 - %fpfpext21 = fpext float %50 to double + %45 = call float @llvm.fmuladd.f32(float %fmul16, float %fpfptrunc19, float %41) + %46 = insertelement <4 x float> %40, float %45, i64 1 + %47 = load float, ptr %y, align 4 + %48 = load float, ptr %z, align 4 + %fmul20 = fmul float %47, %48 + %49 = load float, ptr %cosr, align 4 + %fpfpext21 = fpext float %49 to double %fsub22 = fsub double 1.000000e+00, %fpfpext21 %fpfptrunc23 = fptrunc double %fsub22 to float - %51 = load float, float* %x, align 4 - %52 = load float, float* %sinr, align 4 - %fmul24 = fmul float %51, %52 - %53 = fneg float %fmul24 - %54 = call float @llvm.fmuladd.f32(float %fmul20, float %fpfptrunc23, float %53) - %55 = insertelement <4 x float> %47, float %54, i64 2 - %56 = insertelement <4 x float> %55, float 0.000000e+00, i64 3 - store <4 x float> %56, <4 x float>* %34, align 16 - %57 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 2 - %58 = load float, float* %z, align 4 - %59 = load float, float* %x, align 4 - %fmul25 = fmul float %58, %59 - %60 = load float, float* %cosr, align 4 - %fpfpext26 = fpext float %60 to double + %50 = load float, ptr %x, align 4 + %51 = load float, ptr %sinr, align 4 + %fmul24 = fmul float %50, %51 + %52 = fneg float %fmul24 + %53 = call float @llvm.fmuladd.f32(float %fmul20, float %fpfptrunc23, float %52) + %54 = insertelement <4 x float> %46, float %53, i64 2 + %55 = insertelement <4 x float> %54, float 0.000000e+00, i64 3 + store <4 x float> %55, ptr %33, align 16 + %56 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 2 + %57 = load float, ptr %z, align 4 + %58 = load float, ptr %x, align 4 + %fmul25 = fmul float %57, %58 + %59 = load float, ptr %cosr, align 4 + %fpfpext26 = fpext float %59 to double %fsub27 = fsub double 1.000000e+00, %fpfpext26 %fpfptrunc28 = fptrunc double %fsub27 to float - %61 = load float, float* %y, align 4 - %62 = load float, float* %sinr, align 4 - %fmul29 = fmul float %61, %62 - %63 = fneg float %fmul29 - %64 = call float @llvm.fmuladd.f32(float %fmul25, float %fpfptrunc28, float %63) - %65 = insertelement <4 x float> undef, float %64, i64 0 - %66 = load float, float* %z, align 4 - %67 = load float, float* %y, align 4 - %fmul30 = fmul float %66, %67 - %68 = load float, float* %cosr, align 4 - %fpfpext31 = fpext float %68 to double + %60 = load float, ptr %y, align 4 + %61 = load float, ptr %sinr, align 4 + %fmul29 = fmul float %60, %61 + %62 = fneg float %fmul29 + %63 = call float @llvm.fmuladd.f32(float %fmul25, float %fpfptrunc28, float %62) + %64 = insertelement <4 x float> undef, float %63, i64 0 + %65 = load float, ptr %z, align 4 + %66 = load float, ptr %y, align 4 + %fmul30 = fmul float %65, %66 + %67 = load float, ptr %cosr, align 4 + %fpfpext31 = fpext float %67 to double %fsub32 = fsub double 1.000000e+00, %fpfpext31 %fpfptrunc33 = fptrunc double %fsub32 to float - %69 = load float, float* %x, align 4 - %70 = load float, float* %sinr, align 4 - %fmul34 = fmul float %69, %70 - %71 = call float @llvm.fmuladd.f32(float %fmul30, float %fpfptrunc33, float %fmul34) - %72 = insertelement <4 x float> %65, float %71, i64 1 - %73 = load float, float* %cosr, align 4 - %74 = load float, float* %z, align 4 - %75 = load float, float* %z, align 4 - %fmul35 = fmul float %74, %75 - %76 = load float, float* %cosr, align 4 - %fpfpext36 = fpext float %76 to double + %68 = load float, ptr %x, align 4 + %69 = load float, ptr %sinr, align 4 + %fmul34 = fmul float %68, %69 + %70 = call float @llvm.fmuladd.f32(float %fmul30, float %fpfptrunc33, float %fmul34) + %71 = insertelement <4 x float> %64, float %70, i64 1 + %72 = load float, ptr %cosr, align 4 + %73 = load float, ptr %z, align 4 + %74 = load float, ptr %z, align 4 + %fmul35 = fmul float %73, %74 + %75 = load float, ptr %cosr, align 4 + %fpfpext36 = fpext float %75 to double %fsub37 = fsub double 1.000000e+00, %fpfpext36 %fpfptrunc38 = fptrunc double %fsub37 to float - %77 = call float @llvm.fmuladd.f32(float %fmul35, float %fpfptrunc38, float %73) - %78 = insertelement <4 x float> %72, float %77, i64 2 - %79 = insertelement <4 x float> %78, float 0.000000e+00, i64 3 - store <4 x float> %79, <4 x float>* %57, align 16 - %80 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 3 - store <4 x float> , <4 x float>* %80, align 16 - %81 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 0 - %82 = load float, float* %cosr, align 4 - %83 = load float, float* %x, align 4 - %84 = load float, float* %x, align 4 - %fmul39 = fmul float %83, %84 - %85 = load float, float* %cosr, align 4 - %fpfpext40 = fpext float %85 to double + %76 = call float @llvm.fmuladd.f32(float %fmul35, float %fpfptrunc38, float %72) + %77 = insertelement <4 x float> %71, float %76, i64 2 + %78 = insertelement <4 x float> %77, float 0.000000e+00, i64 3 + store <4 x float> %78, ptr %56, align 16 + %79 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 3 + store <4 x float> , ptr %79, align 16 + %80 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 0 + %81 = load float, ptr %cosr, align 4 + %82 = load float, ptr %x, align 4 + %83 = load float, ptr %x, align 4 + %fmul39 = fmul float %82, %83 + %84 = load float, ptr %cosr, align 4 + %fpfpext40 = fpext float %84 to double %fsub41 = fsub double 1.000000e+00, %fpfpext40 %fpfptrunc42 = fptrunc double %fsub41 to float - %86 = call float @llvm.fmuladd.f32(float %fmul39, float %fpfptrunc42, float %82) - %87 = insertelement <4 x float> undef, float %86, i64 0 - %88 = load float, float* %x, align 4 - %89 = load float, float* %y, align 4 - %fmul43 = fmul float %88, %89 - %90 = load float, float* %cosr, align 4 - %fpfpext44 = fpext float %90 to double + %85 = call float @llvm.fmuladd.f32(float %fmul39, float %fpfptrunc42, float %81) + %86 = insertelement <4 x float> undef, float %85, i64 0 + %87 = load float, ptr %x, align 4 + %88 = load float, ptr %y, align 4 + %fmul43 = fmul float %87, %88 + %89 = load float, ptr %cosr, align 4 + %fpfpext44 = fpext float %89 to double %fsub45 = fsub double 1.000000e+00, %fpfpext44 %fpfptrunc46 = fptrunc double %fsub45 to float - %91 = load float, float* %z, align 4 - %92 = load float, float* %sinr, align 4 - %fmul47 = fmul float %91, %92 - %93 = fneg float %fmul47 - %94 = call float @llvm.fmuladd.f32(float %fmul43, float %fpfptrunc46, float %93) - %95 = insertelement <4 x float> %87, float %94, i64 1 - %96 = load float, float* %x, align 4 - %97 = load float, float* %z, align 4 - %fmul48 = fmul float %96, %97 - %98 = load float, float* %cosr, align 4 - %fpfpext49 = fpext float %98 to double + %90 = load float, ptr %z, align 4 + %91 = load float, ptr %sinr, align 4 + %fmul47 = fmul float %90, %91 + %92 = fneg float %fmul47 + %93 = call float @llvm.fmuladd.f32(float %fmul43, float %fpfptrunc46, float %92) + %94 = insertelement <4 x float> %86, float %93, i64 1 + %95 = load float, ptr %x, align 4 + %96 = load float, ptr %z, align 4 + %fmul48 = fmul float %95, %96 + %97 = load float, ptr %cosr, align 4 + %fpfpext49 = fpext float %97 to double %fsub50 = fsub double 1.000000e+00, %fpfpext49 %fpfptrunc51 = fptrunc double %fsub50 to float - %99 = load float, float* %y, align 4 - %100 = load float, float* %sinr, align 4 - %fmul52 = fmul float %99, %100 - %101 = call float @llvm.fmuladd.f32(float %fmul48, float %fpfptrunc51, float %fmul52) - %102 = insertelement <4 x float> %95, float %101, i64 2 - %103 = insertelement <4 x float> %102, float 0.000000e+00, i64 3 - store <4 x float> %103, <4 x float>* %81, align 16 - %104 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 1 - %105 = load float, float* %y, align 4 - %106 = load float, float* %x, align 4 - %fmul53 = fmul float %105, %106 - %107 = load float, float* %cosr, align 4 - %fpfpext54 = fpext float %107 to double + %98 = load float, ptr %y, align 4 + %99 = load float, ptr %sinr, align 4 + %fmul52 = fmul float %98, %99 + %100 = call float @llvm.fmuladd.f32(float %fmul48, float %fpfptrunc51, float %fmul52) + %101 = insertelement <4 x float> %94, float %100, i64 2 + %102 = insertelement <4 x float> %101, float 0.000000e+00, i64 3 + store <4 x float> %102, ptr %80, align 16 + %103 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 1 + %104 = load float, ptr %y, align 4 + %105 = load float, ptr %x, align 4 + %fmul53 = fmul float %104, %105 + %106 = load float, ptr %cosr, align 4 + %fpfpext54 = fpext float %106 to double %fsub55 = fsub double 1.000000e+00, %fpfpext54 %fpfptrunc56 = fptrunc double %fsub55 to float - %108 = load float, float* %z, align 4 - %109 = load float, float* %sinr, align 4 - %fmul57 = fmul float %108, %109 - %110 = call float @llvm.fmuladd.f32(float %fmul53, float %fpfptrunc56, float %fmul57) - %111 = insertelement <4 x float> undef, float %110, i64 0 - %112 = load float, float* %cosr, align 4 - %113 = load float, float* %y, align 4 - %114 = load float, float* %y, align 4 - %fmul58 = fmul float %113, %114 - %115 = load float, float* %cosr, align 4 - %fpfpext59 = fpext float %115 to double + %107 = load float, ptr %z, align 4 + %108 = load float, ptr %sinr, align 4 + %fmul57 = fmul float %107, %108 + %109 = call float @llvm.fmuladd.f32(float %fmul53, float %fpfptrunc56, float %fmul57) + %110 = insertelement <4 x float> undef, float %109, i64 0 + %111 = load float, ptr %cosr, align 4 + %112 = load float, ptr %y, align 4 + %113 = load float, ptr %y, align 4 + %fmul58 = fmul float %112, %113 + %114 = load float, ptr %cosr, align 4 + %fpfpext59 = fpext float %114 to double %fsub60 = fsub double 1.000000e+00, %fpfpext59 %fpfptrunc61 = fptrunc double %fsub60 to float - %116 = call float @llvm.fmuladd.f32(float %fmul58, float %fpfptrunc61, float %112) - %117 = insertelement <4 x float> %111, float %116, i64 1 - %118 = load float, float* %y, align 4 - %119 = load float, float* %z, align 4 - %fmul62 = fmul float %118, %119 - %120 = load float, float* %cosr, align 4 - %fpfpext63 = fpext float %120 to double + %115 = call float @llvm.fmuladd.f32(float %fmul58, float %fpfptrunc61, float %111) + %116 = insertelement <4 x float> %110, float %115, i64 1 + %117 = load float, ptr %y, align 4 + %118 = load float, ptr %z, align 4 + %fmul62 = fmul float %117, %118 + %119 = load float, ptr %cosr, align 4 + %fpfpext63 = fpext float %119 to double %fsub64 = fsub double 1.000000e+00, %fpfpext63 %fpfptrunc65 = fptrunc double %fsub64 to float - %121 = load float, float* %x, align 4 - %122 = load float, float* %sinr, align 4 - %fmul66 = fmul float %121, %122 - %123 = fneg float %fmul66 - %124 = call float @llvm.fmuladd.f32(float %fmul62, float %fpfptrunc65, float %123) - %125 = insertelement <4 x float> %117, float %124, i64 2 - %126 = insertelement <4 x float> %125, float 0.000000e+00, i64 3 - store <4 x float> %126, <4 x float>* %104, align 16 - %127 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 2 - %128 = load float, float* %z, align 4 - %129 = load float, float* %x, align 4 - %fmul67 = fmul float %128, %129 - %130 = load float, float* %cosr, align 4 - %fpfpext68 = fpext float %130 to double + %120 = load float, ptr %x, align 4 + %121 = load float, ptr %sinr, align 4 + %fmul66 = fmul float %120, %121 + %122 = fneg float %fmul66 + %123 = call float @llvm.fmuladd.f32(float %fmul62, float %fpfptrunc65, float %122) + %124 = insertelement <4 x float> %116, float %123, i64 2 + %125 = insertelement <4 x float> %124, float 0.000000e+00, i64 3 + store <4 x float> %125, ptr %103, align 16 + %126 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 2 + %127 = load float, ptr %z, align 4 + %128 = load float, ptr %x, align 4 + %fmul67 = fmul float %127, %128 + %129 = load float, ptr %cosr, align 4 + %fpfpext68 = fpext float %129 to double %fsub69 = fsub double 1.000000e+00, %fpfpext68 %fpfptrunc70 = fptrunc double %fsub69 to float - %131 = load float, float* %y, align 4 - %132 = load float, float* %sinr, align 4 - %fmul71 = fmul float %131, %132 - %133 = fneg float %fmul71 - %134 = call float @llvm.fmuladd.f32(float %fmul67, float %fpfptrunc70, float %133) - %135 = insertelement <4 x float> undef, float %134, i64 0 - %136 = load float, float* %z, align 4 - %137 = load float, float* %y, align 4 - %fmul72 = fmul float %136, %137 - %138 = load float, float* %cosr, align 4 - %fpfpext73 = fpext float %138 to double + %130 = load float, ptr %y, align 4 + %131 = load float, ptr %sinr, align 4 + %fmul71 = fmul float %130, %131 + %132 = fneg float %fmul71 + %133 = call float @llvm.fmuladd.f32(float %fmul67, float %fpfptrunc70, float %132) + %134 = insertelement <4 x float> undef, float %133, i64 0 + %135 = load float, ptr %z, align 4 + %136 = load float, ptr %y, align 4 + %fmul72 = fmul float %135, %136 + %137 = load float, ptr %cosr, align 4 + %fpfpext73 = fpext float %137 to double %fsub74 = fsub double 1.000000e+00, %fpfpext73 %fpfptrunc75 = fptrunc double %fsub74 to float - %139 = load float, float* %x, align 4 - %140 = load float, float* %sinr, align 4 - %fmul76 = fmul float %139, %140 - %141 = call float @llvm.fmuladd.f32(float %fmul72, float %fpfptrunc75, float %fmul76) - %142 = insertelement <4 x float> %135, float %141, i64 1 - %143 = load float, float* %cosr, align 4 - %144 = load float, float* %z, align 4 - %145 = load float, float* %z, align 4 - %fmul77 = fmul float %144, %145 - %146 = load float, float* %cosr, align 4 - %fpfpext78 = fpext float %146 to double + %138 = load float, ptr %x, align 4 + %139 = load float, ptr %sinr, align 4 + %fmul76 = fmul float %138, %139 + %140 = call float @llvm.fmuladd.f32(float %fmul72, float %fpfptrunc75, float %fmul76) + %141 = insertelement <4 x float> %134, float %140, i64 1 + %142 = load float, ptr %cosr, align 4 + %143 = load float, ptr %z, align 4 + %144 = load float, ptr %z, align 4 + %fmul77 = fmul float %143, %144 + %145 = load float, ptr %cosr, align 4 + %fpfpext78 = fpext float %145 to double %fsub79 = fsub double 1.000000e+00, %fpfpext78 %fpfptrunc80 = fptrunc double %fsub79 to float - %147 = call float @llvm.fmuladd.f32(float %fmul77, float %fpfptrunc80, float %143) - %148 = insertelement <4 x float> %142, float %147, i64 2 - %149 = insertelement <4 x float> %148, float 0.000000e+00, i64 3 - store <4 x float> %149, <4 x float>* %127, align 16 - %150 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 3 - store <4 x float> , <4 x float>* %150, align 16 - store i64 0, i64* %.anon, align 8 + %146 = call float @llvm.fmuladd.f32(float %fmul77, float %fpfptrunc80, float %142) + %147 = insertelement <4 x float> %141, float %146, i64 2 + %148 = insertelement <4 x float> %147, float 0.000000e+00, i64 3 + store <4 x float> %148, ptr %126, align 16 + %149 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 3 + store <4 x float> , ptr %149, align 16 + store i64 0, ptr %.anon, align 8 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %151 = load i64, i64* %.anon, align 8 - %gt = icmp ugt i64 4, %151 + %150 = load i64, ptr %.anon, align 8 + %gt = icmp ugt i64 4, %150 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %152 = load i64, i64* %.anon, align 8 - %153 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 %152 - %154 = load <4 x float>, <4 x float>* %153, align 16 - store <4 x float> %154, <4 x float>* %v, align 16 - %155 = load <4 x float>, <4 x float>* %v, align 16 - %156 = extractelement <4 x float> %155, i64 0 - %fpfpext81 = fpext float %156 to double - %157 = load <4 x float>, <4 x float>* %v, align 16 - %158 = extractelement <4 x float> %157, i64 1 - %fpfpext82 = fpext float %158 to double - %159 = load <4 x float>, <4 x float>* %v, align 16 - %160 = extractelement <4 x float> %159, i64 2 - %fpfpext83 = fpext float %160 to double - %161 = load <4 x float>, <4 x float>* %v, align 16 - %162 = extractelement <4 x float> %161, i64 3 - %fpfpext84 = fpext float %162 to double - %163 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i32 0, i32 0), double %fpfpext81, double %fpfpext82, double %fpfpext83, double %fpfpext84) - %164 = load i64, i64* %.anon, align 8 - %add = add i64 %164, 1 - store i64 %add, i64* %.anon, align 8 + %151 = load i64, ptr %.anon, align 8 + %152 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 %151 + %153 = load <4 x float>, ptr %152, align 16 + store <4 x float> %153, ptr %v, align 16 + %154 = load <4 x float>, ptr %v, align 16 + %155 = extractelement <4 x float> %154, i64 0 + %fpfpext81 = fpext float %155 to double + %156 = load <4 x float>, ptr %v, align 16 + %157 = extractelement <4 x float> %156, i64 1 + %fpfpext82 = fpext float %157 to double + %158 = load <4 x float>, ptr %v, align 16 + %159 = extractelement <4 x float> %158, i64 2 + %fpfpext83 = fpext float %159 to double + %160 = load <4 x float>, ptr %v, align 16 + %161 = extractelement <4 x float> %160, i64 3 + %fpfpext84 = fpext float %161 to double + %162 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext81, double %fpfpext82, double %fpfpext83, double %fpfpext84) + %163 = load i64, ptr %.anon, align 8 + %add = add i64 %163, 1 + store i64 %add, ptr %.anon, align 8 br label %loop.cond loop.exit: ; preds = %loop.cond - %165 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) - store i64 0, i64* %.anon85, align 8 + %164 = call i32 (ptr, ...) @printf(ptr @.str.1) + store i64 0, ptr %.anon85, align 8 br label %loop.cond86 loop.cond86: ; preds = %loop.body88, %loop.exit - %166 = load i64, i64* %.anon85, align 8 - %gt87 = icmp ugt i64 4, %166 + %165 = load i64, ptr %.anon85, align 8 + %gt87 = icmp ugt i64 4, %165 br i1 %gt87, label %loop.body88, label %loop.exit95 loop.body88: ; preds = %loop.cond86 - %167 = load i64, i64* %.anon85, align 8 - %168 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 %167 - %169 = load <4 x float>, <4 x float>* %168, align 16 - store <4 x float> %169, <4 x float>* %v89, align 16 - %170 = load <4 x float>, <4 x float>* %v89, align 16 - %171 = extractelement <4 x float> %170, i64 0 - %fpfpext90 = fpext float %171 to double - %172 = load <4 x float>, <4 x float>* %v89, align 16 - %173 = extractelement <4 x float> %172, i64 1 - %fpfpext91 = fpext float %173 to double - %174 = load <4 x float>, <4 x float>* %v89, align 16 - %175 = extractelement <4 x float> %174, i64 2 - %fpfpext92 = fpext float %175 to double - %176 = load <4 x float>, <4 x float>* %v89, align 16 - %177 = extractelement <4 x float> %176, i64 3 - %fpfpext93 = fpext float %177 to double - %178 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), double %fpfpext90, double %fpfpext91, double %fpfpext92, double %fpfpext93) - %179 = load i64, i64* %.anon85, align 8 - %add94 = add i64 %179, 1 - store i64 %add94, i64* %.anon85, align 8 + %166 = load i64, ptr %.anon85, align 8 + %167 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 %166 + %168 = load <4 x float>, ptr %167, align 16 + store <4 x float> %168, ptr %v89, align 16 + %169 = load <4 x float>, ptr %v89, align 16 + %170 = extractelement <4 x float> %169, i64 0 + %fpfpext90 = fpext float %170 to double + %171 = load <4 x float>, ptr %v89, align 16 + %172 = extractelement <4 x float> %171, i64 1 + %fpfpext91 = fpext float %172 to double + %173 = load <4 x float>, ptr %v89, align 16 + %174 = extractelement <4 x float> %173, i64 2 + %fpfpext92 = fpext float %174 to double + %175 = load <4 x float>, ptr %v89, align 16 + %176 = extractelement <4 x float> %175, i64 3 + %fpfpext93 = fpext float %176 to double + %177 = call i32 (ptr, ...) @printf(ptr @.str.2, double %fpfpext90, double %fpfpext91, double %fpfpext92, double %fpfpext93) + %178 = load i64, ptr %.anon85, align 8 + %add94 = add i64 %178, 1 + store i64 %add94, ptr %.anon85, align 8 br label %loop.cond86 loop.exit95: ; preds = %loop.cond86 diff --git a/test/test_suite/vector/vector_ops2.c3t b/test/test_suite/vector/vector_ops2.c3t index f895878df..e0fef8f84 100644 --- a/test/test_suite/vector/vector_ops2.c3t +++ b/test/test_suite/vector/vector_ops2.c3t @@ -23,82 +23,32 @@ fn void testi() /* #expect: test.ll +; Function Attrs: nounwind +define void @test_testf() #0 { +entry: + %y = alloca <4 x float>, align 16 + %z = alloca <4 x float>, align 16 + %w = alloca <4 x float>, align 16 + store <4 x float> , ptr %y, align 16 + store <4 x float> , ptr %z, align 16 + %0 = load <4 x float>, ptr %y, align 16 + %1 = load <4 x float>, ptr %z, align 16 + %fadd = fadd <4 x float> %0, %1 + store <4 x float> %fadd, ptr %w, align 16 + %2 = load <4 x float>, ptr %y, align 16 + %3 = load <4 x float>, ptr %z, align 16 %4 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %3) %5 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %4) %zero = fcmp ueq float %5, 0.000000e+00 br i1 %zero, label %panic, label %checkok panic: ; preds = %entry - %6 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %6(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func, i64 0, i64 0), i64 5, i32 9) + %6 = load ptr, ptr @std_core_builtin_panic, align 8 + call void %6(ptr @.panic_msg, i64 17, ptr @.file, i64 14, ptr @.func, i64 5, i32 9) br label %checkok checkok: ; preds = %panic, %entry %fdiv = fdiv <4 x float> %2, %3 - store <4 x float> %fdiv, <4 x float>* %w, align 16 - - %2 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %1) - %zero = icmp eq i32 %2, 0 - br i1 %zero, label %panic, label %checkok - -panic: ; preds = %entry - %3 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %3(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg.1, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.2, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.3, i64 0, i64 0), i64 5, i32 17) - br label %checkok - -checkok: ; preds = %panic, %entry - %sdiv = sdiv <4 x i32> %0, %1 - store <4 x i32> %sdiv, <4 x i32>* %w, align 16 - %4 = load <4 x i32>, <4 x i32>* %z, align 16 - %5 = load <4 x i32>, <4 x i32>* %y, align 16 - %6 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %5) - %shift_underflow = icmp slt i32 %6, 0 - br i1 %shift_underflow, label %panic1, label %checkok2 - -panic1: ; preds = %checkok - %7 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %7(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.4, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.5, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.6, i64 0, i64 0), i64 5, i32 18) - br label %checkok2 - -checkok2: ; preds = %panic1, %checkok - %8 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %5) - %shift_exceeds = icmp sge i32 %8, 32 - br i1 %shift_exceeds, label %panic3, label %checkok4 - -panic3: ; preds = %checkok2 - %9 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %9(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.7, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.8, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.9, i64 0, i64 0), i64 5, i32 18) - br label %checkok4 - -checkok4: ; preds = %panic3, %checkok2 - %ashr = ashr <4 x i32> %4, %5 - %10 = freeze <4 x i32> %ashr - store <4 x i32> %10, <4 x i32>* %w, align 16 - %11 = load <4 x i32>, <4 x i32>* %z, align 16 - %12 = load <4 x i32>, <4 x i32>* %y, align 16 - %13 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %12) - %shift_underflow5 = icmp slt i32 %13, 0 - br i1 %shift_underflow5, label %panic6, label %checkok7 - -panic6: ; preds = %checkok4 - %14 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %14(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.10, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.11, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.12, i64 0, i64 0), i64 5, i32 19) - br label %checkok7 - -checkok7: ; preds = %panic6, %checkok4 - %15 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %12) - %shift_exceeds8 = icmp sge i32 %15, 32 - br i1 %shift_exceeds8, label %panic9, label %checkok10 - -panic9: ; preds = %checkok7 - %16 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 - call void %16(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.13, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.14, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.15, i64 0, i64 0), i64 5, i32 19) - br label %checkok10 - -checkok10: ; preds = %panic9, %checkok7 - %shl = shl <4 x i32> %11, %12 - %17 = freeze <4 x i32> %shl - store <4 x i32> %17, <4 x i32>* %w, align 16 + store <4 x float> %fdiv, ptr %w, align 16 ret void } - diff --git a/test/test_suite/vector/vector_to_array_cast.c3t b/test/test_suite/vector/vector_to_array_cast.c3t index 50410c149..1d11f86f1 100644 --- a/test/test_suite/vector/vector_to_array_cast.c3t +++ b/test/test_suite/vector/vector_to_array_cast.c3t @@ -21,18 +21,18 @@ define void @test_tester() #0 { entry: %x = alloca <2 x i32>, align 8 %y = alloca [2 x i32], align 4 - store <2 x i32> , <2 x i32>* %x, align 8 - %0 = load <2 x i32>, <2 x i32>* %x, align 8 + store <2 x i32> , ptr %x, align 8 + %0 = load <2 x i32>, ptr %x, align 8 %1 = extractelement <2 x i32> %0, i64 0 %2 = insertvalue [2 x i32] undef, i32 %1, 0 %3 = extractelement <2 x i32> %0, i64 1 %4 = insertvalue [2 x i32] %2, i32 %3, 1 - store [2 x i32] %4, [2 x i32]* %y, align 4 - %5 = load [2 x i32], [2 x i32]* %y, align 4 + store [2 x i32] %4, ptr %y, align 4 + %5 = load [2 x i32], ptr %y, align 4 %6 = extractvalue [2 x i32] %5, 0 %7 = insertelement <2 x i32> undef, i32 %6, i64 0 %8 = extractvalue [2 x i32] %5, 1 %9 = insertelement <2 x i32> %7, i32 %8, i64 1 - store <2 x i32> %9, <2 x i32>* %x, align 8 + store <2 x i32> %9, ptr %x, align 8 ret void } diff --git a/test/test_suite14/abi/aarch64_args.c3t b/test/test_suite14/abi/aarch64_args.c3t new file mode 100644 index 000000000..c716c6597 --- /dev/null +++ b/test/test_suite14/abi/aarch64_args.c3t @@ -0,0 +1,34 @@ +// #target: macos-aarch64 +module test; + +struct Large { + void*[8] pointers; +} + +extern fn void pass_large(Large); + +fn void example() { + Large l = {}; + pass_large(l); + pass_large(l); +} + +/* #expect: test.ll + +define void @test_example() #0 { +entry: + %l = alloca %Large, align 8 + %indirectarg = alloca %Large, align 8 + %indirectarg1 = alloca %Large, align 8 + %0 = bitcast %Large* %l to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 64, i1 false) + %1 = bitcast %Large* %indirectarg to i8* + %2 = bitcast %Large* %l to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 64, i1 false) + call void @pass_large(%Large* align 8 %indirectarg) + %3 = bitcast %Large* %indirectarg1 to i8* + %4 = bitcast %Large* %l to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 64, i1 false) + call void @pass_large(%Large* align 8 %indirectarg1) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/abi/aarch64_hfa_args.c3t b/test/test_suite14/abi/aarch64_hfa_args.c3t similarity index 100% rename from test/test_suite2/abi/aarch64_hfa_args.c3t rename to test/test_suite14/abi/aarch64_hfa_args.c3t diff --git a/test/test_suite2/abi/darwin64_avx.c3t b/test/test_suite14/abi/darwin64_avx.c3t similarity index 79% rename from test/test_suite2/abi/darwin64_avx.c3t rename to test/test_suite14/abi/darwin64_avx.c3t index 465b64271..b5e3d5fc0 100644 --- a/test/test_suite2/abi/darwin64_avx.c3t +++ b/test/test_suite14/abi/darwin64_avx.c3t @@ -111,13 +111,13 @@ fn void f61(SAtwo256 s) { declare void @f38(<8 x float>) declare void @f37(<8 x float>) -declare void @func40(ptr byval(%Two128) align 16) -define void @test_func41(ptr byval(%Two128) align 16 %0) +declare void @func40(%Two128* byval(%Two128) align 16) +define void @test_func41(%Two128* byval(%Two128) align 16 %0) -declare void @func42(ptr byval(%Sa) align 16) -define void @test_func43(ptr byval(%Sa) align 16 %0) +declare void @func42(%Sa* byval(%Sa) align 16) +define void @test_func43(%Sa* byval(%Sa) align 16 %0) -declare void @f46(double, double, double, double, double, double, double, double, ptr byval(<2 x float>) align 8, ptr byval(<2 x float>) align 8) #0 +declare void @f46(double, double, double, double, double, double, double, double, <2 x float>* byval(<2 x float>) align 8, <2 x float>* byval(<2 x float>) align 8) declare void @f47(i32, i32, i32, i32, i32, i32, i32) declare void @test_test49_helper(double, ...) @@ -127,15 +127,15 @@ entry: ret void call void (i32, ...) @test52_helper(i32 0, <8 x float> %0, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) + call void (<8 x float>, ...) @test54_helper(<8 x float> %0, <8 x float> %1, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) - call void (<8 x float>, ...) @test54_helper(<8 x float> %6, <8 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, ptr byval(%Complex) align 8 %literal1) + call void (<8 x float>, ...) @test54_helper(<8 x float> %6, <8 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, %Complex* byval(%Complex) align 8 %literal1) -declare void @f55(ptr byval(%St512) align 64) -declare void @f56(ptr byval(<16 x float>) align 64) +declare void @f55(%St512* byval(%St512) align 64) #0 +declare void @f56(<16 x float>* byval(<16 x float>) align 64) #0 -declare void @f58(ptr byval(%Two256) align 32) -define void @test_f59(ptr byval(%Two256) align 32 %0) +declare void @f58(%Two256* byval(%Two256) align 32) #0 +define void @test_f59(%Two256* byval(%Two256) align 32 %0) #0 { -declare void @f60(ptr byval(%SAtwo256) align 32) - -define void @test_f61(ptr byval(%SAtwo256) align 32 %0) #0 { +declare void @f60(%SAtwo256* byval(%SAtwo256) align 32) #0 +define void @test_f61(%SAtwo256* byval(%SAtwo256) align 32 %0) #0 { \ No newline at end of file diff --git a/test/test_suite2/abi/darwin64_avx512.c3t b/test/test_suite14/abi/darwin64_avx512.c3t similarity index 86% rename from test/test_suite2/abi/darwin64_avx512.c3t rename to test/test_suite14/abi/darwin64_avx512.c3t index b45b3cd50..26e579226 100644 --- a/test/test_suite2/abi/darwin64_avx512.c3t +++ b/test/test_suite14/abi/darwin64_avx512.c3t @@ -61,14 +61,15 @@ fn void f64() { declare void @f55(<16 x float>) #0 declare void @f56(<16 x float>) #0 -declare void @f58(ptr byval(%Two256) align 32) #0 -define void @test_f59(ptr byval(%Two256) align 32 %0) #0 { +declare void @f58(%Two256* byval(%Two256) align 32) #0 +define void @test_f59(%Two256* byval(%Two256) align 32 %0) #0 { + +declare void @f60(%SAtwo256* byval(%SAtwo256) align 32) #0 +define void @test_f61(%SAtwo256* byval(%SAtwo256) align 32 %0) #0 { -declare void @f60(ptr byval(%SAtwo256) align 32) #0 -define void @test_f61(ptr byval(%SAtwo256) align 32 %0) #0 { define void @test_f62() #0 { call void (i32, ...) @test_f62_helper(i32 0, <16 x float> %0, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) define void @test_f64() #0 { call void (<16 x float>, ...) @test_f64_helper(<16 x float> %0, <16 x float> %1, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double %lo, double %hi) - call void (<16 x float>, ...) @test_f64_helper(<16 x float> %6, <16 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, ptr byval(%Complex) align 8 %literal1) + call void (<16 x float>, ...) @test_f64_helper(<16 x float> %6, <16 x float> %7, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, %Complex* byval(%Complex) align 8 %literal1) diff --git a/test/test_suite14/abi/darwin64_sret.c3t b/test/test_suite14/abi/darwin64_sret.c3t new file mode 100644 index 000000000..64b7125fc --- /dev/null +++ b/test/test_suite14/abi/darwin64_sret.c3t @@ -0,0 +1,21 @@ +// #target: macos-x64 +module foo; + +struct SimdDouble4x4 +{ + double[<4>][4] columns; +} + +fn SimdDouble4x4 ident(SimdDouble4x4 x) { + return x; +} + +/* #expect: foo.ll + +define void @foo_ident(%SimdDouble4x4* noalias sret(%SimdDouble4x4) align 32 %0, %SimdDouble4x4* byval(%SimdDouble4x4) align 32 %1) #0 { +entry: + %2 = bitcast %SimdDouble4x4* %0 to i8* + %3 = bitcast %SimdDouble4x4* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 32 %2, i8* align 32 %3, i32 128, i1 false) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/abi/darwin64_sse.c3t b/test/test_suite14/abi/darwin64_sse.c3t similarity index 68% rename from test/test_suite2/abi/darwin64_sse.c3t rename to test/test_suite14/abi/darwin64_sse.c3t index 98dfe1932..a425eb231 100644 --- a/test/test_suite2/abi/darwin64_sse.c3t +++ b/test/test_suite14/abi/darwin64_sse.c3t @@ -46,11 +46,11 @@ fn void func43(Sa s) { /* #expect: test.ll -declare void @f38(ptr byval(%St256) align 32) -declare void @f37(ptr byval(<8 x float>) align 32) +declare void @f38(%St256* byval(%St256) align 32) +declare void @f37(<8 x float>* byval(<8 x float>) align 32) -declare void @func40(ptr byval(%Two128) align 16) -define void @test_func41(ptr byval(%Two128) align 16 %0) +declare void @func40(%Two128* byval(%Two128) align 16) +define void @test_func41(%Two128* byval(%Two128) align 16 %0) -declare void @func42(ptr byval(%Sa) align 16) -define void @test_func43(ptr byval(%Sa) align 16 %0) +declare void @func42(%Sa* byval(%Sa) align 16) +define void @test_func43(%Sa* byval(%Sa) align 16 %0) diff --git a/test/test_suite14/abi/darwin_arg.c3t b/test/test_suite14/abi/darwin_arg.c3t new file mode 100644 index 000000000..ce0e37812 --- /dev/null +++ b/test/test_suite14/abi/darwin_arg.c3t @@ -0,0 +1,26 @@ +// #target: macos-x64 +module test; +struct Str +{ + union + { + float128 a; + long c; + } +} + +extern fn void d(Str s); +Str ss; +fn void f9122143() +{ + d(ss); +} + +/* #expect: test.ll + +declare void @d(i64, double) #0 + + %lo = load i64, i64* getelementptr inbounds ({ i64, double }, { i64, double }* bitcast (%Str* @test_ss to { i64, double }*), i32 0, i32 0), align 16 + %hi = load double, double* getelementptr inbounds ({ i64, double }, { i64, double }* bitcast (%Str* @test_ss to { i64, double }*), i32 0, i32 1), align 8 + call void @d(i64 %lo, double %hi) + ret void diff --git a/test/test_suite2/abi/darwinx64_1.c3t b/test/test_suite14/abi/darwinx64_1.c3t similarity index 98% rename from test/test_suite2/abi/darwinx64_1.c3t rename to test/test_suite14/abi/darwinx64_1.c3t index f332dffbe..90ceda530 100644 --- a/test/test_suite2/abi/darwinx64_1.c3t +++ b/test/test_suite14/abi/darwinx64_1.c3t @@ -42,7 +42,7 @@ define signext i16 @test_f1() define i32 @test_f2() define float @test_f3() define double @test_f4() -define void @test_f6(i8 zeroext %0, i16 signext %1, i32 %2, i64 %3, ptr %4) +define void @test_f6(i8 zeroext %0, i16 signext %1, i32 %2, i64 %3, i8* %4) define void @test_f7(i32 %0) define i64 @test_f8_1() define void @test_f8_2(i64 %0) #0 { diff --git a/test/test_suite2/abi/darwinx64_2.c3t b/test/test_suite14/abi/darwinx64_2.c3t similarity index 89% rename from test/test_suite2/abi/darwinx64_2.c3t rename to test/test_suite14/abi/darwinx64_2.c3t index 59a6cdd43..713557505 100644 --- a/test/test_suite2/abi/darwinx64_2.c3t +++ b/test/test_suite14/abi/darwinx64_2.c3t @@ -149,15 +149,15 @@ fn V2i32 f36(V2i32 arg) { return arg; } define i32 @test_f12_0() define void @test_f12_1(i32 %0) -define void @test_f13(ptr noalias sret(%St13_0) align 8 %0, i32 %1, i32 %2, i32 %3, i32 %4, ptr byval(%St13_1) align 8 %5, i32 %6) #0 { +define void @test_f13(%St13_0* noalias sret(%St13_0) align 8 %0, i32 %1, i32 %2, i32 %3, i32 %4, %St13_1* byval(%St13_1) align 8 %5, i32 %6) #0 { define void @test_f14(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i8 signext %6) #0 { -define void @test_f15(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, ptr %6) +define void @test_f15(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i8* %6) define void @test_f16(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, float %8) define void @test_fl18(i32 %0, i32 %1) -define void @test_f20(ptr byval(%St20) align 32 %0) -define ptr @test_f21(i64 %0, ptr %1) +define void @test_f20(%St20* byval(%St20) align 32 %0) +define i8* @test_f21(i64 %0, i8* %1) define void @test_f22(i64 %0, i64 %1, i64 %2, i64 %3) entry: @@ -165,7 +165,7 @@ entry: %y = alloca %St22s, align 16 define void @test_f23(i32 %0, i64 %1, i32 %2) -define { i64, i32 } @test_f24(ptr %0, ptr %1) +define { i64, i32 } @test_f24(%St23S* %0, %St24s* %1) define <4 x float> @test_f25(<4 x float> %0) #0 { entry: @@ -173,7 +173,7 @@ entry: ret <4 x float> %fadd } -define { ptr, ptr } @test_f26(ptr %0) +define { i32*, float* } @test_f26(%Foo26* %0) define <4 x float> @test_f27(<4 x float> %0) define <8 x float> @test_f27a(<8 x float> %0) define <8 x float> @test_f27b(<8 x float> %0) @@ -183,4 +183,4 @@ define void @test_f30(i64 %0, i24 %1) define float @test_f31(<2 x float> %0, float %1) define double @test_f34(double %0) define double @test_f35(double %0) -define double @test_f36(double %0) \ No newline at end of file +define double @test_f36(double %0) diff --git a/test/test_suite14/abi/literal_load.c3t b/test/test_suite14/abi/literal_load.c3t new file mode 100644 index 000000000..02dd36d0e --- /dev/null +++ b/test/test_suite14/abi/literal_load.c3t @@ -0,0 +1,31 @@ +// #target: macos-x64 + +struct Test +{ + int x; +} + +Test foo = {}; + +extern fn void blorg(Test t); + +fn Test creator() +{ + blorg(Test{}); + return Test{}; +} + +// #expect: literal_load.ll + + %literal = alloca %Test, align 4 + %literal1 = alloca %Test, align 4 + %0 = bitcast %Test* %literal to i32* + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds %Test, %Test* %literal, i32 0, i32 0 + %2 = load i32, i32* %1, align 4 + call void @blorg(i32 %2) + %3 = bitcast %Test* %literal1 to i32* + store i32 0, i32* %3, align 4 + %4 = getelementptr inbounds %Test, %Test* %literal1, i32 0, i32 0 + %5 = load i32, i32* %4, align 4 + ret i32 %5 \ No newline at end of file diff --git a/test/test_suite14/abi/literal_load_aarch64.c3t b/test/test_suite14/abi/literal_load_aarch64.c3t new file mode 100644 index 000000000..ea6de7b9d --- /dev/null +++ b/test/test_suite14/abi/literal_load_aarch64.c3t @@ -0,0 +1,38 @@ +// #target: linux-aarch64 +module literal_load; + +struct Test +{ + int x; +} + +Test foo = {}; + +extern fn void blorg(Test t); + +fn Test creator() +{ + blorg(Test{}); + return Test{}; +} + +// #expect: literal_load.ll + +declare void @blorg(i64) #0 + +define i32 @literal_load_creator() #0 { +entry: + %literal = alloca %Test, align 4 + %literal1 = alloca %Test, align 4 + %0 = bitcast %Test* %literal to i32* + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds %Test, %Test* %literal, i32 0, i32 0 + %2 = load i32, i32* %1, align 4 + %3 = zext i32 %2 to i64 + call void @blorg(i64 %3) + %4 = bitcast %Test* %literal1 to i32* + store i32 0, i32* %4, align 4 + %5 = getelementptr inbounds %Test, %Test* %literal1, i32 0, i32 0 + %6 = load i32, i32* %5, align 4 + ret i32 %6 +} \ No newline at end of file diff --git a/test/test_suite14/abi/literal_load_mingw.c3t b/test/test_suite14/abi/literal_load_mingw.c3t new file mode 100644 index 000000000..18e5f6156 --- /dev/null +++ b/test/test_suite14/abi/literal_load_mingw.c3t @@ -0,0 +1,32 @@ +// #target: mingw-x64 +module literal_load; + +struct Test +{ + int x; +} + +Test foo = {}; + +extern fn void blorg(Test t); + +fn Test creator() +{ + blorg(Test{}); + return Test{}; +} + +// #expect: literal_load.ll + + %literal = alloca %Test, align 4 + %literal1 = alloca %Test, align 4 + %0 = bitcast %Test* %literal to i32* + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds %Test, %Test* %literal, i32 0, i32 0 + %2 = load i32, i32* %1, align 4 + call void @blorg(i32 %2) + %3 = bitcast %Test* %literal1 to i32* + store i32 0, i32* %3, align 4 + %4 = getelementptr inbounds %Test, %Test* %literal1, i32 0, i32 0 + %5 = load i32, i32* %4, align 4 + ret i32 %5 \ No newline at end of file diff --git a/test/test_suite2/abi/macho_section_attributes.c3 b/test/test_suite14/abi/macho_section_attributes.c3 similarity index 100% rename from test/test_suite2/abi/macho_section_attributes.c3 rename to test/test_suite14/abi/macho_section_attributes.c3 diff --git a/test/test_suite14/abi/pass_large_aarch.c3t b/test/test_suite14/abi/pass_large_aarch.c3t new file mode 100644 index 000000000..3e156d241 --- /dev/null +++ b/test/test_suite14/abi/pass_large_aarch.c3t @@ -0,0 +1,37 @@ +// #target: linux-aarch64 + +module pass_large; + + +struct Large +{ + void*[8] pointers; +} + +extern fn void pass_large(Large large); + +fn void example() +{ + Large l = {}; + pass_large(l); + pass_large(l); +} + +/* #expect: pass_large.ll + +define void @pass_large_example() +entry: + %l = alloca %Large, align 8 + %indirectarg = alloca %Large, align 8 + %indirectarg1 = alloca %Large, align 8 + %0 = bitcast %Large* %l to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 64, i1 false) + %1 = bitcast %Large* %indirectarg to i8* + %2 = bitcast %Large* %l to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 64, i1 false) + call void @pass_large(%Large* align 8 %indirectarg) + %3 = bitcast %Large* %indirectarg1 to i8* + %4 = bitcast %Large* %l to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 64, i1 false) + call void @pass_large(%Large* align 8 %indirectarg1) + ret void diff --git a/test/test_suite14/abi/regcall_expand.c3t b/test/test_suite14/abi/regcall_expand.c3t new file mode 100644 index 000000000..b712caf02 --- /dev/null +++ b/test/test_suite14/abi/regcall_expand.c3t @@ -0,0 +1,55 @@ +// #target: mingw-x64 +module test; + +extern fn void printf(char*, ...); + +struct Foo +{ + float[2] x; +} +fn void test(Foo x) @regcall +{ +} + +fn int main() +{ + test(Foo { }); + return 0; +} + +/* #expect: test.ll + +%Foo = type { [2 x float] } + +$"ct$test_Foo" = comdat any + +@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 + +define x86_regcallcc void @test_test(float %0, float %1) #0 { +entry: + %x = alloca %Foo, align 4 + %2 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %3 = getelementptr inbounds [2 x float], [2 x float]* %2, i64 0, i64 0 + store float %0, float* %3, align 4 + %4 = getelementptr inbounds [2 x float], [2 x float]* %2, i64 0, i64 1 + store float %1, float* %4, align 4 + ret void +} + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + %literal = alloca %Foo, align 4 + %0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 + %1 = getelementptr inbounds [2 x float], [2 x float]* %0, i64 0, i64 0 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds [2 x float], [2 x float]* %0, i64 0, i64 1 + store float 0.000000e+00, float* %2, align 4 + %3 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 + %4 = getelementptr inbounds [2 x float], [2 x float]* %3, i64 0, i64 0 + %loadexpanded = load float, float* %4, align 4 + %5 = getelementptr inbounds [2 x float], [2 x float]* %3, i64 0, i64 1 + %loadexpanded1 = load float, float* %5, align 4 + call x86_regcallcc void @test_test(float %loadexpanded, float %loadexpanded1) + ret i32 0 +} \ No newline at end of file diff --git a/test/test_suite14/abi/riscv64-lp64-abi.c3t b/test/test_suite14/abi/riscv64-lp64-abi.c3t new file mode 100644 index 000000000..3bb7951bd --- /dev/null +++ b/test/test_suite14/abi/riscv64-lp64-abi.c3t @@ -0,0 +1,48 @@ +// #target: linux-riscv64 +module test; + +struct Large { + long a, b, c, d; +} + +define V32i8 = char[<32>]; + +fn int f_scalar_stack_1(int a, int128 b, float c, float128 d, V32i8 e, + char f, char g, char h) { + return g + h; +} + +fn Large f_scalar_stack_2(double a, int128 b, float128 c, V32i8 d, + char e, ichar f, char g) { + return Large {(long)(a), e, f, g}; +} + +/* #expect: test.ll + +define signext i32 @test_f_scalar_stack_1(i32 signext %0, i128 %1, float %2, fp128 %3, <32 x i8>* align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { +entry: + %uisiext = zext i8 %6 to i32 + %uisiext1 = zext i8 %7 to i32 + %add = add i32 %uisiext, %uisiext1 + ret i32 %add +} +define void @test_f_scalar_stack_2(%Large* noalias sret(%Large) align 8 %0, double %1, i128 %2, fp128 %3, <32 x i8>* align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { +entry: + %literal = alloca %Large, align 8 + %8 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 0 + %fpsi = fptosi double %1 to i64 + store i64 %fpsi, i64* %8, align 8 + %9 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 1 + %uisiext = zext i8 %5 to i64 + store i64 %uisiext, i64* %9, align 8 + %10 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 2 + %sisiext = sext i8 %6 to i64 + store i64 %sisiext, i64* %10, align 8 + %11 = getelementptr inbounds %Large, %Large* %literal, i32 0, i32 3 + %uisiext1 = zext i8 %7 to i64 + store i64 %uisiext1, i64* %11, align 8 + %12 = bitcast %Large* %0 to i8* + %13 = bitcast %Large* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %12, i8* align 8 %13, i32 32, i1 false) + ret void +} diff --git a/test/test_suite14/abi/small_struct_x64.c3t b/test/test_suite14/abi/small_struct_x64.c3t new file mode 100644 index 000000000..3c953d485 --- /dev/null +++ b/test/test_suite14/abi/small_struct_x64.c3t @@ -0,0 +1,80 @@ +// #target: macos-x64 +module test; +struct Foo +{ + char a; + char b; + char c; +} + +fn int testing() +{ + Foo y = getFoo(Foo { 4, 5, 6 }); + return y.a + y.c; +} + +fn Foo getFoo(Foo f) +{ + return Foo { 1, 2, 3 }; +} + +/* #expect: test.ll + +define i32 @test_testing() #0 { +entry: + %y = alloca %Foo, align 1 + %literal = alloca %Foo, align 1 + %tempcoerce = alloca i24, align 4 + %result = alloca %Foo, align 1 + %tempcoerce1 = alloca i24, align 4 + %0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 + store i8 4, i8* %0, align 1 + %1 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 + store i8 5, i8* %1, align 1 + %2 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 2 + store i8 6, i8* %2, align 1 + %3 = bitcast i24* %tempcoerce to i8* + %4 = bitcast %Foo* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 1 %4, i32 3, i1 false) + %5 = load i24, i24* %tempcoerce, align 4 + %6 = call i24 @test_getFoo(i24 %5) + store i24 %6, i24* %tempcoerce1, align 4 + %7 = bitcast %Foo* %result to i8* + %8 = bitcast i24* %tempcoerce1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %7, i8* align 4 %8, i32 3, i1 false) + %9 = bitcast %Foo* %y to i8* + %10 = bitcast %Foo* %result to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %9, i8* align 1 %10, i32 3, i1 false) + %11 = getelementptr inbounds %Foo, %Foo* %y, i32 0, i32 0 + %12 = load i8, i8* %11, align 1 + %uisiext = zext i8 %12 to i32 + %13 = getelementptr inbounds %Foo, %Foo* %y, i32 0, i32 2 + %14 = load i8, i8* %13, align 1 + %uisiext2 = zext i8 %14 to i32 + %add = add i32 %uisiext, %uisiext2 + ret i32 %add +} + +; Function Attrs: nounwind +define i24 @test_getFoo(i24 %0) #0 { +entry: + %f = alloca %Foo, align 1 + %tempcoerce = alloca i24, align 4 + %literal = alloca %Foo, align 1 + %tempcoerce1 = alloca i24, align 4 + store i24 %0, i24* %tempcoerce, align 4 + %1 = bitcast %Foo* %f to i8* + %2 = bitcast i24* %tempcoerce to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %1, i8* align 4 %2, i32 3, i1 false) + %3 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 + store i8 1, i8* %3, align 1 + %4 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 + store i8 2, i8* %4, align 1 + %5 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 2 + store i8 3, i8* %5, align 1 + %6 = bitcast i24* %tempcoerce1 to i8* + %7 = bitcast %Foo* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %6, i8* align 1 %7, i32 3, i1 false) + %8 = load i24, i24* %tempcoerce1, align 4 + ret i24 %8 +} diff --git a/test/test_suite2/abi/sysv_abi_avx.c3t b/test/test_suite14/abi/sysv_abi_avx.c3t similarity index 89% rename from test/test_suite2/abi/sysv_abi_avx.c3t rename to test/test_suite14/abi/sysv_abi_avx.c3t index 44d71bb5c..8f36042b0 100644 --- a/test/test_suite2/abi/sysv_abi_avx.c3t +++ b/test/test_suite14/abi/sysv_abi_avx.c3t @@ -31,8 +31,8 @@ fn void use_vectors() /* #expect: foo.ll -declare void @take_stringref(ptr, i64) #0 -call void @take_stringref(ptr %lo, i64 %hi) +declare void @take_stringref(i8*, i64) #0 +call void @take_stringref(i8* %lo, i64 %hi) define void @foo_use_vectors() #0 { entry: diff --git a/test/test_suite2/abi/sysv_abi_noavx.c3t b/test/test_suite14/abi/sysv_abi_noavx.c3t similarity index 72% rename from test/test_suite2/abi/sysv_abi_noavx.c3t rename to test/test_suite14/abi/sysv_abi_noavx.c3t index e3ee93e90..75c83e061 100644 --- a/test/test_suite2/abi/sysv_abi_noavx.c3t +++ b/test/test_suite14/abi/sysv_abi_noavx.c3t @@ -31,11 +31,12 @@ fn void use_vectors() /* #expect: foo.ll -declare void @take_stringref(ptr, i64) #0 - call void @take_stringref(ptr %lo, i64 %hi) +declare void @take_stringref(i8*, i64) #0 + call void @take_stringref(i8* %lo, i64 %hi) define void @foo_use_vectors() #0 { +entry: %0 = call <8 x float> @get_m256() - call void @take_m256(ptr byval(<8 x float>) align 32 %v1) + call void @take_m256(<8 x float>* byval(<8 x float>) align 32 %v1) %1 = call <16 x float> @get_m512() - call void @take_m512(ptr byval(<16 x float>) align 64 %v2) \ No newline at end of file + call void @take_m512(<16 x float>* byval(<16 x float>) align 64 %v2) diff --git a/test/test_suite14/abi/sysv_direct_coerce.c3t b/test/test_suite14/abi/sysv_direct_coerce.c3t new file mode 100644 index 000000000..a81bf313a --- /dev/null +++ b/test/test_suite14/abi/sysv_direct_coerce.c3t @@ -0,0 +1,47 @@ +// #target: macos-x64 +module foo; + +struct Rectangle +{ + float x; // Rectangle top-left corner position x + float y; // Rectangle top-left corner position y + float width; // Rectangle width + float height; // Rectangle height +} + +fn void test(Rectangle r) +{ + test(Rectangle { 1, 2, 3, 4 }); +} + +/* #expect: foo.ll + +define void @foo_test(<2 x float> %0, <2 x float> %1) #0 { +entry: + %r = alloca %Rectangle, align 4 + %literal = alloca %Rectangle, align 4 + %coerce = alloca %Rectangle, align 8 + %pair = bitcast %Rectangle* %r to { <2 x float>, <2 x float> }* + %2 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %pair, i32 0, i32 0 + store <2 x float> %0, <2 x float>* %2, align 4 + %3 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %pair, i32 0, i32 1 + store <2 x float> %1, <2 x float>* %3, align 4 + %4 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 0 + store float 1.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 1 + store float 2.000000e+00, float* %5, align 4 + %6 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 2 + store float 3.000000e+00, float* %6, align 4 + %7 = getelementptr inbounds %Rectangle, %Rectangle* %literal, i32 0, i32 3 + store float 4.000000e+00, float* %7, align 4 + %8 = bitcast %Rectangle* %coerce to { <2 x float>, <2 x float> }* + %9 = bitcast { <2 x float>, <2 x float> }* %8 to i8* + %10 = bitcast %Rectangle* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %9, i8* align 4 %10, i32 16, i1 false) + %11 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %8, i32 0, i32 0 + %lo = load <2 x float>, <2 x float>* %11, align 8 + %12 = getelementptr inbounds { <2 x float>, <2 x float> }, { <2 x float>, <2 x float> }* %8, i32 0, i32 1 + %hi = load <2 x float>, <2 x float>* %12, align 8 + call void @foo_test(<2 x float> %lo, <2 x float> %hi) + ret void +} \ No newline at end of file diff --git a/test/test_suite14/abi/test_sret.c3t b/test/test_suite14/abi/test_sret.c3t new file mode 100644 index 000000000..ec8b22292 --- /dev/null +++ b/test/test_suite14/abi/test_sret.c3t @@ -0,0 +1,31 @@ +// #target: macos-x64 + +struct Abc { + long a; + long b; + long c; + long d; + long e; +} + +extern fn Abc foo1(); +extern fn Abc foo2(); + +fn void bar() { + Abc dummy1 = foo1(); + Abc dummy2 = foo2(); +} + +// Cleanup for this result, since it's creating an unnecessary sret. + +// #expect: test_sret.ll + +declare void @foo1(%Abc* noalias sret(%Abc) align 8) + +declare void @foo2(%Abc* noalias sret(%Abc) align 8) + + %dummy1 = alloca %Abc, align 8 + %dummy2 = alloca %Abc, align 8 + call void @foo1(%Abc* sret(%Abc) align 8 %dummy1) + call void @foo2(%Abc* sret(%Abc) align 8 %dummy2) + ret void diff --git a/test/test_suite14/abi/union_x64.c3t b/test/test_suite14/abi/union_x64.c3t new file mode 100644 index 000000000..9490947df --- /dev/null +++ b/test/test_suite14/abi/union_x64.c3t @@ -0,0 +1,38 @@ +// #target: macos-x64 + +module unionx64; + +union Foo +{ + long a; + char[12] b; +} +extern fn void hello2(Foo f); + +fn void hello(Foo f) +{ + hello2(f); +} + +/* #expect: unionx64.ll + +%Foo = type { i64, [8 x i8] } + +declare void @hello2(i64, i64) #0 + +define void @unionx64_hello(i64 %0, i64 %1) #0 { +entry: + %f = alloca %Foo, align 8 + %pair = bitcast %Foo* %f to { i64, i64 }* + %2 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + %4 = bitcast %Foo* %f to { i64, i64 }* + %5 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %4, i32 0, i32 0 + %lo = load i64, i64* %5, align 8 + %6 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %4, i32 0, i32 1 + %hi = load i64, i64* %6, align 8 + call void @hello2(i64 %lo, i64 %hi) + ret void +} diff --git a/test/test_suite14/abi/vec2_aarch64.c3t b/test/test_suite14/abi/vec2_aarch64.c3t new file mode 100644 index 000000000..8f29e8784 --- /dev/null +++ b/test/test_suite14/abi/vec2_aarch64.c3t @@ -0,0 +1,100 @@ +// #target: linux-aarch64 +module abi; + +struct Vector2 { + float x; + float y; +} +extern fn Vector2 vector2_zero() { return Vector2 {}; } +extern fn Vector2 vector2_one() { return Vector2 {}; } +extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } +extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } + +// #expect: abi.ll +%Vector2 = type { float, float } + +define %Vector2 @vector2_zero() #0 { +entry: + %literal = alloca %Vector2, align 4 + %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %0, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %1, align 4 + %2 = load %Vector2, %Vector2* %literal, align 4 + ret %Vector2 %2 +} + +define %Vector2 @vector2_one() #0 { +entry: + %literal = alloca %Vector2, align 4 + %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %0, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %1, align 4 + %2 = load %Vector2, %Vector2* %literal, align 4 + ret %Vector2 %2 +} + +define %Vector2 @vector2_add([2 x float] %0, [2 x float] %1) #0 { +entry: + %v1 = alloca %Vector2, align 4 + %v2 = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v1 to [2 x float]* + store [2 x float] %0, [2 x float]* %2, align 4 + %3 = bitcast %Vector2* %v2 to [2 x float]* + store [2 x float] %1, [2 x float]* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %5, align 4 + %6 = load %Vector2, %Vector2* %literal, align 4 + ret %Vector2 %6 +} + +define %Vector2 @vector2_add_value([2 x float] %0, float %1) #0 { +entry: + %v = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v to [2 x float]* + store [2 x float] %0, [2 x float]* %2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = load %Vector2, %Vector2* %literal, align 4 + ret %Vector2 %5 +} + +define %Vector2 @vector2_subtract([2 x float] %0, [2 x float] %1) #0 { +entry: + %v1 = alloca %Vector2, align 4 + %v2 = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v1 to [2 x float]* + store [2 x float] %0, [2 x float]* %2, align 4 + %3 = bitcast %Vector2* %v2 to [2 x float]* + store [2 x float] %1, [2 x float]* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %5, align 4 + %6 = load %Vector2, %Vector2* %literal, align 4 + ret %Vector2 %6 +} + +define %Vector2 @vector2_subtract_value([2 x float] %0, float %1) #0 { +entry: + %v = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v to [2 x float]* + store [2 x float] %0, [2 x float]* %2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = load %Vector2, %Vector2* %literal, align 4 + ret %Vector2 %5 +} diff --git a/test/test_suite14/abi/vec2_wasm.c3t b/test/test_suite14/abi/vec2_wasm.c3t new file mode 100644 index 000000000..a976b652c --- /dev/null +++ b/test/test_suite14/abi/vec2_wasm.c3t @@ -0,0 +1,99 @@ +// #target: wasm32 +module abi; + +struct Vector2 { + float x; + float y; +} +extern fn Vector2 vector2_zero() { return Vector2 {}; } +extern fn Vector2 vector2_one() { return Vector2 {}; } +extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } +extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } + +// #expect: abi.ll +target triple = "wasm32-unknown-unknown" + +%Vector2 = type { float, float } + +define void @vector2_zero(%Vector2* noalias sret(%Vector2) align 4 %0) #0 { +entry: + %literal = alloca %Vector2, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %2, align 4 + %3 = bitcast %Vector2* %0 to i8* + %4 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + ret void +} + +define void @vector2_one(%Vector2* noalias sret(%Vector2) align 4 %0) #0 { +entry: + %literal = alloca %Vector2, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %2, align 4 + %3 = bitcast %Vector2* %0 to i8* + %4 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 8, i1 false) + ret void +} + +define void @vector2_add(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, %Vector2* byval(%Vector2) align 4 %2) #0 { +entry: + %literal = alloca %Vector2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = bitcast %Vector2* %0 to i8* + %6 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + ret void +} + +; Function Attrs: nounwind +define void @vector2_add_value(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, float %2) #0 { +entry: + %literal = alloca %Vector2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = bitcast %Vector2* %0 to i8* + %6 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + ret void +} + +; Function Attrs: nounwind +define void @vector2_subtract(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, %Vector2* byval(%Vector2) align 4 %2) #0 { +entry: + %literal = alloca %Vector2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = bitcast %Vector2* %0 to i8* + %6 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + ret void +} + +; Function Attrs: nounwind +define void @vector2_subtract_value(%Vector2* noalias sret(%Vector2) align 4 %0, %Vector2* byval(%Vector2) align 4 %1, float %2) #0 { +entry: + %literal = alloca %Vector2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = bitcast %Vector2* %0 to i8* + %6 = bitcast %Vector2* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 8, i1 false) + ret void +} diff --git a/test/test_suite14/abi/vec2_x64.c3t b/test/test_suite14/abi/vec2_x64.c3t new file mode 100644 index 000000000..d3a81963b --- /dev/null +++ b/test/test_suite14/abi/vec2_x64.c3t @@ -0,0 +1,110 @@ +// #target: macos-x64 +module abi; + +struct Vector2 { + float x; + float y; +} +extern fn Vector2 vector2_zero() { return Vector2 {}; } +extern fn Vector2 vector2_one() { return Vector2 {}; } +extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } +extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } +extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } + +/* #expect: abi.ll + +%Vector2 = type { float, float } + +define <2 x float> @vector2_zero() #0 { +entry: + %literal = alloca %Vector2, align 4 + %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %0, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %1, align 4 + %2 = bitcast %Vector2* %literal to <2 x float>* + %3 = load <2 x float>, <2 x float>* %2, align 4 + ret <2 x float> %3 +} + +define <2 x float> @vector2_one() #0 { +entry: + %literal = alloca %Vector2, align 4 + %0 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %0, align 4 + %1 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %1, align 4 + %2 = bitcast %Vector2* %literal to <2 x float>* + %3 = load <2 x float>, <2 x float>* %2, align 4 + ret <2 x float> %3 +} + +define <2 x float> @vector2_add(<2 x float> %0, <2 x float> %1) #0 { +entry: + %v1 = alloca %Vector2, align 4 + %v2 = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v1 to <2 x float>* + store <2 x float> %0, <2 x float>* %2, align 4 + %3 = bitcast %Vector2* %v2 to <2 x float>* + store <2 x float> %1, <2 x float>* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %5, align 4 + %6 = bitcast %Vector2* %literal to <2 x float>* + %7 = load <2 x float>, <2 x float>* %6, align 4 + ret <2 x float> %7 +} + +; Function Attrs: nounwind +define <2 x float> @vector2_add_value(<2 x float> %0, float %1) #0 { +entry: + %v = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v to <2 x float>* + store <2 x float> %0, <2 x float>* %2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = bitcast %Vector2* %literal to <2 x float>* + %6 = load <2 x float>, <2 x float>* %5, align 4 + ret <2 x float> %6 +} + +; Function Attrs: nounwind +define <2 x float> @vector2_subtract(<2 x float> %0, <2 x float> %1) #0 { +entry: + %v1 = alloca %Vector2, align 4 + %v2 = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v1 to <2 x float>* + store <2 x float> %0, <2 x float>* %2, align 4 + %3 = bitcast %Vector2* %v2 to <2 x float>* + store <2 x float> %1, <2 x float>* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %5, align 4 + %6 = bitcast %Vector2* %literal to <2 x float>* + %7 = load <2 x float>, <2 x float>* %6, align 4 + ret <2 x float> %7 +} + +; Function Attrs: nounwind +define <2 x float> @vector2_subtract_value(<2 x float> %0, float %1) #0 { +entry: + %v = alloca %Vector2, align 4 + %literal = alloca %Vector2, align 4 + %2 = bitcast %Vector2* %v to <2 x float>* + store <2 x float> %0, <2 x float>* %2, align 4 + %3 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %Vector2, %Vector2* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %4, align 4 + %5 = bitcast %Vector2* %literal to <2 x float>* + %6 = load <2 x float>, <2 x float>* %5, align 4 + ret <2 x float> %6 +} diff --git a/test/test_suite14/abi/x64alignarray.c3t b/test/test_suite14/abi/x64alignarray.c3t new file mode 100644 index 000000000..55b2cefb4 --- /dev/null +++ b/test/test_suite14/abi/x64alignarray.c3t @@ -0,0 +1,28 @@ +// #target: macos-x64 +module test; + +extern fn void test1_f(void *); + +fn void test1_g() +{ + float[4] x; + test1_f(&x); +} + +/* #expect: test.ll + +define void @test_test1_g() #0 { +entry: + %x = alloca [4 x float], align 16 + %0 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 0 + store float 0.000000e+00, float* %0, align 4 + %1 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 1 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 2 + store float 0.000000e+00, float* %2, align 4 + %3 = getelementptr inbounds [4 x float], [4 x float]* %x, i64 0, i64 3 + store float 0.000000e+00, float* %3, align 4 + %ptrptr = bitcast [4 x float]* %x to i8* + call void @test1_f(i8* %ptrptr) + ret void +} \ No newline at end of file diff --git a/test/test_suite14/arrays/array_casts.c3t b/test/test_suite14/arrays/array_casts.c3t new file mode 100644 index 000000000..7c2419f00 --- /dev/null +++ b/test/test_suite14/arrays/array_casts.c3t @@ -0,0 +1,34 @@ +// #target: macos-x64 + +module array_casts; + +fn void test() +{ + int[3] x; + int *y = &x; + int[] z = &x; +} + +// #expect: array_casts.ll + +%"int[]" = type { i32*, i64 } + +define void @array_casts_test() #0 { +entry: + %x = alloca [3 x i32], align 4 + %y = alloca i32*, align 8 + %z = alloca %"int[]", align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 + store i32 0, i32* %2, align 4 + %ptrptr = bitcast [3 x i32]* %x to i32* + store i32* %ptrptr, i32** %y, align 8 + %3 = bitcast [3 x i32]* %x to i32* + %4 = insertvalue %"int[]" undef, i32* %3, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + store %"int[]" %5, %"int[]"* %z, align 8 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/arrays/array_indexing.c3 b/test/test_suite14/arrays/array_indexing.c3 similarity index 100% rename from test/test_suite2/arrays/array_indexing.c3 rename to test/test_suite14/arrays/array_indexing.c3 diff --git a/test/test_suite2/arrays/array_invalid_casts.c3 b/test/test_suite14/arrays/array_invalid_casts.c3 similarity index 100% rename from test/test_suite2/arrays/array_invalid_casts.c3 rename to test/test_suite14/arrays/array_invalid_casts.c3 diff --git a/test/test_suite2/arrays/array_literal.c3t b/test/test_suite14/arrays/array_literal.c3t similarity index 80% rename from test/test_suite2/arrays/array_literal.c3t rename to test/test_suite14/arrays/array_literal.c3t index d29dd766e..10a74df30 100644 --- a/test/test_suite2/arrays/array_literal.c3t +++ b/test/test_suite14/arrays/array_literal.c3t @@ -19,9 +19,10 @@ fn double test(uint x) define double @array_literal_test(i32 %0) #0 { entry: %student_t = alloca [30 x double], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %student_t, ptr align 16 @.__const, i32 240, i1 false) + %1 = bitcast [30 x double]* %student_t to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %1, i8* align 16 bitcast ([30 x double]* @.__const to i8*), i32 240, i1 false) %zext = zext i32 %0 to i64 - %1 = getelementptr inbounds [30 x double], ptr %student_t, i64 0, i64 %zext - %2 = load double, ptr %1, align 8 - ret double %2 + %2 = getelementptr inbounds [30 x double], [30 x double]* %student_t, i64 0, i64 %zext + %3 = load double, double* %2, align 8 + ret double %3 } diff --git a/test/test_suite2/arrays/array_struct.c3t b/test/test_suite14/arrays/array_struct.c3t similarity index 100% rename from test/test_suite2/arrays/array_struct.c3t rename to test/test_suite14/arrays/array_struct.c3t diff --git a/test/test_suite2/arrays/complex_array_const.c3t b/test/test_suite14/arrays/complex_array_const.c3t similarity index 58% rename from test/test_suite2/arrays/complex_array_const.c3t rename to test/test_suite14/arrays/complex_array_const.c3t index af690fbd3..85b28771f 100644 --- a/test/test_suite2/arrays/complex_array_const.c3t +++ b/test/test_suite14/arrays/complex_array_const.c3t @@ -13,10 +13,9 @@ private Connection[3] link {2, "link2", 20}, {3, "link3", 30} }; -/* #expect: test.ll +// #expect: test.ll -@"ct$test_Connection" = linkonce constant %.introspect { i8 10, i64 24, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [6 x i8] c"link1\00", align 1 @.str.1 = private unnamed_addr constant [6 x i8] c"link2\00", align 1 @.str.2 = private unnamed_addr constant [6 x i8] c"link3\00", align 1 -@test_link = protected unnamed_addr global [3 x %Connection] [%Connection { i64 1, ptr @.str, i64 10 }, %Connection { i64 2, ptr @.str.1, i64 20 }, %Connection { i64 3, ptr @.str.2, i64 30 }], align 16 +@test_link = protected unnamed_addr global [3 x %Connection] [%Connection { i64 1, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 10 }, %Connection { i64 2, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 20 }, %Connection { i64 3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i64 30 }], align 16 diff --git a/test/test_suite2/arrays/global_array_non_const.c3 b/test/test_suite14/arrays/global_array_non_const.c3 similarity index 100% rename from test/test_suite2/arrays/global_array_non_const.c3 rename to test/test_suite14/arrays/global_array_non_const.c3 diff --git a/test/test_suite14/arrays/global_init.c3t b/test/test_suite14/arrays/global_init.c3t new file mode 100644 index 000000000..23b6868f6 --- /dev/null +++ b/test/test_suite14/arrays/global_init.c3t @@ -0,0 +1,71 @@ +// #target: macos-x64 +module test; + +int* foo = &&3; + +int a; +int c; +int d; +int[3] abc; +int *b = (&((&a + 1)[2]) + 1 - 2) + 5; +int *bf = &abc[2] + 2; +int *bf2 = &abc[2]; +int *bf3 = &abc[2] + 2; + +fn void main() { + int *bf34 = (&abc[2] + 2) + 3; + static variant[3] x = { &&42, &&'c', &&"for" }; + variant[3] y = { &&42, &&'c', &&"for" }; +} + +/* #expect: test.ll + +@.taddr = private global i32 3, align 4 +@test_foo = local_unnamed_addr global i32* @.taddr, align 8 +@test_a = global i32 0, align 4 +@test_c = local_unnamed_addr global i32 0, align 4 +@test_d = local_unnamed_addr global i32 0, align 4 +@test_abc = local_unnamed_addr global [3 x i32] zeroinitializer, align 4 +@test_b = local_unnamed_addr global i32* getelementptr (i32, i32* @test_a, i64 7), align 8 +@test_bf = local_unnamed_addr global i32* getelementptr ([3 x i32], [3 x i32]* @test_abc, i64 1, i64 1), align 8 +@test_bf2 = local_unnamed_addr global i32* getelementptr inbounds ([3 x i32], [3 x i32]* @test_abc, i64 0, i64 2), align 8 +@test_bf3 = local_unnamed_addr global i32* getelementptr ([3 x i32], [3 x i32]* @test_abc, i64 1, i64 1), align 8 +@.taddr.9 = private global i32 42, align 4 +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@.taddr.10 = private global i8 99, align 1 +@"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [4 x i8] c"for\00", align 1 +@.taddr.11 = private global [3 x i8]* bitcast ([4 x i8]* @.str to [3 x i8]*), align 8 +@"ct$a3$char" = linkonce constant %.introspect { i8 15, i64 3, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 3, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a3$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a3$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"main$x" = internal unnamed_addr global [3 x %variant] [%variant { i8* bitcast (i32* @.taddr.9 to i8*), i64 ptrtoint (%.introspect* @"ct$int" to i64) }, %variant { i8* @.taddr.10, i64 ptrtoint (%.introspect* @"ct$char" to i64) }, %variant { i8* bitcast ([3 x i8]** @.taddr.11 to i8*), i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64) }], align 16 +@.str.12 = private unnamed_addr constant [4 x i8] c"for\00", align 1 + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %bf34 = alloca i32*, align 8 + %y = alloca [3 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca i8, align 1 + %taddr2 = alloca [3 x i8]*, align 8 + store i32* getelementptr + %0 = getelementptr inbounds [3 x %variant], [3 x %variant]* %y, i64 0, i64 0 + store i32 42, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %3, %variant* %0, align 16 + %4 = getelementptr inbounds [3 x %variant], [3 x %variant]* %y, i64 0, i64 1 + store i8 99, i8* %taddr1, align 1 + %5 = insertvalue %variant undef, i8* %taddr1, 0 + %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + store %variant %6, %variant* %4, align 16 + %7 = getelementptr inbounds [3 x %variant], [3 x %variant]* %y, i64 0, i64 2 + store [3 x i8]* bitcast ([4 x i8]* @.str.12 to [3 x i8]*), [3 x i8]** %taddr2, align 8 + %8 = bitcast [3 x i8]** %taddr2 to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + store %variant %10, %variant* %7, align 16 + ret void +} diff --git a/test/test_suite2/arrays/global_init_array_out_of_range.c3 b/test/test_suite14/arrays/global_init_array_out_of_range.c3 similarity index 100% rename from test/test_suite2/arrays/global_init_array_out_of_range.c3 rename to test/test_suite14/arrays/global_init_array_out_of_range.c3 diff --git a/test/test_suite14/arrays/index_from_back.c3t b/test/test_suite14/arrays/index_from_back.c3t new file mode 100644 index 000000000..7fabb3d9a --- /dev/null +++ b/test/test_suite14/arrays/index_from_back.c3t @@ -0,0 +1,53 @@ +// #target: macos-x64 + +module test; + +fn void test(int[10] x, int[<10>] y) +{ + int a = x[4]; + int b = x[^2]; + int c = y[4]; + int d = y[^2]; + int j = 3; + int e = y[^j]; + int f = x[^j]; +} + +/* #expect: test.ll + +define void @test_test([10 x i32]* byval([10 x i32]) align 8 %0, <10 x i32>* byval(<10 x i32>) align 64 %1) #0 { +entry: + %a = alloca i32, align 4 + %b = alloca i32, align 4 + %c = alloca i32, align 4 + %d = alloca i32, align 4 + %j = alloca i32, align 4 + %e = alloca i32, align 4 + %f = alloca i32, align 4 + %2 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i64 0, i64 4 + %3 = load i32, i32* %2, align 4 + store i32 %3, i32* %a, align 4 + %4 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i64 0, i64 8 + %5 = load i32, i32* %4, align 4 + store i32 %5, i32* %b, align 4 + %6 = load <10 x i32>, <10 x i32>* %1, align 64 + %7 = extractelement <10 x i32> %6, i64 4 + store i32 %7, i32* %c, align 4 + %8 = load <10 x i32>, <10 x i32>* %1, align 64 + %9 = extractelement <10 x i32> %8, i64 8 + store i32 %9, i32* %d, align 4 + store i32 3, i32* %j, align 4 + %10 = load <10 x i32>, <10 x i32>* %1, align 64 + %11 = load i32, i32* %j, align 4 + %sisiext = sext i32 %11 to i64 + %12 = sub nuw i64 10, %sisiext + %13 = extractelement <10 x i32> %10, i64 %12 + store i32 %13, i32* %e, align 4 + %14 = load i32, i32* %j, align 4 + %sisiext1 = sext i32 %14 to i64 + %15 = sub nuw i64 10, %sisiext1 + %16 = getelementptr inbounds [10 x i32], [10 x i32]* %0, i64 0, i64 %15 + %17 = load i32, i32* %16, align 4 + store i32 %17, i32* %f, align 4 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/arrays/index_into_global.c3t b/test/test_suite14/arrays/index_into_global.c3t similarity index 51% rename from test/test_suite2/arrays/index_into_global.c3t rename to test/test_suite14/arrays/index_into_global.c3t index 8c107bea6..c8c0e2be6 100644 --- a/test/test_suite2/arrays/index_into_global.c3t +++ b/test/test_suite14/arrays/index_into_global.c3t @@ -25,9 +25,9 @@ fn void test_bar(int idx) define void @foo_test_bar(i32 %0) #0 { entry: %sisiext = sext i32 %0 to i64 - %1 = getelementptr inbounds [6 x %Bar], ptr @foo_bar, i64 0, i64 %sisiext - %2 = getelementptr inbounds %Bar, ptr %1, i32 0, i32 0 - store i32 0, ptr %2, align 4 - store i32 %0, ptr @foo_bar, align 4 + %1 = getelementptr inbounds [6 x %Bar], [6 x %Bar]* @foo_bar, i64 0, i64 %sisiext + %2 = getelementptr inbounds %Bar, %Bar* %1, i32 0, i32 0 + store i32 0, i32* %2, align 4 + store i32 %0, i32* getelementptr inbounds ([6 x %Bar], [6 x %Bar]* @foo_bar, i64 0, i64 0, i32 0), align 4 ret void } diff --git a/test/test_suite2/arrays/inferred_array_err.c3 b/test/test_suite14/arrays/inferred_array_err.c3 similarity index 100% rename from test/test_suite2/arrays/inferred_array_err.c3 rename to test/test_suite14/arrays/inferred_array_err.c3 diff --git a/test/test_suite2/arrays/inferred_array_err2.c3 b/test/test_suite14/arrays/inferred_array_err2.c3 similarity index 100% rename from test/test_suite2/arrays/inferred_array_err2.c3 rename to test/test_suite14/arrays/inferred_array_err2.c3 diff --git a/test/test_suite2/arrays/negative_array.c3 b/test/test_suite14/arrays/negative_array.c3 similarity index 100% rename from test/test_suite2/arrays/negative_array.c3 rename to test/test_suite14/arrays/negative_array.c3 diff --git a/test/test_suite2/arrays/slice.c3 b/test/test_suite14/arrays/slice.c3 similarity index 100% rename from test/test_suite2/arrays/slice.c3 rename to test/test_suite14/arrays/slice.c3 diff --git a/test/test_suite2/asm/asm_ops_x64_1.c3t b/test/test_suite14/asm/asm_ops_x64_1.c3t similarity index 100% rename from test/test_suite2/asm/asm_ops_x64_1.c3t rename to test/test_suite14/asm/asm_ops_x64_1.c3t diff --git a/test/test_suite2/asm/asm_ops_x64_2.c3t b/test/test_suite14/asm/asm_ops_x64_2.c3t similarity index 100% rename from test/test_suite2/asm/asm_ops_x64_2.c3t rename to test/test_suite14/asm/asm_ops_x64_2.c3t diff --git a/test/test_suite14/asm/asm_regression.c3t b/test/test_suite14/asm/asm_regression.c3t new file mode 100644 index 000000000..2296afcb8 --- /dev/null +++ b/test/test_suite14/asm/asm_regression.c3t @@ -0,0 +1,50 @@ +// #target: macos-x64 + +module test; +import std::io; +fn void main() +{ + int x = 222; + int y = 223; + long z = 0; + z = x + y; + z *= x; + int g = 0; + int* gp = &g; + int[4] a = { 3, 4, 5, 6 }; + int* xa = &a; + usz asf = 1; + int aa = 3; + asm + { + + movl x, 4; + movl [gp], x; + movl x, 1; + movl [xa + asf * 4 + 4], x; + movl $eax, (23 + x); + movl x, $eax; + movq [&z], 33; + addl aa, 22; + } + io::printfn("aa: %d", aa); + io::printfn("Z: %d", z); + io::printfn("x: %d", x); + io::printfn("G was: %d", g); + foreach(int abc : a) io::printfn("%d", abc); + +} + +/* #expect: test.ll + + %5 = load i32*, i32** %gp, align 8 + %6 = load i32*, i32** %xa, align 8 + %7 = load i64, i64* %asf, align 8 + %8 = load i32, i32* %x, align 4 + %add3 = add i32 23, %8 + %9 = load i32, i32* %aa, align 4 + %10 = call { i32, i32 } asm alignstack "movl $$4, $0\0Amovl $0, ($3)\0Amovl $$1, $0\0Amovl $0, 4($4,$5,4)\0Amovl $6, %eax\0Amovl %eax, $0\0Amovq $$33, $1\0Aaddl $$22, $2\0A", "=&r,=*&m,=r,r,r,r,r,2,~{cc},~{rax},~{flags},~{dirflag},~{fspr}" + %11 = extractvalue { i32, i32 } %10, 0 + store i32 %11, i32* %x, align 4 + %12 = extractvalue { i32, i32 } %10, 1 + store i32 %12, i32* %aa, align 4 diff --git a/test/test_suite2/assert/assert_variants.c3t b/test/test_suite14/assert/assert_variants.c3t similarity index 74% rename from test/test_suite2/assert/assert_variants.c3t rename to test/test_suite14/assert/assert_variants.c3t index f9f8a5a32..10e42aae6 100644 --- a/test/test_suite2/assert/assert_variants.c3t +++ b/test/test_suite14/assert/assert_variants.c3t @@ -25,37 +25,37 @@ fn void test() %y = alloca i32, align 4 %z = alloca i32, align 4 %0 = call i32 @assert_variants_foo() - store i32 %0, ptr %x, align 4 + store i32 %0, i32* %x, align 4 %1 = call i32 @assert_variants_foo() - store i32 %1, ptr %y, align 4 + store i32 %1, i32* %y, align 4 %2 = call i32 @assert_variants_foo() - store i32 %2, ptr %z, align 4 - %3 = load i32, ptr %x, align 4 + store i32 %2, i32* %z, align 4 + %3 = load i32, i32* %x, align 4 %gt = icmp sgt i32 %3, 0 call void @llvm.assume(i1 %gt) - %4 = load i32, ptr %y, align 4 + %4 = load i32, i32* %y, align 4 %gt1 = icmp sgt i32 %4, 0 call void @llvm.assume(i1 %gt1) - %5 = load i32, ptr %z, align 4 + %5 = load i32, i32* %z, align 4 %gt2 = icmp sgt i32 %5, 0 call void @llvm.assume(i1 %gt2) - %6 = load i32, ptr %x, align 4 + %6 = load i32, i32* %x, align 4 %gt3 = icmp sgt i32 %6, 0 call void @llvm.assume(i1 %gt3) - %7 = load i32, ptr %y, align 4 + %7 = load i32, i32* %y, align 4 %gt4 = icmp sgt i32 %7, 0 call void @llvm.assume(i1 %gt4) - %8 = load i32, ptr %z, align 4 + %8 = load i32, i32* %z, align 4 %gt5 = icmp sgt i32 %8, 0 call void @llvm.assume(i1 %gt5) - %9 = load i32, ptr %x, align 4 + %9 = load i32, i32* %x, align 4 %gt6 = icmp sgt i32 %9, 0 call void @llvm.assume(i1 %gt6) - %10 = load i32, ptr %x, align 4 + %10 = load i32, i32* %x, align 4 %lt = icmp slt i32 %10, 1 %not = xor i1 %lt, true call void @llvm.assume(i1 %not) - %11 = load i32, ptr %y, align 4 + %11 = load i32, i32* %y, align 4 %lt7 = icmp slt i32 %11, 1 %not8 = xor i1 %lt7, true call void @llvm.assume(i1 %not8) diff --git a/test/test_suite2/assert/global_static_assert_not_constant.c3 b/test/test_suite14/assert/global_static_assert_not_constant.c3 similarity index 100% rename from test/test_suite2/assert/global_static_assert_not_constant.c3 rename to test/test_suite14/assert/global_static_assert_not_constant.c3 diff --git a/test/test_suite2/assert/local_static_assert_not_constant.c3 b/test/test_suite14/assert/local_static_assert_not_constant.c3 similarity index 100% rename from test/test_suite2/assert/local_static_assert_not_constant.c3 rename to test/test_suite14/assert/local_static_assert_not_constant.c3 diff --git a/test/test_suite2/assert/static_assert.c3 b/test/test_suite14/assert/static_assert.c3 similarity index 100% rename from test/test_suite2/assert/static_assert.c3 rename to test/test_suite14/assert/static_assert.c3 diff --git a/test/test_suite2/assert/unreachable.c3t b/test/test_suite14/assert/unreachable.c3t similarity index 53% rename from test/test_suite2/assert/unreachable.c3t rename to test/test_suite14/assert/unreachable.c3t index 48eb633e5..774891b82 100644 --- a/test/test_suite2/assert/unreachable.c3t +++ b/test/test_suite14/assert/unreachable.c3t @@ -19,8 +19,8 @@ define void @unreachable_test() #0 { entry: %x = alloca i32, align 4 %0 = call i32 @unreachable_foo() - store i32 %0, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %0, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 %gt = icmp sgt i32 %1, 0 br i1 %gt, label %if.then, label %if.exit @@ -28,14 +28,13 @@ if.then: ; preds = %entry ret void if.exit: ; preds = %entry - %2 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %2(ptr @.str, i64 30, ptr @.str.1, i64 14, ptr @.str.2, i64 4, i32 10) + %2 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %2(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i32 0, i32 0), i64 30, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0), i64 14, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i64 4, i32 10) unreachable after.unreachable: ; No predecessors! - %3 = load i32, ptr %x, align 4 + %3 = load i32, i32* %x, align 4 %add = add i32 %3, 1 - store i32 %add, ptr %x, align 4 + store i32 %add, i32* %x, align 4 ret void -} - +} \ No newline at end of file diff --git a/test/test_suite14/assignment/int_assign.c3t b/test/test_suite14/assignment/int_assign.c3t new file mode 100644 index 000000000..0160df514 --- /dev/null +++ b/test/test_suite14/assignment/int_assign.c3t @@ -0,0 +1,69 @@ +module test; + +fn int foo() +{ + int x = 0; + int y; + x += y; + x -= y; + x %= y; + x /= y; + x *= y; + x <<= y; + x >>= y; + x ^= y; + x |= y; + x &= y; + return x; +} + + +// #expect: test.ll + + %x = alloca i32, align 4 + %y = alloca i32, align 4 + store i32 0, i32* %x, align 4 + store i32 0, i32* %y, align 4 + %0 = load i32, i32* %x, align 4 + %1 = load i32, i32* %y, align 4 + %add = add i32 %0, %1 + store i32 %add, i32* %x, align 4 + %2 = load i32, i32* %x, align 4 + %3 = load i32, i32* %y, align 4 + %sub = sub i32 %2, %3 + store i32 %sub, i32* %x, align 4 + %4 = load i32, i32* %x, align 4 + %5 = load i32, i32* %y, align 4 + %smod = srem i32 %4, %5 + store i32 %smod, i32* %x, align 4 + %6 = load i32, i32* %x, align 4 + %7 = load i32, i32* %y, align 4 + %sdiv = sdiv i32 %6, %7 + store i32 %sdiv, i32* %x, align 4 + %8 = load i32, i32* %x, align 4 + %9 = load i32, i32* %y, align 4 + %mul = mul i32 %8, %9 + store i32 %mul, i32* %x, align 4 + %10 = load i32, i32* %x, align 4 + %11 = load i32, i32* %y, align 4 + %shl = shl i32 %10, %11 + %12 = freeze i32 %shl + store i32 %12, i32* %x, align 4 + %13 = load i32, i32* %x, align 4 + %14 = load i32, i32* %y, align 4 + %ashr = ashr i32 %13, %14 + %15 = freeze i32 %ashr + store i32 %15, i32* %x, align 4 + %16 = load i32, i32* %x, align 4 + %17 = load i32, i32* %y, align 4 + %xor = xor i32 %16, %17 + store i32 %xor, i32* %x, align 4 + %18 = load i32, i32* %x, align 4 + %19 = load i32, i32* %y, align 4 + %or = or i32 %18, %19 + store i32 %or, i32* %x, align 4 + %20 = load i32, i32* %x, align 4 + %21 = load i32, i32* %y, align 4 + %and = and i32 %20, %21 + store i32 %and, i32* %x, align 4 + %22 = load i32, i32* %x, align 4 diff --git a/test/test_suite2/assignment/var_variable.c3t b/test/test_suite14/assignment/var_variable.c3t similarity index 100% rename from test/test_suite2/assignment/var_variable.c3t rename to test/test_suite14/assignment/var_variable.c3t diff --git a/test/test_suite2/attributes/attribute_visibility.c3t b/test/test_suite14/attributes/attribute_visibility.c3t similarity index 100% rename from test/test_suite2/attributes/attribute_visibility.c3t rename to test/test_suite14/attributes/attribute_visibility.c3t diff --git a/test/test_suite2/attributes/recursive_attributes.c3 b/test/test_suite14/attributes/recursive_attributes.c3 similarity index 55% rename from test/test_suite2/attributes/recursive_attributes.c3 rename to test/test_suite14/attributes/recursive_attributes.c3 index f3e6a9a0b..82ef26716 100644 --- a/test/test_suite2/attributes/recursive_attributes.c3 +++ b/test/test_suite14/attributes/recursive_attributes.c3 @@ -1,7 +1,10 @@ module test; define @Align(y) = @Align16(y / 2); +// This one is directly recursive define @Align16(x) = @align(4), @Align(8 * x); // #error: Recursive declaration of attribute +// This one uses a recursive attribute +define @AlignIndirect(x) = @Align16(x); // #error: Recursive declaration of attribute define @Test = @noinline; struct Foo { @@ -15,3 +18,8 @@ fn void testme() @Test { int x; } + +struct Bar +{ + int abc @AlignIndirect(8); +} \ No newline at end of file diff --git a/test/test_suite2/attributes/user_defined_attributes.c3t b/test/test_suite14/attributes/user_defined_attributes.c3t similarity index 95% rename from test/test_suite2/attributes/user_defined_attributes.c3t rename to test/test_suite14/attributes/user_defined_attributes.c3t index bb957cc49..b55335e62 100644 --- a/test/test_suite2/attributes/user_defined_attributes.c3t +++ b/test/test_suite14/attributes/user_defined_attributes.c3t @@ -34,7 +34,7 @@ fn void main() @TestZero define void @test_testme() #0 { entry: %x = alloca i32, align 4 - store i32 0, ptr %x, align 4 + store i32 0, i32* %x, align 4 ret void } diff --git a/test/test_suite2/bitstruct/address_of_bitstruct.c3 b/test/test_suite14/bitstruct/address_of_bitstruct.c3 similarity index 100% rename from test/test_suite2/bitstruct/address_of_bitstruct.c3 rename to test/test_suite14/bitstruct/address_of_bitstruct.c3 diff --git a/test/test_suite2/bitstruct/array_with_boolean.c3t b/test/test_suite14/bitstruct/array_with_boolean.c3t similarity index 54% rename from test/test_suite2/bitstruct/array_with_boolean.c3t rename to test/test_suite14/bitstruct/array_with_boolean.c3t index 9f5c4224c..8437695c6 100644 --- a/test/test_suite2/bitstruct/array_with_boolean.c3t +++ b/test/test_suite14/bitstruct/array_with_boolean.c3t @@ -27,45 +27,45 @@ define void @foo_main() #0 { entry: %xx = alloca [3 x i8], align 1 %xy = alloca [3 x i8], align 1 - store [3 x i8] c"\1A\1E\08", ptr %xx, align 1 - store [3 x i8] c"\1A\1E\10", ptr %xy, align 1 - %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %1 = load i8, ptr %0, align 1 + store [3 x i8] c"\1A\1E\08", [3 x i8]* %xx, align 1 + store [3 x i8] c"\1A\1E\10", [3 x i8]* %xy, align 1 + %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %1 = load i8, i8* %0, align 1 %zext = zext i8 %1 to i32 %shl = shl i32 %zext, 29 %ashr = ashr i32 %shl, 29 - %2 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %3 = load i8, ptr %2, align 1 + %2 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %3 = load i8, i8* %2, align 1 %zext1 = zext i8 %3 to i32 %lshrl = lshr i32 %zext1, 3 - %4 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %5 = load i8, ptr %4, align 1 + %4 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %5 = load i8, i8* %4, align 1 %zext2 = zext i8 %5 to i32 %shl3 = shl i32 %zext2, 5 %6 = or i32 %shl3, %lshrl %shl4 = shl i32 %6, 26 %ashr5 = ashr i32 %shl4, 26 - %7 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %8 = load i8, ptr %7, align 1 + %7 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %8 = load i8, i8* %7, align 1 %zext6 = zext i8 %8 to i32 %lshrl7 = lshr i32 %zext6, 1 - %9 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %10 = load i8, ptr %9, align 1 + %9 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %10 = load i8, i8* %9, align 1 %zext8 = zext i8 %10 to i32 %shl9 = shl i32 %zext8, 7 %11 = or i32 %shl9, %lshrl7 %shl10 = shl i32 %11, 22 %ashr11 = ashr i32 %shl10, 22 - %12 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %13 = load i8, ptr %12, align 1 + %12 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %13 = load i8, i8* %12, align 1 %lshrl12 = lshr i8 %13, 3 %14 = trunc i8 %lshrl12 to i1 %boolsi = zext i1 %14 to i32 - %15 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %16 = load i8, ptr %15, align 1 + %15 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %16 = load i8, i8* %15, align 1 %lshrl13 = lshr i8 %16, 4 %17 = trunc i8 %lshrl13 to i1 %boolsi14 = zext i1 %17 to i32 - call void (ptr, ...) @printf(ptr @.str, i32 %ashr, i32 %ashr5, i32 %ashr11, i32 %boolsi, i32 %boolsi14) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i32 0, i32 0), i32 %ashr, i32 %ashr5, i32 %ashr11, i32 %boolsi, i32 %boolsi14) ret void } \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitfield_access.c3t b/test/test_suite14/bitstruct/bitfield_access.c3t similarity index 53% rename from test/test_suite2/bitstruct/bitfield_access.c3t rename to test/test_suite14/bitstruct/bitfield_access.c3t index b22e6e031..65c190e9e 100644 --- a/test/test_suite2/bitstruct/bitfield_access.c3t +++ b/test/test_suite14/bitstruct/bitfield_access.c3t @@ -111,70 +111,70 @@ entry: %z2 = alloca [3 x i8], align 1 %z3 = alloca [3 x i8], align 1 %xx = alloca [5 x i8], align 1 - store i8 115, ptr %b, align 1 - store i16 5, ptr %c1, align 2 - store i16 96, ptr %c2, align 2 - store i16 18432, ptr %c3, align 2 - store i16 18683, ptr %c4, align 2 - store i16 27, ptr %c5, align 2 - store i16 5, ptr %c6, align 2 - store i16 10240, ptr %c7, align 2 - store [3 x i8] c"\0B\06 ", ptr %e1, align 1 - store [3 x i8] c"\09\06 ", ptr %e2, align 1 - store [3 x i8] c"\0A\06 ", ptr %e3, align 1 - store i8 0, ptr %d, align 1 - %0 = getelementptr inbounds [3 x i8], ptr %e1, i64 0, i64 0 - %1 = load i8, ptr %0, align 1 + store i8 115, i8* %b, align 1 + store i16 5, i16* %c1, align 2 + store i16 96, i16* %c2, align 2 + store i16 18432, i16* %c3, align 2 + store i16 18683, i16* %c4, align 2 + store i16 27, i16* %c5, align 2 + store i16 5, i16* %c6, align 2 + store i16 10240, i16* %c7, align 2 + store [3 x i8] c"\0B\06 ", [3 x i8]* %e1, align 1 + store [3 x i8] c"\09\06 ", [3 x i8]* %e2, align 1 + store [3 x i8] c"\0A\06 ", [3 x i8]* %e3, align 1 + store i8 0, i8* %d, align 1 + %0 = getelementptr inbounds [3 x i8], [3 x i8]* %e1, i64 0, i64 0 + %1 = load i8, i8* %0, align 1 %zext = zext i8 %1 to i32 %shl = shl i32 %zext, 29 %ashr = ashr i32 %shl, 29 - call void (ptr, ...) @printf(ptr @.str, i32 %ashr) - %2 = getelementptr inbounds [3 x i8], ptr %e2, i64 0, i64 0 - %3 = load i8, ptr %2, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) + %2 = getelementptr inbounds [3 x i8], [3 x i8]* %e2, i64 0, i64 0 + %3 = load i8, i8* %2, align 1 %zext1 = zext i8 %3 to i32 %shl2 = shl i32 %zext1, 29 %ashr3 = ashr i32 %shl2, 29 - call void (ptr, ...) @printf(ptr @.str.1, i32 %ashr3) - %4 = getelementptr inbounds [3 x i8], ptr %e3, i64 0, i64 0 - %5 = load i8, ptr %4, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr3) + %4 = getelementptr inbounds [3 x i8], [3 x i8]* %e3, i64 0, i64 0 + %5 = load i8, i8* %4, align 1 %zext4 = zext i8 %5 to i32 %shl5 = shl i32 %zext4, 29 %ashr6 = ashr i32 %shl5, 29 - call void (ptr, ...) @printf(ptr @.str.2, i32 %ashr6) - store [3 x i8] c"\0B\06 ", ptr %z1, align 1 - store [3 x i8] c"\0C\06 ", ptr %z2, align 1 - store [3 x i8] c"\0F\06 ", ptr %z3, align 1 - %6 = getelementptr inbounds [3 x i8], ptr %z1, i64 0, i64 0 - %7 = load i8, ptr %6, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %ashr6) + store [3 x i8] c"\0B\06 ", [3 x i8]* %z1, align 1 + store [3 x i8] c"\0C\06 ", [3 x i8]* %z2, align 1 + store [3 x i8] c"\0F\06 ", [3 x i8]* %z3, align 1 + %6 = getelementptr inbounds [3 x i8], [3 x i8]* %z1, i64 0, i64 0 + %7 = load i8, i8* %6, align 1 %zext7 = zext i8 %7 to i32 %8 = and i32 7, %zext7 - call void (ptr, ...) @printf(ptr @.str.3, i32 %8) - %9 = getelementptr inbounds [3 x i8], ptr %z2, i64 0, i64 0 - %10 = load i8, ptr %9, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %8) + %9 = getelementptr inbounds [3 x i8], [3 x i8]* %z2, i64 0, i64 0 + %10 = load i8, i8* %9, align 1 %zext8 = zext i8 %10 to i32 %11 = and i32 7, %zext8 - call void (ptr, ...) @printf(ptr @.str.4, i32 %11) - %12 = getelementptr inbounds [3 x i8], ptr %z3, i64 0, i64 0 - %13 = load i8, ptr %12, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), i32 %11) + %12 = getelementptr inbounds [3 x i8], [3 x i8]* %z3, i64 0, i64 0 + %13 = load i8, i8* %12, align 1 %zext9 = zext i8 %13 to i32 %14 = and i32 7, %zext9 - call void (ptr, ...) @printf(ptr @.str.5, i32 %14) - store [5 x i8] c"\00G\02\00\00", ptr %xx, align 1 - %15 = getelementptr inbounds [5 x i8], ptr %xx, i64 0, i64 0 - %16 = load i8, ptr %15, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), i32 %14) + store [5 x i8] c"\00G\02\00\00", [5 x i8]* %xx, align 1 + %15 = getelementptr inbounds [5 x i8], [5 x i8]* %xx, i64 0, i64 0 + %16 = load i8, i8* %15, align 1 %zext10 = zext i8 %16 to i32 %lshrl = lshr i32 %zext10, 5 - %17 = getelementptr inbounds [5 x i8], ptr %xx, i64 0, i64 1 - %18 = load i8, ptr %17, align 1 + %17 = getelementptr inbounds [5 x i8], [5 x i8]* %xx, i64 0, i64 1 + %18 = load i8, i8* %17, align 1 %zext11 = zext i8 %18 to i32 %shl12 = shl i32 %zext11, 3 %19 = or i32 %shl12, %lshrl - %20 = getelementptr inbounds [5 x i8], ptr %xx, i64 0, i64 2 - %21 = load i8, ptr %20, align 1 + %20 = getelementptr inbounds [5 x i8], [5 x i8]* %xx, i64 0, i64 2 + %21 = load i8, i8* %20, align 1 %zext13 = zext i8 %21 to i32 %shl14 = shl i32 %zext13, 11 %22 = or i32 %shl14, %19 %23 = and i32 262143, %22 - call void (ptr, ...) @printf(ptr @.str.6, i32 %23) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.6, i32 0, i32 0), i32 %23) ret void } \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitstruct_access_signed.c3t b/test/test_suite14/bitstruct/bitstruct_access_signed.c3t similarity index 50% rename from test/test_suite2/bitstruct/bitstruct_access_signed.c3t rename to test/test_suite14/bitstruct/bitstruct_access_signed.c3t index 3475821f5..d769244ab 100644 --- a/test/test_suite2/bitstruct/bitstruct_access_signed.c3t +++ b/test/test_suite14/bitstruct/bitstruct_access_signed.c3t @@ -34,58 +34,58 @@ define void @foo_main() #0 { entry: %xx = alloca [3 x i8], align 1 %xxu = alloca [3 x i8], align 1 - store [3 x i8] c"\E0\FD\7F", ptr %xx, align 1 - %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %1 = load i8, ptr %0, align 1 + store [3 x i8] c"\E0\FD\7F", [3 x i8]* %xx, align 1 + %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %1 = load i8, i8* %0, align 1 %zext = zext i8 %1 to i32 %lshrl = lshr i32 %zext, 5 - %2 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %3 = load i8, ptr %2, align 1 + %2 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %3 = load i8, i8* %2, align 1 %zext1 = zext i8 %3 to i32 %shl = shl i32 %zext1, 3 %4 = or i32 %shl, %lshrl - %5 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %6 = load i8, ptr %5, align 1 + %5 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %6 = load i8, i8* %5, align 1 %zext2 = zext i8 %6 to i32 %shl3 = shl i32 %zext2, 11 %7 = or i32 %shl3, %4 %shl4 = shl i32 %7, 14 %ashr = ashr i32 %shl4, 14 - call void (ptr, ...) @printf(ptr @.str, i32 %ashr) - store [3 x i8] c"\FF\FD\FF", ptr %xx, align 1 - %8 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %9 = load i8, ptr %8, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) + store [3 x i8] c"\FF\FD\FF", [3 x i8]* %xx, align 1 + %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %9 = load i8, i8* %8, align 1 %zext5 = zext i8 %9 to i32 %lshrl6 = lshr i32 %zext5, 5 - %10 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %11 = load i8, ptr %10, align 1 + %10 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %11 = load i8, i8* %10, align 1 %zext7 = zext i8 %11 to i32 %shl8 = shl i32 %zext7, 3 %12 = or i32 %shl8, %lshrl6 - %13 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %14 = load i8, ptr %13, align 1 + %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %14 = load i8, i8* %13, align 1 %zext9 = zext i8 %14 to i32 %shl10 = shl i32 %zext9, 11 %15 = or i32 %shl10, %12 %shl11 = shl i32 %15, 14 %ashr12 = ashr i32 %shl11, 14 - call void (ptr, ...) @printf(ptr @.str.1, i32 %ashr12) - store [3 x i8] c"\1F\CF\AA", ptr %xxu, align 1 - %16 = getelementptr inbounds [3 x i8], ptr %xxu, i64 0, i64 0 - %17 = load i8, ptr %16, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr12) + store [3 x i8] c"\1F\CF\AA", [3 x i8]* %xxu, align 1 + %16 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 0 + %17 = load i8, i8* %16, align 1 %zext13 = zext i8 %17 to i32 %lshrl14 = lshr i32 %zext13, 5 - %18 = getelementptr inbounds [3 x i8], ptr %xxu, i64 0, i64 1 - %19 = load i8, ptr %18, align 1 + %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 1 + %19 = load i8, i8* %18, align 1 %zext15 = zext i8 %19 to i32 %shl16 = shl i32 %zext15, 3 %20 = or i32 %shl16, %lshrl14 - %21 = getelementptr inbounds [3 x i8], ptr %xxu, i64 0, i64 2 - %22 = load i8, ptr %21, align 1 + %21 = getelementptr inbounds [3 x i8], [3 x i8]* %xxu, i64 0, i64 2 + %22 = load i8, i8* %21, align 1 %zext17 = zext i8 %22 to i32 %shl18 = shl i32 %zext17, 11 %23 = or i32 %shl18, %20 %24 = and i32 262143, %23 - call void (ptr, ...) @printf(ptr @.str.2, i32 %24) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %24) ret void } diff --git a/test/test_suite2/bitstruct/bitstruct_arrays.c3t b/test/test_suite14/bitstruct/bitstruct_arrays.c3t similarity index 50% rename from test/test_suite2/bitstruct/bitstruct_arrays.c3t rename to test/test_suite14/bitstruct/bitstruct_arrays.c3t index 066ba1e77..e661e9837 100644 --- a/test/test_suite2/bitstruct/bitstruct_arrays.c3t +++ b/test/test_suite14/bitstruct/bitstruct_arrays.c3t @@ -122,213 +122,222 @@ fn void test3() /* #expect: foo.ll +define void @foo_main() #0 { +entry: + call void @foo_test1() + call void @foo_test2() + call void @foo_test3() + ret void +} + +; Function Attrs: nounwind define void @foo_test1() #0 { entry: %xx = alloca i64, align 8 - store i64 531994, ptr %xx, align 8 - %0 = load i64, ptr %xx, align 8 + store i64 531994, i64* %xx, align 8 + %0 = load i64, i64* %xx, align 8 %1 = and i64 %0, -8 %2 = or i64 %1, 3 - store i64 %2, ptr %xx, align 8 - %3 = load i64, ptr %xx, align 8 + store i64 %2, i64* %xx, align 8 + %3 = load i64, i64* %xx, align 8 %shl = shl i64 %3, 61 %ashr = ashr i64 %shl, 61 %4 = trunc i64 %ashr to i32 - %5 = load i64, ptr %xx, align 8 + %5 = load i64, i64* %xx, align 8 %shl1 = shl i64 %5, 55 %ashr2 = ashr i64 %shl1, 58 %6 = trunc i64 %ashr2 to i32 - call void (ptr, ...) @printf(ptr @.str, i32 %4, i32 %6) - %7 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 %4, i32 %6) + %7 = load i64, i64* %xx, align 8 %shl3 = shl i64 %7, 61 %ashr4 = ashr i64 %shl3, 61 %8 = trunc i64 %ashr4 to i32 %sub = sub i32 %8, 1 - %9 = load i64, ptr %xx, align 8 + %9 = load i64, i64* %xx, align 8 %zext = zext i32 %sub to i64 %10 = and i64 %zext, 7 %11 = and i64 %9, -8 %12 = or i64 %11, %10 - store i64 %12, ptr %xx, align 8 - %13 = load i64, ptr %xx, align 8 + store i64 %12, i64* %xx, align 8 + %13 = load i64, i64* %xx, align 8 %shl5 = shl i64 %13, 61 %ashr6 = ashr i64 %shl5, 61 %14 = trunc i64 %ashr6 to i32 - %15 = load i64, ptr %xx, align 8 + %15 = load i64, i64* %xx, align 8 %shl7 = shl i64 %15, 55 %ashr8 = ashr i64 %shl7, 58 %16 = trunc i64 %ashr8 to i32 - call void (ptr, ...) @printf(ptr @.str.1, i32 %14, i32 %16) - %17 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %14, i32 %16) + %17 = load i64, i64* %xx, align 8 %shl9 = shl i64 %17, 55 %ashr10 = ashr i64 %shl9, 58 %18 = trunc i64 %ashr10 to i32 %mul = mul i32 %18, 2 - %19 = load i64, ptr %xx, align 8 + %19 = load i64, i64* %xx, align 8 %zext11 = zext i32 %mul to i64 %shl12 = shl i64 %zext11, 3 %20 = and i64 %shl12, 504 %21 = and i64 %19, -505 %22 = or i64 %21, %20 - store i64 %22, ptr %xx, align 8 - %23 = load i64, ptr %xx, align 8 + store i64 %22, i64* %xx, align 8 + %23 = load i64, i64* %xx, align 8 %shl13 = shl i64 %23, 61 %ashr14 = ashr i64 %shl13, 61 %24 = trunc i64 %ashr14 to i32 - %25 = load i64, ptr %xx, align 8 + %25 = load i64, i64* %xx, align 8 %shl15 = shl i64 %25, 55 %ashr16 = ashr i64 %shl15, 58 %26 = trunc i64 %ashr16 to i32 - call void (ptr, ...) @printf(ptr @.str.2, i32 %24, i32 %26) - %27 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 %24, i32 %26) + %27 = load i64, i64* %xx, align 8 %shl17 = shl i64 %27, 55 %ashr18 = ashr i64 %shl17, 58 %28 = trunc i64 %ashr18 to i32 %xor = xor i32 %28, 4 - %29 = load i64, ptr %xx, align 8 + %29 = load i64, i64* %xx, align 8 %zext19 = zext i32 %xor to i64 %shl20 = shl i64 %zext19, 3 %30 = and i64 %shl20, 504 %31 = and i64 %29, -505 %32 = or i64 %31, %30 - store i64 %32, ptr %xx, align 8 - %33 = load i64, ptr %xx, align 8 + store i64 %32, i64* %xx, align 8 + %33 = load i64, i64* %xx, align 8 %shl21 = shl i64 %33, 61 %ashr22 = ashr i64 %shl21, 61 %34 = trunc i64 %ashr22 to i32 - %35 = load i64, ptr %xx, align 8 + %35 = load i64, i64* %xx, align 8 %shl23 = shl i64 %35, 55 %ashr24 = ashr i64 %shl23, 58 %36 = trunc i64 %ashr24 to i32 - call void (ptr, ...) @printf(ptr @.str.3, i32 %34, i32 %36) - %37 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i32 0, i32 0), i32 %34, i32 %36) + %37 = load i64, i64* %xx, align 8 %shl25 = shl i64 %37, 55 %ashr26 = ashr i64 %shl25, 58 %38 = trunc i64 %ashr26 to i32 %or = or i32 %38, 4 - %39 = load i64, ptr %xx, align 8 + %39 = load i64, i64* %xx, align 8 %zext27 = zext i32 %or to i64 %shl28 = shl i64 %zext27, 3 %40 = and i64 %shl28, 504 %41 = and i64 %39, -505 %42 = or i64 %41, %40 - store i64 %42, ptr %xx, align 8 - %43 = load i64, ptr %xx, align 8 + store i64 %42, i64* %xx, align 8 + %43 = load i64, i64* %xx, align 8 %shl29 = shl i64 %43, 61 %ashr30 = ashr i64 %shl29, 61 %44 = trunc i64 %ashr30 to i32 - %45 = load i64, ptr %xx, align 8 + %45 = load i64, i64* %xx, align 8 %shl31 = shl i64 %45, 55 %ashr32 = ashr i64 %shl31, 58 %46 = trunc i64 %ashr32 to i32 - call void (ptr, ...) @printf(ptr @.str.4, i32 %44, i32 %46) - %47 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i32 0, i32 0), i32 %44, i32 %46) + %47 = load i64, i64* %xx, align 8 %shl33 = shl i64 %47, 55 %ashr34 = ashr i64 %shl33, 58 %48 = trunc i64 %ashr34 to i32 %shl35 = shl i32 %48, 1 %49 = freeze i32 %shl35 - %50 = load i64, ptr %xx, align 8 + %50 = load i64, i64* %xx, align 8 %zext36 = zext i32 %49 to i64 %shl37 = shl i64 %zext36, 3 %51 = and i64 %shl37, 504 %52 = and i64 %50, -505 %53 = or i64 %52, %51 - store i64 %53, ptr %xx, align 8 - %54 = load i64, ptr %xx, align 8 + store i64 %53, i64* %xx, align 8 + %54 = load i64, i64* %xx, align 8 %shl38 = shl i64 %54, 61 %ashr39 = ashr i64 %shl38, 61 %55 = trunc i64 %ashr39 to i32 - %56 = load i64, ptr %xx, align 8 + %56 = load i64, i64* %xx, align 8 %shl40 = shl i64 %56, 55 %ashr41 = ashr i64 %shl40, 58 %57 = trunc i64 %ashr41 to i32 - call void (ptr, ...) @printf(ptr @.str.5, i32 %55, i32 %57) - %58 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i32 0, i32 0), i32 %55, i32 %57) + %58 = load i64, i64* %xx, align 8 %shl42 = shl i64 %58, 55 %ashr43 = ashr i64 %shl42, 58 %59 = trunc i64 %ashr43 to i32 %ashr44 = ashr i32 %59, 1 %60 = freeze i32 %ashr44 - %61 = load i64, ptr %xx, align 8 + %61 = load i64, i64* %xx, align 8 %zext45 = zext i32 %60 to i64 %shl46 = shl i64 %zext45, 3 %62 = and i64 %shl46, 504 %63 = and i64 %61, -505 %64 = or i64 %63, %62 - store i64 %64, ptr %xx, align 8 - %65 = load i64, ptr %xx, align 8 + store i64 %64, i64* %xx, align 8 + %65 = load i64, i64* %xx, align 8 %shl47 = shl i64 %65, 61 %ashr48 = ashr i64 %shl47, 61 %66 = trunc i64 %ashr48 to i32 - %67 = load i64, ptr %xx, align 8 + %67 = load i64, i64* %xx, align 8 %shl49 = shl i64 %67, 55 %ashr50 = ashr i64 %shl49, 58 %68 = trunc i64 %ashr50 to i32 - call void (ptr, ...) @printf(ptr @.str.6, i32 %66, i32 %68) - %69 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0), i32 %66, i32 %68) + %69 = load i64, i64* %xx, align 8 %shl51 = shl i64 %69, 55 %ashr52 = ashr i64 %shl51, 58 %70 = trunc i64 %ashr52 to i32 %sdiv = sdiv i32 %70, 2 - %71 = load i64, ptr %xx, align 8 + %71 = load i64, i64* %xx, align 8 %zext53 = zext i32 %sdiv to i64 %shl54 = shl i64 %zext53, 3 %72 = and i64 %shl54, 504 %73 = and i64 %71, -505 %74 = or i64 %73, %72 - store i64 %74, ptr %xx, align 8 - %75 = load i64, ptr %xx, align 8 + store i64 %74, i64* %xx, align 8 + %75 = load i64, i64* %xx, align 8 %shl55 = shl i64 %75, 61 %ashr56 = ashr i64 %shl55, 61 %76 = trunc i64 %ashr56 to i32 - %77 = load i64, ptr %xx, align 8 + %77 = load i64, i64* %xx, align 8 %shl57 = shl i64 %77, 55 %ashr58 = ashr i64 %shl57, 58 %78 = trunc i64 %ashr58 to i32 - call void (ptr, ...) @printf(ptr @.str.7, i32 %76, i32 %78) - %79 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.7, i32 0, i32 0), i32 %76, i32 %78) + %79 = load i64, i64* %xx, align 8 %shl59 = shl i64 %79, 55 %ashr60 = ashr i64 %shl59, 58 %80 = trunc i64 %ashr60 to i32 %smod = srem i32 %80, 2 - %81 = load i64, ptr %xx, align 8 + %81 = load i64, i64* %xx, align 8 %zext61 = zext i32 %smod to i64 %shl62 = shl i64 %zext61, 3 %82 = and i64 %shl62, 504 %83 = and i64 %81, -505 %84 = or i64 %83, %82 - store i64 %84, ptr %xx, align 8 - %85 = load i64, ptr %xx, align 8 + store i64 %84, i64* %xx, align 8 + %85 = load i64, i64* %xx, align 8 %shl63 = shl i64 %85, 61 %ashr64 = ashr i64 %shl63, 61 %86 = trunc i64 %ashr64 to i32 - %87 = load i64, ptr %xx, align 8 + %87 = load i64, i64* %xx, align 8 %shl65 = shl i64 %87, 55 %ashr66 = ashr i64 %shl65, 58 %88 = trunc i64 %ashr66 to i32 - call void (ptr, ...) @printf(ptr @.str.8, i32 %86, i32 %88) - %89 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), i32 %86, i32 %88) + %89 = load i64, i64* %xx, align 8 %90 = and i64 %89, -1048577 %91 = or i64 %90, 1048576 - store i64 %91, ptr %xx, align 8 - %92 = load i64, ptr %xx, align 8 + store i64 %91, i64* %xx, align 8 + %92 = load i64, i64* %xx, align 8 %lshrl = lshr i64 %92, 20 %93 = and i64 1, %lshrl %ztrunc = trunc i64 %93 to i8 %94 = trunc i8 %ztrunc to i1 %boolsi = zext i1 %94 to i32 - call void (ptr, ...) @printf(ptr @.str.9, i32 %boolsi) - %95 = load i64, ptr %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.9, i32 0, i32 0), i32 %boolsi) + %95 = load i64, i64* %xx, align 8 %96 = and i64 %95, -1048577 - store i64 %96, ptr %xx, align 8 - %97 = load i64, ptr %xx, align 8 + store i64 %96, i64* %xx, align 8 + %97 = load i64, i64* %xx, align 8 %lshrl67 = lshr i64 %97, 20 %98 = and i64 1, %lshrl67 %ztrunc68 = trunc i64 %98 to i8 %99 = trunc i8 %ztrunc68 to i1 %boolsi69 = zext i1 %99 to i32 - call void (ptr, ...) @printf(ptr @.str.10, i32 %boolsi69) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i32 0, i32 0), i32 %boolsi69) ret void } @@ -336,197 +345,197 @@ entry: define void @foo_test2() #0 { entry: %xx = alloca [3 x i8], align 1 - store [3 x i8] c"\1A\1E\00", ptr %xx, align 1 - %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %1 = load i8, ptr %0, align 1 + store [3 x i8] c"\1A\1E\00", [3 x i8]* %xx, align 1 + %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %1 = load i8, i8* %0, align 1 %2 = and i8 %1, -8 %3 = or i8 %2, 3 - store i8 %2, ptr %0, align 1 - %4 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %5 = load i8, ptr %4, align 1 + store i8 %2, i8* %0, align 1 + %4 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %5 = load i8, i8* %4, align 1 %zext = zext i8 %5 to i32 %shl = shl i32 %zext, 29 %ashr = ashr i32 %shl, 29 - %6 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %7 = load i8, ptr %6, align 1 + %6 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %7 = load i8, i8* %6, align 1 %zext1 = zext i8 %7 to i32 %lshrl = lshr i32 %zext1, 3 - %8 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %9 = load i8, ptr %8, align 1 + %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %9 = load i8, i8* %8, align 1 %zext2 = zext i8 %9 to i32 %shl3 = shl i32 %zext2, 5 %10 = or i32 %shl3, %lshrl %shl4 = shl i32 %10, 26 %ashr5 = ashr i32 %shl4, 26 - call void (ptr, ...) @printf(ptr @.str.11, i32 %ashr, i32 %ashr5) - %11 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %12 = load i8, ptr %11, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.11, i32 0, i32 0), i32 %ashr, i32 %ashr5) + %11 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %12 = load i8, i8* %11, align 1 %zext6 = zext i8 %12 to i32 %shl7 = shl i32 %zext6, 29 %ashr8 = ashr i32 %shl7, 29 %sub = sub i32 %ashr8, 1 - %13 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %ztrunc = trunc i32 %sub to i8 %14 = and i8 %ztrunc, 7 - %15 = load i8, ptr %13, align 1 + %15 = load i8, i8* %13, align 1 %16 = and i8 %15, -8 %17 = or i8 %16, %14 - store i8 %16, ptr %13, align 1 - %18 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %19 = load i8, ptr %18, align 1 + store i8 %16, i8* %13, align 1 + %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %19 = load i8, i8* %18, align 1 %zext9 = zext i8 %19 to i32 %shl10 = shl i32 %zext9, 29 %ashr11 = ashr i32 %shl10, 29 - %20 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %21 = load i8, ptr %20, align 1 + %20 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %21 = load i8, i8* %20, align 1 %zext12 = zext i8 %21 to i32 %lshrl13 = lshr i32 %zext12, 3 - %22 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %23 = load i8, ptr %22, align 1 + %22 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %23 = load i8, i8* %22, align 1 %zext14 = zext i8 %23 to i32 %shl15 = shl i32 %zext14, 5 %24 = or i32 %shl15, %lshrl13 %shl16 = shl i32 %24, 26 %ashr17 = ashr i32 %shl16, 26 - call void (ptr, ...) @printf(ptr @.str.12, i32 %ashr11, i32 %ashr17) - %25 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %26 = load i8, ptr %25, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.12, i32 0, i32 0), i32 %ashr11, i32 %ashr17) + %25 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %26 = load i8, i8* %25, align 1 %zext18 = zext i8 %26 to i32 %lshrl19 = lshr i32 %zext18, 3 - %27 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %28 = load i8, ptr %27, align 1 + %27 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %28 = load i8, i8* %27, align 1 %zext20 = zext i8 %28 to i32 %shl21 = shl i32 %zext20, 5 %29 = or i32 %shl21, %lshrl19 %shl22 = shl i32 %29, 26 %ashr23 = ashr i32 %shl22, 26 %mul = mul i32 %ashr23, 2 - %30 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %30 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl24 = shl i32 %mul, 3 %ztrunc25 = trunc i32 %shl24 to i8 - %31 = load i8, ptr %30, align 1 + %31 = load i8, i8* %30, align 1 %32 = and i8 %31, 7 %33 = or i8 %32, %ztrunc25 - store i8 %33, ptr %30, align 1 + store i8 %33, i8* %30, align 1 %lshrl26 = lshr i32 %mul, 5 - %34 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %34 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc27 = trunc i32 %lshrl26 to i8 %35 = and i8 %ztrunc27, 1 - %36 = load i8, ptr %34, align 1 + %36 = load i8, i8* %34, align 1 %37 = and i8 %36, -2 %38 = or i8 %37, %35 - store i8 %37, ptr %34, align 1 - %39 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %40 = load i8, ptr %39, align 1 + store i8 %37, i8* %34, align 1 + %39 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %40 = load i8, i8* %39, align 1 %zext28 = zext i8 %40 to i32 %shl29 = shl i32 %zext28, 29 %ashr30 = ashr i32 %shl29, 29 - %41 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %42 = load i8, ptr %41, align 1 + %41 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %42 = load i8, i8* %41, align 1 %zext31 = zext i8 %42 to i32 %lshrl32 = lshr i32 %zext31, 3 - %43 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %44 = load i8, ptr %43, align 1 + %43 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %44 = load i8, i8* %43, align 1 %zext33 = zext i8 %44 to i32 %shl34 = shl i32 %zext33, 5 %45 = or i32 %shl34, %lshrl32 %shl35 = shl i32 %45, 26 %ashr36 = ashr i32 %shl35, 26 - call void (ptr, ...) @printf(ptr @.str.13, i32 %ashr30, i32 %ashr36) - %46 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %47 = load i8, ptr %46, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.13, i32 0, i32 0), i32 %ashr30, i32 %ashr36) + %46 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %47 = load i8, i8* %46, align 1 %zext37 = zext i8 %47 to i32 %lshrl38 = lshr i32 %zext37, 3 - %48 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %49 = load i8, ptr %48, align 1 + %48 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %49 = load i8, i8* %48, align 1 %zext39 = zext i8 %49 to i32 %shl40 = shl i32 %zext39, 5 %50 = or i32 %shl40, %lshrl38 %shl41 = shl i32 %50, 26 %ashr42 = ashr i32 %shl41, 26 %xor = xor i32 %ashr42, 4 - %51 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %51 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl43 = shl i32 %xor, 3 %ztrunc44 = trunc i32 %shl43 to i8 - %52 = load i8, ptr %51, align 1 + %52 = load i8, i8* %51, align 1 %53 = and i8 %52, 7 %54 = or i8 %53, %ztrunc44 - store i8 %54, ptr %51, align 1 + store i8 %54, i8* %51, align 1 %lshrl45 = lshr i32 %xor, 5 - %55 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %55 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc46 = trunc i32 %lshrl45 to i8 %56 = and i8 %ztrunc46, 1 - %57 = load i8, ptr %55, align 1 + %57 = load i8, i8* %55, align 1 %58 = and i8 %57, -2 %59 = or i8 %58, %56 - store i8 %58, ptr %55, align 1 - %60 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %61 = load i8, ptr %60, align 1 + store i8 %58, i8* %55, align 1 + %60 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %61 = load i8, i8* %60, align 1 %zext47 = zext i8 %61 to i32 %shl48 = shl i32 %zext47, 29 %ashr49 = ashr i32 %shl48, 29 - %62 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %63 = load i8, ptr %62, align 1 + %62 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %63 = load i8, i8* %62, align 1 %zext50 = zext i8 %63 to i32 %lshrl51 = lshr i32 %zext50, 3 - %64 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %65 = load i8, ptr %64, align 1 + %64 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %65 = load i8, i8* %64, align 1 %zext52 = zext i8 %65 to i32 %shl53 = shl i32 %zext52, 5 %66 = or i32 %shl53, %lshrl51 %shl54 = shl i32 %66, 26 %ashr55 = ashr i32 %shl54, 26 - call void (ptr, ...) @printf(ptr @.str.14, i32 %ashr49, i32 %ashr55) - %67 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %68 = load i8, ptr %67, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.14, i32 0, i32 0), i32 %ashr49, i32 %ashr55) + %67 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %68 = load i8, i8* %67, align 1 %zext56 = zext i8 %68 to i32 %lshrl57 = lshr i32 %zext56, 3 - %69 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %70 = load i8, ptr %69, align 1 + %69 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %70 = load i8, i8* %69, align 1 %zext58 = zext i8 %70 to i32 %shl59 = shl i32 %zext58, 5 %71 = or i32 %shl59, %lshrl57 %shl60 = shl i32 %71, 26 %ashr61 = ashr i32 %shl60, 26 %or = or i32 %ashr61, 4 - %72 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %72 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl62 = shl i32 %or, 3 %ztrunc63 = trunc i32 %shl62 to i8 - %73 = load i8, ptr %72, align 1 + %73 = load i8, i8* %72, align 1 %74 = and i8 %73, 7 %75 = or i8 %74, %ztrunc63 - store i8 %75, ptr %72, align 1 + store i8 %75, i8* %72, align 1 %lshrl64 = lshr i32 %or, 5 - %76 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %76 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc65 = trunc i32 %lshrl64 to i8 %77 = and i8 %ztrunc65, 1 - %78 = load i8, ptr %76, align 1 + %78 = load i8, i8* %76, align 1 %79 = and i8 %78, -2 %80 = or i8 %79, %77 - store i8 %79, ptr %76, align 1 - %81 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %82 = load i8, ptr %81, align 1 + store i8 %79, i8* %76, align 1 + %81 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %82 = load i8, i8* %81, align 1 %zext66 = zext i8 %82 to i32 %shl67 = shl i32 %zext66, 29 %ashr68 = ashr i32 %shl67, 29 - %83 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %84 = load i8, ptr %83, align 1 + %83 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %84 = load i8, i8* %83, align 1 %zext69 = zext i8 %84 to i32 %lshrl70 = lshr i32 %zext69, 3 - %85 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %86 = load i8, ptr %85, align 1 + %85 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %86 = load i8, i8* %85, align 1 %zext71 = zext i8 %86 to i32 %shl72 = shl i32 %zext71, 5 %87 = or i32 %shl72, %lshrl70 %shl73 = shl i32 %87, 26 %ashr74 = ashr i32 %shl73, 26 - call void (ptr, ...) @printf(ptr @.str.15, i32 %ashr68, i32 %ashr74) - %88 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %89 = load i8, ptr %88, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.15, i32 0, i32 0), i32 %ashr68, i32 %ashr74) + %88 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %89 = load i8, i8* %88, align 1 %zext75 = zext i8 %89 to i32 %lshrl76 = lshr i32 %zext75, 3 - %90 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %91 = load i8, ptr %90, align 1 + %90 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %91 = load i8, i8* %90, align 1 %zext77 = zext i8 %91 to i32 %shl78 = shl i32 %zext77, 5 %92 = or i32 %shl78, %lshrl76 @@ -534,44 +543,44 @@ entry: %ashr80 = ashr i32 %shl79, 26 %shl81 = shl i32 %ashr80, 1 %93 = freeze i32 %shl81 - %94 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %94 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl82 = shl i32 %93, 3 %ztrunc83 = trunc i32 %shl82 to i8 - %95 = load i8, ptr %94, align 1 + %95 = load i8, i8* %94, align 1 %96 = and i8 %95, 7 %97 = or i8 %96, %ztrunc83 - store i8 %97, ptr %94, align 1 + store i8 %97, i8* %94, align 1 %lshrl84 = lshr i32 %93, 5 - %98 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %98 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc85 = trunc i32 %lshrl84 to i8 %99 = and i8 %ztrunc85, 1 - %100 = load i8, ptr %98, align 1 + %100 = load i8, i8* %98, align 1 %101 = and i8 %100, -2 %102 = or i8 %101, %99 - store i8 %101, ptr %98, align 1 - %103 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %104 = load i8, ptr %103, align 1 + store i8 %101, i8* %98, align 1 + %103 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %104 = load i8, i8* %103, align 1 %zext86 = zext i8 %104 to i32 %shl87 = shl i32 %zext86, 29 %ashr88 = ashr i32 %shl87, 29 - %105 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %106 = load i8, ptr %105, align 1 + %105 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %106 = load i8, i8* %105, align 1 %zext89 = zext i8 %106 to i32 %lshrl90 = lshr i32 %zext89, 3 - %107 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %108 = load i8, ptr %107, align 1 + %107 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %108 = load i8, i8* %107, align 1 %zext91 = zext i8 %108 to i32 %shl92 = shl i32 %zext91, 5 %109 = or i32 %shl92, %lshrl90 %shl93 = shl i32 %109, 26 %ashr94 = ashr i32 %shl93, 26 - call void (ptr, ...) @printf(ptr @.str.16, i32 %ashr88, i32 %ashr94) - %110 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %111 = load i8, ptr %110, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.16, i32 0, i32 0), i32 %ashr88, i32 %ashr94) + %110 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %111 = load i8, i8* %110, align 1 %zext95 = zext i8 %111 to i32 %lshrl96 = lshr i32 %zext95, 3 - %112 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %113 = load i8, ptr %112, align 1 + %112 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %113 = load i8, i8* %112, align 1 %zext97 = zext i8 %113 to i32 %shl98 = shl i32 %zext97, 5 %114 = or i32 %shl98, %lshrl96 @@ -579,153 +588,153 @@ entry: %ashr100 = ashr i32 %shl99, 26 %ashr101 = ashr i32 %ashr100, 1 %115 = freeze i32 %ashr101 - %116 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %116 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl102 = shl i32 %115, 3 %ztrunc103 = trunc i32 %shl102 to i8 - %117 = load i8, ptr %116, align 1 + %117 = load i8, i8* %116, align 1 %118 = and i8 %117, 7 %119 = or i8 %118, %ztrunc103 - store i8 %119, ptr %116, align 1 + store i8 %119, i8* %116, align 1 %lshrl104 = lshr i32 %115, 5 - %120 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %120 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc105 = trunc i32 %lshrl104 to i8 %121 = and i8 %ztrunc105, 1 - %122 = load i8, ptr %120, align 1 + %122 = load i8, i8* %120, align 1 %123 = and i8 %122, -2 %124 = or i8 %123, %121 - store i8 %123, ptr %120, align 1 - %125 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %126 = load i8, ptr %125, align 1 + store i8 %123, i8* %120, align 1 + %125 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %126 = load i8, i8* %125, align 1 %zext106 = zext i8 %126 to i32 %shl107 = shl i32 %zext106, 29 %ashr108 = ashr i32 %shl107, 29 - %127 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %128 = load i8, ptr %127, align 1 + %127 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %128 = load i8, i8* %127, align 1 %zext109 = zext i8 %128 to i32 %lshrl110 = lshr i32 %zext109, 3 - %129 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %130 = load i8, ptr %129, align 1 + %129 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %130 = load i8, i8* %129, align 1 %zext111 = zext i8 %130 to i32 %shl112 = shl i32 %zext111, 5 %131 = or i32 %shl112, %lshrl110 %shl113 = shl i32 %131, 26 %ashr114 = ashr i32 %shl113, 26 - call void (ptr, ...) @printf(ptr @.str.17, i32 %ashr108, i32 %ashr114) - %132 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %133 = load i8, ptr %132, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.17, i32 0, i32 0), i32 %ashr108, i32 %ashr114) + %132 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %133 = load i8, i8* %132, align 1 %zext115 = zext i8 %133 to i32 %lshrl116 = lshr i32 %zext115, 3 - %134 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %135 = load i8, ptr %134, align 1 + %134 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %135 = load i8, i8* %134, align 1 %zext117 = zext i8 %135 to i32 %shl118 = shl i32 %zext117, 5 %136 = or i32 %shl118, %lshrl116 %shl119 = shl i32 %136, 26 %ashr120 = ashr i32 %shl119, 26 %sdiv = sdiv i32 %ashr120, 2 - %137 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %137 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl121 = shl i32 %sdiv, 3 %ztrunc122 = trunc i32 %shl121 to i8 - %138 = load i8, ptr %137, align 1 + %138 = load i8, i8* %137, align 1 %139 = and i8 %138, 7 %140 = or i8 %139, %ztrunc122 - store i8 %140, ptr %137, align 1 + store i8 %140, i8* %137, align 1 %lshrl123 = lshr i32 %sdiv, 5 - %141 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %141 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc124 = trunc i32 %lshrl123 to i8 %142 = and i8 %ztrunc124, 1 - %143 = load i8, ptr %141, align 1 + %143 = load i8, i8* %141, align 1 %144 = and i8 %143, -2 %145 = or i8 %144, %142 - store i8 %144, ptr %141, align 1 - %146 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %147 = load i8, ptr %146, align 1 + store i8 %144, i8* %141, align 1 + %146 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %147 = load i8, i8* %146, align 1 %zext125 = zext i8 %147 to i32 %shl126 = shl i32 %zext125, 29 %ashr127 = ashr i32 %shl126, 29 - %148 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %149 = load i8, ptr %148, align 1 + %148 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %149 = load i8, i8* %148, align 1 %zext128 = zext i8 %149 to i32 %lshrl129 = lshr i32 %zext128, 3 - %150 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %151 = load i8, ptr %150, align 1 + %150 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %151 = load i8, i8* %150, align 1 %zext130 = zext i8 %151 to i32 %shl131 = shl i32 %zext130, 5 %152 = or i32 %shl131, %lshrl129 %shl132 = shl i32 %152, 26 %ashr133 = ashr i32 %shl132, 26 - call void (ptr, ...) @printf(ptr @.str.18, i32 %ashr127, i32 %ashr133) - %153 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %154 = load i8, ptr %153, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.18, i32 0, i32 0), i32 %ashr127, i32 %ashr133) + %153 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %154 = load i8, i8* %153, align 1 %zext134 = zext i8 %154 to i32 %lshrl135 = lshr i32 %zext134, 3 - %155 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %156 = load i8, ptr %155, align 1 + %155 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %156 = load i8, i8* %155, align 1 %zext136 = zext i8 %156 to i32 %shl137 = shl i32 %zext136, 5 %157 = or i32 %shl137, %lshrl135 %shl138 = shl i32 %157, 26 %ashr139 = ashr i32 %shl138, 26 %smod = srem i32 %ashr139, 2 - %158 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %158 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl140 = shl i32 %smod, 3 %ztrunc141 = trunc i32 %shl140 to i8 - %159 = load i8, ptr %158, align 1 + %159 = load i8, i8* %158, align 1 %160 = and i8 %159, 7 %161 = or i8 %160, %ztrunc141 - store i8 %161, ptr %158, align 1 + store i8 %161, i8* %158, align 1 %lshrl142 = lshr i32 %smod, 5 - %162 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %162 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc143 = trunc i32 %lshrl142 to i8 %163 = and i8 %ztrunc143, 1 - %164 = load i8, ptr %162, align 1 + %164 = load i8, i8* %162, align 1 %165 = and i8 %164, -2 %166 = or i8 %165, %163 - store i8 %165, ptr %162, align 1 - %167 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %168 = load i8, ptr %167, align 1 + store i8 %165, i8* %162, align 1 + %167 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %168 = load i8, i8* %167, align 1 %zext144 = zext i8 %168 to i32 %shl145 = shl i32 %zext144, 29 %ashr146 = ashr i32 %shl145, 29 - %169 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %170 = load i8, ptr %169, align 1 + %169 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %170 = load i8, i8* %169, align 1 %zext147 = zext i8 %170 to i32 %lshrl148 = lshr i32 %zext147, 3 - %171 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %172 = load i8, ptr %171, align 1 + %171 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %172 = load i8, i8* %171, align 1 %zext149 = zext i8 %172 to i32 %shl150 = shl i32 %zext149, 5 %173 = or i32 %shl150, %lshrl148 %shl151 = shl i32 %173, 26 %ashr152 = ashr i32 %shl151, 26 - call void (ptr, ...) @printf(ptr @.str.19, i32 %ashr146, i32 %ashr152) - %174 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %175 = load i8, ptr %174, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.19, i32 0, i32 0), i32 %ashr146, i32 %ashr152) + %174 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %175 = load i8, i8* %174, align 1 %lshrl153 = lshr i8 %175, 4 %176 = trunc i8 %lshrl153 to i1 %boolsi = zext i1 %176 to i32 - call void (ptr, ...) @printf(ptr @.str.20, i32 %boolsi) - %177 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %178 = load i8, ptr %177, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.20, i32 0, i32 0), i32 %boolsi) + %177 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %178 = load i8, i8* %177, align 1 %179 = and i8 %178, -17 %180 = or i8 %179, 16 - store i8 %180, ptr %177, align 1 - %181 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %182 = load i8, ptr %181, align 1 + store i8 %180, i8* %177, align 1 + %181 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %182 = load i8, i8* %181, align 1 %lshrl154 = lshr i8 %182, 4 %183 = trunc i8 %lshrl154 to i1 %boolsi155 = zext i1 %183 to i32 - call void (ptr, ...) @printf(ptr @.str.21, i32 %boolsi155) - %184 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %185 = load i8, ptr %184, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.21, i32 0, i32 0), i32 %boolsi155) + %184 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %185 = load i8, i8* %184, align 1 %186 = and i8 %185, -17 - store i8 %186, ptr %184, align 1 - %187 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %188 = load i8, ptr %187, align 1 + store i8 %186, i8* %184, align 1 + %187 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %188 = load i8, i8* %187, align 1 %lshrl156 = lshr i8 %188, 4 %189 = trunc i8 %lshrl156 to i1 %boolsi157 = zext i1 %189 to i32 - call void (ptr, ...) @printf(ptr @.str.22, i32 %boolsi157) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.22, i32 0, i32 0), i32 %boolsi157) ret void } @@ -733,205 +742,205 @@ entry: define void @foo_test3() #0 { entry: %xx = alloca [3 x i8], align 1 - store [3 x i8] c"4<\00", ptr %xx, align 1 - %0 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %1 = load i8, ptr %0, align 1 + store [3 x i8] c"4<\00", [3 x i8]* %xx, align 1 + %0 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %1 = load i8, i8* %0, align 1 %2 = and i8 %1, -15 %3 = or i8 %2, 6 - store i8 %3, ptr %0, align 1 - %4 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %5 = load i8, ptr %4, align 1 + store i8 %3, i8* %0, align 1 + %4 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %5 = load i8, i8* %4, align 1 %zext = zext i8 %5 to i32 %lshrl = lshr i32 %zext, 1 %shl = shl i32 %lshrl, 29 %ashr = ashr i32 %shl, 29 - %6 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %7 = load i8, ptr %6, align 1 + %6 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %7 = load i8, i8* %6, align 1 %zext1 = zext i8 %7 to i32 %lshrl2 = lshr i32 %zext1, 4 - %8 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %9 = load i8, ptr %8, align 1 + %8 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %9 = load i8, i8* %8, align 1 %zext3 = zext i8 %9 to i32 %shl4 = shl i32 %zext3, 4 %10 = or i32 %shl4, %lshrl2 %shl5 = shl i32 %10, 26 %ashr6 = ashr i32 %shl5, 26 - call void (ptr, ...) @printf(ptr @.str.23, i32 %ashr, i32 %ashr6) - %11 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %12 = load i8, ptr %11, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.23, i32 0, i32 0), i32 %ashr, i32 %ashr6) + %11 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %12 = load i8, i8* %11, align 1 %zext7 = zext i8 %12 to i32 %lshrl8 = lshr i32 %zext7, 1 %shl9 = shl i32 %lshrl8, 29 %ashr10 = ashr i32 %shl9, 29 %sub = sub i32 %ashr10, 1 - %13 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %13 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl11 = shl i32 %sub, 1 %ztrunc = trunc i32 %shl11 to i8 %14 = and i8 %ztrunc, 15 - %15 = load i8, ptr %13, align 1 + %15 = load i8, i8* %13, align 1 %16 = and i8 %15, -15 %17 = or i8 %16, %14 - store i8 %17, ptr %13, align 1 + store i8 %17, i8* %13, align 1 %lshrl12 = lshr i32 %sub, 7 - %18 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %19 = load i8, ptr %18, align 1 + %18 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %19 = load i8, i8* %18, align 1 %zext13 = zext i8 %19 to i32 %lshrl14 = lshr i32 %zext13, 1 %shl15 = shl i32 %lshrl14, 29 %ashr16 = ashr i32 %shl15, 29 - %20 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %21 = load i8, ptr %20, align 1 + %20 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %21 = load i8, i8* %20, align 1 %zext17 = zext i8 %21 to i32 %lshrl18 = lshr i32 %zext17, 4 - %22 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %23 = load i8, ptr %22, align 1 + %22 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %23 = load i8, i8* %22, align 1 %zext19 = zext i8 %23 to i32 %shl20 = shl i32 %zext19, 4 %24 = or i32 %shl20, %lshrl18 %shl21 = shl i32 %24, 26 %ashr22 = ashr i32 %shl21, 26 - call void (ptr, ...) @printf(ptr @.str.24, i32 %ashr16, i32 %ashr22) - %25 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %26 = load i8, ptr %25, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.24, i32 0, i32 0), i32 %ashr16, i32 %ashr22) + %25 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %26 = load i8, i8* %25, align 1 %zext23 = zext i8 %26 to i32 %lshrl24 = lshr i32 %zext23, 4 - %27 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %28 = load i8, ptr %27, align 1 + %27 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %28 = load i8, i8* %27, align 1 %zext25 = zext i8 %28 to i32 %shl26 = shl i32 %zext25, 4 %29 = or i32 %shl26, %lshrl24 %shl27 = shl i32 %29, 26 %ashr28 = ashr i32 %shl27, 26 %mul = mul i32 %ashr28, 2 - %30 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %30 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl29 = shl i32 %mul, 4 %ztrunc30 = trunc i32 %shl29 to i8 - %31 = load i8, ptr %30, align 1 + %31 = load i8, i8* %30, align 1 %32 = and i8 %31, 15 %33 = or i8 %32, %ztrunc30 - store i8 %33, ptr %30, align 1 + store i8 %33, i8* %30, align 1 %lshrl31 = lshr i32 %mul, 4 - %34 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %34 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc32 = trunc i32 %lshrl31 to i8 %35 = and i8 %ztrunc32, 3 - %36 = load i8, ptr %34, align 1 + %36 = load i8, i8* %34, align 1 %37 = and i8 %36, -4 %38 = or i8 %37, %35 - store i8 %37, ptr %34, align 1 - %39 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %40 = load i8, ptr %39, align 1 + store i8 %37, i8* %34, align 1 + %39 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %40 = load i8, i8* %39, align 1 %zext33 = zext i8 %40 to i32 %lshrl34 = lshr i32 %zext33, 1 %shl35 = shl i32 %lshrl34, 29 %ashr36 = ashr i32 %shl35, 29 - %41 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %42 = load i8, ptr %41, align 1 + %41 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %42 = load i8, i8* %41, align 1 %zext37 = zext i8 %42 to i32 %lshrl38 = lshr i32 %zext37, 4 - %43 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %44 = load i8, ptr %43, align 1 + %43 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %44 = load i8, i8* %43, align 1 %zext39 = zext i8 %44 to i32 %shl40 = shl i32 %zext39, 4 %45 = or i32 %shl40, %lshrl38 %shl41 = shl i32 %45, 26 %ashr42 = ashr i32 %shl41, 26 - call void (ptr, ...) @printf(ptr @.str.25, i32 %ashr36, i32 %ashr42) - %46 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %47 = load i8, ptr %46, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.25, i32 0, i32 0), i32 %ashr36, i32 %ashr42) + %46 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %47 = load i8, i8* %46, align 1 %zext43 = zext i8 %47 to i32 %lshrl44 = lshr i32 %zext43, 4 - %48 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %49 = load i8, ptr %48, align 1 + %48 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %49 = load i8, i8* %48, align 1 %zext45 = zext i8 %49 to i32 %shl46 = shl i32 %zext45, 4 %50 = or i32 %shl46, %lshrl44 %shl47 = shl i32 %50, 26 %ashr48 = ashr i32 %shl47, 26 %xor = xor i32 %ashr48, 4 - %51 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %51 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl49 = shl i32 %xor, 4 %ztrunc50 = trunc i32 %shl49 to i8 - %52 = load i8, ptr %51, align 1 + %52 = load i8, i8* %51, align 1 %53 = and i8 %52, 15 %54 = or i8 %53, %ztrunc50 - store i8 %54, ptr %51, align 1 + store i8 %54, i8* %51, align 1 %lshrl51 = lshr i32 %xor, 4 - %55 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %55 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc52 = trunc i32 %lshrl51 to i8 %56 = and i8 %ztrunc52, 3 - %57 = load i8, ptr %55, align 1 + %57 = load i8, i8* %55, align 1 %58 = and i8 %57, -4 %59 = or i8 %58, %56 - store i8 %58, ptr %55, align 1 - %60 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %61 = load i8, ptr %60, align 1 + store i8 %58, i8* %55, align 1 + %60 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %61 = load i8, i8* %60, align 1 %zext53 = zext i8 %61 to i32 %lshrl54 = lshr i32 %zext53, 1 %shl55 = shl i32 %lshrl54, 29 %ashr56 = ashr i32 %shl55, 29 - %62 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %63 = load i8, ptr %62, align 1 + %62 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %63 = load i8, i8* %62, align 1 %zext57 = zext i8 %63 to i32 %lshrl58 = lshr i32 %zext57, 4 - %64 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %65 = load i8, ptr %64, align 1 + %64 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %65 = load i8, i8* %64, align 1 %zext59 = zext i8 %65 to i32 %shl60 = shl i32 %zext59, 4 %66 = or i32 %shl60, %lshrl58 %shl61 = shl i32 %66, 26 %ashr62 = ashr i32 %shl61, 26 - call void (ptr, ...) @printf(ptr @.str.26, i32 %ashr56, i32 %ashr62) - %67 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %68 = load i8, ptr %67, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.26, i32 0, i32 0), i32 %ashr56, i32 %ashr62) + %67 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %68 = load i8, i8* %67, align 1 %zext63 = zext i8 %68 to i32 %lshrl64 = lshr i32 %zext63, 4 - %69 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %70 = load i8, ptr %69, align 1 + %69 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %70 = load i8, i8* %69, align 1 %zext65 = zext i8 %70 to i32 %shl66 = shl i32 %zext65, 4 %71 = or i32 %shl66, %lshrl64 %shl67 = shl i32 %71, 26 %ashr68 = ashr i32 %shl67, 26 %or = or i32 %ashr68, 4 - %72 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %72 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl69 = shl i32 %or, 4 %ztrunc70 = trunc i32 %shl69 to i8 - %73 = load i8, ptr %72, align 1 + %73 = load i8, i8* %72, align 1 %74 = and i8 %73, 15 %75 = or i8 %74, %ztrunc70 - store i8 %75, ptr %72, align 1 + store i8 %75, i8* %72, align 1 %lshrl71 = lshr i32 %or, 4 - %76 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %76 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc72 = trunc i32 %lshrl71 to i8 %77 = and i8 %ztrunc72, 3 - %78 = load i8, ptr %76, align 1 + %78 = load i8, i8* %76, align 1 %79 = and i8 %78, -4 %80 = or i8 %79, %77 - store i8 %79, ptr %76, align 1 - %81 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %82 = load i8, ptr %81, align 1 + store i8 %79, i8* %76, align 1 + %81 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %82 = load i8, i8* %81, align 1 %zext73 = zext i8 %82 to i32 %lshrl74 = lshr i32 %zext73, 1 %shl75 = shl i32 %lshrl74, 29 %ashr76 = ashr i32 %shl75, 29 - %83 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %84 = load i8, ptr %83, align 1 + %83 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %84 = load i8, i8* %83, align 1 %zext77 = zext i8 %84 to i32 %lshrl78 = lshr i32 %zext77, 4 - %85 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %86 = load i8, ptr %85, align 1 + %85 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %86 = load i8, i8* %85, align 1 %zext79 = zext i8 %86 to i32 %shl80 = shl i32 %zext79, 4 %87 = or i32 %shl80, %lshrl78 %shl81 = shl i32 %87, 26 %ashr82 = ashr i32 %shl81, 26 - call void (ptr, ...) @printf(ptr @.str.27, i32 %ashr76, i32 %ashr82) - %88 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %89 = load i8, ptr %88, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.27, i32 0, i32 0), i32 %ashr76, i32 %ashr82) + %88 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %89 = load i8, i8* %88, align 1 %zext83 = zext i8 %89 to i32 %lshrl84 = lshr i32 %zext83, 4 - %90 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %91 = load i8, ptr %90, align 1 + %90 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %91 = load i8, i8* %90, align 1 %zext85 = zext i8 %91 to i32 %shl86 = shl i32 %zext85, 4 %92 = or i32 %shl86, %lshrl84 @@ -939,45 +948,45 @@ entry: %ashr88 = ashr i32 %shl87, 26 %shl89 = shl i32 %ashr88, 1 %93 = freeze i32 %shl89 - %94 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %94 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl90 = shl i32 %93, 4 %ztrunc91 = trunc i32 %shl90 to i8 - %95 = load i8, ptr %94, align 1 + %95 = load i8, i8* %94, align 1 %96 = and i8 %95, 15 %97 = or i8 %96, %ztrunc91 - store i8 %97, ptr %94, align 1 + store i8 %97, i8* %94, align 1 %lshrl92 = lshr i32 %93, 4 - %98 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %98 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc93 = trunc i32 %lshrl92 to i8 %99 = and i8 %ztrunc93, 3 - %100 = load i8, ptr %98, align 1 + %100 = load i8, i8* %98, align 1 %101 = and i8 %100, -4 %102 = or i8 %101, %99 - store i8 %101, ptr %98, align 1 - %103 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %104 = load i8, ptr %103, align 1 + store i8 %101, i8* %98, align 1 + %103 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %104 = load i8, i8* %103, align 1 %zext94 = zext i8 %104 to i32 %lshrl95 = lshr i32 %zext94, 1 %shl96 = shl i32 %lshrl95, 29 %ashr97 = ashr i32 %shl96, 29 - %105 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %106 = load i8, ptr %105, align 1 + %105 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %106 = load i8, i8* %105, align 1 %zext98 = zext i8 %106 to i32 %lshrl99 = lshr i32 %zext98, 4 - %107 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %108 = load i8, ptr %107, align 1 + %107 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %108 = load i8, i8* %107, align 1 %zext100 = zext i8 %108 to i32 %shl101 = shl i32 %zext100, 4 %109 = or i32 %shl101, %lshrl99 %shl102 = shl i32 %109, 26 %ashr103 = ashr i32 %shl102, 26 - call void (ptr, ...) @printf(ptr @.str.28, i32 %ashr97, i32 %ashr103) - %110 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %111 = load i8, ptr %110, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.28, i32 0, i32 0), i32 %ashr97, i32 %ashr103) + %110 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %111 = load i8, i8* %110, align 1 %zext104 = zext i8 %111 to i32 %lshrl105 = lshr i32 %zext104, 4 - %112 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %113 = load i8, ptr %112, align 1 + %112 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %113 = load i8, i8* %112, align 1 %zext106 = zext i8 %113 to i32 %shl107 = shl i32 %zext106, 4 %114 = or i32 %shl107, %lshrl105 @@ -985,155 +994,155 @@ entry: %ashr109 = ashr i32 %shl108, 26 %ashr110 = ashr i32 %ashr109, 1 %115 = freeze i32 %ashr110 - %116 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %116 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl111 = shl i32 %115, 4 %ztrunc112 = trunc i32 %shl111 to i8 - %117 = load i8, ptr %116, align 1 + %117 = load i8, i8* %116, align 1 %118 = and i8 %117, 15 %119 = or i8 %118, %ztrunc112 - store i8 %119, ptr %116, align 1 + store i8 %119, i8* %116, align 1 %lshrl113 = lshr i32 %115, 4 - %120 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %120 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc114 = trunc i32 %lshrl113 to i8 %121 = and i8 %ztrunc114, 3 - %122 = load i8, ptr %120, align 1 + %122 = load i8, i8* %120, align 1 %123 = and i8 %122, -4 %124 = or i8 %123, %121 - store i8 %123, ptr %120, align 1 - %125 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %126 = load i8, ptr %125, align 1 + store i8 %123, i8* %120, align 1 + %125 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %126 = load i8, i8* %125, align 1 %zext115 = zext i8 %126 to i32 %lshrl116 = lshr i32 %zext115, 1 %shl117 = shl i32 %lshrl116, 29 %ashr118 = ashr i32 %shl117, 29 - %127 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %128 = load i8, ptr %127, align 1 + %127 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %128 = load i8, i8* %127, align 1 %zext119 = zext i8 %128 to i32 %lshrl120 = lshr i32 %zext119, 4 - %129 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %130 = load i8, ptr %129, align 1 + %129 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %130 = load i8, i8* %129, align 1 %zext121 = zext i8 %130 to i32 %shl122 = shl i32 %zext121, 4 %131 = or i32 %shl122, %lshrl120 %shl123 = shl i32 %131, 26 %ashr124 = ashr i32 %shl123, 26 - call void (ptr, ...) @printf(ptr @.str.29, i32 %ashr118, i32 %ashr124) - %132 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %133 = load i8, ptr %132, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.29, i32 0, i32 0), i32 %ashr118, i32 %ashr124) + %132 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %133 = load i8, i8* %132, align 1 %zext125 = zext i8 %133 to i32 %lshrl126 = lshr i32 %zext125, 4 - %134 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %135 = load i8, ptr %134, align 1 + %134 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %135 = load i8, i8* %134, align 1 %zext127 = zext i8 %135 to i32 %shl128 = shl i32 %zext127, 4 %136 = or i32 %shl128, %lshrl126 %shl129 = shl i32 %136, 26 %ashr130 = ashr i32 %shl129, 26 %sdiv = sdiv i32 %ashr130, 2 - %137 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %137 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl131 = shl i32 %sdiv, 4 %ztrunc132 = trunc i32 %shl131 to i8 - %138 = load i8, ptr %137, align 1 + %138 = load i8, i8* %137, align 1 %139 = and i8 %138, 15 %140 = or i8 %139, %ztrunc132 - store i8 %140, ptr %137, align 1 + store i8 %140, i8* %137, align 1 %lshrl133 = lshr i32 %sdiv, 4 - %141 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %141 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc134 = trunc i32 %lshrl133 to i8 %142 = and i8 %ztrunc134, 3 - %143 = load i8, ptr %141, align 1 + %143 = load i8, i8* %141, align 1 %144 = and i8 %143, -4 %145 = or i8 %144, %142 - store i8 %144, ptr %141, align 1 - %146 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %147 = load i8, ptr %146, align 1 + store i8 %144, i8* %141, align 1 + %146 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %147 = load i8, i8* %146, align 1 %zext135 = zext i8 %147 to i32 %lshrl136 = lshr i32 %zext135, 1 %shl137 = shl i32 %lshrl136, 29 %ashr138 = ashr i32 %shl137, 29 - %148 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %149 = load i8, ptr %148, align 1 + %148 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %149 = load i8, i8* %148, align 1 %zext139 = zext i8 %149 to i32 %lshrl140 = lshr i32 %zext139, 4 - %150 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %151 = load i8, ptr %150, align 1 + %150 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %151 = load i8, i8* %150, align 1 %zext141 = zext i8 %151 to i32 %shl142 = shl i32 %zext141, 4 %152 = or i32 %shl142, %lshrl140 %shl143 = shl i32 %152, 26 %ashr144 = ashr i32 %shl143, 26 - call void (ptr, ...) @printf(ptr @.str.30, i32 %ashr138, i32 %ashr144) - %153 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %154 = load i8, ptr %153, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.30, i32 0, i32 0), i32 %ashr138, i32 %ashr144) + %153 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %154 = load i8, i8* %153, align 1 %zext145 = zext i8 %154 to i32 %lshrl146 = lshr i32 %zext145, 4 - %155 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %156 = load i8, ptr %155, align 1 + %155 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %156 = load i8, i8* %155, align 1 %zext147 = zext i8 %156 to i32 %shl148 = shl i32 %zext147, 4 %157 = or i32 %shl148, %lshrl146 %shl149 = shl i32 %157, 26 %ashr150 = ashr i32 %shl149, 26 %smod = srem i32 %ashr150, 2 - %158 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 + %158 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 %shl151 = shl i32 %smod, 4 %ztrunc152 = trunc i32 %shl151 to i8 - %159 = load i8, ptr %158, align 1 + %159 = load i8, i8* %158, align 1 %160 = and i8 %159, 15 %161 = or i8 %160, %ztrunc152 - store i8 %161, ptr %158, align 1 + store i8 %161, i8* %158, align 1 %lshrl153 = lshr i32 %smod, 4 - %162 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 + %162 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 %ztrunc154 = trunc i32 %lshrl153 to i8 %163 = and i8 %ztrunc154, 3 - %164 = load i8, ptr %162, align 1 + %164 = load i8, i8* %162, align 1 %165 = and i8 %164, -4 %166 = or i8 %165, %163 - store i8 %165, ptr %162, align 1 - %167 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %168 = load i8, ptr %167, align 1 + store i8 %165, i8* %162, align 1 + %167 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %168 = load i8, i8* %167, align 1 %zext155 = zext i8 %168 to i32 %lshrl156 = lshr i32 %zext155, 1 %shl157 = shl i32 %lshrl156, 29 %ashr158 = ashr i32 %shl157, 29 - %169 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 0 - %170 = load i8, ptr %169, align 1 + %169 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 0 + %170 = load i8, i8* %169, align 1 %zext159 = zext i8 %170 to i32 %lshrl160 = lshr i32 %zext159, 4 - %171 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 1 - %172 = load i8, ptr %171, align 1 + %171 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 1 + %172 = load i8, i8* %171, align 1 %zext161 = zext i8 %172 to i32 %shl162 = shl i32 %zext161, 4 %173 = or i32 %shl162, %lshrl160 %shl163 = shl i32 %173, 26 %ashr164 = ashr i32 %shl163, 26 - call void (ptr, ...) @printf(ptr @.str.31, i32 %ashr158, i32 %ashr164) - %174 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %175 = load i8, ptr %174, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.31, i32 0, i32 0), i32 %ashr158, i32 %ashr164) + %174 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %175 = load i8, i8* %174, align 1 %lshrl165 = lshr i8 %175, 5 %176 = trunc i8 %lshrl165 to i1 %boolsi = zext i1 %176 to i32 - call void (ptr, ...) @printf(ptr @.str.32, i32 %boolsi) - %177 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %178 = load i8, ptr %177, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.32, i32 0, i32 0), i32 %boolsi) + %177 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %178 = load i8, i8* %177, align 1 %179 = and i8 %178, -33 %180 = or i8 %179, 32 - store i8 %180, ptr %177, align 1 - %181 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %182 = load i8, ptr %181, align 1 + store i8 %180, i8* %177, align 1 + %181 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %182 = load i8, i8* %181, align 1 %lshrl166 = lshr i8 %182, 5 %183 = trunc i8 %lshrl166 to i1 %boolsi167 = zext i1 %183 to i32 - call void (ptr, ...) @printf(ptr @.str.33, i32 %boolsi167) - %184 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %185 = load i8, ptr %184, align 1 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.33, i32 0, i32 0), i32 %boolsi167) + %184 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %185 = load i8, i8* %184, align 1 %186 = and i8 %185, -33 - store i8 %186, ptr %184, align 1 - %187 = getelementptr inbounds [3 x i8], ptr %xx, i64 0, i64 2 - %188 = load i8, ptr %187, align 1 + store i8 %186, i8* %184, align 1 + %187 = getelementptr inbounds [3 x i8], [3 x i8]* %xx, i64 0, i64 2 + %188 = load i8, i8* %187, align 1 %lshrl168 = lshr i8 %188, 5 %189 = trunc i8 %lshrl168 to i1 %boolsi169 = zext i1 %189 to i32 - call void (ptr, ...) @printf(ptr @.str.34, i32 %boolsi169) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.34, i32 0, i32 0), i32 %boolsi169) ret void } diff --git a/test/test_suite14/bitstruct/bitstruct_arrays_be.c3t b/test/test_suite14/bitstruct/bitstruct_arrays_be.c3t new file mode 100644 index 000000000..9e5b7a254 --- /dev/null +++ b/test/test_suite14/bitstruct/bitstruct_arrays_be.c3t @@ -0,0 +1,146 @@ +// #target: macos-x64 +module foo; + +module foo; + +bitstruct BitField3 : char[4] @bigendian +{ + uint c : 4..19; +} + +bitstruct BitField4 : char[4] +{ + uint c : 4..19; +} + +extern fn void printf(char*, ...); + +fn void main() +{ + test3(); +} +fn void test3() +{ + //BitField3 xx = { 0xdeadbeef }; + BitField3 xx = { 0xbeaf }; + printf("%x = beaf\n", xx.c); + BitField4 xy = { 0xbeaf }; + void *abc = &xy; + char[4]* z = abc; + printf("%x = beaf\n", xy.c); + xy.c = 0xbeef; + printf("%x = beef\n", xy.c); + xx.c = 0xbeef; + printf("%x = beef\n", xx.c); +} + + +/* #expect: foo.ll + +define void @foo_test3() #0 { +entry: + %xx = alloca [4 x i8], align 1 + %xy = alloca [4 x i8], align 1 + %abc = alloca i8*, align 8 + %z = alloca [4 x i8]*, align 8 + store [4 x i8] c"\E0\FB\0A\00", [4 x i8]* %xx, align 1 + %0 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 0 + %1 = load i8, i8* %0, align 1 + %zext = zext i8 %1 to i32 + %lshrl = lshr i32 %zext, 4 + %2 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 1 + %3 = load i8, i8* %2, align 1 + %zext1 = zext i8 %3 to i32 + %shl = shl i32 %zext1, 4 + %4 = or i32 %shl, %lshrl + %5 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 2 + %6 = load i8, i8* %5, align 1 + %zext2 = zext i8 %6 to i32 + %shl3 = shl i32 %zext2, 12 + %7 = or i32 %shl3, %4 + %shl4 = shl i32 %7, 16 + %8 = call i32 @llvm.bswap.i32(i32 %shl4) + %9 = and i32 65535, %8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), i32 %9) + store [4 x i8] c"\F0\EA\0B\00", [4 x i8]* %xy, align 1 + %ptrptr = bitcast [4 x i8]* %xy to i8* + store i8* %ptrptr, i8** %abc, align 8 + %10 = load i8*, i8** %abc, align 8 + %ptrptr5 = bitcast i8* %10 to [4 x i8]* + store [4 x i8]* %ptrptr5, [4 x i8]** %z, align 8 + %11 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 0 + %12 = load i8, i8* %11, align 1 + %zext6 = zext i8 %12 to i32 + %lshrl7 = lshr i32 %zext6, 4 + %13 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 1 + %14 = load i8, i8* %13, align 1 + %zext8 = zext i8 %14 to i32 + %shl9 = shl i32 %zext8, 4 + %15 = or i32 %shl9, %lshrl7 + %16 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 2 + %17 = load i8, i8* %16, align 1 + %zext10 = zext i8 %17 to i32 + %shl11 = shl i32 %zext10, 12 + %18 = or i32 %shl11, %15 + %19 = and i32 65535, %18 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %19) + %20 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 0 + %21 = load i8, i8* %20, align 1 + %22 = and i8 %21, 15 + %23 = or i8 %22, -16 + store i8 %23, i8* %20, align 1 + %24 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 1 + store i8 -18, i8* %24, align 1 + %25 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 2 + %26 = load i8, i8* %25, align 1 + %27 = and i8 %26, -16 + %28 = or i8 %27, 11 + store i8 %27, i8* %25, align 1 + %29 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 0 + %30 = load i8, i8* %29, align 1 + %zext12 = zext i8 %30 to i32 + %lshrl13 = lshr i32 %zext12, 4 + %31 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 1 + %32 = load i8, i8* %31, align 1 + %zext14 = zext i8 %32 to i32 + %shl15 = shl i32 %zext14, 4 + %33 = or i32 %shl15, %lshrl13 + %34 = getelementptr inbounds [4 x i8], [4 x i8]* %xy, i64 0, i64 2 + %35 = load i8, i8* %34, align 1 + %zext16 = zext i8 %35 to i32 + %shl17 = shl i32 %zext16, 12 + %36 = or i32 %shl17, %33 + %37 = and i32 65535, %36 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), i32 %37) + %38 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 0 + %39 = load i8, i8* %38, align 1 + %40 = and i8 %39, 15 + %41 = or i8 %40, -32 + store i8 %41, i8* %38, align 1 + %42 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 1 + store i8 -5, i8* %42, align 1 + %43 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 2 + %44 = load i8, i8* %43, align 1 + %45 = and i8 %44, -16 + %46 = or i8 %45, 14 + store i8 %45, i8* %43, align 1 + %47 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 0 + %48 = load i8, i8* %47, align 1 + %zext18 = zext i8 %48 to i32 + %lshrl19 = lshr i32 %zext18, 4 + %49 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 1 + %50 = load i8, i8* %49, align 1 + %zext20 = zext i8 %50 to i32 + %shl21 = shl i32 %zext20, 4 + %51 = or i32 %shl21, %lshrl19 + %52 = getelementptr inbounds [4 x i8], [4 x i8]* %xx, i64 0, i64 2 + %53 = load i8, i8* %52, align 1 + %zext22 = zext i8 %53 to i32 + %shl23 = shl i32 %zext22, 12 + %54 = or i32 %shl23, %51 + %shl24 = shl i32 %54, 16 + %55 = call i32 @llvm.bswap.i32(i32 %shl24) + %56 = and i32 65535, %55 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 %56) + ret void +} \ No newline at end of file diff --git a/test/test_suite14/bitstruct/bitstruct_be.c3t b/test/test_suite14/bitstruct/bitstruct_be.c3t new file mode 100644 index 000000000..37683735e --- /dev/null +++ b/test/test_suite14/bitstruct/bitstruct_be.c3t @@ -0,0 +1,315 @@ +// #target: macos-x64 +module test; +import std::io; + +bitstruct Test : int @bigendian +{ + ushort a : 0..15; + ushort b : 16..31; +} + +bitstruct Test2 : char[4] @bigendian +{ + ushort a : 0..15; + ushort b : 16..31; +} + +fn void main() +{ + IntBE x; + x.val = 123; + + io::printf("BE 123 => %d (%d)\n", (int)x, x.val); + Test abc = { .a = 0x1234, .b = 0x5678 }; + Test2 abc2 = { .a = 0x1234, .b = 0x5678 }; + char[4]* z = (char[4]*)&abc; + char[4]* z2 = (char[4]*)&abc2; + foreach (d : z2) io::printf(" %x", d); + io::println(""); + foreach (d : z) io::printf(" %x", d); + io::println(""); + io::printfn("abc.a = %x", abc.a); + abc.a = 0x1234; + abc.b = 0x5678; + io::printfn("->abc.a = %x", abc.a); + foreach (d : z) io::printf(" %x", d); + io::println(""); + + IntLE y; + y.val = 123; + io::printf("LE 123 => %d (%d)\n", (int)y, y.val); + +} + +/* #expect: test.ll + + %0 = load i32, i32* %x, align 4 + %1 = call i32 @llvm.bswap.i32(i32 %0) + store i32 2063597568, i32* %x, align 4 + %2 = bitcast i32* %x to i8* + %3 = insertvalue %variant undef, i8* %2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %5 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %4, %variant* %5, align 16 + %6 = load i32, i32* %x, align 4 + %7 = call i32 @llvm.bswap.i32(i32 %6) + store i32 %7, i32* %taddr, align 4 + %8 = bitcast i32* %taddr to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %11 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %10, %variant* %11, align 16 + %12 = bitcast [2 x %variant]* %varargslots to %variant* + %13 = insertvalue %"variant[]" undef, %variant* %12, 0 + %14 = insertvalue %"variant[]" %13, i64 2, 1 + store %"variant[]" %14, %"variant[]"* %taddr1, align 8 + %15 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 + %lo = load i8*, i8** %16, align 8 + %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 + %hi = load i64, i64* %17, align 8 + %18 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i64 18, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %18, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + store i32 873625686, i32* %abc, align 4 + store [4 x i8] c"\124Vx", [4 x i8]* %abc2, align 1 + %ptrptr = bitcast i32* %abc to [4 x i8]* + store [4 x i8]* %ptrptr, [4 x i8]** %z, align 8 + store [4 x i8]* %abc2, [4 x i8]** %z2, align 8 + %19 = load [4 x i8]*, [4 x i8]** %z2, align 8 + store [4 x i8]* %19, [4 x i8]** %.anon, align 8 + store i64 0, i64* %.anon2, align 8 + br label %loop.cond + +loop.cond: ; preds = %voiderr10, %voiderr + %20 = load i64, i64* %.anon2, align 8 + %gt = icmp ugt i64 4, %20 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %21 = load [4 x i8]*, [4 x i8]** %.anon, align 8 + %22 = load i64, i64* %.anon2, align 8 + %23 = getelementptr inbounds [4 x i8], [4 x i8]* %21, i64 0, i64 %22 + %24 = load i8, i8* %23, align 1 + store i8 %24, i8* %d, align 1 + %25 = insertvalue %variant undef, i8* %d, 0 + %26 = insertvalue %variant %25, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + %27 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots4, i64 0, i64 0 + store %variant %26, %variant* %27, align 16 + %28 = bitcast [1 x %variant]* %varargslots4 to %variant* + %29 = insertvalue %"variant[]" undef, %variant* %28, 0 + %30 = insertvalue %"variant[]" %29, i64 1, 1 + store %"variant[]" %30, %"variant[]"* %taddr5, align 8 + %31 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 0 + %lo6 = load i8*, i8** %32, align 8 + %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 1 + %hi7 = load i64, i64* %33, align 8 + %34 = call i64 @std_io_printf(i64* %retparam3, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %34, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %loop.body + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %loop.body + %35 = load i64, i64* %.anon2, align 8 + %add = add i64 %35, 1 + store i64 %add, i64* %.anon2, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %36 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i32 0, i32 0)) #2 + %37 = load [4 x i8]*, [4 x i8]** %z, align 8 + store [4 x i8]* %37, [4 x i8]** %.anon11, align 8 + store i64 0, i64* %.anon12, align 8 + br label %loop.cond13 + +loop.cond13: ; preds = %voiderr24, %loop.exit + %38 = load i64, i64* %.anon12, align 8 + %gt14 = icmp ugt i64 4, %38 + br i1 %gt14, label %loop.body15, label %loop.exit26 + +loop.body15: ; preds = %loop.cond13 + %39 = load [4 x i8]*, [4 x i8]** %.anon11, align 8 + %40 = load i64, i64* %.anon12, align 8 + %41 = getelementptr inbounds [4 x i8], [4 x i8]* %39, i64 0, i64 %40 + %42 = load i8, i8* %41, align 1 + store i8 %42, i8* %d16, align 1 + %43 = insertvalue %variant undef, i8* %d16, 0 + %44 = insertvalue %variant %43, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + %45 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots18, i64 0, i64 0 + store %variant %44, %variant* %45, align 16 + %46 = bitcast [1 x %variant]* %varargslots18 to %variant* + %47 = insertvalue %"variant[]" undef, %variant* %46, 0 + %48 = insertvalue %"variant[]" %47, i64 1, 1 + store %"variant[]" %48, %"variant[]"* %taddr19, align 8 + %49 = bitcast %"variant[]"* %taddr19 to { i8*, i64 }* + %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %49, i32 0, i32 0 + %lo20 = load i8*, i8** %50, align 8 + %51 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %49, i32 0, i32 1 + %hi21 = load i64, i64* %51, align 8 + %52 = call i64 @std_io_printf(i64* %retparam17, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i64 3, i8* %lo20, i64 %hi21) + %not_err22 = icmp eq i64 %52, 0 + br i1 %not_err22, label %after_check23, label %voiderr24 + +after_check23: ; preds = %loop.body15 + br label %voiderr24 + +voiderr24: ; preds = %after_check23, %loop.body15 + %53 = load i64, i64* %.anon12, align 8 + %add25 = add i64 %53, 1 + store i64 %add25, i64* %.anon12, align 8 + br label %loop.cond13 + +loop.exit26: ; preds = %loop.cond13 + %54 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.4, i32 0, i32 0)) #2 + %55 = load i32, i32* %abc, align 4 + %56 = call i32 @llvm.bswap.i32(i32 %55) + %57 = and i32 65535, %56 + %ztrunc = trunc i32 %57 to i16 + store i16 %ztrunc, i16* %taddr29, align 2 + %58 = bitcast i16* %taddr29 to i8* + %59 = insertvalue %variant undef, i8* %58, 0 + %60 = insertvalue %variant %59, i64 ptrtoint (%.introspect* @"ct$ushort" to i64), 1 + %61 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots28, i64 0, i64 0 + store %variant %60, %variant* %61, align 16 + %62 = bitcast [1 x %variant]* %varargslots28 to %variant* + %63 = insertvalue %"variant[]" undef, %variant* %62, 0 + %64 = insertvalue %"variant[]" %63, i64 1, 1 + store %"variant[]" %64, %"variant[]"* %taddr30, align 8 + %65 = bitcast %"variant[]"* %taddr30 to { i8*, i64 }* + %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 + %lo31 = load i8*, i8** %66, align 8 + %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 + %hi32 = load i64, i64* %67, align 8 + %68 = call i64 @std_io_printfn(i64* %retparam27, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i64 10, i8* %lo31, i64 %hi32) + %not_err33 = icmp eq i64 %68, 0 + br i1 %not_err33, label %after_check34, label %voiderr35 + +after_check34: ; preds = %loop.exit26 + br label %voiderr35 + +voiderr35: ; preds = %after_check34, %loop.exit26 + %69 = load i32, i32* %abc, align 4 + %70 = call i32 @llvm.bswap.i32(i32 %69) + %71 = and i32 %70, -65536 + %72 = or i32 %71, 4660 + %73 = call i32 @llvm.bswap.i32(i32 %72) + store i32 %73, i32* %abc, align 4 + %74 = load i32, i32* %abc, align 4 + %75 = call i32 @llvm.bswap.i32(i32 %74) + %76 = and i32 %75, 65535 + %77 = or i32 %76, 1450704896 + %78 = call i32 @llvm.bswap.i32(i32 %77) + store i32 %78, i32* %abc, align 4 + %79 = load i32, i32* %abc, align 4 + %80 = call i32 @llvm.bswap.i32(i32 %79) + %81 = and i32 65535, %80 + %ztrunc38 = trunc i32 %81 to i16 + store i16 %ztrunc38, i16* %taddr39, align 2 + %82 = bitcast i16* %taddr39 to i8* + %83 = insertvalue %variant undef, i8* %82, 0 + %84 = insertvalue %variant %83, i64 ptrtoint (%.introspect* @"ct$ushort" to i64), 1 + %85 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots37, i64 0, i64 0 + store %variant %84, %variant* %85, align 16 + %86 = bitcast [1 x %variant]* %varargslots37 to %variant* + %87 = insertvalue %"variant[]" undef, %variant* %86, 0 + %88 = insertvalue %"variant[]" %87, i64 1, 1 + store %"variant[]" %88, %"variant[]"* %taddr40, align 8 + %89 = bitcast %"variant[]"* %taddr40 to { i8*, i64 }* + %90 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 0 + %lo41 = load i8*, i8** %90, align 8 + %91 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 1 + %hi42 = load i64, i64* %91, align 8 + %92 = call i64 @std_io_printfn(i64* %retparam36, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0), i64 12, i8* %lo41, i64 %hi42) + %not_err43 = icmp eq i64 %92, 0 + br i1 %not_err43, label %after_check44, label %voiderr45 + +after_check44: ; preds = %voiderr35 + br label %voiderr45 + +voiderr45: ; preds = %after_check44, %voiderr35 + %93 = load [4 x i8]*, [4 x i8]** %z, align 8 + store [4 x i8]* %93, [4 x i8]** %.anon46, align 8 + store i64 0, i64* %.anon47, align 8 + br label %loop.cond48 + +loop.cond48: ; preds = %voiderr59, %voiderr45 + %94 = load i64, i64* %.anon47, align 8 + %gt49 = icmp ugt i64 4, %94 + br i1 %gt49, label %loop.body50, label %loop.exit61 + +loop.body50: ; preds = %loop.cond48 + %95 = load [4 x i8]*, [4 x i8]** %.anon46, align 8 + %96 = load i64, i64* %.anon47, align 8 + %97 = getelementptr inbounds [4 x i8], [4 x i8]* %95, i64 0, i64 %96 + %98 = load i8, i8* %97, align 1 + store i8 %98, i8* %d51, align 1 + %99 = insertvalue %variant undef, i8* %d51, 0 + %100 = insertvalue %variant %99, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + %101 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots53, i64 0, i64 0 + store %variant %100, %variant* %101, align 16 + %102 = bitcast [1 x %variant]* %varargslots53 to %variant* + %103 = insertvalue %"variant[]" undef, %variant* %102, 0 + %104 = insertvalue %"variant[]" %103, i64 1, 1 + store %"variant[]" %104, %"variant[]"* %taddr54, align 8 + %105 = bitcast %"variant[]"* %taddr54 to { i8*, i64 }* + %106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 0 + %lo55 = load i8*, i8** %106, align 8 + %107 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 1 + %hi56 = load i64, i64* %107, align 8 + %108 = call i64 @std_io_printf(i64* %retparam52, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.7, i32 0, i32 0), i64 3, i8* %lo55, i64 %hi56) + %not_err57 = icmp eq i64 %108, 0 + br i1 %not_err57, label %after_check58, label %voiderr59 + +after_check58: ; preds = %loop.body50 + br label %voiderr59 + +voiderr59: ; preds = %after_check58, %loop.body50 + %109 = load i64, i64* %.anon47, align 8 + %add60 = add i64 %109, 1 + store i64 %add60, i64* %.anon47, align 8 + br label %loop.cond48 + +loop.exit61: ; preds = %loop.cond48 + %110 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.8, i32 0, i32 0)) #2 + store i32 0, i32* %y, align 4 + %111 = load i32, i32* %y, align 4 + store i32 123, i32* %y, align 4 + %112 = bitcast i32* %y to i8* + %113 = insertvalue %variant undef, i8* %112, 0 + %114 = insertvalue %variant %113, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %115 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots63, i64 0, i64 0 + store %variant %114, %variant* %115, align 16 + %116 = load i32, i32* %y, align 4 + store i32 %116, i32* %taddr64, align 4 + %117 = bitcast i32* %taddr64 to i8* + %118 = insertvalue %variant undef, i8* %117, 0 + %119 = insertvalue %variant %118, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %120 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots63, i64 0, i64 1 + store %variant %119, %variant* %120, align 16 + %121 = bitcast [2 x %variant]* %varargslots63 to %variant* + %122 = insertvalue %"variant[]" undef, %variant* %121, 0 + %123 = insertvalue %"variant[]" %122, i64 2, 1 + store %"variant[]" %123, %"variant[]"* %taddr65, align 8 + %124 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* + %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 0 + %lo66 = load i8*, i8** %125, align 8 + %126 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 1 + %hi67 = load i64, i64* %126, align 8 + %127 = call i64 @std_io_printf(i64* %retparam62, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.9, i32 0, i32 0), i64 18, i8* %lo66, i64 %hi67) + %not_err68 = icmp eq i64 %127, 0 + br i1 %not_err68, label %after_check69, label %voiderr70 + +after_check69: ; preds = %loop.exit61 + br label %voiderr70 + +voiderr70: ; preds = %after_check69, %loop.exit61 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitstruct_general.c3 b/test/test_suite14/bitstruct/bitstruct_general.c3 similarity index 100% rename from test/test_suite2/bitstruct/bitstruct_general.c3 rename to test/test_suite14/bitstruct/bitstruct_general.c3 diff --git a/test/test_suite2/bitstruct/bitstruct_init.c3 b/test/test_suite14/bitstruct/bitstruct_init.c3 similarity index 100% rename from test/test_suite2/bitstruct/bitstruct_init.c3 rename to test/test_suite14/bitstruct/bitstruct_init.c3 diff --git a/test/test_suite14/bitstruct/bitstruct_initializer.c3t b/test/test_suite14/bitstruct/bitstruct_initializer.c3t new file mode 100644 index 000000000..2bc364917 --- /dev/null +++ b/test/test_suite14/bitstruct/bitstruct_initializer.c3t @@ -0,0 +1,569 @@ +// #target: macos-x64 +module test; +import std::io; + +bitstruct Foo : ulong +{ + uint x : 0..31; + uint y : 32..62; + bool w : 63; +} + +bitstruct Bar : char[8] +{ + uint x : 0..31; + uint y : 32..62; + bool w : 63; +} +struct Abc +{ + int x; + Foo b; +} + +fn void hello(int z) +{ + Foo x; + x = { .x = z, .w = z < 100 }; + Abc y = { .b.x = 32, .b.y = 10 }; + Abc d = { .b = { 23, 11, true } }; + Bar b; + b = { .x = z, .w = z < 100 }; + io::printfn("%s %s %s", x.x, x.y, x.w); + io::printfn("%s %s %s", y.b.x, y.b.y, y.b.w); + io::printfn("%s %s %s", b.x, b.y, b.w); + x = { z + 1, 1, z > 100 }; + y.b = { 33, 11, true }; + b = { z + 1, 1, z > 100 }; + io::printfn("%s %s %s", x.x, x.y, x.w); + io::printfn("%s %s %s", y.b.x, y.b.y, y.b.w); + io::printfn("%s %s %s", b.x, b.y, b.w); + +} + +fn void main() +{ + hello(12); +} + +/* #expect: test.ll + +define void @test_hello(i32 %0) #0 { +entry: + %x = alloca i64, align 8 + %y = alloca %Abc, align 8 + %d = alloca %Abc, align 8 + %b = alloca [8 x i8], align 1 + %retparam = alloca i64, align 8 + %varargslots = alloca [3 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr13 = alloca i32, align 4 + %taddr16 = alloca i8, align 1 + %taddr17 = alloca %"variant[]", align 8 + %retparam18 = alloca i64, align 8 + %varargslots19 = alloca [3 x %variant], align 16 + %taddr21 = alloca i32, align 4 + %taddr24 = alloca i32, align 4 + %taddr27 = alloca i8, align 1 + %taddr28 = alloca %"variant[]", align 8 + %retparam34 = alloca i64, align 8 + %varargslots35 = alloca [3 x %variant], align 16 + %taddr43 = alloca i32, align 4 + %taddr51 = alloca i32, align 4 + %taddr53 = alloca i8, align 1 + %taddr54 = alloca %"variant[]", align 8 + %retparam74 = alloca i64, align 8 + %varargslots75 = alloca [3 x %variant], align 16 + %taddr77 = alloca i32, align 4 + %taddr80 = alloca i32, align 4 + %taddr83 = alloca i8, align 1 + %taddr84 = alloca %"variant[]", align 8 + %retparam90 = alloca i64, align 8 + %varargslots91 = alloca [3 x %variant], align 16 + %taddr93 = alloca i32, align 4 + %taddr96 = alloca i32, align 4 + %taddr99 = alloca i8, align 1 + %taddr100 = alloca %"variant[]", align 8 + %retparam106 = alloca i64, align 8 + %varargslots107 = alloca [3 x %variant], align 16 + %taddr115 = alloca i32, align 4 + %taddr123 = alloca i32, align 4 + %taddr125 = alloca i8, align 1 + %taddr126 = alloca %"variant[]", align 8 + store i64 0, i64* %x, align 8 + %zext = zext i32 %0 to i64 + %1 = and i64 %zext, 4294967295 + %lt = icmp slt i32 %0, 100 + %2 = zext i1 %lt to i8 + %zext1 = zext i8 %2 to i64 + %shl = shl i64 %zext1, 63 + %3 = and i64 %shl, -9223372036854775808 + %4 = and i64 %1, 9223372036854775807 + %5 = or i64 %4, %3 + store i64 %5, i64* %x, align 8 + %6 = bitcast %Abc* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %6, i8* align 8 bitcast (%Abc* @.__const to i8*), i32 16, i1 false) + %7 = bitcast %Abc* %d to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %7, i8* align 8 bitcast (%Abc* @.__const.1 to i8*), i32 16, i1 false) + %8 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + store i8 0, i8* %8, align 1 + %9 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + store i8 0, i8* %9, align 1 + %10 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + store i8 0, i8* %10, align 1 + %11 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + store i8 0, i8* %11, align 1 + %12 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 + store i8 0, i8* %12, align 1 + %13 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 + store i8 0, i8* %13, align 1 + %14 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 + store i8 0, i8* %14, align 1 + %15 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + store i8 0, i8* %15, align 1 + %16 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + store i8 0, i8* %16, align 1 + %17 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + store i8 0, i8* %17, align 1 + %18 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + store i8 0, i8* %18, align 1 + %19 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + store i8 0, i8* %19, align 1 + %20 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 + store i8 0, i8* %20, align 1 + %21 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 + store i8 0, i8* %21, align 1 + %22 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 + store i8 0, i8* %22, align 1 + %23 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + store i8 0, i8* %23, align 1 + %24 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + %ztrunc = trunc i32 %0 to i8 + store i8 %ztrunc, i8* %24, align 1 + %lshrl = lshr i32 %0, 8 + %25 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + %ztrunc2 = trunc i32 %lshrl to i8 + store i8 %ztrunc2, i8* %25, align 1 + %lshrl3 = lshr i32 %lshrl, 8 + %26 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + %ztrunc4 = trunc i32 %lshrl3 to i8 + store i8 %ztrunc4, i8* %26, align 1 + %lshrl5 = lshr i32 %lshrl3, 8 + %27 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + %ztrunc6 = trunc i32 %lshrl5 to i8 + store i8 %ztrunc6, i8* %27, align 1 + %lshrl7 = lshr i32 %lshrl5, 8 + %lt8 = icmp slt i32 %0, 100 + %28 = zext i1 %lt8 to i8 + %shl9 = shl i8 %28, 7 + %29 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %30 = load i8, i8* %29, align 1 + %31 = and i8 %30, 127 + %32 = or i8 %31, %shl9 + store i8 %32, i8* %29, align 1 + %33 = load i64, i64* %x, align 8 + %34 = and i64 4294967295, %33 + %ztrunc10 = trunc i64 %34 to i32 + store i32 %ztrunc10, i32* %taddr, align 4 + %35 = bitcast i32* %taddr to i8* + %36 = insertvalue %variant undef, i8* %35, 0 + %37 = insertvalue %variant %36, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %38 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots, i64 0, i64 0 + store %variant %37, %variant* %38, align 16 + %39 = load i64, i64* %x, align 8 + %lshrl11 = lshr i64 %39, 32 + %40 = and i64 2147483647, %lshrl11 + %ztrunc12 = trunc i64 %40 to i32 + store i32 %ztrunc12, i32* %taddr13, align 4 + %41 = bitcast i32* %taddr13 to i8* + %42 = insertvalue %variant undef, i8* %41, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %44 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots, i64 0, i64 1 + store %variant %43, %variant* %44, align 16 + %45 = load i64, i64* %x, align 8 + %lshrl14 = lshr i64 %45, 63 + %46 = and i64 1, %lshrl14 + %ztrunc15 = trunc i64 %46 to i8 + store i8 %ztrunc15, i8* %taddr16, align 1 + %47 = insertvalue %variant undef, i8* %taddr16, 0 + %48 = insertvalue %variant %47, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %49 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots, i64 0, i64 2 + store %variant %48, %variant* %49, align 16 + %50 = bitcast [3 x %variant]* %varargslots to %variant* + %51 = insertvalue %"variant[]" undef, %variant* %50, 0 + %52 = insertvalue %"variant[]" %51, i64 3, 1 + store %"variant[]" %52, %"variant[]"* %taddr17, align 8 + %53 = bitcast %"variant[]"* %taddr17 to { i8*, i64 }* + %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 0 + %lo = load i8*, i8** %54, align 8 + %55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 1 + %hi = load i64, i64* %55, align 8 + %56 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %56, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %57 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + %58 = load i64, i64* %57, align 8 + %59 = and i64 4294967295, %58 + %ztrunc20 = trunc i64 %59 to i32 + store i32 %ztrunc20, i32* %taddr21, align 4 + %60 = bitcast i32* %taddr21 to i8* + %61 = insertvalue %variant undef, i8* %60, 0 + %62 = insertvalue %variant %61, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %63 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots19, i64 0, i64 0 + store %variant %62, %variant* %63, align 16 + %64 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + %65 = load i64, i64* %64, align 8 + %lshrl22 = lshr i64 %65, 32 + %66 = and i64 2147483647, %lshrl22 + %ztrunc23 = trunc i64 %66 to i32 + store i32 %ztrunc23, i32* %taddr24, align 4 + %67 = bitcast i32* %taddr24 to i8* + %68 = insertvalue %variant undef, i8* %67, 0 + %69 = insertvalue %variant %68, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %70 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots19, i64 0, i64 1 + store %variant %69, %variant* %70, align 16 + %71 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + %72 = load i64, i64* %71, align 8 + %lshrl25 = lshr i64 %72, 63 + %73 = and i64 1, %lshrl25 + %ztrunc26 = trunc i64 %73 to i8 + store i8 %ztrunc26, i8* %taddr27, align 1 + %74 = insertvalue %variant undef, i8* %taddr27, 0 + %75 = insertvalue %variant %74, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %76 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots19, i64 0, i64 2 + store %variant %75, %variant* %76, align 16 + %77 = bitcast [3 x %variant]* %varargslots19 to %variant* + %78 = insertvalue %"variant[]" undef, %variant* %77, 0 + %79 = insertvalue %"variant[]" %78, i64 3, 1 + store %"variant[]" %79, %"variant[]"* %taddr28, align 8 + %80 = bitcast %"variant[]"* %taddr28 to { i8*, i64 }* + %81 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 0 + %lo29 = load i8*, i8** %81, align 8 + %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 1 + %hi30 = load i64, i64* %82, align 8 + %83 = call i64 @std_io_printfn(i64* %retparam18, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i32 0, i32 0), i64 8, i8* %lo29, i64 %hi30) + %not_err31 = icmp eq i64 %83, 0 + br i1 %not_err31, label %after_check32, label %voiderr33 + +after_check32: ; preds = %voiderr + br label %voiderr33 + +voiderr33: ; preds = %after_check32, %voiderr + %84 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + %85 = load i8, i8* %84, align 1 + %zext36 = zext i8 %85 to i32 + %86 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + %87 = load i8, i8* %86, align 1 + %zext37 = zext i8 %87 to i32 + %shl38 = shl i32 %zext37, 8 + %88 = or i32 %shl38, %zext36 + %89 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + %90 = load i8, i8* %89, align 1 + %zext39 = zext i8 %90 to i32 + %shl40 = shl i32 %zext39, 16 + %91 = or i32 %shl40, %88 + %92 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + %93 = load i8, i8* %92, align 1 + %zext41 = zext i8 %93 to i32 + %shl42 = shl i32 %zext41, 24 + %94 = or i32 %shl42, %91 + store i32 %94, i32* %taddr43, align 4 + %95 = bitcast i32* %taddr43 to i8* + %96 = insertvalue %variant undef, i8* %95, 0 + %97 = insertvalue %variant %96, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %98 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots35, i64 0, i64 0 + store %variant %97, %variant* %98, align 16 + %99 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 + %100 = load i8, i8* %99, align 1 + %zext44 = zext i8 %100 to i32 + %101 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 + %102 = load i8, i8* %101, align 1 + %zext45 = zext i8 %102 to i32 + %shl46 = shl i32 %zext45, 8 + %103 = or i32 %shl46, %zext44 + %104 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 + %105 = load i8, i8* %104, align 1 + %zext47 = zext i8 %105 to i32 + %shl48 = shl i32 %zext47, 16 + %106 = or i32 %shl48, %103 + %107 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %108 = load i8, i8* %107, align 1 + %zext49 = zext i8 %108 to i32 + %shl50 = shl i32 %zext49, 24 + %109 = or i32 %shl50, %106 + %110 = and i32 2147483647, %109 + store i32 %110, i32* %taddr51, align 4 + %111 = bitcast i32* %taddr51 to i8* + %112 = insertvalue %variant undef, i8* %111, 0 + %113 = insertvalue %variant %112, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %114 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots35, i64 0, i64 1 + store %variant %113, %variant* %114, align 16 + %115 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %116 = load i8, i8* %115, align 1 + %lshrl52 = lshr i8 %116, 7 + %117 = trunc i8 %lshrl52 to i1 + %118 = zext i1 %117 to i8 + store i8 %118, i8* %taddr53, align 1 + %119 = insertvalue %variant undef, i8* %taddr53, 0 + %120 = insertvalue %variant %119, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %121 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots35, i64 0, i64 2 + store %variant %120, %variant* %121, align 16 + %122 = bitcast [3 x %variant]* %varargslots35 to %variant* + %123 = insertvalue %"variant[]" undef, %variant* %122, 0 + %124 = insertvalue %"variant[]" %123, i64 3, 1 + store %"variant[]" %124, %"variant[]"* %taddr54, align 8 + %125 = bitcast %"variant[]"* %taddr54 to { i8*, i64 }* + %126 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %125, i32 0, i32 0 + %lo55 = load i8*, i8** %126, align 8 + %127 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %125, i32 0, i32 1 + %hi56 = load i64, i64* %127, align 8 + %128 = call i64 @std_io_printfn(i64* %retparam34, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i64 8, i8* %lo55, i64 %hi56) + %not_err57 = icmp eq i64 %128, 0 + br i1 %not_err57, label %after_check58, label %voiderr59 + +after_check58: ; preds = %voiderr33 + br label %voiderr59 + +voiderr59: ; preds = %after_check58, %voiderr33 + %add = add i32 %0, 1 + %zext60 = zext i32 %add to i64 + %129 = and i64 %zext60, 4294967295 + %130 = and i64 %129, -9223372032559808513 + %131 = or i64 %130, 4294967296 + %gt = icmp sgt i32 %0, 100 + %132 = zext i1 %gt to i8 + %zext61 = zext i8 %132 to i64 + %shl62 = shl i64 %zext61, 63 + %133 = and i64 %shl62, -9223372036854775808 + %134 = and i64 %131, 9223372036854775807 + %135 = or i64 %134, %133 + store i64 %135, i64* %x, align 8 + %136 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + store i64 -9223371989610135519, i64* %136, align 8 + %137 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + store i8 0, i8* %137, align 1 + %138 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + store i8 0, i8* %138, align 1 + %139 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + store i8 0, i8* %139, align 1 + %140 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + store i8 0, i8* %140, align 1 + %141 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 + store i8 0, i8* %141, align 1 + %142 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 + store i8 0, i8* %142, align 1 + %143 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 + store i8 0, i8* %143, align 1 + %144 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + store i8 0, i8* %144, align 1 + %add63 = add i32 %0, 1 + %145 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + %ztrunc64 = trunc i32 %add63 to i8 + store i8 %ztrunc64, i8* %145, align 1 + %lshrl65 = lshr i32 %add63, 8 + %146 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + %ztrunc66 = trunc i32 %lshrl65 to i8 + store i8 %ztrunc66, i8* %146, align 1 + %lshrl67 = lshr i32 %lshrl65, 8 + %147 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + %ztrunc68 = trunc i32 %lshrl67 to i8 + store i8 %ztrunc68, i8* %147, align 1 + %lshrl69 = lshr i32 %lshrl67, 8 + %148 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + %ztrunc70 = trunc i32 %lshrl69 to i8 + store i8 %ztrunc70, i8* %148, align 1 + %lshrl71 = lshr i32 %lshrl69, 8 + %149 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 + store i8 1, i8* %149, align 1 + %150 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 + store i8 0, i8* %150, align 1 + %151 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 + store i8 0, i8* %151, align 1 + %152 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %153 = load i8, i8* %152, align 1 + %154 = and i8 %153, -128 + store i8 %154, i8* %152, align 1 + %gt72 = icmp sgt i32 %0, 100 + %155 = zext i1 %gt72 to i8 + %shl73 = shl i8 %155, 7 + %156 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %157 = load i8, i8* %156, align 1 + %158 = and i8 %157, 127 + %159 = or i8 %158, %shl73 + store i8 %159, i8* %156, align 1 + %160 = load i64, i64* %x, align 8 + %161 = and i64 4294967295, %160 + %ztrunc76 = trunc i64 %161 to i32 + store i32 %ztrunc76, i32* %taddr77, align 4 + %162 = bitcast i32* %taddr77 to i8* + %163 = insertvalue %variant undef, i8* %162, 0 + %164 = insertvalue %variant %163, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %165 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots75, i64 0, i64 0 + store %variant %164, %variant* %165, align 16 + %166 = load i64, i64* %x, align 8 + %lshrl78 = lshr i64 %166, 32 + %167 = and i64 2147483647, %lshrl78 + %ztrunc79 = trunc i64 %167 to i32 + store i32 %ztrunc79, i32* %taddr80, align 4 + %168 = bitcast i32* %taddr80 to i8* + %169 = insertvalue %variant undef, i8* %168, 0 + %170 = insertvalue %variant %169, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %171 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots75, i64 0, i64 1 + store %variant %170, %variant* %171, align 16 + %172 = load i64, i64* %x, align 8 + %lshrl81 = lshr i64 %172, 63 + %173 = and i64 1, %lshrl81 + %ztrunc82 = trunc i64 %173 to i8 + store i8 %ztrunc82, i8* %taddr83, align 1 + %174 = insertvalue %variant undef, i8* %taddr83, 0 + %175 = insertvalue %variant %174, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %176 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots75, i64 0, i64 2 + store %variant %175, %variant* %176, align 16 + %177 = bitcast [3 x %variant]* %varargslots75 to %variant* + %178 = insertvalue %"variant[]" undef, %variant* %177, 0 + %179 = insertvalue %"variant[]" %178, i64 3, 1 + store %"variant[]" %179, %"variant[]"* %taddr84, align 8 + %180 = bitcast %"variant[]"* %taddr84 to { i8*, i64 }* + %181 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %180, i32 0, i32 0 + %lo85 = load i8*, i8** %181, align 8 + %182 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %180, i32 0, i32 1 + %hi86 = load i64, i64* %182, align 8 + %183 = call i64 @std_io_printfn(i64* %retparam74, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i32 0, i32 0), i64 8, i8* %lo85, i64 %hi86) + %not_err87 = icmp eq i64 %183, 0 + br i1 %not_err87, label %after_check88, label %voiderr89 + +after_check88: ; preds = %voiderr59 + br label %voiderr89 + +voiderr89: ; preds = %after_check88, %voiderr59 + %184 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + %185 = load i64, i64* %184, align 8 + %186 = and i64 4294967295, %185 + %ztrunc92 = trunc i64 %186 to i32 + store i32 %ztrunc92, i32* %taddr93, align 4 + %187 = bitcast i32* %taddr93 to i8* + %188 = insertvalue %variant undef, i8* %187, 0 + %189 = insertvalue %variant %188, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %190 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots91, i64 0, i64 0 + store %variant %189, %variant* %190, align 16 + %191 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + %192 = load i64, i64* %191, align 8 + %lshrl94 = lshr i64 %192, 32 + %193 = and i64 2147483647, %lshrl94 + %ztrunc95 = trunc i64 %193 to i32 + store i32 %ztrunc95, i32* %taddr96, align 4 + %194 = bitcast i32* %taddr96 to i8* + %195 = insertvalue %variant undef, i8* %194, 0 + %196 = insertvalue %variant %195, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %197 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots91, i64 0, i64 1 + store %variant %196, %variant* %197, align 16 + %198 = getelementptr inbounds %Abc, %Abc* %y, i32 0, i32 1 + %199 = load i64, i64* %198, align 8 + %lshrl97 = lshr i64 %199, 63 + %200 = and i64 1, %lshrl97 + %ztrunc98 = trunc i64 %200 to i8 + store i8 %ztrunc98, i8* %taddr99, align 1 + %201 = insertvalue %variant undef, i8* %taddr99, 0 + %202 = insertvalue %variant %201, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %203 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots91, i64 0, i64 2 + store %variant %202, %variant* %203, align 16 + %204 = bitcast [3 x %variant]* %varargslots91 to %variant* + %205 = insertvalue %"variant[]" undef, %variant* %204, 0 + %206 = insertvalue %"variant[]" %205, i64 3, 1 + store %"variant[]" %206, %"variant[]"* %taddr100, align 8 + %207 = bitcast %"variant[]"* %taddr100 to { i8*, i64 }* + %208 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %207, i32 0, i32 0 + %lo101 = load i8*, i8** %208, align 8 + %209 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %207, i32 0, i32 1 + %hi102 = load i64, i64* %209, align 8 + %210 = call i64 @std_io_printfn(i64* %retparam90, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i32 0, i32 0), i64 8, i8* %lo101, i64 %hi102) + %not_err103 = icmp eq i64 %210, 0 + br i1 %not_err103, label %after_check104, label %voiderr105 + +after_check104: ; preds = %voiderr89 + br label %voiderr105 + +voiderr105: ; preds = %after_check104, %voiderr89 + %211 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 0 + %212 = load i8, i8* %211, align 1 + %zext108 = zext i8 %212 to i32 + %213 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 1 + %214 = load i8, i8* %213, align 1 + %zext109 = zext i8 %214 to i32 + %shl110 = shl i32 %zext109, 8 + %215 = or i32 %shl110, %zext108 + %216 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 2 + %217 = load i8, i8* %216, align 1 + %zext111 = zext i8 %217 to i32 + %shl112 = shl i32 %zext111, 16 + %218 = or i32 %shl112, %215 + %219 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 3 + %220 = load i8, i8* %219, align 1 + %zext113 = zext i8 %220 to i32 + %shl114 = shl i32 %zext113, 24 + %221 = or i32 %shl114, %218 + store i32 %221, i32* %taddr115, align 4 + %222 = bitcast i32* %taddr115 to i8* + %223 = insertvalue %variant undef, i8* %222, 0 + %224 = insertvalue %variant %223, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %225 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots107, i64 0, i64 0 + store %variant %224, %variant* %225, align 16 + %226 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 4 + %227 = load i8, i8* %226, align 1 + %zext116 = zext i8 %227 to i32 + %228 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 5 + %229 = load i8, i8* %228, align 1 + %zext117 = zext i8 %229 to i32 + %shl118 = shl i32 %zext117, 8 + %230 = or i32 %shl118, %zext116 + %231 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 6 + %232 = load i8, i8* %231, align 1 + %zext119 = zext i8 %232 to i32 + %shl120 = shl i32 %zext119, 16 + %233 = or i32 %shl120, %230 + %234 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %235 = load i8, i8* %234, align 1 + %zext121 = zext i8 %235 to i32 + %shl122 = shl i32 %zext121, 24 + %236 = or i32 %shl122, %233 + %237 = and i32 2147483647, %236 + store i32 %237, i32* %taddr123, align 4 + %238 = bitcast i32* %taddr123 to i8* + %239 = insertvalue %variant undef, i8* %238, 0 + %240 = insertvalue %variant %239, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %241 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots107, i64 0, i64 1 + store %variant %240, %variant* %241, align 16 + %242 = getelementptr inbounds [8 x i8], [8 x i8]* %b, i64 0, i64 7 + %243 = load i8, i8* %242, align 1 + %lshrl124 = lshr i8 %243, 7 + %244 = trunc i8 %lshrl124 to i1 + %245 = zext i1 %244 to i8 + store i8 %245, i8* %taddr125, align 1 + %246 = insertvalue %variant undef, i8* %taddr125, 0 + %247 = insertvalue %variant %246, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %248 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots107, i64 0, i64 2 + store %variant %247, %variant* %248, align 16 + %249 = bitcast [3 x %variant]* %varargslots107 to %variant* + %250 = insertvalue %"variant[]" undef, %variant* %249, 0 + %251 = insertvalue %"variant[]" %250, i64 3, 1 + store %"variant[]" %251, %"variant[]"* %taddr126, align 8 + %252 = bitcast %"variant[]"* %taddr126 to { i8*, i64 }* + %253 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %252, i32 0, i32 0 + %lo127 = load i8*, i8** %253, align 8 + %254 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %252, i32 0, i32 1 + %hi128 = load i64, i64* %254, align 8 + %255 = call i64 @std_io_printfn(i64* %retparam106, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.6, i32 0, i32 0), i64 8, i8* %lo127, i64 %hi128) + %not_err129 = icmp eq i64 %255, 0 + br i1 %not_err129, label %after_check130, label %voiderr131 + +after_check130: ; preds = %voiderr105 + br label %voiderr131 + +voiderr131: ; preds = %after_check130, %voiderr105 + ret void +} diff --git a/test/test_suite2/bitstruct/bitstruct_intcontainer.c3t b/test/test_suite14/bitstruct/bitstruct_intcontainer.c3t similarity index 62% rename from test/test_suite2/bitstruct/bitstruct_intcontainer.c3t rename to test/test_suite14/bitstruct/bitstruct_intcontainer.c3t index bb2a46ddd..12580a87f 100644 --- a/test/test_suite2/bitstruct/bitstruct_intcontainer.c3t +++ b/test/test_suite14/bitstruct/bitstruct_intcontainer.c3t @@ -55,51 +55,51 @@ entry: %xxu = alloca i32, align 4 %xxy = alloca i64, align 8 %xxybe = alloca i64, align 8 - store i32 8388128, ptr %xx, align 4 - %0 = load i32, ptr %xx, align 4 + store i32 8388128, i32* %xx, align 4 + %0 = load i32, i32* %xx, align 4 %shl = shl i32 %0, 9 %ashr = ashr i32 %shl, 14 - call void (ptr, ...) @printf(ptr @.str, i32 %ashr) - store i32 1073741375, ptr %xx, align 4 - %1 = load i32, ptr %xx, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) + store i32 1073741375, i32* %xx, align 4 + %1 = load i32, i32* %xx, align 4 %shl1 = shl i32 %1, 9 %ashr2 = ashr i32 %shl1, 14 - call void (ptr, ...) @printf(ptr @.str.1, i32 %ashr2) - store i32 -3485921, ptr %xxu, align 4 - %2 = load i32, ptr %xxu, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %ashr2) + store i32 -3485921, i32* %xxu, align 4 + %2 = load i32, i32* %xxu, align 4 %lshrl = lshr i32 %2, 5 %3 = and i32 262143, %lshrl - call void (ptr, ...) @printf(ptr @.str.2, i32 %3) - store i64 1525363991714123551, ptr %xxy, align 8 - %4 = load i64, ptr %xxy, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %3) + store i64 1525363991714123551, i64* %xxy, align 8 + %4 = load i64, i64* %xxy, align 8 %lshrl3 = lshr i64 %4, 5 %5 = and i64 262143, %lshrl3 %ztrunc = trunc i64 %5 to i32 - %6 = load i64, ptr %xxy, align 8 + %6 = load i64, i64* %xxy, align 8 %lshrl4 = lshr i64 %6, 23 %7 = and i64 262143, %lshrl4 %ztrunc5 = trunc i64 %7 to i32 - %8 = load i64, ptr %xxy, align 8 + %8 = load i64, i64* %xxy, align 8 %lshrl6 = lshr i64 %8, 41 %9 = and i64 2097151, %lshrl6 %ztrunc7 = trunc i64 %9 to i32 - call void (ptr, ...) @printf(ptr @.str.3, i32 %ztrunc, i32 %ztrunc5, i32 %ztrunc7) - store i64 2292133196431502101, ptr %xxybe, align 8 - %10 = load i64, ptr %xxybe, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.3, i32 0, i32 0), i32 %ztrunc, i32 %ztrunc5, i32 %ztrunc7) + store i64 2292133196431502101, i64* %xxybe, align 8 + %10 = load i64, i64* %xxybe, align 8 %11 = call i64 @llvm.bswap.i64(i64 %10) %lshrl8 = lshr i64 %11, 5 %12 = and i64 262143, %lshrl8 %ztrunc9 = trunc i64 %12 to i32 - %13 = load i64, ptr %xxybe, align 8 + %13 = load i64, i64* %xxybe, align 8 %14 = call i64 @llvm.bswap.i64(i64 %13) %lshrl10 = lshr i64 %14, 23 %15 = and i64 262143, %lshrl10 %ztrunc11 = trunc i64 %15 to i32 - %16 = load i64, ptr %xxybe, align 8 + %16 = load i64, i64* %xxybe, align 8 %17 = call i64 @llvm.bswap.i64(i64 %16) %lshrl12 = lshr i64 %17, 41 %18 = and i64 2097151, %lshrl12 %ztrunc13 = trunc i64 %18 to i32 - call void (ptr, ...) @printf(ptr @.str.4, i32 %ztrunc9, i32 %ztrunc11, i32 %ztrunc13) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i32 0, i32 0), i32 %ztrunc9, i32 %ztrunc11, i32 %ztrunc13) ret void } \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitstruct_overlap.c3 b/test/test_suite14/bitstruct/bitstruct_overlap.c3 similarity index 100% rename from test/test_suite2/bitstruct/bitstruct_overlap.c3 rename to test/test_suite14/bitstruct/bitstruct_overlap.c3 diff --git a/test/test_suite2/bitstruct/bitstruct_single_error.c3 b/test/test_suite14/bitstruct/bitstruct_single_error.c3 similarity index 100% rename from test/test_suite2/bitstruct/bitstruct_single_error.c3 rename to test/test_suite14/bitstruct/bitstruct_single_error.c3 diff --git a/test/test_suite14/bitstruct/bitstruct_to_int.c3t b/test/test_suite14/bitstruct/bitstruct_to_int.c3t new file mode 100644 index 000000000..8b45c964e --- /dev/null +++ b/test/test_suite14/bitstruct/bitstruct_to_int.c3t @@ -0,0 +1,109 @@ +// #target: macos-x64 + +module foo; + +extern fn void printf(char*, ...); + +bitstruct Foo : uint +{ + int x : 1..3; + uint y : 11..13; + int z : 15..15; +} + +bitstruct Foo2 : char[4] +{ + int x : 1..3; + uint y : 11..13; + int z : 15..15; +} + +fn void test() +{ + Foo b = {}; + int x = (int)b; + char[4] y = (char[4])b; + Foo *c = &b; + c.x; + int* x2 = (int*)c; + char[4]* y2 = (char[4]*)c; +} + +fn void test2() +{ + Foo2 b = { 3, 2, -1 }; + int x = (int)b; + char[4] y = (char[4])b; + Foo2 *c = &b; + printf("%d\n", c.x); + int* x2 = (int*)c; + char[4]* y2 = (char[4]*)c; +} + +fn void main() +{ + test(); + test2(); +} + +/* #expect: foo.ll + +define void @foo_test() #0 { +entry: + %b = alloca i32, align 4 + %x = alloca i32, align 4 + %y = alloca [4 x i8], align 1 + %c = alloca i32*, align 8 + %x2 = alloca i32*, align 8 + %y2 = alloca [4 x i8]*, align 8 + store i32 0, i32* %b, align 4 + %0 = load i32, i32* %b, align 4 + store i32 %0, i32* %x, align 4 + %1 = bitcast i32* %b to [4 x i8]* + %2 = load [4 x i8], [4 x i8]* %1, align 4 + store [4 x i8] %2, [4 x i8]* %y, align 1 + store i32* %b, i32** %c, align 8 + %3 = load i32*, i32** %c, align 8 + %4 = load i32, i32* %3, align 8 + %shl = shl i32 %4, 28 + %ashr = ashr i32 %shl, 29 + %5 = load i32*, i32** %c, align 8 + store i32* %5, i32** %x2, align 8 + %6 = load i32*, i32** %c, align 8 + %ptrptr = bitcast i32* %6 to [4 x i8]* + store [4 x i8]* %ptrptr, [4 x i8]** %y2, align 8 + ret void +} + +; Function Attrs: nounwind +define void @foo_test2() #0 { +entry: + %b = alloca [4 x i8], align 1 + %x = alloca i32, align 4 + %y = alloca [4 x i8], align 1 + %c = alloca [4 x i8]*, align 8 + %x2 = alloca i32*, align 8 + %y2 = alloca [4 x i8]*, align 8 + store [4 x i8] c"\06\90\00\00", [4 x i8]* %b, align 1 + %0 = bitcast [4 x i8]* %b to i32* + %1 = load i32, i32* %0, align 1 + store i32 %1, i32* %x, align 4 + %2 = bitcast [4 x i8]* %y to i8* + %3 = bitcast [4 x i8]* %b to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %2, i8* align 1 %3, i32 4, i1 false) + store [4 x i8]* %b, [4 x i8]** %c, align 8 + %4 = load [4 x i8]*, [4 x i8]** %c, align 8 + %5 = getelementptr inbounds [4 x i8], [4 x i8]* %4, i64 0, i64 0 + %6 = load i8, i8* %5, align 1 + %zext = zext i8 %6 to i32 + %lshrl = lshr i32 %zext, 1 + %shl = shl i32 %lshrl, 29 + %ashr = ashr i32 %shl, 29 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %ashr) + %7 = load [4 x i8]*, [4 x i8]** %c, align 8 + %ptrptr = bitcast [4 x i8]* %7 to i32* + store i32* %ptrptr, i32** %x2, align 8 + %8 = load [4 x i8]*, [4 x i8]** %c, align 8 + store [4 x i8]* %8, [4 x i8]** %y2, align 8 + ret void +} diff --git a/test/test_suite14/bitstruct/embedded_bitstruct.c3t b/test/test_suite14/bitstruct/embedded_bitstruct.c3t new file mode 100644 index 000000000..9614c47d8 --- /dev/null +++ b/test/test_suite14/bitstruct/embedded_bitstruct.c3t @@ -0,0 +1,81 @@ +// #target: macos-x64 + +module foo; + +struct Bar +{ + int x; + struct + { + struct + { + int y; + } + } + bitstruct : uint + { + int ww : 2..10; + } +} + +struct Foo +{ + struct + { + struct + { + int x; + } + struct + { + int y; + } + int z; + } + int w; +} +extern fn void printf(char*, ...); + +fn void main() +{ + Bar b = { 1, 2, -5 }; + printf("%d %d\n", b.y, b.ww); + Foo f = { 5, 6, 7, 8 }; + printf("%d %d %d %d\n", f.x, f.y, f.z, f.w); +} + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %b = alloca %Bar, align 4 + %f = alloca %Foo, align 4 + %0 = bitcast %Bar* %b to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Bar* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 + %2 = getelementptr inbounds %.anon, %.anon* %1, i32 0, i32 0 + %3 = getelementptr inbounds %.anon.0, %.anon.0* %2, i32 0, i32 0 + %4 = load i32, i32* %3, align 4 + %5 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 2 + %6 = load i32, i32* %5, align 4 + %shl = shl i32 %6, 21 + %ashr = ashr i32 %shl, 23 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i32 %4, i32 %ashr) + %7 = bitcast %Foo* %f to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %7, i8* align 4 bitcast (%Foo* @.__const.10 to i8*), i32 16, i1 false) + %8 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 0 + %9 = getelementptr inbounds %.anon.1, %.anon.1* %8, i32 0, i32 0 + %10 = getelementptr inbounds %.anon.2, %.anon.2* %9, i32 0, i32 0 + %11 = load i32, i32* %10, align 4 + %12 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 0 + %13 = getelementptr inbounds %.anon.1, %.anon.1* %12, i32 0, i32 1 + %14 = getelementptr inbounds %.anon.3, %.anon.3* %13, i32 0, i32 0 + %15 = load i32, i32* %14, align 4 + %16 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 0 + %17 = getelementptr inbounds %.anon.1, %.anon.1* %16, i32 0, i32 2 + %18 = load i32, i32* %17, align 4 + %19 = getelementptr inbounds %Foo, %Foo* %f, i32 0, i32 1 + %20 = load i32, i32* %19, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.11, i32 0, i32 0), i32 %11, i32 %15, i32 %18, i32 %20) + ret void +} diff --git a/test/test_suite2/bitstruct/invalid_bitstruct_member_types.c3 b/test/test_suite14/bitstruct/invalid_bitstruct_member_types.c3 similarity index 100% rename from test/test_suite2/bitstruct/invalid_bitstruct_member_types.c3 rename to test/test_suite14/bitstruct/invalid_bitstruct_member_types.c3 diff --git a/test/test_suite2/bitstruct/invalid_bitstruct_name_other_ident.c3 b/test/test_suite14/bitstruct/invalid_bitstruct_name_other_ident.c3 similarity index 100% rename from test/test_suite2/bitstruct/invalid_bitstruct_name_other_ident.c3 rename to test/test_suite14/bitstruct/invalid_bitstruct_name_other_ident.c3 diff --git a/test/test_suite2/bitstruct/invalid_bitstruct_type.c3 b/test/test_suite14/bitstruct/invalid_bitstruct_type.c3 similarity index 100% rename from test/test_suite2/bitstruct/invalid_bitstruct_type.c3 rename to test/test_suite14/bitstruct/invalid_bitstruct_type.c3 diff --git a/test/test_suite2/bitstruct/invalid_empty_struct_union.c3 b/test/test_suite14/bitstruct/invalid_empty_struct_union.c3 similarity index 100% rename from test/test_suite2/bitstruct/invalid_empty_struct_union.c3 rename to test/test_suite14/bitstruct/invalid_empty_struct_union.c3 diff --git a/test/test_suite2/bitstruct/missing_bitstruct_type.c3 b/test/test_suite14/bitstruct/missing_bitstruct_type.c3 similarity index 100% rename from test/test_suite2/bitstruct/missing_bitstruct_type.c3 rename to test/test_suite14/bitstruct/missing_bitstruct_type.c3 diff --git a/test/test_suite2/builtins/builtin_vector_abs.c3t b/test/test_suite14/builtins/builtin_vector_abs.c3t similarity index 100% rename from test/test_suite2/builtins/builtin_vector_abs.c3t rename to test/test_suite14/builtins/builtin_vector_abs.c3t diff --git a/test/test_suite2/builtins/builtin_vector_min_max.c3t b/test/test_suite14/builtins/builtin_vector_min_max.c3t similarity index 100% rename from test/test_suite2/builtins/builtin_vector_min_max.c3t rename to test/test_suite14/builtins/builtin_vector_min_max.c3t diff --git a/test/test_suite2/builtins/builtin_with_optional.c3 b/test/test_suite14/builtins/builtin_with_optional.c3 similarity index 100% rename from test/test_suite2/builtins/builtin_with_optional.c3 rename to test/test_suite14/builtins/builtin_with_optional.c3 diff --git a/test/test_suite2/builtins/exacts.c3t b/test/test_suite14/builtins/exacts.c3t similarity index 87% rename from test/test_suite2/builtins/exacts.c3t rename to test/test_suite14/builtins/exacts.c3t index de670fee6..9012d5d91 100644 --- a/test/test_suite2/builtins/exacts.c3t +++ b/test/test_suite14/builtins/exacts.c3t @@ -11,7 +11,7 @@ fn void main() int z4 = $$add(x, y); int z5 = $$sub(x, y); int z6 = $$neg(x); - io::printfln("%s %s %s %s %s %s", z1, z2, z3, z4, z5, z6); + io::printfn("%s %s %s %s %s %s", z1, z2, z3, z4, z5, z6); } /* #expect: test.ll diff --git a/test/test_suite2/builtins/mem.c3t b/test/test_suite14/builtins/mem.c3t similarity index 54% rename from test/test_suite2/builtins/mem.c3t rename to test/test_suite14/builtins/mem.c3t index 08c1ea6e1..416fd4196 100644 --- a/test/test_suite2/builtins/mem.c3t +++ b/test/test_suite14/builtins/mem.c3t @@ -16,8 +16,7 @@ fn void main() /* #expect: test.ll - call void @llvm.memcpy.p0.p0.i64(ptr align 2 %dst, ptr align 2 %src, i64 2, i1 false) - call void @llvm.memmove.p0.p0.i64(ptr align 2 %dst, ptr align 2 %src, i64 2, i1 false) - call void @llvm.memset.p0.i64(ptr align 2 %dst, i8 0, i64 2, i1 false) - call void @llvm.memcpy.inline.p0.p0.i64(ptr align 2 %dst, ptr align 2 %src, i64 2, i1 false) - call void @llvm.memset.inline.p0.i64(ptr align 2 %dst, i8 0, i64 2, i1 false) + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 2 %0, i8* align 2 %1, i64 2, i1 false) + call void @llvm.memmove.p0i8.p0i8.i64(i8* align 2 %2, i8* align 2 %3, i64 2, i1 false) + call void @llvm.memset.p0i8.i64(i8* align 2 %4, i8 0, i64 2, i1 false) + call void @llvm.memcpy.inline.p0i8.p0i8.i64(i8* align 2 %5, i8* align 2 %6, i64 2, i1 false) diff --git a/test/test_suite2/builtins/overflows.c3t b/test/test_suite14/builtins/overflows.c3t similarity index 58% rename from test/test_suite2/builtins/overflows.c3t rename to test/test_suite14/builtins/overflows.c3t index 811c64a27..1c728775c 100644 --- a/test/test_suite2/builtins/overflows.c3t +++ b/test/test_suite14/builtins/overflows.c3t @@ -14,53 +14,53 @@ fn void main() bool success3 = $$overflow_add(x, x, &z3); bool success4 = $$overflow_sub($$neg(y), y, &z4); bool success5 = $$overflow_sub(x, y, &z5); - io::printfln("%s %s", success1, z1); - io::printfln("%s %s", success2, z2); - io::printfln("%s %s", success3, z3); - io::printfln("%s %s", success4, z4); - io::printfln("%s %s", success5, z5); + io::printfn("%s %s", success1, z1); + io::printfn("%s %s", success2, z2); + io::printfn("%s %s", success3, z3); + io::printfn("%s %s", success4, z4); + io::printfn("%s %s", success5, z5); } /* #expect: test.ll - %0 = load i8, ptr %x, align 1 - %1 = load i8, ptr %y, align 1 + %0 = load i8, i8* %x, align 1 + %1 = load i8, i8* %y, align 1 %2 = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 %0, i8 %1) %3 = extractvalue { i8, i1 } %2, 1 %4 = extractvalue { i8, i1 } %2, 0 - store i8 %4, ptr %z1, align 1 + store i8 %4, i8* %z1, align 1 %5 = zext i1 %3 to i8 - store i8 %5, ptr %success1, align 1 - %6 = load i8, ptr %x, align 1 - %7 = load i8, ptr %y, align 1 + store i8 %5, i8* %success1, align 1 + %6 = load i8, i8* %x, align 1 + %7 = load i8, i8* %y, align 1 %8 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %6, i8 %7) %9 = extractvalue { i8, i1 } %8, 1 %10 = extractvalue { i8, i1 } %8, 0 - store i8 %10, ptr %z2, align 1 + store i8 %10, i8* %z2, align 1 %11 = zext i1 %9 to i8 - store i8 %11, ptr %success2, align 1 - %12 = load i8, ptr %x, align 1 - %13 = load i8, ptr %x, align 1 + store i8 %11, i8* %success2, align 1 + %12 = load i8, i8* %x, align 1 + %13 = load i8, i8* %x, align 1 %14 = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %12, i8 %13) %15 = extractvalue { i8, i1 } %14, 1 %16 = extractvalue { i8, i1 } %14, 0 - store i8 %16, ptr %z3, align 1 + store i8 %16, i8* %z3, align 1 %17 = zext i1 %15 to i8 - store i8 %17, ptr %success3, align 1 - %18 = load i8, ptr %y, align 1 + store i8 %17, i8* %success3, align 1 + %18 = load i8, i8* %y, align 1 %eneg = sub i8 0, %18 - %19 = load i8, ptr %y, align 1 + %19 = load i8, i8* %y, align 1 %20 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %eneg, i8 %19) %21 = extractvalue { i8, i1 } %20, 1 %22 = extractvalue { i8, i1 } %20, 0 - store i8 %22, ptr %z4, align 1 + store i8 %22, i8* %z4, align 1 %23 = zext i1 %21 to i8 - store i8 %23, ptr %success4, align 1 - %24 = load i8, ptr %x, align 1 - %25 = load i8, ptr %y, align 1 + store i8 %23, i8* %success4, align 1 + %24 = load i8, i8* %x, align 1 + %25 = load i8, i8* %y, align 1 %26 = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %24, i8 %25) %27 = extractvalue { i8, i1 } %26, 1 %28 = extractvalue { i8, i1 } %26, 0 - store i8 %28, ptr %z5, align 1 + store i8 %28, i8* %z5, align 1 %29 = zext i1 %27 to i8 - store i8 %29, ptr %success5, align 1 + store i8 %29, i8* %success5, align 1 diff --git a/test/test_suite14/builtins/prefetch.c3t b/test/test_suite14/builtins/prefetch.c3t new file mode 100644 index 000000000..79084d5e0 --- /dev/null +++ b/test/test_suite14/builtins/prefetch.c3t @@ -0,0 +1,25 @@ +// #target: macos-x64 +module test; +import std::io; + +fn void main() +{ + int a; + $$prefetch(&a, 1, 3); + $$prefetch(&a, 0, 1); + prefetch(&a); +} + +/* #expect: test.ll + + %a = alloca i32, align 4 + %ptr = alloca i8*, align 8 + store i32 0, i32* %a, align 4 + %ptrptr = bitcast i32* %a to i8* + call void @llvm.prefetch.p0i8(i8* %ptrptr, i32 1, i32 3, i32 1) + %ptrptr1 = bitcast i32* %a to i8* + call void @llvm.prefetch.p0i8(i8* %ptrptr1, i32 0, i32 1, i32 1) + %ptrptr2 = bitcast i32* %a to i8* + store i8* %ptrptr2, i8** %ptr, align 8 + %0 = load i8*, i8** %ptr, align 8 + call void @llvm.prefetch.p0i8(i8* %0, i32 0, i32 3, i32 1) diff --git a/test/test_suite2/builtins/reduce_arithmetics.c3t b/test/test_suite14/builtins/reduce_arithmetics.c3t similarity index 60% rename from test/test_suite2/builtins/reduce_arithmetics.c3t rename to test/test_suite14/builtins/reduce_arithmetics.c3t index e3dde3378..49601fb29 100644 --- a/test/test_suite2/builtins/reduce_arithmetics.c3t +++ b/test/test_suite14/builtins/reduce_arithmetics.c3t @@ -5,21 +5,21 @@ import std::io; fn void main() { int a; - io::printfln("%s", $$pow_int(double[<2>] { 23.3, 2.1 }, 3)); - io::printfln("%s", $$reduce_add(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_fadd(double[<2>] { 3, 10 }, -0.0)); - io::printfln("%s", $$reduce_fadd(double[<2>] { 3, 10 }, 3.2)); - io::printfln("%s", $$reduce_mul(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_fmul(double[<2>] { 3, 10 }, 3.4)); - io::printfln("%s", $$reduce_and(int[<2>] { 3, 11 })); - io::printfln("%s", $$reduce_or(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_xor(int[<2>] { 3, 10 })); - io::printfln("%s", $$reduce_max(double[<2>] { 23.2, 23.3 })); - io::printfln("%s", $$reduce_max(int[<2>] { -23, 32 })); - io::printfln("%s", $$reduce_max(char[<2>] { 4, 253 })); - io::printfln("%s", $$reduce_min(double[<2>] { 23.2, 23.3 })); - io::printfln("%s", $$reduce_min(int[<2>] { -23, 32 })); - io::printfln("%s", $$reduce_min(char[<2>] { 4, 253 })); + io::printfn("%s", $$pow_int(double[<2>] { 23.3, 2.1 }, 3)); + io::printfn("%s", $$reduce_add(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_fadd(double[<2>] { 3, 10 }, -0.0)); + io::printfn("%s", $$reduce_fadd(double[<2>] { 3, 10 }, 3.2)); + io::printfn("%s", $$reduce_mul(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_fmul(double[<2>] { 3, 10 }, 3.4)); + io::printfn("%s", $$reduce_and(int[<2>] { 3, 11 })); + io::printfn("%s", $$reduce_or(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_xor(int[<2>] { 3, 10 })); + io::printfn("%s", $$reduce_max(double[<2>] { 23.2, 23.3 })); + io::printfn("%s", $$reduce_max(int[<2>] { -23, 32 })); + io::printfn("%s", $$reduce_max(char[<2>] { 4, 253 })); + io::printfn("%s", $$reduce_min(double[<2>] { 23.2, 23.3 })); + io::printfn("%s", $$reduce_min(int[<2>] { -23, 32 })); + io::printfn("%s", $$reduce_min(char[<2>] { 4, 253 })); } diff --git a/test/test_suite2/builtins/reverse_builtin.c3t b/test/test_suite14/builtins/reverse_builtin.c3t similarity index 86% rename from test/test_suite2/builtins/reverse_builtin.c3t rename to test/test_suite14/builtins/reverse_builtin.c3t index a3b556f78..effef43d0 100644 --- a/test/test_suite2/builtins/reverse_builtin.c3t +++ b/test/test_suite14/builtins/reverse_builtin.c3t @@ -6,7 +6,7 @@ import std::io; fn void main() { int[<4>] a = { 1, -3, 5, -7 }; - io::printfln("%s", $$reverse(a)); + io::printfn("%s", $$reverse(a)); } /* #expect: test.ll diff --git a/test/test_suite2/builtins/rounding_builtins.c3t b/test/test_suite14/builtins/rounding_builtins.c3t similarity index 100% rename from test/test_suite2/builtins/rounding_builtins.c3t rename to test/test_suite14/builtins/rounding_builtins.c3t diff --git a/test/test_suite2/builtins/sat_builtins.c3t b/test/test_suite14/builtins/sat_builtins.c3t similarity index 59% rename from test/test_suite2/builtins/sat_builtins.c3t rename to test/test_suite14/builtins/sat_builtins.c3t index b56e7ddf3..4a10937ee 100644 --- a/test/test_suite2/builtins/sat_builtins.c3t +++ b/test/test_suite14/builtins/sat_builtins.c3t @@ -7,18 +7,18 @@ fn void main() { char a = 123; char b = 222; - io::printfln("%s %s", $$sat_add(a, b), $$sat_add((ichar)a, (ichar)30)); - io::printfln("%s %s", $$sat_sub(a, b), $$sat_sub((ichar)-120, (ichar)10)); + io::printfn("%s %s", $$sat_add(a, b), $$sat_add((ichar)a, (ichar)30)); + io::printfn("%s %s", $$sat_sub(a, b), $$sat_sub((ichar)-120, (ichar)10)); b = 3; - io::printfln("%s %s", $$sat_shl(a, b), $$sat_shl((ichar)a, (ichar)1)); + io::printfn("%s %s", $$sat_shl(a, b), $$sat_shl((ichar)a, (ichar)1)); b = 222; char[<2>] x = { 123, 222 }; char[<2>] y = { 143, 50 }; ichar[<2>] z = { 120, -120 }; ichar[<2>] w = { -44, 30 }; - io::printfln("%s %s", $$sat_add(x, y), $$sat_add(z, z)); - io::printfln("%s %s", $$sat_sub(x, y), $$sat_sub(w, z)); - io::printfln("%s %s", $$sat_shl(x, char[<2>] { 1, 1 }), $$sat_shl(z, ichar[<2>] { 1, 1 })); + io::printfn("%s %s", $$sat_add(x, y), $$sat_add(z, z)); + io::printfn("%s %s", $$sat_sub(x, y), $$sat_sub(w, z)); + io::printfn("%s %s", $$sat_shl(x, char[<2>] { 1, 1 }), $$sat_shl(z, ichar[<2>] { 1, 1 })); } /* #expect: test.ll diff --git a/test/test_suite14/builtins/shufflevector.c3t b/test/test_suite14/builtins/shufflevector.c3t new file mode 100644 index 000000000..b4b81fc2f --- /dev/null +++ b/test/test_suite14/builtins/shufflevector.c3t @@ -0,0 +1,101 @@ +// #target: macos-x64 + +module test; +import std::io; + +struct Matrix2x2 +{ + union + { + struct + { + float m00, m01; + float m10, m11; + } + struct + { + float[<2>] m0; + float[<2>] m1; + } + float[<4>] m; + } +} + +fn float[<2>] apply1(Matrix2x2* mat, float[<2>] vec) +{ + return float[<2>] { + mat.m00 * vec[0] + mat.m01 * vec[1], + mat.m10 * vec[0] + mat.m11 * vec[1], + }; +} + +fn float[<2>] apply2(Matrix2x2* mat, float[<2>] vec) +{ + return float[<2>] { + mat.m0[0] * vec[0] + mat.m0[1] * vec[1], + mat.m1[0] * vec[0] + mat.m1[1] * vec[1], + }; +} + +fn float[<2>] apply3(Matrix2x2* mat, float[<2>] vec) +{ + float[<2>] a = $$shufflevector(mat.m0, mat.m1, { 0, 3 }); + float[<2>] b = $$shufflevector(mat.m0, mat.m1, { 1, 2 }); + float[<2>] flip = $$shufflevector(vec, { 1, 0 }); + return a * vec + b * flip; +} + + +fn void main() +{ + Matrix2x2 a = { 1, -3, 5, -7 }; + io::printfn("1: %s", apply1(&a, float[<2>] { 11, 13 })); + io::printfn("2: %s", apply2(&a, float[<2>] { 11, 13 })); + io::printfn("3: %s", apply3(&a, float[<2>] { 11, 13 })); +} + +/* #expect: test.ll + +define double @test_apply3(%Matrix2x2* %0, double %1) #0 { +entry: + %vec = alloca <2 x float>, align 8 + %a = alloca <2 x float>, align 8 + %b = alloca <2 x float>, align 8 + %flip = alloca <2 x float>, align 8 + %taddr = alloca <2 x float>, align 8 + %2 = bitcast <2 x float>* %vec to double* + store double %1, double* %2, align 8 + %3 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 + %4 = bitcast %.anon* %3 to %.anon.1* + %5 = getelementptr inbounds %.anon.1, %.anon.1* %4, i32 0, i32 0 + %6 = load <2 x float>, <2 x float>* %5, align 8 + %7 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 + %8 = bitcast %.anon* %7 to %.anon.1* + %9 = getelementptr inbounds %.anon.1, %.anon.1* %8, i32 0, i32 1 + %10 = load <2 x float>, <2 x float>* %9, align 8 + %shuffle = shufflevector <2 x float> %6, <2 x float> %10, <2 x i32> + store <2 x float> %shuffle, <2 x float>* %a, align 8 + %11 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 + %12 = bitcast %.anon* %11 to %.anon.1* + %13 = getelementptr inbounds %.anon.1, %.anon.1* %12, i32 0, i32 0 + %14 = load <2 x float>, <2 x float>* %13, align 8 + %15 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %0, i32 0, i32 0 + %16 = bitcast %.anon* %15 to %.anon.1* + %17 = getelementptr inbounds %.anon.1, %.anon.1* %16, i32 0, i32 1 + %18 = load <2 x float>, <2 x float>* %17, align 8 + %shuffle1 = shufflevector <2 x float> %14, <2 x float> %18, <2 x i32> + store <2 x float> %shuffle1, <2 x float>* %b, align 8 + %19 = load <2 x float>, <2 x float>* %vec, align 8 + %shuffle2 = shufflevector <2 x float> %19, <2 x float> poison, <2 x i32> + store <2 x float> %shuffle2, <2 x float>* %flip, align 8 + %20 = load <2 x float>, <2 x float>* %a, align 8 + %21 = load <2 x float>, <2 x float>* %vec, align 8 + %fmul = fmul <2 x float> %20, %21 + %22 = load <2 x float>, <2 x float>* %b, align 8 + %23 = load <2 x float>, <2 x float>* %flip, align 8 + %fmul3 = fmul <2 x float> %22, %23 + %fadd = fadd <2 x float> %fmul, %fmul3 + store <2 x float> %fadd, <2 x float>* %taddr, align 8 + %24 = bitcast <2 x float>* %taddr to double* + %25 = load double, double* %24, align 8 + ret double %25 \ No newline at end of file diff --git a/test/test_suite14/builtins/simple_builtins.c3t b/test/test_suite14/builtins/simple_builtins.c3t new file mode 100644 index 000000000..913250933 --- /dev/null +++ b/test/test_suite14/builtins/simple_builtins.c3t @@ -0,0 +1,62 @@ +// #target: macos-x64 +module foo; + +fn int foo(double b) +{ + double d = $$ceil(b); + double e = $$max(1.0, d); + double f = $$fma(d, 2.0, 3.0); + double m = $$fmuladd(d, 2.0, 3.0); + int xeb = 13; + + int[3] abcd; + int sy = $$volatile_load(&xeb); + $$volatile_store(&xeb, sy + 1); + $$volatile_store(&abcd[2], sy + 2); + sy = $$volatile_load(&abcd[2]); + return 1; +} + +/* #expect: foo.ll + +define i32 @foo_foo(double %0) #0 { +entry: + %d = alloca double, align 8 + %e = alloca double, align 8 + %f = alloca double, align 8 + %m = alloca double, align 8 + %xeb = alloca i32, align 4 + %abcd = alloca [3 x i32], align 4 + %sy = alloca i32, align 4 + %1 = call double @llvm.ceil.f64(double %0) + store double %1, double* %d, align 8 + %2 = load double, double* %d, align 8 + %3 = call double @llvm.maxnum.f64(double 1.000000e+00, double %2) + store double %3, double* %e, align 8 + %4 = load double, double* %d, align 8 + %5 = call double @llvm.fma.f64(double %4, double 2.000000e+00, double 3.000000e+00) + store double %5, double* %f, align 8 + %6 = load double, double* %d, align 8 + %7 = call double @llvm.fmuladd.f64(double %6, double 2.000000e+00, double 3.000000e+00) + store double %7, double* %m, align 8 + store i32 13, i32* %xeb, align 4 + %8 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 0 + store i32 0, i32* %8, align 4 + %9 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 1 + store i32 0, i32* %9, align 4 + %10 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2 + store i32 0, i32* %10, align 4 + %11 = load volatile i32, i32* %xeb, align 4 + store i32 %11, i32* %sy, align 4 + %12 = load i32, i32* %sy, align 4 + %add = add i32 %12, 1 + store volatile i32 %add, i32* %xeb, align 4 + %13 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2 + %14 = load i32, i32* %sy, align 4 + %add1 = add i32 %14, 2 + store volatile i32 %add1, i32* %13, align 4 + %15 = getelementptr inbounds [3 x i32], [3 x i32]* %abcd, i64 0, i64 2 + %16 = load volatile i32, i32* %15, align 4 + store i32 %16, i32* %sy, align 4 + ret i32 1 +} diff --git a/test/test_suite14/cast/cast_from_ptr.c3t b/test/test_suite14/cast/cast_from_ptr.c3t new file mode 100644 index 000000000..5fd784a32 --- /dev/null +++ b/test/test_suite14/cast/cast_from_ptr.c3t @@ -0,0 +1,18 @@ +module test; + +fn void tester() +{ + int *x; + short y = (short)((uptr)(x)); + uptr z = (uptr)((short)((uptr)(x))); +} + +/* #expect: test.ll + + %0 = load i32*, i32** %x, align 8 + %ptrxi = ptrtoint i32* %0 to i16 + store i16 %ptrxi, i16* %y, align 2 + %1 = load i32*, i32** %x, align 8 + %ptrxi1 = ptrtoint i32* %1 to i16 + %siuiext = sext i16 %ptrxi1 to i64 + store i64 %siuiext, i64* %z, align 8 diff --git a/test/test_suite2/cast/cast_ok.c3 b/test/test_suite14/cast/cast_ok.c3 similarity index 100% rename from test/test_suite2/cast/cast_ok.c3 rename to test/test_suite14/cast/cast_ok.c3 diff --git a/test/test_suite2/cast/cast_parse_fails.c3 b/test/test_suite14/cast/cast_parse_fails.c3 similarity index 100% rename from test/test_suite2/cast/cast_parse_fails.c3 rename to test/test_suite14/cast/cast_parse_fails.c3 diff --git a/test/test_suite2/cast/cast_parse_fails2.c3 b/test/test_suite14/cast/cast_parse_fails2.c3 similarity index 100% rename from test/test_suite2/cast/cast_parse_fails2.c3 rename to test/test_suite14/cast/cast_parse_fails2.c3 diff --git a/test/test_suite2/cast/cast_struct.c3 b/test/test_suite14/cast/cast_struct.c3 similarity index 100% rename from test/test_suite2/cast/cast_struct.c3 rename to test/test_suite14/cast/cast_struct.c3 diff --git a/test/test_suite2/cast/cast_struct_fails.c3 b/test/test_suite14/cast/cast_struct_fails.c3 similarity index 100% rename from test/test_suite2/cast/cast_struct_fails.c3 rename to test/test_suite14/cast/cast_struct_fails.c3 diff --git a/test/test_suite2/cast/cast_to_failable.c3 b/test/test_suite14/cast/cast_to_failable.c3 similarity index 100% rename from test/test_suite2/cast/cast_to_failable.c3 rename to test/test_suite14/cast/cast_to_failable.c3 diff --git a/test/test_suite14/cast/implicit_infer_len_cast.c3t b/test/test_suite14/cast/implicit_infer_len_cast.c3t new file mode 100644 index 000000000..b12a4ce60 --- /dev/null +++ b/test/test_suite14/cast/implicit_infer_len_cast.c3t @@ -0,0 +1,66 @@ +// #target: macos-x64 +module test; + +macro int test(int[*][*]* y) +{ + $typeof(*y) z = *y; + return z[1][1]; +} +fn void main() +{ + int[2][*] x = { { 2, 3}, { 5, 6 }}; + int[<2>][*] y = { { 1, 3 }}; + int[<*>][*] z = y; + int[<2>][1] w = z; + int[<2>][] aa = { { 1, 3 }}; + int[][*] bb = { { 1, 3 } }; + test(&x); +} +/* #expect: test.ll + + %x = alloca [2 x [2 x i32]], align 16 + %y = alloca [1 x <2 x i32>], align 8 + %z = alloca [1 x <2 x i32>], align 8 + %w = alloca [1 x <2 x i32>], align 8 + %aa = alloca %"int[<2>][]", align 8 + %literal = alloca [1 x <2 x i32>], align 8 + %bb = alloca [1 x %"int[]"], align 16 + %literal1 = alloca [2 x i32], align 4 + %y2 = alloca [2 x [2 x i32]]*, align 8 + %z3 = alloca [2 x [2 x i32]], align 16 + %0 = bitcast [2 x [2 x i32]]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %0, i8* align 16 bitcast ([2 x [2 x i32]]* @.__const to i8*), i32 16, i1 false) + %1 = bitcast [1 x <2 x i32>]* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 bitcast ([1 x <2 x i32>]* @.__const.1 to i8*), i32 8, i1 false) + %2 = bitcast [1 x <2 x i32>]* %z to i8* + %3 = bitcast [1 x <2 x i32>]* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %2, i8* align 8 %3, i32 8, i1 false) + %4 = bitcast [1 x <2 x i32>]* %w to i8* + %5 = bitcast [1 x <2 x i32>]* %z to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 8, i1 false) + %6 = getelementptr inbounds [1 x <2 x i32>], [1 x <2 x i32>]* %literal, i64 0, i64 0 + %7 = getelementptr inbounds <2 x i32>, <2 x i32>* %6, i64 0, i64 0 + store i32 1, i32* %7, align 4 + %8 = getelementptr inbounds <2 x i32>, <2 x i32>* %6, i64 0, i64 1 + store i32 3, i32* %8, align 4 + %9 = bitcast [1 x <2 x i32>]* %literal to <2 x i32>* + %10 = insertvalue %"int[<2>][]" undef, <2 x i32>* %9, 0 + %11 = insertvalue %"int[<2>][]" %10, i64 1, 1 + store %"int[<2>][]" %11, %"int[<2>][]"* %aa, align 8 + %12 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %bb, i64 0, i64 0 + %13 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 0 + store i32 1, i32* %13, align 4 + %14 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 1 + store i32 3, i32* %14, align 4 + %15 = bitcast [2 x i32]* %literal1 to i32* + %16 = insertvalue %"int[]" undef, i32* %15, 0 + %17 = insertvalue %"int[]" %16, i64 2, 1 + store %"int[]" %17, %"int[]"* %12, align 16 + store [2 x [2 x i32]]* %x, [2 x [2 x i32]]** %y2, align 8 + %18 = load [2 x [2 x i32]]*, [2 x [2 x i32]]** %y2, align 8 + %19 = bitcast [2 x [2 x i32]]* %z3 to i8* + %20 = bitcast [2 x [2 x i32]]* %18 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %19, i8* align 8 %20, i32 16, i1 false) + %21 = getelementptr inbounds [2 x [2 x i32]], [2 x [2 x i32]]* %z3, i64 0, i64 1 + %22 = getelementptr inbounds [2 x i32], [2 x i32]* %21, i64 0, i64 1 + ret void diff --git a/test/test_suite2/cast/top_down_cast_fails.c3 b/test/test_suite14/cast/top_down_cast_fails.c3 similarity index 100% rename from test/test_suite2/cast/top_down_cast_fails.c3 rename to test/test_suite14/cast/top_down_cast_fails.c3 diff --git a/test/test_suite2/cast/top_down_casts.c3t b/test/test_suite14/cast/top_down_casts.c3t similarity index 61% rename from test/test_suite2/cast/top_down_casts.c3t rename to test/test_suite14/cast/top_down_casts.c3t index e9054b2bf..ac882bf5a 100644 --- a/test/test_suite2/cast/top_down_casts.c3t +++ b/test/test_suite14/cast/top_down_casts.c3t @@ -24,70 +24,70 @@ entry: %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 + store i32 0, i32* %x, align 4 + store i32 0, i32* %y, align 4 + %0 = load i32, i32* %x, align 4 %sisiext = sext i32 %0 to i64 - %1 = load i32, ptr %y, align 4 + %1 = load i32, i32* %y, align 4 %sisiext1 = sext i32 %1 to i64 %mul = mul i64 %sisiext, %sisiext1 - store i64 %mul, ptr %z, align 8 - %2 = load i32, ptr %x, align 4 + store i64 %mul, i64* %z, align 8 + %2 = load i32, i32* %x, align 4 %sisiext2 = sext i32 %2 to i64 - %3 = load i32, ptr %y, align 4 + %3 = load i32, i32* %y, align 4 %sisiext3 = sext i32 %3 to i64 %sdiv = sdiv i64 %sisiext2, %sisiext3 - store i64 %sdiv, ptr %z, align 8 - %4 = load i32, ptr %x, align 4 + store i64 %sdiv, i64* %z, align 8 + %4 = load i32, i32* %x, align 4 %sisiext4 = sext i32 %4 to i64 - %5 = load i32, ptr %y, align 4 + %5 = load i32, i32* %y, align 4 %sisiext5 = sext i32 %5 to i64 %add = add i64 %sisiext4, %sisiext5 - store i64 %add, ptr %z, align 8 - %6 = load i32, ptr %x, align 4 + store i64 %add, i64* %z, align 8 + %6 = load i32, i32* %x, align 4 %sisiext6 = sext i32 %6 to i64 - %7 = load i32, ptr %y, align 4 + %7 = load i32, i32* %y, align 4 %sisiext7 = sext i32 %7 to i64 %sub = sub i64 %sisiext6, %sisiext7 - store i64 %sub, ptr %z, align 8 - %8 = load i32, ptr %x, align 4 + store i64 %sub, i64* %z, align 8 + %8 = load i32, i32* %x, align 4 %sisiext8 = sext i32 %8 to i64 - %9 = load i32, ptr %y, align 4 + %9 = load i32, i32* %y, align 4 %sisiext9 = sext i32 %9 to i64 %smod = srem i64 %sisiext8, %sisiext9 - store i64 %smod, ptr %z, align 8 - %10 = load i32, ptr %x, align 4 + store i64 %smod, i64* %z, align 8 + %10 = load i32, i32* %x, align 4 %sisiext10 = sext i32 %10 to i64 - %11 = load i32, ptr %y, align 4 + %11 = load i32, i32* %y, align 4 %zext = zext i32 %11 to i64 %shl = shl i64 %sisiext10, %zext %12 = freeze i64 %shl - store i64 %12, ptr %z, align 8 - %13 = load i32, ptr %x, align 4 + store i64 %12, i64* %z, align 8 + %13 = load i32, i32* %x, align 4 %sisiext11 = sext i32 %13 to i64 - %14 = load i32, ptr %y, align 4 + %14 = load i32, i32* %y, align 4 %zext12 = zext i32 %14 to i64 %ashr = ashr i64 %sisiext11, %zext12 %15 = freeze i64 %ashr - store i64 %15, ptr %z, align 8 - %16 = load i32, ptr %x, align 4 + store i64 %15, i64* %z, align 8 + %16 = load i32, i32* %x, align 4 %sisiext13 = sext i32 %16 to i64 %bnot = xor i64 %sisiext13, -1 - store i64 %bnot, ptr %z, align 8 - %17 = load i32, ptr %x, align 4 + store i64 %bnot, i64* %z, align 8 + %17 = load i32, i32* %x, align 4 %sisiext14 = sext i32 %17 to i64 - %18 = load i32, ptr %x, align 4 + %18 = load i32, i32* %x, align 4 %sisiext15 = sext i32 %18 to i64 %neg = sub i64 0, %sisiext15 - store i64 %neg, 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 + store i64 %neg, i64* %z, align 8 + store i64 0, i64* %w.f, align 8 + store i32 0, i32* %w, align 4 + %optval = load i64, i64* %w.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %19 = load i32, ptr %w, align 4 + %19 = load i32, i32* %w, align 4 %sisiext16 = sext i32 %19 to i64 br label %phi_block @@ -96,6 +96,6 @@ else_block: ; preds = %entry phi_block: ; preds = %else_block, %after_check %val = phi i64 [ %sisiext16, %after_check ], [ 1, %else_block ] - store i64 %val, ptr %z, align 8 + store i64 %val, i64* %z, align 8 ret void } \ No newline at end of file diff --git a/test/test_suite14/clang/2002-01_02.c3t b/test/test_suite14/clang/2002-01_02.c3t new file mode 100644 index 000000000..f04926b66 --- /dev/null +++ b/test/test_suite14/clang/2002-01_02.c3t @@ -0,0 +1,376 @@ +// #target: macos-x64 +module test; + +struct Foo { int x, y; } +Foo[10] array; + +fn void foo() {} + +fn void *dlclose(void*); + +fn void ap_os_dso_unload(void *handle) +{ + dlclose(handle); + return; +} + +extern fn void foo2(int, double, float); + +fn void bar(int x) { + foo2(x, x ? 1.0 : 12.5, 1.0f); +} + +extern fn int tolower(int); + +fn char *rangematch(char *pattern, int teste, int c) { + + if ((c <= teste) | (tolower(c) <= tolower((char)(teste)))) return (char*)(0); + + return pattern; +} + +struct Foostruct { + short x; +} + +extern fn int foo3(Foostruct ic); + +fn void teste2() { + Foostruct xqic; + foo3(xqic); +} + +struct Vertex +{ + float a, b, c; +} +struct Edge_rec +{ + Vertex *v; + Edge_rec *next; + int wasseen; + int more_data; +} + +define QuadEdge = Edge_rec*; + +struct EdgePair { + QuadEdge left, right; +} + +struct EdgeStack { + int ptr; + QuadEdge *elts; + int stack_size; +} + +fn int do_merge(QuadEdge ldo, QuadEdge rdo) { + int lvalid; + QuadEdge basel; + QuadEdge rcand; + while (1) { + if (!lvalid) { + return (int)((iptr)(basel.next)); + } + } + return 1; +} + +fn int test(int x) { + return x; +} + +fn void abc(int *x); +fn int def(int y, int z) { + abc(&z); + return y; +} + +struct Test { short x, x2; int y, z; } + +fn int testing(Test *a) { + return a.x2+a.y; +} + +fn int test2(int x, Test a, int y) { + return x+y+a.x2+a.y; +} +fn int test3(Test a, Test b) { + return a.x2+a.y+b.y+b.z; +} + +fn Test test4(Test a) { + return a; +} + +fn int test6() { + int[200] b; + return b[4]; +} + +struct STest2 { int x; short[4] y; double z; } + +fn STest2 test7(STest2 x) { + return x; +} + +extern fn int printf(char * format, ...); + +fn int main2() { + long v = 123455678902i64; + printf("%lld\n", v); + return 1; +} + +double afoo = 17; +double abar = 12.0; +float axx = 12.0f; + +char*[*] procnames = { + "EXIT" +}; + +void *[*] data = { &afoo, &abar, &axx }; + +/* #expect: test.ll + +%Foo = type { i32, i32 } +%Foostruct = type { i16 } +%Edge_rec = type { %Vertex*, %Edge_rec*, i32, i32 } +%Vertex = type { float, float, float } +%Test = type { i16, i16, i32, i32 } +%STest2 = type { i32, [4 x i16], double } + +@test_array = local_unnamed_addr global [10 x %Foo] zeroinitializer, align 16 +@test_afoo = global double 1.700000e+01, align 8 +@test_abar = global double 1.200000e+01, align 8 +@test_axx = global float 1.200000e+01, align 4 +@.str = private unnamed_addr constant [5 x i8] c"EXIT\00", align 1 +@test_procnames = local_unnamed_addr global [1 x i8*] [i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0)], align 8 +@test_data = local_unnamed_addr global [3 x i8*] [i8* bitcast (double* @test_afoo to i8*), i8* bitcast (double* @test_abar to i8*), i8* bitcast (float* @test_axx to i8*)], align 16 +@.str.6 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1 + +; Function Attrs: nounwind +define void @test_foo() #0 { +entry: + ret void +} + +; Function Attrs: nounwind +declare i8* @test_dlclose(i8*) #0 + +; Function Attrs: nounwind +define void @test_ap_os_dso_unload(i8* %0) #0 { +entry: + %1 = call i8* @test_dlclose(i8* %0) + ret void +} + +; Function Attrs: nounwind +declare void @foo2(i32, double, float) #0 + +; Function Attrs: nounwind +define void @test_bar(i32 %0) #0 { +entry: + %intbool = icmp ne i32 %0, 0 + %ternary = select i1 %intbool, double 1.000000e+00, double 1.250000e+01 + call void @foo2(i32 %0, double %ternary, float 1.000000e+00) + ret void +} + +; Function Attrs: nounwind +declare i32 @tolower(i32) #0 + +; Function Attrs: nounwind +define i8* @test_rangematch(i8* %0, i32 %1, i32 %2) #0 { +entry: + %le = icmp sle i32 %2, %1 + %3 = call i32 @tolower(i32 %2) + %siuitrunc = trunc i32 %1 to i8 + %uisiext = zext i8 %siuitrunc to i32 + %4 = call i32 @tolower(i32 %uisiext) + %le1 = icmp sle i32 %3, %4 + %or = or i1 %le, %le1 + br i1 %or, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i8* null + +if.exit: ; preds = %entry + ret i8* %0 +} + +; Function Attrs: nounwind +declare i32 @foo3(i16) #0 + +; Function Attrs: nounwind +define void @test_teste2() #0 { +entry: + %xqic = alloca %Foostruct, align 2 + %0 = bitcast %Foostruct* %xqic to i16* + store i16 0, i16* %0, align 2 + %1 = getelementptr inbounds %Foostruct, %Foostruct* %xqic, i32 0, i32 0 + %2 = load i16, i16* %1, align 2 + %3 = call i32 @foo3(i16 %2) + ret void +} + +; Function Attrs: nounwind +define i32 @test_do_merge(%Edge_rec* %0, %Edge_rec* %1) #0 { +entry: + %lvalid = alloca i32, align 4 + %basel = alloca %Edge_rec*, align 8 + %rcand = alloca %Edge_rec*, align 8 + store i32 0, i32* %lvalid, align 4 + store %Edge_rec* null, %Edge_rec** %basel, align 8 + store %Edge_rec* null, %Edge_rec** %rcand, align 8 + br label %loop.body + +loop.body: ; preds = %if.exit, %entry + %2 = load i32, i32* %lvalid, align 4 + %not = icmp eq i32 %2, 0 + br i1 %not, label %if.then, label %if.exit + +if.then: ; preds = %loop.body + %3 = load %Edge_rec*, %Edge_rec** %basel, align 8 + %4 = getelementptr inbounds %Edge_rec, %Edge_rec* %3, i32 0, i32 1 + %5 = load %Edge_rec*, %Edge_rec** %4, align 8 + %ptrxi = ptrtoint %Edge_rec* %5 to i32 + ret i32 %ptrxi + +if.exit: ; preds = %loop.body + br label %loop.body + +loop.exit: ; No predecessors! + ret i32 1 +} + +; Function Attrs: nounwind +define i32 @test_test(i32 %0) #0 { +entry: + ret i32 %0 +} + +; Function Attrs: nounwind +declare void @test_abc(i32*) #0 + +; Function Attrs: nounwind +define i32 @test_def(i32 %0, i32 %1) #0 { +entry: + %z = alloca i32, align 4 + store i32 %1, i32* %z, align 4 + call void @test_abc(i32* %z) + ret i32 %0 +} + +; Function Attrs: nounwind +define i32 @test_testing(%Test* %0) #0 { +entry: + %1 = getelementptr inbounds %Test, %Test* %0, i32 0, i32 1 + %2 = load i16, i16* %1, align 2 + %sisiext = sext i16 %2 to i32 + %3 = getelementptr inbounds %Test, %Test* %0, i32 0, i32 2 + %4 = load i32, i32* %3, align 4 + %add = add i32 %sisiext, %4 + ret i32 %add +} + +; Function Attrs: nounwind +define i32 @test_test2(i32 %0, i64 %1, i32 %2, i32 %3) #0 { +entry: + %4 = alloca { i64, i32 }, align 8 + %a = bitcast { i64, i32 }* %4 to %Test* + %5 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 0 + store i64 %1, i64* %5, align 8 + %6 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 1 + store i32 %2, i32* %6, align 8 + %add = add i32 %0, %3 + %7 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 1 + %8 = load i16, i16* %7, align 2 + %sisiext = sext i16 %8 to i32 + %add1 = add i32 %add, %sisiext + %9 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 2 + %10 = load i32, i32* %9, align 4 + %add2 = add i32 %add1, %10 + ret i32 %add2 +} + +; Function Attrs: nounwind +define i32 @test_test3(i64 %0, i32 %1, i64 %2, i32 %3) #0 { +entry: + %4 = alloca { i64, i32 }, align 8 + %5 = alloca { i64, i32 }, align 8 + %a = bitcast { i64, i32 }* %4 to %Test* + %6 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 0 + store i64 %0, i64* %6, align 8 + %7 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %4, i32 0, i32 1 + store i32 %1, i32* %7, align 8 + %b = bitcast { i64, i32 }* %5 to %Test* + %8 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %5, i32 0, i32 0 + store i64 %2, i64* %8, align 8 + %9 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %5, i32 0, i32 1 + store i32 %3, i32* %9, align 8 + %10 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 1 + %11 = load i16, i16* %10, align 2 + %sisiext = sext i16 %11 to i32 + %12 = getelementptr inbounds %Test, %Test* %a, i32 0, i32 2 + %13 = load i32, i32* %12, align 4 + %add = add i32 %sisiext, %13 + %14 = getelementptr inbounds %Test, %Test* %b, i32 0, i32 2 + %15 = load i32, i32* %14, align 4 + %add1 = add i32 %add, %15 + %16 = getelementptr inbounds %Test, %Test* %b, i32 0, i32 3 + %17 = load i32, i32* %16, align 8 + %add2 = add i32 %add1, %17 + ret i32 %add2 +} + +; Function Attrs: nounwind +define { i64, i32 } @test_test4(i64 %0, i32 %1) #0 { +entry: + %2 = alloca { i64, i32 }, align 8 + %tempcoerce = alloca { i64, i32 }, align 8 + %a = bitcast { i64, i32 }* %2 to %Test* + %3 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %2, i32 0, i32 0 + store i64 %0, i64* %3, align 8 + %4 = getelementptr inbounds { i64, i32 }, { i64, i32 }* %2, i32 0, i32 1 + store i32 %1, i32* %4, align 8 + %5 = bitcast { i64, i32 }* %tempcoerce to i8* + %6 = bitcast %Test* %a to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 8 %6, i32 12, i1 false) + %7 = load { i64, i32 }, { i64, i32 }* %tempcoerce, align 8 + ret { i64, i32 } %7 +} + +; Function Attrs: nounwind +define i32 @test_test6() #0 { +entry: + %b = alloca [200 x i32], align 16 + %0 = bitcast [200 x i32]* %b to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 800, i1 false) + %1 = getelementptr inbounds [200 x i32], [200 x i32]* %b, i64 0, i64 4 + %2 = load i32, i32* %1, align 4 + ret i32 %2 +} + +; Function Attrs: nounwind +define void @test_test7(%STest2* noalias sret(%STest2) align 8 %0, %STest2* byval(%STest2) align 8 %1) #0 { +entry: + %2 = bitcast %STest2* %0 to i8* + %3 = bitcast %STest2* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %2, i8* align 8 %3, i32 24, i1 false) + ret void +} + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +define i32 @test_main2() #0 { +entry: + %v = alloca i64, align 8 + store i64 123455678902, i64* %v, align 8 + %0 = load i64, i64* %v, align 8 + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i64 %0) + ret i32 1 +} diff --git a/test/test_suite2/clang/2002-03.c3t b/test/test_suite14/clang/2002-03.c3t similarity index 78% rename from test/test_suite2/clang/2002-03.c3t rename to test/test_suite14/clang/2002-03.c3t index 23afbbfc7..9cc3fba78 100644 --- a/test/test_suite2/clang/2002-03.c3t +++ b/test/test_suite14/clang/2002-03.c3t @@ -55,43 +55,41 @@ fn char* foo() { @test_a = local_unnamed_addr global { i32, i32, [8 x i32] } { i32 0, i32 2, [8 x i32] zeroinitializer }, align 16 @test_str = local_unnamed_addr global [10 x i8] c"x\00\00\00\00\00\00\00\00\00", align 1 -@test_arr = local_unnamed_addr global { ptr, ptr, [3 x ptr] } zeroinitializer, align 16 +@test_arr = local_unnamed_addr global { i8*, i8*, [3 x i8*] } zeroinitializer, align 16 @test_f = local_unnamed_addr global { float, float, [10 x float] } { float 0x3FF3AE1480000000, float 0x40415999A0000000, [10 x float] zeroinitializer }, align 16 @test_array = local_unnamed_addr global { %Test, %Test, [8 x %Test] } { %Test { i32 2, double 1.200000e+01 }, %Test { i32 3, double 2.400000e+01 }, [8 x %Test] zeroinitializer }, align 16 @test_b = local_unnamed_addr global { [4 x i32], { i32, i32, i32, i32 }, { i32, i32, [2 x i32] }, [4 x i32] } { [4 x i32] [i32 1, i32 2, i32 3, i32 4], { i32, i32, i32, i32 } { i32 5, i32 6, i32 7, i32 0 }, { i32, i32, [2 x i32] } { i32 8, i32 9, [2 x i32] zeroinitializer }, [4 x i32] zeroinitializer }, align 16 @test_link = local_unnamed_addr global [3 x %Connection] [%Connection { i64 1, [10 x i8] c"link1\00\00\00\00\00", i64 10 }, %Connection { i64 2, [10 x i8] c"link2\00\00\00\00\00", i64 20 }, %Connection { i64 3, [10 x i8] c"link3\00\00\00\00\00", i64 30 }], align 16 -@.str = private unnamed_addr constant [4 x i8] c"\1F\C2\8B\00", align 1 -@.str.7 = private unnamed_addr constant [32 x i8] c"*** Word \22%s\22 on line %d is not\00", align 1 -declare i32 @test_strcmp(ptr, ptr) #0 +declare i32 @test_strcmp(i8*, i8*) #0 -define i32 @test_test(ptr %0) #0 { +define i32 @test_test(i8* %0) #0 { entry: - %1 = call i32 @test_strcmp(ptr %0, ptr @.str) + %1 = call i32 @test_strcmp(i8* %0, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0)) ret i32 %1 } -define i32 @test_trys(ptr %0, i32 %1) #0 { +define i32 @test_trys(i8* %0, i32 %1) #0 { entry: %asa = alloca i32, align 4 %val = alloca double, align 8 %lLS = alloca i32, align 4 - store i32 0, ptr %asa, align 4 - store double 0.000000e+00, ptr %val, align 8 - store i32 0, ptr %lLS, align 4 + store i32 0, i32* %asa, align 4 + store double 0.000000e+00, double* %val, align 8 + store i32 0, i32* %lLS, align 4 %intbool = icmp ne i32 %1, 0 br i1 %intbool, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, ptr %lLS, align 4 - %3 = load i32, ptr %asa, align 4 + %2 = load i32, i32* %lLS, align 4 + %3 = load i32, i32* %asa, align 4 %add = add i32 %2, %3 - store i32 %add, ptr %asa, align 4 + store i32 %add, i32* %asa, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry - %4 = load i32, ptr %asa, align 4 - %5 = load double, ptr %val, align 8 + %4 = load i32, i32* %asa, align 4 + %5 = load double, double* %val, align 8 %fpsi = fptosi double %5 to i32 %add1 = add i32 %4, %fpsi ret i32 %add1 diff --git a/test/test_suite2/clang/2002-04.c3t b/test/test_suite14/clang/2002-04.c3t similarity index 58% rename from test/test_suite2/clang/2002-04.c3t rename to test/test_suite14/clang/2002-04.c3t index 14dea515b..4909eab1b 100644 --- a/test/test_suite2/clang/2002-04.c3t +++ b/test/test_suite14/clang/2002-04.c3t @@ -80,11 +80,11 @@ loop.cond: ; preds = %switch.exit, %entry loop.body: ; preds = %loop.cond %1 = call i32 @foo() - store i32 %1, ptr %switch, align 4 + store i32 %1, i32* %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body - %2 = load i32, ptr %switch, align 4 + %2 = load i32, i32* %switch, align 4 switch i32 %2, label %switch.exit [ i32 0, label %switch.case i32 1, label %switch.case @@ -96,11 +96,11 @@ switch.entry: ; preds = %loop.body ] switch.case: ; preds = %switch.entry, %switch.entry, %switch.entry, %switch.entry - %3 = call i32 (ptr, ...) @printf(ptr @.str) + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) br label %switch.case1 switch.case1: ; preds = %switch.entry, %switch.case - %4 = call i32 (ptr, ...) @printf(ptr @.str.1) + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) br label %switch.exit switch.exit: ; preds = %switch.entry, %switch.entry, %switch.case1, %switch.entry @@ -110,55 +110,70 @@ loop.exit: ; preds = %loop.cond ret i32 0 } +; Function Attrs: nounwind define double @test_test(i32 %0) #0 { entry: %student_t = alloca [30 x double], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %student_t, ptr align 16 @.__const, i32 240, i1 false) + %1 = bitcast [30 x double]* %student_t to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %1, i8* align 16 bitcast ([30 x double]* @.__const to i8*), i32 240, i1 false) %zext = zext i32 %0 to i64 - %1 = getelementptr inbounds [30 x double], ptr %student_t, i64 0, i64 %zext - %2 = load double, ptr %1, align 8 - ret double %2 + %2 = getelementptr inbounds [30 x double], [30 x double]* %student_t, i64 0, i64 %zext + %3 = load double, double* %2, align 8 + ret double %3 } +; Function Attrs: nounwind +declare i64 @func_returning_struct() #0 + +; Function Attrs: nounwind define void @test_loop() #0 { entry: %result = alloca %St, align 4 %0 = call i64 @func_returning_struct() - store i64 %0, ptr %result, align 4 + %1 = bitcast %St* %result to i64* + store i64 %0, i64* %1, align 4 ret void } -declare i32 @testF(ptr byval(%FooSt) align 8, float) #0 +; Function Attrs: nounwind +declare i32 @testF(%FooSt* byval(%FooSt) align 8, float) #0 +; Function Attrs: nounwind declare i32 @testE(i8 zeroext, i16 signext, i8 zeroext, i32, i32, float) #0 -define void @test_test3(ptr %0) #0 { +; Function Attrs: nounwind +define void @test_test3(%FooSt* %0) #0 { entry: - %1 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 1 - store i16 1, ptr %1, align 2 + %1 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 1 + store i16 1, i16* %1, align 2 ret void } -define void @test_test2(ptr byval(%FooSt) align 8 %0) #0 { +; Function Attrs: nounwind +define void @test_test2(%FooSt* byval(%FooSt) align 8 %0) #0 { entry: %indirectarg = alloca %FooSt, align 8 %indirectarg1 = alloca %FooSt, align 8 - %1 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 0 - %2 = load i8, ptr %1, align 4 - %3 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 1 - %4 = load i16, ptr %3, align 2 - %5 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 2 - %6 = load i8, ptr %5, align 4 - %7 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 3 - %8 = load i32, ptr %7, align 4 - %9 = getelementptr inbounds %FooSt, ptr %0, i32 0, i32 4 - %10 = load i16, ptr %9, align 4 + %1 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 0 + %2 = load i8, i8* %1, align 4 + %3 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 1 + %4 = load i16, i16* %3, align 2 + %5 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 2 + %6 = load i8, i8* %5, align 4 + %7 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 3 + %8 = load i32, i32* %7, align 4 + %9 = getelementptr inbounds %FooSt, %FooSt* %0, i32 0, i32 4 + %10 = load i16, i16* %9, align 4 %sisiext = sext i16 %10 to i32 %11 = call i32 @testE(i8 %2, i16 %4, i8 %6, i32 %8, i32 %sisiext, float 0x3FB99999A0000000) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 4 %0, i32 20, i1 false) - %12 = call i32 @testF(ptr byval(%FooSt) align 8 %indirectarg, float 0x3FB99999A0000000) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg1, ptr align 4 %0, i32 20, i1 false) - call void @test_test2(ptr byval(%FooSt) align 8 %indirectarg1) - call void @test_test3(ptr %0) + %12 = bitcast %FooSt* %indirectarg to i8* + %13 = bitcast %FooSt* %0 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %12, i8* align 4 %13, i32 20, i1 false) + %14 = call i32 @testF(%FooSt* byval(%FooSt) align 8 %indirectarg, float 0x3FB99999A0000000) + %15 = bitcast %FooSt* %indirectarg1 to i8* + %16 = bitcast %FooSt* %0 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %15, i8* align 4 %16, i32 20, i1 false) + call void @test_test2(%FooSt* byval(%FooSt) align 8 %indirectarg1) + call void @test_test3(%FooSt* %0) ret void } diff --git a/test/test_suite2/comments/simple_comments.c3 b/test/test_suite14/comments/simple_comments.c3 similarity index 100% rename from test/test_suite2/comments/simple_comments.c3 rename to test/test_suite14/comments/simple_comments.c3 diff --git a/test/test_suite14/compile_time/compile_time_access_subscript.c3t b/test/test_suite14/compile_time/compile_time_access_subscript.c3t new file mode 100644 index 000000000..53593ac93 --- /dev/null +++ b/test/test_suite14/compile_time/compile_time_access_subscript.c3t @@ -0,0 +1,122 @@ +// #target: macos-x64 +module test; +import std::io; +struct Abc +{ + float m00, m01, m10, m11; +} + +Abc a = flip(Abc { 1, 2, 3, 4 }); + +macro flip($init) +{ + return Abc { $init.m01, $init.m10, $init.m11, $init.m00 }; +} + +macro check_type($Type) +{ + var $b = $Type[4][4] {}; + $Type z = $b[2][2]; + return z; +} + +enum Blurb { FOO } + +define Bdd = distinct Abc; +fn void main() +{ + var $i = int[4] { 1, 2, 3, 4 }; + var $b = Abc[2] { Abc {}, Abc { 11, 22, 33, 44 }}; + var $c = variant[4] {}; + check_type(int); + check_type(Abc); + check_type(anyerr); + check_type(Blurb); + check_type(int*); + check_type(bool); + check_type(typeid); + check_type(int[<3>]); + check_type(Bdd); + check_type(int[2]); + check_type(int[]); + io::printfn("%d", $b[0].m11); +} + +/* #expect: test.ll + + %z = alloca i32, align 4 + %z1 = alloca %Abc, align 4 + %z2 = alloca i64, align 8 + %z3 = alloca i32, align 4 + %z4 = alloca i32*, align 8 + %z5 = alloca i8, align 1 + %z6 = alloca i64, align 8 + %z7 = alloca <3 x i32>, align 16 + %z8 = alloca %Abc, align 4 + %z9 = alloca [2 x i32], align 4 + %z10 = alloca %"int[]", align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %literal = alloca %Abc, align 4 + %taddr = alloca %"variant[]", align 8 + store i32 0, i32* %z, align 4 + %0 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 0 + store float 0.000000e+00, float* %0, align 4 + %1 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 1 + store float 0.000000e+00, float* %1, align 4 + %2 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 2 + store float 0.000000e+00, float* %2, align 4 + %3 = getelementptr inbounds %Abc, %Abc* %z1, i32 0, i32 3 + store float 0.000000e+00, float* %3, align 4 + store i64 0, i64* %z2, align 8 + store i32 0, i32* %z3, align 4 + store i32* null, i32** %z4, align 8 + store i8 0, i8* %z5, align 1 + store i64 0, i64* %z6, align 8 + store <3 x i32> zeroinitializer, <3 x i32>* %z7, align 16 + %4 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 0 + store float 0.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 1 + store float 0.000000e+00, float* %5, align 4 + %6 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 2 + store float 0.000000e+00, float* %6, align 4 + %7 = getelementptr inbounds %Abc, %Abc* %z8, i32 0, i32 3 + store float 0.000000e+00, float* %7, align 4 + %8 = getelementptr inbounds [2 x i32], [2 x i32]* %z9, i64 0, i64 0 + store i32 0, i32* %8, align 4 + %9 = getelementptr inbounds [2 x i32], [2 x i32]* %z9, i64 0, i64 1 + store i32 0, i32* %9, align 4 + %10 = bitcast %"int[]"* %z10 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %10, i8 0, i64 16, i1 false) + %11 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 0 + store float 0.000000e+00, float* %11, align 4 + %12 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 1 + store float 0.000000e+00, float* %12, align 4 + %13 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 2 + store float 0.000000e+00, float* %13, align 4 + %14 = getelementptr inbounds %Abc, %Abc* %literal, i32 0, i32 3 + store float 0.000000e+00, float* %14, align 4 + %15 = bitcast %Abc* %literal to i8* + %16 = insertvalue %variant undef, i8* %15, 0 + %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$test_Abc" to i64), 1 + %18 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %17, %variant* %18, align 16 + %19 = bitcast [1 x %variant]* %varargslots to %variant* + %20 = insertvalue %"variant[]" undef, %variant* %19, 0 + %21 = insertvalue %"variant[]" %20, i64 1, 1 + store %"variant[]" %21, %"variant[]"* %taddr, align 8 + %22 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 0 + %lo = load i8*, i8** %23, align 8 + %24 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 1 + %hi = load i64, i64* %24, align 8 + %25 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %25, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + ret void +} diff --git a/test/test_suite2/compile_time/compile_time_array.c3t b/test/test_suite14/compile_time/compile_time_array.c3t similarity index 67% rename from test/test_suite2/compile_time/compile_time_array.c3t rename to test/test_suite14/compile_time/compile_time_array.c3t index 412ce0b29..f67c3ddb2 100644 --- a/test/test_suite2/compile_time/compile_time_array.c3t +++ b/test/test_suite14/compile_time/compile_time_array.c3t @@ -13,16 +13,17 @@ fn void test() /* #expect: test.ll -%"char[]" = type { ptr, i64 } + +%"char[]" = type { i8*, i64 } @.str = private unnamed_addr constant [2 x i8] c"a\00", align 1 -; Function Attrs: nounwind define void @test_test() #0 { entry: %x = alloca i32, align 4 %z = alloca %"char[]", align 8 - store i32 1, ptr %x, align 4 - store %"char[]" { ptr @.str, i64 1 }, ptr %z, align 8 + store i32 1, i32* %x, align 4 + store %"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i64 1 }, %"char[]"* %z, align 8 ret void } + diff --git a/test/test_suite14/compile_time/compile_time_array_ref.c3t b/test/test_suite14/compile_time/compile_time_array_ref.c3t new file mode 100644 index 000000000..aed2889fe --- /dev/null +++ b/test/test_suite14/compile_time/compile_time_array_ref.c3t @@ -0,0 +1,24 @@ +// #target: macos-x64 +module foo; + +char[8192] stack; +char* x = &stack[0] + 1000; + +fn void test() +{ + static char[2] y; + static char* z = &y[1]; +} + +/* #expect: foo.ll + +@foo_stack = local_unnamed_addr global [8192 x i8] zeroinitializer, align 16 +@foo_x = local_unnamed_addr global i8* getelementptr inbounds ([8192 x i8], [8192 x i8]* @foo_stack, i64 0, i64 1000), align 8 +@"test$y" = internal unnamed_addr global [2 x i8] zeroinitializer, align 1 +@"test$z" = internal unnamed_addr global i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"test$y", i64 0, i64 1), align 8 + +; Function Attrs: nounwind +define void @foo_test() #0 { +entry: + ret void +} diff --git a/test/test_suite2/compile_time/compile_time_bitops.c3t b/test/test_suite14/compile_time/compile_time_bitops.c3t similarity index 100% rename from test/test_suite2/compile_time/compile_time_bitops.c3t rename to test/test_suite14/compile_time/compile_time_bitops.c3t diff --git a/test/test_suite2/compile_time/compile_time_pointers.c3t b/test/test_suite14/compile_time/compile_time_pointers.c3t similarity index 63% rename from test/test_suite2/compile_time/compile_time_pointers.c3t rename to test/test_suite14/compile_time/compile_time_pointers.c3t index 6e115970b..ae7c411b1 100644 --- a/test/test_suite2/compile_time/compile_time_pointers.c3t +++ b/test/test_suite14/compile_time/compile_time_pointers.c3t @@ -24,12 +24,12 @@ fn void test() /* #expect: test.ll @test_ABC = local_unnamed_addr constant i64 531, align 8 -@test_BAC = local_unnamed_addr constant ptr inttoptr (i64 143 to ptr), align 8 -@test_EXX = local_unnamed_addr constant ptr inttoptr (i64 155 to ptr), align 8 +@test_BAC = local_unnamed_addr constant i8* inttoptr (i64 143 to i8*), align 8 +@test_EXX = local_unnamed_addr constant i8* inttoptr (i64 155 to i8*), align 8 @test_KEX = local_unnamed_addr constant i64 -12, align 8 -@test_CAB = local_unnamed_addr constant ptr inttoptr (i64 143 to ptr), align 8 +@test_CAB = local_unnamed_addr constant i8* inttoptr (i64 143 to i8*), align 8 @test_ZAB = local_unnamed_addr constant i64 143, align 8 -@test_BOB = local_unnamed_addr constant ptr inttoptr (i64 12 to ptr), align 8 -@test_BAB = local_unnamed_addr constant ptr inttoptr (i64 20 to ptr), align 8 +@test_BOB = local_unnamed_addr constant i32* inttoptr (i64 12 to i32*), align 8 +@test_BAB = local_unnamed_addr constant i32* inttoptr (i64 20 to i32*), align 8 @test_AO = local_unnamed_addr constant i64 2, align 8 @test_abc = local_unnamed_addr global i32 123, align 4 \ No newline at end of file diff --git a/test/test_suite14/compile_time/compile_time_ptr_ref.c3t b/test/test_suite14/compile_time/compile_time_ptr_ref.c3t new file mode 100644 index 000000000..83bf64236 --- /dev/null +++ b/test/test_suite14/compile_time/compile_time_ptr_ref.c3t @@ -0,0 +1,22 @@ +// #target: macos-x64 +module test; + + +int*[] blurp = { &ptr, &ptr, (&ptr + 1), &ptr - 1, (int*)((iptr)(&ptr) - 4) }; +int* c = (int*)((iptr)(&ptr) - 4); +int* c2 = (int*)((iptr)(&ptr) + 4); +int* c3 = (int*)(4 + (iptr)(&ptr)); +iptr ff = (iptr)(&ptr); +int ptr = 0; + +// #expect: test.ll + +%"int*[]" = type { i32**, i64 } + +@.taddr = private global [5 x i32*] [i32* @test_ptr, i32* @test_ptr, i32* getelementptr inbounds (i32, i32* @test_ptr, i64 1), i32* getelementptr (i32, i32* @test_ptr, i64 -1), i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 -4) to i32*)], align 8 +@test_blurp = local_unnamed_addr global %"int*[]" { i32** getelementptr inbounds ([5 x i32*], [5 x i32*]* @.taddr, i32 0, i32 0), i64 5 }, align 8 +@test_c = local_unnamed_addr global i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 -4) to i32*), align 8 +@test_c2 = local_unnamed_addr global i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 4) to i32*), align 8 +@test_c3 = local_unnamed_addr global i32* bitcast (i8* getelementptr (i8, i8* bitcast (i32* @test_ptr to i8*), i64 4) to i32*), align 8 +@test_ff = local_unnamed_addr global i64 ptrtoint (i32* @test_ptr to i64), align 8 +@test_ptr = global i32 0, align 4 \ No newline at end of file diff --git a/test/test_suite14/compile_time/ct_builtin_time_date.c3t b/test/test_suite14/compile_time/ct_builtin_time_date.c3t new file mode 100644 index 000000000..10fba0f36 --- /dev/null +++ b/test/test_suite14/compile_time/ct_builtin_time_date.c3t @@ -0,0 +1,126 @@ +// #target: macos-x64 +module test; +import std::io; + +macro printline() +{ + io::printfn("%d", $$LINE); io::printfn("%d", $$LINE_RAW); +} +fn void test(int x) +{ + io::printfn("%d", x); + if (x > 0) $$FUNCTION(x - 1); + io::println($$TIME); + io::println($$DATE); + printline(); + io::println($$FILE); + io::println($$MODULE); +} + +bool is_def = $defined($$FUNCTION); +fn void main() +{ + bool is_def2 = $defined($$FUNCTION); + test(10); +} + +/* #expect: test.ll + +define void @test_test(i32 %0) #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [1 x %variant], align 16 + %taddr4 = alloca i64, align 8 + %taddr5 = alloca %"variant[]", align 8 + %retparam11 = alloca i64, align 8 + %varargslots12 = alloca [1 x %variant], align 16 + %taddr13 = alloca i64, align 8 + %taddr14 = alloca %"variant[]", align 8 + store i32 %0, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr1, align 8 + %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %11, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %gt = icmp sgt i32 %0, 0 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %voiderr + %sub = sub i32 %0, 1 + call void @test_test(i32 %sub) + br label %if.exit + +if.exit: ; preds = %if.then, %voiderr + %12 = call i32 @std_io_println(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)) #1 + %13 = call i32 @std_io_println(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0)) #1 + store i64 14, i64* %taddr4, align 8 + %14 = bitcast i64* %taddr4 to i8* + %15 = insertvalue %variant undef, i8* %14, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 + %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 + store %variant %16, %variant* %17, align 16 + %18 = bitcast [1 x %variant]* %varargslots3 to %variant* + %19 = insertvalue %"variant[]" undef, %variant* %18, 0 + %20 = insertvalue %"variant[]" %19, i64 1, 1 + store %"variant[]" %20, %"variant[]"* %taddr5, align 8 + %21 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 + %lo6 = load i8*, i8** %22, align 8 + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 + %hi7 = load i64, i64* %23, align 8 + %24 = call i64 @std_io_printfn(i64* %retparam2, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %24, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %if.exit + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %if.exit + store i64 6, i64* %taddr13, align 8 + %25 = bitcast i64* %taddr13 to i8* + %26 = insertvalue %variant undef, i8* %25, 0 + %27 = insertvalue %variant %26, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 + %28 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 + store %variant %27, %variant* %28, align 16 + %29 = bitcast [1 x %variant]* %varargslots12 to %variant* + %30 = insertvalue %"variant[]" undef, %variant* %29, 0 + %31 = insertvalue %"variant[]" %30, i64 1, 1 + store %"variant[]" %31, %"variant[]"* %taddr14, align 8 + %32 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* + %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 0 + %lo15 = load i8*, i8** %33, align 8 + %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 1 + %hi16 = load i64, i64* %34, align 8 + %35 = call i64 @std_io_printfn(i64* %retparam11, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo15, i64 %hi16) + %not_err17 = icmp eq i64 %35, 0 + br i1 %not_err17, label %after_check18, label %voiderr19 + +after_check18: ; preds = %voiderr10 + br label %voiderr19 + +voiderr19: ; preds = %after_check18, %voiderr10 + %36 = call i32 @std_io_println(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.5, i32 0, i32 0)) #1 + %37 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0)) #1 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/compile_time/ct_checks.c3t b/test/test_suite14/compile_time/ct_checks.c3t similarity index 89% rename from test/test_suite2/compile_time/ct_checks.c3t rename to test/test_suite14/compile_time/ct_checks.c3t index 357665a2c..214382b48 100644 --- a/test/test_suite2/compile_time/ct_checks.c3t +++ b/test/test_suite14/compile_time/ct_checks.c3t @@ -10,7 +10,7 @@ fn void main() bool c = $checks(int z = 23, $y += 23, &c); bool d = $checks(&c, $y, int yy = 23); int z = $y; - io::printfln("%s %s %s", b, $y, c); + io::printfn("%s %s %s", b, $y, c); } /* #expect: test.ll diff --git a/test/test_suite2/compile_time/ct_enum_values.c3t b/test/test_suite14/compile_time/ct_enum_values.c3t similarity index 75% rename from test/test_suite2/compile_time/ct_enum_values.c3t rename to test/test_suite14/compile_time/ct_enum_values.c3t index 5f905e81a..49ec977b7 100644 --- a/test/test_suite2/compile_time/ct_enum_values.c3t +++ b/test/test_suite14/compile_time/ct_enum_values.c3t @@ -23,8 +23,8 @@ fn void main() entry: %x = alloca i32, align 4 - store i32 0, ptr %x, align 4 - store i32 0, ptr %x, align 4 - store i32 1, ptr %x, align 4 + store i32 0, i32* %x, align 4 + store i32 0, i32* %x, align 4 + store i32 1, i32* %x, align 4 ret void } diff --git a/test/test_suite2/compile_time/ct_eval.c3t b/test/test_suite14/compile_time/ct_eval.c3t similarity index 56% rename from test/test_suite2/compile_time/ct_eval.c3t rename to test/test_suite14/compile_time/ct_eval.c3t index b874f45d1..55f6e312b 100644 --- a/test/test_suite2/compile_time/ct_eval.c3t +++ b/test/test_suite14/compile_time/ct_eval.c3t @@ -14,9 +14,9 @@ fn void main() define void @test_main() #0 { entry: %abc = alloca i32, align 4 - store i32 20, ptr %abc, align 4 - store i32 444, ptr %abc, align 4 - %0 = load i32, ptr %abc, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %0) + store i32 20, i32* %abc, align 4 + store i32 444, i32* %abc, align 4 + %0 = load i32, i32* %abc, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %0) ret void } diff --git a/test/test_suite2/compile_time/ct_eval_sym.c3 b/test/test_suite14/compile_time/ct_eval_sym.c3 similarity index 100% rename from test/test_suite2/compile_time/ct_eval_sym.c3 rename to test/test_suite14/compile_time/ct_eval_sym.c3 diff --git a/test/test_suite14/compile_time/ct_for.c3t b/test/test_suite14/compile_time/ct_for.c3t new file mode 100644 index 000000000..7d8994ea8 --- /dev/null +++ b/test/test_suite14/compile_time/ct_for.c3t @@ -0,0 +1,32 @@ +// #target: macos-x64 + +module test; + +extern fn void printf(char*, ...); + +fn void main() +{ + + $for (var $i = 0; $i < 3; $i++): + printf("Foo %d\n", $i); + $endfor; + + $for ($i = 0, var $j = 100; $i < 4;): + printf("Foo %d %d\n", $i++, $j--); + $endfor; + +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 0) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 2) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 0, i32 100) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), i32 1, i32 99) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i32 2, i32 98) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i32 0, i32 0), i32 3, i32 97) + ret void +} diff --git a/test/test_suite14/compile_time/ct_foreach.c3t b/test/test_suite14/compile_time/ct_foreach.c3t new file mode 100644 index 000000000..02cfb3830 --- /dev/null +++ b/test/test_suite14/compile_time/ct_foreach.c3t @@ -0,0 +1,52 @@ +// #target: macos-x64 +module test; + +extern fn void printf(char*, ...); + +fn void main() +{ + + var $foo = { 1, 10, 34 }; + $foreach ($i : $foo): + printf("Foo %d\n", $i); + $endforeach; + + $foreach ($i, $j : $foo): + printf("Bar %d %d\n", $i, $j); + $endforeach; + + $foreach ($x : { 123, "abc", 1177, "hello" }): + $typeof($x) z = $x; + $switch ($typeof($x)): + $case int: + printf("Bar %d\n", $x); + $default: + printf("Bar %s\n", $x); + $endswitch; + $endforeach; + +} + +/* #expect: test.ll +define void @test_main() #0 { +entry: + %z = alloca i32, align 4 + %z1 = alloca [3 x i8]*, align 8 + %z2 = alloca i32, align 4 + %z3 = alloca [5 x i8]*, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 10) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 34) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 0, i32 1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), i32 1, i32 10) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0), i32 2, i32 34) + store i32 123, i32* %z, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0), i32 123) + store [3 x i8]* bitcast ([4 x i8]* @.str.7 to [3 x i8]*), [3 x i8]** %z1, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), [3 x i8]* bitcast ([4 x i8]* @.str.9 to [3 x i8]*)) + store i32 1177, i32* %z2, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.10, i32 0, i32 0), i32 1177) + store [5 x i8]* bitcast ([6 x i8]* @.str.11 to [5 x i8]*), [5 x i8]** %z3, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.12, i32 0, i32 0), [5 x i8]* bitcast ([6 x i8]* @.str.13 to [5 x i8]*)) + ret void +} diff --git a/test/test_suite2/compile_time/ct_func.c3t b/test/test_suite14/compile_time/ct_func.c3t similarity index 100% rename from test/test_suite2/compile_time/ct_func.c3t rename to test/test_suite14/compile_time/ct_func.c3t diff --git a/test/test_suite14/compile_time/ct_funcptr.c3t b/test/test_suite14/compile_time/ct_funcptr.c3t new file mode 100644 index 000000000..4747f4862 --- /dev/null +++ b/test/test_suite14/compile_time/ct_funcptr.c3t @@ -0,0 +1,61 @@ +// #target: macos-x64 +module test; +import std::io; + +fn void test(int x) +{ + $typeof(&$$FUNCTION) ptr = &$$FUNCTION; + io::printfn("%d", x); + if (x > 0) ptr(x - 1); +} + +fn void main() +{ + test(10); +} + +/* #expect: test.ll + +define void @test_test(i32 %0) #0 { +entry: + %ptr = alloca void (i32)*, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + store void (i32)* @test_test, void (i32)** %ptr, align 8 + store i32 %0, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr1, align 8 + %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %11, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %gt = icmp sgt i32 %0, 0 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %voiderr + %12 = load void (i32)*, void (i32)** %ptr, align 8 + %sub = sub i32 %0, 1 + call void %12(i32 %sub) + br label %if.exit + +if.exit: ; preds = %if.then, %voiderr + ret void +} diff --git a/test/test_suite2/compile_time/ct_if.c3t b/test/test_suite14/compile_time/ct_if.c3t similarity index 100% rename from test/test_suite2/compile_time/ct_if.c3t rename to test/test_suite14/compile_time/ct_if.c3t diff --git a/test/test_suite2/compile_time/ct_if_fails.c3 b/test/test_suite14/compile_time/ct_if_fails.c3 similarity index 100% rename from test/test_suite2/compile_time/ct_if_fails.c3 rename to test/test_suite14/compile_time/ct_if_fails.c3 diff --git a/test/test_suite14/compile_time/ct_memberof.c3t b/test/test_suite14/compile_time/ct_memberof.c3t new file mode 100644 index 000000000..959f9d8d0 --- /dev/null +++ b/test/test_suite14/compile_time/ct_memberof.c3t @@ -0,0 +1,913 @@ +// #target: macos-x64 +module test; +import std::io; + +fn int hell() { return 1; } + +macro print_args($Type) +{ + var $params = $Type.params; + $foreach ($param : $params): + io::println($param.nameof); + $endforeach; +} + +bitstruct Bark : ulong +{ + int x : 1..4; + short y : 6..10; +} + +struct Foo +{ + int x; + union test { + int y; + double z; + } + struct { + int abc; + int bcd; + } + double q; +} +macro print_fields($Type) +{ + io::printfn("Type: %s", $Type.nameof); + var $params = $Type.membersof; + $foreach ($param : $params): + io::printfn("%s: %s", $param.nameof, $param.typeid.nameof); + $endforeach; +} + +fn void hello(int a, double b, int[4] d, args...) {} +fn void test(int x) +{ + print_args($typeof(&test)); + print_args($typeof(&hell)); + print_args($typeof(&hello)); + io::println($typeof(&test).returns.nameof); + io::println($typeof(&hell).returns.nameof); + print_fields(Foo); + print_fields(Bar); + print_fields(Bark); +} + +struct BarInner +{ + char a; + char b; +} + +struct Bar +{ + char a; + short b; + struct + { + union + { + BarInner y; + char z; + struct { + char z1; + char z2; + } + } + } + struct baz + { + int foo; + } +} +fn void main() +{ + var $x = Bar.a; + + io::printfn("len: %d", Bar.membersof.len); + io::printfn("len: %d", Bar.baz.membersof.len); + io::printfn("a: %d %d", Bar.a.offsetof, Bar.a.alignof); + io::printfn("b: %d %d", Bar.b.offsetof, Bar.b.alignof); + io::printfn("y: %d %d", Bar.y.offsetof, Bar.y.alignof); + io::printfn("z: %d %d", Bar.z.offsetof, Bar.z.alignof); + io::printfn("z1: %d %d", Bar.z1.offsetof, Bar.z1.alignof); + io::printfn("z2: %d %d", Bar.z2.offsetof, Bar.z2.alignof); + io::printfn("baz: %d %d", Bar.baz.offsetof, Bar.baz.alignof); + io::printfn("Bar: %d", $x.alignof); + io::printfn("foo: %d %d", Bar.baz.foo.offsetof, Bar.baz.foo.alignof); + + test(10); +} + +/* #expect: test.ll + +define void @test_hello(i32 %0, double %1, i64 %2, i64 %3, i8* %4, i64 %5) #0 { +entry: + %d = alloca [4 x i32], align 4 + %args = alloca %"variant[]", align 8 + %pair = bitcast [4 x i32]* %d to { i64, i64 }* + %6 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 0 + store i64 %2, i64* %6, align 4 + %7 = getelementptr inbounds { i64, i64 }, { i64, i64 }* %pair, i32 0, i32 1 + store i64 %3, i64* %7, align 4 + %pair1 = bitcast %"variant[]"* %args to { i8*, i64 }* + %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 0 + store i8* %4, i8** %8, align 8 + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 1 + store i64 %5, i64* %9, align 8 + ret void +} + +; Function Attrs: nounwind +define void @test_test(i32 %0) #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca [3 x i8]*, align 8 + %taddr1 = alloca %"variant[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [2 x %variant], align 16 + %taddr4 = alloca [1 x i8]*, align 8 + %taddr5 = alloca [3 x i8]*, align 8 + %taddr6 = alloca %"variant[]", align 8 + %retparam12 = alloca i64, align 8 + %varargslots13 = alloca [2 x %variant], align 16 + %taddr14 = alloca [4 x i8]*, align 8 + %taddr15 = alloca [4 x i8]*, align 8 + %taddr16 = alloca %"variant[]", align 8 + %retparam22 = alloca i64, align 8 + %varargslots23 = alloca [2 x %variant], align 16 + %taddr24 = alloca [0 x i8]*, align 8 + %taddr25 = alloca [5 x i8]*, align 8 + %taddr26 = alloca %"variant[]", align 8 + %retparam32 = alloca i64, align 8 + %varargslots33 = alloca [2 x %variant], align 16 + %taddr34 = alloca [1 x i8]*, align 8 + %taddr35 = alloca [6 x i8]*, align 8 + %taddr36 = alloca %"variant[]", align 8 + %retparam42 = alloca i64, align 8 + %varargslots43 = alloca [1 x %variant], align 16 + %taddr44 = alloca [3 x i8]*, align 8 + %taddr45 = alloca %"variant[]", align 8 + %retparam51 = alloca i64, align 8 + %varargslots52 = alloca [2 x %variant], align 16 + %taddr53 = alloca [1 x i8]*, align 8 + %taddr54 = alloca [4 x i8]*, align 8 + %taddr55 = alloca %"variant[]", align 8 + %retparam61 = alloca i64, align 8 + %varargslots62 = alloca [2 x %variant], align 16 + %taddr63 = alloca [1 x i8]*, align 8 + %taddr64 = alloca [5 x i8]*, align 8 + %taddr65 = alloca %"variant[]", align 8 + %retparam71 = alloca i64, align 8 + %varargslots72 = alloca [2 x %variant], align 16 + %taddr73 = alloca [0 x i8]*, align 8 + %taddr74 = alloca [5 x i8]*, align 8 + %taddr75 = alloca %"variant[]", align 8 + %retparam81 = alloca i64, align 8 + %varargslots82 = alloca [2 x %variant], align 16 + %taddr83 = alloca [3 x i8]*, align 8 + %taddr84 = alloca [3 x i8]*, align 8 + %taddr85 = alloca %"variant[]", align 8 + %retparam91 = alloca i64, align 8 + %varargslots92 = alloca [1 x %variant], align 16 + %taddr93 = alloca [4 x i8]*, align 8 + %taddr94 = alloca %"variant[]", align 8 + %retparam100 = alloca i64, align 8 + %varargslots101 = alloca [2 x %variant], align 16 + %taddr102 = alloca [1 x i8]*, align 8 + %taddr103 = alloca [3 x i8]*, align 8 + %taddr104 = alloca %"variant[]", align 8 + %retparam110 = alloca i64, align 8 + %varargslots111 = alloca [2 x %variant], align 16 + %taddr112 = alloca [1 x i8]*, align 8 + %taddr113 = alloca [5 x i8]*, align 8 + %taddr114 = alloca %"variant[]", align 8 + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0)) #1 + %2 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i32 0, i32 0)) #1 + %3 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i32 0, i32 0)) #1 + %4 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i32 0, i32 0)) #1 + %5 = call i32 @std_io_println(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i32 0, i32 0)) #1 + %6 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.14, i32 0, i32 0)) #1 + %7 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.15, i32 0, i32 0)) #1 + store [3 x i8]* bitcast ([4 x i8]* @.str.17 to [3 x i8]*), [3 x i8]** %taddr, align 8 + %8 = bitcast [3 x i8]** %taddr to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %11 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %10, %variant* %11, align 16 + %12 = bitcast [1 x %variant]* %varargslots to %variant* + %13 = insertvalue %"variant[]" undef, %variant* %12, 0 + %14 = insertvalue %"variant[]" %13, i64 1, 1 + store %"variant[]" %14, %"variant[]"* %taddr1, align 8 + %15 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 + %lo = load i8*, i8** %16, align 8 + %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 + %hi = load i64, i64* %17, align 8 + %18 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.16, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %18, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + store [1 x i8]* bitcast ([2 x i8]* @.str.19 to [1 x i8]*), [1 x i8]** %taddr4, align 8 + %19 = bitcast [1 x i8]** %taddr4 to i8* + %20 = insertvalue %variant undef, i8* %19, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 + %22 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots3, i64 0, i64 0 + store %variant %21, %variant* %22, align 16 + store [3 x i8]* bitcast ([4 x i8]* @.str.20 to [3 x i8]*), [3 x i8]** %taddr5, align 8 + %23 = bitcast [3 x i8]** %taddr5 to i8* + %24 = insertvalue %variant undef, i8* %23, 0 + %25 = insertvalue %variant %24, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %26 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots3, i64 0, i64 1 + store %variant %25, %variant* %26, align 16 + %27 = bitcast [2 x %variant]* %varargslots3 to %variant* + %28 = insertvalue %"variant[]" undef, %variant* %27, 0 + %29 = insertvalue %"variant[]" %28, i64 2, 1 + store %"variant[]" %29, %"variant[]"* %taddr6, align 8 + %30 = bitcast %"variant[]"* %taddr6 to { i8*, i64 }* + %31 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %30, i32 0, i32 0 + %lo7 = load i8*, i8** %31, align 8 + %32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %30, i32 0, i32 1 + %hi8 = load i64, i64* %32, align 8 + %33 = call i64 @std_io_printfn(i64* %retparam2, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.18, i32 0, i32 0), i64 6, i8* %lo7, i64 %hi8) + %not_err9 = icmp eq i64 %33, 0 + br i1 %not_err9, label %after_check10, label %voiderr11 + +after_check10: ; preds = %voiderr + br label %voiderr11 + +voiderr11: ; preds = %after_check10, %voiderr + store [4 x i8]* bitcast ([5 x i8]* @.str.22 to [4 x i8]*), [4 x i8]** %taddr14, align 8 + %34 = bitcast [4 x i8]** %taddr14 to i8* + %35 = insertvalue %variant undef, i8* %34, 0 + %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 + %37 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots13, i64 0, i64 0 + store %variant %36, %variant* %37, align 16 + store [4 x i8]* bitcast ([5 x i8]* @.str.23 to [4 x i8]*), [4 x i8]** %taddr15, align 8 + %38 = bitcast [4 x i8]** %taddr15 to i8* + %39 = insertvalue %variant undef, i8* %38, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 + %41 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots13, i64 0, i64 1 + store %variant %40, %variant* %41, align 16 + %42 = bitcast [2 x %variant]* %varargslots13 to %variant* + %43 = insertvalue %"variant[]" undef, %variant* %42, 0 + %44 = insertvalue %"variant[]" %43, i64 2, 1 + store %"variant[]" %44, %"variant[]"* %taddr16, align 8 + %45 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* + %46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0 + %lo17 = load i8*, i8** %46, align 8 + %47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1 + %hi18 = load i64, i64* %47, align 8 + %48 = call i64 @std_io_printfn(i64* %retparam12, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.21, i32 0, i32 0), i64 6, i8* %lo17, i64 %hi18) + %not_err19 = icmp eq i64 %48, 0 + br i1 %not_err19, label %after_check20, label %voiderr21 + +after_check20: ; preds = %voiderr11 + br label %voiderr21 + +voiderr21: ; preds = %after_check20, %voiderr11 + store [0 x i8]* bitcast ([1 x i8]* @.str.25 to [0 x i8]*), [0 x i8]** %taddr24, align 8 + %49 = bitcast [0 x i8]** %taddr24 to i8* + %50 = insertvalue %variant undef, i8* %49, 0 + %51 = insertvalue %variant %50, i64 ptrtoint (%.introspect* @"ct$p$a0$char" to i64), 1 + %52 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots23, i64 0, i64 0 + store %variant %51, %variant* %52, align 16 + store [5 x i8]* bitcast ([6 x i8]* @.str.26 to [5 x i8]*), [5 x i8]** %taddr25, align 8 + %53 = bitcast [5 x i8]** %taddr25 to i8* + %54 = insertvalue %variant undef, i8* %53, 0 + %55 = insertvalue %variant %54, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 + %56 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots23, i64 0, i64 1 + store %variant %55, %variant* %56, align 16 + %57 = bitcast [2 x %variant]* %varargslots23 to %variant* + %58 = insertvalue %"variant[]" undef, %variant* %57, 0 + %59 = insertvalue %"variant[]" %58, i64 2, 1 + store %"variant[]" %59, %"variant[]"* %taddr26, align 8 + %60 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* + %61 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %60, i32 0, i32 0 + %lo27 = load i8*, i8** %61, align 8 + %62 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %60, i32 0, i32 1 + %hi28 = load i64, i64* %62, align 8 + %63 = call i64 @std_io_printfn(i64* %retparam22, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.24, i32 0, i32 0), i64 6, i8* %lo27, i64 %hi28) + %not_err29 = icmp eq i64 %63, 0 + br i1 %not_err29, label %after_check30, label %voiderr31 + +after_check30: ; preds = %voiderr21 + br label %voiderr31 + +voiderr31: ; preds = %after_check30, %voiderr21 + store [1 x i8]* bitcast ([2 x i8]* @.str.28 to [1 x i8]*), [1 x i8]** %taddr34, align 8 + %64 = bitcast [1 x i8]** %taddr34 to i8* + %65 = insertvalue %variant undef, i8* %64, 0 + %66 = insertvalue %variant %65, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 + %67 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots33, i64 0, i64 0 + store %variant %66, %variant* %67, align 16 + store [6 x i8]* bitcast ([7 x i8]* @.str.29 to [6 x i8]*), [6 x i8]** %taddr35, align 8 + %68 = bitcast [6 x i8]** %taddr35 to i8* + %69 = insertvalue %variant undef, i8* %68, 0 + %70 = insertvalue %variant %69, i64 ptrtoint (%.introspect* @"ct$p$a6$char" to i64), 1 + %71 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots33, i64 0, i64 1 + store %variant %70, %variant* %71, align 16 + %72 = bitcast [2 x %variant]* %varargslots33 to %variant* + %73 = insertvalue %"variant[]" undef, %variant* %72, 0 + %74 = insertvalue %"variant[]" %73, i64 2, 1 + store %"variant[]" %74, %"variant[]"* %taddr36, align 8 + %75 = bitcast %"variant[]"* %taddr36 to { i8*, i64 }* + %76 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %75, i32 0, i32 0 + %lo37 = load i8*, i8** %76, align 8 + %77 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %75, i32 0, i32 1 + %hi38 = load i64, i64* %77, align 8 + %78 = call i64 @std_io_printfn(i64* %retparam32, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.27, i32 0, i32 0), i64 6, i8* %lo37, i64 %hi38) + %not_err39 = icmp eq i64 %78, 0 + br i1 %not_err39, label %after_check40, label %voiderr41 + +after_check40: ; preds = %voiderr31 + br label %voiderr41 + +voiderr41: ; preds = %after_check40, %voiderr31 + store [3 x i8]* bitcast ([4 x i8]* @.str.31 to [3 x i8]*), [3 x i8]** %taddr44, align 8 + %79 = bitcast [3 x i8]** %taddr44 to i8* + %80 = insertvalue %variant undef, i8* %79, 0 + %81 = insertvalue %variant %80, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %82 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots43, i64 0, i64 0 + store %variant %81, %variant* %82, align 16 + %83 = bitcast [1 x %variant]* %varargslots43 to %variant* + %84 = insertvalue %"variant[]" undef, %variant* %83, 0 + %85 = insertvalue %"variant[]" %84, i64 1, 1 + store %"variant[]" %85, %"variant[]"* %taddr45, align 8 + %86 = bitcast %"variant[]"* %taddr45 to { i8*, i64 }* + %87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 0 + %lo46 = load i8*, i8** %87, align 8 + %88 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 1 + %hi47 = load i64, i64* %88, align 8 + %89 = call i64 @std_io_printfn(i64* %retparam42, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.30, i32 0, i32 0), i64 8, i8* %lo46, i64 %hi47) + %not_err48 = icmp eq i64 %89, 0 + br i1 %not_err48, label %after_check49, label %voiderr50 + +after_check49: ; preds = %voiderr41 + br label %voiderr50 + +voiderr50: ; preds = %after_check49, %voiderr41 + store [1 x i8]* bitcast ([2 x i8]* @.str.33 to [1 x i8]*), [1 x i8]** %taddr53, align 8 + %90 = bitcast [1 x i8]** %taddr53 to i8* + %91 = insertvalue %variant undef, i8* %90, 0 + %92 = insertvalue %variant %91, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 + %93 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 0 + store %variant %92, %variant* %93, align 16 + store [4 x i8]* bitcast ([5 x i8]* @.str.34 to [4 x i8]*), [4 x i8]** %taddr54, align 8 + %94 = bitcast [4 x i8]** %taddr54 to i8* + %95 = insertvalue %variant undef, i8* %94, 0 + %96 = insertvalue %variant %95, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 + %97 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 1 + store %variant %96, %variant* %97, align 16 + %98 = bitcast [2 x %variant]* %varargslots52 to %variant* + %99 = insertvalue %"variant[]" undef, %variant* %98, 0 + %100 = insertvalue %"variant[]" %99, i64 2, 1 + store %"variant[]" %100, %"variant[]"* %taddr55, align 8 + %101 = bitcast %"variant[]"* %taddr55 to { i8*, i64 }* + %102 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %101, i32 0, i32 0 + %lo56 = load i8*, i8** %102, align 8 + %103 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %101, i32 0, i32 1 + %hi57 = load i64, i64* %103, align 8 + %104 = call i64 @std_io_printfn(i64* %retparam51, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.32, i32 0, i32 0), i64 6, i8* %lo56, i64 %hi57) + %not_err58 = icmp eq i64 %104, 0 + br i1 %not_err58, label %after_check59, label %voiderr60 + +after_check59: ; preds = %voiderr50 + br label %voiderr60 + +voiderr60: ; preds = %after_check59, %voiderr50 + store [1 x i8]* bitcast ([2 x i8]* @.str.36 to [1 x i8]*), [1 x i8]** %taddr63, align 8 + %105 = bitcast [1 x i8]** %taddr63 to i8* + %106 = insertvalue %variant undef, i8* %105, 0 + %107 = insertvalue %variant %106, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 + %108 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 0 + store %variant %107, %variant* %108, align 16 + store [5 x i8]* bitcast ([6 x i8]* @.str.37 to [5 x i8]*), [5 x i8]** %taddr64, align 8 + %109 = bitcast [5 x i8]** %taddr64 to i8* + %110 = insertvalue %variant undef, i8* %109, 0 + %111 = insertvalue %variant %110, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 + %112 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 1 + store %variant %111, %variant* %112, align 16 + %113 = bitcast [2 x %variant]* %varargslots62 to %variant* + %114 = insertvalue %"variant[]" undef, %variant* %113, 0 + %115 = insertvalue %"variant[]" %114, i64 2, 1 + store %"variant[]" %115, %"variant[]"* %taddr65, align 8 + %116 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* + %117 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %116, i32 0, i32 0 + %lo66 = load i8*, i8** %117, align 8 + %118 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %116, i32 0, i32 1 + %hi67 = load i64, i64* %118, align 8 + %119 = call i64 @std_io_printfn(i64* %retparam61, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.35, i32 0, i32 0), i64 6, i8* %lo66, i64 %hi67) + %not_err68 = icmp eq i64 %119, 0 + br i1 %not_err68, label %after_check69, label %voiderr70 + +after_check69: ; preds = %voiderr60 + br label %voiderr70 + +voiderr70: ; preds = %after_check69, %voiderr60 + store [0 x i8]* bitcast ([1 x i8]* @.str.39 to [0 x i8]*), [0 x i8]** %taddr73, align 8 + %120 = bitcast [0 x i8]** %taddr73 to i8* + %121 = insertvalue %variant undef, i8* %120, 0 + %122 = insertvalue %variant %121, i64 ptrtoint (%.introspect* @"ct$p$a0$char" to i64), 1 + %123 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 0 + store %variant %122, %variant* %123, align 16 + store [5 x i8]* bitcast ([6 x i8]* @.str.40 to [5 x i8]*), [5 x i8]** %taddr74, align 8 + %124 = bitcast [5 x i8]** %taddr74 to i8* + %125 = insertvalue %variant undef, i8* %124, 0 + %126 = insertvalue %variant %125, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 + %127 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 1 + store %variant %126, %variant* %127, align 16 + %128 = bitcast [2 x %variant]* %varargslots72 to %variant* + %129 = insertvalue %"variant[]" undef, %variant* %128, 0 + %130 = insertvalue %"variant[]" %129, i64 2, 1 + store %"variant[]" %130, %"variant[]"* %taddr75, align 8 + %131 = bitcast %"variant[]"* %taddr75 to { i8*, i64 }* + %132 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %131, i32 0, i32 0 + %lo76 = load i8*, i8** %132, align 8 + %133 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %131, i32 0, i32 1 + %hi77 = load i64, i64* %133, align 8 + %134 = call i64 @std_io_printfn(i64* %retparam71, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.38, i32 0, i32 0), i64 6, i8* %lo76, i64 %hi77) + %not_err78 = icmp eq i64 %134, 0 + br i1 %not_err78, label %after_check79, label %voiderr80 + +after_check79: ; preds = %voiderr70 + br label %voiderr80 + +voiderr80: ; preds = %after_check79, %voiderr70 + store [3 x i8]* bitcast ([4 x i8]* @.str.42 to [3 x i8]*), [3 x i8]** %taddr83, align 8 + %135 = bitcast [3 x i8]** %taddr83 to i8* + %136 = insertvalue %variant undef, i8* %135, 0 + %137 = insertvalue %variant %136, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %138 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots82, i64 0, i64 0 + store %variant %137, %variant* %138, align 16 + store [3 x i8]* bitcast ([4 x i8]* @.str.43 to [3 x i8]*), [3 x i8]** %taddr84, align 8 + %139 = bitcast [3 x i8]** %taddr84 to i8* + %140 = insertvalue %variant undef, i8* %139, 0 + %141 = insertvalue %variant %140, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %142 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots82, i64 0, i64 1 + store %variant %141, %variant* %142, align 16 + %143 = bitcast [2 x %variant]* %varargslots82 to %variant* + %144 = insertvalue %"variant[]" undef, %variant* %143, 0 + %145 = insertvalue %"variant[]" %144, i64 2, 1 + store %"variant[]" %145, %"variant[]"* %taddr85, align 8 + %146 = bitcast %"variant[]"* %taddr85 to { i8*, i64 }* + %147 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %146, i32 0, i32 0 + %lo86 = load i8*, i8** %147, align 8 + %148 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %146, i32 0, i32 1 + %hi87 = load i64, i64* %148, align 8 + %149 = call i64 @std_io_printfn(i64* %retparam81, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.41, i32 0, i32 0), i64 6, i8* %lo86, i64 %hi87) + %not_err88 = icmp eq i64 %149, 0 + br i1 %not_err88, label %after_check89, label %voiderr90 + +after_check89: ; preds = %voiderr80 + br label %voiderr90 + +voiderr90: ; preds = %after_check89, %voiderr80 + store [4 x i8]* bitcast ([5 x i8]* @.str.45 to [4 x i8]*), [4 x i8]** %taddr93, align 8 + %150 = bitcast [4 x i8]** %taddr93 to i8* + %151 = insertvalue %variant undef, i8* %150, 0 + %152 = insertvalue %variant %151, i64 ptrtoint (%.introspect* @"ct$p$a4$char" to i64), 1 + %153 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots92, i64 0, i64 0 + store %variant %152, %variant* %153, align 16 + %154 = bitcast [1 x %variant]* %varargslots92 to %variant* + %155 = insertvalue %"variant[]" undef, %variant* %154, 0 + %156 = insertvalue %"variant[]" %155, i64 1, 1 + store %"variant[]" %156, %"variant[]"* %taddr94, align 8 + %157 = bitcast %"variant[]"* %taddr94 to { i8*, i64 }* + %158 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %157, i32 0, i32 0 + %lo95 = load i8*, i8** %158, align 8 + %159 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %157, i32 0, i32 1 + %hi96 = load i64, i64* %159, align 8 + %160 = call i64 @std_io_printfn(i64* %retparam91, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.44, i32 0, i32 0), i64 8, i8* %lo95, i64 %hi96) + %not_err97 = icmp eq i64 %160, 0 + br i1 %not_err97, label %after_check98, label %voiderr99 + +after_check98: ; preds = %voiderr90 + br label %voiderr99 + +voiderr99: ; preds = %after_check98, %voiderr90 + store [1 x i8]* bitcast ([2 x i8]* @.str.47 to [1 x i8]*), [1 x i8]** %taddr102, align 8 + %161 = bitcast [1 x i8]** %taddr102 to i8* + %162 = insertvalue %variant undef, i8* %161, 0 + %163 = insertvalue %variant %162, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 + %164 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots101, i64 0, i64 0 + store %variant %163, %variant* %164, align 16 + store [3 x i8]* bitcast ([4 x i8]* @.str.48 to [3 x i8]*), [3 x i8]** %taddr103, align 8 + %165 = bitcast [3 x i8]** %taddr103 to i8* + %166 = insertvalue %variant undef, i8* %165, 0 + %167 = insertvalue %variant %166, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %168 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots101, i64 0, i64 1 + store %variant %167, %variant* %168, align 16 + %169 = bitcast [2 x %variant]* %varargslots101 to %variant* + %170 = insertvalue %"variant[]" undef, %variant* %169, 0 + %171 = insertvalue %"variant[]" %170, i64 2, 1 + store %"variant[]" %171, %"variant[]"* %taddr104, align 8 + %172 = bitcast %"variant[]"* %taddr104 to { i8*, i64 }* + %173 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %172, i32 0, i32 0 + %lo105 = load i8*, i8** %173, align 8 + %174 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %172, i32 0, i32 1 + %hi106 = load i64, i64* %174, align 8 + %175 = call i64 @std_io_printfn(i64* %retparam100, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.46, i32 0, i32 0), i64 6, i8* %lo105, i64 %hi106) + %not_err107 = icmp eq i64 %175, 0 + br i1 %not_err107, label %after_check108, label %voiderr109 + +after_check108: ; preds = %voiderr99 + br label %voiderr109 + +voiderr109: ; preds = %after_check108, %voiderr99 + store [1 x i8]* bitcast ([2 x i8]* @.str.50 to [1 x i8]*), [1 x i8]** %taddr112, align 8 + %176 = bitcast [1 x i8]** %taddr112 to i8* + %177 = insertvalue %variant undef, i8* %176, 0 + %178 = insertvalue %variant %177, i64 ptrtoint (%.introspect* @"ct$p$a1$char" to i64), 1 + %179 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 0 + store %variant %178, %variant* %179, align 16 + store [5 x i8]* bitcast ([6 x i8]* @.str.51 to [5 x i8]*), [5 x i8]** %taddr113, align 8 + %180 = bitcast [5 x i8]** %taddr113 to i8* + %181 = insertvalue %variant undef, i8* %180, 0 + %182 = insertvalue %variant %181, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 + %183 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 1 + store %variant %182, %variant* %183, align 16 + %184 = bitcast [2 x %variant]* %varargslots111 to %variant* + %185 = insertvalue %"variant[]" undef, %variant* %184, 0 + %186 = insertvalue %"variant[]" %185, i64 2, 1 + store %"variant[]" %186, %"variant[]"* %taddr114, align 8 + %187 = bitcast %"variant[]"* %taddr114 to { i8*, i64 }* + %188 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %187, i32 0, i32 0 + %lo115 = load i8*, i8** %188, align 8 + %189 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %187, i32 0, i32 1 + %hi116 = load i64, i64* %189, align 8 + %190 = call i64 @std_io_printfn(i64* %retparam110, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.49, i32 0, i32 0), i64 6, i8* %lo115, i64 %hi116) + %not_err117 = icmp eq i64 %190, 0 + br i1 %not_err117, label %after_check118, label %voiderr119 + +after_check118: ; preds = %voiderr109 + br label %voiderr119 + +voiderr119: ; preds = %after_check118, %voiderr109 + ret void +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i64, align 8 + %taddr1 = alloca %"variant[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [1 x %variant], align 16 + %taddr4 = alloca i64, align 8 + %taddr5 = alloca %"variant[]", align 8 + %retparam11 = alloca i64, align 8 + %varargslots12 = alloca [2 x %variant], align 16 + %taddr13 = alloca i64, align 8 + %taddr14 = alloca i64, align 8 + %taddr15 = alloca %"variant[]", align 8 + %retparam21 = alloca i64, align 8 + %varargslots22 = alloca [2 x %variant], align 16 + %taddr23 = alloca i64, align 8 + %taddr24 = alloca i64, align 8 + %taddr25 = alloca %"variant[]", align 8 + %retparam31 = alloca i64, align 8 + %varargslots32 = alloca [2 x %variant], align 16 + %taddr33 = alloca i64, align 8 + %taddr34 = alloca i64, align 8 + %taddr35 = alloca %"variant[]", align 8 + %retparam41 = alloca i64, align 8 + %varargslots42 = alloca [2 x %variant], align 16 + %taddr43 = alloca i64, align 8 + %taddr44 = alloca i64, align 8 + %taddr45 = alloca %"variant[]", align 8 + %retparam51 = alloca i64, align 8 + %varargslots52 = alloca [2 x %variant], align 16 + %taddr53 = alloca i64, align 8 + %taddr54 = alloca i64, align 8 + %taddr55 = alloca %"variant[]", align 8 + %retparam61 = alloca i64, align 8 + %varargslots62 = alloca [2 x %variant], align 16 + %taddr63 = alloca i64, align 8 + %taddr64 = alloca i64, align 8 + %taddr65 = alloca %"variant[]", align 8 + %retparam71 = alloca i64, align 8 + %varargslots72 = alloca [2 x %variant], align 16 + %taddr73 = alloca i64, align 8 + %taddr74 = alloca i64, align 8 + %taddr75 = alloca %"variant[]", align 8 + %retparam81 = alloca i64, align 8 + %varargslots82 = alloca [1 x %variant], align 16 + %taddr83 = alloca i64, align 8 + %taddr84 = alloca %"variant[]", align 8 + %retparam90 = alloca i64, align 8 + %varargslots91 = alloca [2 x %variant], align 16 + %taddr92 = alloca i64, align 8 + %taddr93 = alloca i64, align 8 + %taddr94 = alloca %"variant[]", align 8 + store i64 4, i64* %taddr, align 8 + %0 = bitcast i64* %taddr to i8* + %1 = insertvalue %variant undef, i8* %0, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %2, %variant* %3, align 16 + %4 = bitcast [1 x %variant]* %varargslots to %variant* + %5 = insertvalue %"variant[]" undef, %variant* %4, 0 + %6 = insertvalue %"variant[]" %5, i64 1, 1 + store %"variant[]" %6, %"variant[]"* %taddr1, align 8 + %7 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 0 + %lo = load i8*, i8** %8, align 8 + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 1 + %hi = load i64, i64* %9, align 8 + %10 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.52, i32 0, i32 0), i64 7, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %10, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + store i64 1, i64* %taddr4, align 8 + %11 = bitcast i64* %taddr4 to i8* + %12 = insertvalue %variant undef, i8* %11, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 + %14 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 + store %variant %13, %variant* %14, align 16 + %15 = bitcast [1 x %variant]* %varargslots3 to %variant* + %16 = insertvalue %"variant[]" undef, %variant* %15, 0 + %17 = insertvalue %"variant[]" %16, i64 1, 1 + store %"variant[]" %17, %"variant[]"* %taddr5, align 8 + %18 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 0 + %lo6 = load i8*, i8** %19, align 8 + %20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 1 + %hi7 = load i64, i64* %20, align 8 + %21 = call i64 @std_io_printfn(i64* %retparam2, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.53, i32 0, i32 0), i64 7, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %21, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %voiderr + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %voiderr + store i64 0, i64* %taddr13, align 8 + %22 = bitcast i64* %taddr13 to i8* + %23 = insertvalue %variant undef, i8* %22, 0 + %24 = insertvalue %variant %23, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %25 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots12, i64 0, i64 0 + store %variant %24, %variant* %25, align 16 + store i64 4, i64* %taddr14, align 8 + %26 = bitcast i64* %taddr14 to i8* + %27 = insertvalue %variant undef, i8* %26, 0 + %28 = insertvalue %variant %27, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %29 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots12, i64 0, i64 1 + store %variant %28, %variant* %29, align 16 + %30 = bitcast [2 x %variant]* %varargslots12 to %variant* + %31 = insertvalue %"variant[]" undef, %variant* %30, 0 + %32 = insertvalue %"variant[]" %31, i64 2, 1 + store %"variant[]" %32, %"variant[]"* %taddr15, align 8 + %33 = bitcast %"variant[]"* %taddr15 to { i8*, i64 }* + %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %33, i32 0, i32 0 + %lo16 = load i8*, i8** %34, align 8 + %35 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %33, i32 0, i32 1 + %hi17 = load i64, i64* %35, align 8 + %36 = call i64 @std_io_printfn(i64* %retparam11, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.54, i32 0, i32 0), i64 8, i8* %lo16, i64 %hi17) + %not_err18 = icmp eq i64 %36, 0 + br i1 %not_err18, label %after_check19, label %voiderr20 + +after_check19: ; preds = %voiderr10 + br label %voiderr20 + +voiderr20: ; preds = %after_check19, %voiderr10 + store i64 2, i64* %taddr23, align 8 + %37 = bitcast i64* %taddr23 to i8* + %38 = insertvalue %variant undef, i8* %37, 0 + %39 = insertvalue %variant %38, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %40 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots22, i64 0, i64 0 + store %variant %39, %variant* %40, align 16 + store i64 2, i64* %taddr24, align 8 + %41 = bitcast i64* %taddr24 to i8* + %42 = insertvalue %variant undef, i8* %41, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %44 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots22, i64 0, i64 1 + store %variant %43, %variant* %44, align 16 + %45 = bitcast [2 x %variant]* %varargslots22 to %variant* + %46 = insertvalue %"variant[]" undef, %variant* %45, 0 + %47 = insertvalue %"variant[]" %46, i64 2, 1 + store %"variant[]" %47, %"variant[]"* %taddr25, align 8 + %48 = bitcast %"variant[]"* %taddr25 to { i8*, i64 }* + %49 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 0 + %lo26 = load i8*, i8** %49, align 8 + %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 1 + %hi27 = load i64, i64* %50, align 8 + %51 = call i64 @std_io_printfn(i64* %retparam21, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.55, i32 0, i32 0), i64 8, i8* %lo26, i64 %hi27) + %not_err28 = icmp eq i64 %51, 0 + br i1 %not_err28, label %after_check29, label %voiderr30 + +after_check29: ; preds = %voiderr20 + br label %voiderr30 + +voiderr30: ; preds = %after_check29, %voiderr20 + store i64 4, i64* %taddr33, align 8 + %52 = bitcast i64* %taddr33 to i8* + %53 = insertvalue %variant undef, i8* %52, 0 + %54 = insertvalue %variant %53, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %55 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots32, i64 0, i64 0 + store %variant %54, %variant* %55, align 16 + store i64 4, i64* %taddr34, align 8 + %56 = bitcast i64* %taddr34 to i8* + %57 = insertvalue %variant undef, i8* %56, 0 + %58 = insertvalue %variant %57, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %59 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots32, i64 0, i64 1 + store %variant %58, %variant* %59, align 16 + %60 = bitcast [2 x %variant]* %varargslots32 to %variant* + %61 = insertvalue %"variant[]" undef, %variant* %60, 0 + %62 = insertvalue %"variant[]" %61, i64 2, 1 + store %"variant[]" %62, %"variant[]"* %taddr35, align 8 + %63 = bitcast %"variant[]"* %taddr35 to { i8*, i64 }* + %64 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 0 + %lo36 = load i8*, i8** %64, align 8 + %65 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 1 + %hi37 = load i64, i64* %65, align 8 + %66 = call i64 @std_io_printfn(i64* %retparam31, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.56, i32 0, i32 0), i64 8, i8* %lo36, i64 %hi37) + %not_err38 = icmp eq i64 %66, 0 + br i1 %not_err38, label %after_check39, label %voiderr40 + +after_check39: ; preds = %voiderr30 + br label %voiderr40 + +voiderr40: ; preds = %after_check39, %voiderr30 + store i64 4, i64* %taddr43, align 8 + %67 = bitcast i64* %taddr43 to i8* + %68 = insertvalue %variant undef, i8* %67, 0 + %69 = insertvalue %variant %68, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %70 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots42, i64 0, i64 0 + store %variant %69, %variant* %70, align 16 + store i64 4, i64* %taddr44, align 8 + %71 = bitcast i64* %taddr44 to i8* + %72 = insertvalue %variant undef, i8* %71, 0 + %73 = insertvalue %variant %72, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %74 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots42, i64 0, i64 1 + store %variant %73, %variant* %74, align 16 + %75 = bitcast [2 x %variant]* %varargslots42 to %variant* + %76 = insertvalue %"variant[]" undef, %variant* %75, 0 + %77 = insertvalue %"variant[]" %76, i64 2, 1 + store %"variant[]" %77, %"variant[]"* %taddr45, align 8 + %78 = bitcast %"variant[]"* %taddr45 to { i8*, i64 }* + %79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 0 + %lo46 = load i8*, i8** %79, align 8 + %80 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 1 + %hi47 = load i64, i64* %80, align 8 + %81 = call i64 @std_io_printfn(i64* %retparam41, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.57, i32 0, i32 0), i64 8, i8* %lo46, i64 %hi47) + %not_err48 = icmp eq i64 %81, 0 + br i1 %not_err48, label %after_check49, label %voiderr50 + +after_check49: ; preds = %voiderr40 + br label %voiderr50 + +voiderr50: ; preds = %after_check49, %voiderr40 + store i64 4, i64* %taddr53, align 8 + %82 = bitcast i64* %taddr53 to i8* + %83 = insertvalue %variant undef, i8* %82, 0 + %84 = insertvalue %variant %83, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %85 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 0 + store %variant %84, %variant* %85, align 16 + store i64 4, i64* %taddr54, align 8 + %86 = bitcast i64* %taddr54 to i8* + %87 = insertvalue %variant undef, i8* %86, 0 + %88 = insertvalue %variant %87, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %89 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots52, i64 0, i64 1 + store %variant %88, %variant* %89, align 16 + %90 = bitcast [2 x %variant]* %varargslots52 to %variant* + %91 = insertvalue %"variant[]" undef, %variant* %90, 0 + %92 = insertvalue %"variant[]" %91, i64 2, 1 + store %"variant[]" %92, %"variant[]"* %taddr55, align 8 + %93 = bitcast %"variant[]"* %taddr55 to { i8*, i64 }* + %94 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %93, i32 0, i32 0 + %lo56 = load i8*, i8** %94, align 8 + %95 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %93, i32 0, i32 1 + %hi57 = load i64, i64* %95, align 8 + %96 = call i64 @std_io_printfn(i64* %retparam51, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.58, i32 0, i32 0), i64 9, i8* %lo56, i64 %hi57) + %not_err58 = icmp eq i64 %96, 0 + br i1 %not_err58, label %after_check59, label %voiderr60 + +after_check59: ; preds = %voiderr50 + br label %voiderr60 + +voiderr60: ; preds = %after_check59, %voiderr50 + store i64 5, i64* %taddr63, align 8 + %97 = bitcast i64* %taddr63 to i8* + %98 = insertvalue %variant undef, i8* %97, 0 + %99 = insertvalue %variant %98, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %100 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 0 + store %variant %99, %variant* %100, align 16 + store i64 1, i64* %taddr64, align 8 + %101 = bitcast i64* %taddr64 to i8* + %102 = insertvalue %variant undef, i8* %101, 0 + %103 = insertvalue %variant %102, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %104 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots62, i64 0, i64 1 + store %variant %103, %variant* %104, align 16 + %105 = bitcast [2 x %variant]* %varargslots62 to %variant* + %106 = insertvalue %"variant[]" undef, %variant* %105, 0 + %107 = insertvalue %"variant[]" %106, i64 2, 1 + store %"variant[]" %107, %"variant[]"* %taddr65, align 8 + %108 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* + %109 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %108, i32 0, i32 0 + %lo66 = load i8*, i8** %109, align 8 + %110 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %108, i32 0, i32 1 + %hi67 = load i64, i64* %110, align 8 + %111 = call i64 @std_io_printfn(i64* %retparam61, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.59, i32 0, i32 0), i64 9, i8* %lo66, i64 %hi67) + %not_err68 = icmp eq i64 %111, 0 + br i1 %not_err68, label %after_check69, label %voiderr70 + +after_check69: ; preds = %voiderr60 + br label %voiderr70 + +voiderr70: ; preds = %after_check69, %voiderr60 + store i64 8, i64* %taddr73, align 8 + %112 = bitcast i64* %taddr73 to i8* + %113 = insertvalue %variant undef, i8* %112, 0 + %114 = insertvalue %variant %113, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %115 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 0 + store %variant %114, %variant* %115, align 16 + store i64 4, i64* %taddr74, align 8 + %116 = bitcast i64* %taddr74 to i8* + %117 = insertvalue %variant undef, i8* %116, 0 + %118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %119 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots72, i64 0, i64 1 + store %variant %118, %variant* %119, align 16 + %120 = bitcast [2 x %variant]* %varargslots72 to %variant* + %121 = insertvalue %"variant[]" undef, %variant* %120, 0 + %122 = insertvalue %"variant[]" %121, i64 2, 1 + store %"variant[]" %122, %"variant[]"* %taddr75, align 8 + %123 = bitcast %"variant[]"* %taddr75 to { i8*, i64 }* + %124 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 0 + %lo76 = load i8*, i8** %124, align 8 + %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 1 + %hi77 = load i64, i64* %125, align 8 + %126 = call i64 @std_io_printfn(i64* %retparam71, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.60, i32 0, i32 0), i64 10, i8* %lo76, i64 %hi77) + %not_err78 = icmp eq i64 %126, 0 + br i1 %not_err78, label %after_check79, label %voiderr80 + +after_check79: ; preds = %voiderr70 + br label %voiderr80 + +voiderr80: ; preds = %after_check79, %voiderr70 + store i64 4, i64* %taddr83, align 8 + %127 = bitcast i64* %taddr83 to i8* + %128 = insertvalue %variant undef, i8* %127, 0 + %129 = insertvalue %variant %128, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %130 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots82, i64 0, i64 0 + store %variant %129, %variant* %130, align 16 + %131 = bitcast [1 x %variant]* %varargslots82 to %variant* + %132 = insertvalue %"variant[]" undef, %variant* %131, 0 + %133 = insertvalue %"variant[]" %132, i64 1, 1 + store %"variant[]" %133, %"variant[]"* %taddr84, align 8 + %134 = bitcast %"variant[]"* %taddr84 to { i8*, i64 }* + %135 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %134, i32 0, i32 0 + %lo85 = load i8*, i8** %135, align 8 + %136 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %134, i32 0, i32 1 + %hi86 = load i64, i64* %136, align 8 + %137 = call i64 @std_io_printfn(i64* %retparam81, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.61, i32 0, i32 0), i64 7, i8* %lo85, i64 %hi86) + %not_err87 = icmp eq i64 %137, 0 + br i1 %not_err87, label %after_check88, label %voiderr89 + +after_check88: ; preds = %voiderr80 + br label %voiderr89 + +voiderr89: ; preds = %after_check88, %voiderr80 + store i64 8, i64* %taddr92, align 8 + %138 = bitcast i64* %taddr92 to i8* + %139 = insertvalue %variant undef, i8* %138, 0 + %140 = insertvalue %variant %139, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %141 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots91, i64 0, i64 0 + store %variant %140, %variant* %141, align 16 + store i64 4, i64* %taddr93, align 8 + %142 = bitcast i64* %taddr93 to i8* + %143 = insertvalue %variant undef, i8* %142, 0 + %144 = insertvalue %variant %143, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %145 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots91, i64 0, i64 1 + store %variant %144, %variant* %145, align 16 + %146 = bitcast [2 x %variant]* %varargslots91 to %variant* + %147 = insertvalue %"variant[]" undef, %variant* %146, 0 + %148 = insertvalue %"variant[]" %147, i64 2, 1 + store %"variant[]" %148, %"variant[]"* %taddr94, align 8 + %149 = bitcast %"variant[]"* %taddr94 to { i8*, i64 }* + %150 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 0 + %lo95 = load i8*, i8** %150, align 8 + %151 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 1 + %hi96 = load i64, i64* %151, align 8 + %152 = call i64 @std_io_printfn(i64* %retparam90, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.62, i32 0, i32 0), i64 10, i8* %lo95, i64 %hi96) + %not_err97 = icmp eq i64 %152, 0 + br i1 %not_err97, label %after_check98, label %voiderr99 + +after_check98: ; preds = %voiderr89 + br label %voiderr99 + +voiderr99: ; preds = %after_check98, %voiderr89 + call void @test_test(i32 10) + ret void +} diff --git a/test/test_suite2/compile_time/ct_switch.c3t b/test/test_suite14/compile_time/ct_switch.c3t similarity index 65% rename from test/test_suite2/compile_time/ct_switch.c3t rename to test/test_suite14/compile_time/ct_switch.c3t index 9a832eb98..125f74188 100644 --- a/test/test_suite2/compile_time/ct_switch.c3t +++ b/test/test_suite14/compile_time/ct_switch.c3t @@ -49,17 +49,15 @@ fn void main() @.str.7 = private unnamed_addr constant [14 x i8] c"donnowifprime\00", align 1 @.str.8 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 @.str.9 = private unnamed_addr constant [14 x i8] c"donnowifprime\00", align 1 - ; Function Attrs: nounwind -declare void @printf(ptr, ...) #0 - +declare void @printf(i8*, ...) #0 ; Function Attrs: nounwind define void @test_main() #0 { entry: - call void (ptr, ...) @printf(ptr @.str, ptr @.str.1) - call void (ptr, ...) @printf(ptr @.str.2, ptr @.str.3) - call void (ptr, ...) @printf(ptr @.str.4, ptr @.str.5) - call void (ptr, ...) @printf(ptr @.str.6, ptr @.str.7) - call void (ptr, ...) @printf(ptr @.str.8, ptr @.str.9) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), [5 x i8]* bitcast ([6 x i8]* @.str.1 to [5 x i8]*)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.3 to [9 x i8]*)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.5 to [9 x i8]*)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.6, i32 0, i32 0), [13 x i8]* bitcast ([14 x i8]* @.str.7 to [13 x i8]*)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.8, i32 0, i32 0), [13 x i8]* bitcast ([14 x i8]* @.str.9 to [13 x i8]*)) ret void } diff --git a/test/test_suite2/compile_time/ct_switch_errors.c3 b/test/test_suite14/compile_time/ct_switch_errors.c3 similarity index 100% rename from test/test_suite2/compile_time/ct_switch_errors.c3 rename to test/test_suite14/compile_time/ct_switch_errors.c3 diff --git a/test/test_suite2/compile_time/ct_switch_more_checks.c3 b/test/test_suite14/compile_time/ct_switch_more_checks.c3 similarity index 100% rename from test/test_suite2/compile_time/ct_switch_more_checks.c3 rename to test/test_suite14/compile_time/ct_switch_more_checks.c3 diff --git a/test/test_suite2/compile_time/ct_switch_top_level.c3t b/test/test_suite14/compile_time/ct_switch_top_level.c3t similarity index 75% rename from test/test_suite2/compile_time/ct_switch_top_level.c3t rename to test/test_suite14/compile_time/ct_switch_top_level.c3t index 63c79fb90..5ffd7cf82 100644 --- a/test/test_suite2/compile_time/ct_switch_top_level.c3t +++ b/test/test_suite14/compile_time/ct_switch_top_level.c3t @@ -45,10 +45,10 @@ entry: %z = alloca i32, align 4 %z1 = alloca i32, align 4 %i = alloca i32, align 4 - call void (ptr, ...) @printf(ptr @.str) - store i32 0, ptr %z, align 4 - call void (ptr, ...) @printf(ptr @.str.1) - store i32 0, ptr %z1, align 4 - store i32 1, ptr %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0)) + store i32 0, i32* %z, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + store i32 0, i32* %z1, align 4 + store i32 1, i32* %i, align 4 ret i32 1 } diff --git a/test/test_suite2/compile_time/ct_switch_type_check.c3t b/test/test_suite14/compile_time/ct_switch_type_check.c3t similarity index 65% rename from test/test_suite2/compile_time/ct_switch_type_check.c3t rename to test/test_suite14/compile_time/ct_switch_type_check.c3t index 69a492928..da7da4389 100644 --- a/test/test_suite2/compile_time/ct_switch_type_check.c3t +++ b/test/test_suite14/compile_time/ct_switch_type_check.c3t @@ -32,15 +32,13 @@ fn void main() @.str.3 = private unnamed_addr constant [7 x i8] c"double\00", align 1 @.str.4 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 @.str.5 = private unnamed_addr constant [10 x i8] c"any other\00", align 1 - ; Function Attrs: nounwind -declare void @printf(ptr, ...) #0 - +declare void @printf(i8*, ...) #0 ; Function Attrs: nounwind define void @test_main() #0 { entry: - call void (ptr, ...) @printf(ptr @.str, ptr @.str.1) - call void (ptr, ...) @printf(ptr @.str.2, ptr @.str.3) - call void (ptr, ...) @printf(ptr @.str.4, ptr @.str.5) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), [3 x i8]* bitcast ([4 x i8]* @.str.1 to [3 x i8]*)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), [6 x i8]* bitcast ([7 x i8]* @.str.3 to [6 x i8]*)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.5 to [9 x i8]*)) ret void } \ No newline at end of file diff --git a/test/test_suite2/compile_time/ct_switch_type_errors.c3 b/test/test_suite14/compile_time/ct_switch_type_errors.c3 similarity index 100% rename from test/test_suite2/compile_time/ct_switch_type_errors.c3 rename to test/test_suite14/compile_time/ct_switch_type_errors.c3 diff --git a/test/test_suite2/compile_time/cttype_reassign.c3t b/test/test_suite14/compile_time/cttype_reassign.c3t similarity index 83% rename from test/test_suite2/compile_time/cttype_reassign.c3t rename to test/test_suite14/compile_time/cttype_reassign.c3t index ef4e0b1fb..6081a9191 100644 --- a/test/test_suite2/compile_time/cttype_reassign.c3t +++ b/test/test_suite14/compile_time/cttype_reassign.c3t @@ -11,5 +11,5 @@ fn void test() // #expect: reassign.ll %hello = alloca i32, align 4 - store i32 0, ptr %hello, align 4 + store i32 0, i32* %hello, align 4 ret void \ No newline at end of file diff --git a/test/test_suite2/compile_time/not_yet_initialized.c3 b/test/test_suite14/compile_time/not_yet_initialized.c3 similarity index 100% rename from test/test_suite2/compile_time/not_yet_initialized.c3 rename to test/test_suite14/compile_time/not_yet_initialized.c3 diff --git a/test/test_suite2/compile_time/stringify.c3t b/test/test_suite14/compile_time/stringify.c3t similarity index 61% rename from test/test_suite2/compile_time/stringify.c3t rename to test/test_suite14/compile_time/stringify.c3t index 81eb7f989..7f1df621b 100644 --- a/test/test_suite2/compile_time/stringify.c3t +++ b/test/test_suite14/compile_time/stringify.c3t @@ -45,20 +45,20 @@ fn void main() define void @test_test() #0 { entry: %i = alloca i32, align 4 - store i32 0, ptr %i, align 4 + store i32 0, i32* %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %0 = load i32, ptr %i, align 4 + %0 = load i32, i32* %i, align 4 %lt = icmp slt i32 %0, 1000 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %1 = load i32, ptr %i, align 4 - %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) - %3 = load i32, ptr %i, align 4 + %1 = load i32, i32* %i, align 4 + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) + %3 = load i32, i32* %i, align 4 %add = add i32 %3, 1 - store i32 %add, ptr %i, align 4 + store i32 %add, i32* %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond @@ -75,34 +75,34 @@ entry: %result = alloca i32, align 4 %diff2 = alloca i64, align 8 %0 = call i64 @clock() - store i64 %0, ptr %t, align 8 + store i64 %0, i64* %t, align 8 call void @test_test() %1 = call i64 @clock() - %2 = load i64, ptr %t, align 8 + %2 = load i64, i64* %t, align 8 %sub = sub i64 %1, %2 - store i64 %sub, ptr %diff, align 8 - %3 = load i64, ptr %diff, align 8 - %4 = call i32 (ptr, ...) @printf(ptr @.str.1, ptr @.str.2, i64 %3) - store i32 100, ptr %a, align 4 + store i64 %sub, i64* %diff, align 8 + %3 = load i64, i64* %diff, align 8 + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.1, i32 0, i32 0), [6 x i8]* bitcast ([7 x i8]* @.str.2 to [6 x i8]*), i64 %3) + store i32 100, i32* %a, align 4 %5 = call i64 @clock() - store i64 %5, ptr %t1, align 8 - %6 = load i32, ptr %a, align 4 + store i64 %5, i64* %t1, align 8 + %6 = load i32, i32* %a, align 4 %add = add i32 4, %6 - store i32 %add, ptr %result, align 4 + store i32 %add, i32* %result, align 4 %7 = call i64 @clock() - %8 = load i64, ptr %t1, align 8 + %8 = load i64, i64* %t1, align 8 %sub3 = sub i64 %7, %8 - store i64 %sub3, ptr %diff2, align 8 - %9 = load i64, ptr %diff2, align 8 - %10 = call i32 (ptr, ...) @printf(ptr @.str.3, ptr @.str.4, i64 %9) - %11 = load i32, ptr %result, align 4 - store i32 %11, ptr %x, align 4 - %12 = load i32, ptr %x, align 4 - %13 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %12) + store i64 %sub3, i64* %diff2, align 8 + %9 = load i64, i64* %diff2, align 8 + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.3, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.4 to [9 x i8]*), i64 %9) + %11 = load i32, i32* %result, align 4 + store i32 %11, i32* %x, align 4 + %12 = load i32, i32* %x, align 4 + %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i32 0, i32 0), i32 %12) ret void } -define i32 @main(i32 %0, ptr %1) #0 { +define i32 @main(i32 %0, i8** %1) #0 { entry: call void @test_main() ret i32 0 diff --git a/test/test_suite2/compile_time/stringify2.c3t b/test/test_suite14/compile_time/stringify2.c3t similarity index 69% rename from test/test_suite2/compile_time/stringify2.c3t rename to test/test_suite14/compile_time/stringify2.c3t index aca9f6a4f..ed8968e55 100644 --- a/test/test_suite2/compile_time/stringify2.c3t +++ b/test/test_suite14/compile_time/stringify2.c3t @@ -8,9 +8,9 @@ fn void main() char[*] s2 = $stringify($s1); char[] s3 = $s1; - io::printfln("$s1 == %s", $s1); - io::printfln("s2 == %s", &s2); - io::printfln("s3 == %s", s3); + io::printfn("$s1 == %s", $s1); + io::printfn("s2 == %s", &s2); + io::printfn("s3 == %s", s3); } /* #expect: test.ll diff --git a/test/test_suite2/compile_time/ternary_folding.c3t b/test/test_suite14/compile_time/ternary_folding.c3t similarity index 94% rename from test/test_suite2/compile_time/ternary_folding.c3t rename to test/test_suite14/compile_time/ternary_folding.c3t index 796e96748..b57db3ad4 100644 --- a/test/test_suite2/compile_time/ternary_folding.c3t +++ b/test/test_suite14/compile_time/ternary_folding.c3t @@ -20,6 +20,6 @@ fn int test2() { return 3; } define void @ternary_folding_test() #0 { entry: %x = alloca i32, align 4 - store i32 0, ptr %x, align 4 + store i32 0, i32* %x, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite2/compile_time/typefrom.c3t b/test/test_suite14/compile_time/typefrom.c3t similarity index 100% rename from test/test_suite2/compile_time/typefrom.c3t rename to test/test_suite14/compile_time/typefrom.c3t diff --git a/test/test_suite2/compile_time/typefrom_errors.c3t b/test/test_suite14/compile_time/typefrom_errors.c3t similarity index 100% rename from test/test_suite2/compile_time/typefrom_errors.c3t rename to test/test_suite14/compile_time/typefrom_errors.c3t diff --git a/test/test_suite14/compile_time/typeof_example.c3t b/test/test_suite14/compile_time/typeof_example.c3t new file mode 100644 index 000000000..3b7491038 --- /dev/null +++ b/test/test_suite14/compile_time/typeof_example.c3t @@ -0,0 +1,54 @@ +extern fn void printf(char *, ...); + +macro bitcast($Target, value) +{ + $typeof(value) temp = value; + $Target* result = ($Target*)(&temp); + return *result; +} + +fn void main() +{ + float f = 100; + int i = bitcast(int, f); + float f2 = bitcast(float, i); + printf("Bitcast %f to %d to %f", f, i, f2); +} + +// #expect: typeof_example.ll + + %f = alloca float, align 4 + %i = alloca i32, align 4 + %value = alloca float, align 4 + %temp = alloca float, align 4 + %result = alloca i32*, align 8 + %f2 = alloca float, align 4 + %value1 = alloca i32, align 4 + %temp2 = alloca i32, align 4 + %result3 = alloca float*, align 8 + store float 1.000000e+02, float* %f, align 4 + %0 = load float, float* %f, align 4 + store float %0, float* %value, align 4 + %1 = load float, float* %value, align 4 + store float %1, float* %temp, align 4 + %ptrptr = bitcast float* %temp to i32* + store i32* %ptrptr, i32** %result, align 8 + %2 = load i32*, i32** %result, align 8 + %3 = load i32, i32* %2, align 8 + store i32 %3, i32* %i, align 4 + %4 = load i32, i32* %i, align 4 + store i32 %4, i32* %value1, align 4 + %5 = load i32, i32* %value1, align 4 + store i32 %5, i32* %temp2, align 4 + %ptrptr4 = bitcast i32* %temp2 to float* + store float* %ptrptr4, float** %result3, align 8 + %6 = load float*, float** %result3, align 8 + %7 = load float, float* %6, align 8 + store float %7, float* %f2, align 4 + %8 = load float, float* %f, align 4 + %fpfpext = fpext float %8 to double + %9 = load i32, i32* %i, align 4 + %10 = load float, float* %f2, align 4 + %fpfpext5 = fpext float %10 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0), double %fpfpext, i32 %9, double %fpfpext5) + ret void \ No newline at end of file diff --git a/test/test_suite2/compile_time/typeof_from_literal.c3 b/test/test_suite14/compile_time/typeof_from_literal.c3 similarity index 100% rename from test/test_suite2/compile_time/typeof_from_literal.c3 rename to test/test_suite14/compile_time/typeof_from_literal.c3 diff --git a/test/test_suite14/compile_time/untyped_conversions.c3t b/test/test_suite14/compile_time/untyped_conversions.c3t new file mode 100644 index 000000000..4113e0029 --- /dev/null +++ b/test/test_suite14/compile_time/untyped_conversions.c3t @@ -0,0 +1,137 @@ +// #target: macos-x64 +module test; +import std::io; +struct Foo +{ + int a; int b; +} +fn void test(int[2] a, int[] b, int[<2>] c) +{ + io::printfn("%s %s %s", a, b, c); +} +fn void main() +{ + var $x = { { 1, 2 } }; + Foo[1] abc = (Foo[1])$x; + Foo def = (Foo)$x[0]; + int[2][1] y = (int[2][1])$x; + double[2][1] y2 = $x; + io::printfn("%s %s {%s, %s}", y, y2, def.a, def.b); + test({ 1, 2 }, { 3, 4}, { 5, 6 }); + var $a = { 2, 7 }; + test($a, $a, $a); +} + +/* #expect: test.ll + +entry: + %abc = alloca [1 x %Foo], align 4 + %def = alloca %Foo, align 4 + %y = alloca [1 x [2 x i32]], align 4 + %y2 = alloca [1 x [2 x double]], align 16 + %retparam = alloca i64, align 8 + %varargslots = alloca [4 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %literal = alloca [2 x i32], align 4 + %literal1 = alloca [2 x i32], align 4 + %taddr2 = alloca %"int[]", align 8 + %taddr5 = alloca <2 x i32>, align 8 + %literal6 = alloca [2 x i32], align 4 + %literal7 = alloca [2 x i32], align 4 + %taddr8 = alloca %"int[]", align 8 + %taddr11 = alloca <2 x i32>, align 8 + %0 = bitcast [1 x %Foo]* %abc to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([1 x %Foo]* @.__const to i8*), i32 8, i1 false) + %1 = bitcast %Foo* %def to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Foo* @.__const.1 to i8*), i32 8, i1 false) + %2 = bitcast [1 x [2 x i32]]* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast ([1 x [2 x i32]]* @.__const.2 to i8*), i32 8, i1 false) + %3 = bitcast [1 x [2 x double]]* %y2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %3, i8* align 16 bitcast ([1 x [2 x double]]* @.__const.3 to i8*), i32 16, i1 false) + %4 = bitcast [1 x [2 x i32]]* %y to i8* + %5 = insertvalue %variant undef, i8* %4, 0 + %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$a1$a2$int" to i64), 1 + %7 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 0 + store %variant %6, %variant* %7, align 16 + %8 = bitcast [1 x [2 x double]]* %y2 to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$a1$a2$double" to i64), 1 + %11 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 1 + store %variant %10, %variant* %11, align 16 + %12 = getelementptr inbounds %Foo, %Foo* %def, i32 0, i32 0 + %13 = bitcast i32* %12 to i8* + %14 = insertvalue %variant undef, i8* %13, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %16 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 2 + store %variant %15, %variant* %16, align 16 + %17 = getelementptr inbounds %Foo, %Foo* %def, i32 0, i32 1 + %18 = bitcast i32* %17 to i8* + %19 = insertvalue %variant undef, i8* %18, 0 + %20 = insertvalue %variant %19, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %21 = getelementptr inbounds [4 x %variant], [4 x %variant]* %varargslots, i64 0, i64 3 + store %variant %20, %variant* %21, align 16 + %22 = bitcast [4 x %variant]* %varargslots to %variant* + %23 = insertvalue %"variant[]" undef, %variant* %22, 0 + %24 = insertvalue %"variant[]" %23, i64 4, 1 + store %"variant[]" %24, %"variant[]"* %taddr, align 8 + %25 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 0 + %lo = load i8*, i8** %26, align 8 + %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 1 + %hi = load i64, i64* %27, align 8 + %28 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i32 0, i32 0), i64 14, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %28, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %29 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 0 + store i32 1, i32* %29, align 4 + %30 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 1 + store i32 2, i32* %30, align 4 + %31 = bitcast [2 x i32]* %literal to i64* + %32 = load i64, i64* %31, align 4 + %33 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 0 + store i32 3, i32* %33, align 4 + %34 = getelementptr inbounds [2 x i32], [2 x i32]* %literal1, i64 0, i64 1 + store i32 4, i32* %34, align 4 + %35 = bitcast [2 x i32]* %literal1 to i32* + %36 = insertvalue %"int[]" undef, i32* %35, 0 + %37 = insertvalue %"int[]" %36, i64 2, 1 + store %"int[]" %37, %"int[]"* %taddr2, align 8 + %38 = bitcast %"int[]"* %taddr2 to { i8*, i64 }* + %39 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %38, i32 0, i32 0 + %lo3 = load i8*, i8** %39, align 8 + %40 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %38, i32 0, i32 1 + %hi4 = load i64, i64* %40, align 8 + store <2 x i32> , <2 x i32>* %taddr5, align 8 + %41 = bitcast <2 x i32>* %taddr5 to double* + %42 = load double, double* %41, align 8 + call void @test_test(i64 %32, i8* %lo3, i64 %hi4, double %42) + %43 = getelementptr inbounds [2 x i32], [2 x i32]* %literal6, i64 0, i64 0 + store i32 2, i32* %43, align 4 + %44 = getelementptr inbounds [2 x i32], [2 x i32]* %literal6, i64 0, i64 1 + store i32 7, i32* %44, align 4 + %45 = bitcast [2 x i32]* %literal6 to i64* + %46 = load i64, i64* %45, align 4 + %47 = getelementptr inbounds [2 x i32], [2 x i32]* %literal7, i64 0, i64 0 + store i32 2, i32* %47, align 4 + %48 = getelementptr inbounds [2 x i32], [2 x i32]* %literal7, i64 0, i64 1 + store i32 7, i32* %48, align 4 + %49 = bitcast [2 x i32]* %literal7 to i32* + %50 = insertvalue %"int[]" undef, i32* %49, 0 + %51 = insertvalue %"int[]" %50, i64 2, 1 + store %"int[]" %51, %"int[]"* %taddr8, align 8 + %52 = bitcast %"int[]"* %taddr8 to { i8*, i64 }* + %53 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 0 + %lo9 = load i8*, i8** %53, align 8 + %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 1 + %hi10 = load i64, i64* %54, align 8 + store <2 x i32> , <2 x i32>* %taddr11, align 8 + %55 = bitcast <2 x i32>* %taddr11 to double* + %56 = load double, double* %55, align 8 + call void @test_test(i64 %46, i8* %lo9, i64 %hi10, double %56) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/compile_time_introspection/alignof.c3t b/test/test_suite14/compile_time_introspection/alignof.c3t similarity index 100% rename from test/test_suite2/compile_time_introspection/alignof.c3t rename to test/test_suite14/compile_time_introspection/alignof.c3t diff --git a/test/test_suite2/compile_time_introspection/defined.c3t b/test/test_suite14/compile_time_introspection/defined.c3t similarity index 62% rename from test/test_suite2/compile_time_introspection/defined.c3t rename to test/test_suite14/compile_time_introspection/defined.c3t index 8b3a5fe9e..ed7146453 100644 --- a/test/test_suite2/compile_time_introspection/defined.c3t +++ b/test/test_suite14/compile_time_introspection/defined.c3t @@ -59,39 +59,39 @@ fn void main() printf("%d\n", x); } -/* #expect: mymodule.ll +// #expect: mymodule.ll define void @mymodule_main() #0 { entry: %x = alloca i32, align 4 %y = alloca i32, align 4 %z = alloca i32, align 4 - store i32 0, ptr %x, align 4 - %0 = load i32, ptr %x, align 4 + store i32 0, i32* %x, align 4 + %0 = load i32, i32* %x, align 4 %add = add i32 %0, 1 - store i32 %add, ptr %x, align 4 - store i32 10, ptr %y, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %add, i32* %x, align 4 + store i32 10, i32* %y, align 4 + %1 = load i32, i32* %x, align 4 %add1 = add i32 %1, 1 - store i32 %add1, ptr %x, align 4 - %2 = load i32, ptr %x, align 4 + store i32 %add1, i32* %x, align 4 + %2 = load i32, i32* %x, align 4 %add2 = add i32 %2, 1 - store i32 %add2, ptr %x, align 4 - %3 = load i32, ptr %x, align 4 + store i32 %add2, i32* %x, align 4 + %3 = load i32, i32* %x, align 4 %add3 = add i32 %3, 1 - store i32 %add3, ptr %x, align 4 - %4 = load i32, ptr %x, align 4 + store i32 %add3, i32* %x, align 4 + %4 = load i32, i32* %x, align 4 %add4 = add i32 %4, 1 - store i32 %add4, ptr %x, align 4 - %5 = load i32, ptr %x, align 4 + store i32 %add4, i32* %x, align 4 + %5 = load i32, i32* %x, align 4 %add5 = add i32 %5, 1 - store i32 %add5, ptr %x, align 4 - %6 = load i32, ptr %x, align 4 + store i32 %add5, i32* %x, align 4 + %6 = load i32, i32* %x, align 4 %add6 = add i32 %6, 1 - store i32 %add6, ptr %x, align 4 - store i32 1, ptr %y, align 4 - store i32 7, ptr %z, align 4 - %7 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %7) + store i32 %add6, i32* %x, align 4 + store i32 1, i32* %y, align 4 + store i32 7, i32* %z, align 4 + %7 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %7) ret void } \ No newline at end of file diff --git a/test/test_suite2/compile_time_introspection/defined_builtin.c3t b/test/test_suite14/compile_time_introspection/defined_builtin.c3t similarity index 79% rename from test/test_suite2/compile_time_introspection/defined_builtin.c3t rename to test/test_suite14/compile_time_introspection/defined_builtin.c3t index 582b62f50..9acaede32 100644 --- a/test/test_suite2/compile_time_introspection/defined_builtin.c3t +++ b/test/test_suite14/compile_time_introspection/defined_builtin.c3t @@ -12,7 +12,7 @@ define void @foo_test() #0 { entry: %a = alloca i8, align 1 %b = alloca i8, align 1 - store i8 1, ptr %a, align 1 - store i8 0, ptr %b, align 1 + store i8 1, i8* %a, align 1 + store i8 0, i8* %b, align 1 ret void } \ No newline at end of file diff --git a/test/test_suite2/compile_time_introspection/defined_err.c3 b/test/test_suite14/compile_time_introspection/defined_err.c3 similarity index 100% rename from test/test_suite2/compile_time_introspection/defined_err.c3 rename to test/test_suite14/compile_time_introspection/defined_err.c3 diff --git a/test/test_suite2/compile_time_introspection/nameof.c3t b/test/test_suite14/compile_time_introspection/nameof.c3t similarity index 100% rename from test/test_suite2/compile_time_introspection/nameof.c3t rename to test/test_suite14/compile_time_introspection/nameof.c3t diff --git a/test/test_suite2/compile_time_introspection/nameof_err.c3 b/test/test_suite14/compile_time_introspection/nameof_err.c3 similarity index 100% rename from test/test_suite2/compile_time_introspection/nameof_err.c3 rename to test/test_suite14/compile_time_introspection/nameof_err.c3 diff --git a/test/test_suite2/compile_time_introspection/offsetof.c3t b/test/test_suite14/compile_time_introspection/offsetof.c3t similarity index 100% rename from test/test_suite2/compile_time_introspection/offsetof.c3t rename to test/test_suite14/compile_time_introspection/offsetof.c3t diff --git a/test/test_suite2/compile_time_introspection/qnameof.c3t b/test/test_suite14/compile_time_introspection/qnameof.c3t similarity index 55% rename from test/test_suite2/compile_time_introspection/qnameof.c3t rename to test/test_suite14/compile_time_introspection/qnameof.c3t index a091a1dcf..2cdb4fdc2 100644 --- a/test/test_suite2/compile_time_introspection/qnameof.c3t +++ b/test/test_suite14/compile_time_introspection/qnameof.c3t @@ -1,4 +1,3 @@ -// #target: macos-x64 module qnametest; extern fn int printf(char *, ...); @@ -20,10 +19,8 @@ fn void main() printf("Blob**[3]: %s\n", Blob**[3].nameof); } -/* #expect: qnametest.ll +// #expect: qnametest.ll -@"ct$qnametest_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@qnametest_x = local_unnamed_addr global i32 0, align 4 @.str = private unnamed_addr constant [12 x i8] c"printf: %s\0A\00", align 1 @.str.1 = private unnamed_addr constant [7 x i8] c"printf\00", align 1 @.str.2 = private unnamed_addr constant [13 x i8] c"printfq: %s\0A\00", align 1 @@ -43,18 +40,16 @@ fn void main() @.str.16 = private unnamed_addr constant [15 x i8] c"Blob**[3]: %s\0A\00", align 1 @.str.17 = private unnamed_addr constant [10 x i8] c"Blob**[3]\00", align 1 -define void @qnametest_main() #0 { -entry: +define void @qnametest_main() %help = alloca i32, align 4 - store i32 0, ptr %help, align 4 - %0 = call i32 (ptr, ...) @printf(ptr @.str, ptr @.str.1) - %1 = call i32 (ptr, ...) @printf(ptr @.str.2, ptr @.str.3) - %2 = call i32 (ptr, ...) @printf(ptr @.str.4, ptr @.str.5) - %3 = call i32 (ptr, ...) @printf(ptr @.str.6, ptr @.str.7) - %4 = call i32 (ptr, ...) @printf(ptr @.str.8, ptr @.str.9) - %5 = call i32 (ptr, ...) @printf(ptr @.str.10, ptr @.str.11) - %6 = call i32 (ptr, ...) @printf(ptr @.str.12, ptr @.str.13) - %7 = call i32 (ptr, ...) @printf(ptr @.str.14, ptr @.str.15) - %8 = call i32 (ptr, ...) @printf(ptr @.str.16, ptr @.str.17) + store i32 0, i32* %help, align 4 + %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), [6 x i8]* bitcast ([7 x i8]* @.str.1 to [6 x i8]*)) + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0), [17 x i8]* bitcast ([18 x i8]* @.str.3 to [17 x i8]*)) + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), [15 x i8]* bitcast ([16 x i8]* @.str.5 to [15 x i8]*)) + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), [4 x i8]* bitcast ([5 x i8]* @.str.7 to [4 x i8]*)) + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), [12 x i8]* bitcast ([13 x i8]* @.str.9 to [12 x i8]*)) + %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i32 0, i32 0), [1 x i8]* bitcast ([2 x i8]* @.str.11 to [1 x i8]*)) + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.12, i32 0, i32 0), [4 x i8]* bitcast ([5 x i8]* @.str.13 to [4 x i8]*)) + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.14, i32 0, i32 0), [15 x i8]* bitcast ([16 x i8]* @.str.15 to [15 x i8]*)) + %8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.16, i32 0, i32 0), [9 x i8]* bitcast ([10 x i8]* @.str.17 to [9 x i8]*)) ret void -} diff --git a/test/test_suite2/compile_time_introspection/sizeof.c3t b/test/test_suite14/compile_time_introspection/sizeof.c3t similarity index 98% rename from test/test_suite2/compile_time_introspection/sizeof.c3t rename to test/test_suite14/compile_time_introspection/sizeof.c3t index 531ab71eb..2a5bfb30c 100644 --- a/test/test_suite2/compile_time_introspection/sizeof.c3t +++ b/test/test_suite14/compile_time_introspection/sizeof.c3t @@ -1,6 +1,5 @@ module foo; import bar; -import bar::abc; long x = Baz.sizeof; short y = $evaltype("Baz").sizeof; diff --git a/test/test_suite2/compile_time_introspection/sizeof_errors.c3 b/test/test_suite14/compile_time_introspection/sizeof_errors.c3 similarity index 100% rename from test/test_suite2/compile_time_introspection/sizeof_errors.c3 rename to test/test_suite14/compile_time_introspection/sizeof_errors.c3 diff --git a/test/test_suite2/constants/byte_literal_fail_base64.c3 b/test/test_suite14/constants/byte_literal_fail_base64.c3 similarity index 100% rename from test/test_suite2/constants/byte_literal_fail_base64.c3 rename to test/test_suite14/constants/byte_literal_fail_base64.c3 diff --git a/test/test_suite2/constants/byte_literal_fail_base64_2.c3 b/test/test_suite14/constants/byte_literal_fail_base64_2.c3 similarity index 100% rename from test/test_suite2/constants/byte_literal_fail_base64_2.c3 rename to test/test_suite14/constants/byte_literal_fail_base64_2.c3 diff --git a/test/test_suite2/constants/byte_literal_fail_base64_4.c3 b/test/test_suite14/constants/byte_literal_fail_base64_4.c3 similarity index 100% rename from test/test_suite2/constants/byte_literal_fail_base64_4.c3 rename to test/test_suite14/constants/byte_literal_fail_base64_4.c3 diff --git a/test/test_suite2/constants/byte_literal_fail_hex.c3 b/test/test_suite14/constants/byte_literal_fail_hex.c3 similarity index 100% rename from test/test_suite2/constants/byte_literal_fail_hex.c3 rename to test/test_suite14/constants/byte_literal_fail_hex.c3 diff --git a/test/test_suite2/constants/byte_literals.c3t b/test/test_suite14/constants/byte_literals.c3t similarity index 100% rename from test/test_suite2/constants/byte_literals.c3t rename to test/test_suite14/constants/byte_literals.c3t diff --git a/test/test_suite2/constants/char_literals.c3t b/test/test_suite14/constants/char_literals.c3t similarity index 100% rename from test/test_suite2/constants/char_literals.c3t rename to test/test_suite14/constants/char_literals.c3t diff --git a/test/test_suite2/constants/const_var_copy.c3t b/test/test_suite14/constants/const_var_copy.c3t similarity index 74% rename from test/test_suite2/constants/const_var_copy.c3t rename to test/test_suite14/constants/const_var_copy.c3t index 045a7cf47..d2c1dcd8e 100644 --- a/test/test_suite2/constants/const_var_copy.c3t +++ b/test/test_suite14/constants/const_var_copy.c3t @@ -19,11 +19,11 @@ entry: %s = alloca i8, align 1 %zd = alloca i32, align 4 %sisiext = sext i32 %0 to i64 - %1 = getelementptr inbounds [100 x i8], ptr @foo_FOO, i64 0, i64 %sisiext - %2 = load i8, ptr %1, align 1 - store i8 %2, ptr %s, align 1 + %1 = getelementptr inbounds [100 x i8], [100 x i8]* bitcast ({ [50 x i8], i8, [49 x i8] }* @foo_FOO to [100 x i8]*), i64 0, i64 %sisiext + %2 = load i8, i8* %1, align 1 + store i8 %2, i8* %s, align 1 %sisiext1 = sext i32 %0 to i64 %3 = extractelement <4 x i32> , i64 %sisiext1 - store i32 %3, ptr %zd, align 4 + store i32 %3, i32* %zd, align 4 ret void } diff --git a/test/test_suite2/constants/constants.c3t b/test/test_suite14/constants/constants.c3t similarity index 75% rename from test/test_suite2/constants/constants.c3t rename to test/test_suite14/constants/constants.c3t index 9f4fdb99b..b91366f98 100644 --- a/test/test_suite2/constants/constants.c3t +++ b/test/test_suite14/constants/constants.c3t @@ -17,13 +17,12 @@ fn void test() uint* yy = &&FOO; } -/* #expect: constants.ll +// #expect: constants.ll @constants_AA = protected unnamed_addr constant i8 -1, align 1 @constants_BB = local_unnamed_addr constant i8 -56, align 1 @constants_CC = protected unnamed_addr constant i32 -1, align 4 @constants_DD = protected unnamed_addr constant i32 -1, align 4 -@constants_FOO = protected unnamed_addr constant i32 -1, align 4 @constants_x = protected unnamed_addr global i32 255, align 4 @constants_z = protected unnamed_addr global i32 -1, align 4 @constants_w = protected unnamed_addr global i8 -1, align 1 @@ -31,10 +30,10 @@ fn void test() @constants_z2 = protected unnamed_addr global i32 -1, align 4 entry: - %xx = alloca i32, align 4 - %yy = alloca ptr, align 8 - %taddr = alloca i32, align 4 - store i32 -1, ptr %xx, align 4 - store i32 -1, ptr %taddr, align 4 - store ptr %taddr, ptr %yy, align 8 - ret void \ No newline at end of file + %xx = alloca i32 + %yy = alloca i32* + %taddr = alloca i32 + store i32 -1, i32* %xx + store i32 -1, i32* %taddr + store i32* %taddr, i32** %yy + ret void \ No newline at end of file diff --git a/test/test_suite2/constants/float_type.c3t b/test/test_suite14/constants/float_type.c3t similarity index 100% rename from test/test_suite2/constants/float_type.c3t rename to test/test_suite14/constants/float_type.c3t diff --git a/test/test_suite2/constants/init_order.c3t b/test/test_suite14/constants/init_order.c3t similarity index 100% rename from test/test_suite2/constants/init_order.c3t rename to test/test_suite14/constants/init_order.c3t diff --git a/test/test_suite2/contracts/ct_eval_of_ensure.c3 b/test/test_suite14/contracts/ct_eval_of_ensure.c3 similarity index 100% rename from test/test_suite2/contracts/ct_eval_of_ensure.c3 rename to test/test_suite14/contracts/ct_eval_of_ensure.c3 diff --git a/test/test_suite2/contracts/in_out.c3 b/test/test_suite14/contracts/in_out.c3 similarity index 100% rename from test/test_suite2/contracts/in_out.c3 rename to test/test_suite14/contracts/in_out.c3 diff --git a/test/test_suite2/contracts/pure.c3 b/test/test_suite14/contracts/pure.c3 similarity index 100% rename from test/test_suite2/contracts/pure.c3 rename to test/test_suite14/contracts/pure.c3 diff --git a/test/test_suite2/contracts/pure_calls.c3 b/test/test_suite14/contracts/pure_calls.c3 similarity index 100% rename from test/test_suite2/contracts/pure_calls.c3 rename to test/test_suite14/contracts/pure_calls.c3 diff --git a/test/test_suite2/contracts/simple_test.c3t b/test/test_suite14/contracts/simple_test.c3t similarity index 65% rename from test/test_suite2/contracts/simple_test.c3t rename to test/test_suite14/contracts/simple_test.c3t index 1406ba202..3df7b7166 100644 --- a/test/test_suite2/contracts/simple_test.c3t +++ b/test/test_suite14/contracts/simple_test.c3t @@ -43,21 +43,19 @@ fn void main() /* #expect: simple_test.ll -define void @simple_test_test(ptr %0, i32 %1) #0 { +define void @simple_test_test(i32* %0, i32 %1) #0 { entry: %gt = icmp sgt i32 %1, 100 call void @llvm.assume(i1 %gt) - store i32 444, ptr %0, align 8 + store i32 444, i32* %0, align 8 ret void } -define i32 @simple_test_test2(ptr %0, i32 %1) #0 { +define i32 @simple_test_test2(i32* %0, i32 %1) #0 { entry: %gt = icmp sgt i32 %1, 100 call void @llvm.assume(i1 %gt) - store i32 444, ptr %0, align 8 - %lt = icmp slt i32 %1, 200 - call void @llvm.assume(i1 %lt) + store i32 444, i32* %0, align 8 ret i32 %1 } @@ -66,25 +64,23 @@ entry: %gt = icmp sgt i32 %0, 0 call void @llvm.assume(i1 %gt) %add = add i32 %0, 1 - %gt1 = icmp sgt i32 %add, 0 - call void @llvm.assume(i1 %gt1) ret i32 %add } define void @simple_test_main() #0 { entry: %fooofke = alloca i32, align 4 - store i32 0, ptr %fooofke, align 4 - call void @simple_test_test(ptr %fooofke, i32 330) - %0 = call i32 @simple_test_test2(ptr %fooofke, i32 150) + store i32 0, i32* %fooofke, align 4 + call void @simple_test_test(i32* %fooofke, i32 330) + %0 = call i32 @simple_test_test2(i32* %fooofke, i32 150) %1 = call i32 @simple_test_test3(i32 123) - %2 = load i32, ptr %fooofke, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %2) + %2 = load i32, i32* %fooofke, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %2) ret void } -define i32 @main(i32 %0, ptr %1) #0 { +define i32 @main(i32 %0, i8** %1) #0 { entry: call void @simple_test_main() ret i32 0 -} \ No newline at end of file +} diff --git a/test/test_suite2/debug_symbols/constants.c3t b/test/test_suite14/debug_symbols/constants.c3t similarity index 100% rename from test/test_suite2/debug_symbols/constants.c3t rename to test/test_suite14/debug_symbols/constants.c3t diff --git a/test/test_suite2/defer/defer_and_expr_block.c3t b/test/test_suite14/defer/defer_and_expr_block.c3t similarity index 51% rename from test/test_suite2/defer/defer_and_expr_block.c3t rename to test/test_suite14/defer/defer_and_expr_block.c3t index 5c8c9269b..1eca0d219 100644 --- a/test/test_suite2/defer/defer_and_expr_block.c3t +++ b/test/test_suite14/defer/defer_and_expr_block.c3t @@ -26,15 +26,15 @@ entry: br label %if.then if.then: ; preds = %entry - call void (ptr, ...) @printf(ptr @.str) - call void (ptr, ...) @printf(ptr @.str.1) - store i32 12, ptr %blockret, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0)) + store i32 12, i32* %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %if.then - call void (ptr, ...) @printf(ptr @.str.5) - call void (ptr, ...) @printf(ptr @.str.6) - call void (ptr, ...) @printf(ptr @.str.7) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.7, i32 0, i32 0)) ret void } diff --git a/test/test_suite2/defer/defer_single_stmt.c3 b/test/test_suite14/defer/defer_single_stmt.c3 similarity index 100% rename from test/test_suite2/defer/defer_single_stmt.c3 rename to test/test_suite14/defer/defer_single_stmt.c3 diff --git a/test/test_suite14/defer/defer_static_var.c3t b/test/test_suite14/defer/defer_static_var.c3t new file mode 100644 index 000000000..fb228b656 --- /dev/null +++ b/test/test_suite14/defer/defer_static_var.c3t @@ -0,0 +1,204 @@ +// #target: macos-x64 +module foo; +extern fn void printf(char*,...); + +fn int foo(int x) +{ + defer + { + static int y = 0; + y++; + printf("Here we go %d\n", y); + } + if (x > 0) return 2; + return x; +} + +macro void foo2(int x) +{ + printf("->%d\n", x); + for (int i = 0; i < 100; i++) + { + defer + { + static int y = 0; + y++; + printf(">%d--%d\n", i, y); + } + if (i == x) break; + printf("--"); + } +} + +fn void main() +{ + foo(1); + foo(2); + foo(-2); + foo2(0); + foo2(1); + foo2(2); +} + +/* #expect: foo.ll + +@"foo$y" = internal unnamed_addr global i32 0, align 4 +@"main$y" = internal unnamed_addr global i32 0, align 4 +@"main$y.7" = internal unnamed_addr global i32 0, align 4 +@"main$y.12" = internal unnamed_addr global i32 0, align 4 + +define i32 @foo_foo(i32 %0) #0 { +entry: + %gt = icmp sgt i32 %0, 0 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %entry + %1 = load i32, i32* @"foo$y", align 4 + %add = add i32 %1, 1 + store i32 %add, i32* @"foo$y", align 4 + %2 = load i32, i32* @"foo$y", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0), i32 %2) + ret i32 2 + +if.exit: ; preds = %entry + %3 = load i32, i32* @"foo$y", align 4 + %add1 = add i32 %3, 1 + store i32 %add1, i32* @"foo$y", align 4 + %4 = load i32, i32* @"foo$y", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0), i32 %4) + ret i32 %0 +} + +define void @foo_main() #0 { +entry: + %x = alloca i32, align 4 + %i = alloca i32, align 4 + %x3 = alloca i32, align 4 + %i4 = alloca i32, align 4 + %x15 = alloca i32, align 4 + %i16 = alloca i32, align 4 + %0 = call i32 @foo_foo(i32 1) + %1 = call i32 @foo_foo(i32 2) + %2 = call i32 @foo_foo(i32 -2) + store i32 0, i32* %x, align 4 + %3 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i32 %3) + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %if.exit, %entry + %4 = load i32, i32* %i, align 4 + %lt = icmp slt i32 %4, 100 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %5 = load i32, i32* %i, align 4 + %6 = load i32, i32* %x, align 4 + %eq = icmp eq i32 %5, %6 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %loop.body + %7 = load i32, i32* @"main$y", align 4 + %add = add i32 %7, 1 + store i32 %add, i32* @"main$y", align 4 + %8 = load i32, i32* %i, align 4 + %9 = load i32, i32* @"main$y", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %8, i32 %9) + br label %loop.exit + +if.exit: ; preds = %loop.body + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0)) + %10 = load i32, i32* @"main$y", align 4 + %add1 = add i32 %10, 1 + store i32 %add1, i32* @"main$y", align 4 + %11 = load i32, i32* %i, align 4 + %12 = load i32, i32* @"main$y", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.5, i32 0, i32 0), i32 %11, i32 %12) + %13 = load i32, i32* %i, align 4 + %add2 = add i32 %13, 1 + store i32 %add2, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %if.then, %loop.cond + store i32 1, i32* %x3, align 4 + %14 = load i32, i32* %x3, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i32 0, i32 0), i32 %14) + store i32 0, i32* %i4, align 4 + br label %loop.cond5 + +loop.cond5: ; preds = %if.exit11, %loop.exit + %15 = load i32, i32* %i4, align 4 + %lt6 = icmp slt i32 %15, 100 + br i1 %lt6, label %loop.body7, label %loop.exit14 + +loop.body7: ; preds = %loop.cond5 + %16 = load i32, i32* %i4, align 4 + %17 = load i32, i32* %x3, align 4 + %eq8 = icmp eq i32 %16, %17 + br i1 %eq8, label %if.then9, label %if.exit11 + +if.then9: ; preds = %loop.body7 + %18 = load i32, i32* @"main$y.7", align 4 + %add10 = add i32 %18, 1 + store i32 %add10, i32* @"main$y.7", align 4 + %19 = load i32, i32* %i4, align 4 + %20 = load i32, i32* @"main$y.7", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.8, i32 0, i32 0), i32 %19, i32 %20) + br label %loop.exit14 + +if.exit11: ; preds = %loop.body7 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) + %21 = load i32, i32* @"main$y.7", align 4 + %add12 = add i32 %21, 1 + store i32 %add12, i32* @"main$y.7", align 4 + %22 = load i32, i32* %i4, align 4 + %23 = load i32, i32* @"main$y.7", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.10, i32 0, i32 0), i32 %22, i32 %23) + %24 = load i32, i32* %i4, align 4 + %add13 = add i32 %24, 1 + store i32 %add13, i32* %i4, align 4 + br label %loop.cond5 + +loop.exit14: ; preds = %if.then9, %loop.cond5 + store i32 2, i32* %x15, align 4 + %25 = load i32, i32* %x15, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.11, i32 0, i32 0), i32 %25) + store i32 0, i32* %i16, align 4 + br label %loop.cond17 + +loop.cond17: ; preds = %if.exit23, %loop.exit14 + %26 = load i32, i32* %i16, align 4 + %lt18 = icmp slt i32 %26, 100 + br i1 %lt18, label %loop.body19, label %loop.exit26 + +loop.body19: ; preds = %loop.cond17 + %27 = load i32, i32* %i16, align 4 + %28 = load i32, i32* %x15, align 4 + %eq20 = icmp eq i32 %27, %28 + br i1 %eq20, label %if.then21, label %if.exit23 + +if.then21: ; preds = %loop.body19 + %29 = load i32, i32* @"main$y.12", align 4 + %add22 = add i32 %29, 1 + store i32 %add22, i32* @"main$y.12", align 4 + %30 = load i32, i32* %i16, align 4 + %31 = load i32, i32* @"main$y.12", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.13, i32 0, i32 0), i32 %30, i32 %31) + br label %loop.exit26 + +if.exit23: ; preds = %loop.body19 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.14, i32 0, i32 0)) + %32 = load i32, i32* @"main$y.12", align 4 + %add24 = add i32 %32, 1 + store i32 %add24, i32* @"main$y.12", align 4 + %33 = load i32, i32* %i16, align 4 + %34 = load i32, i32* @"main$y.12", align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i32 0, i32 0), i32 %33, i32 %34) + %35 = load i32, i32* %i16, align 4 + %add25 = add i32 %35, 1 + store i32 %add25, i32* %i16, align 4 + br label %loop.cond17 + +loop.exit26: ; preds = %if.then21, %loop.cond17 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/defer/defer_with_rethrow.c3 b/test/test_suite14/defer/defer_with_rethrow.c3 similarity index 100% rename from test/test_suite2/defer/defer_with_rethrow.c3 rename to test/test_suite14/defer/defer_with_rethrow.c3 diff --git a/test/test_suite2/defer/defer_with_return.c3 b/test/test_suite14/defer/defer_with_return.c3 similarity index 100% rename from test/test_suite2/defer/defer_with_return.c3 rename to test/test_suite14/defer/defer_with_return.c3 diff --git a/test/test_suite2/define/common.c3 b/test/test_suite14/define/common.c3 similarity index 100% rename from test/test_suite2/define/common.c3 rename to test/test_suite14/define/common.c3 diff --git a/test/test_suite2/define/define_name_errors.c3 b/test/test_suite14/define/define_name_errors.c3 similarity index 100% rename from test/test_suite2/define/define_name_errors.c3 rename to test/test_suite14/define/define_name_errors.c3 diff --git a/test/test_suite2/define/forbidden_defines.c3 b/test/test_suite14/define/forbidden_defines.c3 similarity index 100% rename from test/test_suite2/define/forbidden_defines.c3 rename to test/test_suite14/define/forbidden_defines.c3 diff --git a/test/test_suite2/define/test_at.c3 b/test/test_suite14/define/test_at.c3 similarity index 87% rename from test/test_suite2/define/test_at.c3 rename to test/test_suite14/define/test_at.c3 index a48b1bb20..30c060010 100644 --- a/test/test_suite2/define/test_at.c3 +++ b/test/test_suite14/define/test_at.c3 @@ -2,7 +2,7 @@ module foo; import std::io; macro @hello(Type thing) { - io::printfln("%d", $sizeof(thing)); + io::printfn("%d", $sizeof(thing)); } module bar; diff --git a/test/test_suite2/define/test_at_alias.c3 b/test/test_suite14/define/test_at_alias.c3 similarity index 82% rename from test/test_suite2/define/test_at_alias.c3 rename to test/test_suite14/define/test_at_alias.c3 index f453dc948..f10964a90 100644 --- a/test/test_suite2/define/test_at_alias.c3 +++ b/test/test_suite14/define/test_at_alias.c3 @@ -2,7 +2,7 @@ module foo; import std::io; macro @hello(Type thing) { - io::printfln("%d", $sizeof(thing)); + io::printfn("%d", $sizeof(thing)); } module bar; diff --git a/test/test_suite2/distinct/distinct_invalid.c3 b/test/test_suite14/distinct/distinct_invalid.c3 similarity index 95% rename from test/test_suite2/distinct/distinct_invalid.c3 rename to test/test_suite14/distinct/distinct_invalid.c3 index 433d00332..af271a330 100644 --- a/test/test_suite2/distinct/distinct_invalid.c3 +++ b/test/test_suite14/distinct/distinct_invalid.c3 @@ -1,7 +1,7 @@ fault Error {} -define Foo1 = distinct Error; // #error: You cannot create a distinct type +define Foo1 = distinct Error; // #error: You cannot create a distinct define Foo3 = distinct void; // #error: create a distinct type from 'void' diff --git a/test/test_suite2/distinct/distinct_slicing.c3 b/test/test_suite14/distinct/distinct_slicing.c3 similarity index 100% rename from test/test_suite2/distinct/distinct_slicing.c3 rename to test/test_suite14/distinct/distinct_slicing.c3 diff --git a/test/test_suite2/distinct/distinct_struct.c3 b/test/test_suite14/distinct/distinct_struct.c3 similarity index 100% rename from test/test_suite2/distinct/distinct_struct.c3 rename to test/test_suite14/distinct/distinct_struct.c3 diff --git a/test/test_suite2/distinct/distinct_struct_array.c3 b/test/test_suite14/distinct/distinct_struct_array.c3 similarity index 100% rename from test/test_suite2/distinct/distinct_struct_array.c3 rename to test/test_suite14/distinct/distinct_struct_array.c3 diff --git a/test/test_suite2/distinct/distinct_union.c3 b/test/test_suite14/distinct/distinct_union.c3 similarity index 100% rename from test/test_suite2/distinct/distinct_union.c3 rename to test/test_suite14/distinct/distinct_union.c3 diff --git a/test/test_suite/distinct/distinct_voidptr_null.c3t b/test/test_suite14/distinct/distinct_voidptr_null.c3t similarity index 100% rename from test/test_suite/distinct/distinct_voidptr_null.c3t rename to test/test_suite14/distinct/distinct_voidptr_null.c3t diff --git a/test/test_suite2/distinct/test_errors.c3 b/test/test_suite14/distinct/test_errors.c3 similarity index 100% rename from test/test_suite2/distinct/test_errors.c3 rename to test/test_suite14/distinct/test_errors.c3 diff --git a/test/test_suite2/distinct/test_ops_on_int.c3 b/test/test_suite14/distinct/test_ops_on_int.c3 similarity index 100% rename from test/test_suite2/distinct/test_ops_on_int.c3 rename to test/test_suite14/distinct/test_ops_on_int.c3 diff --git a/test/test_suite2/distinct/test_ops_on_struct.c3 b/test/test_suite14/distinct/test_ops_on_struct.c3 similarity index 100% rename from test/test_suite2/distinct/test_ops_on_struct.c3 rename to test/test_suite14/distinct/test_ops_on_struct.c3 diff --git a/test/test_suite2/enumerations/compile_time.c3t b/test/test_suite14/enumerations/compile_time.c3t similarity index 93% rename from test/test_suite2/enumerations/compile_time.c3t rename to test/test_suite14/enumerations/compile_time.c3t index 684f8ef3b..68c6f8db0 100644 --- a/test/test_suite2/enumerations/compile_time.c3t +++ b/test/test_suite14/enumerations/compile_time.c3t @@ -9,7 +9,7 @@ int myenum_elements = MyEnum.elements; int myenum_alignof = MyEnum.alignof; int myenum_sizeof = MyEnum.sizeof; -/* #expect: compile_time.ll +// #expect: compile_time.ll @compile_time_myenum_elements = local_unnamed_addr global i32 3, align 4 @compile_time_myenum_alignof = local_unnamed_addr global i32 2, align 4 diff --git a/test/test_suite14/enumerations/enum_associated_value.c3t b/test/test_suite14/enumerations/enum_associated_value.c3t new file mode 100644 index 000000000..fcf37b228 --- /dev/null +++ b/test/test_suite14/enumerations/enum_associated_value.c3t @@ -0,0 +1,54 @@ +// #target: macos-x64 +module test; +import libc; + +enum Foo : uint (int val, char* testme) +{ + A(123, "Number A"), + B(333, "Number B"), +} + +fn void main() +{ + int x = Foo.A.val; + Foo f = Foo.B; + Foo g = Foo.A; + libc::printf("%d (%s) %d (%s)\n", f.val, f.testme, g.val, g.testme); +} + +/* #expect: test.ll + +@.enum.0 = internal constant [2 x i8] c"A\00", align 1 +@.enum.1 = internal constant [2 x i8] c"B\00", align 1 +@"ct$uint" = linkonce constant %.introspect { i8 3, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$test_Foo" = linkonce constant { i8, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (%.introspect* @"ct$uint" to i64), i64 2, [2 x %"char[]"] [%"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.enum.0, i64 0, i64 0), i64 1 }, %"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.enum.1, i64 0, i64 0), i64 1 }] }, align 8 +@"test_Foo$val" = linkonce constant [2 x i32] [i32 123, i32 333], align 4 +@.str = private unnamed_addr constant [9 x i8] c"Number A\00", align 1 +@.str.1 = private unnamed_addr constant [9 x i8] c"Number B\00", align 1 +@"test_Foo$testme" = linkonce constant [2 x i8*] [i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)], align 8 +@.str.2 = private unnamed_addr constant [17 x i8] c"%d (%s) %d (%s)\0A\00", align 1 + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %x = alloca i32, align 4 + %f = alloca i32, align 4 + %g = alloca i32, align 4 + store i32 123, i32* %x, align 4 + store i32 1, i32* %f, align 4 + store i32 0, i32* %g, align 4 + %0 = load i32, i32* %f, align 4 + %1 = getelementptr inbounds [2 x i32], [2 x i32]* @"test_Foo$val", i32 0, i32 %0 + %2 = load i32, i32* %1, align 4 + %3 = load i32, i32* %f, align 4 + %4 = getelementptr inbounds [2 x i8*], [2 x i8*]* @"test_Foo$testme", i32 0, i32 %3 + %5 = load i8*, i8** %4, align 8 + %6 = load i32, i32* %g, align 4 + %7 = getelementptr inbounds [2 x i32], [2 x i32]* @"test_Foo$val", i32 0, i32 %6 + %8 = load i32, i32* %7, align 4 + %9 = load i32, i32* %g, align 4 + %10 = getelementptr inbounds [2 x i8*], [2 x i8*]* @"test_Foo$testme", i32 0, i32 %9 + %11 = load i8*, i8** %10, align 8 + %12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %2, i8* %5, i32 %8, i8* %11) + ret void +} diff --git a/test/test_suite2/enumerations/enum_cast.c3t b/test/test_suite14/enumerations/enum_cast.c3t similarity index 66% rename from test/test_suite2/enumerations/enum_cast.c3t rename to test/test_suite14/enumerations/enum_cast.c3t index 15ad4b8ee..43a9b3a48 100644 --- a/test/test_suite2/enumerations/enum_cast.c3t +++ b/test/test_suite14/enumerations/enum_cast.c3t @@ -40,13 +40,14 @@ entry: %ww = alloca i8, align 1 %x = alloca i8, align 1 %zz = alloca i8, align 1 - store i8 0, ptr %ww, align 1 - store i8 1, ptr %x, align 1 - %0 = load i8, ptr %x, align 1 - store i8 %0, ptr %zz, align 1 + store i8 0, i8* %ww, align 1 + store i8 1, i8* %x, align 1 + %0 = load i8, i8* %x, align 1 + store i8 %0, i8* %zz, align 1 ret void } +; Function Attrs: nounwind define void @test_test() #0 { entry: %b = alloca i8, align 1 @@ -60,35 +61,35 @@ entry: %xf.f = alloca i64, align 8 %e = alloca float, align 4 %e.f = alloca i64, align 8 - store i8 0, ptr %b, align 1 - store i32 1, ptr %z, align 4 - store i8 1, ptr %x, align 1 - %0 = load i8, ptr %x, align 1 - store i8 %0, ptr %b2, align 1 - %1 = load i8, ptr %x, align 1 + store i8 0, i8* %b, align 1 + store i32 1, i32* %z, align 4 + store i8 1, i8* %x, align 1 + %0 = load i8, i8* %x, align 1 + store i8 %0, i8* %b2, align 1 + %1 = load i8, i8* %x, align 1 %uisiext = zext i8 %1 to i32 - store i32 %uisiext, ptr %z2, align 4 - store float 0.000000e+00, ptr %d, align 4 - store i8 0, ptr %hello, align 1 - store i8 1, ptr %xf, align 1 - store i64 0, ptr %xf.f, align 8 - %2 = load i8, ptr %x, align 1 + store i32 %uisiext, i32* %z2, align 4 + store float 0.000000e+00, float* %d, align 4 + store i8 0, i8* %hello, align 1 + store i8 1, i8* %xf, align 1 + store i64 0, i64* %xf.f, align 8 + %2 = load i8, i8* %x, align 1 %uifp = uitofp i8 %2 to float - store float %uifp, ptr %e, align 4 - store i64 0, ptr %e.f, align 8 - %optval = load i64, ptr %xf.f, align 8 + store float %uifp, float* %e, align 4 + store i64 0, i64* %e.f, align 8 + %optval = load i64, i64* %xf.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, ptr %e.f, align 8 + store i64 %optval, i64* %e.f, align 8 br label %after_assign after_check: ; preds = %entry - %3 = load i8, ptr %xf, align 1 + %3 = load i8, i8* %xf, align 1 %uifp1 = uitofp i8 %3 to float - store float %uifp1, ptr %e, align 4 - store i64 0, ptr %e.f, align 8 + store float %uifp1, float* %e, align 4 + store i64 0, i64* %e.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional @@ -97,3 +98,5 @@ after_assign: ; preds = %after_check, %assig voiderr: ; preds = %after_assign ret void } + +attributes #0 = { nounwind } \ No newline at end of file diff --git a/test/test_suite2/enumerations/enum_invalid_param.c3 b/test/test_suite14/enumerations/enum_invalid_param.c3 similarity index 100% rename from test/test_suite2/enumerations/enum_invalid_param.c3 rename to test/test_suite14/enumerations/enum_invalid_param.c3 diff --git a/test/test_suite2/enumerations/enum_same_param.c3 b/test/test_suite14/enumerations/enum_same_param.c3 similarity index 100% rename from test/test_suite2/enumerations/enum_same_param.c3 rename to test/test_suite14/enumerations/enum_same_param.c3 diff --git a/test/test_suite14/enumerations/enum_values.c3t b/test/test_suite14/enumerations/enum_values.c3t new file mode 100644 index 000000000..9a06a62c3 --- /dev/null +++ b/test/test_suite14/enumerations/enum_values.c3t @@ -0,0 +1,40 @@ +// #target: macos-x64 + +module test; + +enum Foo +{ + ABC, + BCD +} + +Foo zfok = Foo.values[0]; +Foo[] zw = &&Foo.values; + +fn void test(int x) +{ + Foo zonk = Foo.values[x]; +} + +/* #expect: test.ll + +%"Foo[]" = type { i32*, i64 } + +@test_zfok = local_unnamed_addr global i32 0, align 4 +@.taddr = private global [2 x i32] [i32 0, i32 1], align 4 +@test_zw = local_unnamed_addr global %"Foo[]" { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr, i32 0, i32 0), i64 2 }, align 8 + +define void @test_test(i32 %0) #0 { +entry: + %zonk = alloca i32, align 4 + %literal = alloca [2 x i32], align 4 + %1 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 0 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 1 + store i32 1, i32* %2, align 4 + %sisiext = sext i32 %0 to i64 + %3 = getelementptr inbounds [2 x i32], [2 x i32]* %literal, i64 0, i64 %sisiext + %4 = load i32, i32* %3, align 4 + store i32 %4, i32* %zonk, align 4 + ret void +} diff --git a/test/test_suite2/enumerations/simple_inference.c3t b/test/test_suite14/enumerations/simple_inference.c3t similarity index 80% rename from test/test_suite2/enumerations/simple_inference.c3t rename to test/test_suite14/enumerations/simple_inference.c3t index d2e93de8c..54ae20f1c 100644 --- a/test/test_suite2/enumerations/simple_inference.c3t +++ b/test/test_suite14/enumerations/simple_inference.c3t @@ -17,7 +17,7 @@ fn void test() define void @simple_inference_test() #0 { entry: %h = alloca i32, align 4 - store i32 1, ptr %h, align 4 - store i32 2, ptr %h, align 4 + store i32 1, i32* %h, align 4 + store i32 2, i32* %h, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite2/errors/anyerr_void.c3t b/test/test_suite14/errors/anyerr_void.c3t similarity index 61% rename from test/test_suite2/errors/anyerr_void.c3t rename to test/test_suite14/errors/anyerr_void.c3t index bb931feec..a46b30952 100644 --- a/test/test_suite2/errors/anyerr_void.c3t +++ b/test/test_suite14/errors/anyerr_void.c3t @@ -28,10 +28,9 @@ fn void main() define i64 @anyerr_void_errorThing() #0 { entry: - ret i64 ptrtoint (ptr @"anyerr_void_MyError$BAR" to i64) + ret i64 ptrtoint (%.fault* @"anyerr_void_MyError$BAR" to i64) } -; Function Attrs: nounwind define i64 @anyerr_void_errorThing2() #0 { entry: %reterr = alloca i64, align 8 @@ -39,7 +38,7 @@ entry: } ; Function Attrs: nounwind -declare void @printf(ptr, ...) #0 +declare void @printf(i8*, ...) #0 ; Function Attrs: nounwind define void @anyerr_void_main() #0 { @@ -47,41 +46,41 @@ entry: %z = alloca i64, align 8 %error_var = alloca i64, align 8 %error_var1 = alloca i64, align 8 - store i64 0, ptr %error_var, align 8 + store i64 0, i64* %error_var, align 8 %0 = call i64 @anyerr_void_errorThing() %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, ptr %error_var, align 8 + store i64 %0, i64* %error_var, align 8 br label %noerr_block after_check: ; preds = %entry br label %noerr_block noerr_block: ; preds = %after_check, %assign_optional - %1 = load i64, ptr %error_var, align 8 - store i64 %1, ptr %z, align 8 - %2 = load i64, ptr %z, align 8 - call void (ptr, ...) @printf(ptr @.str, i64 %2) - call void (ptr, ...) @printf(ptr @.str.2, i64 ptrtoint (ptr @"anyerr_void_MyError$BAR" to i64)) - call void (ptr, ...) @printf(ptr @.str.3, i64 ptrtoint (ptr @"anyerr_void_MyError$FOO" to i64)) - store i64 0, ptr %error_var1, align 8 + %1 = load i64, i64* %error_var, align 8 + store i64 %1, i64* %z, align 8 + %2 = load i64, i64* %z, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), i64 %2) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), i64 ptrtoint (%.fault* @"anyerr_void_MyError$BAR" to i64)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i64 ptrtoint (%.fault* @"anyerr_void_MyError$FOO" to i64)) + store i64 0, i64* %error_var1, align 8 %3 = call i64 @anyerr_void_errorThing2() %not_err2 = icmp eq i64 %3, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %noerr_block - store i64 %3, ptr %error_var1, align 8 + store i64 %3, i64* %error_var1, align 8 br label %noerr_block5 after_check4: ; preds = %noerr_block br label %noerr_block5 noerr_block5: ; preds = %after_check4, %assign_optional3 - %4 = load i64, ptr %error_var1, align 8 - store i64 %4, ptr %z, align 8 - %5 = load i64, ptr %z, align 8 - call void (ptr, ...) @printf(ptr @.str.4, i64 %5) + %4 = load i64, i64* %error_var1, align 8 + store i64 %4, i64* %z, align 8 + %5 = load i64, i64* %z, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), i64 %5) ret void } \ No newline at end of file diff --git a/test/test_suite2/errors/bitshift_failable.c3 b/test/test_suite14/errors/bitshift_failable.c3 similarity index 100% rename from test/test_suite2/errors/bitshift_failable.c3 rename to test/test_suite14/errors/bitshift_failable.c3 diff --git a/test/test_suite2/errors/else_checks.c3t b/test/test_suite14/errors/else_checks.c3t similarity index 81% rename from test/test_suite2/errors/else_checks.c3t rename to test/test_suite14/errors/else_checks.c3t index 7984188c4..3d7538f91 100644 --- a/test/test_suite2/errors/else_checks.c3t +++ b/test/test_suite14/errors/else_checks.c3t @@ -14,7 +14,7 @@ fn void test() /* #expect: else_checks.ll ; Function Attrs: nounwind -declare i64 @testError(ptr) #0 +declare i64 @testError(i32*) #0 ; Function Attrs: nounwind define void @else_checks_test() #0 { @@ -29,18 +29,18 @@ entry: %w = alloca double, align 8 %retparam18 = alloca i32, align 4 %retparam21 = alloca i32, align 4 - %0 = call i64 @testError(ptr %retparam) + %0 = call i64 @testError(i32* %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %else_block after_check: ; preds = %entry - %1 = load i32, ptr %retparam, align 4 - %2 = call i64 @testError(ptr %retparam1) + %1 = load i32, i32* %retparam, align 4 + %2 = call i64 @testError(i32* %retparam1) %not_err2 = icmp eq i64 %2, 0 br i1 %not_err2, label %after_check3, label %else_block after_check3: ; preds = %after_check - %3 = load i32, ptr %retparam1, align 4 + %3 = load i32, i32* %retparam1, align 4 %add = add i32 %1, %3 br label %phi_block @@ -50,13 +50,13 @@ else_block: ; preds = %after_check, %entry phi_block: ; preds = %else_block, %after_check3 %val = phi i32 [ %add, %after_check3 ], [ 100, %else_block ] %sifp = sitofp i32 %val to double - store double %sifp, ptr %x, align 8 - %4 = call i64 @testError(ptr %retparam4) + store double %sifp, double* %x, align 8 + %4 = call i64 @testError(i32* %retparam4) %not_err5 = icmp eq i64 %4, 0 br i1 %not_err5, label %after_check6, label %else_block7 after_check6: ; preds = %phi_block - %5 = load i32, ptr %retparam4, align 4 + %5 = load i32, i32* %retparam4, align 4 %shl = shl i32 1, %5 %6 = freeze i32 %shl br label %phi_block8 @@ -67,13 +67,13 @@ else_block7: ; preds = %phi_block phi_block8: ; preds = %else_block7, %after_check6 %val9 = phi i32 [ %6, %after_check6 ], [ 100, %else_block7 ] %sifp10 = sitofp i32 %val9 to double - store double %sifp10, ptr %y, align 8 - %7 = call i64 @testError(ptr %retparam11) + store double %sifp10, double* %y, align 8 + %7 = call i64 @testError(i32* %retparam11) %not_err12 = icmp eq i64 %7, 0 br i1 %not_err12, label %after_check13, label %else_block14 after_check13: ; preds = %phi_block8 - %8 = load i32, ptr %retparam11, align 4 + %8 = load i32, i32* %retparam11, align 4 %ashr = ashr i32 %8, 1 %9 = freeze i32 %ashr br label %phi_block15 @@ -84,19 +84,19 @@ else_block14: ; preds = %phi_block8 phi_block15: ; preds = %else_block14, %after_check13 %val16 = phi i32 [ %9, %after_check13 ], [ 100, %else_block14 ] %sifp17 = sitofp i32 %val16 to double - store double %sifp17, ptr %z, align 8 - %10 = call i64 @testError(ptr %retparam18) + store double %sifp17, double* %z, align 8 + %10 = call i64 @testError(i32* %retparam18) %not_err19 = icmp eq i64 %10, 0 br i1 %not_err19, label %after_check20, label %else_block24 after_check20: ; preds = %phi_block15 - %11 = load i32, ptr %retparam18, align 4 - %12 = call i64 @testError(ptr %retparam21) + %11 = load i32, i32* %retparam18, align 4 + %12 = call i64 @testError(i32* %retparam21) %not_err22 = icmp eq i64 %12, 0 br i1 %not_err22, label %after_check23, label %else_block24 after_check23: ; preds = %after_check20 - %13 = load i32, ptr %retparam21, align 4 + %13 = load i32, i32* %retparam21, align 4 %mul = mul i32 %11, %13 br label %phi_block25 @@ -106,6 +106,7 @@ else_block24: ; preds = %after_check20, %phi phi_block25: ; preds = %else_block24, %after_check23 %val26 = phi i32 [ %mul, %after_check23 ], [ 100, %else_block24 ] %sifp27 = sitofp i32 %val26 to double - store double %sifp27, ptr %w, align 8 + store double %sifp27, double* %w, align 8 ret void } + diff --git a/test/test_suite2/errors/error_decl_ok.c3 b/test/test_suite14/errors/error_decl_ok.c3 similarity index 100% rename from test/test_suite2/errors/error_decl_ok.c3 rename to test/test_suite14/errors/error_decl_ok.c3 diff --git a/test/test_suite2/errors/error_else.c3t b/test/test_suite14/errors/error_else.c3t similarity index 100% rename from test/test_suite2/errors/error_else.c3t rename to test/test_suite14/errors/error_else.c3t diff --git a/test/test_suite14/errors/error_introspect.c3t b/test/test_suite14/errors/error_introspect.c3t new file mode 100644 index 000000000..45ece3b94 --- /dev/null +++ b/test/test_suite14/errors/error_introspect.c3t @@ -0,0 +1,130 @@ +// #target: macos-x64 +module foo; +import std::io; + +fault Foo +{ + BAR, + BAZ +} + +fn void main() +{ + char[][] x = Foo.names; + io::printfn("Foo.names: %s", x); + io::printfn("Foo.values: %s", Foo.values); + io::printfn("Foo.elements: %s", Foo.elements); +} + +/* #expect: foo.ll + +@"foo_Foo$BAR" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$foo_Foo" to i64), %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.fault, i64 0, i64 0), i64 3 } }, align 8 +@.fault = internal constant [4 x i8] c"BAR\00", align 1 +@"foo_Foo$BAZ" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$foo_Foo" to i64), %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.fault.1, i64 0, i64 0), i64 3 } }, align 8 +@.fault.1 = internal constant [4 x i8] c"BAZ\00", align 1 +@"ct$foo_Foo" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [4 x i8] c"BAR\00", align 1 +@.str.2 = private unnamed_addr constant [4 x i8] c"BAZ\00", align 1 +@.str.3 = private unnamed_addr constant [14 x i8] c"Foo.names: %s\00", align 1 +@"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$sa$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (%.introspect* @"ct$sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@.str.4 = private unnamed_addr constant [15 x i8] c"Foo.values: %s\00", align 1 +@"ct$a2$foo_Foo" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (%.introspect* @"ct$foo_Foo" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 +@.str.5 = private unnamed_addr constant [17 x i8] c"Foo.elements: %s\00", align 1 +@"ct$long" = linkonce constant %.introspect { i8 2, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + + %x = alloca %"char[][]", align 8 + %literal = alloca [2 x %"char[]"], align 16 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %literal3 = alloca [2 x i64], align 16 + %taddr4 = alloca %"variant[]", align 8 + %retparam10 = alloca i64, align 8 + %varargslots11 = alloca [1 x %variant], align 16 + %taddr12 = alloca i64, align 8 + %taddr13 = alloca %"variant[]", align 8 + %0 = getelementptr inbounds [2 x %"char[]"], [2 x %"char[]"]* %literal, i64 0, i64 0 + store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 3 }, %"char[]"* %0, align 8 + %1 = getelementptr inbounds [2 x %"char[]"], [2 x %"char[]"]* %literal, i64 0, i64 1 + store %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i64 3 }, %"char[]"* %1, align 8 + %2 = bitcast [2 x %"char[]"]* %literal to %"char[]"* + %3 = insertvalue %"char[][]" undef, %"char[]"* %2, 0 + %4 = insertvalue %"char[][]" %3, i64 2, 1 + store %"char[][]" %4, %"char[][]"* %x, align 8 + %5 = bitcast %"char[][]"* %x to i8* + %6 = insertvalue %variant undef, i8* %5, 0 + %7 = insertvalue %variant %6, i64 ptrtoint (%.introspect* @"ct$sa$sa$char" 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 = bitcast [1 x %variant]* %varargslots to %variant* + %10 = insertvalue %"variant[]" undef, %variant* %9, 0 + %11 = insertvalue %"variant[]" %10, i64 1, 1 + store %"variant[]" %11, %"variant[]"* %taddr, align 8 + %12 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 0 + %lo = load i8*, i8** %13, align 8 + %14 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %12, i32 0, i32 1 + %hi = load i64, i64* %14, align 8 + %15 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %15, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %16 = getelementptr inbounds [2 x i64], [2 x i64]* %literal3, i64 0, i64 0 + store i64 ptrtoint (%.fault* @"foo_Foo$BAR" to i64), i64* %16, align 8 + %17 = getelementptr inbounds [2 x i64], [2 x i64]* %literal3, i64 0, i64 1 + store i64 ptrtoint (%.fault* @"foo_Foo$BAZ" to i64), i64* %17, align 8 + %18 = bitcast [2 x i64]* %literal3 to i8* + %19 = insertvalue %variant undef, i8* %18, 0 + %20 = insertvalue %variant %19, i64 ptrtoint (%.introspect* @"ct$a2$foo_Foo" to i64), 1 + %21 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots2, i64 0, i64 0 + store %variant %20, %variant* %21, align 16 + %22 = bitcast [1 x %variant]* %varargslots2 to %variant* + %23 = insertvalue %"variant[]" undef, %variant* %22, 0 + %24 = insertvalue %"variant[]" %23, i64 1, 1 + store %"variant[]" %24, %"variant[]"* %taddr4, align 8 + %25 = bitcast %"variant[]"* %taddr4 to { i8*, i64 }* + %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 0 + %lo5 = load i8*, i8** %26, align 8 + %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 1 + %hi6 = load i64, i64* %27, align 8 + %28 = call i64 @std_io_printfn(i64* %retparam1, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i32 0, i32 0), i64 14, i8* %lo5, i64 %hi6) + %not_err7 = icmp eq i64 %28, 0 + br i1 %not_err7, label %after_check8, label %voiderr9 + +after_check8: ; preds = %voiderr + br label %voiderr9 + +voiderr9: ; preds = %after_check8, %voiderr + store i64 2, i64* %taddr12, align 8 + %29 = bitcast i64* %taddr12 to i8* + %30 = insertvalue %variant undef, i8* %29, 0 + %31 = insertvalue %variant %30, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 + %32 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots11, i64 0, i64 0 + store %variant %31, %variant* %32, align 16 + %33 = bitcast [1 x %variant]* %varargslots11 to %variant* + %34 = insertvalue %"variant[]" undef, %variant* %33, 0 + %35 = insertvalue %"variant[]" %34, i64 1, 1 + store %"variant[]" %35, %"variant[]"* %taddr13, align 8 + %36 = bitcast %"variant[]"* %taddr13 to { i8*, i64 }* + %37 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %36, i32 0, i32 0 + %lo14 = load i8*, i8** %37, align 8 + %38 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %36, i32 0, i32 1 + %hi15 = load i64, i64* %38, align 8 + %39 = call i64 @std_io_printfn(i64* %retparam10, i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i64 16, i8* %lo14, i64 %hi15) + %not_err16 = icmp eq i64 %39, 0 + br i1 %not_err16, label %after_check17, label %voiderr18 + +after_check17: ; preds = %voiderr9 + br label %voiderr18 + +voiderr18: ; preds = %after_check17, %voiderr9 + ret void +} diff --git a/test/test_suite14/errors/error_regression_2.c3t b/test/test_suite14/errors/error_regression_2.c3t new file mode 100644 index 000000000..3fd6c10a5 --- /dev/null +++ b/test/test_suite14/errors/error_regression_2.c3t @@ -0,0 +1,917 @@ +// #target: macos-x64 +module test; +import std; +import libc; + +struct Doc { Head *head; } +struct Head { char[]* title; } + +struct Summary +{ + char[]* title; + bool ok; +} + +fn void Summary.print(Summary *s, CFile out) +{ + // We don't have a native printf in C3 yet, so use libc, + // which is not all that nice for the strings but... + char[] title = s.title ? *s.title : "missing"; + libc::fprintf(out, "Summary({ .title = %.*s, .ok = %s})", (int)title.len, title.ptr, s.ok ? (char*)"true" : (char*)"false"); +} + +fn bool contains(char[] haystack, char[] needle) +{ + usz len = haystack.len; + usz needle_len = needle.len; + if (len < needle_len) return false; + if (!needle_len) return true; + len -= needle_len - 1; + for (usz i = 0; i < len; i++) + { + if (libc::memcmp(&haystack[i], needle.ptr, needle_len) == 0) + { + return true; + } + } + return false; +} + +macro dupe(value) +{ + $typeof(&value) temp = malloc($sizeof(value)); + if (!temp) return ReadError.OUT_OF_MEMORY!; + *temp = value; + return temp; +} + +fault ReadError +{ + BAD_READ, + OUT_OF_MEMORY +} + +fn Doc! readDoc(char[] url) +{ + if (contains(url, "fail")) return ReadError.BAD_READ!; + if (contains(url, "head-missing")) return { .head = null }; + if (contains(url, "title-missing")) return { dupe(Head { .title = null })? }; + if (contains(url, "title-empty")) return { dupe(Head { .title = dupe((char[])"")? })? }; + // Not particularly elegant due to missing string functions. + int len = libc::snprintf(null, 0, "Title of %.*s", (int)url.len, url.ptr); + char* str = malloc(len + 1); + if (!str) return ReadError.OUT_OF_MEMORY!; + libc::snprintf(str, len + 1, "Title of %.*s", (int)url.len, url.ptr); + return { dupe(Head { .title = dupe(str[..len - 1])? })? }; +} + +fn Summary buildSummary(Doc doc) +{ + return Summary { + .title = doc.head ? doc.head.title : null, + .ok = true, + }; +} + +fn Summary readAndBuildSummary(char[] url) +{ + return buildSummary(readDoc(url)) ?? Summary { .title = null, .ok = false }; + /* + // or + Summary summary = buildSummary(readDoc(url)); + if (catch summary) return Summary { .title = null, .ok = false }; + return summary; + // or + Summary summary = buildSummary(readDoc(url)); + if (try summary) return summary; + return Summary { .title = null, .ok = false }; + */ +} + + +fault TitleResult +{ + TITLE_MISSING +} + +fn bool! isTitleNonEmpty(Doc doc) +{ + if (!doc.head) return TitleResult.TITLE_MISSING!; + char[]* head = doc.head.title; + if (!head) return TitleResult.TITLE_MISSING!; + return (*head).len > 0; +} + + +fn bool! readWhetherTitleNonEmpty(char[] url) +{ + return isTitleNonEmpty(readDoc(url)); +} + +fn char* bool_to_string(bool b) +{ + return b ? "true" : "false"; +} +fn char* nameFromError(anyerr e) +{ + switch (e) + { + case TitleResult.TITLE_MISSING: + return "no title"; + case ReadError.BAD_READ: + return "bad read"; + case ReadError.OUT_OF_MEMORY: + return "out of memory"; + default: + return "unknown error"; + } +} + + +fn void main() +{ + const char[][] URLS = { "good", "title-empty", "title-missing", "head-missing", "fail" }; + foreach (char[] url : URLS) + { + // Yes, it's pretty onerous to print strings for the moment in C3 + libc::printf(`Checking "https://%.*s/":` "\n", (int)url.len, url.ptr); + Summary summary = readAndBuildSummary(url); + libc::printf(" Summary: "); + summary.print(libc::stdout()); + libc::printf("\n"); + char[] title_sure = summary.title ? *summary.title : ""; + libc::printf(" Title: %.*s\n", (int)title_sure.len, title_sure.ptr); + bool! has_title = readWhetherTitleNonEmpty(url); + // This looks a bit less than elegant, but as you see it's mostly due to having to + // use printf here. + libc::printf(" Has title: %s vs %s\n", bool_to_string(has_title) ?? nameFromError(catch(has_title)), (has_title ?? false) ? (char*)"true" : (char*)"false"); + } +} + +/* #expect: test.ll + +define void @test_Summary_print(%Summary* %0, i8* %1) #0 { +entry: + %title = alloca %"char[]", align 8 + %2 = getelementptr inbounds %Summary, %Summary* %0, i32 0, i32 0 + %3 = load %"char[]"*, %"char[]"** %2, align 8 + %ptrbool = icmp ne %"char[]"* %3, null + br i1 %ptrbool, label %cond.lhs, label %cond.rhs + +cond.lhs: ; preds = %entry + %4 = getelementptr inbounds %Summary, %Summary* %0, i32 0, i32 0 + %5 = load %"char[]"*, %"char[]"** %4, align 8 + %6 = load %"char[]", %"char[]"* %5, align 8 + br label %cond.phi + +cond.rhs: ; preds = %entry + br label %cond.phi + +cond.phi: ; preds = %cond.rhs, %cond.lhs + %val = phi %"char[]" [ %6, %cond.lhs ], [ { i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.28, i32 0, i32 0), i64 7 }, %cond.rhs ] + store %"char[]" %val, %"char[]"* %title, align 8 + %7 = getelementptr inbounds %"char[]", %"char[]"* %title, i32 0, i32 1 + %8 = load i64, i64* %7, align 8 + %uisitrunc = trunc i64 %8 to i32 + %9 = getelementptr inbounds %"char[]", %"char[]"* %title, i32 0, i32 0 + %10 = load i8*, i8** %9, align 8 + %11 = getelementptr inbounds %Summary, %Summary* %0, i32 0, i32 1 + %12 = load i8, i8* %11, align 8 + %13 = trunc i8 %12 to i1 + %ternary = select i1 %13, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.30, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.31, i32 0, i32 0) + %14 = call i32 (i8*, i8*, ...) @fprintf(i8* %1, i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.29, i32 0, i32 0), i32 %uisitrunc, i8* %10, i8* %ternary) + ret void +} + +; Function Attrs: nounwind +define zeroext i8 @test_contains(i8* %0, i64 %1, i8* %2, i64 %3) #0 { +entry: + %haystack = alloca %"char[]", align 8 + %needle = alloca %"char[]", align 8 + %len = alloca i64, align 8 + %needle_len = alloca i64, align 8 + %i = alloca i64, align 8 + %pair = bitcast %"char[]"* %haystack to { i8*, i64 }* + %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %4, align 8 + %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %5, align 8 + %pair1 = bitcast %"char[]"* %needle to { i8*, i64 }* + %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 0 + store i8* %2, i8** %6, align 8 + %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 1 + store i64 %3, i64* %7, align 8 + %8 = getelementptr inbounds %"char[]", %"char[]"* %haystack, i32 0, i32 1 + %9 = load i64, i64* %8, align 8 + store i64 %9, i64* %len, align 8 + %10 = getelementptr inbounds %"char[]", %"char[]"* %needle, i32 0, i32 1 + %11 = load i64, i64* %10, align 8 + store i64 %11, i64* %needle_len, align 8 + %12 = load i64, i64* %len, align 8 + %13 = load i64, i64* %needle_len, align 8 + %lt = icmp ult i64 %12, %13 + br i1 %lt, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i8 0 + +if.exit: ; preds = %entry + %14 = load i64, i64* %needle_len, align 8 + %not = icmp eq i64 %14, 0 + br i1 %not, label %if.then2, label %if.exit3 + +if.then2: ; preds = %if.exit + ret i8 1 + +if.exit3: ; preds = %if.exit + %15 = load i64, i64* %len, align 8 + %16 = load i64, i64* %needle_len, align 8 + %sub = sub i64 %16, 1 + %sub4 = sub i64 %15, %sub + store i64 %sub4, i64* %len, align 8 + store i64 0, i64* %i, align 8 + br label %loop.cond + +loop.cond: ; preds = %if.exit7, %if.exit3 + %17 = load i64, i64* %i, align 8 + %18 = load i64, i64* %len, align 8 + %lt5 = icmp ult i64 %17, %18 + br i1 %lt5, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %19 = getelementptr inbounds %"char[]", %"char[]"* %haystack, i32 0, i32 0 + %20 = load i8*, i8** %19, align 8 + %21 = load i64, i64* %i, align 8 + %ptroffset = getelementptr inbounds i8, i8* %20, i64 %21 + %22 = getelementptr inbounds %"char[]", %"char[]"* %needle, i32 0, i32 0 + %23 = load i8*, i8** %22, align 8 + %24 = load i64, i64* %needle_len, align 8 + %25 = call i32 @memcmp(i8* %ptroffset, i8* %23, i64 %24) + %eq = icmp eq i32 %25, 0 + br i1 %eq, label %if.then6, label %if.exit7 + +if.then6: ; preds = %loop.body + ret i8 1 + +if.exit7: ; preds = %loop.body + %26 = load i64, i64* %i, align 8 + %add = add i64 %26, 1 + store i64 %add, i64* %i, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + ret i8 0 +} + +; Function Attrs: nounwind +define i64 @test_readDoc(%Doc* %0, i8* %1, i64 %2) #0 { +entry: + %url = alloca %"char[]", align 8 + %reterr = alloca i64, align 8 + %literal = alloca %Doc, align 8 + %reterr8 = alloca i64, align 8 + %literal9 = alloca %Doc, align 8 + %error_var = alloca i64, align 8 + %value = alloca %Head, align 8 + %literal10 = alloca %Head, align 8 + %temp = alloca %Head*, align 8 + %reterr17 = alloca i64, align 8 + %literal18 = alloca %Doc, align 8 + %error_var19 = alloca i64, align 8 + %value20 = alloca %Head, align 8 + %literal21 = alloca %Head, align 8 + %error_var22 = alloca i64, align 8 + %value23 = alloca %"char[]", align 8 + %temp24 = alloca %"char[]"*, align 8 + %temp31 = alloca %Head*, align 8 + %len = alloca i32, align 4 + %str = alloca i8*, align 8 + %reterr45 = alloca i64, align 8 + %literal46 = alloca %Doc, align 8 + %error_var47 = alloca i64, align 8 + %value48 = alloca %Head, align 8 + %literal49 = alloca %Head, align 8 + %error_var50 = alloca i64, align 8 + %value51 = alloca %"char[]", align 8 + %temp52 = alloca %"char[]"*, align 8 + %temp59 = alloca %Head*, align 8 + %pair = bitcast %"char[]"* %url to { i8*, i64 }* + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %1, i8** %3, align 8 + %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %2, i64* %4, align 8 + %5 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo = load i8*, i8** %5, align 8 + %6 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi = load i64, i64* %6, align 8 + %7 = call i8 @test_contains(i8* %lo, i64 %hi, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 4) + %8 = trunc i8 %7 to i1 + br i1 %8, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i64 ptrtoint (%.fault* @"test_ReadError$BAD_READ" to i64) + +if.exit: ; preds = %entry + %9 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo1 = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi2 = load i64, i64* %10, align 8 + %11 = call i8 @test_contains(i8* %lo1, i64 %hi2, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i32 0, i32 0), i64 12) + %12 = trunc i8 %11 to i1 + br i1 %12, label %if.then3, label %if.exit4 + +if.then3: ; preds = %if.exit + %13 = getelementptr inbounds %Doc, %Doc* %literal, i32 0, i32 0 + store %Head* null, %Head** %13, align 8 + %14 = bitcast %Doc* %0 to i8* + %15 = bitcast %Doc* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %14, i8* align 8 %15, i32 8, i1 false) + ret i64 0 + +if.exit4: ; preds = %if.exit + %16 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo5 = load i8*, i8** %16, align 8 + %17 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi6 = load i64, i64* %17, align 8 + %18 = call i8 @test_contains(i8* %lo5, i64 %hi6, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i64 13) + %19 = trunc i8 %18 to i1 + br i1 %19, label %if.then7, label %if.exit13 + +if.then7: ; preds = %if.exit4 + %20 = getelementptr inbounds %Doc, %Doc* %literal9, i32 0, i32 0 + %21 = getelementptr inbounds %Head, %Head* %literal10, i32 0, i32 0 + store %"char[]"* null, %"char[]"** %21, align 8 + %22 = bitcast %Head* %value to i8* + %23 = bitcast %Head* %literal10 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %22, i8* align 8 %23, i32 8, i1 false) + %24 = call i8* @std_core_mem_malloc(i64 8) #2 + %ptrptr = bitcast i8* %24 to %Head* + store %Head* %ptrptr, %Head** %temp, align 8 + %25 = load %Head*, %Head** %temp, align 8 + %not = icmp eq %Head* %25, null + br i1 %not, label %if.then11, label %if.exit12 + +if.then11: ; preds = %if.then7 + store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var, align 8 + br label %guard_block + +if.exit12: ; preds = %if.then7 + %26 = load %Head*, %Head** %temp, align 8 + %27 = bitcast %Head* %26 to i8* + %28 = bitcast %Head* %value to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %27, i8* align 8 %28, i32 8, i1 false) + br label %noerr_block + +guard_block: ; preds = %if.then11 + %29 = load i64, i64* %error_var, align 8 + ret i64 %29 + +noerr_block: ; preds = %if.exit12 + %30 = load %Head*, %Head** %temp, align 8 + store %Head* %30, %Head** %20, align 8 + %31 = bitcast %Doc* %0 to i8* + %32 = bitcast %Doc* %literal9 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %31, i8* align 8 %32, i32 8, i1 false) + ret i64 0 + +if.exit13: ; preds = %if.exit4 + %33 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo14 = load i8*, i8** %33, align 8 + %34 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi15 = load i64, i64* %34, align 8 + %35 = call i8 @test_contains(i8* %lo14, i64 %hi15, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.5, i32 0, i32 0), i64 11) + %36 = trunc i8 %35 to i1 + br i1 %36, label %if.then16, label %if.exit38 + +if.then16: ; preds = %if.exit13 + %37 = getelementptr inbounds %Doc, %Doc* %literal18, i32 0, i32 0 + %38 = bitcast %Head* %literal21 to %"char[]"** + store %"char[]"* null, %"char[]"** %38, align 8 + %39 = getelementptr inbounds %Head, %Head* %literal21, i32 0, i32 0 + store %"char[]" zeroinitializer, %"char[]"* %value23, align 8 + %40 = call i8* @std_core_mem_malloc(i64 16) #2 + %ptrptr25 = bitcast i8* %40 to %"char[]"* + store %"char[]"* %ptrptr25, %"char[]"** %temp24, align 8 + %41 = load %"char[]"*, %"char[]"** %temp24, align 8 + %not26 = icmp eq %"char[]"* %41, null + br i1 %not26, label %if.then27, label %if.exit28 + +if.then27: ; preds = %if.then16 + store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var22, align 8 + br label %guard_block29 + +if.exit28: ; preds = %if.then16 + %42 = load %"char[]"*, %"char[]"** %temp24, align 8 + %43 = bitcast %"char[]"* %42 to i8* + %44 = bitcast %"char[]"* %value23 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %43, i8* align 8 %44, i32 16, i1 false) + br label %noerr_block30 + +guard_block29: ; preds = %if.then27 + %45 = load i64, i64* %error_var22, align 8 + ret i64 %45 + +noerr_block30: ; preds = %if.exit28 + %46 = load %"char[]"*, %"char[]"** %temp24, align 8 + store %"char[]"* %46, %"char[]"** %39, align 8 + %47 = bitcast %Head* %value20 to i8* + %48 = bitcast %Head* %literal21 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %47, i8* align 8 %48, i32 8, i1 false) + %49 = call i8* @std_core_mem_malloc(i64 8) #2 + %ptrptr32 = bitcast i8* %49 to %Head* + store %Head* %ptrptr32, %Head** %temp31, align 8 + %50 = load %Head*, %Head** %temp31, align 8 + %not33 = icmp eq %Head* %50, null + br i1 %not33, label %if.then34, label %if.exit35 + +if.then34: ; preds = %noerr_block30 + store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var19, align 8 + br label %guard_block36 + +if.exit35: ; preds = %noerr_block30 + %51 = load %Head*, %Head** %temp31, align 8 + %52 = bitcast %Head* %51 to i8* + %53 = bitcast %Head* %value20 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %52, i8* align 8 %53, i32 8, i1 false) + br label %noerr_block37 + +guard_block36: ; preds = %if.then34 + %54 = load i64, i64* %error_var19, align 8 + ret i64 %54 + +noerr_block37: ; preds = %if.exit35 + %55 = load %Head*, %Head** %temp31, align 8 + store %Head* %55, %Head** %37, align 8 + %56 = bitcast %Doc* %0 to i8* + %57 = bitcast %Doc* %literal18 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %56, i8* align 8 %57, i32 8, i1 false) + ret i64 0 + +if.exit38: ; preds = %if.exit13 + %58 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %59 = load i64, i64* %58, align 8 + %uisitrunc = trunc i64 %59 to i32 + %60 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %61 = load i8*, i8** %60, align 8 + %62 = call i32 (i8*, i64, i8*, ...) @snprintf(i8* null, i64 0, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i32 0, i32 0), i32 %uisitrunc, i8* %61) + store i32 %62, i32* %len, align 4 + %63 = load i32, i32* %len, align 4 + %siuiext = sext i32 %63 to i64 + %add = add i64 %siuiext, 1 + %64 = call i8* @std_core_mem_malloc(i64 %add) #2 + store i8* %64, i8** %str, align 8 + %65 = load i8*, i8** %str, align 8 + %not39 = icmp eq i8* %65, null + br i1 %not39, label %if.then40, label %if.exit41 + +if.then40: ; preds = %if.exit38 + ret i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64) + +if.exit41: ; preds = %if.exit38 + %66 = load i8*, i8** %str, align 8 + %67 = load i32, i32* %len, align 4 + %siuiext42 = sext i32 %67 to i64 + %add43 = add i64 %siuiext42, 1 + %68 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %69 = load i64, i64* %68, align 8 + %uisitrunc44 = trunc i64 %69 to i32 + %70 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %71 = load i8*, i8** %70, align 8 + %72 = call i32 (i8*, i64, i8*, ...) @snprintf(i8* %66, i64 %add43, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.8, i32 0, i32 0), i32 %uisitrunc44, i8* %71) + %73 = getelementptr inbounds %Doc, %Doc* %literal46, i32 0, i32 0 + %74 = bitcast %Head* %literal49 to %"char[]"** + store %"char[]"* null, %"char[]"** %74, align 8 + %75 = getelementptr inbounds %Head, %Head* %literal49, i32 0, i32 0 + %76 = load i8*, i8** %str, align 8 + %77 = load i32, i32* %len, align 4 + %sub = sub i32 %77, 1 + %sisiext = sext i32 %sub to i64 + %78 = add i64 %sisiext, 1 + %size = sub i64 %78, 0 + %ptroffset = getelementptr inbounds i8, i8* %76, i64 0 + %79 = insertvalue %"char[]" undef, i8* %ptroffset, 0 + %80 = insertvalue %"char[]" %79, i64 %size, 1 + store %"char[]" %80, %"char[]"* %value51, align 8 + %81 = call i8* @std_core_mem_malloc(i64 16) #2 + %ptrptr53 = bitcast i8* %81 to %"char[]"* + store %"char[]"* %ptrptr53, %"char[]"** %temp52, align 8 + %82 = load %"char[]"*, %"char[]"** %temp52, align 8 + %not54 = icmp eq %"char[]"* %82, null + br i1 %not54, label %if.then55, label %if.exit56 + +if.then55: ; preds = %if.exit41 + store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var50, align 8 + br label %guard_block57 + +if.exit56: ; preds = %if.exit41 + %83 = load %"char[]"*, %"char[]"** %temp52, align 8 + %84 = bitcast %"char[]"* %83 to i8* + %85 = bitcast %"char[]"* %value51 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %84, i8* align 8 %85, i32 16, i1 false) + br label %noerr_block58 + +guard_block57: ; preds = %if.then55 + %86 = load i64, i64* %error_var50, align 8 + ret i64 %86 + +noerr_block58: ; preds = %if.exit56 + %87 = load %"char[]"*, %"char[]"** %temp52, align 8 + store %"char[]"* %87, %"char[]"** %75, align 8 + %88 = bitcast %Head* %value48 to i8* + %89 = bitcast %Head* %literal49 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %88, i8* align 8 %89, i32 8, i1 false) + %90 = call i8* @std_core_mem_malloc(i64 8) #2 + %ptrptr60 = bitcast i8* %90 to %Head* + store %Head* %ptrptr60, %Head** %temp59, align 8 + %91 = load %Head*, %Head** %temp59, align 8 + %not61 = icmp eq %Head* %91, null + br i1 %not61, label %if.then62, label %if.exit63 + +if.then62: ; preds = %noerr_block58 + store i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), i64* %error_var47, align 8 + br label %guard_block64 + +if.exit63: ; preds = %noerr_block58 + %92 = load %Head*, %Head** %temp59, align 8 + %93 = bitcast %Head* %92 to i8* + %94 = bitcast %Head* %value48 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %93, i8* align 8 %94, i32 8, i1 false) + br label %noerr_block65 + +guard_block64: ; preds = %if.then62 + %95 = load i64, i64* %error_var47, align 8 + ret i64 %95 + +noerr_block65: ; preds = %if.exit63 + %96 = load %Head*, %Head** %temp59, align 8 + store %Head* %96, %Head** %73, align 8 + %97 = bitcast %Doc* %0 to i8* + %98 = bitcast %Doc* %literal46 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %97, i8* align 8 %98, i32 8, i1 false) + ret i64 0 +} + +; Function Attrs: nounwind +define { %"char[]"*, i8 } @test_buildSummary(%Head* %0) #0 { +entry: + %doc = alloca %Doc, align 8 + %literal = alloca %Summary, align 8 + %1 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 + store %Head* %0, %Head** %1, align 8 + %2 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 0 + store %"char[]"* null, %"char[]"** %2, align 8 + %3 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 1 + store i8 0, i8* %3, align 8 + %4 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 0 + %5 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 + %6 = load %Head*, %Head** %5, align 8 + %ptrbool = icmp ne %Head* %6, null + br i1 %ptrbool, label %cond.lhs, label %cond.rhs + +cond.lhs: ; preds = %entry + %7 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 + %8 = load %Head*, %Head** %7, align 8 + %9 = getelementptr inbounds %Head, %Head* %8, i32 0, i32 0 + %10 = load %"char[]"*, %"char[]"** %9, align 8 + %ptrptr = bitcast %"char[]"* %10 to i8* + br label %cond.phi + +cond.rhs: ; preds = %entry + br label %cond.phi + +cond.phi: ; preds = %cond.rhs, %cond.lhs + %val = phi i8* [ %ptrptr, %cond.lhs ], [ null, %cond.rhs ] + %ptrptr1 = bitcast i8* %val to %"char[]"* + store %"char[]"* %ptrptr1, %"char[]"** %4, align 8 + %11 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 1 + store i8 1, i8* %11, align 8 + %12 = bitcast %Summary* %literal to { %"char[]"*, i8 }* + %13 = load { %"char[]"*, i8 }, { %"char[]"*, i8 }* %12, align 8 + ret { %"char[]"*, i8 } %13 +} + +; Function Attrs: nounwind +define { %"char[]"*, i8 } @test_readAndBuildSummary(i8* %0, i64 %1) #0 { +entry: + %url = alloca %"char[]", align 8 + %retparam = alloca %Doc, align 8 + %result = alloca %Summary, align 8 + %literal = alloca %Summary, align 8 + %taddr = alloca %Summary, align 8 + %pair = bitcast %"char[]"* %url to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + %4 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo = load i8*, i8** %4, align 8 + %5 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi = load i64, i64* %5, align 8 + %6 = call i64 @test_readDoc(%Doc* %retparam, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %6, 0 + br i1 %not_err, label %after_check, label %else_block + +after_check: ; preds = %entry + %7 = getelementptr inbounds %Doc, %Doc* %retparam, i32 0, i32 0 + %8 = load %Head*, %Head** %7, align 8 + %9 = call { %"char[]"*, i8 } @test_buildSummary(%Head* %8) + %10 = bitcast %Summary* %result to { %"char[]"*, i8 }* + store { %"char[]"*, i8 } %9, { %"char[]"*, i8 }* %10, align 8 + %11 = load %Summary, %Summary* %result, align 8 + br label %phi_block + +else_block: ; preds = %entry + %12 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 0 + store %"char[]"* null, %"char[]"** %12, align 8 + %13 = getelementptr inbounds %Summary, %Summary* %literal, i32 0, i32 1 + store i8 0, i8* %13, align 8 + %14 = load %Summary, %Summary* %literal, align 8 + br label %phi_block + +phi_block: ; preds = %else_block, %after_check + %val = phi %Summary [ %11, %after_check ], [ %14, %else_block ] + store %Summary %val, %Summary* %taddr, align 8 + %15 = bitcast %Summary* %taddr to { %"char[]"*, i8 }* + %16 = load { %"char[]"*, i8 }, { %"char[]"*, i8 }* %15, align 8 + ret { %"char[]"*, i8 } %16 +} + +; Function Attrs: nounwind +define i64 @test_isTitleNonEmpty(i8* %0, %Head* %1) #0 { +entry: + %doc = alloca %Doc, align 8 + %head = alloca %"char[]"*, align 8 + %reterr = alloca i64, align 8 + %2 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 + store %Head* %1, %Head** %2, align 8 + %3 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 + %4 = load %Head*, %Head** %3, align 8 + %not = icmp eq %Head* %4, null + br i1 %not, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i64 ptrtoint (%.fault* @"test_TitleResult$TITLE_MISSING" to i64) + +if.exit: ; preds = %entry + %5 = getelementptr inbounds %Doc, %Doc* %doc, i32 0, i32 0 + %6 = load %Head*, %Head** %5, align 8 + %7 = getelementptr inbounds %Head, %Head* %6, i32 0, i32 0 + %8 = load %"char[]"*, %"char[]"** %7, align 8 + store %"char[]"* %8, %"char[]"** %head, align 8 + %9 = load %"char[]"*, %"char[]"** %head, align 8 + %not1 = icmp eq %"char[]"* %9, null + br i1 %not1, label %if.then2, label %if.exit3 + +if.then2: ; preds = %if.exit + ret i64 ptrtoint (%.fault* @"test_TitleResult$TITLE_MISSING" to i64) + +if.exit3: ; preds = %if.exit + %10 = load %"char[]"*, %"char[]"** %head, align 8 + %11 = getelementptr inbounds %"char[]", %"char[]"* %10, i32 0, i32 1 + %12 = load i64, i64* %11, align 8 + %lt = icmp ult i64 0, %12 + %13 = zext i1 %lt to i8 + store i8 %13, i8* %0, align 1 + ret i64 0 +} + +; Function Attrs: nounwind +define i64 @test_readWhetherTitleNonEmpty(i8* %0, i8* %1, i64 %2) #0 { +entry: + %url = alloca %"char[]", align 8 + %reterr = alloca i64, align 8 + %retparam = alloca i8, align 1 + %retparam1 = alloca %Doc, align 8 + %pair = bitcast %"char[]"* %url to { i8*, i64 }* + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %1, i8** %3, align 8 + %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %2, i64* %4, align 8 + %5 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo = load i8*, i8** %5, align 8 + %6 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi = load i64, i64* %6, align 8 + %7 = call i64 @test_readDoc(%Doc* %retparam1, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %7, 0 + br i1 %not_err, label %after_check, label %assign_optional + +assign_optional: ; preds = %entry + store i64 %7, i64* %reterr, align 8 + br label %err_retblock + +after_check: ; preds = %entry + %8 = getelementptr inbounds %Doc, %Doc* %retparam1, i32 0, i32 0 + %9 = load %Head*, %Head** %8, align 8 + %10 = call i64 @test_isTitleNonEmpty(i8* %retparam, %Head* %9) + %not_err2 = icmp eq i64 %10, 0 + br i1 %not_err2, label %after_check4, label %assign_optional3 + +assign_optional3: ; preds = %after_check + store i64 %10, i64* %reterr, align 8 + br label %err_retblock + +after_check4: ; preds = %after_check + %11 = load i8, i8* %retparam, align 1 + store i8 %11, i8* %0, align 1 + ret i64 0 + +err_retblock: ; preds = %assign_optional3, %assign_optional + %12 = load i64, i64* %reterr, align 8 + ret i64 %12 +} + +; Function Attrs: nounwind +define i8* @test_bool_to_string(i8 zeroext %0) #0 { +entry: + %1 = trunc i8 %0 to i1 + %ternary = select i1 %1, %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.9, i32 0, i32 0), i64 4 }, %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i64 5 } + %2 = extractvalue %"char[]" %ternary, 0 + ret i8* %2 +} + +; Function Attrs: nounwind +define i8* @test_nameFromError(i64 %0) #0 { +entry: + %switch = alloca i64, align 8 + store i64 %0, i64* %switch, align 8 + br label %switch.entry + +switch.entry: ; preds = %entry + %1 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.fault* @"test_TitleResult$TITLE_MISSING" to i64), %1 + br i1 %eq, label %switch.case, label %next_if + +switch.case: ; preds = %switch.entry + ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.11, i32 0, i32 0) + +next_if: ; preds = %switch.entry + %eq1 = icmp eq i64 ptrtoint (%.fault* @"test_ReadError$BAD_READ" to i64), %1 + br i1 %eq1, label %switch.case2, label %next_if3 + +switch.case2: ; preds = %next_if + ret i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i32 0, i32 0) + +next_if3: ; preds = %next_if + %eq4 = icmp eq i64 ptrtoint (%.fault* @"test_ReadError$OUT_OF_MEMORY" to i64), %1 + br i1 %eq4, label %switch.case5, label %next_if6 + +switch.case5: ; preds = %next_if3 + ret i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i32 0, i32 0) + +next_if6: ; preds = %next_if3 + br label %switch.default + +switch.default: ; preds = %next_if6 + ret i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.14, i32 0, i32 0) +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %URLS = alloca %"char[][]", align 8 + %literal = alloca [5 x %"char[]"], align 16 + %.anon = alloca i64, align 8 + %.anon1 = alloca i64, align 8 + %url = alloca %"char[]", align 8 + %summary = alloca %Summary, align 8 + %result = alloca %Summary, align 8 + %title_sure = alloca %"char[]", align 8 + %has_title = alloca i8, align 1 + %has_title.f = alloca i64, align 8 + %retparam = alloca i8, align 1 + %0 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 0 + store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.15, i32 0, i32 0), i64 4 }, %"char[]"* %0, align 8 + %1 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 1 + store %"char[]" { i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.16, i32 0, i32 0), i64 11 }, %"char[]"* %1, align 8 + %2 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 2 + store %"char[]" { i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.17, i32 0, i32 0), i64 13 }, %"char[]"* %2, align 8 + %3 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 3 + store %"char[]" { i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i64 12 }, %"char[]"* %3, align 8 + %4 = getelementptr inbounds [5 x %"char[]"], [5 x %"char[]"]* %literal, i64 0, i64 4 + store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.19, i32 0, i32 0), i64 4 }, %"char[]"* %4, align 8 + %5 = bitcast [5 x %"char[]"]* %literal to %"char[]"* + %6 = insertvalue %"char[][]" undef, %"char[]"* %5, 0 + %7 = insertvalue %"char[][]" %6, i64 5, 1 + store %"char[][]" %7, %"char[][]"* %URLS, align 8 + %8 = getelementptr inbounds %"char[][]", %"char[][]"* %URLS, i32 0, i32 1 + %9 = load i64, i64* %8, align 8 + store i64 %9, i64* %.anon, align 8 + store i64 0, i64* %.anon1, align 8 + br label %loop.cond + +loop.cond: ; preds = %phi_block12, %entry + %10 = load i64, i64* %.anon1, align 8 + %11 = load i64, i64* %.anon, align 8 + %lt = icmp ult i64 %10, %11 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %12 = getelementptr inbounds %"char[][]", %"char[][]"* %URLS, i32 0, i32 0 + %13 = load %"char[]"*, %"char[]"** %12, align 8 + %14 = load i64, i64* %.anon1, align 8 + %ptroffset = getelementptr inbounds %"char[]", %"char[]"* %13, i64 %14 + %15 = bitcast %"char[]"* %url to i8* + %16 = bitcast %"char[]"* %ptroffset to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %15, i8* align 8 %16, i32 16, i1 false) + %17 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %18 = load i64, i64* %17, align 8 + %uisitrunc = trunc i64 %18 to i32 + %19 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %20 = load i8*, i8** %19, align 8 + %21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.20, i32 0, i32 0), i32 %uisitrunc, i8* %20) + %22 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo = load i8*, i8** %22, align 8 + %23 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi = load i64, i64* %23, align 8 + %24 = call { %"char[]"*, i8 } @test_readAndBuildSummary(i8* %lo, i64 %hi) + %25 = bitcast %Summary* %result to { %"char[]"*, i8 }* + store { %"char[]"*, i8 } %24, { %"char[]"*, i8 }* %25, align 8 + %26 = bitcast %Summary* %summary to i8* + %27 = bitcast %Summary* %result to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %26, i8* align 8 %27, i32 16, i1 false) + %28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.21, i32 0, i32 0)) + %29 = load i8*, i8** @__stdoutp, align 8 + call void @test_Summary_print(%Summary* %summary, i8* %29) + %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.22, i32 0, i32 0)) + %31 = getelementptr inbounds %Summary, %Summary* %summary, i32 0, i32 0 + %32 = load %"char[]"*, %"char[]"** %31, align 8 + %ptrbool = icmp ne %"char[]"* %32, null + br i1 %ptrbool, label %cond.lhs, label %cond.rhs + +cond.lhs: ; preds = %loop.body + %33 = getelementptr inbounds %Summary, %Summary* %summary, i32 0, i32 0 + %34 = load %"char[]"*, %"char[]"** %33, align 8 + %35 = load %"char[]", %"char[]"* %34, align 8 + br label %cond.phi + +cond.rhs: ; preds = %loop.body + br label %cond.phi + +cond.phi: ; preds = %cond.rhs, %cond.lhs + %val = phi %"char[]" [ %35, %cond.lhs ], [ zeroinitializer, %cond.rhs ] + store %"char[]" %val, %"char[]"* %title_sure, align 8 + %36 = getelementptr inbounds %"char[]", %"char[]"* %title_sure, i32 0, i32 1 + %37 = load i64, i64* %36, align 8 + %uisitrunc2 = trunc i64 %37 to i32 + %38 = getelementptr inbounds %"char[]", %"char[]"* %title_sure, i32 0, i32 0 + %39 = load i8*, i8** %38, align 8 + %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.24, i32 0, i32 0), i32 %uisitrunc2, i8* %39) + %41 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 0 + %lo3 = load i8*, i8** %41, align 8 + %42 = getelementptr inbounds %"char[]", %"char[]"* %url, i32 0, i32 1 + %hi4 = load i64, i64* %42, align 8 + %43 = call i64 @test_readWhetherTitleNonEmpty(i8* %retparam, i8* %lo3, i64 %hi4) + %not_err = icmp eq i64 %43, 0 + br i1 %not_err, label %after_check, label %assign_optional + +assign_optional: ; preds = %cond.phi + store i64 %43, i64* %has_title.f, align 8 + br label %after_assign + +after_check: ; preds = %cond.phi + %44 = load i8, i8* %retparam, align 1 + store i8 %44, i8* %has_title, align 1 + store i64 0, i64* %has_title.f, align 8 + br label %after_assign + +after_assign: ; preds = %after_check, %assign_optional + %optval = load i64, i64* %has_title.f, align 8 + %not_err5 = icmp eq i64 %optval, 0 + br i1 %not_err5, label %after_check6, label %else_block + +after_check6: ; preds = %after_assign + %45 = load i8, i8* %has_title, align 1 + %46 = call i8* @test_bool_to_string(i8 %45) + br label %phi_block + +else_block: ; preds = %after_assign + %47 = load i64, i64* %has_title.f, align 8 + %48 = call i8* @test_nameFromError(i64 %47) + br label %phi_block + +phi_block: ; preds = %else_block, %after_check6 + %val7 = phi i8* [ %46, %after_check6 ], [ %48, %else_block ] + %optval8 = load i64, i64* %has_title.f, align 8 + %not_err9 = icmp eq i64 %optval8, 0 + br i1 %not_err9, label %after_check10, label %else_block11 + +after_check10: ; preds = %phi_block + %49 = load i8, i8* %has_title, align 1 + %50 = trunc i8 %49 to i1 + br label %phi_block12 + +else_block11: ; preds = %phi_block + br label %phi_block12 + +phi_block12: ; preds = %else_block11, %after_check10 + %val13 = phi i1 [ %50, %after_check10 ], [ false, %else_block11 ] + %ternary = select i1 %val13, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.26, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.27, i32 0, i32 0) + %51 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.25, i32 0, i32 0), i8* %val7, i8* %ternary) + %52 = load i64, i64* %.anon1, align 8 + %add = add i64 %52, 1 + store i64 %add, i64* %.anon1, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + ret void +} diff --git a/test/test_suite2/errors/error_semantic_fails.c3 b/test/test_suite14/errors/error_semantic_fails.c3 similarity index 100% rename from test/test_suite2/errors/error_semantic_fails.c3 rename to test/test_suite14/errors/error_semantic_fails.c3 diff --git a/test/test_suite2/errors/error_throw.c3 b/test/test_suite14/errors/error_throw.c3 similarity index 100% rename from test/test_suite2/errors/error_throw.c3 rename to test/test_suite14/errors/error_throw.c3 diff --git a/test/test_suite2/errors/error_union.c3 b/test/test_suite14/errors/error_union.c3 similarity index 100% rename from test/test_suite2/errors/error_union.c3 rename to test/test_suite14/errors/error_union.c3 diff --git a/test/test_suite2/errors/failable_catch.c3t b/test/test_suite14/errors/failable_catch.c3t similarity index 66% rename from test/test_suite2/errors/failable_catch.c3t rename to test/test_suite14/errors/failable_catch.c3t index a67979bb7..683d45f13 100644 --- a/test/test_suite2/errors/failable_catch.c3t +++ b/test/test_suite14/errors/failable_catch.c3t @@ -44,133 +44,108 @@ entry: %c.f = alloca i64, align 8 %x8 = alloca i32, align 4 %blockret9 = alloca i32, align 4 - store i32 1, ptr %x, align 4 - %0 = load i32, ptr %x, align 4 + store i32 1, i32* %x, align 4 + %0 = load i32, i32* %x, align 4 %intbool = icmp ne i32 %0, 0 br i1 %intbool, label %if.then, label %if.exit - if.then: ; preds = %entry - %1 = load i32, ptr %x, align 4 - store i32 %1, ptr %blockret, align 4 + %1 = load i32, i32* %x, align 4 + store i32 %1, i32* %blockret, align 4 br label %expr_block.exit - if.exit: ; preds = %entry - store i64 ptrtoint (ptr @"failable_catch_MyErr$TEST" to i64), ptr %a.f, align 8 + store i64 ptrtoint (%.fault* @"failable_catch_MyErr$TEST" to i64), i64* %a.f, align 8 br label %after_assign - expr_block.exit: ; preds = %if.then - %2 = load i32, ptr %blockret, align 4 - store i32 %2, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 + %2 = load i32, i32* %blockret, align 4 + store i32 %2, i32* %a, align 4 + store i64 0, i64* %a.f, align 8 br label %after_assign - after_assign: ; preds = %expr_block.exit, %if.exit - %optval = load i64, ptr %a.f, align 8 + %optval = load i64, i64* %a.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %else_block - after_check: ; preds = %after_assign - %3 = load i32, ptr %a, align 4 + %3 = load i32, i32* %a, align 4 %add = add i32 %3, 3 br label %phi_block - else_block: ; preds = %after_assign br label %phi_block - phi_block: ; preds = %else_block, %after_check %val = phi i32 [ %add, %after_check ], [ 2, %else_block ] - store i32 %val, ptr %x1, align 4 - %4 = load i32, ptr %x1, align 4 + store i32 %val, i32* %x1, align 4 + %4 = load i32, i32* %x1, align 4 %intbool3 = icmp ne i32 %4, 0 br i1 %intbool3, label %if.then4, label %if.exit5 - if.then4: ; preds = %phi_block - %5 = load i32, ptr %x1, align 4 - store i32 %5, ptr %blockret2, align 4 + %5 = load i32, i32* %x1, align 4 + store i32 %5, i32* %blockret2, align 4 br label %expr_block.exit6 - if.exit5: ; preds = %phi_block - store i64 ptrtoint (ptr @"failable_catch_MyErr$TEST" to i64), ptr %b.f, align 8 + store i64 ptrtoint (%.fault* @"failable_catch_MyErr$TEST" to i64), i64* %b.f, align 8 br label %after_assign7 - expr_block.exit6: ; preds = %if.then4 - %6 = load i32, ptr %blockret2, align 4 - store i32 %6, ptr %b, align 4 - store i64 0, ptr %b.f, align 8 + %6 = load i32, i32* %blockret2, align 4 + store i32 %6, i32* %b, align 4 + store i64 0, i64* %b.f, align 8 br label %after_assign7 - after_assign7: ; preds = %expr_block.exit6, %if.exit5 - store i32 0, ptr %x8, align 4 - %7 = load i32, ptr %x8, align 4 + store i32 0, i32* %x8, align 4 + %7 = load i32, i32* %x8, align 4 %intbool10 = icmp ne i32 %7, 0 br i1 %intbool10, label %if.then11, label %if.exit12 - if.then11: ; preds = %after_assign7 - %8 = load i32, ptr %x8, align 4 - store i32 %8, ptr %blockret9, align 4 + %8 = load i32, i32* %x8, align 4 + store i32 %8, i32* %blockret9, align 4 br label %expr_block.exit13 - if.exit12: ; preds = %after_assign7 - store i64 ptrtoint (ptr @"failable_catch_MyErr$TEST" to i64), ptr %c.f, align 8 + store i64 ptrtoint (%.fault* @"failable_catch_MyErr$TEST" to i64), i64* %c.f, align 8 br label %after_assign14 - expr_block.exit13: ; preds = %if.then11 - %9 = load i32, ptr %blockret9, align 4 - store i32 %9, ptr %c, align 4 - store i64 0, ptr %c.f, align 8 + %9 = load i32, i32* %blockret9, align 4 + store i32 %9, i32* %c, align 4 + store i64 0, i64* %c.f, align 8 br label %after_assign14 - after_assign14: ; preds = %expr_block.exit13, %if.exit12 - %optval15 = load i64, ptr %a.f, align 8 + %optval15 = load i64, i64* %a.f, align 8 %not_err16 = icmp eq i64 %optval15, 0 br i1 %not_err16, label %after_check17, label %voiderr - after_check17: ; preds = %after_assign14 - %10 = load i32, ptr %a, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %10) + %10 = load i32, i32* %a, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 %10) br label %voiderr - voiderr: ; preds = %after_check17, %after_assign14 - %optval18 = load i64, ptr %b.f, align 8 + %optval18 = load i64, i64* %b.f, align 8 %not_err19 = icmp eq i64 %optval18, 0 br i1 %not_err19, label %after_check20, label %voiderr21 - after_check20: ; preds = %voiderr - %11 = load i32, ptr %b, align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %11) + %11 = load i32, i32* %b, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %11) br label %voiderr21 - voiderr21: ; preds = %after_check20, %voiderr - %optval22 = load i64, ptr %c.f, align 8 + %optval22 = load i64, i64* %c.f, align 8 %not_err23 = icmp eq i64 %optval22, 0 br i1 %not_err23, label %after_check24, label %voiderr25 - after_check24: ; preds = %voiderr21 - %12 = load i32, ptr %c, align 4 - call void (ptr, ...) @printf(ptr @.str.2, i32 %12) + %12 = load i32, i32* %c, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 %12) br label %voiderr25 - voiderr25: ; preds = %after_check24, %voiderr21 - %13 = load i64, ptr %c.f, align 8 + %13 = load i64, i64* %c.f, align 8 %neq = icmp ne i64 %13, 0 br i1 %neq, label %if.then26, label %if.exit27 - if.then26: ; preds = %voiderr25 - call void (ptr, ...) @printf(ptr @.str.3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.3, i32 0, i32 0)) br label %if.exit27 - if.exit27: ; preds = %if.then26, %voiderr25 - store i32 3, ptr %c, align 4 - store i64 0, ptr %c.f, align 8 - %optval28 = load i64, ptr %c.f, align 8 + store i32 3, i32* %c, align 4 + store i64 0, i64* %c.f, align 8 + %optval28 = load i64, i64* %c.f, align 8 %not_err29 = icmp eq i64 %optval28, 0 br i1 %not_err29, label %after_check30, label %voiderr31 - after_check30: ; preds = %if.exit27 - %14 = load i32, ptr %c, align 4 - call void (ptr, ...) @printf(ptr @.str.4, i32 %14) + %14 = load i32, i32* %c, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.4, i32 0, i32 0), i32 %14) br label %voiderr31 - voiderr31: ; preds = %after_check30, %if.exit27 ret i32 0 } diff --git a/test/test_suite14/errors/general_error_regression.c3t b/test/test_suite14/errors/general_error_regression.c3t new file mode 100644 index 000000000..7f3da1d8f --- /dev/null +++ b/test/test_suite14/errors/general_error_regression.c3t @@ -0,0 +1,141 @@ +// #target: macos-x64 +module foo; +import std::io; +import libc; +fault Foo +{ + X, + Y, + Z, + W, + W1 + + +} + +fault Foob +{ + X1, + Y2 +} + +define Bar = distinct int; + +enum MyEnum +{ + A, + B +} + +fn void Foo.hello(Foo *f) +{ + io::println("Hello from Foo"); +} + +fn void Bar.hello(Bar *b) +{ + io::println("Hello from Bar"); +} + +fn void MyEnum.hello(MyEnum *myenum) +{ + io::println("Hello from MyEnum"); +} +fn void main() +{ + Foo f = Foo.X; + Foo ef = Foo.Y; + anyerr x = f; + ulong z = (ulong)(x); + libc::printf("1: %p\n", z); + x = ef; + z = (ulong)(x); + libc::printf("2: %p\n", z); + x = Foo.W; + z = (ulong)(x); + libc::printf("21: %p\n", z); + x = Foo.W1; + z = (ulong)(x); + libc::printf("22: %p\n", z); + x = Foob.X1; + z = (ulong)(x); + libc::printf("3: %p\n", z); + x = Foob.Y2; + z = (ulong)(x); + libc::printf("4: %p\n", z); + Bar b; + MyEnum a = MyEnum.A; + f.hello(); + b.hello(); + a.hello(); +} + +/* #expect: foo.ll + +define void @foo_Foo_hello(i64* %0) #0 { +entry: + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.12, i32 0, i32 0)) #1 + ret void +} + +define void @foo_Bar_hello(i32* %0) #0 { +entry: + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.13, i32 0, i32 0)) #1 + ret void +} + +define void @foo_MyEnum_hello(i32* %0) #0 { +entry: + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.14, i32 0, i32 0)) #1 + ret void +} + +define void @foo_main() #0 { +entry: + %f = alloca i64, align 8 + %ef = alloca i64, align 8 + %x = alloca i64, align 8 + %z = alloca i64, align 8 + %b = alloca i32, align 4 + %a = alloca i32, align 4 + store i64 ptrtoint (%.fault* @"foo_Foo$X" to i64), i64* %f, align 8 + store i64 ptrtoint (%.fault* @"foo_Foo$Y" to i64), i64* %ef, align 8 + %0 = load i64, i64* %f, align 8 + store i64 %0, i64* %x, align 8 + %1 = load i64, i64* %x, align 8 + store i64 %1, i64* %z, align 8 + %2 = load i64, i64* %z, align 8 + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i64 %2) + %4 = load i64, i64* %ef, align 8 + store i64 %4, i64* %x, align 8 + %5 = load i64, i64* %x, align 8 + store i64 %5, i64* %z, align 8 + %6 = load i64, i64* %z, align 8 + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i32 0, i32 0), i64 %6) + store i64 ptrtoint (%.fault* @"foo_Foo$W" to i64), i64* %x, align 8 + %8 = load i64, i64* %x, align 8 + store i64 %8, i64* %z, align 8 + %9 = load i64, i64* %z, align 8 + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0), i64 %9) + store i64 ptrtoint (%.fault* @"foo_Foo$W1" to i64), i64* %x, align 8 + %11 = load i64, i64* %x, align 8 + store i64 %11, i64* %z, align 8 + %12 = load i64, i64* %z, align 8 + %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.9, i32 0, i32 0), i64 %12) + store i64 ptrtoint (%.fault* @"foo_Foob$X1" to i64), i64* %x, align 8 + %14 = load i64, i64* %x, align 8 + store i64 %14, i64* %z, align 8 + %15 = load i64, i64* %z, align 8 + %16 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i32 0, i32 0), i64 %15) + store i64 ptrtoint (%.fault* @"foo_Foob$Y2" to i64), i64* %x, align 8 + %17 = load i64, i64* %x, align 8 + store i64 %17, i64* %z, align 8 + %18 = load i64, i64* %z, align 8 + %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i32 0, i32 0), i64 %18) + store i32 0, i32* %b, align 4 + store i32 0, i32* %a, align 4 + call void @foo_Foo_hello(i64* %f) + call void @foo_Bar_hello(i32* %b) + call void @foo_MyEnum_hello(i32* %a) + ret void +} \ No newline at end of file diff --git a/test/test_suite/errors/illegal_use_of_failable.c3 b/test/test_suite14/errors/illegal_use_of_failable.c3 similarity index 100% rename from test/test_suite/errors/illegal_use_of_failable.c3 rename to test/test_suite14/errors/illegal_use_of_failable.c3 diff --git a/test/test_suite2/errors/macro_err.c3t b/test/test_suite14/errors/macro_err.c3t similarity index 75% rename from test/test_suite2/errors/macro_err.c3t rename to test/test_suite14/errors/macro_err.c3t index 0b51381bb..7f89c95f8 100644 --- a/test/test_suite2/errors/macro_err.c3t +++ b/test/test_suite14/errors/macro_err.c3t @@ -18,10 +18,10 @@ fn void main() /* #expect: test.ll -define i64 @test_abc(ptr %0) #0 { +define i64 @test_abc(i32* %0) #0 { entry: %reterr = alloca i64, align 8 - store i32 1, ptr %0, align 4 + store i32 1, i32* %0, align 4 ret i64 0 } @@ -30,12 +30,12 @@ define void @test_main() #0 { entry: %error_var = alloca i64, align 8 %retparam = alloca i32, align 4 - %0 = call i64 @test_abc(ptr %retparam) + %0 = call i64 @test_abc(i32* %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, ptr %error_var, align 8 + store i64 %0, i64* %error_var, align 8 br label %guard_block after_check: ; preds = %entry @@ -45,10 +45,10 @@ guard_block: ; preds = %assign_optional ret void noerr_block: ; preds = %after_check - %1 = load i32, ptr %retparam, align 4 + %1 = load i32, i32* %retparam, align 4 br label %phi_block phi_block: ; preds = %noerr_block - %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) ret void } diff --git a/test/test_suite2/errors/macro_err2.c3t b/test/test_suite14/errors/macro_err2.c3t similarity index 60% rename from test/test_suite2/errors/macro_err2.c3t rename to test/test_suite14/errors/macro_err2.c3t index c86a32432..d34314250 100644 --- a/test/test_suite2/errors/macro_err2.c3t +++ b/test/test_suite14/errors/macro_err2.c3t @@ -21,31 +21,31 @@ fn void main() /* #expect: test.ll -define i64 @test_abc(ptr %0) #0 { +define i64 @test_abc(i32* %0) #0 { entry: - ret i64 ptrtoint (ptr @"test_Tester$FOO" to i64) + ret i64 ptrtoint (%.fault* @"test_Tester$FOO" to i64) } define void @test_main() #0 { entry: %blockret = alloca i32, align 4 %retparam = alloca i32, align 4 - %0 = call i64 @test_abc(ptr %retparam) + %0 = call i64 @test_abc(i32* %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %opt_block_cleanup after_check: ; preds = %entry - %1 = call i32 (ptr, ...) @printf(ptr @.str.1) - %2 = load i32, ptr %retparam, align 4 - store i32 %2, ptr %blockret, align 4 + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + %2 = load i32, i32* %retparam, align 4 + store i32 %2, i32* %blockret, align 4 br label %expr_block.exit opt_block_cleanup: ; preds = %entry - %3 = call i32 (ptr, ...) @printf(ptr @.str.2) + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i32 0, i32 0)) br label %else_block expr_block.exit: ; preds = %after_check - %4 = load i32, ptr %blockret, align 4 + %4 = load i32, i32* %blockret, align 4 br label %phi_block else_block: ; preds = %opt_block_cleanup @@ -53,7 +53,7 @@ else_block: ; preds = %opt_block_cleanup phi_block: ; preds = %else_block, %expr_block.exit %val = phi i32 [ %4, %expr_block.exit ], [ 2, %else_block ] - %5 = call i32 (ptr, ...) @printf(ptr @.str, i32 %val) - %6 = call i32 (ptr, ...) @printf(ptr @.str.3) + %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %val) + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i32 0, i32 0)) ret void -} +} \ No newline at end of file diff --git a/test/test_suite2/errors/macro_err3.c3t b/test/test_suite14/errors/macro_err3.c3t similarity index 65% rename from test/test_suite2/errors/macro_err3.c3t rename to test/test_suite14/errors/macro_err3.c3t index 1e743a38e..590aebdde 100644 --- a/test/test_suite2/errors/macro_err3.c3t +++ b/test/test_suite14/errors/macro_err3.c3t @@ -24,14 +24,14 @@ entry: br label %opt_block_cleanup opt_block_cleanup: ; preds = %entry - %0 = call i32 (ptr, ...) @printf(ptr @.str.2) + %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i32 0, i32 0)) br label %else_block else_block: ; preds = %opt_block_cleanup br label %phi_block phi_block: ; preds = %else_block - %1 = call i32 (ptr, ...) @printf(ptr @.str, i32 2) - %2 = call i32 (ptr, ...) @printf(ptr @.str.3) + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 2) + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.3, i32 0, i32 0)) ret void } diff --git a/test/test_suite2/errors/missing_bang.c3 b/test/test_suite14/errors/missing_bang.c3 similarity index 100% rename from test/test_suite2/errors/missing_bang.c3 rename to test/test_suite14/errors/missing_bang.c3 diff --git a/test/test_suite2/errors/more_optional_tests.c3 b/test/test_suite14/errors/more_optional_tests.c3 similarity index 100% rename from test/test_suite2/errors/more_optional_tests.c3 rename to test/test_suite14/errors/more_optional_tests.c3 diff --git a/test/test_suite2/errors/no_common.c3 b/test/test_suite14/errors/no_common.c3 similarity index 100% rename from test/test_suite2/errors/no_common.c3 rename to test/test_suite14/errors/no_common.c3 diff --git a/test/test_suite14/errors/optional_chained_init.c3t b/test/test_suite14/errors/optional_chained_init.c3t new file mode 100644 index 000000000..914d6cff9 --- /dev/null +++ b/test/test_suite14/errors/optional_chained_init.c3t @@ -0,0 +1,625 @@ +// #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::printfn("A err was: %s", err); + if (catch err = b) io::printfn("B err was: %s", err); + io::printfn("A was: %s", a); + io::printfn("B was: %s", b); +} + +fn void test2() +{ + int! x = Test.FOO!; + int! a = 1; + int! b = a = x; + if (catch err = a) io::printfn("A err was: %s", err); + if (catch err = b) io::printfn("B err was: %s", err); + io::printfn("A was: %s", a); + io::printfn("B was: %s", b); +} + + +fn void test3() +{ + int! x = 23; + int! a = 1; + int! b = a = x; + if (catch err = a) io::printfn("A err was: %s", err); + if (catch err = b) io::printfn("B err was: %s", err); + io::printfn("A was: %s", a); + io::printfn("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 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %err3 = alloca i64, align 8 + %retparam12 = alloca i64, align 8 + %varargslots13 = alloca [1 x %variant], align 16 + %taddr14 = alloca %"variant[]", align 8 + %retparam21 = alloca i64, align 8 + %varargslots22 = alloca [1 x %variant], align 16 + %taddr26 = alloca %"variant[]", align 8 + %retparam32 = alloca i64, align 8 + %varargslots33 = alloca [1 x %variant], align 16 + %taddr37 = alloca %"variant[]", align 8 + 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 + %1 = bitcast i64* %err to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr, align 8 + %8 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) + %not_err1 = icmp eq i64 %11, 0 + br i1 %not_err1, label %after_check2, label %voiderr + +after_check2: ; preds = %if.then + br label %voiderr + +voiderr: ; preds = %after_check2, %if.then + br label %if.exit + +if.exit: ; preds = %voiderr, %end_block + br label %testblock4 + +testblock4: ; preds = %if.exit + %optval5 = load i64, i64* %b.f, align 8 + %not_err6 = icmp eq i64 %optval5, 0 + br i1 %not_err6, label %after_check8, label %assign_optional7 + +assign_optional7: ; preds = %testblock4 + store i64 %optval5, i64* %err3, align 8 + br label %end_block9 + +after_check8: ; preds = %testblock4 + store i64 0, i64* %err3, align 8 + br label %end_block9 + +end_block9: ; preds = %after_check8, %assign_optional7 + %12 = load i64, i64* %err3, align 8 + %neq10 = icmp ne i64 %12, 0 + br i1 %neq10, label %if.then11, label %if.exit20 + +if.then11: ; preds = %end_block9 + %13 = bitcast i64* %err3 to i8* + %14 = insertvalue %variant undef, i8* %13, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %16 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots13, i64 0, i64 0 + store %variant %15, %variant* %16, align 16 + %17 = bitcast [1 x %variant]* %varargslots13 to %variant* + %18 = insertvalue %"variant[]" undef, %variant* %17, 0 + %19 = insertvalue %"variant[]" %18, i64 1, 1 + store %"variant[]" %19, %"variant[]"* %taddr14, align 8 + %20 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* + %21 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %20, i32 0, i32 0 + %lo15 = load i8*, i8** %21, align 8 + %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %20, i32 0, i32 1 + %hi16 = load i64, i64* %22, align 8 + %23 = call i64 @std_io_printfn(i64* %retparam12, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i64 13, i8* %lo15, i64 %hi16) + %not_err17 = icmp eq i64 %23, 0 + br i1 %not_err17, label %after_check18, label %voiderr19 + +after_check18: ; preds = %if.then11 + br label %voiderr19 + +voiderr19: ; preds = %after_check18, %if.then11 + br label %if.exit20 + +if.exit20: ; preds = %voiderr19, %end_block9 + %optval23 = load i64, i64* %a.f, align 8 + %not_err24 = icmp eq i64 %optval23, 0 + br i1 %not_err24, label %after_check25, label %voiderr31 + +after_check25: ; preds = %if.exit20 + %24 = bitcast i32* %a to i8* + %25 = insertvalue %variant undef, i8* %24, 0 + %26 = insertvalue %variant %25, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %27 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots22, i64 0, i64 0 + store %variant %26, %variant* %27, align 16 + %28 = bitcast [1 x %variant]* %varargslots22 to %variant* + %29 = insertvalue %"variant[]" undef, %variant* %28, 0 + %30 = insertvalue %"variant[]" %29, i64 1, 1 + store %"variant[]" %30, %"variant[]"* %taddr26, align 8 + %31 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* + %32 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 0 + %lo27 = load i8*, i8** %32, align 8 + %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %31, i32 0, i32 1 + %hi28 = load i64, i64* %33, align 8 + %34 = call i64 @std_io_printfn(i64* %retparam21, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i64 9, i8* %lo27, i64 %hi28) + %not_err29 = icmp eq i64 %34, 0 + br i1 %not_err29, label %after_check30, label %voiderr31 + +after_check30: ; preds = %after_check25 + br label %voiderr31 + +voiderr31: ; preds = %after_check30, %after_check25, %if.exit20 + %optval34 = load i64, i64* %b.f, align 8 + %not_err35 = icmp eq i64 %optval34, 0 + br i1 %not_err35, label %after_check36, label %voiderr42 + +after_check36: ; preds = %voiderr31 + %35 = bitcast i32* %b to i8* + %36 = insertvalue %variant undef, i8* %35, 0 + %37 = insertvalue %variant %36, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %38 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots33, i64 0, i64 0 + store %variant %37, %variant* %38, align 16 + %39 = bitcast [1 x %variant]* %varargslots33 to %variant* + %40 = insertvalue %"variant[]" undef, %variant* %39, 0 + %41 = insertvalue %"variant[]" %40, i64 1, 1 + store %"variant[]" %41, %"variant[]"* %taddr37, align 8 + %42 = bitcast %"variant[]"* %taddr37 to { i8*, i64 }* + %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 0 + %lo38 = load i8*, i8** %43, align 8 + %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 1 + %hi39 = load i64, i64* %44, align 8 + %45 = call i64 @std_io_printfn(i64* %retparam32, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i64 9, i8* %lo38, i64 %hi39) + %not_err40 = icmp eq i64 %45, 0 + br i1 %not_err40, label %after_check41, label %voiderr42 + +after_check41: ; preds = %after_check36 + br label %voiderr42 + +voiderr42: ; preds = %after_check41, %after_check36, %voiderr31 + 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 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %err8 = alloca i64, align 8 + %retparam17 = alloca i64, align 8 + %varargslots18 = alloca [1 x %variant], align 16 + %taddr19 = alloca %"variant[]", align 8 + %retparam26 = alloca i64, align 8 + %varargslots27 = alloca [1 x %variant], align 16 + %taddr31 = alloca %"variant[]", align 8 + %retparam37 = alloca i64, align 8 + %varargslots38 = alloca [1 x %variant], align 16 + %taddr42 = alloca %"variant[]", align 8 + 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 + %2 = bitcast i64* %err to i8* + %3 = insertvalue %variant undef, i8* %2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %4, %variant* %5, align 16 + %6 = bitcast [1 x %variant]* %varargslots to %variant* + %7 = insertvalue %"variant[]" undef, %variant* %6, 0 + %8 = insertvalue %"variant[]" %7, i64 1, 1 + store %"variant[]" %8, %"variant[]"* %taddr, align 8 + %9 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 + %lo = load i8*, i8** %10, align 8 + %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 + %hi = load i64, i64* %11, align 8 + %12 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) + %not_err6 = icmp eq i64 %12, 0 + br i1 %not_err6, label %after_check7, label %voiderr + +after_check7: ; preds = %if.then + br label %voiderr + +voiderr: ; preds = %after_check7, %if.then + br label %if.exit + +if.exit: ; preds = %voiderr, %end_block + br label %testblock9 + +testblock9: ; preds = %if.exit + %optval10 = load i64, i64* %b.f, align 8 + %not_err11 = icmp eq i64 %optval10, 0 + br i1 %not_err11, label %after_check13, label %assign_optional12 + +assign_optional12: ; preds = %testblock9 + store i64 %optval10, i64* %err8, align 8 + br label %end_block14 + +after_check13: ; preds = %testblock9 + store i64 0, i64* %err8, align 8 + br label %end_block14 + +end_block14: ; preds = %after_check13, %assign_optional12 + %13 = load i64, i64* %err8, align 8 + %neq15 = icmp ne i64 %13, 0 + br i1 %neq15, label %if.then16, label %if.exit25 + +if.then16: ; preds = %end_block14 + %14 = bitcast i64* %err8 to i8* + %15 = insertvalue %variant undef, i8* %14, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots18, i64 0, i64 0 + store %variant %16, %variant* %17, align 16 + %18 = bitcast [1 x %variant]* %varargslots18 to %variant* + %19 = insertvalue %"variant[]" undef, %variant* %18, 0 + %20 = insertvalue %"variant[]" %19, i64 1, 1 + store %"variant[]" %20, %"variant[]"* %taddr19, align 8 + %21 = bitcast %"variant[]"* %taddr19 to { i8*, i64 }* + %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 + %lo20 = load i8*, i8** %22, align 8 + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 + %hi21 = load i64, i64* %23, align 8 + %24 = call i64 @std_io_printfn(i64* %retparam17, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.5, i32 0, i32 0), i64 13, i8* %lo20, i64 %hi21) + %not_err22 = icmp eq i64 %24, 0 + br i1 %not_err22, label %after_check23, label %voiderr24 + +after_check23: ; preds = %if.then16 + br label %voiderr24 + +voiderr24: ; preds = %after_check23, %if.then16 + br label %if.exit25 + +if.exit25: ; preds = %voiderr24, %end_block14 + %optval28 = load i64, i64* %a.f, align 8 + %not_err29 = icmp eq i64 %optval28, 0 + br i1 %not_err29, label %after_check30, label %voiderr36 + +after_check30: ; preds = %if.exit25 + %25 = bitcast i32* %a to i8* + %26 = insertvalue %variant undef, i8* %25, 0 + %27 = insertvalue %variant %26, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %28 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots27, i64 0, i64 0 + store %variant %27, %variant* %28, align 16 + %29 = bitcast [1 x %variant]* %varargslots27 to %variant* + %30 = insertvalue %"variant[]" undef, %variant* %29, 0 + %31 = insertvalue %"variant[]" %30, i64 1, 1 + store %"variant[]" %31, %"variant[]"* %taddr31, align 8 + %32 = bitcast %"variant[]"* %taddr31 to { i8*, i64 }* + %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 0 + %lo32 = load i8*, i8** %33, align 8 + %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 1 + %hi33 = load i64, i64* %34, align 8 + %35 = call i64 @std_io_printfn(i64* %retparam26, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i64 9, i8* %lo32, i64 %hi33) + %not_err34 = icmp eq i64 %35, 0 + br i1 %not_err34, label %after_check35, label %voiderr36 + +after_check35: ; preds = %after_check30 + br label %voiderr36 + +voiderr36: ; preds = %after_check35, %after_check30, %if.exit25 + %optval39 = load i64, i64* %b.f, align 8 + %not_err40 = icmp eq i64 %optval39, 0 + br i1 %not_err40, label %after_check41, label %voiderr47 + +after_check41: ; preds = %voiderr36 + %36 = bitcast i32* %b to i8* + %37 = insertvalue %variant undef, i8* %36, 0 + %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %39 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots38, i64 0, i64 0 + store %variant %38, %variant* %39, align 16 + %40 = bitcast [1 x %variant]* %varargslots38 to %variant* + %41 = insertvalue %"variant[]" undef, %variant* %40, 0 + %42 = insertvalue %"variant[]" %41, i64 1, 1 + store %"variant[]" %42, %"variant[]"* %taddr42, align 8 + %43 = bitcast %"variant[]"* %taddr42 to { i8*, i64 }* + %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0 + %lo43 = load i8*, i8** %44, align 8 + %45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1 + %hi44 = load i64, i64* %45, align 8 + %46 = call i64 @std_io_printfn(i64* %retparam37, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.7, i32 0, i32 0), i64 9, i8* %lo43, i64 %hi44) + %not_err45 = icmp eq i64 %46, 0 + br i1 %not_err45, label %after_check46, label %voiderr47 + +after_check46: ; preds = %after_check41 + br label %voiderr47 + +voiderr47: ; preds = %after_check46, %after_check41, %voiderr36 + 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 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %err8 = alloca i64, align 8 + %retparam17 = alloca i64, align 8 + %varargslots18 = alloca [1 x %variant], align 16 + %taddr19 = alloca %"variant[]", align 8 + %retparam26 = alloca i64, align 8 + %varargslots27 = alloca [1 x %variant], align 16 + %taddr31 = alloca %"variant[]", align 8 + %retparam37 = alloca i64, align 8 + %varargslots38 = alloca [1 x %variant], align 16 + %taddr42 = alloca %"variant[]", align 8 + 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 + %2 = bitcast i64* %err to i8* + %3 = insertvalue %variant undef, i8* %2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %4, %variant* %5, align 16 + %6 = bitcast [1 x %variant]* %varargslots to %variant* + %7 = insertvalue %"variant[]" undef, %variant* %6, 0 + %8 = insertvalue %"variant[]" %7, i64 1, 1 + store %"variant[]" %8, %"variant[]"* %taddr, align 8 + %9 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 + %lo = load i8*, i8** %10, align 8 + %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 + %hi = load i64, i64* %11, align 8 + %12 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.8, i32 0, i32 0), i64 13, i8* %lo, i64 %hi) + %not_err6 = icmp eq i64 %12, 0 + br i1 %not_err6, label %after_check7, label %voiderr + +after_check7: ; preds = %if.then + br label %voiderr + +voiderr: ; preds = %after_check7, %if.then + br label %if.exit + +if.exit: ; preds = %voiderr, %end_block + br label %testblock9 + +testblock9: ; preds = %if.exit + %optval10 = load i64, i64* %b.f, align 8 + %not_err11 = icmp eq i64 %optval10, 0 + br i1 %not_err11, label %after_check13, label %assign_optional12 + +assign_optional12: ; preds = %testblock9 + store i64 %optval10, i64* %err8, align 8 + br label %end_block14 + +after_check13: ; preds = %testblock9 + store i64 0, i64* %err8, align 8 + br label %end_block14 + +end_block14: ; preds = %after_check13, %assign_optional12 + %13 = load i64, i64* %err8, align 8 + %neq15 = icmp ne i64 %13, 0 + br i1 %neq15, label %if.then16, label %if.exit25 + +if.then16: ; preds = %end_block14 + %14 = bitcast i64* %err8 to i8* + %15 = insertvalue %variant undef, i8* %14, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots18, i64 0, i64 0 + store %variant %16, %variant* %17, align 16 + %18 = bitcast [1 x %variant]* %varargslots18 to %variant* + %19 = insertvalue %"variant[]" undef, %variant* %18, 0 + %20 = insertvalue %"variant[]" %19, i64 1, 1 + store %"variant[]" %20, %"variant[]"* %taddr19, align 8 + %21 = bitcast %"variant[]"* %taddr19 to { i8*, i64 }* + %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 + %lo20 = load i8*, i8** %22, align 8 + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 + %hi21 = load i64, i64* %23, align 8 + %24 = call i64 @std_io_printfn(i64* %retparam17, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.9, i32 0, i32 0), i64 13, i8* %lo20, i64 %hi21) + %not_err22 = icmp eq i64 %24, 0 + br i1 %not_err22, label %after_check23, label %voiderr24 + +after_check23: ; preds = %if.then16 + br label %voiderr24 + +voiderr24: ; preds = %after_check23, %if.then16 + br label %if.exit25 + +if.exit25: ; preds = %voiderr24, %end_block14 + %optval28 = load i64, i64* %a.f, align 8 + %not_err29 = icmp eq i64 %optval28, 0 + br i1 %not_err29, label %after_check30, label %voiderr36 + +after_check30: ; preds = %if.exit25 + %25 = bitcast i32* %a to i8* + %26 = insertvalue %variant undef, i8* %25, 0 + %27 = insertvalue %variant %26, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %28 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots27, i64 0, i64 0 + store %variant %27, %variant* %28, align 16 + %29 = bitcast [1 x %variant]* %varargslots27 to %variant* + %30 = insertvalue %"variant[]" undef, %variant* %29, 0 + %31 = insertvalue %"variant[]" %30, i64 1, 1 + store %"variant[]" %31, %"variant[]"* %taddr31, align 8 + %32 = bitcast %"variant[]"* %taddr31 to { i8*, i64 }* + %33 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 0 + %lo32 = load i8*, i8** %33, align 8 + %34 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %32, i32 0, i32 1 + %hi33 = load i64, i64* %34, align 8 + %35 = call i64 @std_io_printfn(i64* %retparam26, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i32 0, i32 0), i64 9, i8* %lo32, i64 %hi33) + %not_err34 = icmp eq i64 %35, 0 + br i1 %not_err34, label %after_check35, label %voiderr36 + +after_check35: ; preds = %after_check30 + br label %voiderr36 + +voiderr36: ; preds = %after_check35, %after_check30, %if.exit25 + %optval39 = load i64, i64* %b.f, align 8 + %not_err40 = icmp eq i64 %optval39, 0 + br i1 %not_err40, label %after_check41, label %voiderr47 + +after_check41: ; preds = %voiderr36 + %36 = bitcast i32* %b to i8* + %37 = insertvalue %variant undef, i8* %36, 0 + %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %39 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots38, i64 0, i64 0 + store %variant %38, %variant* %39, align 16 + %40 = bitcast [1 x %variant]* %varargslots38 to %variant* + %41 = insertvalue %"variant[]" undef, %variant* %40, 0 + %42 = insertvalue %"variant[]" %41, i64 1, 1 + store %"variant[]" %42, %"variant[]"* %taddr42, align 8 + %43 = bitcast %"variant[]"* %taddr42 to { i8*, i64 }* + %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0 + %lo43 = load i8*, i8** %44, align 8 + %45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1 + %hi44 = load i64, i64* %45, align 8 + %46 = call i64 @std_io_printfn(i64* %retparam37, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0), i64 9, i8* %lo43, i64 %hi44) + %not_err45 = icmp eq i64 %46, 0 + br i1 %not_err45, label %after_check46, label %voiderr47 + +after_check46: ; preds = %after_check41 + br label %voiderr47 + +voiderr47: ; preds = %after_check46, %after_check41, %voiderr36 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/errors/optional_inits.c3t b/test/test_suite14/errors/optional_inits.c3t similarity index 74% rename from test/test_suite2/errors/optional_inits.c3t rename to test/test_suite14/errors/optional_inits.c3t index e21850667..4fe593f6c 100644 --- a/test/test_suite2/errors/optional_inits.c3t +++ b/test/test_suite14/errors/optional_inits.c3t @@ -40,27 +40,30 @@ entry: %y = alloca %Bar, align 4 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i64 ptrtoint (ptr @"test_Foo$MY_VAL1" to i64), ptr %x.f, align 8 - %optval = load i64, ptr %x.f, align 8 + store i64 ptrtoint (%.fault* @"test_Foo$MY_VAL1" to i64), i64* %x.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, ptr %error_var, align 8 + store i64 %optval, i64* %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, ptr %error_var, align 8 + %0 = load i64, i64* %error_var, align 8 ret i64 %0 noerr_block: ; preds = %after_check - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 %x, i32 4, i1 false) + %1 = bitcast %Bar* %y to i8* + %2 = bitcast %Bar* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 4, i1 false) ret i64 0 } +; Function Attrs: nounwind define i64 @test_test2() #0 { entry: %x = alloca %Bar, align 4 @@ -68,25 +71,28 @@ entry: %y = alloca %Bar, align 4 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i32 0, ptr %x, align 4 - store i64 0, ptr %x.f, align 8 - %optval = load i64, ptr %x.f, align 8 + %0 = bitcast %Bar* %x to i32* + store i32 0, i32* %0, align 4 + store i64 0, i64* %x.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, ptr %error_var, align 8 + store i64 %optval, i64* %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, ptr %error_var, align 8 - ret i64 %0 + %1 = load i64, i64* %error_var, align 8 + ret i64 %1 noerr_block: ; preds = %after_check - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 %x, i32 4, i1 false) + %2 = bitcast %Bar* %y to i8* + %3 = bitcast %Bar* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 %3, i32 4, i1 false) ret i64 0 } diff --git a/test/test_suite2/errors/optional_taddr_and_access.c3t b/test/test_suite14/errors/optional_taddr_and_access.c3t similarity index 57% rename from test/test_suite2/errors/optional_taddr_and_access.c3t rename to test/test_suite14/errors/optional_taddr_and_access.c3t index e3ccb5135..b50d016a4 100644 --- a/test/test_suite2/errors/optional_taddr_and_access.c3t +++ b/test/test_suite14/errors/optional_taddr_and_access.c3t @@ -28,91 +28,92 @@ fn void main() %Foo = type { i32, i32 } @"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"test_MyErr$FOO" = linkonce constant %.fault { i64 ptrtoint (ptr @"ct$test_MyErr" to i64), %"char[]" { ptr @.fault, i64 3 } }, align 8 +@"test_MyErr$FOO" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$test_MyErr" to i64), %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.fault, i64 0, i64 0), i64 3 } }, align 8 +@.fault = internal constant [4 x i8] c"FOO\00", align 1 @"ct$test_MyErr" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @.str.1 = private unnamed_addr constant [17 x i8] c"Not visible: %d\0A\00", align 1 ; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 +declare i32 @printf(i8*, ...) #0 ; Function Attrs: nounwind define void @test_main() #0 { entry: %z = alloca i32, align 4 %z.f = alloca i64, align 8 - %w = alloca ptr, align 8 + %w = alloca %Foo*, align 8 %w.f = alloca i64, align 8 %literal = alloca %Foo, align 4 %literal6 = alloca %Foo, align 4 - store i32 2, ptr %z, align 4 - store i64 0, ptr %z.f, align 8 - %0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 - %optval = load i64, ptr %z.f, align 8 + store i32 2, i32* %z, align 4 + store i64 0, i64* %z.f, align 8 + %0 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 + %optval = load i64, i64* %z.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, ptr %w.f, align 8 + store i64 %optval, i64* %w.f, align 8 br label %after_assign after_check: ; preds = %entry - %1 = load i32, ptr %z, align 4 - store i32 %1, ptr %0, align 4 - %2 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 - store i32 0, ptr %2, align 4 - store ptr %literal, ptr %w, align 8 - store i64 0, ptr %w.f, align 8 + %1 = load i32, i32* %z, align 4 + store i32 %1, i32* %0, align 4 + %2 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 + store i32 0, i32* %2, align 4 + store %Foo* %literal, %Foo** %w, align 8 + store i64 0, i64* %w.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %optval1 = load i64, ptr %w.f, align 8 + %optval1 = load i64, i64* %w.f, align 8 %not_err2 = icmp eq i64 %optval1, 0 br i1 %not_err2, label %after_check3, label %voiderr after_check3: ; preds = %after_assign - %3 = load ptr, ptr %w, align 8 - %4 = getelementptr inbounds %Foo, ptr %3, i32 0, i32 0 - %5 = load i32, ptr %4, align 8 - %6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %5) + %3 = load %Foo*, %Foo** %w, align 8 + %4 = getelementptr inbounds %Foo, %Foo* %3, i32 0, i32 0 + %5 = load i32, i32* %4, align 8 + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %5) br label %voiderr voiderr: ; preds = %after_check3, %after_assign - store i64 ptrtoint (ptr @"test_MyErr$FOO" to i64), ptr %z.f, align 8 + store i64 ptrtoint (%.fault* @"test_MyErr$FOO" to i64), i64* %z.f, align 8 br label %voiderr5 voiderr5: ; preds = %voiderr - %7 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 0 - %optval7 = load i64, ptr %z.f, align 8 + %7 = getelementptr inbounds %Foo, %Foo* %literal6, i32 0, i32 0 + %optval7 = load i64, i64* %z.f, align 8 %not_err8 = icmp eq i64 %optval7, 0 br i1 %not_err8, label %after_check10, label %assign_optional9 assign_optional9: ; preds = %voiderr5 - store i64 %optval7, ptr %w.f, align 8 + store i64 %optval7, i64* %w.f, align 8 br label %after_assign11 after_check10: ; preds = %voiderr5 - %8 = load i32, ptr %z, align 4 - store i32 %8, ptr %7, align 4 - %9 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 1 - store i32 0, ptr %9, align 4 - store ptr %literal6, ptr %w, align 8 - store i64 0, ptr %w.f, align 8 + %8 = load i32, i32* %z, align 4 + store i32 %8, i32* %7, align 4 + %9 = getelementptr inbounds %Foo, %Foo* %literal6, i32 0, i32 1 + store i32 0, i32* %9, align 4 + store %Foo* %literal6, %Foo** %w, align 8 + store i64 0, i64* %w.f, align 8 br label %after_assign11 after_assign11: ; preds = %after_check10, %assign_optional9 br label %voiderr12 voiderr12: ; preds = %after_assign11 - %optval13 = load i64, ptr %w.f, align 8 + %optval13 = load i64, i64* %w.f, align 8 %not_err14 = icmp eq i64 %optval13, 0 br i1 %not_err14, label %after_check15, label %voiderr16 after_check15: ; preds = %voiderr12 - %10 = load ptr, ptr %w, align 8 - %11 = getelementptr inbounds %Foo, ptr %10, i32 0, i32 0 - %12 = load i32, ptr %11, align 8 - %13 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %12) + %10 = load %Foo*, %Foo** %w, align 8 + %11 = getelementptr inbounds %Foo, %Foo* %10, i32 0, i32 0 + %12 = load i32, i32* %11, align 8 + %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %12) br label %voiderr16 voiderr16: ; preds = %after_check15, %voiderr12 diff --git a/test/test_suite2/errors/optional_untyped_list.c3 b/test/test_suite14/errors/optional_untyped_list.c3 similarity index 100% rename from test/test_suite2/errors/optional_untyped_list.c3 rename to test/test_suite14/errors/optional_untyped_list.c3 diff --git a/test/test_suite14/errors/optional_with_optional.c3t b/test/test_suite14/errors/optional_with_optional.c3t new file mode 100644 index 000000000..7959b1042 --- /dev/null +++ b/test/test_suite14/errors/optional_with_optional.c3t @@ -0,0 +1,382 @@ +// #target: macos-x64 +module test; +import std::io; + +fault Foo { ABC, DEF } + +fn void main() +{ + io::printfn("1:%d", get_a(1) ?? get_b(4) ?? -1); + io::printfn("2:%d", get_a(2) ?? get_b(4) ?? -1); + io::printfn("3:%d", get_a(1) ?? get_b(5) ?? -1); + io::printfn("4:%s", catch(Foo.ABC! ?? Foo.DEF!)); + io::printfn("5:%s", Foo.ABC! ?? 3); + io::printfn("6:%s", catch((3 > 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); + io::printfn("7:%s", catch((3 < 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); + long x = Foo.DEF! ?? 3; + io::printfn("8:%s", x); + int! xy = Foo.ABC! ?? Foo.DEF!; +} + +fn int! get_a(int x) +{ + if (x % 2) return Foo.ABC!; + return x * 2; +} + +fn int! get_b(int x) +{ + if (x % 2 == 0) return Foo.ABC!; + return x * 2; +} + +/* #expect: test.ll + + +define void @test_main() #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %retparam1 = alloca i32, align 4 + %retparam2 = alloca i32, align 4 + %taddr = alloca i32, align 4 + %taddr8 = alloca %"variant[]", align 8 + %retparam11 = alloca i64, align 8 + %varargslots12 = alloca [1 x %variant], align 16 + %retparam13 = alloca i32, align 4 + %retparam17 = alloca i32, align 4 + %taddr25 = alloca i32, align 4 + %taddr26 = alloca %"variant[]", align 8 + %retparam32 = alloca i64, align 8 + %varargslots33 = alloca [1 x %variant], align 16 + %retparam34 = alloca i32, align 4 + %retparam38 = alloca i32, align 4 + %taddr46 = alloca i32, align 4 + %taddr47 = alloca %"variant[]", align 8 + %retparam53 = alloca i64, align 8 + %varargslots54 = alloca [1 x %variant], align 16 + %taddr55 = alloca i64, align 8 + %taddr56 = alloca %"variant[]", align 8 + %retparam62 = alloca i64, align 8 + %varargslots63 = alloca [1 x %variant], align 16 + %taddr64 = alloca i32, align 4 + %taddr65 = alloca %"variant[]", align 8 + %retparam71 = alloca i64, align 8 + %varargslots72 = alloca [1 x %variant], align 16 + %taddr73 = alloca i64, align 8 + %taddr74 = alloca %"variant[]", align 8 + %retparam80 = alloca i64, align 8 + %varargslots81 = alloca [1 x %variant], align 16 + %error_var = alloca i64, align 8 + %taddr84 = alloca %"variant[]", align 8 + %x = alloca i64, align 8 + %retparam90 = alloca i64, align 8 + %varargslots91 = alloca [1 x %variant], align 16 + %taddr92 = alloca %"variant[]", align 8 + %xy = alloca i32, align 4 + %xy.f = alloca i64, align 8 + %0 = call i64 @test_get_a(i32* %retparam1, i32 1) + %not_err = icmp eq i64 %0, 0 + br i1 %not_err, label %after_check, label %else_block + +after_check: ; preds = %entry + %1 = load i32, i32* %retparam1, align 4 + br label %phi_block + +else_block: ; preds = %entry + %2 = call i64 @test_get_b(i32* %retparam2, i32 4) + %not_err3 = icmp eq i64 %2, 0 + br i1 %not_err3, label %after_check4, label %else_block5 + +after_check4: ; preds = %else_block + %3 = load i32, i32* %retparam2, align 4 + br label %phi_block + +phi_block: ; preds = %after_check4, %after_check + %val = phi i32 [ %1, %after_check ], [ %3, %after_check4 ] + br label %phi_block6 + +else_block5: ; preds = %else_block + br label %phi_block6 + +phi_block6: ; preds = %else_block5, %phi_block + %val7 = phi i32 [ %val, %phi_block ], [ -1, %else_block5 ] + store i32 %val7, i32* %taddr, align 4 + %4 = bitcast i32* %taddr to i8* + %5 = insertvalue %variant undef, i8* %4, 0 + %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$int" 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 = bitcast [1 x %variant]* %varargslots to %variant* + %9 = insertvalue %"variant[]" undef, %variant* %8, 0 + %10 = insertvalue %"variant[]" %9, i64 1, 1 + store %"variant[]" %10, %"variant[]"* %taddr8, align 8 + %11 = bitcast %"variant[]"* %taddr8 to { i8*, i64 }* + %12 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %11, i32 0, i32 0 + %lo = load i8*, i8** %12, align 8 + %13 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %11, i32 0, i32 1 + %hi = load i64, i64* %13, align 8 + %14 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 4, i8* %lo, i64 %hi) + %not_err9 = icmp eq i64 %14, 0 + br i1 %not_err9, label %after_check10, label %voiderr + +after_check10: ; preds = %phi_block6 + br label %voiderr + +voiderr: ; preds = %after_check10, %phi_block6 + %15 = call i64 @test_get_a(i32* %retparam13, i32 2) + %not_err14 = icmp eq i64 %15, 0 + br i1 %not_err14, label %after_check15, label %else_block16 + +after_check15: ; preds = %voiderr + %16 = load i32, i32* %retparam13, align 4 + br label %phi_block20 + +else_block16: ; preds = %voiderr + %17 = call i64 @test_get_b(i32* %retparam17, i32 4) + %not_err18 = icmp eq i64 %17, 0 + br i1 %not_err18, label %after_check19, label %else_block22 + +after_check19: ; preds = %else_block16 + %18 = load i32, i32* %retparam17, align 4 + br label %phi_block20 + +phi_block20: ; preds = %after_check19, %after_check15 + %val21 = phi i32 [ %16, %after_check15 ], [ %18, %after_check19 ] + br label %phi_block23 + +else_block22: ; preds = %else_block16 + br label %phi_block23 + +phi_block23: ; preds = %else_block22, %phi_block20 + %val24 = phi i32 [ %val21, %phi_block20 ], [ -1, %else_block22 ] + store i32 %val24, i32* %taddr25, align 4 + %19 = bitcast i32* %taddr25 to i8* + %20 = insertvalue %variant undef, i8* %19, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %22 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 + store %variant %21, %variant* %22, align 16 + %23 = bitcast [1 x %variant]* %varargslots12 to %variant* + %24 = insertvalue %"variant[]" undef, %variant* %23, 0 + %25 = insertvalue %"variant[]" %24, i64 1, 1 + store %"variant[]" %25, %"variant[]"* %taddr26, align 8 + %26 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* + %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0 + %lo27 = load i8*, i8** %27, align 8 + %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1 + %hi28 = load i64, i64* %28, align 8 + %29 = call i64 @std_io_printfn(i64* %retparam11, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i64 4, i8* %lo27, i64 %hi28) + %not_err29 = icmp eq i64 %29, 0 + br i1 %not_err29, label %after_check30, label %voiderr31 + +after_check30: ; preds = %phi_block23 + br label %voiderr31 + +voiderr31: ; preds = %after_check30, %phi_block23 + %30 = call i64 @test_get_a(i32* %retparam34, i32 1) + %not_err35 = icmp eq i64 %30, 0 + br i1 %not_err35, label %after_check36, label %else_block37 + +after_check36: ; preds = %voiderr31 + %31 = load i32, i32* %retparam34, align 4 + br label %phi_block41 + +else_block37: ; preds = %voiderr31 + %32 = call i64 @test_get_b(i32* %retparam38, i32 5) + %not_err39 = icmp eq i64 %32, 0 + br i1 %not_err39, label %after_check40, label %else_block43 + +after_check40: ; preds = %else_block37 + %33 = load i32, i32* %retparam38, align 4 + br label %phi_block41 + +phi_block41: ; preds = %after_check40, %after_check36 + %val42 = phi i32 [ %31, %after_check36 ], [ %33, %after_check40 ] + br label %phi_block44 + +else_block43: ; preds = %else_block37 + br label %phi_block44 + +phi_block44: ; preds = %else_block43, %phi_block41 + %val45 = phi i32 [ %val42, %phi_block41 ], [ -1, %else_block43 ] + store i32 %val45, i32* %taddr46, align 4 + %34 = bitcast i32* %taddr46 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]* %varargslots33, i64 0, i64 0 + store %variant %36, %variant* %37, align 16 + %38 = bitcast [1 x %variant]* %varargslots33 to %variant* + %39 = insertvalue %"variant[]" undef, %variant* %38, 0 + %40 = insertvalue %"variant[]" %39, i64 1, 1 + store %"variant[]" %40, %"variant[]"* %taddr47, align 8 + %41 = bitcast %"variant[]"* %taddr47 to { i8*, i64 }* + %42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0 + %lo48 = load i8*, i8** %42, align 8 + %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1 + %hi49 = load i64, i64* %43, align 8 + %44 = call i64 @std_io_printfn(i64* %retparam32, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i32 0, i32 0), i64 4, i8* %lo48, i64 %hi49) + %not_err50 = icmp eq i64 %44, 0 + br i1 %not_err50, label %after_check51, label %voiderr52 + +after_check51: ; preds = %phi_block44 + br label %voiderr52 + +voiderr52: ; preds = %after_check51, %phi_block44 + store i64 ptrtoint (%.fault* @"test_Foo$DEF" to i64), i64* %taddr55, align 8 + %45 = bitcast i64* %taddr55 to i8* + %46 = insertvalue %variant undef, i8* %45, 0 + %47 = insertvalue %variant %46, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %48 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots54, i64 0, i64 0 + store %variant %47, %variant* %48, align 16 + %49 = bitcast [1 x %variant]* %varargslots54 to %variant* + %50 = insertvalue %"variant[]" undef, %variant* %49, 0 + %51 = insertvalue %"variant[]" %50, i64 1, 1 + store %"variant[]" %51, %"variant[]"* %taddr56, align 8 + %52 = bitcast %"variant[]"* %taddr56 to { i8*, i64 }* + %53 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 0 + %lo57 = load i8*, i8** %53, align 8 + %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 1 + %hi58 = load i64, i64* %54, align 8 + %55 = call i64 @std_io_printfn(i64* %retparam53, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0), i64 4, i8* %lo57, i64 %hi58) + %not_err59 = icmp eq i64 %55, 0 + br i1 %not_err59, label %after_check60, label %voiderr61 + +after_check60: ; preds = %voiderr52 + br label %voiderr61 + +voiderr61: ; preds = %after_check60, %voiderr52 + store i32 3, i32* %taddr64, align 4 + %56 = bitcast i32* %taddr64 to i8* + %57 = insertvalue %variant undef, i8* %56, 0 + %58 = insertvalue %variant %57, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %59 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots63, i64 0, i64 0 + store %variant %58, %variant* %59, align 16 + %60 = bitcast [1 x %variant]* %varargslots63 to %variant* + %61 = insertvalue %"variant[]" undef, %variant* %60, 0 + %62 = insertvalue %"variant[]" %61, i64 1, 1 + store %"variant[]" %62, %"variant[]"* %taddr65, align 8 + %63 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* + %64 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 0 + %lo66 = load i8*, i8** %64, align 8 + %65 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %63, i32 0, i32 1 + %hi67 = load i64, i64* %65, align 8 + %66 = call i64 @std_io_printfn(i64* %retparam62, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0), i64 4, i8* %lo66, i64 %hi67) + %not_err68 = icmp eq i64 %66, 0 + br i1 %not_err68, label %after_check69, label %voiderr70 + +after_check69: ; preds = %voiderr61 + br label %voiderr70 + +voiderr70: ; preds = %after_check69, %voiderr61 + store i64 ptrtoint (%.fault* @"test_Foo$DEF" to i64), i64* %taddr73, align 8 + %67 = bitcast i64* %taddr73 to i8* + %68 = insertvalue %variant undef, i8* %67, 0 + %69 = insertvalue %variant %68, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %70 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots72, i64 0, i64 0 + store %variant %69, %variant* %70, align 16 + %71 = bitcast [1 x %variant]* %varargslots72 to %variant* + %72 = insertvalue %"variant[]" undef, %variant* %71, 0 + %73 = insertvalue %"variant[]" %72, i64 1, 1 + store %"variant[]" %73, %"variant[]"* %taddr74, align 8 + %74 = bitcast %"variant[]"* %taddr74 to { i8*, i64 }* + %75 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %74, i32 0, i32 0 + %lo75 = load i8*, i8** %75, align 8 + %76 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %74, i32 0, i32 1 + %hi76 = load i64, i64* %76, align 8 + %77 = call i64 @std_io_printfn(i64* %retparam71, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0), i64 4, i8* %lo75, i64 %hi76) + %not_err77 = icmp eq i64 %77, 0 + br i1 %not_err77, label %after_check78, label %voiderr79 + +after_check78: ; preds = %voiderr70 + br label %voiderr79 + +voiderr79: ; preds = %after_check78, %voiderr70 + store i64 0, i64* %error_var, align 8 + br label %phi_block83 + +phi_block83: ; preds = %voiderr79 + br label %noerr_block + +noerr_block: ; preds = %phi_block83 + %78 = bitcast i64* %error_var to i8* + %79 = insertvalue %variant undef, i8* %78, 0 + %80 = insertvalue %variant %79, i64 ptrtoint (%.introspect* @"ct$anyerr" to i64), 1 + %81 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots81, i64 0, i64 0 + store %variant %80, %variant* %81, align 16 + %82 = bitcast [1 x %variant]* %varargslots81 to %variant* + %83 = insertvalue %"variant[]" undef, %variant* %82, 0 + %84 = insertvalue %"variant[]" %83, i64 1, 1 + store %"variant[]" %84, %"variant[]"* %taddr84, align 8 + %85 = bitcast %"variant[]"* %taddr84 to { i8*, i64 }* + %86 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %85, i32 0, i32 0 + %lo85 = load i8*, i8** %86, align 8 + %87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %85, i32 0, i32 1 + %hi86 = load i64, i64* %87, align 8 + %88 = call i64 @std_io_printfn(i64* %retparam80, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i32 0, i32 0), i64 4, i8* %lo85, i64 %hi86) + %not_err87 = icmp eq i64 %88, 0 + br i1 %not_err87, label %after_check88, label %voiderr89 + +after_check88: ; preds = %noerr_block + br label %voiderr89 + +voiderr89: ; preds = %after_check88, %noerr_block + store i64 3, i64* %x, align 8 + %89 = bitcast i64* %x to i8* + %90 = insertvalue %variant undef, i8* %89, 0 + %91 = insertvalue %variant %90, i64 ptrtoint (%.introspect* @"ct$long" to i64), 1 + %92 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots91, i64 0, i64 0 + store %variant %91, %variant* %92, align 16 + %93 = bitcast [1 x %variant]* %varargslots91 to %variant* + %94 = insertvalue %"variant[]" undef, %variant* %93, 0 + %95 = insertvalue %"variant[]" %94, i64 1, 1 + store %"variant[]" %95, %"variant[]"* %taddr92, align 8 + %96 = bitcast %"variant[]"* %taddr92 to { i8*, i64 }* + %97 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %96, i32 0, i32 0 + %lo93 = load i8*, i8** %97, align 8 + %98 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %96, i32 0, i32 1 + %hi94 = load i64, i64* %98, align 8 + %99 = call i64 @std_io_printfn(i64* %retparam90, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.8, i32 0, i32 0), i64 4, i8* %lo93, i64 %hi94) + %not_err95 = icmp eq i64 %99, 0 + br i1 %not_err95, label %after_check96, label %voiderr97 + +after_check96: ; preds = %voiderr89 + br label %voiderr97 + +voiderr97: ; preds = %after_check96, %voiderr89 + store i64 ptrtoint (%.fault* @"test_Foo$DEF" to i64), i64* %xy.f, align 8 + ret void +} + +; Function Attrs: nounwind +define i64 @test_get_a(i32* %0, i32 %1) #0 { +entry: + %reterr = alloca i64, align 8 + %smod = srem i32 %1, 2 + %intbool = icmp ne i32 %smod, 0 + br i1 %intbool, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i64 ptrtoint (%.fault* @"test_Foo$ABC" to i64) + +if.exit: ; preds = %entry + %mul = mul i32 %1, 2 + store i32 %mul, i32* %0, align 4 + ret i64 0 +} + +; Function Attrs: nounwind +define i64 @test_get_b(i32* %0, i32 %1) #0 { +entry: + %reterr = alloca i64, align 8 + %smod = srem i32 %1, 2 + %eq = icmp eq i32 %smod, 0 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i64 ptrtoint (%.fault* @"test_Foo$ABC" to i64) + +if.exit: ; preds = %entry + %mul = mul i32 %1, 2 + store i32 %mul, i32* %0, align 4 + ret i64 0 +} diff --git a/test/test_suite14/errors/or_and_rethrow.c3t b/test/test_suite14/errors/or_and_rethrow.c3t new file mode 100644 index 000000000..9e6b106cc --- /dev/null +++ b/test/test_suite14/errors/or_and_rethrow.c3t @@ -0,0 +1,185 @@ +// #target: macos-x64 +module foo; +import std::io; + +fault Foo { ABC } + +fn void blurb() { io::println("Blurb");} + +macro int! tester() +{ + defer blurb(); + return Foo.ABC!; +} +fn void! test(int x) +{ + io::printfn("test(%d)", x); + if (x || (tester()?)) io::println("Ok1"); + io::println("Test next"); + if (tester()? || x) io::println("Ok?"); + io::println("Test ok"); +} + +fn void! test2(int x) +{ + io::printfn("test2(%d)", x); + if (x && (tester()?)) io::println("Ok1"); + io::println("Test next"); + if ((tester()?) && x) io::println("Ok?"); + io::println("Test ok"); +} + +fn void main() +{ + anyerr a = test(0); + anyerr b = test(1); + anyerr c = test2(0); + anyerr d = test2(1); +} + +/* #expect: foo.ll + +define i64 @foo_test(i32 %0) #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + %error_var = alloca i64, align 8 + %blockret = alloca i32, align 4 + %error_var2 = alloca i64, align 8 + %blockret3 = alloca i32, align 4 + %reterr = alloca i64, align 8 + store i32 %0, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr1, align 8 + %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %11, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %intbool = icmp ne i32 %0, 0 + br i1 %intbool, label %or.phi, label %or.rhs + +or.rhs: ; preds = %voiderr + store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var, align 8 + br label %opt_block_cleanup + +opt_block_cleanup: ; preds = %or.rhs + call void @foo_blurb() + br label %guard_block + +guard_block: ; preds = %opt_block_cleanup + %12 = load i64, i64* %error_var, align 8 + ret i64 %12 + +or.phi: ; preds = %voiderr + br label %if.then + +if.then: ; preds = %or.phi + %13 = call i32 @std_io_println(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0)) #1 + br label %if.exit + +if.exit: ; preds = %if.then + %14 = call i32 @std_io_println(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0)) #1 + store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var2, align 8 + br label %opt_block_cleanup4 + +opt_block_cleanup4: ; preds = %if.exit + call void @foo_blurb() + br label %guard_block5 + +guard_block5: ; preds = %opt_block_cleanup4 + %15 = load i64, i64* %error_var2, align 8 + ret i64 %15 + +if.exit7: ; No predecessors! + %16 = call i32 @std_io_println(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i32 0, i32 0)) #1 + ret i64 0 +} + +; Function Attrs: nounwind +define i64 @foo_test2(i32 %0) #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + %error_var = alloca i64, align 8 + %blockret = alloca i32, align 4 + %error_var2 = alloca i64, align 8 + %blockret3 = alloca i32, align 4 + %reterr = alloca i64, align 8 + store i32 %0, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr1, align 8 + %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i64 9, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %11, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %intbool = icmp ne i32 %0, 0 + br i1 %intbool, label %and.rhs, label %and.phi + +and.rhs: ; preds = %voiderr + store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var, align 8 + br label %opt_block_cleanup + +opt_block_cleanup: ; preds = %and.rhs + call void @foo_blurb() + br label %guard_block + +guard_block: ; preds = %opt_block_cleanup + %12 = load i64, i64* %error_var, align 8 + ret i64 %12 + +and.phi: ; preds = %voiderr + br label %if.exit + +if.exit: ; preds = %and.phi + %13 = call i32 @std_io_println(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.7, i32 0, i32 0)) #1 + store i64 ptrtoint (%.fault* @"foo_Foo$ABC" to i64), i64* %error_var2, align 8 + br label %opt_block_cleanup4 + +opt_block_cleanup4: ; preds = %if.exit + call void @foo_blurb() + br label %guard_block5 + +guard_block5: ; preds = %opt_block_cleanup4 + %14 = load i64, i64* %error_var2, align 8 + ret i64 %14 + +if.exit6: ; No predecessors! + %15 = call i32 @std_io_println(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.8, i32 0, i32 0)) #1 + ret i64 0 +} diff --git a/test/test_suite2/errors/or_err_bool.c3t b/test/test_suite14/errors/or_err_bool.c3t similarity index 82% rename from test/test_suite2/errors/or_err_bool.c3t rename to test/test_suite14/errors/or_err_bool.c3t index 0c5ebd276..26a68c9d7 100644 --- a/test/test_suite2/errors/or_err_bool.c3t +++ b/test/test_suite14/errors/or_err_bool.c3t @@ -14,14 +14,14 @@ define void @test_tester() #0 { entry: %x = alloca i8, align 1 %x.f = alloca i64, align 8 - store i8 0, ptr %x, align 1 - store i64 0, ptr %x.f, align 8 - %optval = load i64, ptr %x.f, align 8 + store i8 0, i8* %x, align 1 + store i64 0, i64* %x.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 %else_block after_check: ; preds = %entry - %0 = load i8, ptr %x, align 1 + %0 = load i8, i8* %x, align 1 %1 = trunc i8 %0 to i1 br label %phi_block diff --git a/test/test_suite2/errors/precedence_err.c3 b/test/test_suite14/errors/precedence_err.c3 similarity index 100% rename from test/test_suite2/errors/precedence_err.c3 rename to test/test_suite14/errors/precedence_err.c3 diff --git a/test/test_suite14/errors/printing_errors.c3t b/test/test_suite14/errors/printing_errors.c3t new file mode 100644 index 000000000..df4a9c0e1 --- /dev/null +++ b/test/test_suite14/errors/printing_errors.c3t @@ -0,0 +1,72 @@ +// #target: macos-x64 +module test; +import std::io; + +fault Cde +{ + HELLO, + WORLD, +} +fn void main() +{ + anyerr x = Cde.WORLD; + io::printf("%s %s\n", Cde.HELLO.nameof, x.nameof); +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %x = alloca i64, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [2 x %variant], align 16 + %taddr = alloca [5 x i8]*, align 8 + %faultname_zero = alloca %"char[]", align 8 + %taddr1 = alloca %"variant[]", align 8 + store i64 ptrtoint (%.fault* @"test_Cde$WORLD" to i64), i64* %x, align 8 + store [5 x i8]* bitcast ([6 x i8]* @.str.2 to [5 x i8]*), [5 x i8]** %taddr, align 8 + %0 = bitcast [5 x i8]** %taddr to i8* + %1 = insertvalue %variant undef, i8* %0, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$p$a5$char" to i64), 1 + %3 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %2, %variant* %3, align 16 + %4 = load i64, i64* %x, align 8 + %eq = icmp eq i64 %4, 0 + br i1 %eq, label %faultname_no, label %faultname_ok + +faultname_no: ; preds = %entry + %5 = bitcast %"char[]"* %faultname_zero to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %5, i8 0, i64 16, i1 false) + br label %faultname_exit + +faultname_ok: ; preds = %entry + %6 = inttoptr i64 %4 to %.fault* + %7 = getelementptr inbounds %.fault, %.fault* %6, i32 0, i32 1 + br label %faultname_exit + +faultname_exit: ; preds = %faultname_ok, %faultname_no + %faultname = phi %"char[]"* [ %faultname_zero, %faultname_no ], [ %7, %faultname_ok ] + %8 = bitcast %"char[]"* %faultname to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$sa$char" to i64), 1 + %11 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %10, %variant* %11, align 16 + %12 = bitcast [2 x %variant]* %varargslots to %variant* + %13 = insertvalue %"variant[]" undef, %variant* %12, 0 + %14 = insertvalue %"variant[]" %13, i64 2, 1 + store %"variant[]" %14, %"variant[]"* %taddr1, align 8 + %15 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 + %lo = load i8*, i8** %16, align 8 + %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 + %hi = load i64, i64* %17, align 8 + %18 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i64 6, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %18, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %faultname_exit + br label %voiderr + +voiderr: ; preds = %after_check, %faultname_exit + ret void +} diff --git a/test/test_suite2/errors/rethrow.c3t b/test/test_suite14/errors/rethrow.c3t similarity index 77% rename from test/test_suite2/errors/rethrow.c3t rename to test/test_suite14/errors/rethrow.c3t index 1f729d736..d5a950e3d 100644 --- a/test/test_suite2/errors/rethrow.c3t +++ b/test/test_suite14/errors/rethrow.c3t @@ -12,21 +12,21 @@ fn void! test() %i.f = alloca i64, align 8 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i64 0, ptr %i.f, align 8 - store i32 0, ptr %i, align 4 - %optval = load i64, ptr %i.f, align 8 + store i64 0, i64* %i.f, align 8 + store i32 0, i32* %i, align 4 + %optval = load i64, i64* %i.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, ptr %error_var, align 8 + store i64 %optval, i64* %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, ptr %error_var, align 8 + %0 = load i64, i64* %error_var, align 8 ret i64 %0 noerr_block: ; preds = %after_check diff --git a/test/test_suite2/errors/rethrow_mingw.c3t b/test/test_suite14/errors/rethrow_mingw.c3t similarity index 78% rename from test/test_suite2/errors/rethrow_mingw.c3t rename to test/test_suite14/errors/rethrow_mingw.c3t index 0c12b0f39..b0000e5f5 100644 --- a/test/test_suite2/errors/rethrow_mingw.c3t +++ b/test/test_suite14/errors/rethrow_mingw.c3t @@ -16,21 +16,21 @@ entry: %i.f = alloca i64, align 8 %error_var = alloca i64, align 8 %reterr = alloca i64, align 8 - store i64 0, ptr %i.f, align 8 - store i32 0, ptr %i, align 4 - %optval = load i64, ptr %i.f, align 8 + store i64 0, i64* %i.f, align 8 + store i32 0, i32* %i, align 4 + %optval = load i64, i64* %i.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, ptr %error_var, align 8 + store i64 %optval, i64* %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %0 = load i64, ptr %error_var, align 8 + %0 = load i64, i64* %error_var, align 8 ret i64 %0 noerr_block: ; preds = %after_check diff --git a/test/test_suite2/errors/rethrow_no_err.c3 b/test/test_suite14/errors/rethrow_no_err.c3 similarity index 100% rename from test/test_suite2/errors/rethrow_no_err.c3 rename to test/test_suite14/errors/rethrow_no_err.c3 diff --git a/test/test_suite2/errors/simple_static_failable.c3t b/test/test_suite14/errors/simple_static_failable.c3t similarity index 77% rename from test/test_suite2/errors/simple_static_failable.c3t rename to test/test_suite14/errors/simple_static_failable.c3t index 9e83c22bd..de3f5c634 100644 --- a/test/test_suite2/errors/simple_static_failable.c3t +++ b/test/test_suite14/errors/simple_static_failable.c3t @@ -19,6 +19,6 @@ define void @foo_main() #0 { entry: %i = alloca i32, align 4 %i.f = alloca i64, align 8 - store i64 ptrtoint (ptr @"foo_Blurg$Y" to i64), ptr %i.f, align 8 + store i64 ptrtoint (%.fault* @"foo_Blurg$Y" to i64), i64* %i.f, align 8 ret void } \ No newline at end of file diff --git a/test/test_suite2/errors/try_assign.c3t b/test/test_suite14/errors/try_assign.c3t similarity index 77% rename from test/test_suite2/errors/try_assign.c3t rename to test/test_suite14/errors/try_assign.c3t index 77fca57ad..0890d72cf 100644 --- a/test/test_suite2/errors/try_assign.c3t +++ b/test/test_suite14/errors/try_assign.c3t @@ -37,19 +37,19 @@ entry: %w.f = alloca i64, align 8 %gh = alloca i32, align 4 %e = alloca i64, align 8 - store i32 123, ptr %x, align 4 - store i32 234, ptr %z, align 4 - store i64 0, ptr %z.f, align 8 - store i64 0, ptr %w.f, align 8 - store i32 0, ptr %w, align 4 - store i32 1, ptr %gh, align 4 - %optval = load i64, ptr %z.f, align 8 + store i32 123, i32* %x, align 4 + store i32 234, i32* %z, align 4 + store i64 0, i64* %z.f, align 8 + store i64 0, i64* %w.f, align 8 + store i32 0, i32* %w, align 4 + store i32 1, i32* %gh, align 4 + %optval = load i64, i64* %z.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %0 = load i32, ptr %z, align 4 - store i32 %0, ptr %x, align 4 + %0 = load i32, i32* %z, align 4 + store i32 %0, i32* %x, align 4 br label %phi_try_catch catch_landing: ; preds = %entry @@ -60,13 +60,13 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val, label %chain_next, label %fail_chain chain_next: ; preds = %phi_try_catch - %optval1 = load i64, ptr %w.f, align 8 + %optval1 = load i64, i64* %w.f, align 8 %not_err2 = icmp eq i64 %optval1, 0 br i1 %not_err2, label %after_check3, label %catch_landing4 after_check3: ; preds = %chain_next - %1 = load i32, ptr %w, align 4 - store i32 %1, ptr %gh, align 4 + %1 = load i32, i32* %w, align 4 + store i32 %1, i32* %gh, align 4 br label %phi_try_catch5 catch_landing4: ; preds = %chain_next @@ -87,26 +87,26 @@ end_chain: ; preds = %fail_chain, %chain_ br i1 %chain.phi, label %if.then, label %if.exit if.then: ; preds = %end_chain - %2 = load i32, ptr %x, align 4 - %3 = load i32, ptr %gh, align 4 - %4 = call i32 (ptr, ...) @printf(ptr @.str, i32 %2, i32 %3) + %2 = load i32, i32* %x, align 4 + %3 = load i32, i32* %gh, align 4 + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i32 %2, i32 %3) br label %if.exit if.exit: ; preds = %if.then, %end_chain - %optval8 = load i64, ptr %z.f, align 8 + %optval8 = load i64, i64* %z.f, align 8 %not_err9 = icmp eq i64 %optval8, 0 br i1 %not_err9, label %after_check10, label %catch_landing14 after_check10: ; preds = %if.exit - %5 = load i32, ptr %z, align 4 - %optval11 = load i64, ptr %w.f, align 8 + %5 = load i32, i32* %z, align 4 + %optval11 = load i64, i64* %w.f, align 8 %not_err12 = icmp eq i64 %optval11, 0 br i1 %not_err12, label %after_check13, label %catch_landing14 after_check13: ; preds = %after_check10 - %6 = load i32, ptr %w, align 4 + %6 = load i32, i32* %w, align 4 %add = add i32 %5, %6 - store i32 %add, ptr %x, align 4 + store i32 %add, i32* %x, align 4 br label %phi_try_catch15 catch_landing14: ; preds = %after_check10, %if.exit @@ -117,33 +117,33 @@ phi_try_catch15: ; preds = %catch_landing14, %a br i1 %val16, label %if.then17, label %if.exit18 if.then17: ; preds = %phi_try_catch15 - %7 = call i32 (ptr, ...) @printf(ptr @.str.1) + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0)) br label %if.exit18 if.exit18: ; preds = %if.then17, %phi_try_catch15 - store i64 0, ptr %e, align 8 + store i64 0, i64* %e, align 8 br label %testblock testblock: ; preds = %if.exit18 - %optval19 = load i64, ptr %z.f, align 8 + %optval19 = load i64, i64* %z.f, align 8 %not_err20 = icmp eq i64 %optval19, 0 br i1 %not_err20, label %after_check21, label %assign_optional assign_optional: ; preds = %testblock - store i64 %optval19, ptr %e, align 8 + store i64 %optval19, i64* %e, align 8 br label %end_block after_check21: ; preds = %testblock - store i64 0, ptr %e, align 8 + store i64 0, i64* %e, align 8 br label %end_block end_block: ; preds = %after_check21, %assign_optional - %8 = load i64, ptr %e, align 8 + %8 = load i64, i64* %e, align 8 %neq = icmp ne i64 %8, 0 br i1 %neq, label %if.then22, label %if.exit23 if.then22: ; preds = %end_block - %9 = call i32 (ptr, ...) @printf(ptr @.str.2) + %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0)) br label %if.exit23 if.exit23: ; preds = %if.then22, %end_block diff --git a/test/test_suite2/errors/try_catch_if.c3t b/test/test_suite14/errors/try_catch_if.c3t similarity index 70% rename from test/test_suite2/errors/try_catch_if.c3t rename to test/test_suite14/errors/try_catch_if.c3t index 086e11959..030fe7611 100644 --- a/test/test_suite2/errors/try_catch_if.c3t +++ b/test/test_suite14/errors/try_catch_if.c3t @@ -36,12 +36,11 @@ fn void main() /* #expect: try_catch_if.ll - -define i64 @try_catch_if_tester(ptr %0) #0 { +define i64 @try_catch_if_tester(i32* %0) #0 { entry: %reterr = alloca i64, align 8 - %1 = call i32 (ptr, ...) @printf(ptr @.str) - store i32 222, ptr %0, align 4 + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) + store i32 222, i32* %0, align 4 ret i64 0 } @@ -51,47 +50,47 @@ entry: %a.f = alloca i64, align 8 %err = alloca i64, align 8 %retparam = alloca i32, align 4 - store i32 123, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 + store i32 123, i32* %a, align 4 + store i64 0, i64* %a.f, align 8 br label %testblock testblock: ; preds = %entry - %optval = load i64, ptr %a.f, align 8 + %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, ptr %err, align 8 + store i64 %optval, i64* %err, align 8 br label %end_block after_check: ; preds = %testblock br label %testblock1 testblock1: ; preds = %after_check - %0 = call i64 @try_catch_if_tester(ptr %retparam) + %0 = call i64 @try_catch_if_tester(i32* %retparam) %not_err2 = icmp eq i64 %0, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %testblock1 - store i64 %0, ptr %err, align 8 + store i64 %0, i64* %err, align 8 br label %end_block after_check4: ; preds = %testblock1 - store i64 0, ptr %err, align 8 + store i64 0, i64* %err, align 8 br label %end_block end_block: ; preds = %after_check4, %assign_optional3, %assign_optional - %1 = load i64, ptr %err, align 8 + %1 = load i64, i64* %err, align 8 %neq = icmp ne i64 %1, 0 br i1 %neq, label %if.then, label %if.else if.then: ; preds = %end_block - %2 = call i32 (ptr, ...) @printf(ptr @.str.1) + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i32 0, i32 0)) br label %if.exit if.else: ; preds = %end_block - %3 = load i32, ptr %a, align 4 - %4 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %3) + %3 = load i32, i32* %a, align 4 + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %3) br label %if.exit if.exit: ; preds = %if.else, %if.then diff --git a/test/test_suite2/errors/try_catch_unwrapping_while_if.c3 b/test/test_suite14/errors/try_catch_unwrapping_while_if.c3 similarity index 100% rename from test/test_suite2/errors/try_catch_unwrapping_while_if.c3 rename to test/test_suite14/errors/try_catch_unwrapping_while_if.c3 diff --git a/test/test_suite2/errors/try_unwrap_using_assert.c3t b/test/test_suite14/errors/try_unwrap_using_assert.c3t similarity index 71% rename from test/test_suite2/errors/try_unwrap_using_assert.c3t rename to test/test_suite14/errors/try_unwrap_using_assert.c3t index 1870b5edb..9974ae2df 100644 --- a/test/test_suite2/errors/try_unwrap_using_assert.c3t +++ b/test/test_suite14/errors/try_unwrap_using_assert.c3t @@ -19,23 +19,23 @@ entry: %num.f = alloca i64, align 8 %retparam = alloca i32, align 4 %x = alloca i32, align 4 - %1 = call i64 @maybe(ptr %retparam) + %1 = call i64 @maybe(i32* %retparam) %not_err = icmp eq i64 %1, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %1, ptr %num.f, align 8 + store i64 %1, i64* %num.f, align 8 br label %after_assign after_check: ; preds = %entry - %2 = load i32, ptr %retparam, align 4 - store i32 %2, ptr %num, align 4 - store i64 0, ptr %num.f, align 8 + %2 = load i32, i32* %retparam, align 4 + store i32 %2, i32* %num, align 4 + store i64 0, i64* %num.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %3 = load i32, ptr %num, align 4 - store i32 %3, ptr %x, align 4 - %4 = load i32, ptr %num, align 4 + %3 = load i32, i32* %num, align 4 + store i32 %3, i32* %x, align 4 + %4 = load i32, i32* %num, align 4 ret i32 %4 } \ No newline at end of file diff --git a/test/test_suite2/errors/try_with_assign_to_failable.c3 b/test/test_suite14/errors/try_with_assign_to_failable.c3 similarity index 100% rename from test/test_suite2/errors/try_with_assign_to_failable.c3 rename to test/test_suite14/errors/try_with_assign_to_failable.c3 diff --git a/test/test_suite2/errors/try_with_chained_unwrap.c3t b/test/test_suite14/errors/try_with_chained_unwrap.c3t similarity index 69% rename from test/test_suite2/errors/try_with_chained_unwrap.c3t rename to test/test_suite14/errors/try_with_chained_unwrap.c3t index 4e12d57c5..d419e18e6 100644 --- a/test/test_suite2/errors/try_with_chained_unwrap.c3t +++ b/test/test_suite14/errors/try_with_chained_unwrap.c3t @@ -16,28 +16,27 @@ fn void main() printf("You didn't type an integer :(\n"); } -/* #expect: try_with_chained_unwrap.ll - +// #expect: try_with_chained_unwrap.ll define void @try_with_chained_unwrap_main() #0 { entry: %val = alloca i32, align 4 %retparam = alloca i32, align 4 - %retparam1 = alloca ptr, align 8 - store i32 0, ptr %val, align 4 - %0 = call i64 @readLine(ptr %retparam1) + %retparam1 = alloca i8*, align 8 + store i32 0, i32* %val, align 4 + %0 = call i64 @readLine(i8** %retparam1) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %1 = load ptr, ptr %retparam1, align 8 - %2 = call i64 @atoi(ptr %retparam, ptr %1) + %1 = load i8*, i8** %retparam1, align 8 + %2 = call i64 @atoi(i32* %retparam, i8* %1) %not_err2 = icmp eq i64 %2, 0 br i1 %not_err2, label %after_check3, label %catch_landing after_check3: ; preds = %after_check - %3 = load i32, ptr %retparam, align 4 - store i32 %3, ptr %val, align 4 + %3 = load i32, i32* %retparam, align 4 + store i32 %3, i32* %val, align 4 br label %phi_try_catch catch_landing: ; preds = %after_check, %entry @@ -48,11 +47,11 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val4, label %if.then, label %if.exit if.then: ; preds = %phi_try_catch - %4 = load i32, ptr %val, align 4 - %5 = call i32 (ptr, ...) @printf(ptr @.str, i32 %4) + %4 = load i32, i32* %val, align 4 + %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i32 0, i32 0), i32 %4) ret void if.exit: ; preds = %phi_try_catch - %6 = call i32 (ptr, ...) @printf(ptr @.str.1) + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.1, i32 0, i32 0)) ret void } \ No newline at end of file diff --git a/test/test_suite2/errors/try_with_chained_unwrap_errors.c3 b/test/test_suite14/errors/try_with_chained_unwrap_errors.c3 similarity index 100% rename from test/test_suite2/errors/try_with_chained_unwrap_errors.c3 rename to test/test_suite14/errors/try_with_chained_unwrap_errors.c3 diff --git a/test/test_suite2/errors/try_with_unwrap.c3t b/test/test_suite14/errors/try_with_unwrap.c3t similarity index 69% rename from test/test_suite2/errors/try_with_unwrap.c3t rename to test/test_suite14/errors/try_with_unwrap.c3t index 7da35548e..4759f09d3 100644 --- a/test/test_suite2/errors/try_with_unwrap.c3t +++ b/test/test_suite14/errors/try_with_unwrap.c3t @@ -23,62 +23,62 @@ fn void main() define void @try_with_unwrap_main() #0 { entry: - %line = alloca ptr, align 8 + %line = alloca i8*, align 8 %line.f = alloca i64, align 8 - %retparam = alloca ptr, align 8 + %retparam = alloca i8*, align 8 %val = alloca i32, align 4 %val.f = alloca i64, align 8 %retparam1 = alloca i32, align 4 - %0 = call i64 @readLine(ptr %retparam) + %0 = call i64 @readLine(i8** %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, ptr %line.f, align 8 + store i64 %0, i64* %line.f, align 8 br label %after_assign after_check: ; preds = %entry - %1 = load ptr, ptr %retparam, align 8 - store ptr %1, ptr %line, align 8 - store i64 0, ptr %line.f, align 8 + %1 = load i8*, i8** %retparam, align 8 + store i8* %1, i8** %line, align 8 + store i64 0, i64* %line.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional - %load.err = load i64, ptr %line.f, align 8 + %load.err = load i64, i64* %line.f, align 8 %result = icmp eq i64 %load.err, 0 br i1 %result, label %if.then, label %if.exit9 if.then: ; preds = %after_assign - %2 = load ptr, ptr %line, align 8 - %3 = call i64 @atoi(ptr %retparam1, ptr %2) + %2 = load i8*, i8** %line, align 8 + %3 = call i64 @atoi(i32* %retparam1, i8* %2) %not_err2 = icmp eq i64 %3, 0 br i1 %not_err2, label %after_check4, label %assign_optional3 assign_optional3: ; preds = %if.then - store i64 %3, ptr %val.f, align 8 + store i64 %3, i64* %val.f, align 8 br label %after_assign5 after_check4: ; preds = %if.then - %4 = load i32, ptr %retparam1, align 4 - store i32 %4, ptr %val, align 4 - store i64 0, ptr %val.f, align 8 + %4 = load i32, i32* %retparam1, align 4 + store i32 %4, i32* %val, align 4 + store i64 0, i64* %val.f, align 8 br label %after_assign5 after_assign5: ; preds = %after_check4, %assign_optional3 - %load.err6 = load i64, ptr %val.f, align 8 + %load.err6 = load i64, i64* %val.f, align 8 %result7 = icmp eq i64 %load.err6, 0 br i1 %result7, label %if.then8, label %if.exit if.then8: ; preds = %after_assign5 - %5 = load i32, ptr %val, align 4 - %6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %5) + %5 = load i32, i32* %val, align 4 + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i32 0, i32 0), i32 %5) ret void if.exit: ; preds = %after_assign5 br label %if.exit9 if.exit9: ; preds = %if.exit, %after_assign - %7 = call i32 (ptr, ...) @printf(ptr @.str.1) + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.1, i32 0, i32 0)) ret void } diff --git a/test/test_suite2/errors/try_with_unwrapper.c3t b/test/test_suite14/errors/try_with_unwrapper.c3t similarity index 78% rename from test/test_suite2/errors/try_with_unwrapper.c3t rename to test/test_suite14/errors/try_with_unwrapper.c3t index 1ee16122e..7fff22c00 100644 --- a/test/test_suite2/errors/try_with_unwrapper.c3t +++ b/test/test_suite14/errors/try_with_unwrapper.c3t @@ -52,14 +52,14 @@ entry: } ; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 +declare i32 @printf(i8*, ...) #0 ; Function Attrs: nounwind -define i64 @try_with_unwrapper_tester(ptr %0) #0 { +define i64 @try_with_unwrapper_tester(i32* %0) #0 { entry: %reterr = alloca i64, align 8 - %1 = call i32 (ptr, ...) @printf(ptr @.str) - store i32 222, ptr %0, align 4 + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) + store i32 222, i32* %0, align 4 ret i64 0 } @@ -71,16 +71,16 @@ entry: %b = alloca i32, align 4 %c = alloca i32, align 4 %retparam = alloca i32, align 4 - store i32 11, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 - store i32 0, ptr %b, align 4 - %optval = load i64, ptr %a.f, align 8 + store i32 11, i32* %a, align 4 + store i64 0, i64* %a.f, align 8 + store i32 0, i32* %b, align 4 + %optval = load i64, i64* %a.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %0 = load i32, ptr %a, align 4 - store i32 %0, ptr %b, align 4 + %0 = load i32, i32* %a, align 4 + store i32 %0, i32* %b, align 4 br label %phi_try_catch catch_landing: ; preds = %entry @@ -91,14 +91,14 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val, label %chain_next, label %fail_chain chain_next: ; preds = %phi_try_catch - store i32 0, ptr %c, align 4 - %1 = call i64 @try_with_unwrapper_tester(ptr %retparam) + store i32 0, i32* %c, align 4 + %1 = call i64 @try_with_unwrapper_tester(i32* %retparam) %not_err1 = icmp eq i64 %1, 0 br i1 %not_err1, label %after_check2, label %catch_landing3 after_check2: ; preds = %chain_next - %2 = load i32, ptr %retparam, align 4 - store i32 %2, ptr %c, align 4 + %2 = load i32, i32* %retparam, align 4 + store i32 %2, i32* %c, align 4 br label %phi_try_catch4 catch_landing3: ; preds = %chain_next @@ -119,11 +119,11 @@ end_chain: ; preds = %fail_chain, %chain_ br i1 %chain.phi, label %if.then, label %if.exit if.then: ; preds = %end_chain - %3 = load i32, ptr %b, align 4 + %3 = load i32, i32* %b, align 4 %4 = call i32 @try_with_unwrapper_hello(i32 %3) - %5 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %4) - %6 = load i32, ptr %c, align 4 - %7 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %6) + %5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %4) + %6 = load i32, i32* %c, align 4 + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %6) br label %if.exit if.exit: ; preds = %if.then, %end_chain @@ -137,16 +137,16 @@ entry: %a = alloca i32, align 4 %a.f = alloca i64, align 8 %b = alloca i32, align 4 - store i64 0, ptr %a.f, align 8 - store i32 0, ptr %a, align 4 - store i32 0, ptr %b, align 4 - %optval = load i64, ptr %a.f, align 8 + store i64 0, i64* %a.f, align 8 + store i32 0, i32* %a, align 4 + store i32 0, i32* %b, align 4 + %optval = load i64, i64* %a.f, align 8 %not_err = icmp eq i64 %optval, 0 br i1 %not_err, label %after_check, label %catch_landing after_check: ; preds = %entry - %0 = load i32, ptr %a, align 4 - store i32 %0, ptr %b, align 4 + %0 = load i32, i32* %a, align 4 + store i32 %0, i32* %b, align 4 br label %phi_try_catch catch_landing: ; preds = %entry @@ -157,7 +157,7 @@ phi_try_catch: ; preds = %catch_landing, %aft br i1 %val, label %chain_next, label %fail_chain chain_next: ; preds = %phi_try_catch - %1 = load i32, ptr %b, align 4 + %1 = load i32, i32* %b, align 4 %2 = call i32 @try_with_unwrapper_hello(i32 %1) %intbool = icmp ne i32 %2, 0 br i1 %intbool, label %chain_next1, label %fail_chain @@ -173,7 +173,7 @@ end_chain: ; preds = %fail_chain, %chain_ br i1 %chain.phi, label %if.then, label %if.exit if.then: ; preds = %end_chain - %3 = load i32, ptr %b, align 4 + %3 = load i32, i32* %b, align 4 %add = add i32 %3, 1 %4 = call i32 @try_with_unwrapper_hello(i32 %add) br label %if.exit diff --git a/test/test_suite2/errors/try_with_weird_stuff.c3 b/test/test_suite14/errors/try_with_weird_stuff.c3 similarity index 100% rename from test/test_suite2/errors/try_with_weird_stuff.c3 rename to test/test_suite14/errors/try_with_weird_stuff.c3 diff --git a/test/test_suite2/examples/gameoflife.c3 b/test/test_suite14/examples/gameoflife.c3 similarity index 100% rename from test/test_suite2/examples/gameoflife.c3 rename to test/test_suite14/examples/gameoflife.c3 diff --git a/test/test_suite2/expression_block/expr_block_labelled_break.c3 b/test/test_suite14/expression_block/expr_block_labelled_break.c3 similarity index 100% rename from test/test_suite2/expression_block/expr_block_labelled_break.c3 rename to test/test_suite14/expression_block/expr_block_labelled_break.c3 diff --git a/test/test_suite2/expression_block/expression_block_break.c3 b/test/test_suite14/expression_block/expression_block_break.c3 similarity index 100% rename from test/test_suite2/expression_block/expression_block_break.c3 rename to test/test_suite14/expression_block/expression_block_break.c3 diff --git a/test/test_suite2/expression_block/expression_block_no_end_return.c3 b/test/test_suite14/expression_block/expression_block_no_end_return.c3 similarity index 100% rename from test/test_suite2/expression_block/expression_block_no_end_return.c3 rename to test/test_suite14/expression_block/expression_block_no_end_return.c3 diff --git a/test/test_suite2/expressions/2002-02-13-ConditionalInCall.c3t b/test/test_suite14/expressions/2002-02-13-ConditionalInCall.c3t similarity index 100% rename from test/test_suite2/expressions/2002-02-13-ConditionalInCall.c3t rename to test/test_suite14/expressions/2002-02-13-ConditionalInCall.c3t diff --git a/test/test_suite14/expressions/addr_compiles.c3t b/test/test_suite14/expressions/addr_compiles.c3t new file mode 100644 index 000000000..beb4f6d04 --- /dev/null +++ b/test/test_suite14/expressions/addr_compiles.c3t @@ -0,0 +1,144 @@ +// #target: macos-x64 + +module test; + +extern fn void printf(char*, ...); + +fn void main() +{ + test(); + test2(); + test3(); +} + +fn void test() +{ + int f = 3; + int* x = &(((f))); + int* h = &&(f++); + printf("x = %d (4), h = %d (3)\n", *x, *h); +} + + +const int XX = 314; +fn void test2() +{ + int* w = &XX; + printf("w = %d (314)\n", *w); +} + +struct Foo +{ + int x; + int y; +} +fn void test3() +{ + Foo h = { 345, 555 }; + int* zx = &h.x; + int* zy = &h.y; + int[3] arr = { 333, 444, 999 }; + printf("zx = %d (345) zy = %d (555)\n", *zx, *zy); + arr[0]--; + arr[1]--; + arr[2]--; + int* d = &arr[2]; + int[]* e = &&arr[1..2]; + printf("d = %d (998) e = %d (443)\n", *d, (*e)[0]); +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + call void @test_test() + call void @test_test2() + call void @test_test3() + ret void +} + +; Function Attrs: nounwind +define void @test_test() #0 { +entry: + %f = alloca i32, align 4 + %x = alloca i32*, align 8 + %h = alloca i32*, align 8 + %taddr = alloca i32, align 4 + store i32 3, i32* %f, align 4 + store i32* %f, i32** %x, align 8 + %0 = load i32, i32* %f, align 4 + %add = add i32 %0, 1 + store i32 %add, i32* %f, align 4 + store i32 %0, i32* %taddr, align 4 + store i32* %taddr, i32** %h, align 8 + %1 = load i32*, i32** %x, align 8 + %2 = load i32, i32* %1, align 8 + %3 = load i32*, i32** %h, align 8 + %4 = load i32, i32* %3, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str, i32 0, i32 0), i32 %2, i32 %4) + ret void +} + +; Function Attrs: nounwind +define void @test_test2() #0 { +entry: + %w = alloca i32*, align 8 + store i32* @test_XX, i32** %w, align 8 + %0 = load i32*, i32** %w, align 8 + %1 = load i32, i32* %0, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i32 %1) + ret void +} + +; Function Attrs: nounwind +define void @test_test3() #0 { +entry: + %h = alloca %Foo, align 4 + %zx = alloca i32*, align 8 + %zy = alloca i32*, align 8 + %arr = alloca [3 x i32], align 4 + %d = alloca i32*, align 8 + %e = alloca %"int[]"*, align 8 + %taddr = alloca %"int[]", align 8 + %0 = bitcast %Foo* %h to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 8, i1 false) + %1 = getelementptr inbounds %Foo, %Foo* %h, i32 0, i32 0 + store i32* %1, i32** %zx, align 8 + %2 = getelementptr inbounds %Foo, %Foo* %h, i32 0, i32 1 + store i32* %2, i32** %zy, align 8 + %3 = bitcast [3 x i32]* %arr to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 bitcast ([3 x i32]* @.__const.2 to i8*), i32 12, i1 false) + %4 = load i32*, i32** %zx, align 8 + %5 = load i32, i32* %4, align 8 + %6 = load i32*, i32** %zy, align 8 + %7 = load i32, i32* %6, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i32 0, i32 0), i32 %5, i32 %7) + %8 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 0 + %9 = load i32, i32* %8, align 4 + %sub = sub i32 %9, 1 + store i32 %sub, i32* %8, align 4 + %10 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 1 + %11 = load i32, i32* %10, align 4 + %sub1 = sub i32 %11, 1 + store i32 %sub1, i32* %10, align 4 + %12 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 2 + %13 = load i32, i32* %12, align 4 + %sub2 = sub i32 %13, 1 + store i32 %sub2, i32* %12, align 4 + %14 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 2 + store i32* %14, i32** %d, align 8 + %15 = getelementptr inbounds [3 x i32], [3 x i32]* %arr, i64 0, i64 1 + %16 = insertvalue %"int[]" undef, i32* %15, 0 + %17 = insertvalue %"int[]" %16, i64 2, 1 + store %"int[]" %17, %"int[]"* %taddr, align 8 + store %"int[]"* %taddr, %"int[]"** %e, align 8 + %18 = load i32*, i32** %d, align 8 + %19 = load i32, i32* %18, align 8 + %20 = load %"int[]"*, %"int[]"** %e, align 8 + %21 = getelementptr inbounds %"int[]", %"int[]"* %20, i32 0, i32 0 + %22 = load i32*, i32** %21, align 8 + %ptroffset = getelementptr inbounds i32, i32* %22, i64 0 + %23 = load i32, i32* %ptroffset, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.4, i32 0, i32 0), i32 %19, i32 %23) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/expressions/addr_of_fails.c3 b/test/test_suite14/expressions/addr_of_fails.c3 similarity index 100% rename from test/test_suite2/expressions/addr_of_fails.c3 rename to test/test_suite14/expressions/addr_of_fails.c3 diff --git a/test/test_suite2/expressions/arithmetics.c3 b/test/test_suite14/expressions/arithmetics.c3 similarity index 100% rename from test/test_suite2/expressions/arithmetics.c3 rename to test/test_suite14/expressions/arithmetics.c3 diff --git a/test/test_suite2/expressions/arithmetics_sema_fail.c3 b/test/test_suite14/expressions/arithmetics_sema_fail.c3 similarity index 100% rename from test/test_suite2/expressions/arithmetics_sema_fail.c3 rename to test/test_suite14/expressions/arithmetics_sema_fail.c3 diff --git a/test/test_suite2/expressions/assign.c3 b/test/test_suite14/expressions/assign.c3 similarity index 100% rename from test/test_suite2/expressions/assign.c3 rename to test/test_suite14/expressions/assign.c3 diff --git a/test/test_suite2/expressions/assign_deref_opt.c3 b/test/test_suite14/expressions/assign_deref_opt.c3 similarity index 100% rename from test/test_suite2/expressions/assign_deref_opt.c3 rename to test/test_suite14/expressions/assign_deref_opt.c3 diff --git a/test/test_suite2/expressions/assignability.c3 b/test/test_suite14/expressions/assignability.c3 similarity index 100% rename from test/test_suite2/expressions/assignability.c3 rename to test/test_suite14/expressions/assignability.c3 diff --git a/test/test_suite2/expressions/assignment_precedence.c3t b/test/test_suite14/expressions/assignment_precedence.c3t similarity index 50% rename from test/test_suite2/expressions/assignment_precedence.c3t rename to test/test_suite14/expressions/assignment_precedence.c3t index 679360c3a..da7d5bc14 100644 --- a/test/test_suite2/expressions/assignment_precedence.c3t +++ b/test/test_suite14/expressions/assignment_precedence.c3t @@ -14,10 +14,10 @@ fn void test() %j = alloca i32, align 4 %k = alloca i32, align 4 %l = alloca i32, align 4 - store i32 1, ptr %i, align 4 - store i32 2, ptr %j, align 4 - store i32 3, ptr %k, align 4 - %0 = load i32, ptr %k, align 4 - store i32 %0, ptr %j, align 4 - store i32 %0, ptr %i, align 4 - store i32 %0, ptr %l, align 4 \ No newline at end of file + store i32 1, i32* %i, align 4 + store i32 2, i32* %j, align 4 + store i32 3, i32* %k, align 4 + %0 = load i32, i32* %k, align 4 + store i32 %0, i32* %j, align 4 + store i32 %0, i32* %i, align 4 + store i32 %0, i32* %l, align 4 \ No newline at end of file diff --git a/test/test_suite2/expressions/bit_op_on_bool.c3t b/test/test_suite14/expressions/bit_op_on_bool.c3t similarity index 100% rename from test/test_suite2/expressions/bit_op_on_bool.c3t rename to test/test_suite14/expressions/bit_op_on_bool.c3t diff --git a/test/test_suite2/expressions/bool_conversions.c3t b/test/test_suite14/expressions/bool_conversions.c3t similarity index 67% rename from test/test_suite2/expressions/bool_conversions.c3t rename to test/test_suite14/expressions/bool_conversions.c3t index 657a2b3f7..ef1cb53e1 100644 --- a/test/test_suite2/expressions/bool_conversions.c3t +++ b/test/test_suite14/expressions/bool_conversions.c3t @@ -10,16 +10,16 @@ fn bool f1() { return (bool){| Test x = void; return x = (Test)0; |}; } /* #expect: bool_conversions.ll -define internal zeroext i8 @bool_conversions_f0_0(ptr %0) #0 { +define internal zeroext i8 @bool_conversions_f0_0(i8* %0) #0 { entry: - %ptrbool = icmp ne ptr %0, null + %ptrbool = icmp ne i8* %0, null %1 = zext i1 %ptrbool to i8 ret i8 %1 } define i32 @bool_conversions_f0() #0 { entry: - %0 = call i8 @bool_conversions_f0_0(ptr inttoptr (i64 2 to ptr)) + %0 = call i8 @bool_conversions_f0_0(i8* inttoptr (i64 2 to i8*)) %1 = trunc i8 %0 to i1 %boolsi = zext i1 %1 to i32 ret i32 %boolsi @@ -27,7 +27,7 @@ entry: define zeroext i8 @bool_conversions_f1() #0 { entry: - %x = alloca ptr, align 8 - store ptr null, ptr %x, align 8 + %x = alloca void ()*, align 8 + store void ()* null, void ()** %x, align 8 ret i8 0 } diff --git a/test/test_suite2/expressions/call_arg_types.c3 b/test/test_suite14/expressions/call_arg_types.c3 similarity index 100% rename from test/test_suite2/expressions/call_arg_types.c3 rename to test/test_suite14/expressions/call_arg_types.c3 diff --git a/test/test_suite2/expressions/call_inline.c3t b/test/test_suite14/expressions/call_inline.c3t similarity index 100% rename from test/test_suite2/expressions/call_inline.c3t rename to test/test_suite14/expressions/call_inline.c3t diff --git a/test/test_suite2/expressions/casts/cast_const.c3 b/test/test_suite14/expressions/casts/cast_const.c3 similarity index 100% rename from test/test_suite2/expressions/casts/cast_const.c3 rename to test/test_suite14/expressions/casts/cast_const.c3 diff --git a/test/test_suite2/expressions/casts/cast_enum_to_various.c3 b/test/test_suite14/expressions/casts/cast_enum_to_various.c3 similarity index 100% rename from test/test_suite2/expressions/casts/cast_enum_to_various.c3 rename to test/test_suite14/expressions/casts/cast_enum_to_various.c3 diff --git a/test/test_suite2/expressions/casts/cast_expr.c3t b/test/test_suite14/expressions/casts/cast_expr.c3t similarity index 73% rename from test/test_suite2/expressions/casts/cast_expr.c3t rename to test/test_suite14/expressions/casts/cast_expr.c3t index 07b842ad2..32d8ee294 100644 --- a/test/test_suite2/expressions/casts/cast_expr.c3t +++ b/test/test_suite14/expressions/casts/cast_expr.c3t @@ -17,11 +17,11 @@ define i32 @main %b = alloca i32 %c = alloca i32 - store i32 10, ptr %a - store i32 20, ptr %b - %2 = load i32, ptr %a + store i32 10, i32* %a + store i32 20, i32* %b + %2 = load i32, i32* %a trunc i32 %2 to i8 sext i8 %sisitrunc to i32 - store i32 %sisiext, ptr %c + store i32 %sisiext, i32* %c ret i32 0 } diff --git a/test/test_suite2/expressions/casts/cast_failable.c3 b/test/test_suite14/expressions/casts/cast_failable.c3 similarity index 100% rename from test/test_suite2/expressions/casts/cast_failable.c3 rename to test/test_suite14/expressions/casts/cast_failable.c3 diff --git a/test/test_suite2/expressions/casts/cast_func_to_various.c3 b/test/test_suite14/expressions/casts/cast_func_to_various.c3 similarity index 98% rename from test/test_suite2/expressions/casts/cast_func_to_various.c3 rename to test/test_suite14/expressions/casts/cast_func_to_various.c3 index 31fcb3154..1a7acb57b 100644 --- a/test/test_suite2/expressions/casts/cast_func_to_various.c3 +++ b/test/test_suite14/expressions/casts/cast_func_to_various.c3 @@ -3,7 +3,7 @@ struct Struct int x; } -enum Enum : uptr +enum Enum : usz { A, B } diff --git a/test/test_suite2/expressions/casts/cast_to_nonscalar.c3 b/test/test_suite14/expressions/casts/cast_to_nonscalar.c3 similarity index 100% rename from test/test_suite2/expressions/casts/cast_to_nonscalar.c3 rename to test/test_suite14/expressions/casts/cast_to_nonscalar.c3 diff --git a/test/test_suite2/expressions/casts/cast_unknown.c3 b/test/test_suite14/expressions/casts/cast_unknown.c3 similarity index 100% rename from test/test_suite2/expressions/casts/cast_unknown.c3 rename to test/test_suite14/expressions/casts/cast_unknown.c3 diff --git a/test/test_suite2/expressions/casts/explicit_cast.c3 b/test/test_suite14/expressions/casts/explicit_cast.c3 similarity index 100% rename from test/test_suite2/expressions/casts/explicit_cast.c3 rename to test/test_suite14/expressions/casts/explicit_cast.c3 diff --git a/test/test_suite2/expressions/casts/narrowing.c3 b/test/test_suite14/expressions/casts/narrowing.c3 similarity index 100% rename from test/test_suite2/expressions/casts/narrowing.c3 rename to test/test_suite14/expressions/casts/narrowing.c3 diff --git a/test/test_suite2/expressions/casts/struct_cast_and_distinct.c3 b/test/test_suite14/expressions/casts/struct_cast_and_distinct.c3 similarity index 100% rename from test/test_suite2/expressions/casts/struct_cast_and_distinct.c3 rename to test/test_suite14/expressions/casts/struct_cast_and_distinct.c3 diff --git a/test/test_suite2/expressions/chained_conditional.c3t b/test/test_suite14/expressions/chained_conditional.c3t similarity index 78% rename from test/test_suite2/expressions/chained_conditional.c3t rename to test/test_suite14/expressions/chained_conditional.c3t index ee0df31dd..c44be3422 100644 --- a/test/test_suite2/expressions/chained_conditional.c3t +++ b/test/test_suite14/expressions/chained_conditional.c3t @@ -28,17 +28,17 @@ entry: %y = alloca i32, align 4 %z = alloca i32, align 4 %0 = call i32 @chained_foo() - store i32 %0, ptr %x, align 4 + store i32 %0, i32* %x, align 4 %1 = call i32 @chained_foo() - store i32 %1, ptr %y, align 4 + store i32 %1, i32* %y, align 4 %2 = call i32 @chained_foo() - store i32 %2, ptr %z, align 4 - %3 = load i32, ptr %x, align 4 + store i32 %2, i32* %z, align 4 + %3 = load i32, i32* %x, align 4 %gt = icmp sgt i32 %3, 0 br i1 %gt, label %and.rhs, label %and.phi and.rhs: - %4 = load i32, ptr %y, align 4 + %4 = load i32, i32* %y, align 4 %gt1 = icmp sgt i32 %4, 0 br label %and.phi @@ -47,7 +47,7 @@ and.phi: br i1 %val, label %and.rhs2, label %and.phi4 and.rhs2: - %5 = load i32, ptr %z, align 4 + %5 = load i32, i32* %z, align 4 %gt3 = icmp sgt i32 %5, 0 br label %and.phi4 @@ -60,9 +60,9 @@ if.then: br label %if.exit if.else: - %7 = load i32, ptr %x, align 4 + %7 = load i32, i32* %x, align 4 %add = add i32 %7, 1 - store i32 %add, ptr %x, align 4 + store i32 %add, i32* %x, align 4 br label %if.exit if.exit: diff --git a/test/test_suite2/expressions/chained_ternary.c3t b/test/test_suite14/expressions/chained_ternary.c3t similarity index 69% rename from test/test_suite2/expressions/chained_ternary.c3t rename to test/test_suite14/expressions/chained_ternary.c3t index 2e0bf0daf..798043661 100644 --- a/test/test_suite2/expressions/chained_ternary.c3t +++ b/test/test_suite14/expressions/chained_ternary.c3t @@ -20,205 +20,205 @@ fn void test() /* #expect: test.ll - %0 = load ptr, ptr %a, align 8 - %not = icmp eq ptr %0, null + %0 = load i8*, i8** %a, align 8 + %not = icmp eq i8* %0, null br i1 %not, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %1 = load ptr, ptr %a, align 8 + %1 = load i8*, i8** %a, align 8 br label %cond.phi4 cond.rhs: ; preds = %entry - %2 = load ptr, ptr %a, align 8 - %not1 = icmp eq ptr %2, null + %2 = load i8*, i8** %a, align 8 + %not1 = icmp eq i8* %2, null br i1 %not1, label %cond.lhs2, label %cond.rhs3 cond.lhs2: ; preds = %cond.rhs - %3 = load ptr, ptr %b, align 8 + %3 = load i8*, i8** %b, align 8 br label %cond.phi cond.rhs3: ; preds = %cond.rhs - %4 = load ptr, ptr %c, align 8 + %4 = load i8*, i8** %c, align 8 br label %cond.phi cond.phi: ; preds = %cond.rhs3, %cond.lhs2 - %val = phi ptr [ %3, %cond.lhs2 ], [ %4, %cond.rhs3 ] + %val = phi i8* [ %3, %cond.lhs2 ], [ %4, %cond.rhs3 ] br label %cond.phi4 cond.phi4: ; preds = %cond.phi, %cond.lhs - %val5 = phi ptr [ %1, %cond.lhs ], [ %val, %cond.phi ] - store ptr %val5, ptr %a, align 8 - store i64 0, ptr %x.f, align 8 - store ptr null, ptr %x, align 8 - %5 = load ptr, ptr %a, align 8 - %not6 = icmp eq ptr %5, null + %val5 = phi i8* [ %1, %cond.lhs ], [ %val, %cond.phi ] + store i8* %val5, i8** %a, align 8 + store i64 0, i64* %x.f, align 8 + store i8* null, i8** %x, align 8 + %5 = load i8*, i8** %a, align 8 + %not6 = icmp eq i8* %5, null br i1 %not6, label %cond.lhs7, label %cond.rhs8 cond.lhs7: ; preds = %cond.phi4 - %optval = load i64, ptr %x.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 = %cond.lhs7 - store i64 %optval, ptr %y.f, align 8 + store i64 %optval, i64* %y.f, align 8 br label %after_assign after_check: ; preds = %cond.lhs7 - %6 = load ptr, ptr %x, align 8 + %6 = load i8*, i8** %x, align 8 br label %cond.phi9 cond.rhs8: ; preds = %cond.phi4 - %7 = load ptr, ptr %b, align 8 + %7 = load i8*, i8** %b, align 8 br label %cond.phi9 cond.phi9: ; preds = %cond.rhs8, %after_check - %val10 = phi ptr [ %6, %after_check ], [ %7, %cond.rhs8 ] - store ptr %val10, ptr %y, align 8 - store i64 0, ptr %y.f, align 8 + %val10 = phi i8* [ %6, %after_check ], [ %7, %cond.rhs8 ] + store i8* %val10, i8** %y, align 8 + store i64 0, i64* %y.f, align 8 br label %after_assign after_assign: ; preds = %cond.phi9, %assign_optional - %8 = load ptr, ptr %a, align 8 - %not11 = icmp eq ptr %8, null + %8 = load i8*, i8** %a, align 8 + %not11 = icmp eq i8* %8, null br i1 %not11, label %cond.lhs12, label %cond.rhs13 cond.lhs12: ; preds = %after_assign - %9 = load ptr, ptr %b, align 8 + %9 = load i8*, i8** %b, align 8 br label %cond.phi18 cond.rhs13: ; preds = %after_assign - %optval14 = load i64, ptr %x.f, align 8 + %optval14 = load i64, i64* %x.f, align 8 %not_err15 = icmp eq i64 %optval14, 0 br i1 %not_err15, label %after_check17, label %assign_optional16 assign_optional16: ; preds = %cond.rhs13 - store i64 %optval14, ptr %y.f, align 8 + store i64 %optval14, i64* %y.f, align 8 br label %after_assign20 after_check17: ; preds = %cond.rhs13 - %10 = load ptr, ptr %x, align 8 + %10 = load i8*, i8** %x, align 8 br label %cond.phi18 cond.phi18: ; preds = %after_check17, %cond.lhs12 - %val19 = phi ptr [ %9, %cond.lhs12 ], [ %10, %after_check17 ] - store ptr %val19, ptr %y, align 8 - store i64 0, ptr %y.f, align 8 + %val19 = phi i8* [ %9, %cond.lhs12 ], [ %10, %after_check17 ] + store i8* %val19, i8** %y, align 8 + store i64 0, i64* %y.f, align 8 br label %after_assign20 after_assign20: ; preds = %cond.phi18, %assign_optional16 br label %voiderr voiderr: ; preds = %after_assign20 - %11 = load ptr, ptr %a, align 8 - %not21 = icmp eq ptr %11, null + %11 = load i8*, i8** %a, align 8 + %not21 = icmp eq i8* %11, null br i1 %not21, label %cond.lhs22, label %cond.rhs27 cond.lhs22: ; preds = %voiderr - %optval23 = load i64, ptr %x.f, align 8 + %optval23 = load i64, i64* %x.f, align 8 %not_err24 = icmp eq i64 %optval23, 0 br i1 %not_err24, label %after_check26, label %assign_optional25 assign_optional25: ; preds = %cond.lhs22 - store i64 %optval23, ptr %y.f, align 8 + store i64 %optval23, i64* %y.f, align 8 br label %after_assign34 after_check26: ; preds = %cond.lhs22 - %12 = load ptr, ptr %x, align 8 + %12 = load i8*, i8** %x, align 8 br label %cond.phi32 cond.rhs27: ; preds = %voiderr - %optval28 = load i64, ptr %x.f, align 8 + %optval28 = load i64, i64* %x.f, align 8 %not_err29 = icmp eq i64 %optval28, 0 br i1 %not_err29, label %after_check31, label %assign_optional30 assign_optional30: ; preds = %cond.rhs27 - store i64 %optval28, ptr %y.f, align 8 + store i64 %optval28, i64* %y.f, align 8 br label %after_assign34 after_check31: ; preds = %cond.rhs27 - %13 = load ptr, ptr %x, align 8 + %13 = load i8*, i8** %x, align 8 br label %cond.phi32 cond.phi32: ; preds = %after_check31, %after_check26 - %val33 = phi ptr [ %12, %after_check26 ], [ %13, %after_check31 ] - store ptr %val33, ptr %y, align 8 - store i64 0, ptr %y.f, align 8 + %val33 = phi i8* [ %12, %after_check26 ], [ %13, %after_check31 ] + store i8* %val33, i8** %y, align 8 + store i64 0, i64* %y.f, align 8 br label %after_assign34 after_assign34: ; preds = %cond.phi32, %assign_optional30, %assign_optional25 br label %voiderr35 voiderr35: ; preds = %after_assign34 - %14 = load ptr, ptr %a, align 8 - %not36 = icmp eq ptr %14, null + %14 = load i8*, i8** %a, align 8 + %not36 = icmp eq i8* %14, null br i1 %not36, label %cond.lhs37, label %cond.rhs42 cond.lhs37: ; preds = %voiderr35 - %optval38 = load i64, ptr %x.f, align 8 + %optval38 = load i64, i64* %x.f, align 8 %not_err39 = icmp eq i64 %optval38, 0 br i1 %not_err39, label %after_check41, label %assign_optional40 assign_optional40: ; preds = %cond.lhs37 - store i64 %optval38, ptr %y.f, align 8 + store i64 %optval38, i64* %y.f, align 8 br label %after_assign44 after_check41: ; preds = %cond.lhs37 - %15 = load ptr, ptr %x, align 8 + %15 = load i8*, i8** %x, align 8 br label %cond.phi43 cond.rhs42: ; preds = %voiderr35 - store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %y.f, align 8 + store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %y.f, align 8 br label %after_assign44 cond.phi43: ; preds = %after_check41 - store ptr %15, ptr %y, align 8 - store i64 0, ptr %y.f, align 8 + store i8* %15, i8** %y, align 8 + store i64 0, i64* %y.f, align 8 br label %after_assign44 after_assign44: ; preds = %cond.phi43, %cond.rhs42, %assign_optional40 br label %voiderr45 voiderr45: ; preds = %after_assign44 - %16 = load ptr, ptr %a, align 8 - %not46 = icmp eq ptr %16, null + %16 = load i8*, i8** %a, align 8 + %not46 = icmp eq i8* %16, null br i1 %not46, label %cond.lhs47, label %cond.rhs48 cond.lhs47: ; preds = %voiderr45 - store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %y.f, align 8 + store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %y.f, align 8 br label %after_assign54 cond.rhs48: ; preds = %voiderr45 - %optval49 = load i64, ptr %x.f, align 8 + %optval49 = load i64, i64* %x.f, align 8 %not_err50 = icmp eq i64 %optval49, 0 br i1 %not_err50, label %after_check52, label %assign_optional51 assign_optional51: ; preds = %cond.rhs48 - store i64 %optval49, ptr %y.f, align 8 + store i64 %optval49, i64* %y.f, align 8 br label %after_assign54 after_check52: ; preds = %cond.rhs48 - %17 = load ptr, ptr %x, align 8 + %17 = load i8*, i8** %x, align 8 br label %cond.phi53 cond.phi53: ; preds = %after_check52 - store ptr %17, ptr %y, align 8 - store i64 0, ptr %y.f, align 8 + store i8* %17, i8** %y, align 8 + store i64 0, i64* %y.f, align 8 br label %after_assign54 after_assign54: ; preds = %cond.phi53, %assign_optional51, %cond.lhs47 br label %voiderr55 voiderr55: ; preds = %after_assign54 - %18 = load ptr, ptr %a, align 8 - %not56 = icmp eq ptr %18, null + %18 = load i8*, i8** %a, align 8 + %not56 = icmp eq i8* %18, null br i1 %not56, label %cond.lhs57, label %cond.rhs58 cond.lhs57: ; preds = %voiderr55 - store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %y.f, align 8 + store i64 ptrtoint (%.fault* @"test_Test$FOO" to i64), i64* %y.f, align 8 br label %after_assign60 cond.rhs58: ; preds = %voiderr55 - store i64 ptrtoint (ptr @"test_Test$BAR" to i64), ptr %y.f, align 8 + store i64 ptrtoint (%.fault* @"test_Test$BAR" to i64), i64* %y.f, align 8 br label %after_assign60 after_assign60: ; preds = %cond.rhs58, %cond.lhs57 @@ -226,4 +226,3 @@ after_assign60: ; preds = %cond.rhs58, %cond.l voiderr61: ; preds = %after_assign60 ret void -} \ No newline at end of file diff --git a/test/test_suite2/expressions/check_implict_conversion_signed_unsigned.c3t b/test/test_suite14/expressions/check_implict_conversion_signed_unsigned.c3t similarity index 65% rename from test/test_suite2/expressions/check_implict_conversion_signed_unsigned.c3t rename to test/test_suite14/expressions/check_implict_conversion_signed_unsigned.c3t index ca0b4200f..743750b98 100644 --- a/test/test_suite2/expressions/check_implict_conversion_signed_unsigned.c3t +++ b/test/test_suite14/expressions/check_implict_conversion_signed_unsigned.c3t @@ -13,10 +13,10 @@ fn int main() entry: %a = alloca i32, align 4 %b = alloca i64, align 8 - store i32 0, ptr %a, align 4 - store i64 3, ptr %b, align 8 - %0 = load i64, ptr %b, align 8 - %1 = load i32, ptr %a, align 4 + store i32 0, i32* %a, align 4 + store i64 3, i64* %b, align 8 + %0 = load i64, i64* %b, align 8 + %1 = load i32, i32* %a, align 4 %sisiext = sext i32 %1 to i64 %sub = sub i64 %0, %sisiext ret i32 1 diff --git a/test/test_suite2/expressions/elvis.c3t b/test/test_suite14/expressions/elvis.c3t similarity index 77% rename from test/test_suite2/expressions/elvis.c3t rename to test/test_suite14/expressions/elvis.c3t index 05682ed87..f5c2b52ce 100644 --- a/test/test_suite2/expressions/elvis.c3t +++ b/test/test_suite14/expressions/elvis.c3t @@ -17,38 +17,38 @@ fn bool elvis3(bool x, bool y) // #expect: elvis.ll -define ptr @elvis_elvis(ptr %0, ptr %1) #0 { +define i32* @elvis_elvis(i32* %0, i32* %1) #0 { entry: - %ptrbool = icmp ne ptr %0, null + %ptrbool = icmp ne i32* %0, null br i1 %ptrbool, label %cond.phi, label %cond.rhs cond.rhs: ; preds = %entry br label %cond.phi cond.phi: ; preds = %cond.rhs, %entry - %val = phi ptr [ %0, %entry ], [ %1, %cond.rhs ] - ret ptr %val + %val = phi i32* [ %0, %entry ], [ %1, %cond.rhs ] + ret i32* %val } -define ptr @elvis_elvis2(ptr %0, ptr %1) #0 { +define i32* @elvis_elvis2(i32* %0, i32* %1) #0 { entry: - %ptrbool = icmp ne ptr %0, null + %ptrbool = icmp ne i32* %0, null br i1 %ptrbool, label %cond.phi3, label %cond.rhs cond.rhs: ; preds = %entry - %ptrbool1 = icmp ne ptr %1, null + %ptrbool1 = icmp ne i32* %1, null br i1 %ptrbool1, label %cond.phi, label %cond.rhs2 cond.rhs2: ; preds = %cond.rhs br label %cond.phi cond.phi: ; preds = %cond.rhs2, %cond.rhs - %val = phi ptr [ %1, %cond.rhs ], [ %0, %cond.rhs2 ] + %val = phi i32* [ %1, %cond.rhs ], [ %0, %cond.rhs2 ] br label %cond.phi3 cond.phi3: ; preds = %cond.phi, %entry - %val4 = phi ptr [ %0, %entry ], [ %val, %cond.phi ] - ret ptr %val4 + %val4 = phi i32* [ %0, %entry ], [ %val, %cond.phi ] + ret i32* %val4 } define zeroext i8 @elvis_elvis3(i8 zeroext %0, i8 zeroext %1) #0 { diff --git a/test/test_suite2/expressions/fail_index_usize.c3 b/test/test_suite14/expressions/fail_index_usize.c3 similarity index 100% rename from test/test_suite2/expressions/fail_index_usize.c3 rename to test/test_suite14/expressions/fail_index_usize.c3 diff --git a/test/test_suite2/expressions/fmuladd.c3t b/test/test_suite14/expressions/fmuladd.c3t similarity index 80% rename from test/test_suite2/expressions/fmuladd.c3t rename to test/test_suite14/expressions/fmuladd.c3t index 83eea1943..959ff8402 100644 --- a/test/test_suite2/expressions/fmuladd.c3t +++ b/test/test_suite14/expressions/fmuladd.c3t @@ -38,12 +38,12 @@ fn void main() float a = 3.1; float b = 1.4; float c = 0.1; - io::printfln("%f", tester1(a, b, c)); - io::printfln("%f", tester2(a, b, c)); - io::printfln("%f", tester3(a, b, c)); - io::printfln("%f", tester4(a, b, c)); - io::printfln("%f", tester5(a, b, c)); - io::printfln("%f", tester6(a, b, c)); + io::printfn("%f", tester1(a, b, c)); + io::printfn("%f", tester2(a, b, c)); + io::printfn("%f", tester3(a, b, c)); + io::printfn("%f", tester4(a, b, c)); + io::printfn("%f", tester5(a, b, c)); + io::printfn("%f", tester6(a, b, c)); } /* #expect: test.ll diff --git a/test/test_suite2/expressions/fmuladd_err.c3t b/test/test_suite14/expressions/fmuladd_err.c3t similarity index 73% rename from test/test_suite2/expressions/fmuladd_err.c3t rename to test/test_suite14/expressions/fmuladd_err.c3t index 1c0cadd09..b98a89097 100644 --- a/test/test_suite2/expressions/fmuladd_err.c3t +++ b/test/test_suite14/expressions/fmuladd_err.c3t @@ -25,8 +25,8 @@ entry: %a = alloca float, align 4 %s = alloca float, align 4 %postFix = alloca float, align 4 - store float %0, ptr %t, align 4 - %4 = load float, ptr %t, align 4 + store float %0, float* %t, align 4 + %4 = load float, float* %t, align 4 %eq = fcmp oeq float %4, 0.000000e+00 br i1 %eq, label %if.then, label %if.exit @@ -34,9 +34,9 @@ if.then: ; preds = %entry ret float %1 if.exit: ; preds = %entry - %5 = load float, ptr %t, align 4 + %5 = load float, float* %t, align 4 %fdiv = fdiv float %5, %3 - store float %fdiv, ptr %t, align 4 + store float %fdiv, float* %t, align 4 %eq1 = fcmp oeq float %fdiv, 1.000000e+00 br i1 %eq1, label %if.then2, label %if.exit3 @@ -46,26 +46,26 @@ if.then2: ; preds = %if.exit if.exit3: ; preds = %if.exit %fmul = fmul float %3, 0x3FD3333340000000 - store float %fmul, ptr %p, align 4 - store float %2, ptr %a, align 4 - %6 = load float, ptr %p, align 4 + store float %fmul, float* %p, align 4 + store float %2, float* %a, align 4 + %6 = load float, float* %p, align 4 %fdiv4 = fdiv float %6, 4.000000e+00 - store float %fdiv4, ptr %s, align 4 - %7 = load float, ptr %a, align 4 - %8 = load float, ptr %t, align 4 + store float %fdiv4, float* %s, align 4 + %7 = load float, float* %a, align 4 + %8 = load float, float* %t, align 4 %fsub = fsub float %8, 1.000000e+00 - store float %fsub, ptr %t, align 4 + store float %fsub, float* %t, align 4 %fmul5 = fmul float 1.000000e+01, %fsub %9 = call float @llvm.pow.f32(float 2.000000e+00, float %fmul5) %fmul6 = fmul float %7, %9 - store float %fmul6, ptr %postFix, align 4 - %10 = load float, ptr %postFix, align 4 - %11 = load float, ptr %t, align 4 - %12 = load float, ptr %s, align 4 + store float %fmul6, float* %postFix, align 4 + %10 = load float, float* %postFix, align 4 + %11 = load float, float* %t, align 4 + %12 = load float, float* %s, align 4 %13 = fneg float %12 %14 = call float @llvm.fmuladd.f32(float %11, float %3, float %13) %fmul7 = fmul float %14, 0x40191EB860000000 - %15 = load float, ptr %p, align 4 + %15 = load float, float* %p, align 4 %fdiv8 = fdiv float %fmul7, %15 %16 = call float @llvm.sin.f32(float %fdiv8) %17 = fneg float %1 diff --git a/test/test_suite2/expressions/folding_ptr.c3t b/test/test_suite14/expressions/folding_ptr.c3t similarity index 59% rename from test/test_suite2/expressions/folding_ptr.c3t rename to test/test_suite14/expressions/folding_ptr.c3t index 05f01edc0..51581256a 100644 --- a/test/test_suite2/expressions/folding_ptr.c3t +++ b/test/test_suite14/expressions/folding_ptr.c3t @@ -18,17 +18,17 @@ fn int f() define i32 @test_f() #0 { entry: - %0 = load ptr, ptr @cfun, align 8 - %ptroffset = getelementptr %Test, ptr %0, i64 0 - %not = icmp eq ptr %ptroffset, null + %0 = load %Test*, %Test** @cfun, align 8 + %ptroffset = getelementptr %Test, %Test* %0, i64 0 + %not = icmp eq %Test* %ptroffset, null br i1 %not, label %if.then, label %if.exit if.then: ; preds = %entry ret i32 0 if.exit: ; preds = %entry - %1 = load ptr, ptr @cfun, align 8 - %2 = getelementptr inbounds %Test, ptr %1, i32 0, i32 0 - %3 = load i32, ptr %2, align 8 + %1 = load %Test*, %Test** @cfun, align 8 + %2 = getelementptr inbounds %Test, %Test* %1, i32 0, i32 0 + %3 = load i32, i32* %2, align 8 ret i32 %3 } diff --git a/test/test_suite14/expressions/incdec.c3t b/test/test_suite14/expressions/incdec.c3t new file mode 100644 index 000000000..39d42d8ed --- /dev/null +++ b/test/test_suite14/expressions/incdec.c3t @@ -0,0 +1,42 @@ +fn void test(int* foo) +{ + foo++; + foo--; + int y = 10; + y++; + y--; + float z = 2.0; + z++; + ++z; + z--; +} + +// #expect: incdec.ll + + %foo = alloca i32*, align 8 + %y = alloca i32, align 4 + %z = alloca float, align 4 + store i32* %0, i32** %foo + %1 = load i32*, i32** %foo, align 8 + %ptroffset = getelementptr i32, i32* %1, i8 1 + store i32* %ptroffset, i32** %foo, align 8 + %2 = load i32*, i32** %foo, align 8 + %ptroffset1 = getelementptr i32, i32* %2, i8 -1 + store i32* %ptroffset1, i32** %foo, align 8 + store i32 10, i32* %y, align 4 + %3 = load i32, i32* %y, align 4 + %add = add i32 %3, 1 + store i32 %add, i32* %y, align 4 + %4 = load i32, i32* %y, align 4 + %sub = sub i32 %4, 1 + store i32 %sub, i32* %y, align 4 + store float 2.000000e+00, float* %z, align 4 + %5 = load float, float* %z, align 4 + %fincdec = fadd float %5, 1.000000e+00 + store float %fincdec, float* %z, align 4 + %6 = load float, float* %z, align 4 + %fincdec2 = fadd float %6, 1.000000e+00 + store float %fincdec2, float* %z, align 4 + %7 = load float, float* %z, align 4 + %fincdec3 = fadd float %7, -1.000000e+00 + store float %fincdec3, float* %z, align 4 \ No newline at end of file diff --git a/test/test_suite2/expressions/negate_int.c3 b/test/test_suite14/expressions/negate_int.c3 similarity index 100% rename from test/test_suite2/expressions/negate_int.c3 rename to test/test_suite14/expressions/negate_int.c3 diff --git a/test/test_suite2/expressions/no_valid_conversion_minus.c3 b/test/test_suite14/expressions/no_valid_conversion_minus.c3 similarity index 100% rename from test/test_suite2/expressions/no_valid_conversion_minus.c3 rename to test/test_suite14/expressions/no_valid_conversion_minus.c3 diff --git a/test/test_suite2/expressions/optional_ternary.c3t b/test/test_suite14/expressions/optional_ternary.c3t similarity index 78% rename from test/test_suite2/expressions/optional_ternary.c3t rename to test/test_suite14/expressions/optional_ternary.c3t index 231a3edb0..958d3e9d8 100644 --- a/test/test_suite2/expressions/optional_ternary.c3t +++ b/test/test_suite14/expressions/optional_ternary.c3t @@ -55,29 +55,9 @@ fn void main() int! i = test2(3); } -/* expect: test.ll -source_filename = "test" -target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-darwin" +/* #expect: test.ll -%.fault = type { i64, %"char[]" } -%"char[]" = type { i8*, i64 } -%.introspect = type { i8, i64, i64, i64, [0 x i64] } -@"test_Foo$X" = linkonce constant %.fault { i64 ptrtoint (%.introspect* @"ct$test_Foo" to i64), %"char[]" { i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.fault, i64 0, i64 0), i64 1 } }, align 8 -@.fault = internal constant [2 x i8] c"X\00", align 1 -@"ct$test_Foo" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@.zstr = internal constant [28 x i8] c"Runtime error force unwrap!\00", align 1 -@.zstr.1 = internal constant [20 x i8] c"optional_ternary.c3\00", align 1 -@.zstr.2 = internal constant [5 x i8] c"main\00", align 1 -@.zstr.3 = internal constant [28 x i8] c"Runtime error force unwrap!\00", align 1 -@.zstr.4 = internal constant [20 x i8] c"optional_ternary.c3\00", align 1 -@.zstr.5 = internal constant [5 x i8] c"main\00", align 1 -@.zstr.6 = internal constant [28 x i8] c"Runtime error force unwrap!\00", align 1 -@.zstr.7 = internal constant [20 x i8] c"optional_ternary.c3\00", align 1 -@.zstr.8 = internal constant [5 x i8] c"main\00", align 1 - -; Function Attrs: nounwind define i64 @test_test(i32* %0, i32 %1) #0 { entry: %reterr = alloca i64, align 8 @@ -347,69 +327,61 @@ after_check: ; preds = %entry br label %noerr_block panic_block: ; preds = %assign_optional - call void @std_core_builtin_panic(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.zstr, i64 0, i64 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.zstr.1, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.zstr.2, i64 0, i64 0), i32 51) + %2 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %2(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.file, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4, i32 51) unreachable noerr_block: ; preds = %after_check - %2 = call i64 @test_test7(i32* %retparam2, i32 0) - %not_err3 = icmp eq i64 %2, 0 + %3 = call i64 @test_test7(i32* %retparam2, i32 0) + %not_err3 = icmp eq i64 %3, 0 br i1 %not_err3, label %after_check5, label %assign_optional4 assign_optional4: ; preds = %noerr_block - store i64 %2, i64* %error_var1, align 8 + store i64 %3, i64* %error_var1, align 8 br label %panic_block6 after_check5: ; preds = %noerr_block - %3 = load i32, i32* %retparam2, align 4 + %4 = load i32, i32* %retparam2, align 4 br label %noerr_block7 panic_block6: ; preds = %assign_optional4 - call void @std_core_builtin_panic(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.zstr.3, i64 0, i64 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.zstr.4, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.zstr.5, i64 0, i64 0), i32 52) + %5 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %5(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg.1, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.file.2, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func.3, i64 0, i64 0), i64 4, i32 52) unreachable noerr_block7: ; preds = %after_check5 - %4 = call i64 @test_test6(i32* %retparam9, i32 1) - %not_err10 = icmp eq i64 %4, 0 + %6 = call i64 @test_test6(i32* %retparam9, i32 1) + %not_err10 = icmp eq i64 %6, 0 br i1 %not_err10, label %after_check12, label %assign_optional11 assign_optional11: ; preds = %noerr_block7 - store i64 %4, i64* %error_var8, align 8 + store i64 %6, i64* %error_var8, align 8 br label %panic_block13 after_check12: ; preds = %noerr_block7 - %5 = load i32, i32* %retparam9, align 4 + %7 = load i32, i32* %retparam9, align 4 br label %noerr_block14 panic_block13: ; preds = %assign_optional11 - call void @std_core_builtin_panic(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.zstr.6, i64 0, i64 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.zstr.7, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.zstr.8, i64 0, i64 0), i32 53) + %8 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %8(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg.4, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.file.5, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func.6, i64 0, i64 0), i64 4, i32 53) unreachable noerr_block14: ; preds = %after_check12 - %6 = call i64 @test_test2(i32* %retparam15, i32 3) - %not_err16 = icmp eq i64 %6, 0 + %9 = call i64 @test_test2(i32* %retparam15, i32 3) + %not_err16 = icmp eq i64 %9, 0 br i1 %not_err16, label %after_check18, label %assign_optional17 assign_optional17: ; preds = %noerr_block14 - store i64 %6, i64* %i.f, align 8 + store i64 %9, i64* %i.f, align 8 br label %after_assign after_check18: ; preds = %noerr_block14 - %7 = load i32, i32* %retparam15, align 4 - store i32 %7, i32* %i, align 4 + %10 = load i32, i32* %retparam15, align 4 + store i32 %10, i32* %i, align 4 store i64 0, i64* %i.f, align 8 br label %after_assign after_assign: ; preds = %after_check18, %assign_optional17 ret void } - -; Function Attrs: nounwind -define i32 @main(i32 %0, i8** %1) #0 { -entry: - call void @test_main() - ret i32 0 -} - -declare void @std_core_builtin_panic(i8*, i8*, i8*, i32) - -attributes #0 = { nounwind } \ No newline at end of file diff --git a/test/test_suite2/expressions/parsed_numbers.c3t b/test/test_suite14/expressions/parsed_numbers.c3t similarity index 100% rename from test/test_suite2/expressions/parsed_numbers.c3t rename to test/test_suite14/expressions/parsed_numbers.c3t diff --git a/test/test_suite14/expressions/pointer_access.c3t b/test/test_suite14/expressions/pointer_access.c3t new file mode 100644 index 000000000..77cf39af5 --- /dev/null +++ b/test/test_suite14/expressions/pointer_access.c3t @@ -0,0 +1,106 @@ +// #target: macos-x64 +extern fn void printf(char* c, ...); + +struct ExtraSimple +{ + int a; + int b; + struct c + { + double e; + double f0; + double f1; + double f; + double j; + } + struct + { + int r; + int s; + } + union + { + double o0; + int o1; + } + int g; +} + + +fn void testSimple() +{ + ExtraSimple a = { .c.j = 3.3 }; + a.c.j = 3.4; + printf("a = %d, c.e = %f, c.f = %f, c.j = %f, g = %d, o0 = %f, r = %d, s = %d\n", a.a, a.c.e, a.c.f, a.c.j, a.g, a.o0, a.r, a.s); +} + +// TODO these may be wrong. +/* #expect: pointer_access.ll + +%ExtraSimple = type { i32, i32, %c, %.anon, %.anon.0, i32 } +%c = type { double, double, double, double, double } +%.anon = type { i32, i32 } +%.anon.0 = type { double } + +@"ct$pointer_access_c" = linkonce constant %.introspect { i8 10, i64 40, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 +@"ct$pointer_access_$anon" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$pointer_access_$anon.4" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$pointer_access_ExtraSimple" = linkonce constant %.introspect { i8 10, i64 72, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [71 x i8] c"a = %d, c.e = %f, c.f = %f, c.j = %f, g = %d, o0 = %f, r = %d, s = %d\0A\00", align 1 + +define void @pointer_access_testSimple() #0 { +entry: + %a = alloca %ExtraSimple, align 8 + %0 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0 + store i32 0, i32* %0, align 8 + %1 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 1 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 + %3 = getelementptr inbounds %c, %c* %2, i32 0, i32 0 + store double 0.000000e+00, double* %3, align 8 + %4 = getelementptr inbounds %c, %c* %2, i32 0, i32 1 + store double 0.000000e+00, double* %4, align 8 + %5 = getelementptr inbounds %c, %c* %2, i32 0, i32 2 + store double 0.000000e+00, double* %5, align 8 + %6 = getelementptr inbounds %c, %c* %2, i32 0, i32 3 + store double 0.000000e+00, double* %6, align 8 + %7 = getelementptr inbounds %c, %c* %2, i32 0, i32 4 + store double 3.300000e+00, double* %7, align 8 + %8 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3 + %9 = getelementptr inbounds %.anon, %.anon* %8, i32 0, i32 0 + store i32 0, i32* %9, align 8 + %10 = getelementptr inbounds %.anon, %.anon* %8, i32 0, i32 1 + store i32 0, i32* %10, align 4 + %11 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4 + %12 = bitcast %.anon.0* %11 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %12, i8 0, i64 8, i1 false) + %13 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5 + store i32 0, i32* %13, align 8 + %14 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 + %15 = getelementptr inbounds %c, %c* %14, i32 0, i32 4 + store double 3.400000e+00, double* %15, align 8 + %16 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 0 + %17 = load i32, i32* %16, align 8 + %18 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 + %19 = getelementptr inbounds %c, %c* %18, i32 0, i32 0 + %20 = load double, double* %19, align 8 + %21 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 + %22 = getelementptr inbounds %c, %c* %21, i32 0, i32 3 + %23 = load double, double* %22, align 8 + %24 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 2 + %25 = getelementptr inbounds %c, %c* %24, i32 0, i32 4 + %26 = load double, double* %25, align 8 + %27 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 5 + %28 = load i32, i32* %27, align 8 + %29 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 4 + %30 = bitcast %.anon.0* %29 to double* + %31 = load double, double* %30, align 8 + %32 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3 + %33 = getelementptr inbounds %.anon, %.anon* %32, i32 0, i32 0 + %34 = load i32, i32* %33, align 8 + %35 = getelementptr inbounds %ExtraSimple, %ExtraSimple* %a, i32 0, i32 3 + %36 = getelementptr inbounds %.anon, %.anon* %35, i32 0, i32 1 + %37 = load i32, i32* %36, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str, i32 0, i32 0), i32 %17, double %20, double %23, double %26, i32 %28, double %31, i32 %34, i32 %37) + ret void +} diff --git a/test/test_suite2/expressions/pointer_arith.c3 b/test/test_suite14/expressions/pointer_arith.c3 similarity index 100% rename from test/test_suite2/expressions/pointer_arith.c3 rename to test/test_suite14/expressions/pointer_arith.c3 diff --git a/test/test_suite2/expressions/pointer_conv_error.c3 b/test/test_suite14/expressions/pointer_conv_error.c3 similarity index 100% rename from test/test_suite2/expressions/pointer_conv_error.c3 rename to test/test_suite14/expressions/pointer_conv_error.c3 diff --git a/test/test_suite2/expressions/pointer_to_bool.c3 b/test/test_suite14/expressions/pointer_to_bool.c3 similarity index 100% rename from test/test_suite2/expressions/pointer_to_bool.c3 rename to test/test_suite14/expressions/pointer_to_bool.c3 diff --git a/test/test_suite2/expressions/rvalues.c3 b/test/test_suite14/expressions/rvalues.c3 similarity index 100% rename from test/test_suite2/expressions/rvalues.c3 rename to test/test_suite14/expressions/rvalues.c3 diff --git a/test/test_suite2/expressions/simple_float_sub_neg.c3t b/test/test_suite14/expressions/simple_float_sub_neg.c3t similarity index 100% rename from test/test_suite2/expressions/simple_float_sub_neg.c3t rename to test/test_suite14/expressions/simple_float_sub_neg.c3t diff --git a/test/test_suite2/expressions/strings.c3t b/test/test_suite14/expressions/strings.c3t similarity index 100% rename from test/test_suite2/expressions/strings.c3t rename to test/test_suite14/expressions/strings.c3t diff --git a/test/test_suite2/expressions/ternary_bool.c3t b/test/test_suite14/expressions/ternary_bool.c3t similarity index 73% rename from test/test_suite2/expressions/ternary_bool.c3t rename to test/test_suite14/expressions/ternary_bool.c3t index ac559f05f..f723b3a09 100644 --- a/test/test_suite2/expressions/ternary_bool.c3t +++ b/test/test_suite14/expressions/ternary_bool.c3t @@ -18,23 +18,23 @@ fn void main() define void @ternary_bool_main() #0 { entry: %b = alloca i8, align 1 - %c = alloca ptr, align 8 - store i8 1, ptr %b, align 1 - store ptr %b, ptr %c, align 8 - %0 = load ptr, ptr %c, align 8 - %1 = load i8, ptr %0, align 8 + %c = alloca i8*, align 8 + store i8 1, i8* %b, align 1 + store i8* %b, i8** %c, align 8 + %0 = load i8*, i8** %c, align 8 + %1 = load i8, i8* %0, align 8 %2 = trunc i8 %1 to i1 br i1 %2, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %3 = load ptr, ptr %c, align 8 - %4 = load i8, ptr %3, align 8 + %3 = load i8*, i8** %c, align 8 + %4 = load i8, i8* %3, align 8 %5 = trunc i8 %4 to i1 br label %cond.phi cond.rhs: ; preds = %entry - %6 = load ptr, ptr %c, align 8 - %7 = load i8, ptr %6, align 8 + %6 = load i8*, i8** %c, align 8 + %7 = load i8, i8* %6, align 8 %8 = trunc i8 %7 to i1 br label %cond.phi @@ -43,21 +43,21 @@ cond.phi: ; preds = %cond.rhs, %cond.lhs br i1 %val, label %if.then, label %if.exit if.then: ; preds = %cond.phi - call void (ptr, ...) @printf(ptr @.str) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0)) br label %if.exit if.exit: ; preds = %if.then, %cond.phi - %9 = load i8, ptr %b, align 1 + %9 = load i8, i8* %b, align 1 %10 = trunc i8 %9 to i1 br i1 %10, label %cond.lhs1, label %cond.rhs2 cond.lhs1: ; preds = %if.exit - %11 = load i8, ptr %b, align 1 + %11 = load i8, i8* %b, align 1 %12 = trunc i8 %11 to i1 br label %cond.phi3 cond.rhs2: ; preds = %if.exit - %13 = load i8, ptr %b, align 1 + %13 = load i8, i8* %b, align 1 %14 = trunc i8 %13 to i1 br label %cond.phi3 @@ -66,18 +66,18 @@ cond.phi3: ; preds = %cond.rhs2, %cond.lh br i1 %val4, label %if.then5, label %if.exit6 if.then5: ; preds = %cond.phi3 - call void (ptr, ...) @printf(ptr @.str.1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0)) br label %if.exit6 if.exit6: ; preds = %if.then5, %cond.phi3 - %15 = load ptr, ptr %c, align 8 - %16 = load i8, ptr %15, align 8 + %15 = load i8*, i8** %c, align 8 + %16 = load i8, i8* %15, align 8 %17 = trunc i8 %16 to i1 br i1 %17, label %cond.phi8, label %cond.rhs7 cond.rhs7: ; preds = %if.exit6 - %18 = load ptr, ptr %c, align 8 - %19 = load i8, ptr %18, align 8 + %18 = load i8*, i8** %c, align 8 + %19 = load i8, i8* %18, align 8 %20 = trunc i8 %19 to i1 br label %cond.phi8 @@ -86,16 +86,16 @@ cond.phi8: ; preds = %cond.rhs7, %if.exit br i1 %val9, label %if.then10, label %if.exit11 if.then10: ; preds = %cond.phi8 - call void (ptr, ...) @printf(ptr @.str.2) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0)) br label %if.exit11 if.exit11: ; preds = %if.then10, %cond.phi8 - %21 = load i8, ptr %b, align 1 + %21 = load i8, i8* %b, align 1 %22 = trunc i8 %21 to i1 br i1 %22, label %cond.phi13, label %cond.rhs12 cond.rhs12: ; preds = %if.exit11 - %23 = load i8, ptr %b, align 1 + %23 = load i8, i8* %b, align 1 %24 = trunc i8 %23 to i1 br label %cond.phi13 @@ -104,7 +104,7 @@ cond.phi13: ; preds = %cond.rhs12, %if.exi br i1 %val14, label %if.then15, label %if.exit16 if.then15: ; preds = %cond.phi13 - call void (ptr, ...) @printf(ptr @.str.3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0)) br label %if.exit16 if.exit16: ; preds = %if.then15, %cond.phi13 diff --git a/test/test_suite2/expressions/ternary_no_ident.c3 b/test/test_suite14/expressions/ternary_no_ident.c3 similarity index 100% rename from test/test_suite2/expressions/ternary_no_ident.c3 rename to test/test_suite14/expressions/ternary_no_ident.c3 diff --git a/test/test_suite14/expressions/type_support.c3t b/test/test_suite14/expressions/type_support.c3t new file mode 100644 index 000000000..a472c459a --- /dev/null +++ b/test/test_suite14/expressions/type_support.c3t @@ -0,0 +1,77 @@ +// #target: macos-x64 + +module test; +import std::io; + +macro print_type_info(...) +{ + $for (var $i = 0; $i < $vacount; $i++): + io::printfn("type: %s", $vatype($i).nameof); + io::printfn("%s.sizeof = %d", $vatype($i).nameof, $vatype($i).sizeof); + io::printfn("%s.min = %s", $vatype($i).nameof, $vatype($i).min); + io::printfn("%s.max = %s\n", $vatype($i).nameof, $vatype($i).max); + $endfor; +} + +fn void main() +{ + io::printfn("Unsigned integers:"); + print_type_info(char, ushort, uint, ulong, uptr, usz, usz); + io::printfn("Signed integers:"); + print_type_info(ichar, short, int, long, iptr, isz, isz); + io::printfn("Floats:"); + print_type_info(float, double); +} + +/* #expect: test.ll + + +i64 0 +i64 1 +i8 0 +i8 -1 +i16 0 +i16 -1 +i64 4 +i64 2 +i32 0 +i32 -1 +i64 8 +i64 0 +i64 -1 +i64 8 +i64 0 +i64 -1 +i64 8 +i64 0 +i64 -1 +i64 8 +i64 0 +i64 -1 +i64 1 +i8 -128 +i8 127 +i64 2 +i16 -32768 +i16 32767 +i64 4 +i32 -2147483648 +i32 2147483647 +i64 8 +i64 -9223372036854775808 +i64 9223372036854775807 +i64 8 +i64 -9223372036854775808 +i64 9223372036854775807 +i64 8 +i64 -9223372036854775808 +i64 9223372036854775807 +i64 8 +i64 -9223372036854775808 +i64 9223372036854775807 +i64 4 +float 0xC7EFFFFFE0000000 +float 0x47EFFFFFE0000000 +i64 8 +double 0xFFEFFFFFFFFFFFFF +double 0x7FEFFFFFFFFFFFFF \ No newline at end of file diff --git a/test/test_suite2/expressions/unsafe_comparisons.c3 b/test/test_suite14/expressions/unsafe_comparisons.c3 similarity index 100% rename from test/test_suite2/expressions/unsafe_comparisons.c3 rename to test/test_suite14/expressions/unsafe_comparisons.c3 diff --git a/test/test_suite2/floats/convert_float.c3t b/test/test_suite14/floats/convert_float.c3t similarity index 58% rename from test/test_suite2/floats/convert_float.c3t rename to test/test_suite14/floats/convert_float.c3t index 533849d35..dfe0fdd62 100644 --- a/test/test_suite2/floats/convert_float.c3t +++ b/test/test_suite14/floats/convert_float.c3t @@ -13,12 +13,12 @@ define void @foo_test() #0 { entry: %x = alloca float, align 4 %y = alloca double, align 8 - store float 1.200000e+01, ptr %x, align 4 - %0 = load float, ptr %x, align 4 + store float 1.200000e+01, float* %x, align 4 + %0 = load float, float* %x, align 4 %fmul = fmul float %0, -1.000000e+00 - store float %fmul, ptr %x, align 4 - %1 = load float, ptr %x, align 4 + store float %fmul, float* %x, align 4 + %1 = load float, float* %x, align 4 %fpfpext = fpext float %1 to double - store double %fpfpext, ptr %y, align 8 + store double %fpfpext, double* %y, align 8 ret void -} \ No newline at end of file +} diff --git a/test/test_suite2/floats/explicit_float_truncation_needed.c3 b/test/test_suite14/floats/explicit_float_truncation_needed.c3 similarity index 100% rename from test/test_suite2/floats/explicit_float_truncation_needed.c3 rename to test/test_suite14/floats/explicit_float_truncation_needed.c3 diff --git a/test/test_suite2/floats/float_exceeding_size.c3 b/test/test_suite14/floats/float_exceeding_size.c3 similarity index 100% rename from test/test_suite2/floats/float_exceeding_size.c3 rename to test/test_suite14/floats/float_exceeding_size.c3 diff --git a/test/test_suite2/floats/inf_nan.c3t b/test/test_suite14/floats/inf_nan.c3t similarity index 53% rename from test/test_suite2/floats/inf_nan.c3t rename to test/test_suite14/floats/inf_nan.c3t index a0c712bc7..b3a776a76 100644 --- a/test/test_suite2/floats/inf_nan.c3t +++ b/test/test_suite14/floats/inf_nan.c3t @@ -9,18 +9,18 @@ fn void main() double x = (double)(z); } -/* #expect: fe.ll +// #expect: fe.ll %z = alloca float, align 4 %z2 = alloca double, align 8 %g = alloca float, align 4 %g2 = alloca double, align 8 %x = alloca double, align 8 - store float 0x7FF0000000000000, ptr %z, align 4 - store double 0x7FF0000000000000, ptr %z2, align 8 - store float 0x7FF8000000000000, ptr %g, align 4 - store double 0x7FF8000000000000, ptr %g2, align 8 - %0 = load float, ptr %z, align 4 + store float 0x7FF0000000000000, float* %z, align 4 + store double 0x7FF0000000000000, double* %z2, align 8 + store float 0x7FF8000000000000, float* %g, align 4 + store double 0x7FF8000000000000, double* %g2, align 8 + %0 = load float, float* %z, align 4 %fpfpext = fpext float %0 to double - store double %fpfpext, ptr %x, align 8 + store double %fpfpext, double* %x, align 8 ret void \ No newline at end of file diff --git a/test/test_suite2/from_docs/examples_defer.c3t b/test/test_suite14/from_docs/examples_defer.c3t similarity index 52% rename from test/test_suite2/from_docs/examples_defer.c3t rename to test/test_suite14/from_docs/examples_defer.c3t index 4bc7ddd58..31e7136ce 100644 --- a/test/test_suite2/from_docs/examples_defer.c3t +++ b/test/test_suite14/from_docs/examples_defer.c3t @@ -29,8 +29,8 @@ entry: br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry - %1 = call i32 @std_io_print(ptr @.str) - %2 = call i32 @std_io_println(ptr @.str.1) #1 + %1 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) + %2 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.1, i32 0, i32 0)) #1 ret void if.exit: ; preds = %entry @@ -38,16 +38,16 @@ if.exit: ; preds = %entry br i1 %eq1, label %if.then2, label %if.exit3 if.then2: ; preds = %if.exit - %3 = call i32 @std_io_print(ptr @.str.2) - %4 = call i32 @std_io_print(ptr @.str.3) - %5 = call i32 @std_io_println(ptr @.str.4) #1 + %3 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i32 0, i32 0)) + %4 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i32 0, i32 0)) + %5 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.4, i32 0, i32 0)) #1 ret void if.exit3: ; preds = %if.exit - %6 = call i32 @std_io_print(ptr @.str.5) - %7 = call i32 @std_io_print(ptr @.str.6) - %8 = call i32 @std_io_print(ptr @.str.7) - %9 = call i32 @std_io_println(ptr @.str.8) #1 + %6 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0)) + %7 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) + %8 = call i32 @std_io_print(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i32 0, i32 0)) + %9 = call i32 @std_io_println(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.8, i32 0, i32 0)) #1 ret void } @@ -58,4 +58,4 @@ entry: call void @defer1_test(i32 0) call void @defer1_test(i32 10) ret void -} +} \ No newline at end of file diff --git a/test/test_suite2/from_docs/examples_forswitch.c3t b/test/test_suite14/from_docs/examples_forswitch.c3t similarity index 73% rename from test/test_suite2/from_docs/examples_forswitch.c3t rename to test/test_suite14/from_docs/examples_forswitch.c3t index 437e4c4a5..446c24e63 100644 --- a/test/test_suite2/from_docs/examples_forswitch.c3t +++ b/test/test_suite14/from_docs/examples_forswitch.c3t @@ -92,25 +92,25 @@ fn void demo_enum(Height h) define void @examples_example_for() #0 { entry: %i = alloca i32, align 4 - store i32 0, ptr %i, align 4 + store i32 0, i32* %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %0 = load i32, ptr %i, align 4 + %0 = load i32, i32* %i, align 4 %lt = icmp slt i32 %0, 10 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %1 = load i32, ptr %i, align 4 - %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) - %3 = load i32, ptr %i, align 4 + %1 = load i32, i32* %i, align 4 + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) + %3 = load i32, i32* %i, align 4 %add = add i32 %3, 1 - store i32 %add, ptr %i, align 4 + store i32 %add, i32* %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - %4 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %4(ptr @.panic_msg, i64 19, ptr @.file, i64 21, ptr @.func, i64 11, i32 14) + %4 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %4(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.panic_msg, i64 0, i64 0), i64 19, i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.file, i64 0, i64 0), i64 21, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.func, i64 0, i64 0), i64 11, i32 14) unreachable unreachable_block: ; No predecessors! @@ -127,11 +127,11 @@ entry: %switch17 = alloca i32, align 4 %a = alloca i32, align 4 %a21 = alloca i32, align 4 - store i32 %0, ptr %switch, align 4 + store i32 %0, i32* %switch, align 4 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i32, ptr %switch, align 4 + %1 = load i32, i32* %switch, align 4 switch i32 %1, label %switch.exit [ i32 0, label %switch.case i32 1, label %switch.case @@ -139,19 +139,19 @@ switch.entry: ; preds = %entry ] switch.case: ; preds = %switch.entry, %switch.entry - %2 = call i32 @std_io_println(ptr @.str.1) #1 + %2 = call i32 @std_io_println(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)) #1 br label %switch.exit switch.case1: ; preds = %switch.entry - %3 = call i32 @std_io_println(ptr @.str.2) #1 + %3 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0)) #1 br label %switch.exit switch.exit: ; preds = %switch.case1, %switch.case, %switch.entry - store i32 %0, ptr %switch2, align 4 + store i32 %0, i32* %switch2, align 4 br label %switch.entry3 switch.entry3: ; preds = %switch.exit - %4 = load i32, ptr %switch2, align 4 + %4 = load i32, i32* %switch2, align 4 switch i32 %4, label %switch.exit6 [ i32 0, label %switch.case4 i32 1, label %switch.case4 @@ -159,19 +159,19 @@ switch.entry3: ; preds = %switch.exit ] switch.case4: ; preds = %switch.entry3, %switch.entry3 - %5 = call i32 @std_io_println(ptr @.str.3) #1 + %5 = call i32 @std_io_println(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0)) #1 br label %switch.exit6 switch.case5: ; preds = %switch.entry3 - %6 = call i32 @std_io_println(ptr @.str.4) #1 + %6 = call i32 @std_io_println(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0)) #1 br label %switch.exit6 switch.exit6: ; preds = %switch.case5, %switch.case4, %switch.entry3 - store i32 %0, ptr %switch7, align 4 + store i32 %0, i32* %switch7, align 4 br label %switch.entry8 switch.entry8: ; preds = %switch.exit6 - %7 = load i32, ptr %switch7, align 4 + %7 = load i32, i32* %switch7, align 4 switch i32 %7, label %switch.exit12 [ i32 0, label %switch.case9 i32 1, label %switch.case10 @@ -182,18 +182,18 @@ switch.case9: ; preds = %switch.entry8 br label %switch.exit12 switch.case10: ; preds = %switch.entry8 - %8 = call i32 @std_io_println(ptr @.str.5) #1 + %8 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #1 br label %switch.exit12 switch.case11: ; preds = %switch.entry8 br label %switch.exit12 switch.exit12: ; preds = %switch.case11, %switch.case10, %switch.case9, %switch.entry8 - store i32 %0, ptr %switch13, align 4 + store i32 %0, i32* %switch13, align 4 br label %switch.entry14 switch.entry14: ; preds = %switch.exit12 - %9 = load i32, ptr %switch13, align 4 + %9 = load i32, i32* %switch13, align 4 switch i32 %9, label %switch.default [ i32 0, label %switch.case15 i32 1, label %switch.case15 @@ -207,11 +207,11 @@ switch.default: ; preds = %switch.entry14 br label %switch.exit16 switch.exit16: ; preds = %switch.default, %switch.case15 - store i32 %0, ptr %switch17, align 4 + store i32 %0, i32* %switch17, align 4 br label %switch.entry18 switch.entry18: ; preds = %switch.exit16 - %10 = load i32, ptr %switch17, align 4 + %10 = load i32, i32* %switch17, align 4 switch i32 %10, label %switch.exit23 [ i32 0, label %switch.case19 i32 1, label %switch.case20 @@ -219,19 +219,19 @@ switch.entry18: ; preds = %switch.exit16 ] switch.case19: ; preds = %switch.entry18 - store i32 1, ptr %a, align 4 - %11 = call i32 @std_io_println(ptr @.str.6) #1 + store i32 1, i32* %a, align 4 + %11 = call i32 @std_io_println(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) #1 br label %switch.case20 switch.case20: ; preds = %switch.entry18, %switch.case19 - store i32 2, ptr %a21, align 4 - %12 = call i32 @std_io_println(ptr @.str.7) #1 + store i32 2, i32* %a21, align 4 + %12 = call i32 @std_io_println(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i32 0, i32 0)) #1 br label %switch.case22 switch.case22: ; preds = %switch.entry18, %switch.case20 - %13 = call i32 @std_io_println(ptr @.str.8) #1 + %13 = call i32 @std_io_println(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.8, i32 0, i32 0)) #1 br label %switch.exit23 switch.exit23: ; preds = %switch.case22, %switch.entry18 ret void -} \ No newline at end of file +} diff --git a/test/test_suite2/from_docs/examples_functionpointer.c3t b/test/test_suite14/from_docs/examples_functionpointer.c3t similarity index 56% rename from test/test_suite2/from_docs/examples_functionpointer.c3t rename to test/test_suite14/from_docs/examples_functionpointer.c3t index cbdc50894..81e152e89 100644 --- a/test/test_suite2/from_docs/examples_functionpointer.c3t +++ b/test/test_suite14/from_docs/examples_functionpointer.c3t @@ -16,10 +16,9 @@ fn void main() // .. } -/* #expect: demo.ll +// #expect: demo.ll - -define i32 @demo_my_callback(ptr %0, i32 %1) #0 { +define i32 @demo_my_callback(i8* %0, i32 %1) #0 { entry: ret i32 0 } @@ -27,8 +26,8 @@ entry: define void @demo_main() #0 { entry: %result = alloca i32, align 4 - %0 = load ptr, ptr @demo_cb, align 8 - %1 = call i32 %0(ptr @.str, i32 123) - store i32 %1, ptr %result, align 4 + %0 = load i32 (i8*, i32)*, i32 (i8*, i32)** @demo_cb, align 8 + %1 = call i32 %0(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i32 123) + store i32 %1, i32* %result, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite2/from_docs/examples_if_catch.c3t b/test/test_suite14/from_docs/examples_if_catch.c3t similarity index 72% rename from test/test_suite2/from_docs/examples_if_catch.c3t rename to test/test_suite14/from_docs/examples_if_catch.c3t index 24071c8ab..5a82a6fa7 100644 --- a/test/test_suite2/from_docs/examples_if_catch.c3t +++ b/test/test_suite14/from_docs/examples_if_catch.c3t @@ -26,7 +26,7 @@ fn void! testMayError() fn void main() { - // ratio has an optional type. + // ratio has a failable type. double! ratio = divide(foo(), bar()); // Handle the error @@ -46,23 +46,25 @@ fn void main() /* #expect: demo.ll -define i64 @demo_divide(ptr %0, i32 %1, i32 %2) #0 { + +define i64 @demo_divide(double* %0, i32 %1, i32 %2) #0 { entry: %reterr = alloca i64, align 8 %eq = icmp eq i32 %2, 0 br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %entry - ret i64 ptrtoint (ptr @"demo_MathError$DIVISION_BY_ZERO" to i64) + ret i64 ptrtoint (%.fault* @"demo_MathError$DIVISION_BY_ZERO" to i64) if.exit: ; preds = %entry %sifp = sitofp i32 %1 to double %sifp1 = sitofp i32 %2 to double %fdiv = fdiv double %sifp, %sifp1 - store double %fdiv, ptr %0, align 8 + store double %fdiv, double* %0, align 8 ret i64 0 } +; Function Attrs: nounwind define i64 @demo_testMayError() #0 { entry: %error_var = alloca i64, align 8 @@ -70,25 +72,26 @@ entry: %reterr = alloca i64, align 8 %0 = call i32 @demo_foo() %1 = call i32 @demo_bar() - %2 = call i64 @demo_divide(ptr %retparam, i32 %0, i32 %1) + %2 = call i64 @demo_divide(double* %retparam, i32 %0, i32 %1) %not_err = icmp eq i64 %2, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %2, ptr %error_var, align 8 + store i64 %2, i64* %error_var, align 8 br label %guard_block after_check: ; preds = %entry br label %noerr_block guard_block: ; preds = %assign_optional - %3 = load i64, ptr %error_var, align 8 + %3 = load i64, i64* %error_var, align 8 ret i64 %3 noerr_block: ; preds = %after_check ret i64 0 } +; Function Attrs: nounwind define void @demo_main() #0 { entry: %ratio = alloca double, align 8 @@ -98,63 +101,63 @@ entry: %switch = alloca i64, align 8 %0 = call i32 @demo_foo() %1 = call i32 @demo_bar() - %2 = call i64 @demo_divide(ptr %retparam, i32 %0, i32 %1) + %2 = call i64 @demo_divide(double* %retparam, i32 %0, i32 %1) %not_err = icmp eq i64 %2, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %2, ptr %ratio.f, align 8 + store i64 %2, i64* %ratio.f, align 8 br label %after_assign after_check: ; preds = %entry - %3 = load double, ptr %retparam, align 8 - store double %3, ptr %ratio, align 8 - store i64 0, ptr %ratio.f, align 8 + %3 = load double, double* %retparam, align 8 + store double %3, double* %ratio, align 8 + store i64 0, i64* %ratio.f, align 8 br label %after_assign after_assign: ; preds = %after_check, %assign_optional br label %testblock testblock: ; preds = %after_assign - %optval = load i64, ptr %ratio.f, align 8 + %optval = load i64, i64* %ratio.f, align 8 %not_err1 = icmp eq i64 %optval, 0 br i1 %not_err1, label %after_check3, label %assign_optional2 assign_optional2: ; preds = %testblock - store i64 %optval, ptr %err, align 8 + store i64 %optval, i64* %err, align 8 br label %end_block after_check3: ; preds = %testblock - store i64 0, ptr %err, align 8 + store i64 0, i64* %err, align 8 br label %end_block end_block: ; preds = %after_check3, %assign_optional2 - %4 = load i64, ptr %err, align 8 + %4 = load i64, i64* %err, align 8 %neq = icmp ne i64 %4, 0 br i1 %neq, label %if.then, label %if.exit if.then: ; preds = %end_block - store i64 %4, ptr %switch, align 8 + store i64 %4, i64* %switch, align 8 br label %switch.entry switch.entry: ; preds = %if.then - %5 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"demo_MathError$DIVISION_BY_ZERO" to i64), %5 + %5 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.fault* @"demo_MathError$DIVISION_BY_ZERO" to i64), %5 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - %6 = call i32 (ptr, ...) @printf(ptr @.str) + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str, i32 0, i32 0)) ret void next_if: ; preds = %switch.entry br label %switch.default switch.default: ; preds = %next_if - %7 = call i32 (ptr, ...) @printf(ptr @.str.1) + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i32 0, i32 0)) ret void if.exit: ; preds = %end_block - %8 = load double, ptr %ratio, align 8 - %9 = call i32 (ptr, ...) @printf(ptr @.str.2, double %8) + %8 = load double, double* %ratio, align 8 + %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i32 0, i32 0), double %8) ret void } \ No newline at end of file diff --git a/test/test_suite2/from_docs/examples_macro_function.c3t b/test/test_suite14/from_docs/examples_macro_function.c3t similarity index 65% rename from test/test_suite2/from_docs/examples_macro_function.c3t rename to test/test_suite14/from_docs/examples_macro_function.c3t index 20cd4ae5c..2e071cb37 100644 --- a/test/test_suite2/from_docs/examples_macro_function.c3t +++ b/test/test_suite14/from_docs/examples_macro_function.c3t @@ -33,18 +33,18 @@ define i32 @example_test() #0 { entry: %a = alloca i32, align 4 %b = alloca i32, align 4 - %a1 = alloca ptr, align 8 + %a1 = alloca i32 (i32)*, align 8 %b2 = alloca i32, align 4 - store i32 2, ptr %a, align 4 - store i32 3, ptr %b, align 4 - store ptr @example_square, ptr %a1, align 8 - store i32 2, ptr %b2, align 4 - %0 = load ptr, ptr %a1, align 8 - %1 = load i32, ptr %b2, align 4 + store i32 2, i32* %a, align 4 + store i32 3, i32* %b, align 4 + store i32 (i32)* @example_square, i32 (i32)** %a1, align 8 + store i32 2, i32* %b2, align 4 + %0 = load i32 (i32)*, i32 (i32)** %a1, align 8 + %1 = load i32, i32* %b2, align 4 %2 = call i32 %0(i32 %1) - %3 = load i32, ptr %a, align 4 + %3 = load i32, i32* %a, align 4 %add = add i32 %2, %3 - %4 = load i32, ptr %b, align 4 + %4 = load i32, i32* %b, align 4 %add3 = add i32 %add, %4 ret i32 %add3 } \ No newline at end of file diff --git a/test/test_suite2/from_docs/examples_struct.c3 b/test/test_suite14/from_docs/examples_struct.c3 similarity index 100% rename from test/test_suite2/from_docs/examples_struct.c3 rename to test/test_suite14/from_docs/examples_struct.c3 diff --git a/test/test_suite2/functions/after_vararg.c3 b/test/test_suite14/functions/after_vararg.c3 similarity index 100% rename from test/test_suite2/functions/after_vararg.c3 rename to test/test_suite14/functions/after_vararg.c3 diff --git a/test/test_suite2/functions/assorted_tests.c3t b/test/test_suite14/functions/assorted_tests.c3t similarity index 67% rename from test/test_suite2/functions/assorted_tests.c3t rename to test/test_suite14/functions/assorted_tests.c3t index 0691478a4..93dc4989b 100644 --- a/test/test_suite2/functions/assorted_tests.c3t +++ b/test/test_suite14/functions/assorted_tests.c3t @@ -50,18 +50,17 @@ fn void denormalize(InternalFPF* ptr) /* #expect: test.ll - define i32 @test_foo1() #0 { entry: - %pp = alloca ptr, align 8 + %pp = alloca i8*, align 8 %w_cnt = alloca i32, align 4 - %0 = load i32, ptr %w_cnt, align 4 - %1 = load ptr, ptr %pp, align 8 - %2 = load i8, ptr %1, align 8 + %0 = load i32, i32* %w_cnt, align 4 + %1 = load i8*, i8** %pp, align 8 + %2 = load i8, i8* %1, align 8 %zext = zext i8 %2 to i32 %add = add i32 %0, %zext - store i32 %add, ptr %w_cnt, align 4 - %3 = load i32, ptr %w_cnt, align 4 + store i32 %add, i32* %w_cnt, align 4 + %3 = load i32, i32* %w_cnt, align 4 ret i32 %3 } @@ -73,7 +72,7 @@ entry: ret void } -define i32 @test_trys(ptr %0, i32 %1) #0 { +define i32 @test_trys(i8* %0, i32 %1) #0 { entry: %asa = alloca i32, align 4 %val = alloca double, align 8 @@ -82,29 +81,29 @@ entry: br i1 %intbool, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, ptr %lls, align 4 - %3 = load i32, ptr %asa, align 4 + %2 = load i32, i32* %lls, align 4 + %3 = load i32, i32* %asa, align 4 %add = add i32 %2, %3 - store i32 %add, ptr %asa, align 4 + store i32 %add, i32* %asa, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry - %4 = load i32, ptr %asa, align 4 - %5 = load double, ptr %val, align 8 + %4 = load i32, i32* %asa, align 4 + %5 = load double, double* %val, align 8 %fpsi = fptosi double %5 to i32 %add1 = add i32 %4, %fpsi ret i32 %add1 } -define void @test_setInternalFPFZero(ptr %0) #1 { +define void @test_setInternalFPFZero(%InternalFPF* %0) #1 { entry: - %1 = getelementptr inbounds %InternalFPF, ptr %0, i32 0, i32 0 - store i8 0, ptr %1, align 8 + %1 = getelementptr inbounds %InternalFPF, %InternalFPF* %0, i32 0, i32 0 + store i8 0, i8* %1, align 8 ret void } -define void @test_denormalize(ptr %0) #0 { +define void @test_denormalize(%InternalFPF* %0) #0 { entry: - call void @test_setInternalFPFZero(ptr %0) + call void @test_setInternalFPFZero(%InternalFPF* %0) ret void } diff --git a/test/test_suite2/functions/body_argument_fail.c3 b/test/test_suite14/functions/body_argument_fail.c3 similarity index 100% rename from test/test_suite2/functions/body_argument_fail.c3 rename to test/test_suite14/functions/body_argument_fail.c3 diff --git a/test/test_suite2/functions/default_param_fail.c3 b/test/test_suite14/functions/default_param_fail.c3 similarity index 100% rename from test/test_suite2/functions/default_param_fail.c3 rename to test/test_suite14/functions/default_param_fail.c3 diff --git a/test/test_suite2/functions/defered_default_arguments.c3t b/test/test_suite14/functions/defered_default_arguments.c3t similarity index 82% rename from test/test_suite2/functions/defered_default_arguments.c3t rename to test/test_suite14/functions/defered_default_arguments.c3t index 2510dff2f..e7ecc1211 100644 --- a/test/test_suite2/functions/defered_default_arguments.c3t +++ b/test/test_suite14/functions/defered_default_arguments.c3t @@ -41,14 +41,14 @@ entry: %0 = call i32 @test2_foo() call void @test_test(i32 3, i32 %0) call void @test_test(i32 1, i32 32) - %1 = load i32, ptr @"main$x", align 4 + %1 = load i32, i32* @"main$x", align 4 %add = add i32 %1, 1 - store i32 %add, ptr @"main$x", align 4 + store i32 %add, i32* @"main$x", align 4 %2 = call i32 @test2_foo() call void @test_test(i32 %add, i32 %2) - %3 = load i32, ptr @"main$x.1", align 4 + %3 = load i32, i32* @"main$x.1", align 4 %add1 = add i32 %3, 1 - store i32 %add1, ptr @"main$x.1", align 4 + store i32 %add1, i32* @"main$x.1", align 4 %4 = call i32 @test2_foo() call void @test_test(i32 %add1, i32 %4) ret void diff --git a/test/test_suite2/functions/double_return.c3t b/test/test_suite14/functions/double_return.c3t similarity index 100% rename from test/test_suite2/functions/double_return.c3t rename to test/test_suite14/functions/double_return.c3t diff --git a/test/test_suite2/functions/failable_param.c3 b/test/test_suite14/functions/failable_param.c3 similarity index 100% rename from test/test_suite2/functions/failable_param.c3 rename to test/test_suite14/functions/failable_param.c3 diff --git a/test/test_suite2/functions/func_ptr_conversion_alias.c3t b/test/test_suite14/functions/func_ptr_conversion_alias.c3t similarity index 100% rename from test/test_suite2/functions/func_ptr_conversion_alias.c3t rename to test/test_suite14/functions/func_ptr_conversion_alias.c3t diff --git a/test/test_suite14/functions/func_ptr_conversions_and_names.c3t b/test/test_suite14/functions/func_ptr_conversions_and_names.c3t new file mode 100644 index 000000000..2cc3d8c06 --- /dev/null +++ b/test/test_suite14/functions/func_ptr_conversions_and_names.c3t @@ -0,0 +1,294 @@ +// #target: macos-x64 +module test; +import std::io; +define Func = fn int(int y); +define FuncOther = fn bool(char*); +define FuncSame = fn int(int z = 444); + +fn int test(int a) { return a; } +fn int test2(int b = 3) { return b; } + +fn int! test3(int b = 3) { return b; } +fn int! test4(int b = 3) { return b; } + +fn void main() +{ + Func a = &test; + Func b = &test2; + io::printfn("%d", a(.y = 123)); + io::printfn("%d", (&test2)()); + FuncSame z = &test2; + io::printfn("%d", z()); + io::printfn("%s", $typeof(b ? &test2 : &test).qnameof); + io::printfn("%s", $typeof(b ? &test2 : &test).nameof); + io::printfn("%s", $typeof(&test2).qnameof); + io::printfn("%s", $typeof(&test2).nameof); + io::printfn("%s", $typeof(b ? &test4 : &test3).nameof); + + $typeof(b ? &test2 : &test) y = &test2; + typeid zfoke = $typeof(y).typeid; +} + + +/* #expect: test.ll + +@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@.str.1 = private unnamed_addr constant [3 x i8] c"%d\00", align 1 +@.str.2 = private unnamed_addr constant [3 x i8] c"%d\00", align 1 +@.str.3 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 +@.str.4 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 +@"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$a12$char" = linkonce constant %.introspect { i8 15, i64 12, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 12, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a12$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a12$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@.str.5 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 +@.str.6 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 +@.str.7 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 +@.str.8 = private unnamed_addr constant [13 x i8] c"test::test2*\00", align 1 +@.str.9 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 +@.str.10 = private unnamed_addr constant [7 x i8] c"test2*\00", align 1 +@"ct$a6$char" = linkonce constant %.introspect { i8 15, i64 6, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 6, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a6$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a6$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@.str.11 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 +@.str.12 = private unnamed_addr constant [14 x i8] c"fn int!(int)*\00", align 1 +@"ct$a13$char" = linkonce constant %.introspect { i8 15, i64 13, i64 ptrtoint (%.introspect* @"ct$char" to i64), i64 13, [0 x i64] zeroinitializer }, align 8 +@"ct$p$a13$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$a13$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$fn$int$int$" = linkonce constant %.introspect { i8 13, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$p$fn$int$int$" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$fn$int$int$" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 + + +define void @test_main() #0 { +entry: + %a = alloca i32 (i32)*, align 8 + %b = alloca i32 (i32)*, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [1 x %variant], align 16 + %taddr4 = alloca i32, align 4 + %taddr5 = alloca %"variant[]", align 8 + %z = alloca i32 (i32)*, align 8 + %retparam11 = alloca i64, align 8 + %varargslots12 = alloca [1 x %variant], align 16 + %taddr13 = alloca i32, align 4 + %taddr14 = alloca %"variant[]", align 8 + %retparam20 = alloca i64, align 8 + %varargslots21 = alloca [1 x %variant], align 16 + %taddr22 = alloca [12 x i8]*, align 8 + %taddr23 = alloca %"variant[]", align 8 + %retparam29 = alloca i64, align 8 + %varargslots30 = alloca [1 x %variant], align 16 + %taddr31 = alloca [12 x i8]*, align 8 + %taddr32 = alloca %"variant[]", align 8 + %retparam38 = alloca i64, align 8 + %varargslots39 = alloca [1 x %variant], align 16 + %taddr40 = alloca [12 x i8]*, align 8 + %taddr41 = alloca %"variant[]", align 8 + %retparam47 = alloca i64, align 8 + %varargslots48 = alloca [1 x %variant], align 16 + %taddr49 = alloca [6 x i8]*, align 8 + %taddr50 = alloca %"variant[]", align 8 + %retparam56 = alloca i64, align 8 + %varargslots57 = alloca [1 x %variant], align 16 + %taddr58 = alloca [13 x i8]*, align 8 + %taddr59 = alloca %"variant[]", align 8 + %y = alloca i32 (i32)*, align 8 + %zfoke = alloca i64, align 8 + store i32 (i32)* @test_test, i32 (i32)** %a, align 8 + store i32 (i32)* @test_test2, i32 (i32)** %b, align 8 + %0 = load i32 (i32)*, i32 (i32)** %a, align 8 + %1 = call i32 %0(i32 123) + store i32 %1, i32* %taddr, align 4 + %2 = bitcast i32* %taddr to i8* + %3 = insertvalue %variant undef, i8* %2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %4, %variant* %5, align 16 + %6 = bitcast [1 x %variant]* %varargslots to %variant* + %7 = insertvalue %"variant[]" undef, %variant* %6, 0 + %8 = insertvalue %"variant[]" %7, i64 1, 1 + store %"variant[]" %8, %"variant[]"* %taddr1, align 8 + %9 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 + %lo = load i8*, i8** %10, align 8 + %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 + %hi = load i64, i64* %11, align 8 + %12 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %12, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %13 = call i32 @test_test2(i32 3) + store i32 %13, i32* %taddr4, align 4 + %14 = bitcast i32* %taddr4 to i8* + %15 = insertvalue %variant undef, i8* %14, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %17 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 + store %variant %16, %variant* %17, align 16 + %18 = bitcast [1 x %variant]* %varargslots3 to %variant* + %19 = insertvalue %"variant[]" undef, %variant* %18, 0 + %20 = insertvalue %"variant[]" %19, i64 1, 1 + store %"variant[]" %20, %"variant[]"* %taddr5, align 8 + %21 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 + %lo6 = load i8*, i8** %22, align 8 + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 + %hi7 = load i64, i64* %23, align 8 + %24 = call i64 @std_io_printfn(i64* %retparam2, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %24, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %voiderr + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %voiderr + store i32 (i32)* @test_test2, i32 (i32)** %z, align 8 + %25 = load i32 (i32)*, i32 (i32)** %z, align 8 + %26 = call i32 %25(i32 444) + store i32 %26, i32* %taddr13, align 4 + %27 = bitcast i32* %taddr13 to i8* + %28 = insertvalue %variant undef, i8* %27, 0 + %29 = insertvalue %variant %28, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %30 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 + store %variant %29, %variant* %30, align 16 + %31 = bitcast [1 x %variant]* %varargslots12 to %variant* + %32 = insertvalue %"variant[]" undef, %variant* %31, 0 + %33 = insertvalue %"variant[]" %32, i64 1, 1 + store %"variant[]" %33, %"variant[]"* %taddr14, align 8 + %34 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* + %35 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %34, i32 0, i32 0 + %lo15 = load i8*, i8** %35, align 8 + %36 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %34, i32 0, i32 1 + %hi16 = load i64, i64* %36, align 8 + %37 = call i64 @std_io_printfn(i64* %retparam11, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo15, i64 %hi16) + %not_err17 = icmp eq i64 %37, 0 + br i1 %not_err17, label %after_check18, label %voiderr19 + +after_check18: ; preds = %voiderr10 + br label %voiderr19 + +voiderr19: ; preds = %after_check18, %voiderr10 + store [12 x i8]* bitcast ([13 x i8]* @.str.4 to [12 x i8]*), [12 x i8]** %taddr22, align 8 + %38 = bitcast [12 x i8]** %taddr22 to i8* + %39 = insertvalue %variant undef, i8* %38, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$p$a12$char" to i64), 1 + %41 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots21, i64 0, i64 0 + store %variant %40, %variant* %41, align 16 + %42 = bitcast [1 x %variant]* %varargslots21 to %variant* + %43 = insertvalue %"variant[]" undef, %variant* %42, 0 + %44 = insertvalue %"variant[]" %43, i64 1, 1 + store %"variant[]" %44, %"variant[]"* %taddr23, align 8 + %45 = bitcast %"variant[]"* %taddr23 to { i8*, i64 }* + %46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0 + %lo24 = load i8*, i8** %46, align 8 + %47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1 + %hi25 = load i64, i64* %47, align 8 + %48 = call i64 @std_io_printfn(i64* %retparam20, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo24, i64 %hi25) + %not_err26 = icmp eq i64 %48, 0 + br i1 %not_err26, label %after_check27, label %voiderr28 + +after_check27: ; preds = %voiderr19 + br label %voiderr28 + +voiderr28: ; preds = %after_check27, %voiderr19 + store [12 x i8]* bitcast ([13 x i8]* @.str.6 to [12 x i8]*), [12 x i8]** %taddr31, align 8 + %49 = bitcast [12 x i8]** %taddr31 to i8* + %50 = insertvalue %variant undef, i8* %49, 0 + %51 = insertvalue %variant %50, i64 ptrtoint (%.introspect* @"ct$p$a12$char" to i64), 1 + %52 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots30, i64 0, i64 0 + store %variant %51, %variant* %52, align 16 + %53 = bitcast [1 x %variant]* %varargslots30 to %variant* + %54 = insertvalue %"variant[]" undef, %variant* %53, 0 + %55 = insertvalue %"variant[]" %54, i64 1, 1 + store %"variant[]" %55, %"variant[]"* %taddr32, align 8 + %56 = bitcast %"variant[]"* %taddr32 to { i8*, i64 }* + %57 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 0 + %lo33 = load i8*, i8** %57, align 8 + %58 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 1 + %hi34 = load i64, i64* %58, align 8 + %59 = call i64 @std_io_printfn(i64* %retparam29, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i32 0, i32 0), i64 2, i8* %lo33, i64 %hi34) + %not_err35 = icmp eq i64 %59, 0 + br i1 %not_err35, label %after_check36, label %voiderr37 + +after_check36: ; preds = %voiderr28 + br label %voiderr37 + +voiderr37: ; preds = %after_check36, %voiderr28 + store [12 x i8]* bitcast ([13 x i8]* @.str.8 to [12 x i8]*), [12 x i8]** %taddr40, align 8 + %60 = bitcast [12 x i8]** %taddr40 to i8* + %61 = insertvalue %variant undef, i8* %60, 0 + %62 = insertvalue %variant %61, i64 ptrtoint (%.introspect* @"ct$p$a12$char" to i64), 1 + %63 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots39, i64 0, i64 0 + store %variant %62, %variant* %63, align 16 + %64 = bitcast [1 x %variant]* %varargslots39 to %variant* + %65 = insertvalue %"variant[]" undef, %variant* %64, 0 + %66 = insertvalue %"variant[]" %65, i64 1, 1 + store %"variant[]" %66, %"variant[]"* %taddr41, align 8 + %67 = bitcast %"variant[]"* %taddr41 to { i8*, i64 }* + %68 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %67, i32 0, i32 0 + %lo42 = load i8*, i8** %68, align 8 + %69 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %67, i32 0, i32 1 + %hi43 = load i64, i64* %69, align 8 + %70 = call i64 @std_io_printfn(i64* %retparam38, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.7, i32 0, i32 0), i64 2, i8* %lo42, i64 %hi43) + %not_err44 = icmp eq i64 %70, 0 + br i1 %not_err44, label %after_check45, label %voiderr46 + +after_check45: ; preds = %voiderr37 + br label %voiderr46 + +voiderr46: ; preds = %after_check45, %voiderr37 + store [6 x i8]* bitcast ([7 x i8]* @.str.10 to [6 x i8]*), [6 x i8]** %taddr49, align 8 + %71 = bitcast [6 x i8]** %taddr49 to i8* + %72 = insertvalue %variant undef, i8* %71, 0 + %73 = insertvalue %variant %72, i64 ptrtoint (%.introspect* @"ct$p$a6$char" to i64), 1 + %74 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots48, i64 0, i64 0 + store %variant %73, %variant* %74, align 16 + %75 = bitcast [1 x %variant]* %varargslots48 to %variant* + %76 = insertvalue %"variant[]" undef, %variant* %75, 0 + %77 = insertvalue %"variant[]" %76, i64 1, 1 + store %"variant[]" %77, %"variant[]"* %taddr50, align 8 + %78 = bitcast %"variant[]"* %taddr50 to { i8*, i64 }* + %79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 0 + %lo51 = load i8*, i8** %79, align 8 + %80 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %78, i32 0, i32 1 + %hi52 = load i64, i64* %80, align 8 + %81 = call i64 @std_io_printfn(i64* %retparam47, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0), i64 2, i8* %lo51, i64 %hi52) + %not_err53 = icmp eq i64 %81, 0 + br i1 %not_err53, label %after_check54, label %voiderr55 + +after_check54: ; preds = %voiderr46 + br label %voiderr55 + +voiderr55: ; preds = %after_check54, %voiderr46 + store [13 x i8]* bitcast ([14 x i8]* @.str.12 to [13 x i8]*), [13 x i8]** %taddr58, align 8 + %82 = bitcast [13 x i8]** %taddr58 to i8* + %83 = insertvalue %variant undef, i8* %82, 0 + %84 = insertvalue %variant %83, i64 ptrtoint (%.introspect* @"ct$p$a13$char" to i64), 1 + %85 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots57, i64 0, i64 0 + store %variant %84, %variant* %85, align 16 + %86 = bitcast [1 x %variant]* %varargslots57 to %variant* + %87 = insertvalue %"variant[]" undef, %variant* %86, 0 + %88 = insertvalue %"variant[]" %87, i64 1, 1 + store %"variant[]" %88, %"variant[]"* %taddr59, align 8 + %89 = bitcast %"variant[]"* %taddr59 to { i8*, i64 }* + %90 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 0 + %lo60 = load i8*, i8** %90, align 8 + %91 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %89, i32 0, i32 1 + %hi61 = load i64, i64* %91, align 8 + %92 = call i64 @std_io_printfn(i64* %retparam56, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.11, i32 0, i32 0), i64 2, i8* %lo60, i64 %hi61) + %not_err62 = icmp eq i64 %92, 0 + br i1 %not_err62, label %after_check63, label %voiderr64 + +after_check63: ; preds = %voiderr55 + br label %voiderr64 + +voiderr64: ; preds = %after_check63, %voiderr55 + store i32 (i32)* @test_test2, i32 (i32)** %y, align 8 + store i64 ptrtoint (%.introspect* @"ct$p$fn$int$int$" to i64), i64* %zfoke, align 8 + ret void +} diff --git a/test/test_suite2/functions/invalid_param.c3 b/test/test_suite14/functions/invalid_param.c3 similarity index 100% rename from test/test_suite2/functions/invalid_param.c3 rename to test/test_suite14/functions/invalid_param.c3 diff --git a/test/test_suite2/functions/macro_arguments.c3 b/test/test_suite14/functions/macro_arguments.c3 similarity index 100% rename from test/test_suite2/functions/macro_arguments.c3 rename to test/test_suite14/functions/macro_arguments.c3 diff --git a/test/test_suite2/functions/missing_first_paren.c3 b/test/test_suite14/functions/missing_first_paren.c3 similarity index 100% rename from test/test_suite2/functions/missing_first_paren.c3 rename to test/test_suite14/functions/missing_first_paren.c3 diff --git a/test/test_suite2/functions/missing_return.c3 b/test/test_suite14/functions/missing_return.c3 similarity index 100% rename from test/test_suite2/functions/missing_return.c3 rename to test/test_suite14/functions/missing_return.c3 diff --git a/test/test_suite2/functions/naked_function.c3t b/test/test_suite14/functions/naked_function.c3t similarity index 84% rename from test/test_suite2/functions/naked_function.c3t rename to test/test_suite14/functions/naked_function.c3t index 86580849e..55830a596 100644 --- a/test/test_suite2/functions/naked_function.c3t +++ b/test/test_suite14/functions/naked_function.c3t @@ -5,7 +5,7 @@ fn void test(int i) @naked } -// #expect: naked_function.ll +/* #expect: naked_function.ll define void @naked_function_test(i32 %0) #0 { entry: diff --git a/test/test_suite2/functions/naked_function_fail.c3 b/test/test_suite14/functions/naked_function_fail.c3 similarity index 100% rename from test/test_suite2/functions/naked_function_fail.c3 rename to test/test_suite14/functions/naked_function_fail.c3 diff --git a/test/test_suite2/functions/returning_void.c3t b/test/test_suite14/functions/returning_void.c3t similarity index 80% rename from test/test_suite2/functions/returning_void.c3t rename to test/test_suite14/functions/returning_void.c3t index 6b6d3bd50..887a270ae 100644 --- a/test/test_suite2/functions/returning_void.c3t +++ b/test/test_suite14/functions/returning_void.c3t @@ -7,8 +7,8 @@ fn void test1() // #expect: returning_void.ll %x = alloca i32, align 4 - store i32 0, ptr %x, align 4 - %0 = load i32, ptr %x, align 4 + store i32 0, i32* %x, align 4 + %0 = load i32, i32* %x, align 4 %eq = icmp eq i32 %0, 0 br i1 %eq, label %if.then, label %if.exit diff --git a/test/test_suite14/functions/simple_test.c3t b/test/test_suite14/functions/simple_test.c3t new file mode 100644 index 000000000..889c1be63 --- /dev/null +++ b/test/test_suite14/functions/simple_test.c3t @@ -0,0 +1,30 @@ +// #target: macos-x64 + +fn int foo() +{ + char *pp; + uint w_cnt; + + w_cnt += *pp; + + return w_cnt; +} + +/* #expect: simple_test.ll + + +define i32 @simple_test_foo() #0 { +entry: + %pp = alloca i8*, align 8 + %w_cnt = alloca i32, align 4 + store i8* null, i8** %pp, align 8 + store i32 0, i32* %w_cnt, align 4 + %0 = load i32, i32* %w_cnt, align 4 + %1 = load i8*, i8** %pp, align 8 + %2 = load i8, i8* %1, align 8 + %zext = zext i8 %2 to i32 + %add = add i32 %0, %zext + store i32 %add, i32* %w_cnt, align 4 + %3 = load i32, i32* %w_cnt, align 4 + ret i32 %3 +} \ No newline at end of file diff --git a/test/test_suite14/functions/splat.c3t b/test/test_suite14/functions/splat.c3t new file mode 100644 index 000000000..3a7bd0ddb --- /dev/null +++ b/test/test_suite14/functions/splat.c3t @@ -0,0 +1,69 @@ +// #target: macos-x64 +module splat; + +extern fn int sum_us(int... x); + +fn void test() +{ + sum_us(1, 2, 3); + int[3] x = { 1, 2, 3 }; + int[] z = &x; + sum_us(...x); + sum_us(...z); + sum_us(); +} + +/* #expect: splat.ll + + %varargslots = alloca [3 x i32], align 4 + %taddr = alloca %"int[]", align 8 + %x = alloca [3 x i32], align 4 + %z = alloca %"int[]", align 8 + %taddr1 = alloca %"int[]", align 8 + %taddr6 = alloca %"int[]", align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 0 + store i32 1, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 1 + store i32 2, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 2 + store i32 3, i32* %2, align 4 + %3 = bitcast [3 x i32]* %varargslots to i32* + %4 = insertvalue %"int[]" undef, i32* %3, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + store %"int[]" %5, %"int[]"* %taddr, align 8 + %6 = bitcast %"int[]"* %taddr to { i8*, i64 }* + %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %6, i32 0, i32 0 + %lo = load i8*, i8** %7, align 8 + %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %6, i32 0, i32 1 + %hi = load i64, i64* %8, align 8 + %9 = call i32 @sum_us(i8* %lo, i64 %hi) + %10 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %10, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %11 = bitcast [3 x i32]* %x to i32* + %12 = insertvalue %"int[]" undef, i32* %11, 0 + %13 = insertvalue %"int[]" %12, i64 3, 1 + store %"int[]" %13, %"int[]"* %z, align 8 + %14 = bitcast [3 x i32]* %x to i32* + %15 = insertvalue %"int[]" undef, i32* %14, 0 + %16 = insertvalue %"int[]" %15, i64 3, 1 + store %"int[]" %16, %"int[]"* %taddr1, align 8 + %17 = bitcast %"int[]"* %taddr1 to { i8*, i64 }* + %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 + %lo2 = load i8*, i8** %18, align 8 + %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 + %hi3 = load i64, i64* %19, align 8 + %20 = call i32 @sum_us(i8* %lo2, i64 %hi3) + %21 = bitcast %"int[]"* %z to { i8*, i64 }* + %22 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 0 + %lo4 = load i8*, i8** %22, align 8 + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %21, i32 0, i32 1 + %hi5 = load i64, i64* %23, align 8 + %24 = call i32 @sum_us(i8* %lo4, i64 %hi5) + store %"int[]" zeroinitializer, %"int[]"* %taddr6, align 8 + %25 = bitcast %"int[]"* %taddr6 to { i8*, i64 }* + %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 0 + %lo7 = load i8*, i8** %26, align 8 + %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %25, i32 0, i32 1 + %hi8 = load i64, i64* %27, align 8 + %28 = call i32 @sum_us(i8* %lo7, i64 %hi8) + ret void diff --git a/test/test_suite14/functions/splat_aarch64.c3t b/test/test_suite14/functions/splat_aarch64.c3t new file mode 100644 index 000000000..42a088556 --- /dev/null +++ b/test/test_suite14/functions/splat_aarch64.c3t @@ -0,0 +1,64 @@ +// #target: linux-aarch64 +module splat; + +extern fn int sum_us(int... x); + +fn void test() +{ + sum_us(1, 2, 3); + int[3] x = { 1, 2, 3 }; + int[] z = &x; + sum_us(...x); + sum_us(...z); + sum_us(); +} + +/* #expect: splat.ll + +%"int[]" = type { i32*, i64 } + +declare i32 @sum_us([2 x i64]) #0 + +define void @splat_test() #0 { +entry: + %varargslots = alloca [3 x i32], align 4 + %taddr = alloca %"int[]", align 8 + %x = alloca [3 x i32], align 4 + %z = alloca %"int[]", align 8 + %taddr1 = alloca %"int[]", align 8 + %taddr2 = alloca %"int[]", align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 0 + store i32 1, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 1 + store i32 2, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 2 + store i32 3, i32* %2, align 4 + %3 = bitcast [3 x i32]* %varargslots to i32* + %4 = insertvalue %"int[]" undef, i32* %3, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + store %"int[]" %5, %"int[]"* %taddr, align 8 + %6 = bitcast %"int[]"* %taddr to [2 x i64]* + %7 = load [2 x i64], [2 x i64]* %6, align 8 + %8 = call i32 @sum_us([2 x i64] %7) + %9 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %10 = bitcast [3 x i32]* %x to i32* + %11 = insertvalue %"int[]" undef, i32* %10, 0 + %12 = insertvalue %"int[]" %11, i64 3, 1 + store %"int[]" %12, %"int[]"* %z, align 8 + %13 = bitcast [3 x i32]* %x to i32* + %14 = insertvalue %"int[]" undef, i32* %13, 0 + %15 = insertvalue %"int[]" %14, i64 3, 1 + store %"int[]" %15, %"int[]"* %taddr1, align 8 + %16 = bitcast %"int[]"* %taddr1 to [2 x i64]* + %17 = load [2 x i64], [2 x i64]* %16, align 8 + %18 = call i32 @sum_us([2 x i64] %17) + %19 = bitcast %"int[]"* %z to [2 x i64]* + %20 = load [2 x i64], [2 x i64]* %19, align 8 + %21 = call i32 @sum_us([2 x i64] %20) + store %"int[]" zeroinitializer, %"int[]"* %taddr2, align 8 + %22 = bitcast %"int[]"* %taddr2 to [2 x i64]* + %23 = load [2 x i64], [2 x i64]* %22, align 8 + %24 = call i32 @sum_us([2 x i64] %23) + ret void +} diff --git a/test/test_suite14/functions/splat_mingw.c3t b/test/test_suite14/functions/splat_mingw.c3t new file mode 100644 index 000000000..2e630a581 --- /dev/null +++ b/test/test_suite14/functions/splat_mingw.c3t @@ -0,0 +1,55 @@ +// #target: mingw-x64 +module splat; + +extern fn int sum_us(int... x); + +fn void test() +{ + sum_us(1, 2, 3); + int[3] x = { 1, 2, 3 }; + int[] z = &x; + sum_us(...x); + sum_us(...z); + sum_us(); +} + +/* #expect: splat.ll + +declare i32 @sum_us(%"int[]"* align 8) #0 + + %varargslots = alloca [3 x i32], align 4 + %indirectarg = alloca %"int[]", align 8 + %x = alloca [3 x i32], align 4 + %z = alloca %"int[]", align 8 + %indirectarg1 = alloca %"int[]", align 8 + %indirectarg2 = alloca %"int[]", align 8 + %indirectarg3 = alloca %"int[]", align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 0 + store i32 1, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 1 + store i32 2, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %varargslots, i64 0, i64 2 + store i32 3, i32* %2, align 4 + %3 = bitcast [3 x i32]* %varargslots to i32* + %4 = insertvalue %"int[]" undef, i32* %3, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + store %"int[]" %5, %"int[]"* %indirectarg, align 8 + %6 = call i32 @sum_us(%"int[]"* align 8 %indirectarg) + %7 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %7, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %8 = bitcast [3 x i32]* %x to i32* + %9 = insertvalue %"int[]" undef, i32* %8, 0 + %10 = insertvalue %"int[]" %9, i64 3, 1 + store %"int[]" %10, %"int[]"* %z, align 8 + %11 = bitcast [3 x i32]* %x to i32* + %12 = insertvalue %"int[]" undef, i32* %11, 0 + %13 = insertvalue %"int[]" %12, i64 3, 1 + store %"int[]" %13, %"int[]"* %indirectarg1, align 8 + %14 = call i32 @sum_us(%"int[]"* align 8 %indirectarg1) + %15 = bitcast %"int[]"* %indirectarg2 to i8* + %16 = bitcast %"int[]"* %z to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %15, i8* align 8 %16, i32 16, i1 false) + %17 = call i32 @sum_us(%"int[]"* align 8 %indirectarg2) + store %"int[]" zeroinitializer, %"int[]"* %indirectarg3, align 8 + %18 = call i32 @sum_us(%"int[]"* align 8 %indirectarg3) + ret void diff --git a/test/test_suite2/functions/static_vars.c3t b/test/test_suite14/functions/static_vars.c3t similarity index 72% rename from test/test_suite2/functions/static_vars.c3t rename to test/test_suite14/functions/static_vars.c3t index ac7205f65..3c164b321 100644 --- a/test/test_suite2/functions/static_vars.c3t +++ b/test/test_suite14/functions/static_vars.c3t @@ -15,9 +15,9 @@ fn int test() define i32 @foo_test() #0 { entry: - %0 = load i32, ptr @"test$x", align 4 + %0 = load i32, i32* @"test$x", align 4 %add = add i32 %0, 1 - store i32 %add, ptr @"test$x", align 4 - %1 = load i32, ptr @"test$x", align 4 + store i32 %add, i32* @"test$x", align 4 + %1 = load i32, i32* @"test$x", align 4 ret i32 %1 } diff --git a/test/test_suite14/functions/test_regression.c3t b/test/test_suite14/functions/test_regression.c3t new file mode 100644 index 000000000..89b467cec --- /dev/null +++ b/test/test_suite14/functions/test_regression.c3t @@ -0,0 +1,691 @@ +// #target: macos-x64 + +module test; +import test2; +import std::array::list; +import std::array::linkedlist; +import hello_world; + + +extern fn int printf(char *, ...); + +fn void helloWorld() +{ + printf("helloWorld!\n"); +} +fn int test_static() +{ + static int x = 1; + x++; + printf("Test static %d\n", x); + return x; +} + +struct Bobo { short b; float c; short d; short e; float f; short g; } + + +struct Blob { int z; int f; } + +union Foor +{ + long a; + char[12] b; +} + + +fn int helo(double d, Bobo b) +{ + int[3] de = { 1, 2, 3 }; + Bobo c = b; + helo(1.0, c); + return 1; +} + + +fn int test1(int a, int b) +{ + a = a >> b; + if (b > 128) return -1; + return a; +} + +struct Foo2 +{ + int x; +} + +fn void Foo2.printme(Foo2 *foo) +{ + printf("Foo is: %d\n", foo.x); +} + +fn int Foo2.mutate(Foo2 *foo) +{ + printf("Mutating"); + return ++foo.x; +} + +define oopsInt = test2::argh; +define oopsDouble = test2::argh; +define Argh = fn int(double, Bobo); +define Argh2 = fn int(double, Bobo); + + + +fn int sum_us(int... x) +{ + int sum = 0; + if (x.len == 0) return 0; + sum += x[0] + sum_us(...x[1..^1]); + return sum; +} + +define Frob = long; + +fn int sumd(int[] x) +{ + int sum = 0; + for (int i = 0; i < x.len; i++) sum += x[i]; + return sum; +} + +struct Foo +{ + int a; + int b; +} + +define getValueInt = test2::getValue; +define getValueDouble = test2::getValue; +define IntBlob = test2::Blob; +define DoubleBlob = Blob; +define getMultInt = test2::getMult; +define getMultDouble = test2::getMult; + +define IntArray = List; +define IntList = LinkedList; + +enum MyEnum : int +{ + HELO, + WORLD, + BYE +} + + +fn void main() +{ + test_static(); + test_static(); + test_static(); + hello_world::hello(); + IntList list; + list.push(10); + list.push(15); + list.push(30); + for (int i = 0; i < (int)(list.len()); i++) + { + printf("Element[%d]: %d\n", i, list.get(i)); + } + list.free(); + + printf("Elements: %d\n", (int)(MyEnum.elements)); + + int elements = MyEnum.elements; + printf("Hello\n"); + IntArray array; + array.append(100); + array.append(200); + array.append(400); + array.push(600); + array.insert_at(2, 300); + for (int i = 0; i < (int)(array.len()); i++) + { + printf("Element[%d]: %d\n", i, array.get(i)); + } + array.free(); + IntBlob a = { 42 }; + DoubleBlob b = { 33.3 }; + printf("a was %d\n", getValueInt(a)); + printf("b was %f\n", getValueDouble(b)); + printf("Mult int was %d\n", getMultInt(25)); + printf("Mult double was %f\n", getMultDouble(3.3)); + + + helloWorld(); + Foo ddx; + int fro = 3; + int[4] x = { 1, 2, 3, 3 }; + fro += printf("1Vararg4splatA: %d\n", sum_us(...x)); + printf("%d\n", fro); + int[] z = &x; + int[3] de = { 1, 2, 3 }; + printf("Vararg4splatB: %d\n", sum_us(...&x)); + printf("Vararg4splatC: %d\n", sum_us(...z)); + printf("Vararg4: %d\n", sum_us(1, 2, 4, 5)); + printf("Vararg1: %d\n", sum_us(1)); + printf("Vararg0: %d\n", sum_us()); + Argh a1; + Argh2 b2; +} + +module hello_world; +import foo; + +extern fn int printf(char *, ...); +define doubleMult = foo::check; + +fn void hello() +{ + printf("Hello baby\n"); + printf("Mult %f\n", doubleMult(11.1)); +} + +module foo ; + +fn Type check(Type i) +{ + return i * i; +} + +module test2 ; + +struct Blob +{ + Type a; +} + +fn Type getMult(Type a) +{ + return a * a; +} +Type argh = 234; + +fault MyErr +{ + X, + Y +} + +enum Hello : int +{ + FOO, + BAR, +} + +macro Hello wut() +{ + return Hello.FOO; +} + +define Bye = Hello; +define wat = wut; +define byebye = hello; + +fn int hello() +{ + return 1; +} + +fn Type getValue(Blob blob) +{ + return blob.a; +} + +/* #expect: test.ll + +%Blob = type { i32 } +%Blob.0 = type { double } +%Foo2 = type { i32 } +%Bobo = type { i16, float, i16, i16, float, i16 } +%"int[]" = type { i32*, i64 } +%LinkedList = type { i64, %Node*, %Node* } +%Node = type { %Node*, %Node*, i32 } +%List = type { i64, i64, %Allocator*, i32* } +%Allocator = type { i64 (i8**, %Allocator*, i64, i64, i64, i8*, i32)* } +%Foo = type { i32, i32 } + +@"ct$test_Bobo" = linkonce constant %.introspect { i8 10, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 +@"ct$test_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$test_Foor" = linkonce constant %.introspect { i8 11, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (%.introspect* @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.enum.0, i64 0, i64 0), i64 4 }, %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.enum.1, i64 0, i64 0), i64 5 }, %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.enum.2, i64 0, i64 0), i64 3 }] }, align 8 + +define void @test_Foo2_printme(%Foo2* %0) #0 { +entry: + %1 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 + %2 = load i32, i32* %1, align 8 + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.21, i32 0, i32 0), i32 %2) + ret void +} + +; Function Attrs: nounwind +define i32 @test_Foo2_mutate(%Foo2* %0) #0 { +entry: + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.22, i32 0, i32 0)) + %2 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 + %3 = load i32, i32* %2, align 8 + %add = add i32 %3, 1 + store i32 %add, i32* %2, align 8 + ret i32 %add +} + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +define void @test_helloWorld() #0 { +entry: + %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0)) + ret void +} + +; Function Attrs: nounwind +define i32 @test_test_static() #0 { +entry: + %0 = load i32, i32* @"test_static$x", align 4 + %add = add i32 %0, 1 + store i32 %add, i32* @"test_static$x", align 4 + %1 = load i32, i32* @"test_static$x", align 4 + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i32 0, i32 0), i32 %1) + %3 = load i32, i32* @"test_static$x", align 4 + ret i32 %3 +} + +; Function Attrs: nounwind +define i32 @test_helo(double %0, %Bobo* byval(%Bobo) align 8 %1) #0 { +entry: + %de = alloca [3 x i32], align 4 + %c = alloca %Bobo, align 4 + %indirectarg = alloca %Bobo, align 8 + %2 = bitcast [3 x i32]* %de to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %3 = bitcast %Bobo* %c to i8* + %4 = bitcast %Bobo* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 20, i1 false) + %5 = bitcast %Bobo* %indirectarg to i8* + %6 = bitcast %Bobo* %c to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %5, i8* align 4 %6, i32 20, i1 false) + %7 = call i32 @test_helo(double 1.000000e+00, %Bobo* byval(%Bobo) align 8 %indirectarg) + ret i32 1 +} + +; Function Attrs: nounwind +define i32 @test_test1(i32 %0, i32 %1) #0 { +entry: + %a = alloca i32, align 4 + store i32 %0, i32* %a, align 4 + %2 = load i32, i32* %a, align 4 + %ashr = ashr i32 %2, %1 + %3 = freeze i32 %ashr + store i32 %3, i32* %a, align 4 + %gt = icmp sgt i32 %1, 128 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i32 -1 + +if.exit: ; preds = %entry + %4 = load i32, i32* %a, align 4 + ret i32 %4 +} + +; Function Attrs: nounwind +define i32 @test_sum_us(i8* %0, i64 %1) #0 { +entry: + %x = alloca %"int[]", align 8 + %sum = alloca i32, align 4 + %taddr = alloca %"int[]", align 8 + %pair = bitcast %"int[]"* %x to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + store i32 0, i32* %sum, align 4 + %4 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 + %5 = load i64, i64* %4, align 8 + %eq = icmp eq i64 0, %5 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i32 0 + +if.exit: ; preds = %entry + %6 = load i32, i32* %sum, align 4 + %7 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 + %8 = load i32*, i32** %7, align 8 + %ptroffset = getelementptr inbounds i32, i32* %8, i64 0 + %9 = load i32, i32* %ptroffset, align 4 + %10 = load %"int[]", %"int[]"* %x, align 8 + %11 = extractvalue %"int[]" %10, 0 + %12 = extractvalue %"int[]" %10, 1 + %sub = sub i64 %12, 1 + %13 = add i64 %sub, 1 + %size = sub i64 %13, 1 + %ptroffset1 = getelementptr inbounds i32, i32* %11, i64 1 + %14 = insertvalue %"int[]" undef, i32* %ptroffset1, 0 + %15 = insertvalue %"int[]" %14, i64 %size, 1 + store %"int[]" %15, %"int[]"* %taddr, align 8 + %16 = bitcast %"int[]"* %taddr to { i8*, i64 }* + %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 0 + %lo = load i8*, i8** %17, align 8 + %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 1 + %hi = load i64, i64* %18, align 8 + %19 = call i32 @test_sum_us(i8* %lo, i64 %hi) + %add = add i32 %9, %19 + %add2 = add i32 %6, %add + store i32 %add2, i32* %sum, align 4 + %20 = load i32, i32* %sum, align 4 + ret i32 %20 +} + +; Function Attrs: nounwind +define i32 @test_sumd(i8* %0, i64 %1) #0 { +entry: + %x = alloca %"int[]", align 8 + %sum = alloca i32, align 4 + %i = alloca i32, align 4 + %pair = bitcast %"int[]"* %x to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + store i32 0, i32* %sum, align 4 + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %4 = load i32, i32* %i, align 4 + %sisiext = sext i32 %4 to i64 + %5 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 + %6 = load i64, i64* %5, align 8 + %lt = icmp slt i64 %sisiext, %6 + %check = icmp slt i64 %6, 0 + %siui-lt = or i1 %check, %lt + br i1 %siui-lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %7 = load i32, i32* %sum, align 4 + %8 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 + %9 = load i32*, i32** %8, align 8 + %10 = load i32, i32* %i, align 4 + %sisiext1 = sext i32 %10 to i64 + %ptroffset = getelementptr inbounds i32, i32* %9, i64 %sisiext1 + %11 = load i32, i32* %ptroffset, align 4 + %add = add i32 %7, %11 + store i32 %add, i32* %sum, align 4 + %12 = load i32, i32* %i, align 4 + %add2 = add i32 %12, 1 + store i32 %add2, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %13 = load i32, i32* %sum, align 4 + ret i32 %13 +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %list = alloca %LinkedList, align 8 + %i = alloca i32, align 4 + %elements = alloca i32, align 4 + %array = alloca %List, align 8 + %i1 = alloca i32, align 4 + %a = alloca %Blob, align 4 + %b = alloca %Blob.0, align 8 + %ddx = alloca %Foo, align 4 + %fro = alloca i32, align 4 + %x = alloca [4 x i32], align 16 + %taddr = alloca %"int[]", align 8 + %z = alloca %"int[]", align 8 + %de = alloca [3 x i32], align 4 + %taddr10 = alloca %"int[]", align 8 + %varargslots = alloca [4 x i32], align 16 + %taddr15 = alloca %"int[]", align 8 + %varargslots18 = alloca [1 x i32], align 4 + %taddr19 = alloca %"int[]", align 8 + %taddr22 = alloca %"int[]", align 8 + %a1 = alloca i32 (double, %Bobo*)*, align 8 + %b2 = alloca i32 (double, %Bobo*)*, align 8 + %0 = call i32 @test_test_static() + %1 = call i32 @test_test_static() + %2 = call i32 @test_test_static() + call void @hello_world_hello() + %3 = bitcast %LinkedList* %list to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 24, i1 false) + call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 10) + call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 15) + call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 30) + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %4 = load i32, i32* %i, align 4 + %5 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(%LinkedList* %list) #3 + %uisitrunc = trunc i64 %5 to i32 + %lt = icmp slt i32 %4, %uisitrunc + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %6 = load i32, i32* %i, align 4 + %7 = load i32, i32* %i, align 4 + %siuiext = sext i32 %7 to i64 + %8 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(%LinkedList* %list, i64 %siuiext) + %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %6, i32 %8) + %10 = load i32, i32* %i, align 4 + %add = add i32 %10, 1 + store i32 %add, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + call void @"std_array_linkedlist$$int_LinkedList_free"(%LinkedList* %list) + %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 3) + store i32 3, i32* %elements, align 4 + %12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + %13 = bitcast %List* %array to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %13, i8 0, i64 32, i1 false) + call void @"std_array_list$$int_List_append"(%List* %array, i32 100) + call void @"std_array_list$$int_List_append"(%List* %array, i32 200) + call void @"std_array_list$$int_List_append"(%List* %array, i32 400) + call void @"std_array_list$$int_List_push"(%List* %array, i32 600) #3 + call void @"std_array_list$$int_List_insert_at"(%List* %array, i64 2, i32 300) + store i32 0, i32* %i1, align 4 + br label %loop.cond2 + +loop.cond2: ; preds = %loop.body5, %loop.exit + %14 = load i32, i32* %i1, align 4 + %15 = call i64 @"std_array_list$$int_List_len"(%List* %array) + %uisitrunc3 = trunc i64 %15 to i32 + %lt4 = icmp slt i32 %14, %uisitrunc3 + br i1 %lt4, label %loop.body5, label %loop.exit8 + +loop.body5: ; preds = %loop.cond2 + %16 = load i32, i32* %i1, align 4 + %17 = load i32, i32* %i1, align 4 + %siuiext6 = sext i32 %17 to i64 + %18 = call i32 @"std_array_list$$int_List_get"(%List* %array, i64 %siuiext6) + %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %16, i32 %18) + %20 = load i32, i32* %i1, align 4 + %add7 = add i32 %20, 1 + store i32 %add7, i32* %i1, align 4 + br label %loop.cond2 + +loop.exit8: ; preds = %loop.cond2 + call void @"std_array_list$$int_List_free"(%List* %array) + %21 = bitcast %Blob* %a to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %21, i8* align 4 bitcast (%Blob* @.__const.6 to i8*), i32 4, i1 false) + %22 = bitcast %Blob.0* %b to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %22, i8* align 8 bitcast (%Blob.0* @.__const.7 to i8*), i32 8, i1 false) + %23 = getelementptr inbounds %Blob, %Blob* %a, i32 0, i32 0 + %24 = load i32, i32* %23, align 4 + %25 = call i32 @"test2$$int_getValue"(i32 %24) + %26 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i32 0, i32 0), i32 %25) + %27 = getelementptr inbounds %Blob.0, %Blob.0* %b, i32 0, i32 0 + %28 = load double, double* %27, align 8 + %29 = call double @"test2$$double_getValue"(double %28) + %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), double %29) + %31 = call i32 @"test2$$int_getMult"(i32 25) + %32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i32 0, i32 0), i32 %31) + %33 = call double @"test2$$double_getMult"(double 3.300000e+00) + %34 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.11, i32 0, i32 0), double %33) + call void @test_helloWorld() + %35 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 0 + store i32 0, i32* %35, align 4 + %36 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 1 + store i32 0, i32* %36, align 4 + store i32 3, i32* %fro, align 4 + %37 = bitcast [4 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %37, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false) + %38 = load i32, i32* %fro, align 4 + %39 = bitcast [4 x i32]* %x to i32* + %40 = insertvalue %"int[]" undef, i32* %39, 0 + %41 = insertvalue %"int[]" %40, i64 4, 1 + store %"int[]" %41, %"int[]"* %taddr, align 8 + %42 = bitcast %"int[]"* %taddr to { i8*, i64 }* + %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 0 + %lo = load i8*, i8** %43, align 8 + %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %42, i32 0, i32 1 + %hi = load i64, i64* %44, align 8 + %45 = call i32 @test_sum_us(i8* %lo, i64 %hi) + %46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.13, i32 0, i32 0), i32 %45) + %add9 = add i32 %38, %46 + store i32 %add9, i32* %fro, align 4 + %47 = load i32, i32* %fro, align 4 + %48 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %47) + %49 = bitcast [4 x i32]* %x to i32* + %50 = insertvalue %"int[]" undef, i32* %49, 0 + %51 = insertvalue %"int[]" %50, i64 4, 1 + store %"int[]" %51, %"int[]"* %z, align 8 + %52 = bitcast [3 x i32]* %de to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %52, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false) + %53 = bitcast [4 x i32]* %x to i32* + %54 = insertvalue %"int[]" undef, i32* %53, 0 + %55 = insertvalue %"int[]" %54, i64 4, 1 + store %"int[]" %55, %"int[]"* %taddr10, align 8 + %56 = bitcast %"int[]"* %taddr10 to { i8*, i64 }* + %57 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 0 + %lo11 = load i8*, i8** %57, align 8 + %58 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %56, i32 0, i32 1 + %hi12 = load i64, i64* %58, align 8 + %59 = call i32 @test_sum_us(i8* %lo11, i64 %hi12) + %60 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.16, i32 0, i32 0), i32 %59) + %61 = bitcast %"int[]"* %z to { i8*, i64 }* + %62 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 0 + %lo13 = load i8*, i8** %62, align 8 + %63 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 1 + %hi14 = load i64, i64* %63, align 8 + %64 = call i32 @test_sum_us(i8* %lo13, i64 %hi14) + %65 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.17, i32 0, i32 0), i32 %64) + %66 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0 + store i32 1, i32* %66, align 4 + %67 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1 + store i32 2, i32* %67, align 4 + %68 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2 + store i32 4, i32* %68, align 4 + %69 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3 + store i32 5, i32* %69, align 4 + %70 = bitcast [4 x i32]* %varargslots to i32* + %71 = insertvalue %"int[]" undef, i32* %70, 0 + %72 = insertvalue %"int[]" %71, i64 4, 1 + store %"int[]" %72, %"int[]"* %taddr15, align 8 + %73 = bitcast %"int[]"* %taddr15 to { i8*, i64 }* + %74 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %73, i32 0, i32 0 + %lo16 = load i8*, i8** %74, align 8 + %75 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %73, i32 0, i32 1 + %hi17 = load i64, i64* %75, align 8 + %76 = call i32 @test_sum_us(i8* %lo16, i64 %hi17) + %77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %76) + %78 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots18, i64 0, i64 0 + store i32 1, i32* %78, align 4 + %79 = bitcast [1 x i32]* %varargslots18 to i32* + %80 = insertvalue %"int[]" undef, i32* %79, 0 + %81 = insertvalue %"int[]" %80, i64 1, 1 + store %"int[]" %81, %"int[]"* %taddr19, align 8 + %82 = bitcast %"int[]"* %taddr19 to { i8*, i64 }* + %83 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %82, i32 0, i32 0 + %lo20 = load i8*, i8** %83, align 8 + %84 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %82, i32 0, i32 1 + %hi21 = load i64, i64* %84, align 8 + %85 = call i32 @test_sum_us(i8* %lo20, i64 %hi21) + %86 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %85) + store %"int[]" zeroinitializer, %"int[]"* %taddr22, align 8 + %87 = bitcast %"int[]"* %taddr22 to { i8*, i64 }* + %88 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %87, i32 0, i32 0 + %lo23 = load i8*, i8** %88, align 8 + %89 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %87, i32 0, i32 1 + %hi24 = load i64, i64* %89, align 8 + %90 = call i32 @test_sum_us(i8* %lo23, i64 %hi24) + %91 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %90) + store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8 + store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8 + ret void +} + +// #expect: hello_world.ll + +define void @hello_world_hello() +entry: + %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0)) + %1 = call double @"foo$$double_check"(double 1.110000e+01) + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), double %1) + ret void + +// #expect: foo.double.ll + +define double @"foo$$double_check"(double %0) +entry: + %fmul = fmul double %0, %0 + ret double %fmul + + +// #expect: test2.int.ll + +%Blob = type { i32 } +@"test2$$int_argh" = local_unnamed_addr global i32 234, align 4 + +define i32 @"test2$$int_getMult"(i32 %0) #0 { +entry: + %mul = mul i32 %0, %0 + ret i32 %mul +} + +define i32 @"test2$$int_hello"() #0 { +entry: + ret i32 1 +} + +define i32 @"test2$$int_getValue"(i32 %0) #0 { +entry: + %blob = alloca %Blob, align 4 + %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + store i32 %0, i32* %1, align 4 + %2 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + %3 = load i32, i32* %2, align 4 + ret i32 %3 +} + +// #expect: test2.double.ll + +%Blob = type { double } +@"test2$$double_argh" = local_unnamed_addr global double 2.340000e+02, align 8 + +define double @"test2$$double_getMult"(double %0) +entry: + %fmul = fmul double %0, %0 + ret double %fmul + +define i32 @"test2$$double_hello"() +entry: + ret i32 1 + +define double @"test2$$double_getValue"(double %0) +entry: + %blob = alloca %Blob, align 8 + %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + store double %0, double* %1, align 8 + %2 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + %3 = load double, double* %2, align 8 + ret double %3 \ No newline at end of file diff --git a/test/test_suite14/functions/test_regression_mingw.c3t b/test/test_suite14/functions/test_regression_mingw.c3t new file mode 100644 index 000000000..35c13b155 --- /dev/null +++ b/test/test_suite14/functions/test_regression_mingw.c3t @@ -0,0 +1,728 @@ +// #target: mingw-x64 + +module test; +import test2; +import std::array::list; +import std::array::linkedlist; +import hello_world; + + +extern fn int printf(char *, ...); + +fn void helloWorld() +{ + printf("helloWorld!\n"); +} +fn int test_static() +{ + static int x = 1; + x++; + printf("Test static %d\n", x); + return x; +} + +struct Bobo { short b; float c; short d; short e; float f; short g; } + + +struct Blob { int z; int f; } + +union Foor +{ + long a; + char[12] b; +} + + +fn int helo(double d, Bobo b) +{ + int[3] de = { 1, 2, 3 }; + Bobo c = b; + helo(1.0, c); + return 1; +} + + +fn int test1(int a, int b) +{ + a = a >> b; + if (b > 128) return -1; + return a; +} + +struct Foo2 +{ + int x; +} + +fn void Foo2.printme(Foo2 *foo) +{ + printf("Foo is: %d\n", foo.x); +} + +fn int Foo2.mutate(Foo2 *foo) +{ + printf("Mutating"); + return ++foo.x; +} + + + +define oopsInt = test2::argh; +define oopsDouble = test2::argh; +define Argh = fn int(double, Bobo); +define Argh2 = fn int(double, Bobo); + + + +fn int sum_us(int... x) +{ + int sum = 0; + if (x.len == 0) return 0; + sum += x[0] + sum_us(...x[1..^1]); + return sum; +} + +define Frob = long; + +fn int sumd(int[] x) +{ + int sum = 0; + for (int i = 0; i < x.len; i++) sum += x[i]; + return sum; +} + +struct Foo +{ + int a; + int b; +} + +define getValueInt = test2::getValue; +define getValueDouble = test2::getValue; +define IntBlob = test2::Blob; +define DoubleBlob = Blob; +define getMultInt = test2::getMult; +define getMultDouble = test2::getMult; + +define IntArray = List; +define IntList = LinkedList; + +enum MyEnum : int +{ + HELO, + WORLD, + BYE +} + + +fn void main() +{ + test_static(); + test_static(); + test_static(); + hello_world::hello(); + IntList list; + list.push(10); + list.push(15); + list.push(30); + for (int i = 0; i < (int)(list.len()); i++) + { + printf("Element[%d]: %d\n", i, list.get(i)); + } + list.free(); + + printf("Elements: %d\n", (int)(MyEnum.elements)); + + int elements = MyEnum.elements; + printf("Hello\n"); + IntArray array; + array.append(100); + array.append(200); + array.append(400); + array.push(600); + array.insert_at(2, 300); + for (int i = 0; i < (int)(array.len()); i++) + { + printf("Element[%d]: %d\n", i, array.get(i)); + } + array.free(); + IntBlob a = { 42 }; + DoubleBlob b = { 33.3 }; + printf("a was %d\n", getValueInt(a)); + printf("b was %f\n", getValueDouble(b)); + printf("Mult int was %d\n", getMultInt(25)); + printf("Mult double was %f\n", getMultDouble(3.3)); + + + helloWorld(); + Foo ddx; + int fro = 3; + int[4] x = { 1, 2, 3, 3 }; + fro += printf("1Vararg4splatA: %d\n", sum_us(...x)); + printf("%d\n", fro); + int[] z = &x; + int[3] de = { 1, 2, 3 }; + printf("Vararg4splatB: %d\n", sum_us(...&x)); + printf("Vararg4splatC: %d\n", sum_us(...z)); + printf("Vararg4: %d\n", sum_us(1, 2, 4, 5)); + printf("Vararg1: %d\n", sum_us(1)); + printf("Vararg0: %d\n", sum_us()); + Argh a1; + Argh2 b2; +} + +module hello_world; +import foo; + +extern fn int printf(char *, ...); +define doubleMult = foo::check; + +fn void hello() +{ + printf("Hello baby\n"); + printf("Mult %f\n", doubleMult(11.1)); +} + +module foo ; + +fn Type check(Type i) +{ + return i * i; +} + +module test2 ; + +struct Blob +{ + Type a; +} + +fn Type getMult(Type a) +{ + return a * a; +} +Type argh = 234; + +fault MyErr +{ + X, + Y +} + +enum Hello : int +{ + FOO, + BAR, +} + +macro Hello wut() +{ + return Hello.FOO; +} + +define Bye = Hello; +define wat = wut; +define byebye = hello; + +fn int hello() +{ + return 1; +} + +fn Type getValue(Blob blob) +{ + return blob.a; +} + +/* #expect: test.ll + +%Blob = type { i32 } +%Blob.0 = type { double } +%Foo2 = type { i32 } +%Bobo = type { i16, float, i16, i16, float, i16 } +%"int[]" = type { i32*, i64 } +%LinkedList = type { i64, %Node*, %Node* } +%Node = type { %Node*, %Node*, i32 } +%List = type { i64, i64, %Allocator*, i32* } +%Foo = type { i32, i32 } + +$"ct$test_Bobo" = comdat any + +$"ct$test_Blob" = comdat any + +$"ct$test_Foor" = comdat any + +$"ct$test_Foo2" = comdat any + +$"ct$test_Foo" = comdat any + +$"ct$int" = comdat any + +$"ct$test_MyEnum" = comdat any + +@"ct$test_Bobo" = linkonce constant %.introspect { i8 10, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, comdat, align 8 +@"ct$test_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 +@"ct$test_Foor" = linkonce constant %.introspect { i8 11, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 +@"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 +@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, comdat, align 8 +@"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (%.introspect* @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.enum.0, i64 0, i64 0), i64 4 }, %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.enum.1, i64 0, i64 0), i64 5 }, %"char[]" { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.enum.2, i64 0, i64 0), i64 3 }] }, comdat, align 8 +@.str = private unnamed_addr constant [13 x i8] c"helloWorld!\0A\00", align 1 +@"test_static$x" = internal unnamed_addr global i32 1, align 4 +@.str.1 = private unnamed_addr constant [16 x i8] c"Test static %d\0A\00", align 1 +@.__const = private unnamed_addr constant [3 x i32] [i32 1, i32 2, i32 3], align 4 +@.str.2 = private unnamed_addr constant [17 x i8] c"Element[%d]: %d\0A\00", align 1 +@.str.3 = private unnamed_addr constant [14 x i8] c"Elements: %d\0A\00", align 1 +@.str.4 = private unnamed_addr constant [7 x i8] c"Hello\0A\00", align 1 +@.str.5 = private unnamed_addr constant [17 x i8] c"Element[%d]: %d\0A\00", align 1 +@.__const.6 = private unnamed_addr constant %Blob { i32 42 }, align 4 +@.__const.7 = private unnamed_addr constant %Blob.0 { double 3.330000e+01 }, align 8 +@.str.8 = private unnamed_addr constant [10 x i8] c"a was %d\0A\00", align 1 +@.str.9 = private unnamed_addr constant [10 x i8] c"b was %f\0A\00", align 1 +@.str.10 = private unnamed_addr constant [17 x i8] c"Mult int was %d\0A\00", align 1 +@.str.11 = private unnamed_addr constant [20 x i8] c"Mult double was %f\0A\00", align 1 +@.__const.12 = private unnamed_addr constant [4 x i32] [i32 1, i32 2, i32 3, i32 3], align 16 +@.str.13 = private unnamed_addr constant [20 x i8] c"1Vararg4splatA: %d\0A\00", align 1 +@.str.14 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 +@.__const.15 = private unnamed_addr constant [3 x i32] [i32 1, i32 2, i32 3], align 4 +@.str.16 = private unnamed_addr constant [19 x i8] c"Vararg4splatB: %d\0A\00", align 1 +@.str.17 = private unnamed_addr constant [19 x i8] c"Vararg4splatC: %d\0A\00", align 1 +@.str.18 = private unnamed_addr constant [13 x i8] c"Vararg4: %d\0A\00", align 1 +@.str.19 = private unnamed_addr constant [13 x i8] c"Vararg1: %d\0A\00", align 1 +@.str.20 = private unnamed_addr constant [13 x i8] c"Vararg0: %d\0A\00", align 1 +@.str.21 = private unnamed_addr constant [12 x i8] c"Foo is: %d\0A\00", align 1 +@.str.22 = private unnamed_addr constant [9 x i8] c"Mutating\00", align 1 + +; Function Attrs: nounwind +define void @test_Foo2_printme(%Foo2* %0) #0 { +entry: + %1 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 + %2 = load i32, i32* %1, align 8 + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.21, i32 0, i32 0), i32 %2) + ret void +} + +; Function Attrs: nounwind +define i32 @test_Foo2_mutate(%Foo2* %0) #0 { +entry: + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.22, i32 0, i32 0)) + %2 = getelementptr inbounds %Foo2, %Foo2* %0, i32 0, i32 0 + %3 = load i32, i32* %2, align 8 + %add = add i32 %3, 1 + store i32 %add, i32* %2, align 8 + ret i32 %add +} + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +define void @test_helloWorld() #0 { +entry: + %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0)) + ret void +} + +; Function Attrs: nounwind +define i32 @test_test_static() #0 { +entry: + %0 = load i32, i32* @"test_static$x", align 4 + %add = add i32 %0, 1 + store i32 %add, i32* @"test_static$x", align 4 + %1 = load i32, i32* @"test_static$x", align 4 + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i32 0, i32 0), i32 %1) + %3 = load i32, i32* @"test_static$x", align 4 + ret i32 %3 +} + +; Function Attrs: nounwind +define i32 @test_helo(double %0, %Bobo* align 4 %1) #0 { +entry: + %de = alloca [3 x i32], align 4 + %c = alloca %Bobo, align 4 + %indirectarg = alloca %Bobo, align 4 + %2 = bitcast [3 x i32]* %de to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %3 = bitcast %Bobo* %c to i8* + %4 = bitcast %Bobo* %1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 20, i1 false) + %5 = bitcast %Bobo* %indirectarg to i8* + %6 = bitcast %Bobo* %c to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %5, i8* align 4 %6, i32 20, i1 false) + %7 = call i32 @test_helo(double 1.000000e+00, %Bobo* align 4 %indirectarg) + ret i32 1 +} + +; Function Attrs: nounwind +define i32 @test_test1(i32 %0, i32 %1) #0 { +entry: + %a = alloca i32, align 4 + store i32 %0, i32* %a, align 4 + %2 = load i32, i32* %a, align 4 + %ashr = ashr i32 %2, %1 + %3 = freeze i32 %ashr + store i32 %3, i32* %a, align 4 + %gt = icmp sgt i32 %1, 128 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i32 -1 + +if.exit: ; preds = %entry + %4 = load i32, i32* %a, align 4 + ret i32 %4 +} + +; Function Attrs: nounwind +define i32 @test_sum_us(%"int[]"* align 8 %0) #0 { +entry: + %sum = alloca i32, align 4 + %indirectarg = alloca %"int[]", align 8 + store i32 0, i32* %sum, align 4 + %1 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 1 + %2 = load i64, i64* %1, align 8 + %eq = icmp eq i64 0, %2 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %entry + ret i32 0 + +if.exit: ; preds = %entry + %3 = load i32, i32* %sum, align 4 + %4 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 0 + %5 = load i32*, i32** %4, align 8 + %ptroffset = getelementptr inbounds i32, i32* %5, i64 0 + %6 = load i32, i32* %ptroffset, align 4 + %7 = load %"int[]", %"int[]"* %0, align 8 + %8 = extractvalue %"int[]" %7, 0 + %9 = extractvalue %"int[]" %7, 1 + %sub = sub i64 %9, 1 + %10 = add i64 %sub, 1 + %size = sub i64 %10, 1 + %ptroffset1 = getelementptr inbounds i32, i32* %8, i64 1 + %11 = insertvalue %"int[]" undef, i32* %ptroffset1, 0 + %12 = insertvalue %"int[]" %11, i64 %size, 1 + store %"int[]" %12, %"int[]"* %indirectarg, align 8 + %13 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg) + %add = add i32 %6, %13 + %add2 = add i32 %3, %add + store i32 %add2, i32* %sum, align 4 + %14 = load i32, i32* %sum, align 4 + ret i32 %14 +} + +; Function Attrs: nounwind +define i32 @test_sumd(%"int[]"* align 8 %0) #0 { +entry: + %sum = alloca i32, align 4 + %i = alloca i32, align 4 + store i32 0, i32* %sum, align 4 + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %1 = load i32, i32* %i, align 4 + %sisiext = sext i32 %1 to i64 + %2 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 1 + %3 = load i64, i64* %2, align 8 + %lt = icmp slt i64 %sisiext, %3 + %check = icmp slt i64 %3, 0 + %siui-lt = or i1 %check, %lt + br i1 %siui-lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %4 = load i32, i32* %sum, align 4 + %5 = getelementptr inbounds %"int[]", %"int[]"* %0, i32 0, i32 0 + %6 = load i32*, i32** %5, align 8 + %7 = load i32, i32* %i, align 4 + %sisiext1 = sext i32 %7 to i64 + %ptroffset = getelementptr inbounds i32, i32* %6, i64 %sisiext1 + %8 = load i32, i32* %ptroffset, align 4 + %add = add i32 %4, %8 + store i32 %add, i32* %sum, align 4 + %9 = load i32, i32* %i, align 4 + %add2 = add i32 %9, 1 + store i32 %add2, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %10 = load i32, i32* %sum, align 4 + ret i32 %10 +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %list = alloca %LinkedList, align 8 + %i = alloca i32, align 4 + %elements = alloca i32, align 4 + %array = alloca %List, align 8 + %i1 = alloca i32, align 4 + %a = alloca %Blob, align 4 + %b = alloca %Blob.0, align 8 + %ddx = alloca %Foo, align 4 + %fro = alloca i32, align 4 + %x = alloca [4 x i32], align 16 + %indirectarg = alloca %"int[]", align 8 + %z = alloca %"int[]", align 8 + %de = alloca [3 x i32], align 4 + %indirectarg10 = alloca %"int[]", align 8 + %indirectarg11 = alloca %"int[]", align 8 + %varargslots = alloca [4 x i32], align 16 + %indirectarg12 = alloca %"int[]", align 8 + %varargslots13 = alloca [1 x i32], align 4 + %indirectarg14 = alloca %"int[]", align 8 + %indirectarg15 = alloca %"int[]", align 8 + %a1 = alloca i32 (double, %Bobo*)*, align 8 + %b2 = alloca i32 (double, %Bobo*)*, align 8 + %0 = call i32 @test_test_static() + %1 = call i32 @test_test_static() + %2 = call i32 @test_test_static() + call void @hello_world_hello() + %3 = bitcast %LinkedList* %list to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 24, i1 false) + call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 10) + call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 15) + call void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList* %list, i32 30) + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %4 = load i32, i32* %i, align 4 + %5 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(%LinkedList* %list) #3 + %uisitrunc = trunc i64 %5 to i32 + %lt = icmp slt i32 %4, %uisitrunc + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %6 = load i32, i32* %i, align 4 + %7 = load i32, i32* %i, align 4 + %siuiext = sext i32 %7 to i64 + %8 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(%LinkedList* %list, i64 %siuiext) + %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %6, i32 %8) + %10 = load i32, i32* %i, align 4 + %add = add i32 %10, 1 + store i32 %add, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + call void @"std_array_linkedlist$$int_LinkedList_free"(%LinkedList* %list) + %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 3) + store i32 3, i32* %elements, align 4 + %12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + %13 = bitcast %List* %array to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %13, i8 0, i64 32, i1 false) + call void @"std_array_list$$int_List_append"(%List* %array, i32 100) + call void @"std_array_list$$int_List_append"(%List* %array, i32 200) + call void @"std_array_list$$int_List_append"(%List* %array, i32 400) + call void @"std_array_list$$int_List_push"(%List* %array, i32 600) #3 + call void @"std_array_list$$int_List_insert_at"(%List* %array, i64 2, i32 300) + store i32 0, i32* %i1, align 4 + br label %loop.cond2 + +loop.cond2: ; preds = %loop.body5, %loop.exit + %14 = load i32, i32* %i1, align 4 + %15 = call i64 @"std_array_list$$int_List_len"(%List* %array) + %uisitrunc3 = trunc i64 %15 to i32 + %lt4 = icmp slt i32 %14, %uisitrunc3 + br i1 %lt4, label %loop.body5, label %loop.exit8 + +loop.body5: ; preds = %loop.cond2 + %16 = load i32, i32* %i1, align 4 + %17 = load i32, i32* %i1, align 4 + %siuiext6 = sext i32 %17 to i64 + %18 = call i32 @"std_array_list$$int_List_get"(%List* %array, i64 %siuiext6) + %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %16, i32 %18) + %20 = load i32, i32* %i1, align 4 + %add7 = add i32 %20, 1 + store i32 %add7, i32* %i1, align 4 + br label %loop.cond2 + +loop.exit8: ; preds = %loop.cond2 + call void @"std_array_list$$int_List_free"(%List* %array) + %21 = bitcast %Blob* %a to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %21, i8* align 4 bitcast (%Blob* @.__const.6 to i8*), i32 4, i1 false) + %22 = bitcast %Blob.0* %b to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %22, i8* align 8 bitcast (%Blob.0* @.__const.7 to i8*), i32 8, i1 false) + %23 = getelementptr inbounds %Blob, %Blob* %a, i32 0, i32 0 + %24 = load i32, i32* %23, align 4 + %25 = call i32 @"test2$$int_getValue"(i32 %24) + %26 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.8, i32 0, i32 0), i32 %25) + %27 = getelementptr inbounds %Blob.0, %Blob.0* %b, i32 0, i32 0 + %28 = bitcast double* %27 to i64* + %29 = load i64, i64* %28, align 8 + %30 = call double @"test2$$double_getValue"(i64 %29) + %31 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), double %30) + %32 = call i32 @"test2$$int_getMult"(i32 25) + %33 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i32 0, i32 0), i32 %32) + %34 = call double @"test2$$double_getMult"(double 3.300000e+00) + %35 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.11, i32 0, i32 0), double %34) + call void @test_helloWorld() + %36 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 0 + store i32 0, i32* %36, align 4 + %37 = getelementptr inbounds %Foo, %Foo* %ddx, i32 0, i32 1 + store i32 0, i32* %37, align 4 + store i32 3, i32* %fro, align 4 + %38 = bitcast [4 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %38, i8* align 16 bitcast ([4 x i32]* @.__const.12 to i8*), i32 16, i1 false) + %39 = load i32, i32* %fro, align 4 + %40 = bitcast [4 x i32]* %x to i32* + %41 = insertvalue %"int[]" undef, i32* %40, 0 + %42 = insertvalue %"int[]" %41, i64 4, 1 + store %"int[]" %42, %"int[]"* %indirectarg, align 8 + %43 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg) + %44 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.13, i32 0, i32 0), i32 %43) + %add9 = add i32 %39, %44 + store i32 %add9, i32* %fro, align 4 + %45 = load i32, i32* %fro, align 4 + %46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %45) + %47 = bitcast [4 x i32]* %x to i32* + %48 = insertvalue %"int[]" undef, i32* %47, 0 + %49 = insertvalue %"int[]" %48, i64 4, 1 + store %"int[]" %49, %"int[]"* %z, align 8 + %50 = bitcast [3 x i32]* %de to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %50, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false) + %51 = bitcast [4 x i32]* %x to i32* + %52 = insertvalue %"int[]" undef, i32* %51, 0 + %53 = insertvalue %"int[]" %52, i64 4, 1 + store %"int[]" %53, %"int[]"* %indirectarg10, align 8 + %54 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg10) + %55 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.16, i32 0, i32 0), i32 %54) + %56 = bitcast %"int[]"* %indirectarg11 to i8* + %57 = bitcast %"int[]"* %z to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %56, i8* align 8 %57, i32 16, i1 false) + %58 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg11) + %59 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.17, i32 0, i32 0), i32 %58) + %60 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0 + store i32 1, i32* %60, align 4 + %61 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 1 + store i32 2, i32* %61, align 4 + %62 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 2 + store i32 4, i32* %62, align 4 + %63 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3 + store i32 5, i32* %63, align 4 + %64 = bitcast [4 x i32]* %varargslots to i32* + %65 = insertvalue %"int[]" undef, i32* %64, 0 + %66 = insertvalue %"int[]" %65, i64 4, 1 + store %"int[]" %66, %"int[]"* %indirectarg12, align 8 + %67 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg12) + %68 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %67) + %69 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots13, i64 0, i64 0 + store i32 1, i32* %69, align 4 + %70 = bitcast [1 x i32]* %varargslots13 to i32* + %71 = insertvalue %"int[]" undef, i32* %70, 0 + %72 = insertvalue %"int[]" %71, i64 1, 1 + store %"int[]" %72, %"int[]"* %indirectarg14, align 8 + %73 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg14) + %74 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %73) + store %"int[]" zeroinitializer, %"int[]"* %indirectarg15, align 8 + %75 = call i32 @test_sum_us(%"int[]"* align 8 %indirectarg15) + %76 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %75) + store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8 + store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8 + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i32, i1 immarg) #1 + +declare void @hello_world_hello() + +declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #2 + +declare void @"std_array_linkedlist$$int_LinkedList_push"(%LinkedList*, i32) + +declare i64 @"std_array_linkedlist$$int_LinkedList_len"(%LinkedList*) + +declare i32 @"std_array_linkedlist$$int_LinkedList_get"(%LinkedList*, i64) + +declare void @"std_array_linkedlist$$int_LinkedList_free"(%LinkedList*) + +declare void @"std_array_list$$int_List_append"(%List*, i32) + +declare void @"std_array_list$$int_List_push"(%List*, i32) + +declare void @"std_array_list$$int_List_insert_at"(%List*, i64, i32) + +declare i64 @"std_array_list$$int_List_len"(%List*) + +declare i32 @"std_array_list$$int_List_get"(%List*, i64) + +declare void @"std_array_list$$int_List_free"(%List*) + +declare i32 @"test2$$int_getValue"(i32) + +declare double @"test2$$double_getValue"(i64) + +declare i32 @"test2$$int_getMult"(i32) + +declare double @"test2$$double_getMult"(double) + + +// #expect: hello_world.ll + +define void @hello_world_hello() #0 { +entry: + %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0)) + %1 = call double @"foo$$double_check"(double 1.110000e+01) + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), double %1) + ret void +} + +// #expect: foo.double.ll + +define double @"foo$$double_check"(double %0) +entry: + %fmul = fmul double %0, %0 + ret double %fmul + + +// #expect: test2.int.ll + +%Blob = type { i32 } +@"test2$$int_argh" = local_unnamed_addr global i32 234, align 4 + +define i32 @"test2$$int_getMult"(i32 %0) +entry: + %mul = mul i32 %0, %0 + ret i32 %mul + +define i32 @"test2$$int_hello"() +entry: + ret i32 1 +} + +define i32 @"test2$$int_getValue"(i32 %0) +entry: + %blob = alloca %Blob, align 4 + %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + store i32 %0, i32* %1, align 4 + %2 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + %3 = load i32, i32* %2, align 4 + ret i32 %3 + + +// #expect: test2.double.ll + +%Blob = type { double } +@"test2$$double_argh" = local_unnamed_addr global double 2.340000e+02, align 8 + +define double @"test2$$double_getMult"(double %0) +entry: + %fmul = fmul double %0, %0 + ret double %fmul + + +define i32 @"test2$$double_hello"() +entry: + ret i32 1 + +define double @"test2$$double_getValue"(i64 %0) +entry: + %blob = alloca %Blob, align 8 + %1 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + %2 = bitcast double* %1 to i64* + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds %Blob, %Blob* %blob, i32 0, i32 0 + %4 = load double, double* %3, align 8 + ret double %4 + diff --git a/test/test_suite2/functions/too_many_params.c3 b/test/test_suite14/functions/too_many_params.c3 similarity index 100% rename from test/test_suite2/functions/too_many_params.c3 rename to test/test_suite14/functions/too_many_params.c3 diff --git a/test/test_suite14/functions/typeless_varargs.c3t b/test/test_suite14/functions/typeless_varargs.c3t new file mode 100644 index 000000000..39019d43c --- /dev/null +++ b/test/test_suite14/functions/typeless_varargs.c3t @@ -0,0 +1,106 @@ +// #target: macos-x64 + +module test; + +extern fn void printf(char*, ...); + +fn void retest(foo...) +{ + test(...foo); +} +fn void test(foo...) +{ + printf("Foo1 was: %d\n", *((int*)foo[0])); +} +fn int main() +{ + int i = 1; + test(1); + retest(1); + return 1; +} + +/* #expect: test.ll + +define void @test_retest(i8* %0, i64 %1) #0 { +entry: + %foo = alloca %"variant[]", align 8 + %pair = bitcast %"variant[]"* %foo to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + %4 = bitcast %"variant[]"* %foo to { i8*, i64 }* + %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %4, i32 0, i32 0 + %lo = load i8*, i8** %5, align 8 + %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %4, i32 0, i32 1 + %hi = load i64, i64* %6, align 8 + call void @test_test(i8* %lo, i64 %hi) + ret void +} + +; Function Attrs: nounwind +define void @test_test(i8* %0, i64 %1) #0 { +entry: + %foo = alloca %"variant[]", align 8 + %pair = bitcast %"variant[]"* %foo to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + %4 = getelementptr inbounds %"variant[]", %"variant[]"* %foo, i32 0, i32 0 + %5 = load %variant*, %variant** %4, align 8 + %ptroffset = getelementptr inbounds %variant, %variant* %5, i64 0 + %6 = getelementptr inbounds %variant, %variant* %ptroffset, i32 0, i32 0 + %7 = bitcast i8** %6 to i32** + %8 = load i32*, i32** %7, align 8 + %9 = load i32, i32* %8, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i32 0, i32 0), i32 %9) + ret void +} + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + %i = alloca i32, align 4 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + %varargslots2 = alloca [1 x %variant], align 16 + %taddr3 = alloca i32, align 4 + %taddr4 = alloca %"variant[]", align 8 + store i32 1, i32* %i, align 4 + store i32 1, i32* %taddr, align 4 + %0 = bitcast i32* %taddr to i8* + %1 = insertvalue %variant undef, i8* %0, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %2, %variant* %3, align 16 + %4 = bitcast [1 x %variant]* %varargslots to %variant* + %5 = insertvalue %"variant[]" undef, %variant* %4, 0 + %6 = insertvalue %"variant[]" %5, i64 1, 1 + store %"variant[]" %6, %"variant[]"* %taddr1, align 8 + %7 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 0 + %lo = load i8*, i8** %8, align 8 + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 1 + %hi = load i64, i64* %9, align 8 + call void @test_test(i8* %lo, i64 %hi) + store i32 1, i32* %taddr3, align 4 + %10 = bitcast i32* %taddr3 to i8* + %11 = insertvalue %variant undef, i8* %10, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %13 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots2, i64 0, i64 0 + store %variant %12, %variant* %13, align 16 + %14 = bitcast [1 x %variant]* %varargslots2 to %variant* + %15 = insertvalue %"variant[]" undef, %variant* %14, 0 + %16 = insertvalue %"variant[]" %15, i64 1, 1 + store %"variant[]" %16, %"variant[]"* %taddr4, align 8 + %17 = bitcast %"variant[]"* %taddr4 to { i8*, i64 }* + %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 + %lo5 = load i8*, i8** %18, align 8 + %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 + %hi6 = load i64, i64* %19, align 8 + call void @test_retest(i8* %lo5, i64 %hi6) + ret i32 1 +} diff --git a/test/test_suite2/functions/vararg_and_named_tests.c3 b/test/test_suite14/functions/vararg_and_named_tests.c3 similarity index 100% rename from test/test_suite2/functions/vararg_and_named_tests.c3 rename to test/test_suite14/functions/vararg_and_named_tests.c3 diff --git a/test/test_suite2/functions/vararg_argument_fails.c3 b/test/test_suite14/functions/vararg_argument_fails.c3 similarity index 100% rename from test/test_suite2/functions/vararg_argument_fails.c3 rename to test/test_suite14/functions/vararg_argument_fails.c3 diff --git a/test/test_suite14/functions/varargs.c3t b/test/test_suite14/functions/varargs.c3t new file mode 100644 index 000000000..75ac34113 --- /dev/null +++ b/test/test_suite14/functions/varargs.c3t @@ -0,0 +1,38 @@ +module varargs; + +extern fn void printf(char* c, ...); + +fn void test() +{ + printf("%d\n", true); + printf("%d\n", 123); + printf("%f\n", 12.3); + ichar x1 = -123; + bool b = false; + float z1 = 12.3; + printf("%d\n", b); + printf("%d\n", x1); + printf("%f\n", z1); +} + +// #expect: varargs.ll + + %x1 = alloca i8, align 1 + %b = alloca i8, align 1 + %z1 = alloca float, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 123) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), double 1.230000e+01) + store i8 -123, i8* %x1, align 1 + store i8 0, i8* %b, align 1 + store float 0x40289999A0000000, float* %z1, align 4 + %0 = load i8, i8* %b, align 1 + %1 = trunc i8 %0 to i1 + %boolsi = zext i1 %1 to i32 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %boolsi) + %2 = load i8, i8* %x1, align 1 + %sisiext = sext i8 %2 to i32 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.4, i32 0, i32 0), i32 %sisiext) + %3 = load float, float* %z1, align 4 + %fpfpext = fpext float %3 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), double %fpfpext) \ No newline at end of file diff --git a/test/test_suite14/functions/varargs_followed_by_named.c3t b/test/test_suite14/functions/varargs_followed_by_named.c3t new file mode 100644 index 000000000..fdb21d683 --- /dev/null +++ b/test/test_suite14/functions/varargs_followed_by_named.c3t @@ -0,0 +1,149 @@ +// #target: macos-x64 +module foo; + +extern fn void printf(char* format, ...); + +fn void test(int x, int... y, int z = 2) +{ + printf("Got %d %d %d %d\n", x, (int)y.len, z, y[0]); +} +fn void test2(int x, y..., int z = 2) +{ + printf("Got %d %d %d\n", x, (int)y.len, z); +} + +fn void main() +{ + test(3, 4, 5, .z = 123); + test2(3, 4, 5, .z = 123); + test(3, 4, 5); + test2(3, 4, 5); +} + +/* #expect: foo.ll + + +define void @foo_test(i32 %0, i8* %1, i64 %2, i32 %3) #0 { +entry: + %y = alloca %"int[]", align 8 + %pair = bitcast %"int[]"* %y to { i8*, i64 }* + %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %1, i8** %4, align 8 + %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %2, i64* %5, align 8 + %6 = getelementptr inbounds %"int[]", %"int[]"* %y, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + %uisitrunc = trunc i64 %7 to i32 + %8 = getelementptr inbounds %"int[]", %"int[]"* %y, i32 0, i32 0 + %9 = load i32*, i32** %8, align 8 + %ptroffset = getelementptr inbounds i32, i32* %9, i64 0 + %10 = load i32, i32* %ptroffset, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i32 0, i32 0), i32 %0, i32 %uisitrunc, i32 %3, i32 %10) + ret void +} + +define void @foo_test2(i32 %0, i8* %1, i64 %2, i32 %3) #0 { +entry: + %y = alloca %"variant[]", align 8 + %pair = bitcast %"variant[]"* %y to { i8*, i64 }* + %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %1, i8** %4, align 8 + %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %2, i64* %5, align 8 + %6 = getelementptr inbounds %"variant[]", %"variant[]"* %y, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + %uisitrunc = trunc i64 %7 to i32 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i32 %0, i32 %uisitrunc, i32 %3) + ret void +} + +define void @foo_main() #0 { +entry: + %varargslots = alloca [2 x i32], align 4 + %taddr = alloca %"int[]", align 8 + %varargslots1 = alloca [2 x %variant], align 16 + %taddr2 = alloca i32, align 4 + %taddr3 = alloca i32, align 4 + %taddr4 = alloca %"variant[]", align 8 + %varargslots7 = alloca [2 x i32], align 4 + %taddr8 = alloca %"int[]", align 8 + %varargslots11 = alloca [2 x %variant], align 16 + %taddr12 = alloca i32, align 4 + %taddr13 = alloca i32, align 4 + %taddr14 = alloca %"variant[]", align 8 + %0 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots, i64 0, i64 0 + store i32 4, i32* %0, align 4 + %1 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots, i64 0, i64 1 + store i32 5, i32* %1, align 4 + %2 = bitcast [2 x i32]* %varargslots to i32* + %3 = insertvalue %"int[]" undef, i32* %2, 0 + %4 = insertvalue %"int[]" %3, i64 2, 1 + store %"int[]" %4, %"int[]"* %taddr, align 8 + %5 = bitcast %"int[]"* %taddr to { i8*, i64 }* + %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %5, i32 0, i32 0 + %lo = load i8*, i8** %6, align 8 + %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %5, i32 0, i32 1 + %hi = load i64, i64* %7, align 8 + call void @foo_test(i32 3, i8* %lo, i64 %hi, i32 123) + store i32 4, i32* %taddr2, align 4 + %8 = bitcast i32* %taddr2 to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %11 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots1, i64 0, i64 0 + store %variant %10, %variant* %11, align 16 + store i32 5, i32* %taddr3, align 4 + %12 = bitcast i32* %taddr3 to i8* + %13 = insertvalue %variant undef, i8* %12, 0 + %14 = insertvalue %variant %13, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %15 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots1, i64 0, i64 1 + store %variant %14, %variant* %15, align 16 + %16 = bitcast [2 x %variant]* %varargslots1 to %variant* + %17 = insertvalue %"variant[]" undef, %variant* %16, 0 + %18 = insertvalue %"variant[]" %17, i64 2, 1 + store %"variant[]" %18, %"variant[]"* %taddr4, align 8 + %19 = bitcast %"variant[]"* %taddr4 to { i8*, i64 }* + %20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %19, i32 0, i32 0 + %lo5 = load i8*, i8** %20, align 8 + %21 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %19, i32 0, i32 1 + %hi6 = load i64, i64* %21, align 8 + call void @foo_test2(i32 3, i8* %lo5, i64 %hi6, i32 123) + %22 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots7, i64 0, i64 0 + store i32 4, i32* %22, align 4 + %23 = getelementptr inbounds [2 x i32], [2 x i32]* %varargslots7, i64 0, i64 1 + store i32 5, i32* %23, align 4 + %24 = bitcast [2 x i32]* %varargslots7 to i32* + %25 = insertvalue %"int[]" undef, i32* %24, 0 + %26 = insertvalue %"int[]" %25, i64 2, 1 + store %"int[]" %26, %"int[]"* %taddr8, align 8 + %27 = bitcast %"int[]"* %taddr8 to { i8*, i64 }* + %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 0 + %lo9 = load i8*, i8** %28, align 8 + %29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 1 + %hi10 = load i64, i64* %29, align 8 + call void @foo_test(i32 3, i8* %lo9, i64 %hi10, i32 2) + store i32 4, i32* %taddr12, align 4 + %30 = bitcast i32* %taddr12 to i8* + %31 = insertvalue %variant undef, i8* %30, 0 + %32 = insertvalue %variant %31, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %33 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots11, i64 0, i64 0 + store %variant %32, %variant* %33, align 16 + store i32 5, i32* %taddr13, align 4 + %34 = bitcast i32* %taddr13 to i8* + %35 = insertvalue %variant undef, i8* %34, 0 + %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %37 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots11, i64 0, i64 1 + store %variant %36, %variant* %37, align 16 + %38 = bitcast [2 x %variant]* %varargslots11 to %variant* + %39 = insertvalue %"variant[]" undef, %variant* %38, 0 + %40 = insertvalue %"variant[]" %39, i64 2, 1 + store %"variant[]" %40, %"variant[]"* %taddr14, align 8 + %41 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* + %42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0 + %lo15 = load i8*, i8** %42, align 8 + %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1 + %hi16 = load i64, i64* %43, align 8 + call void @foo_test2(i32 3, i8* %lo15, i64 %hi16, i32 2) + ret void +} + + diff --git a/test/test_suite2/functions/void_params.c3 b/test/test_suite14/functions/void_params.c3 similarity index 100% rename from test/test_suite2/functions/void_params.c3 rename to test/test_suite14/functions/void_params.c3 diff --git a/test/test_suite14/generic/enum_set_test.c3t b/test/test_suite14/generic/enum_set_test.c3t new file mode 100644 index 000000000..f42e7993b --- /dev/null +++ b/test/test_suite14/generic/enum_set_test.c3t @@ -0,0 +1,178 @@ +// #target: macos-x64 +module test; +import std::io; +import std::enumset; + +define AbcEnumSet = EnumSet; + +enum Abc +{ + HELLO, + WORLD +} +fn void main() +{ + AbcEnumSet set; + io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); + set.add(Abc.HELLO); + io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); + set.add(Abc.WORLD); + io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); + AbcEnumSet set2; + set2.add_all(set); + io::printf("Has WORLD: %s\n", set2.has(Abc.WORLD)); + set.remove_all(set2); + io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %set = alloca i32, align 4 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i8, align 1 + %taddr1 = alloca %"variant[]", align 8 + %retparam2 = alloca i64, align 8 + %varargslots3 = alloca [1 x %variant], align 16 + %taddr4 = alloca i8, align 1 + %taddr5 = alloca %"variant[]", align 8 + %retparam11 = alloca i64, align 8 + %varargslots12 = alloca [1 x %variant], align 16 + %taddr13 = alloca i8, align 1 + %taddr14 = alloca %"variant[]", align 8 + %set2 = alloca i32, align 4 + %retparam20 = alloca i64, align 8 + %varargslots21 = alloca [1 x %variant], align 16 + %taddr22 = alloca i8, align 1 + %taddr23 = alloca %"variant[]", align 8 + %retparam29 = alloca i64, align 8 + %varargslots30 = alloca [1 x %variant], align 16 + %taddr31 = alloca i8, align 1 + %taddr32 = alloca %"variant[]", align 8 + store i32 0, i32* %set, align 4 + %0 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) + store i8 %0, i8* %taddr, align 1 + %1 = insertvalue %variant undef, i8* %taddr, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %3 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %2, %variant* %3, align 16 + %4 = bitcast [1 x %variant]* %varargslots to %variant* + %5 = insertvalue %"variant[]" undef, %variant* %4, 0 + %6 = insertvalue %"variant[]" %5, i64 1, 1 + store %"variant[]" %6, %"variant[]"* %taddr1, align 8 + %7 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 0 + %lo = load i8*, i8** %8, align 8 + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %7, i32 0, i32 1 + %hi = load i64, i64* %9, align 8 + %10 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0), i64 14, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %10, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + call void @"std_enumset$$test_Abc_EnumSet_add"(i32* %set, i32 0) + %11 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) + store i8 %11, i8* %taddr4, align 1 + %12 = insertvalue %variant undef, i8* %taddr4, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %14 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots3, i64 0, i64 0 + store %variant %13, %variant* %14, align 16 + %15 = bitcast [1 x %variant]* %varargslots3 to %variant* + %16 = insertvalue %"variant[]" undef, %variant* %15, 0 + %17 = insertvalue %"variant[]" %16, i64 1, 1 + store %"variant[]" %17, %"variant[]"* %taddr5, align 8 + %18 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 0 + %lo6 = load i8*, i8** %19, align 8 + %20 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %18, i32 0, i32 1 + %hi7 = load i64, i64* %20, align 8 + %21 = call i64 @std_io_printf(i64* %retparam2, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0), i64 14, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %21, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %voiderr + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %voiderr + call void @"std_enumset$$test_Abc_EnumSet_add"(i32* %set, i32 1) + %22 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) + store i8 %22, i8* %taddr13, align 1 + %23 = insertvalue %variant undef, i8* %taddr13, 0 + %24 = insertvalue %variant %23, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %25 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots12, i64 0, i64 0 + store %variant %24, %variant* %25, align 16 + %26 = bitcast [1 x %variant]* %varargslots12 to %variant* + %27 = insertvalue %"variant[]" undef, %variant* %26, 0 + %28 = insertvalue %"variant[]" %27, i64 1, 1 + store %"variant[]" %28, %"variant[]"* %taddr14, align 8 + %29 = bitcast %"variant[]"* %taddr14 to { i8*, i64 }* + %30 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %29, i32 0, i32 0 + %lo15 = load i8*, i8** %30, align 8 + %31 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %29, i32 0, i32 1 + %hi16 = load i64, i64* %31, align 8 + %32 = call i64 @std_io_printf(i64* %retparam11, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i32 0, i32 0), i64 14, i8* %lo15, i64 %hi16) + %not_err17 = icmp eq i64 %32, 0 + br i1 %not_err17, label %after_check18, label %voiderr19 + +after_check18: ; preds = %voiderr10 + br label %voiderr19 + +voiderr19: ; preds = %after_check18, %voiderr10 + store i32 0, i32* %set2, align 4 + %33 = load i32, i32* %set, align 4 + call void @"std_enumset$$test_Abc_EnumSet_add_all"(i32* %set2, i32 %33) + %34 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set2, i32 1) + store i8 %34, i8* %taddr22, align 1 + %35 = insertvalue %variant undef, i8* %taddr22, 0 + %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %37 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots21, i64 0, i64 0 + store %variant %36, %variant* %37, align 16 + %38 = bitcast [1 x %variant]* %varargslots21 to %variant* + %39 = insertvalue %"variant[]" undef, %variant* %38, 0 + %40 = insertvalue %"variant[]" %39, i64 1, 1 + store %"variant[]" %40, %"variant[]"* %taddr23, align 8 + %41 = bitcast %"variant[]"* %taddr23 to { i8*, i64 }* + %42 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 0 + %lo24 = load i8*, i8** %42, align 8 + %43 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %41, i32 0, i32 1 + %hi25 = load i64, i64* %43, align 8 + %44 = call i64 @std_io_printf(i64* %retparam20, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 14, i8* %lo24, i64 %hi25) + %not_err26 = icmp eq i64 %44, 0 + br i1 %not_err26, label %after_check27, label %voiderr28 + +after_check27: ; preds = %voiderr19 + br label %voiderr28 + +voiderr28: ; preds = %after_check27, %voiderr19 + %45 = load i32, i32* %set2, align 4 + call void @"std_enumset$$test_Abc_EnumSet_remove_all"(i32* %set, i32 %45) + %46 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(i32* %set, i32 1) + store i8 %46, i8* %taddr31, align 1 + %47 = insertvalue %variant undef, i8* %taddr31, 0 + %48 = insertvalue %variant %47, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %49 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots30, i64 0, i64 0 + store %variant %48, %variant* %49, align 16 + %50 = bitcast [1 x %variant]* %varargslots30 to %variant* + %51 = insertvalue %"variant[]" undef, %variant* %50, 0 + %52 = insertvalue %"variant[]" %51, i64 1, 1 + store %"variant[]" %52, %"variant[]"* %taddr32, align 8 + %53 = bitcast %"variant[]"* %taddr32 to { i8*, i64 }* + %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 0 + %lo33 = load i8*, i8** %54, align 8 + %55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %53, i32 0, i32 1 + %hi34 = load i64, i64* %55, align 8 + %56 = call i64 @std_io_printf(i64* %retparam29, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i32 0, i32 0), i64 14, i8* %lo33, i64 %hi34) + %not_err35 = icmp eq i64 %56, 0 + br i1 %not_err35, label %after_check36, label %voiderr37 + +after_check36: ; preds = %voiderr28 + br label %voiderr37 + +voiderr37: ; preds = %after_check36, %voiderr28 + ret void +} diff --git a/test/test_suite2/generic/generic_copy.c3t b/test/test_suite14/generic/generic_copy.c3t similarity index 100% rename from test/test_suite2/generic/generic_copy.c3t rename to test/test_suite14/generic/generic_copy.c3t diff --git a/test/test_suite2/generic/generic_idents.c3t b/test/test_suite14/generic/generic_idents.c3t similarity index 99% rename from test/test_suite2/generic/generic_idents.c3t rename to test/test_suite14/generic/generic_idents.c3t index 9b8e5acc3..0cdd133a5 100644 --- a/test/test_suite2/generic/generic_idents.c3t +++ b/test/test_suite14/generic/generic_idents.c3t @@ -64,5 +64,6 @@ declare double @"gen$$double_addMult"(double, double, double) // #expect: gen.double.ll define double @"gen$$double_addMult"(double %0, double %1, double %2) +entry: %3 = call double @llvm.fmuladd.f64(double %0, double %1, double %2) ret double %3 diff --git a/test/test_suite14/generic/generic_num.c3t b/test/test_suite14/generic/generic_num.c3t new file mode 100644 index 000000000..82826dad0 --- /dev/null +++ b/test/test_suite14/generic/generic_num.c3t @@ -0,0 +1,53 @@ +// #target: macos-x64 +module hello; + +fn Type x(Type t) +{ + return t * t + FOO; +} + +module test; +import hello; +define xint = hello::x; + +import std::io; + +fn void main() +{ + io::printfn("%d", xint(4)); +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + %0 = call i32 @"hello$$int._123_x"(i32 4) + store i32 %0, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr1, align 8 + %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %11, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + ret void +} \ No newline at end of file diff --git a/test/test_suite2/globals/external_global.c3t b/test/test_suite14/globals/external_global.c3t similarity index 58% rename from test/test_suite2/globals/external_global.c3t rename to test/test_suite14/globals/external_global.c3t index 358c132e1..eca23cf05 100644 --- a/test/test_suite2/globals/external_global.c3t +++ b/test/test_suite14/globals/external_global.c3t @@ -21,15 +21,14 @@ fn int extract_or_test_files() return 0; } -/* #expect: test.ll +// #expect: test.ll - -%UzGlobs = type { i8, [1 x %MinInfo], ptr } +%UzGlobs = type { i8, [1 x %MinInfo], %MinInfo* } %MinInfo = type { i64, i32 } @g = external global %UzGlobs, align 8 entry: - store ptr getelementptr inbounds (%UzGlobs, ptr @g, i32 0, i32 1), ptr getelementptr inbounds (%UzGlobs, ptr @g, i32 0, i32 2), align 8 + store %MinInfo* getelementptr inbounds (%UzGlobs, %UzGlobs* @g, i32 0, i32 1, i32 0), %MinInfo** getelementptr inbounds (%UzGlobs, %UzGlobs* @g, i32 0, i32 2), align 8 ret i32 0 -} +} \ No newline at end of file diff --git a/test/test_suite2/globals/global_align.c3t b/test/test_suite14/globals/global_align.c3t similarity index 76% rename from test/test_suite2/globals/global_align.c3t rename to test/test_suite14/globals/global_align.c3t index d53034854..9efcc00b0 100644 --- a/test/test_suite2/globals/global_align.c3t +++ b/test/test_suite14/globals/global_align.c3t @@ -16,7 +16,7 @@ fn void test() define void @abc_test() #0 { entry: %x = alloca i32, align 4 - %0 = load i32, ptr @abc_foo, align 32 - store i32 %0, ptr %x, align 4 + %0 = load i32, i32* @abc_foo, align 32 + store i32 %0, i32* %x, align 4 ret void } diff --git a/test/test_suite2/globals/global_extname.c3t b/test/test_suite14/globals/global_extname.c3t similarity index 100% rename from test/test_suite2/globals/global_extname.c3t rename to test/test_suite14/globals/global_extname.c3t diff --git a/test/test_suite2/globals/global_init.c3 b/test/test_suite14/globals/global_init.c3 similarity index 100% rename from test/test_suite2/globals/global_init.c3 rename to test/test_suite14/globals/global_init.c3 diff --git a/test/test_suite2/globals/misplaced_const.c3 b/test/test_suite14/globals/misplaced_const.c3 similarity index 100% rename from test/test_suite2/globals/misplaced_const.c3 rename to test/test_suite14/globals/misplaced_const.c3 diff --git a/test/test_suite2/globals/recursive_globals.c3 b/test/test_suite14/globals/recursive_globals.c3 similarity index 100% rename from test/test_suite2/globals/recursive_globals.c3 rename to test/test_suite14/globals/recursive_globals.c3 diff --git a/test/test_suite2/globals/recursive_locals.c3 b/test/test_suite14/globals/recursive_locals.c3 similarity index 100% rename from test/test_suite2/globals/recursive_locals.c3 rename to test/test_suite14/globals/recursive_locals.c3 diff --git a/test/test_suite2/globals/self_referencing_local.c3 b/test/test_suite14/globals/self_referencing_local.c3 similarity index 100% rename from test/test_suite2/globals/self_referencing_local.c3 rename to test/test_suite14/globals/self_referencing_local.c3 diff --git a/test/test_suite2/globals/static_global.c3 b/test/test_suite14/globals/static_global.c3 similarity index 65% rename from test/test_suite2/globals/static_global.c3 rename to test/test_suite14/globals/static_global.c3 index b8fdf0397..cdeaf9872 100644 --- a/test/test_suite2/globals/static_global.c3 +++ b/test/test_suite14/globals/static_global.c3 @@ -1 +1 @@ -static int ifej; // #error: 'static' can only used with local variables, to hide global variables \ No newline at end of file +static int ifej; // #error: 'static' can only used with local variables \ No newline at end of file diff --git a/test/test_suite2/import/access_other_module.c3t b/test/test_suite14/import/access_other_module.c3t similarity index 53% rename from test/test_suite2/import/access_other_module.c3t rename to test/test_suite14/import/access_other_module.c3t index afc52275e..71cf2d00d 100644 --- a/test/test_suite2/import/access_other_module.c3t +++ b/test/test_suite14/import/access_other_module.c3t @@ -13,11 +13,11 @@ fn void main() define void @foo_main() #0 { entry: - %foekf = alloca ptr, align 8 - %xok = alloca ptr, align 8 - store ptr @printf, ptr %foekf, align 8 - store ptr @libc_EXIT_SUCCESS, ptr %xok, align 8 + %foekf = alloca i8*, align 8 + %xok = alloca i32*, align 8 + store i8* bitcast (i32 (i8*, ...)* @printf to i8*), i8** %foekf, align 8 + store i32* @libc_EXIT_SUCCESS, i32** %xok, align 8 ret void } -declare i32 @printf(ptr, ...) \ No newline at end of file +declare i32 @printf(i8*, ...) \ No newline at end of file diff --git a/test/test_suite2/import/autoimport.c3 b/test/test_suite14/import/autoimport.c3 similarity index 100% rename from test/test_suite2/import/autoimport.c3 rename to test/test_suite14/import/autoimport.c3 diff --git a/test/test_suite2/import/import_error.c3 b/test/test_suite14/import/import_error.c3 similarity index 100% rename from test/test_suite2/import/import_error.c3 rename to test/test_suite14/import/import_error.c3 diff --git a/test/test_suite2/import/import_error_multi.c3 b/test/test_suite14/import/import_error_multi.c3 similarity index 100% rename from test/test_suite2/import/import_error_multi.c3 rename to test/test_suite14/import/import_error_multi.c3 diff --git a/test/test_suite2/import/import_error_out_of_order.c3 b/test/test_suite14/import/import_error_out_of_order.c3 similarity index 100% rename from test/test_suite2/import/import_error_out_of_order.c3 rename to test/test_suite14/import/import_error_out_of_order.c3 diff --git a/test/test_suite2/import/import_error_string.c3 b/test/test_suite14/import/import_error_string.c3 similarity index 100% rename from test/test_suite2/import/import_error_string.c3 rename to test/test_suite14/import/import_error_string.c3 diff --git a/test/test_suite2/import/import_implicit.c3 b/test/test_suite14/import/import_implicit.c3 similarity index 100% rename from test/test_suite2/import/import_implicit.c3 rename to test/test_suite14/import/import_implicit.c3 diff --git a/test/test_suite2/import/import_same.c3 b/test/test_suite14/import/import_same.c3 similarity index 100% rename from test/test_suite2/import/import_same.c3 rename to test/test_suite14/import/import_same.c3 diff --git a/test/test_suite2/import/import_works.c3t b/test/test_suite14/import/import_works.c3t similarity index 100% rename from test/test_suite2/import/import_works.c3t rename to test/test_suite14/import/import_works.c3t diff --git a/test/test_suite2/initialize/initialize_bad_prio.c3 b/test/test_suite14/initialize/initialize_bad_prio.c3 similarity index 100% rename from test/test_suite2/initialize/initialize_bad_prio.c3 rename to test/test_suite14/initialize/initialize_bad_prio.c3 diff --git a/test/test_suite14/initialize/initialize_finalize.c3t b/test/test_suite14/initialize/initialize_finalize.c3t new file mode 100644 index 000000000..7e15bce28 --- /dev/null +++ b/test/test_suite14/initialize/initialize_finalize.c3t @@ -0,0 +1,62 @@ +// #target: linux-x64 +module test; +import std::io; + +fn void main() +{ + io::println("Hello, world!"); +} +extern fn void puts(char*); + +static initialize @priority(300) +{ + puts("Hello startup2"); +} +static initialize +{ + puts("Let's start main..."); +} +static initialize @priority(200) +{ + puts("Hello startup"); +} + +static initialize +{} + +static finalize +{ + puts("Bye bye"); +} + +/* #expect: test.ll + +@llvm.global_ctors = appending global [3 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 300, void ()* @.static_initialize.0, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @.static_initialize.1, i8* null }, { i32, void ()*, i8* } { i32 200, void ()* @.static_initialize.2, i8* null }] +@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @.static_finalize.0, i8* null }] + +define internal void @.static_initialize.0() { +entry: + call void @puts(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0)) + ret void +} + +; Function Attrs: nounwind +declare void @puts(i8*) #0 + +define internal void @.static_initialize.1() { +entry: + call void @puts(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.1, i32 0, i32 0)) + ret void +} + +define internal void @.static_initialize.2() { +entry: + call void @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i32 0, i32 0)) + ret void +} + +define internal void @.static_finalize.0() { +entry: + call void @puts(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i32 0, i32 0)) + ret void +} diff --git a/test/test_suite2/initialize/initialize_jump.c3 b/test/test_suite14/initialize/initialize_jump.c3 similarity index 100% rename from test/test_suite2/initialize/initialize_jump.c3 rename to test/test_suite14/initialize/initialize_jump.c3 diff --git a/test/test_suite2/initialize/initialize_parse_error.c3 b/test/test_suite14/initialize/initialize_parse_error.c3 similarity index 100% rename from test/test_suite2/initialize/initialize_parse_error.c3 rename to test/test_suite14/initialize/initialize_parse_error.c3 diff --git a/test/test_suite2/initialize/initialize_prio.c3 b/test/test_suite14/initialize/initialize_prio.c3 similarity index 100% rename from test/test_suite2/initialize/initialize_prio.c3 rename to test/test_suite14/initialize/initialize_prio.c3 diff --git a/test/test_suite2/initialize/initializer_var.c3t b/test/test_suite14/initialize/initializer_var.c3t similarity index 100% rename from test/test_suite2/initialize/initializer_var.c3t rename to test/test_suite14/initialize/initializer_var.c3t diff --git a/test/test_suite2/initializer_lists/disallowed_lists.c3 b/test/test_suite14/initializer_lists/disallowed_lists.c3 similarity index 100% rename from test/test_suite2/initializer_lists/disallowed_lists.c3 rename to test/test_suite14/initializer_lists/disallowed_lists.c3 diff --git a/test/test_suite14/initializer_lists/fasta.c3t b/test/test_suite14/initializer_lists/fasta.c3t new file mode 100644 index 000000000..233708ece --- /dev/null +++ b/test/test_suite14/initializer_lists/fasta.c3t @@ -0,0 +1,376 @@ +// #target: macos-x64 +module fasta; + +const IM = 139968u; +const IA = 3877u; +const IC = 29573u; +const SEED = 42u; + +uint seed = SEED; + +fn float fasta_rand(float maxval) +{ + seed = (seed * IA + IC) % IM; + return maxval * seed / IM; +} + +private char[] alu = + "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" + "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" + "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" + "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" + "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" + "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" + "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"; + +extern fn int atoi(char *s); +extern fn int printf(char *s, ...); +extern fn void putchar(int c); + +char[] iub = "acgtBDHKMNRSVWY"; +double[] iub_p = { + 0.27, + 0.12, + 0.12, + 0.27, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02 }; + +char[] homosapiens = "acgt"; +double[] homosapiens_p = { + 0.3029549426680, + 0.1979883004921, + 0.1975473066391, + 0.3015094502008 +}; + +const LINELEN = 60; + +// slowest character-at-a-time output +fn void repeat_fasta(char[] seq, int n) +{ + usz len = seq.len; + int i = void; + for (i = 0; i < n; i++) + { + putchar(seq[i % len]); + if (i % LINELEN == LINELEN - 1) putchar('\n'); + } + if (i % LINELEN != 0) putchar('\n'); +} + +fn void random_fasta(char[] symb, double[] probability, int n) +{ + assert(symb.len == probability.len); + int len = probability.len; + int i = void; + for (i = 0; i < n; i++) + { + double v = fasta_rand(1.0); + /* slowest idiomatic linear lookup. Fast if len is short though. */ + int j = void; + for (j = 0; j < len - 1; j++) + { + v -= probability[j]; + if (v < 0) break; + } + putchar(symb[j]); + if (i % LINELEN == LINELEN - 1) putchar('\n'); + } + if (i % LINELEN != 0) putchar('\n'); +} + +fn void main(int argc, char **argv) +{ + int n = 1000; + if (argc > 1) n = atoi(argv[1]); + + printf(">ONE Homo sapiens alu\n"); + repeat_fasta(alu, n * 2); + + printf(">TWO IUB ambiguity codes\n"); + random_fasta(iub, iub_p, n * 3); + + printf(">THREE Homo sapiens frequency\n"); + random_fasta(homosapiens, homosapiens_p, n * 5); + +} + +/* #expect: fasta.ll + +%"char[]" = type { i8*, i64 } +%"double[]" = type { double*, i64 } + +@fasta_IM = local_unnamed_addr constant i32 139968, align 4 +@fasta_IA = local_unnamed_addr constant i32 3877, align 4 +@fasta_IC = local_unnamed_addr constant i32 29573, align 4 +@fasta_SEED = local_unnamed_addr constant i32 42, align 4 +@fasta_seed = local_unnamed_addr global i32 42, align 4 +@.str = private unnamed_addr constant [288 x i8] c"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA\00", align 1 +@fasta_alu = protected unnamed_addr global %"char[]" { i8* getelementptr inbounds ([288 x i8], [288 x i8]* @.str, i32 0, i32 0), i64 287 }, align 8 +@.str.11 = private unnamed_addr constant [16 x i8] c"acgtBDHKMNRSVWY\00", align 1 +@fasta_iub = local_unnamed_addr global %"char[]" { i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.11, i32 0, i32 0), i64 15 }, align 8 +@.taddr = private global [15 x double] [double 2.700000e-01, double 1.200000e-01, double 1.200000e-01, double 2.700000e-01, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02], align 8 +@fasta_iub_p = local_unnamed_addr global %"double[]" { double* getelementptr inbounds ([15 x double], [15 x double]* @.taddr, i32 0, i32 0), i64 15 }, align 8 +@.str.12 = private unnamed_addr constant [5 x i8] c"acgt\00", align 1 +@fasta_homosapiens = local_unnamed_addr global %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.12, i32 0, i32 0), i64 4 }, align 8 +@.taddr.13 = private global [4 x double] [double 0x3FD3639D20BAEB5B, double 0x3FC957AE3DCD561B, double 0x3FC9493AEAB6C2BF, double 0x3FD34BEE4B030838], align 8 +@fasta_homosapiens_p = local_unnamed_addr global %"double[]" { double* getelementptr inbounds ([4 x double], [4 x double]* @.taddr.13, i32 0, i32 0), i64 4 }, align 8 +@fasta_LINELEN = local_unnamed_addr constant i32 60, align 4 +@.str.14 = private unnamed_addr constant [23 x i8] c">ONE Homo sapiens alu\0A\00", align 1 +@.str.15 = private unnamed_addr constant [26 x i8] c">TWO IUB ambiguity codes\0A\00", align 1 +@.str.16 = private unnamed_addr constant [31 x i8] c">THREE Homo sapiens frequency\0A\00", align 1 + +; Function Attrs: nounwind +define float @fasta_fasta_rand(float %0) #0 { +entry: + %1 = load i32, i32* @fasta_seed, align 4 + %mul = mul i32 %1, 3877 + %add = add i32 %mul, 29573 + %umod = urem i32 %add, 139968 + store i32 %umod, i32* @fasta_seed, align 4 + %2 = load i32, i32* @fasta_seed, align 4 + %uifp = uitofp i32 %2 to float + %fmul = fmul float %0, %uifp + %fdiv = fdiv float %fmul, 1.399680e+05 + ret float %fdiv +} + +; Function Attrs: nounwind +declare i32 @atoi(i8*) #0 + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +declare void @putchar(i32) #0 + +; Function Attrs: nounwind +define void @fasta_repeat_fasta(i8* %0, i64 %1, i32 %2) #0 { +entry: + %seq = alloca %"char[]", align 8 + %len = alloca i64, align 8 + %i = alloca i32, align 4 + %pair = bitcast %"char[]"* %seq to { i8*, i64 }* + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %3, align 8 + %4 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %4, align 8 + %5 = getelementptr inbounds %"char[]", %"char[]"* %seq, i32 0, i32 1 + %6 = load i64, i64* %5, align 8 + store i64 %6, i64* %len, align 8 + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %if.exit, %entry + %7 = load i32, i32* %i, align 4 + %lt = icmp slt i32 %7, %2 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %8 = getelementptr inbounds %"char[]", %"char[]"* %seq, i32 0, i32 0 + %9 = load i8*, i8** %8, align 8 + %10 = load i32, i32* %i, align 4 + %sisiext = sext i32 %10 to i64 + %11 = load i64, i64* %len, align 8 + %smod = srem i64 %sisiext, %11 + %ptroffset = getelementptr inbounds i8, i8* %9, i64 %smod + %12 = load i8, i8* %ptroffset, align 1 + %uisiext = zext i8 %12 to i32 + call void @putchar(i32 %uisiext) + %13 = load i32, i32* %i, align 4 + %smod1 = srem i32 %13, 60 + %eq = icmp eq i32 %smod1, 59 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %loop.body + call void @putchar(i32 10) + br label %if.exit + +if.exit: ; preds = %if.then, %loop.body + %14 = load i32, i32* %i, align 4 + %add = add i32 %14, 1 + store i32 %add, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %15 = load i32, i32* %i, align 4 + %smod2 = srem i32 %15, 60 + %neq = icmp ne i32 %smod2, 0 + br i1 %neq, label %if.then3, label %if.exit4 + +if.then3: ; preds = %loop.exit + call void @putchar(i32 10) + br label %if.exit4 + +if.exit4: ; preds = %if.then3, %loop.exit + ret void +} + +; Function Attrs: nounwind +define void @fasta_random_fasta(i8* %0, i64 %1, i8* %2, i64 %3, i32 %4) #0 { +entry: + %symb = alloca %"char[]", align 8 + %probability = alloca %"double[]", align 8 + %len = alloca i32, align 4 + %i = alloca i32, align 4 + %v = alloca double, align 8 + %j = alloca i32, align 4 + %pair = bitcast %"char[]"* %symb to { i8*, i64 }* + %5 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %5, align 8 + %6 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %6, align 8 + %pair1 = bitcast %"double[]"* %probability to { i8*, i64 }* + %7 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 0 + store i8* %2, i8** %7, align 8 + %8 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair1, i32 0, i32 1 + store i64 %3, i64* %8, align 8 + %9 = getelementptr inbounds %"char[]", %"char[]"* %symb, i32 0, i32 1 + %10 = load i64, i64* %9, align 8 + %11 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 1 + %12 = load i64, i64* %11, align 8 + %eq = icmp eq i64 %10, %12 + call void @llvm.assume(i1 %eq) + %13 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 1 + %14 = load i64, i64* %13, align 8 + %uisitrunc = trunc i64 %14 to i32 + store i32 %uisitrunc, i32* %len, align 4 + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %if.exit10, %entry + %15 = load i32, i32* %i, align 4 + %lt = icmp slt i32 %15, %4 + br i1 %lt, label %loop.body, label %loop.exit12 + +loop.body: ; preds = %loop.cond + %16 = call float @fasta_fasta_rand(float 1.000000e+00) + %fpfpext = fpext float %16 to double + store double %fpfpext, double* %v, align 8 + store i32 0, i32* %j, align 4 + br label %loop.cond2 + +loop.cond2: ; preds = %if.exit, %loop.body + %17 = load i32, i32* %j, align 4 + %18 = load i32, i32* %len, align 4 + %sub = sub i32 %18, 1 + %lt3 = icmp slt i32 %17, %sub + br i1 %lt3, label %loop.body4, label %loop.exit + +loop.body4: ; preds = %loop.cond2 + %19 = load double, double* %v, align 8 + %20 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 0 + %21 = load double*, double** %20, align 8 + %22 = load i32, i32* %j, align 4 + %sisiext = sext i32 %22 to i64 + %ptroffset = getelementptr inbounds double, double* %21, i64 %sisiext + %23 = load double, double* %ptroffset, align 8 + %fsub = fsub double %19, %23 + store double %fsub, double* %v, align 8 + %24 = load double, double* %v, align 8 + %lt5 = fcmp olt double %24, 0.000000e+00 + br i1 %lt5, label %if.then, label %if.exit + +if.then: ; preds = %loop.body4 + br label %loop.exit + +if.exit: ; preds = %loop.body4 + %25 = load i32, i32* %j, align 4 + %add = add i32 %25, 1 + store i32 %add, i32* %j, align 4 + br label %loop.cond2 + +loop.exit: ; preds = %if.then, %loop.cond2 + %26 = getelementptr inbounds %"char[]", %"char[]"* %symb, i32 0, i32 0 + %27 = load i8*, i8** %26, align 8 + %28 = load i32, i32* %j, align 4 + %sisiext6 = sext i32 %28 to i64 + %ptroffset7 = getelementptr inbounds i8, i8* %27, i64 %sisiext6 + %29 = load i8, i8* %ptroffset7, align 1 + %uisiext = zext i8 %29 to i32 + call void @putchar(i32 %uisiext) + %30 = load i32, i32* %i, align 4 + %smod = srem i32 %30, 60 + %eq8 = icmp eq i32 %smod, 59 + br i1 %eq8, label %if.then9, label %if.exit10 + +if.then9: ; preds = %loop.exit + call void @putchar(i32 10) + br label %if.exit10 + +if.exit10: ; preds = %if.then9, %loop.exit + %31 = load i32, i32* %i, align 4 + %add11 = add i32 %31, 1 + store i32 %add11, i32* %i, align 4 + br label %loop.cond + +loop.exit12: ; preds = %loop.cond + %32 = load i32, i32* %i, align 4 + %smod13 = srem i32 %32, 60 + %neq = icmp ne i32 %smod13, 0 + br i1 %neq, label %if.then14, label %if.exit15 + +if.then14: ; preds = %loop.exit12 + call void @putchar(i32 10) + br label %if.exit15 + +if.exit15: ; preds = %if.then14, %loop.exit12 + ret void +} + +; Function Attrs: nounwind +define void @fasta_main(i32 %0, i8** %1) #0 { +entry: + %n = alloca i32, align 4 + store i32 1000, i32* %n, align 4 + %gt = icmp sgt i32 %0, 1 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %entry + %ptroffset = getelementptr inbounds i8*, i8** %1, i64 1 + %2 = load i8*, i8** %ptroffset, align 8 + %3 = call i32 @atoi(i8* %2) + store i32 %3, i32* %n, align 4 + br label %if.exit + +if.exit: ; preds = %if.then, %entry + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.14, i32 0, i32 0)) + %lo = load i8*, i8** getelementptr inbounds (%"char[]", %"char[]"* @fasta_alu, i32 0, i32 0), align 8 + %hi = load i64, i64* getelementptr inbounds (%"char[]", %"char[]"* @fasta_alu, i32 0, i32 1), align 8 + %5 = load i32, i32* %n, align 4 + %mul = mul i32 %5, 2 + call void @fasta_repeat_fasta(i8* %lo, i64 %hi, i32 %mul) + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.15, i32 0, i32 0)) + %lo1 = load i8*, i8** getelementptr inbounds (%"char[]", %"char[]"* @fasta_iub, i32 0, i32 0), align 8 + %hi2 = load i64, i64* getelementptr inbounds (%"char[]", %"char[]"* @fasta_iub, i32 0, i32 1), align 8 + %lo3 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_iub_p to { i8*, i64 }*), i32 0, i32 0), align 8 + %hi4 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_iub_p to { i8*, i64 }*), i32 0, i32 1), align 8 + %7 = load i32, i32* %n, align 4 + %mul5 = mul i32 %7, 3 + call void @fasta_random_fasta(i8* %lo1, i64 %hi2, i8* %lo3, i64 %hi4, i32 %mul5) + %8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.16, i32 0, i32 0)) + %lo6 = load i8*, i8** getelementptr inbounds (%"char[]", %"char[]"* @fasta_homosapiens, i32 0, i32 0), align 8 + %hi7 = load i64, i64* getelementptr inbounds (%"char[]", %"char[]"* @fasta_homosapiens, i32 0, i32 1), align 8 + %lo8 = load i8*, i8** getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_homosapiens_p to { i8*, i64 }*), i32 0, i32 0), align 8 + %hi9 = load i64, i64* getelementptr inbounds ({ i8*, i64 }, { i8*, i64 }* bitcast (%"double[]"* @fasta_homosapiens_p to { i8*, i64 }*), i32 0, i32 1), align 8 + %9 = load i32, i32* %n, align 4 + %mul10 = mul i32 %9, 5 + call void @fasta_random_fasta(i8* %lo6, i64 %hi7, i8* %lo8, i64 %hi9, i32 %mul10) + ret void +} + +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @fasta_main(i32 %0, i8** %1) + ret i32 0 +} \ No newline at end of file diff --git a/test/test_suite14/initializer_lists/general_tests.c3t b/test/test_suite14/initializer_lists/general_tests.c3t new file mode 100644 index 000000000..13fe0bba3 --- /dev/null +++ b/test/test_suite14/initializer_lists/general_tests.c3t @@ -0,0 +1,90 @@ +// #target: macos-x64 + +union Baz +{ + int x; + double y; +} +struct Bar +{ + int x; + int y; +} + +fn int test() +{ + Baz ffe = { .x = 1 }; + int[1] azz = {}; + var $foo = { 11, 22, 33 }; + static int foo1 = $foo[1]; + int foo2 = $foo[2]; + var $foos = { "Hello!" }; + char* str = $foos[0]; + bool x = ! int[] { 1, 2, 3 }; + Bar b = {}; + Baz z = {}; + int[] sub = {}; + Bar[] foo = {}; + Baz[3] baz = {}; + return 1; +} + + +/* #expect: general_tests.ll + +%Baz = type { double } +%Bar = type { i32, i32 } +%"int[]" = type { i32*, i64 } +%"Bar[]" = type { %Bar*, i64 } + +@"ct$general_tests_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$general_tests_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8 +@"test$foo1" = internal unnamed_addr global i32 22, align 4 +@.str = private unnamed_addr constant [7 x i8] c"Hello!\00", align 1 + +; Function Attrs: nounwind +define i32 @general_tests_test() #0 { +entry: + %ffe = alloca %Baz, align 8 + %azz = alloca [1 x i32], align 4 + %foo2 = alloca i32, align 4 + %str = alloca i8*, align 8 + %x = alloca i8, align 1 + %literal = alloca [3 x i32], align 4 + %b = alloca %Bar, align 4 + %z = alloca %Baz, align 8 + %sub = alloca %"int[]", align 8 + %foo = alloca %"Bar[]", align 8 + %baz = alloca [3 x %Baz], align 16 + %0 = bitcast %Baz* %ffe to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %0, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false) + %1 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0 + store i32 0, i32* %1, align 4 + store i32 33, i32* %foo2, align 4 + store i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i8** %str, align 8 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0 + store i32 1, i32* %2, align 4 + %3 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1 + store i32 2, i32* %3, align 4 + %4 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2 + store i32 3, i32* %4, align 4 + %5 = bitcast [3 x i32]* %literal to i32* + %6 = insertvalue %"int[]" undef, i32* %5, 0 + %7 = insertvalue %"int[]" %6, i64 3, 1 + %8 = extractvalue %"int[]" %7, 1 + %not = icmp eq i64 %8, 0 + %9 = zext i1 %not to i8 + store i8 %9, i8* %x, align 1 + %10 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0 + store i32 0, i32* %10, align 4 + %11 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 + store i32 0, i32* %11, align 4 + %12 = bitcast %Baz* %z to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %12, i8 0, i64 8, i1 false) + store %"int[]" zeroinitializer, %"int[]"* %sub, align 8 + store %"Bar[]" zeroinitializer, %"Bar[]"* %foo, align 8 + %13 = bitcast [3 x %Baz]* %baz to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %13, i8 0, i64 24, i1 false) + ret i32 1 +} \ No newline at end of file diff --git a/test/test_suite2/initializer_lists/indexing_into_complist.c3 b/test/test_suite14/initializer_lists/indexing_into_complist.c3 similarity index 100% rename from test/test_suite2/initializer_lists/indexing_into_complist.c3 rename to test/test_suite14/initializer_lists/indexing_into_complist.c3 diff --git a/test/test_suite2/initializer_lists/initializers_to_macros.c3 b/test/test_suite14/initializer_lists/initializers_to_macros.c3 similarity index 100% rename from test/test_suite2/initializer_lists/initializers_to_macros.c3 rename to test/test_suite14/initializer_lists/initializers_to_macros.c3 diff --git a/test/test_suite14/initializer_lists/ranges_to_dynamic.c3t b/test/test_suite14/initializer_lists/ranges_to_dynamic.c3t new file mode 100644 index 000000000..8d64221af --- /dev/null +++ b/test/test_suite14/initializer_lists/ranges_to_dynamic.c3t @@ -0,0 +1,65 @@ +// #target: mingw-x64 +module test; + +extern fn void printf(char*, ...); + +fn void test(int x) +{ + int[10] y = { [0..3] = 4, [6..8] = x }; + foreach (int v : y) + { + printf("%d\n", v); + } +} + +fn void main() +{ + test(101); +} + +/* #expect: test.ll + +define void @test_test(i32 %0) #0 { +entry: + %y = alloca [10 x i32], align 16 + %.anon = alloca i64, align 8 + %v = alloca i32, align 4 + %1 = bitcast [10 x i32]* %y to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %1, i8 0, i64 40, i1 false) + %2 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 0 + store i32 4, i32* %2, align 4 + %3 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 1 + store i32 4, i32* %3, align 4 + %4 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 2 + store i32 4, i32* %4, align 4 + %5 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 3 + store i32 4, i32* %5, align 4 + %6 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 6 + store i32 %0, i32* %6, align 4 + %7 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 7 + store i32 %0, i32* %7, align 4 + %8 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 8 + store i32 %0, i32* %8, align 4 + store i64 0, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %9 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 10, %9 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %10 = load i64, i64* %.anon, align 8 + %11 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 %10 + %12 = load i32, i32* %11, align 4 + store i32 %12, i32* %v, align 4 + %13 = load i32, i32* %v, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %13) + %14 = load i64, i64* %.anon, align 8 + %add = add i64 %14, 1 + store i64 %add, i64* %.anon, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + ret void +} \ No newline at end of file diff --git a/test/test_suite14/initializer_lists/statics.c3t b/test/test_suite14/initializer_lists/statics.c3t new file mode 100644 index 000000000..6f906bd51 --- /dev/null +++ b/test/test_suite14/initializer_lists/statics.c3t @@ -0,0 +1,92 @@ +// #target: macos-x64 +import std::io; +import libc; +union Baz +{ + int x; + double y; +} +struct Bar +{ + int x; + int y; +} + + +fn void test() +{ + Bar[] b = { { 1, 2 } }; + static Bar[] c = { { 1, 2 } }; + libc::printf("%d %d\n", b[0].y, c[0].y); + b[0].y += 1; + c[0].y += 1; + +} +fn int main() +{ + test(); + test(); + test(); + return 1; +} + +/* #expect: statics.ll + +%Bar = type { i32, i32 } +%"Bar[]" = type { %Bar*, i64 } + +@"ct$statics_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$statics_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@.taddr = private global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 8 +@"test$c" = internal unnamed_addr global %"Bar[]" { %Bar* getelementptr inbounds ([1 x %Bar], [1 x %Bar]* @.taddr, i32 0, i32 0), i64 1 }, align 8 +@.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 + +define void @statics_test() #0 { +entry: + %b = alloca %"Bar[]", align 8 + %literal = alloca [1 x %Bar], align 4 + %0 = getelementptr inbounds [1 x %Bar], [1 x %Bar]* %literal, i64 0, i64 0 + %1 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 0 + store i32 1, i32* %1, align 4 + %2 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 1 + store i32 2, i32* %2, align 4 + %3 = bitcast [1 x %Bar]* %literal to %Bar* + %4 = insertvalue %"Bar[]" undef, %Bar* %3, 0 + %5 = insertvalue %"Bar[]" %4, i64 1, 1 + store %"Bar[]" %5, %"Bar[]"* %b, align 8 + %6 = getelementptr inbounds %"Bar[]", %"Bar[]"* %b, i32 0, i32 0 + %7 = load %Bar*, %Bar** %6, align 8 + %ptroffset = getelementptr inbounds %Bar, %Bar* %7, i64 0 + %8 = getelementptr inbounds %Bar, %Bar* %ptroffset, i32 0, i32 1 + %9 = load i32, i32* %8, align 4 + %10 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @"test$c", i32 0, i32 0), align 8 + %ptroffset1 = getelementptr inbounds %Bar, %Bar* %10, i64 0 + %11 = getelementptr inbounds %Bar, %Bar* %ptroffset1, i32 0, i32 1 + %12 = load i32, i32* %11, align 4 + %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0), i32 %9, i32 %12) + %14 = getelementptr inbounds %"Bar[]", %"Bar[]"* %b, i32 0, i32 0 + %15 = load %Bar*, %Bar** %14, align 8 + %ptroffset2 = getelementptr inbounds %Bar, %Bar* %15, i64 0 + %16 = getelementptr inbounds %Bar, %Bar* %ptroffset2, i32 0, i32 1 + %17 = load i32, i32* %16, align 4 + %add = add i32 %17, 1 + store i32 %add, i32* %16, align 4 + %18 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @"test$c", i32 0, i32 0), align 8 + %ptroffset3 = getelementptr inbounds %Bar, %Bar* %18, i64 0 + %19 = getelementptr inbounds %Bar, %Bar* %ptroffset3, i32 0, i32 1 + %20 = load i32, i32* %19, align 4 + %add4 = add i32 %20, 1 + store i32 %add4, i32* %19, align 4 + ret void +} + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + call void @statics_test() + call void @statics_test() + call void @statics_test() + ret i32 1 +} + +declare i32 @printf(i8*, ...) diff --git a/test/test_suite14/initializer_lists/subarrays.c3t b/test/test_suite14/initializer_lists/subarrays.c3t new file mode 100644 index 000000000..9696251ad --- /dev/null +++ b/test/test_suite14/initializer_lists/subarrays.c3t @@ -0,0 +1,169 @@ +// #target: macos-x64 + +import std::io; +import std::core::mem; +import libc; +union Baz +{ + int x; + double y; +} +struct Bar +{ + int x; + int y; +} + + +Bar[] arrbar = { { 3, 4 }, { 8, 9 }}; +int[] xd = { 1, 2 }; +int* fofeo = &&(int[2]{ 3, 4 }); + +fn int main() +{ + Bar w = arrbar[1]; + libc::printf("%d\n", arrbar[1].x); + int[] x = { 1, 2, 3 }; + int* y = &&(int[3]{ 123, 234, 567 }); + io::println("Start:"); + libc::printf("X len: %d mid element %d\n", (int)(x.len), x[1]); + libc::printf("Y mid element %d\n", y[1]); + libc::printf("Fofeo second element %d\n", fofeo[1]); + Baz ffe = { .x = 1 }; + int[1] azz = {}; + + //var $foo = { 1, 2, 3 }; + bool xy = ! int[] { 1, 2, 3 }; + if (!xy) io::println("Ok"); + Bar b = {}; + Baz z = {}; + int[] sub = {}; + Bar[] foo = {}; + Baz[3] baz = {}; + return 1; +} + +/* #expect: subarrays.ll + +%Bar = type { i32, i32 } +%"Bar[]" = type { %Bar*, i64 } +%"int[]" = type { i32*, i64 } +%Baz = type { double } + +@"ct$subarrays_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@"ct$subarrays_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 +@.taddr = private global [2 x %Bar] [%Bar { i32 3, i32 4 }, %Bar { i32 8, i32 9 }], align 8 +@subarrays_arrbar = local_unnamed_addr global %"Bar[]" { %Bar* getelementptr inbounds ([2 x %Bar], [2 x %Bar]* @.taddr, i32 0, i32 0), i64 2 }, align 8 +@.taddr.3 = private global [2 x i32] [i32 1, i32 2], align 4 +@subarrays_xd = local_unnamed_addr global %"int[]" { i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.3, i32 0, i32 0), i64 2 }, align 8 +@.taddr.4 = private global [2 x i32] [i32 3, i32 4], align 4 +@subarrays_fofeo = local_unnamed_addr global i32* getelementptr inbounds ([2 x i32], [2 x i32]* @.taddr.4, i32 0, i32 0), align 8 +@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 +@.str.5 = private unnamed_addr constant [7 x i8] c"Start:\00", align 1 +@.str.6 = private unnamed_addr constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1 +@.str.7 = private unnamed_addr constant [18 x i8] c"Y mid element %d\0A\00", align 1 +@.str.8 = private unnamed_addr constant [25 x i8] c"Fofeo second element %d\0A\00", align 1 +@.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8 +@.str.9 = private unnamed_addr constant [3 x i8] c"Ok\00", align 1 + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + %w = alloca %Bar, align 4 + %x = alloca %"int[]", align 8 + %literal = alloca [3 x i32], align 4 + %y = alloca i32*, align 8 + %literal2 = alloca [3 x i32], align 4 + %ffe = alloca %Baz, align 8 + %azz = alloca [1 x i32], align 4 + %xy = alloca i8, align 1 + %literal6 = alloca [3 x i32], align 4 + %b = alloca %Bar, align 4 + %z = alloca %Baz, align 8 + %sub = alloca %"int[]", align 8 + %foo = alloca %"Bar[]", align 8 + %baz = alloca [3 x %Baz], align 16 + %0 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays_arrbar, i32 0, i32 0), align 8 + %ptroffset = getelementptr inbounds %Bar, %Bar* %0, i64 1 + %1 = bitcast %Bar* %w to i8* + %2 = bitcast %Bar* %ptroffset to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 8, i1 false) + %3 = load %Bar*, %Bar** getelementptr inbounds (%"Bar[]", %"Bar[]"* @subarrays_arrbar, i32 0, i32 0), align 8 + %ptroffset1 = getelementptr inbounds %Bar, %Bar* %3, i64 1 + %4 = getelementptr inbounds %Bar, %Bar* %ptroffset1, i32 0, i32 0 + %5 = load i32, i32* %4, align 4 + %6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %5) + %7 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 0 + store i32 1, i32* %7, align 4 + %8 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 1 + store i32 2, i32* %8, align 4 + %9 = getelementptr inbounds [3 x i32], [3 x i32]* %literal, i64 0, i64 2 + store i32 3, i32* %9, align 4 + %10 = bitcast [3 x i32]* %literal to i32* + %11 = insertvalue %"int[]" undef, i32* %10, 0 + %12 = insertvalue %"int[]" %11, i64 3, 1 + store %"int[]" %12, %"int[]"* %x, align 8 + %13 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 0 + store i32 123, i32* %13, align 4 + %14 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 1 + store i32 234, i32* %14, align 4 + %15 = getelementptr inbounds [3 x i32], [3 x i32]* %literal2, i64 0, i64 2 + store i32 567, i32* %15, align 4 + %ptrptr = bitcast [3 x i32]* %literal2 to i32* + store i32* %ptrptr, i32** %y, align 8 + %16 = call i32 @std_io_println(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #3 + %17 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 + %18 = load i64, i64* %17, align 8 + %uisitrunc = trunc i64 %18 to i32 + %19 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 + %20 = load i32*, i32** %19, align 8 + %ptroffset3 = getelementptr inbounds i32, i32* %20, i64 1 + %21 = load i32, i32* %ptroffset3, align 4 + %22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.6, i32 0, i32 0), i32 %uisitrunc, i32 %21) + %23 = load i32*, i32** %y, align 8 + %ptroffset4 = getelementptr inbounds i32, i32* %23, i64 1 + %24 = load i32, i32* %ptroffset4, align 4 + %25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.7, i32 0, i32 0), i32 %24) + %26 = load i32*, i32** @subarrays_fofeo, align 8 + %ptroffset5 = getelementptr inbounds i32, i32* %26, i64 1 + %27 = load i32, i32* %ptroffset5, align 4 + %28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.8, i32 0, i32 0), i32 %27) + %29 = bitcast %Baz* %ffe to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %29, i8* align 8 bitcast ({ i32, [4 x i8] }* @.__const to i8*), i32 8, i1 false) + %30 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0 + store i32 0, i32* %30, align 4 + %31 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 0 + store i32 1, i32* %31, align 4 + %32 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 1 + store i32 2, i32* %32, align 4 + %33 = getelementptr inbounds [3 x i32], [3 x i32]* %literal6, i64 0, i64 2 + store i32 3, i32* %33, align 4 + %34 = bitcast [3 x i32]* %literal6 to i32* + %35 = insertvalue %"int[]" undef, i32* %34, 0 + %36 = insertvalue %"int[]" %35, i64 3, 1 + %37 = extractvalue %"int[]" %36, 1 + %not = icmp eq i64 %37, 0 + %38 = zext i1 %not to i8 + store i8 %38, i8* %xy, align 1 + %39 = load i8, i8* %xy, align 1 + %40 = trunc i8 %39 to i1 + %not7 = xor i1 %40, true + br i1 %not7, label %if.then, label %if.exit + +if.then: ; preds = %entry + %41 = call i32 @std_io_println(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0)) #3 + br label %if.exit + +if.exit: ; preds = %if.then, %entry + %42 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0 + store i32 0, i32* %42, align 4 + %43 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 + store i32 0, i32* %43, align 4 + %44 = bitcast %Baz* %z to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %44, i8 0, i64 8, i1 false) + store %"int[]" zeroinitializer, %"int[]"* %sub, align 8 + store %"Bar[]" zeroinitializer, %"Bar[]"* %foo, align 8 + %45 = bitcast [3 x %Baz]* %baz to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %45, i8 0, i64 24, i1 false) + ret i32 1 +} diff --git a/test/test_suite2/initializer_lists/zero_inferred_array.c3 b/test/test_suite14/initializer_lists/zero_inferred_array.c3 similarity index 100% rename from test/test_suite2/initializer_lists/zero_inferred_array.c3 rename to test/test_suite14/initializer_lists/zero_inferred_array.c3 diff --git a/test/test_suite14/initializer_lists/zero_init.c3t b/test/test_suite14/initializer_lists/zero_init.c3t new file mode 100644 index 000000000..78605540f --- /dev/null +++ b/test/test_suite14/initializer_lists/zero_init.c3t @@ -0,0 +1,61 @@ +// #target: macos-x64 + +union Baz +{ + int x; + double y; +} +struct Bar +{ + int x; + int y; +} + +struct Mega +{ + int[10] z; +} + +fn int test() +{ + Mega m = {}; + int[1] azz = {}; + Bar b = {}; + Baz z = {}; + int[] sub = {}; + Bar[] foo = {}; + Baz[3] baz = {}; + return 1; +} + +// #expect: zero_init.ll + +%Mega = type { [10 x i32] } +%Bar = type { i32, i32 } +%Baz = type { double } + +define i32 @zero_init_test() #0 { +entry: + %m = alloca %Mega, align 4 + %azz = alloca [1 x i32], align 4 + %b = alloca %Bar, align 4 + %z = alloca %Baz, align 8 + %sub = alloca %"int[]", align 8 + %foo = alloca %"Bar[]", align 8 + %baz = alloca [3 x %Baz], align 16 + %0 = bitcast %Mega* %m to i8* + call void @llvm.memset.p0i8.i64(i8* align 4 %0, i8 0, i64 40, i1 false) + %1 = getelementptr inbounds [1 x i32], [1 x i32]* %azz, i64 0, i64 0 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 0 + store i32 0, i32* %2, align 4 + %3 = getelementptr inbounds %Bar, %Bar* %b, i32 0, i32 1 + store i32 0, i32* %3, align 4 + %4 = bitcast %Baz* %z to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %4, i8 0, i64 8, i1 false) + store %"int[]" zeroinitializer, %"int[]"* %sub, align 8 + store %"Bar[]" zeroinitializer, %"Bar[]"* %foo, align 8 + %5 = bitcast [3 x %Baz]* %baz to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %5, i8 0, i64 24, i1 false) + ret i32 1 +} diff --git a/test/test_suite2/lexing/expected_directive.c3 b/test/test_suite14/lexing/expected_directive.c3 similarity index 100% rename from test/test_suite2/lexing/expected_directive.c3 rename to test/test_suite14/lexing/expected_directive.c3 diff --git a/test/test_suite2/lexing/invalid_hex_in_hexarray.c3 b/test/test_suite14/lexing/invalid_hex_in_hexarray.c3 similarity index 100% rename from test/test_suite2/lexing/invalid_hex_in_hexarray.c3 rename to test/test_suite14/lexing/invalid_hex_in_hexarray.c3 diff --git a/test/test_suite2/lexing/invalid_hex_in_hexarray2.c3 b/test/test_suite14/lexing/invalid_hex_in_hexarray2.c3 similarity index 100% rename from test/test_suite2/lexing/invalid_hex_in_hexarray2.c3 rename to test/test_suite14/lexing/invalid_hex_in_hexarray2.c3 diff --git a/test/test_suite2/lexing/no_builtin.c3 b/test/test_suite14/lexing/no_builtin.c3 similarity index 100% rename from test/test_suite2/lexing/no_builtin.c3 rename to test/test_suite14/lexing/no_builtin.c3 diff --git a/test/test_suite2/literals/bad_bitwidth.c3 b/test/test_suite14/literals/bad_bitwidth.c3 similarity index 100% rename from test/test_suite2/literals/bad_bitwidth.c3 rename to test/test_suite14/literals/bad_bitwidth.c3 diff --git a/test/test_suite14/literals/bin_literal.c3t b/test/test_suite14/literals/bin_literal.c3t new file mode 100644 index 000000000..09ca91bcd --- /dev/null +++ b/test/test_suite14/literals/bin_literal.c3t @@ -0,0 +1,121 @@ +// #target: macos-x64 +module test; +import std::io; +import std::bits; +fn void main() +{ + int a = 123; + int b = -23; + int c = $$min(a, b); + int d = $$max(a, b); + io::printfn("%d %d", c, d); + char z = 0b1101_1101; + io::printfn("%b %b %b", z, z.rotr(1), z.rotl(1)); +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %a = alloca i32, align 4 + %b = alloca i32, align 4 + %c = alloca i32, align 4 + %d = alloca i32, align 4 + %retparam = alloca i64, align 8 + %varargslots = alloca [2 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %z = alloca i8, align 1 + %retparam1 = alloca i64, align 8 + %varargslots2 = alloca [3 x %variant], align 16 + %i = alloca i8, align 1 + %shift = alloca i8, align 1 + %taddr3 = alloca i8, align 1 + %i4 = alloca i8, align 1 + %shift5 = alloca i8, align 1 + %taddr6 = alloca i8, align 1 + %taddr7 = alloca %"variant[]", align 8 + store i32 123, i32* %a, align 4 + store i32 -23, i32* %b, align 4 + %0 = load i32, i32* %a, align 4 + %1 = load i32, i32* %b, align 4 + %2 = call i32 @llvm.smin.i32(i32 %0, i32 %1) + store i32 %2, i32* %c, align 4 + %3 = load i32, i32* %a, align 4 + %4 = load i32, i32* %b, align 4 + %5 = call i32 @llvm.smax.i32(i32 %3, i32 %4) + store i32 %5, i32* %d, align 4 + %6 = bitcast i32* %c to i8* + %7 = insertvalue %variant undef, i8* %6, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %9 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %8, %variant* %9, align 16 + %10 = bitcast i32* %d to i8* + %11 = insertvalue %variant undef, i8* %10, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %13 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %12, %variant* %13, align 16 + %14 = bitcast [2 x %variant]* %varargslots to %variant* + %15 = insertvalue %"variant[]" undef, %variant* %14, 0 + %16 = insertvalue %"variant[]" %15, i64 2, 1 + store %"variant[]" %16, %"variant[]"* %taddr, align 8 + %17 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 + %lo = load i8*, i8** %18, align 8 + %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 + %hi = load i64, i64* %19, align 8 + %20 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %20, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + store i8 -35, i8* %z, align 1 + %21 = insertvalue %variant undef, i8* %z, 0 + %22 = insertvalue %variant %21, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + %23 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots2, i64 0, i64 0 + store %variant %22, %variant* %23, align 16 + %24 = load i8, i8* %z, align 1 + store i8 %24, i8* %i, align 1 + store i8 1, i8* %shift, align 1 + %25 = load i8, i8* %i, align 1 + %26 = load i8, i8* %i, align 1 + %27 = load i8, i8* %shift, align 1 + %28 = call i8 @llvm.fshr.i8(i8 %25, i8 %26, i8 %27) + store i8 %28, i8* %taddr3, align 1 + %29 = insertvalue %variant undef, i8* %taddr3, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + %31 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots2, i64 0, i64 1 + store %variant %30, %variant* %31, align 16 + %32 = load i8, i8* %z, align 1 + store i8 %32, i8* %i4, align 1 + store i8 1, i8* %shift5, align 1 + %33 = load i8, i8* %i4, align 1 + %34 = load i8, i8* %i4, align 1 + %35 = load i8, i8* %shift5, align 1 + %36 = call i8 @llvm.fshl.i8(i8 %33, i8 %34, i8 %35) + store i8 %36, i8* %taddr6, align 1 + %37 = insertvalue %variant undef, i8* %taddr6, 0 + %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$char" to i64), 1 + %39 = getelementptr inbounds [3 x %variant], [3 x %variant]* %varargslots2, i64 0, i64 2 + store %variant %38, %variant* %39, align 16 + %40 = bitcast [3 x %variant]* %varargslots2 to %variant* + %41 = insertvalue %"variant[]" undef, %variant* %40, 0 + %42 = insertvalue %"variant[]" %41, i64 3, 1 + store %"variant[]" %42, %"variant[]"* %taddr7, align 8 + %43 = bitcast %"variant[]"* %taddr7 to { i8*, i64 }* + %44 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 0 + %lo8 = load i8*, i8** %44, align 8 + %45 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %43, i32 0, i32 1 + %hi9 = load i64, i64* %45, align 8 + %46 = call i64 @std_io_printfn(i64* %retparam1, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), i64 8, i8* %lo8, i64 %hi9) + %not_err10 = icmp eq i64 %46, 0 + br i1 %not_err10, label %after_check11, label %voiderr12 + +after_check11: ; preds = %voiderr + br label %voiderr12 + +voiderr12: ; preds = %after_check11, %voiderr + ret void +} diff --git a/test/test_suite2/literals/literal_general.c3t b/test/test_suite14/literals/literal_general.c3t similarity index 100% rename from test/test_suite2/literals/literal_general.c3t rename to test/test_suite14/literals/literal_general.c3t diff --git a/test/test_suite2/literals/multi_unicode.c3 b/test/test_suite14/literals/multi_unicode.c3 similarity index 100% rename from test/test_suite2/literals/multi_unicode.c3 rename to test/test_suite14/literals/multi_unicode.c3 diff --git a/test/test_suite2/literals/radix_numbers_errors.c3 b/test/test_suite14/literals/radix_numbers_errors.c3 similarity index 100% rename from test/test_suite2/literals/radix_numbers_errors.c3 rename to test/test_suite14/literals/radix_numbers_errors.c3 diff --git a/test/test_suite2/literals/too_small.c3 b/test/test_suite14/literals/too_small.c3 similarity index 100% rename from test/test_suite2/literals/too_small.c3 rename to test/test_suite14/literals/too_small.c3 diff --git a/test/test_suite2/macro_methods/access.c3 b/test/test_suite14/macro_methods/access.c3 similarity index 100% rename from test/test_suite2/macro_methods/access.c3 rename to test/test_suite14/macro_methods/access.c3 diff --git a/test/test_suite14/macro_methods/macro_method_different_args.c3t b/test/test_suite14/macro_methods/macro_method_different_args.c3t new file mode 100644 index 000000000..89e030d88 --- /dev/null +++ b/test/test_suite14/macro_methods/macro_method_different_args.c3t @@ -0,0 +1,65 @@ +// #target: macos-x64 +module foo; + +extern fn void printf(char* fmt, ...); +struct Foo +{ + int x; +} + +macro void Foo.@hello(Foo &this) { this.x = 3; printf("-%d\n", this.x); } +macro void Foo.hello(Foo* this) { this.x = 4; printf("-%d\n", this.x); } +macro void Foo.hello2(Foo this) { this.x = 5; printf("-%d\n", this.x); } + +fn void main() +{ + Foo a; + a.@hello(); + printf("%d\n", a.x); + a.hello(); + printf("%d\n", a.x); + a.hello2(); + printf("%d\n", a.x); +} + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %a = alloca %Foo, align 4 + %this = alloca %Foo*, align 8 + %this1 = alloca %Foo, align 4 + %0 = bitcast %Foo* %a to i32* + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 + store i32 3, i32* %1, align 4 + %2 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 + %3 = load i32, i32* %2, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i32 %3) + %4 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 + %5 = load i32, i32* %4, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %5) + store %Foo* %a, %Foo** %this, align 8 + %6 = load %Foo*, %Foo** %this, align 8 + %7 = getelementptr inbounds %Foo, %Foo* %6, i32 0, i32 0 + store i32 4, i32* %7, align 8 + %8 = load %Foo*, %Foo** %this, align 8 + %9 = getelementptr inbounds %Foo, %Foo* %8, i32 0, i32 0 + %10 = load i32, i32* %9, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i32 %10) + %11 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 + %12 = load i32, i32* %11, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0), i32 %12) + %13 = bitcast %Foo* %this1 to i8* + %14 = bitcast %Foo* %a to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %13, i8* align 4 %14, i32 4, i1 false) + %15 = getelementptr inbounds %Foo, %Foo* %this1, i32 0, i32 0 + store i32 5, i32* %15, align 4 + %16 = getelementptr inbounds %Foo, %Foo* %this1, i32 0, i32 0 + %17 = load i32, i32* %16, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0), i32 %17) + %18 = getelementptr inbounds %Foo, %Foo* %a, i32 0, i32 0 + %19 = load i32, i32* %18, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), i32 %19) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/macro_methods/macro_method_fails.c3 b/test/test_suite14/macro_methods/macro_method_fails.c3 similarity index 100% rename from test/test_suite2/macro_methods/macro_method_fails.c3 rename to test/test_suite14/macro_methods/macro_method_fails.c3 diff --git a/test/test_suite2/macro_methods/macro_method_first_param.c3 b/test/test_suite14/macro_methods/macro_method_first_param.c3 similarity index 100% rename from test/test_suite2/macro_methods/macro_method_first_param.c3 rename to test/test_suite14/macro_methods/macro_method_first_param.c3 diff --git a/test/test_suite2/macro_methods/macro_methods_defined_twice.c3 b/test/test_suite14/macro_methods/macro_methods_defined_twice.c3 similarity index 100% rename from test/test_suite2/macro_methods/macro_methods_defined_twice.c3 rename to test/test_suite14/macro_methods/macro_methods_defined_twice.c3 diff --git a/test/test_suite2/macros/hash_ident.c3 b/test/test_suite14/macros/hash_ident.c3 similarity index 100% rename from test/test_suite2/macros/hash_ident.c3 rename to test/test_suite14/macros/hash_ident.c3 diff --git a/test/test_suite2/macros/macro_body_as_value.c3 b/test/test_suite14/macros/macro_body_as_value.c3 similarity index 100% rename from test/test_suite2/macros/macro_body_as_value.c3 rename to test/test_suite14/macros/macro_body_as_value.c3 diff --git a/test/test_suite2/macros/macro_body_defer.c3t b/test/test_suite14/macros/macro_body_defer.c3t similarity index 50% rename from test/test_suite2/macros/macro_body_defer.c3t rename to test/test_suite14/macros/macro_body_defer.c3t index ed32f42fc..0671f184c 100644 --- a/test/test_suite2/macros/macro_body_defer.c3t +++ b/test/test_suite14/macros/macro_body_defer.c3t @@ -49,10 +49,10 @@ fn void! main() /* #expect: foo.ll -define i64 @foo_foo(ptr %0) #0 { +define i64 @foo_foo(i32* %0) #0 { entry: %reterr = alloca i64, align 8 - store i32 1, ptr %0, align 4 + store i32 1, i32* %0, align 4 ret i64 0 } @@ -63,46 +63,46 @@ entry: %i3 = alloca i32, align 4 %reterr = alloca i64, align 8 %reterr5 = alloca i64, align 8 - call void (ptr, ...) @printf(ptr @.str) - call void (ptr, ...) @printf(ptr @.str.1) - call void (ptr, ...) @printf(ptr @.str.2) - store i32 34, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.3) - %0 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.4, i32 %0) - %1 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.5, i32 %1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0)) + store i32 34, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0)) + %0 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i32 %0) + %1 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i32 0, i32 0), i32 %1) br label %loop.body loop.body: ; preds = %entry - store i32 3, ptr %i1, align 4 - call void (ptr, ...) @printf(ptr @.str.6) - call void (ptr, ...) @printf(ptr @.str.7) - %2 = load i32, ptr %i1, align 4 - call void (ptr, ...) @printf(ptr @.str.8, i32 %2) - call void (ptr, ...) @printf(ptr @.str.9) + store i32 3, i32* %i1, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.7, i32 0, i32 0)) + %2 = load i32, i32* %i1, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.8, i32 0, i32 0), i32 %2) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.9, i32 0, i32 0)) br label %loop.exit loop.exit: ; preds = %loop.body br label %loop.body2 loop.body2: ; preds = %loop.exit - call void (ptr, ...) @printf(ptr @.str.10) - store i32 3, ptr %i3, align 4 - call void (ptr, ...) @printf(ptr @.str.11) - call void (ptr, ...) @printf(ptr @.str.12) - %3 = load i32, ptr %i3, align 4 - call void (ptr, ...) @printf(ptr @.str.13, i32 %3) - call void (ptr, ...) @printf(ptr @.str.14) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.10, i32 0, i32 0)) + store i32 3, i32* %i3, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.11, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.12, i32 0, i32 0)) + %3 = load i32, i32* %i3, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.13, i32 0, i32 0), i32 %3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i32 0, i32 0)) ret i64 0 loop.exit4: ; No predecessors! - call void (ptr, ...) @printf(ptr @.str.15) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.15, i32 0, i32 0)) ret i64 0 } ; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { +define i32 @main(i32 %0, i8** %1) #0 { entry: %2 = call i64 @foo_main() %not_err = icmp eq i64 %2, 0 diff --git a/test/test_suite2/macros/macro_body_errors.c3 b/test/test_suite14/macros/macro_body_errors.c3 similarity index 100% rename from test/test_suite2/macros/macro_body_errors.c3 rename to test/test_suite14/macros/macro_body_errors.c3 diff --git a/test/test_suite2/macros/macro_calls_prefix.c3 b/test/test_suite14/macros/macro_calls_prefix.c3 similarity index 100% rename from test/test_suite2/macros/macro_calls_prefix.c3 rename to test/test_suite14/macros/macro_calls_prefix.c3 diff --git a/test/test_suite2/macros/macro_common.c3t b/test/test_suite14/macros/macro_common.c3t similarity index 74% rename from test/test_suite2/macros/macro_common.c3t rename to test/test_suite14/macros/macro_common.c3t index e3cbf3ff6..1d477bde1 100644 --- a/test/test_suite2/macros/macro_common.c3t +++ b/test/test_suite14/macros/macro_common.c3t @@ -20,31 +20,31 @@ entry: %blockret = alloca double, align 8 %x1 = alloca i32, align 4 %blockret2 = alloca double, align 8 - store i32 1, ptr %x, align 4 - %0 = load i32, ptr %x, align 4 + store i32 1, i32* %x, align 4 + %0 = load i32, i32* %x, align 4 %not = icmp eq i32 %0, 0 br i1 %not, label %if.then, label %if.exit if.then: ; preds = %entry - store double 0.000000e+00, ptr %blockret, align 8 + store double 0.000000e+00, double* %blockret, align 8 br label %expr_block.exit if.exit: ; preds = %entry - store double 0.000000e+00, ptr %blockret, align 8 + store double 0.000000e+00, double* %blockret, align 8 br label %expr_block.exit expr_block.exit: ; preds = %if.exit, %if.then - store i32 0, ptr %x1, align 4 - %1 = load i32, ptr %x1, align 4 + store i32 0, i32* %x1, align 4 + %1 = load i32, i32* %x1, align 4 %not3 = icmp eq i32 %1, 0 br i1 %not3, label %if.then4, label %if.exit5 if.then4: ; preds = %expr_block.exit - store double 0.000000e+00, ptr %blockret2, align 8 + store double 0.000000e+00, double* %blockret2, align 8 br label %expr_block.exit6 if.exit5: ; preds = %expr_block.exit - store double 0.000000e+00, ptr %blockret2, align 8 + store double 0.000000e+00, double* %blockret2, align 8 br label %expr_block.exit6 expr_block.exit6: ; preds = %if.exit5, %if.then4 diff --git a/test/test_suite2/macros/macro_convert_literal.c3 b/test/test_suite14/macros/macro_convert_literal.c3 similarity index 100% rename from test/test_suite2/macros/macro_convert_literal.c3 rename to test/test_suite14/macros/macro_convert_literal.c3 diff --git a/test/test_suite14/macros/macro_defer_exit.c3t b/test/test_suite14/macros/macro_defer_exit.c3t new file mode 100644 index 000000000..27506384a --- /dev/null +++ b/test/test_suite14/macros/macro_defer_exit.c3t @@ -0,0 +1,83 @@ +// #target: macos-x64 +module foo; +extern fn void printf(char*,...); + +macro int abc(x) +{ + defer printf("Out x %d\n", x); + x *= 2; + if (x > 100) return x = x - 100; + printf("Normal end\n"); + return x; +} + +fn void main() +{ + defer printf("On exit\n"); + abc(123); + abc(3); +} + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %x = alloca i32, align 4 + %blockret = alloca i32, align 4 + %x1 = alloca i32, align 4 + %blockret2 = alloca i32, align 4 + store i32 123, i32* %x, align 4 + %0 = load i32, i32* %x, align 4 + %mul = mul i32 %0, 2 + store i32 %mul, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 + %gt = icmp sgt i32 %1, 100 + br i1 %gt, label %if.then, label %if.exit + +if.then: ; preds = %entry + %2 = load i32, i32* %x, align 4 + %sub = sub i32 %2, 100 + store i32 %sub, i32* %x, align 4 + %3 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i32 %3) + store i32 %sub, i32* %blockret, align 4 + br label %expr_block.exit + +if.exit: ; preds = %entry + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i32 0, i32 0)) + %4 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %4) + %5 = load i32, i32* %x, align 4 + store i32 %5, i32* %blockret, align 4 + br label %expr_block.exit + +expr_block.exit: ; preds = %if.exit, %if.then + store i32 3, i32* %x1, align 4 + %6 = load i32, i32* %x1, align 4 + %mul3 = mul i32 %6, 2 + store i32 %mul3, i32* %x1, align 4 + %7 = load i32, i32* %x1, align 4 + %gt4 = icmp sgt i32 %7, 100 + br i1 %gt4, label %if.then5, label %if.exit7 + +if.then5: ; preds = %expr_block.exit + %8 = load i32, i32* %x1, align 4 + %sub6 = sub i32 %8, 100 + store i32 %sub6, i32* %x1, align 4 + %9 = load i32, i32* %x1, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i32 %9) + store i32 %sub6, i32* %blockret2, align 4 + br label %expr_block.exit8 + +if.exit7: ; preds = %expr_block.exit + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i32 0, i32 0)) + %10 = load i32, i32* %x1, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 %10) + %11 = load i32, i32* %x1, align 4 + store i32 %11, i32* %blockret2, align 4 + br label %expr_block.exit8 + +expr_block.exit8: ; preds = %if.exit7, %if.then5 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.6, i32 0, i32 0)) + ret void +} diff --git a/test/test_suite2/macros/macro_defer_scope.c3t b/test/test_suite14/macros/macro_defer_scope.c3t similarity index 53% rename from test/test_suite2/macros/macro_defer_scope.c3t rename to test/test_suite14/macros/macro_defer_scope.c3t index 3e8b4804a..9fa2788a2 100644 --- a/test/test_suite2/macros/macro_defer_scope.c3t +++ b/test/test_suite14/macros/macro_defer_scope.c3t @@ -23,21 +23,21 @@ entry: %x = alloca i32, align 4 %blockret = alloca i32, align 4 %x1 = alloca i32, align 4 - store i32 0, ptr %x, align 4 - store i32 0, ptr %x1, align 4 - %0 = load i32, ptr %x, align 4 + store i32 0, i32* %x, align 4 + store i32 0, i32* %x1, align 4 + %0 = load i32, i32* %x, align 4 %add = add i32 %0, 1 - store i32 %add, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %add, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 %add2 = add i32 %1, 1 - store i32 %add2, ptr %x, align 4 + store i32 %add2, i32* %x, align 4 %add3 = add i32 %add, %add2 - %2 = call i32 (ptr, ...) @printf(ptr @.str) - store i32 %add3, ptr %blockret, align 4 + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0)) + store i32 %add3, i32* %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %entry - %3 = load i32, ptr %x, align 4 - %4 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %3) + %3 = load i32, i32* %x, align 4 + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %3) ret void } diff --git a/test/test_suite14/macros/macro_defer_with_body.c3t b/test/test_suite14/macros/macro_defer_with_body.c3t new file mode 100644 index 000000000..bf7698fc3 --- /dev/null +++ b/test/test_suite14/macros/macro_defer_with_body.c3t @@ -0,0 +1,55 @@ +module foo; +macro int @cofefe(a; @body(x)) +{ + @body(a); + @body(a); + return 1; +} + +extern fn int printf(char *, ...); + +fn void main() +{ + int x = 0; + @cofefe(1; int y) + { + defer printf("defer: %d\n", x++); + printf("%d\n", x++); + }; + printf("Done!\n"); +} + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %x = alloca i32, align 4 + %a = alloca i32, align 4 + %y = alloca i32, align 4 + store i32 0, i32* %x, align 4 + store i32 1, i32* %a, align 4 + %0 = load i32, i32* %a, align 4 + store i32 %0, i32* %y, align 4 + %1 = load i32, i32* %x, align 4 + %add = add i32 %1, 1 + store i32 %add, i32* %x, align 4 + %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) + %3 = load i32, i32* %x, align 4 + %add1 = add i32 %3, 1 + store i32 %add1, i32* %x, align 4 + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %3) + %5 = load i32, i32* %a, align 4 + store i32 %5, i32* %y, align 4 + %6 = load i32, i32* %x, align 4 + %add2 = add i32 %6, 1 + store i32 %add2, i32* %x, align 4 + %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i32 0, i32 0), i32 %6) + %8 = load i32, i32* %x, align 4 + %add3 = add i32 %8, 1 + store i32 %add3, i32* %x, align 4 + %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.3, i32 0, i32 0), i32 %8) + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0)) + ret void +} + + diff --git a/test/test_suite2/macros/macro_failable_return_rethrow.c3t b/test/test_suite14/macros/macro_failable_return_rethrow.c3t similarity index 85% rename from test/test_suite2/macros/macro_failable_return_rethrow.c3t rename to test/test_suite14/macros/macro_failable_return_rethrow.c3t index 8d1f7f67e..0366af5d7 100644 --- a/test/test_suite2/macros/macro_failable_return_rethrow.c3t +++ b/test/test_suite14/macros/macro_failable_return_rethrow.c3t @@ -22,12 +22,12 @@ entry: %blockret = alloca i32, align 4 %error_var1 = alloca i64, align 8 %retparam = alloca i32, align 4 - %0 = call i64 @test_xy(ptr %retparam) + %0 = call i64 @test_xy(i32* %retparam) %not_err = icmp eq i64 %0, 0 br i1 %not_err, label %after_check, label %assign_optional assign_optional: ; preds = %entry - store i64 %0, ptr %error_var1, align 8 + store i64 %0, i64* %error_var1, align 8 br label %guard_block after_check: ; preds = %entry @@ -37,11 +37,11 @@ guard_block: ; preds = %assign_optional ret void noerr_block: ; preds = %after_check - store i32 1, ptr %blockret, align 4 + store i32 1, i32* %blockret, align 4 br label %expr_block.exit expr_block.exit: ; preds = %noerr_block - %1 = load i32, ptr %blockret, align 4 + %1 = load i32, i32* %blockret, align 4 br label %noerr_block2 noerr_block2: ; preds = %expr_block.exit diff --git a/test/test_suite2/macros/macro_import_res_private.c3t b/test/test_suite14/macros/macro_import_res_private.c3t similarity index 100% rename from test/test_suite2/macros/macro_import_res_private.c3t rename to test/test_suite14/macros/macro_import_res_private.c3t diff --git a/test/test_suite2/macros/macro_import_resolution.c3 b/test/test_suite14/macros/macro_import_resolution.c3 similarity index 100% rename from test/test_suite2/macros/macro_import_resolution.c3 rename to test/test_suite14/macros/macro_import_resolution.c3 diff --git a/test/test_suite/macros/macro_missing_return.c3 b/test/test_suite14/macros/macro_missing_return.c3 similarity index 100% rename from test/test_suite/macros/macro_missing_return.c3 rename to test/test_suite14/macros/macro_missing_return.c3 diff --git a/test/test_suite2/macros/macro_nested_labels.c3t b/test/test_suite14/macros/macro_nested_labels.c3t similarity index 61% rename from test/test_suite2/macros/macro_nested_labels.c3t rename to test/test_suite14/macros/macro_nested_labels.c3t index 42133c4e7..40f919364 100644 --- a/test/test_suite2/macros/macro_nested_labels.c3t +++ b/test/test_suite14/macros/macro_nested_labels.c3t @@ -47,196 +47,196 @@ entry: %i72 = alloca i32, align 4 %i83 = alloca i32, align 4 %i94 = alloca i32, align 4 - store i32 7, ptr %ab, align 4 - %0 = load i32, ptr %ab, align 4 - store i32 %0, ptr %x, align 4 - store i32 0, ptr %i, align 4 + store i32 7, i32* %ab, align 4 + %0 = load i32, i32* %ab, align 4 + store i32 %0, i32* %x, align 4 + store i32 0, i32* %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.body, %entry - %1 = load i32, ptr %i, align 4 + %1 = load i32, i32* %i, align 4 %lt = icmp slt i32 %1, 0 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - call void (ptr, ...) @printf(ptr @.str) - %2 = load i32, ptr %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) + %2 = load i32, i32* %i, align 4 %add = add i32 %2, 1 - store i32 %add, ptr %i, align 4 + store i32 %add, i32* %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - call void (ptr, ...) @printf(ptr @.str.1, i32 3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 3) br label %loop.cond1 loop.cond1: ; preds = %if.exit92, %loop.exit - %3 = load i32, ptr %x, align 4 + %3 = load i32, i32* %x, align 4 %sub = sub i32 %3, 1 - store i32 %sub, ptr %x, align 4 + store i32 %sub, i32* %x, align 4 %gt = icmp sgt i32 %3, 0 br i1 %gt, label %loop.body2, label %loop.exit93 loop.body2: ; preds = %loop.cond1 - store i32 0, ptr %i3, align 4 + store i32 0, i32* %i3, align 4 br label %loop.cond4 loop.cond4: ; preds = %loop.body6, %loop.body2 - %4 = load i32, ptr %i3, align 4 + %4 = load i32, i32* %i3, align 4 %lt5 = icmp slt i32 %4, 0 br i1 %lt5, label %loop.body6, label %loop.exit8 loop.body6: ; preds = %loop.cond4 - call void (ptr, ...) @printf(ptr @.str.2) - %5 = load i32, ptr %i3, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i32 0, i32 0)) + %5 = load i32, i32* %i3, align 4 %add7 = add i32 %5, 1 - store i32 %add7, ptr %i3, align 4 + store i32 %add7, i32* %i3, align 4 br label %loop.cond4 loop.exit8: ; preds = %loop.cond4 - %6 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %6) - %7 = load i32, ptr %x, align 4 - store i32 %7, ptr %x9, align 4 - store i32 0, ptr %i10, align 4 + %6 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %6) + %7 = load i32, i32* %x, align 4 + store i32 %7, i32* %x9, align 4 + store i32 0, i32* %i10, align 4 br label %loop.cond11 loop.cond11: ; preds = %loop.body13, %loop.exit8 - %8 = load i32, ptr %i10, align 4 + %8 = load i32, i32* %i10, align 4 %lt12 = icmp slt i32 %8, 1 br i1 %lt12, label %loop.body13, label %loop.exit15 loop.body13: ; preds = %loop.cond11 - call void (ptr, ...) @printf(ptr @.str.4) - %9 = load i32, ptr %i10, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.4, i32 0, i32 0)) + %9 = load i32, i32* %i10, align 4 %add14 = add i32 %9, 1 - store i32 %add14, ptr %i10, align 4 + store i32 %add14, i32* %i10, align 4 br label %loop.cond11 loop.exit15: ; preds = %loop.cond11 - call void (ptr, ...) @printf(ptr @.str.5, i32 2) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 2) br label %loop.cond16 loop.cond16: ; preds = %if.exit81, %loop.exit15 - %10 = load i32, ptr %x9, align 4 + %10 = load i32, i32* %x9, align 4 %sub17 = sub i32 %10, 1 - store i32 %sub17, ptr %x9, align 4 + store i32 %sub17, i32* %x9, align 4 %gt18 = icmp sgt i32 %10, 0 br i1 %gt18, label %loop.body19, label %loop.exit82 loop.body19: ; preds = %loop.cond16 - store i32 0, ptr %i20, align 4 + store i32 0, i32* %i20, align 4 br label %loop.cond21 loop.cond21: ; preds = %loop.body23, %loop.body19 - %11 = load i32, ptr %i20, align 4 + %11 = load i32, i32* %i20, align 4 %lt22 = icmp slt i32 %11, 1 br i1 %lt22, label %loop.body23, label %loop.exit25 loop.body23: ; preds = %loop.cond21 - call void (ptr, ...) @printf(ptr @.str.6) - %12 = load i32, ptr %i20, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) + %12 = load i32, i32* %i20, align 4 %add24 = add i32 %12, 1 - store i32 %add24, ptr %i20, align 4 + store i32 %add24, i32* %i20, align 4 br label %loop.cond21 loop.exit25: ; preds = %loop.cond21 - %13 = load i32, ptr %x9, align 4 - call void (ptr, ...) @printf(ptr @.str.7, i32 %13) - %14 = load i32, ptr %x9, align 4 - store i32 %14, ptr %x26, align 4 - store i32 0, ptr %i27, align 4 + %13 = load i32, i32* %x9, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.7, i32 0, i32 0), i32 %13) + %14 = load i32, i32* %x9, align 4 + store i32 %14, i32* %x26, align 4 + store i32 0, i32* %i27, align 4 br label %loop.cond28 loop.cond28: ; preds = %loop.body30, %loop.exit25 - %15 = load i32, ptr %i27, align 4 + %15 = load i32, i32* %i27, align 4 %lt29 = icmp slt i32 %15, 2 br i1 %lt29, label %loop.body30, label %loop.exit32 loop.body30: ; preds = %loop.cond28 - call void (ptr, ...) @printf(ptr @.str.8) - %16 = load i32, ptr %i27, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.8, i32 0, i32 0)) + %16 = load i32, i32* %i27, align 4 %add31 = add i32 %16, 1 - store i32 %add31, ptr %i27, align 4 + store i32 %add31, i32* %i27, align 4 br label %loop.cond28 loop.exit32: ; preds = %loop.cond28 - call void (ptr, ...) @printf(ptr @.str.9, i32 1) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), i32 1) br label %loop.cond33 loop.cond33: ; preds = %if.exit70, %loop.exit32 - %17 = load i32, ptr %x26, align 4 + %17 = load i32, i32* %x26, align 4 %sub34 = sub i32 %17, 1 - store i32 %sub34, ptr %x26, align 4 + store i32 %sub34, i32* %x26, align 4 %gt35 = icmp sgt i32 %17, 0 br i1 %gt35, label %loop.body36, label %loop.exit71 loop.body36: ; preds = %loop.cond33 - store i32 0, ptr %i37, align 4 + store i32 0, i32* %i37, align 4 br label %loop.cond38 loop.cond38: ; preds = %loop.body40, %loop.body36 - %18 = load i32, ptr %i37, align 4 + %18 = load i32, i32* %i37, align 4 %lt39 = icmp slt i32 %18, 2 br i1 %lt39, label %loop.body40, label %loop.exit42 loop.body40: ; preds = %loop.cond38 - call void (ptr, ...) @printf(ptr @.str.10) - %19 = load i32, ptr %i37, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.10, i32 0, i32 0)) + %19 = load i32, i32* %i37, align 4 %add41 = add i32 %19, 1 - store i32 %add41, ptr %i37, align 4 + store i32 %add41, i32* %i37, align 4 br label %loop.cond38 loop.exit42: ; preds = %loop.cond38 - %20 = load i32, ptr %x26, align 4 - call void (ptr, ...) @printf(ptr @.str.11, i32 %20) - %21 = load i32, ptr %x26, align 4 - store i32 %21, ptr %x43, align 4 - store i32 0, ptr %i44, align 4 + %20 = load i32, i32* %x26, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.11, i32 0, i32 0), i32 %20) + %21 = load i32, i32* %x26, align 4 + store i32 %21, i32* %x43, align 4 + store i32 0, i32* %i44, align 4 br label %loop.cond45 loop.cond45: ; preds = %loop.body47, %loop.exit42 - %22 = load i32, ptr %i44, align 4 + %22 = load i32, i32* %i44, align 4 %lt46 = icmp slt i32 %22, 3 br i1 %lt46, label %loop.body47, label %loop.exit49 loop.body47: ; preds = %loop.cond45 - call void (ptr, ...) @printf(ptr @.str.12) - %23 = load i32, ptr %i44, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.12, i32 0, i32 0)) + %23 = load i32, i32* %i44, align 4 %add48 = add i32 %23, 1 - store i32 %add48, ptr %i44, align 4 + store i32 %add48, i32* %i44, align 4 br label %loop.cond45 loop.exit49: ; preds = %loop.cond45 - call void (ptr, ...) @printf(ptr @.str.13, i32 0) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i32 0, i32 0), i32 0) br label %loop.cond50 loop.cond50: ; preds = %if.exit, %loop.exit49 - %24 = load i32, ptr %x43, align 4 + %24 = load i32, i32* %x43, align 4 %sub51 = sub i32 %24, 1 - store i32 %sub51, ptr %x43, align 4 + store i32 %sub51, i32* %x43, align 4 %gt52 = icmp sgt i32 %24, 0 br i1 %gt52, label %loop.body53, label %loop.exit60 loop.body53: ; preds = %loop.cond50 - store i32 0, ptr %i54, align 4 + store i32 0, i32* %i54, align 4 br label %loop.cond55 loop.cond55: ; preds = %loop.body57, %loop.body53 - %25 = load i32, ptr %i54, align 4 + %25 = load i32, i32* %i54, align 4 %lt56 = icmp slt i32 %25, 3 br i1 %lt56, label %loop.body57, label %loop.exit59 loop.body57: ; preds = %loop.cond55 - call void (ptr, ...) @printf(ptr @.str.14) - %26 = load i32, ptr %i54, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i32 0, i32 0)) + %26 = load i32, i32* %i54, align 4 %add58 = add i32 %26, 1 - store i32 %add58, ptr %i54, align 4 + store i32 %add58, i32* %i54, align 4 br label %loop.cond55 loop.exit59: ; preds = %loop.cond55 - %27 = load i32, ptr %x43, align 4 - call void (ptr, ...) @printf(ptr @.str.15, i32 %27) - %28 = load i32, ptr %x43, align 4 + %27 = load i32, i32* %x43, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i32 0, i32 0), i32 %27) + %28 = load i32, i32* %x43, align 4 %smod = srem i32 %28, 2 %eq = icmp eq i32 %smod, 0 br i1 %eq, label %if.then, label %if.exit @@ -248,24 +248,24 @@ if.exit: ; preds = %loop.exit59 br label %loop.cond50 loop.exit60: ; preds = %if.then, %loop.cond50 - store i32 0, ptr %i61, align 4 + store i32 0, i32* %i61, align 4 br label %loop.cond62 loop.cond62: ; preds = %loop.body64, %loop.exit60 - %29 = load i32, ptr %i61, align 4 + %29 = load i32, i32* %i61, align 4 %lt63 = icmp slt i32 %29, 3 br i1 %lt63, label %loop.body64, label %loop.exit66 loop.body64: ; preds = %loop.cond62 - call void (ptr, ...) @printf(ptr @.str.16) - %30 = load i32, ptr %i61, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.16, i32 0, i32 0)) + %30 = load i32, i32* %i61, align 4 %add65 = add i32 %30, 1 - store i32 %add65, ptr %i61, align 4 + store i32 %add65, i32* %i61, align 4 br label %loop.cond62 loop.exit66: ; preds = %loop.cond62 - call void (ptr, ...) @printf(ptr @.str.17, i32 0) - %31 = load i32, ptr %x26, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.17, i32 0, i32 0), i32 0) + %31 = load i32, i32* %x26, align 4 %smod67 = srem i32 %31, 2 %eq68 = icmp eq i32 %smod67, 0 br i1 %eq68, label %if.then69, label %if.exit70 @@ -277,24 +277,24 @@ if.exit70: ; preds = %loop.exit66 br label %loop.cond33 loop.exit71: ; preds = %if.then69, %loop.cond33 - store i32 0, ptr %i72, align 4 + store i32 0, i32* %i72, align 4 br label %loop.cond73 loop.cond73: ; preds = %loop.body75, %loop.exit71 - %32 = load i32, ptr %i72, align 4 + %32 = load i32, i32* %i72, align 4 %lt74 = icmp slt i32 %32, 2 br i1 %lt74, label %loop.body75, label %loop.exit77 loop.body75: ; preds = %loop.cond73 - call void (ptr, ...) @printf(ptr @.str.18) - %33 = load i32, ptr %i72, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %33 = load i32, i32* %i72, align 4 %add76 = add i32 %33, 1 - store i32 %add76, ptr %i72, align 4 + store i32 %add76, i32* %i72, align 4 br label %loop.cond73 loop.exit77: ; preds = %loop.cond73 - call void (ptr, ...) @printf(ptr @.str.19, i32 1) - %34 = load i32, ptr %x9, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.19, i32 0, i32 0), i32 1) + %34 = load i32, i32* %x9, align 4 %smod78 = srem i32 %34, 2 %eq79 = icmp eq i32 %smod78, 0 br i1 %eq79, label %if.then80, label %if.exit81 @@ -306,24 +306,24 @@ if.exit81: ; preds = %loop.exit77 br label %loop.cond16 loop.exit82: ; preds = %if.then80, %loop.cond16 - store i32 0, ptr %i83, align 4 + store i32 0, i32* %i83, align 4 br label %loop.cond84 loop.cond84: ; preds = %loop.body86, %loop.exit82 - %35 = load i32, ptr %i83, align 4 + %35 = load i32, i32* %i83, align 4 %lt85 = icmp slt i32 %35, 1 br i1 %lt85, label %loop.body86, label %loop.exit88 loop.body86: ; preds = %loop.cond84 - call void (ptr, ...) @printf(ptr @.str.20) - %36 = load i32, ptr %i83, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.20, i32 0, i32 0)) + %36 = load i32, i32* %i83, align 4 %add87 = add i32 %36, 1 - store i32 %add87, ptr %i83, align 4 + store i32 %add87, i32* %i83, align 4 br label %loop.cond84 loop.exit88: ; preds = %loop.cond84 - call void (ptr, ...) @printf(ptr @.str.21, i32 2) - %37 = load i32, ptr %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.21, i32 0, i32 0), i32 2) + %37 = load i32, i32* %x, align 4 %smod89 = srem i32 %37, 2 %eq90 = icmp eq i32 %smod89, 0 br i1 %eq90, label %if.then91, label %if.exit92 @@ -335,22 +335,22 @@ if.exit92: ; preds = %loop.exit88 br label %loop.cond1 loop.exit93: ; preds = %if.then91, %loop.cond1 - store i32 0, ptr %i94, align 4 + store i32 0, i32* %i94, align 4 br label %loop.cond95 loop.cond95: ; preds = %loop.body97, %loop.exit93 - %38 = load i32, ptr %i94, align 4 + %38 = load i32, i32* %i94, align 4 %lt96 = icmp slt i32 %38, 0 br i1 %lt96, label %loop.body97, label %loop.exit99 loop.body97: ; preds = %loop.cond95 - call void (ptr, ...) @printf(ptr @.str.22) - %39 = load i32, ptr %i94, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.22, i32 0, i32 0)) + %39 = load i32, i32* %i94, align 4 %add98 = add i32 %39, 1 - store i32 %add98, ptr %i94, align 4 + store i32 %add98, i32* %i94, align 4 br label %loop.cond95 loop.exit99: ; preds = %loop.cond95 - call void (ptr, ...) @printf(ptr @.str.23, i32 3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.23, i32 0, i32 0), i32 3) ret void } diff --git a/test/test_suite2/macros/macro_resolution.c3 b/test/test_suite14/macros/macro_resolution.c3 similarity index 100% rename from test/test_suite2/macros/macro_resolution.c3 rename to test/test_suite14/macros/macro_resolution.c3 diff --git a/test/test_suite2/macros/macro_rtype.c3 b/test/test_suite14/macros/macro_rtype.c3 similarity index 100% rename from test/test_suite2/macros/macro_rtype.c3 rename to test/test_suite14/macros/macro_rtype.c3 diff --git a/test/test_suite14/macros/macro_typed_varargs.c3t b/test/test_suite14/macros/macro_typed_varargs.c3t new file mode 100644 index 000000000..f0d058148 --- /dev/null +++ b/test/test_suite14/macros/macro_typed_varargs.c3t @@ -0,0 +1,194 @@ +// #target: macos-x64 + +module test; + +import std::io; + +macro foo(int... x) +{ + foreach (i : x) + { + io::printfn("%d", i); + } +} + +macro foo2(x...) +{ + foreach (i : x) + { + io::printfn("%d", *(int*)i); + } +} + +fn void main() +{ + foo(1, -1, 3141, 999 + 1); + foo2(1, -1, 3141, 999 + 1); +} + +/* #expect: test.ll + + +define void @test_main() #0 { +entry: + %x = alloca %"int[]", align 8 + %literal = alloca [4 x i32], align 16 + %.anon = alloca i64, align 8 + %.anon1 = alloca i64, align 8 + %i = alloca i32, align 4 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %x2 = alloca %"variant[]", align 8 + %literal3 = alloca [4 x %variant], align 16 + %taddr4 = alloca i32, align 4 + %taddr5 = alloca i32, align 4 + %taddr6 = alloca i32, align 4 + %taddr7 = alloca i32, align 4 + %.anon8 = alloca i64, align 8 + %.anon9 = alloca i64, align 8 + %i13 = alloca %variant, align 8 + %retparam15 = alloca i64, align 8 + %varargslots16 = alloca [1 x %variant], align 16 + %taddr17 = alloca %"variant[]", align 8 + %0 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 0 + store i32 1, i32* %0, align 4 + %1 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 1 + store i32 -1, i32* %1, align 4 + %2 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 2 + store i32 3141, i32* %2, align 4 + %3 = getelementptr inbounds [4 x i32], [4 x i32]* %literal, i64 0, i64 3 + store i32 1000, i32* %3, align 4 + %4 = bitcast [4 x i32]* %literal to i32* + %5 = insertvalue %"int[]" undef, i32* %4, 0 + %6 = insertvalue %"int[]" %5, i64 4, 1 + store %"int[]" %6, %"int[]"* %x, align 8 + %7 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 + %8 = load i64, i64* %7, align 8 + store i64 %8, i64* %.anon, align 8 + store i64 0, i64* %.anon1, align 8 + br label %loop.cond + +loop.cond: ; preds = %voiderr, %entry + %9 = load i64, i64* %.anon1, align 8 + %10 = load i64, i64* %.anon, align 8 + %lt = icmp ult i64 %9, %10 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %11 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 + %12 = load i32*, i32** %11, align 8 + %13 = load i64, i64* %.anon1, align 8 + %ptroffset = getelementptr inbounds i32, i32* %12, i64 %13 + %14 = load i32, i32* %ptroffset, align 4 + store i32 %14, i32* %i, align 4 + %15 = bitcast i32* %i to i8* + %16 = insertvalue %variant undef, i8* %15, 0 + %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %18 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %17, %variant* %18, align 16 + %19 = bitcast [1 x %variant]* %varargslots to %variant* + %20 = insertvalue %"variant[]" undef, %variant* %19, 0 + %21 = insertvalue %"variant[]" %20, i64 1, 1 + store %"variant[]" %21, %"variant[]"* %taddr, align 8 + %22 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 0 + %lo = load i8*, i8** %23, align 8 + %24 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 1 + %hi = load i64, i64* %24, align 8 + %25 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %25, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %loop.body + br label %voiderr + +voiderr: ; preds = %after_check, %loop.body + %26 = load i64, i64* %.anon1, align 8 + %add = add i64 %26, 1 + store i64 %add, i64* %.anon1, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %27 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 0 + store i32 1, i32* %taddr4, align 4 + %28 = bitcast i32* %taddr4 to i8* + %29 = insertvalue %variant undef, i8* %28, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %30, %variant* %27, align 8 + %31 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 1 + store i32 -1, i32* %taddr5, align 4 + %32 = bitcast i32* %taddr5 to i8* + %33 = insertvalue %variant undef, i8* %32, 0 + %34 = insertvalue %variant %33, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %34, %variant* %31, align 8 + %35 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 2 + store i32 3141, i32* %taddr6, align 4 + %36 = bitcast i32* %taddr6 to i8* + %37 = insertvalue %variant undef, i8* %36, 0 + %38 = insertvalue %variant %37, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %38, %variant* %35, align 8 + %39 = getelementptr inbounds [4 x %variant], [4 x %variant]* %literal3, i64 0, i64 3 + store i32 1000, i32* %taddr7, align 4 + %40 = bitcast i32* %taddr7 to i8* + %41 = insertvalue %variant undef, i8* %40, 0 + %42 = insertvalue %variant %41, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %42, %variant* %39, align 8 + %43 = bitcast [4 x %variant]* %literal3 to %variant* + %44 = insertvalue %"variant[]" undef, %variant* %43, 0 + %45 = insertvalue %"variant[]" %44, i64 4, 1 + store %"variant[]" %45, %"variant[]"* %x2, align 8 + %46 = getelementptr inbounds %"variant[]", %"variant[]"* %x2, i32 0, i32 1 + %47 = load i64, i64* %46, align 8 + store i64 %47, i64* %.anon8, align 8 + store i64 0, i64* %.anon9, align 8 + br label %loop.cond10 + +loop.cond10: ; preds = %voiderr22, %loop.exit + %48 = load i64, i64* %.anon9, align 8 + %49 = load i64, i64* %.anon8, align 8 + %lt11 = icmp ult i64 %48, %49 + br i1 %lt11, label %loop.body12, label %loop.exit24 + +loop.body12: ; preds = %loop.cond10 + %50 = getelementptr inbounds %"variant[]", %"variant[]"* %x2, i32 0, i32 0 + %51 = load %variant*, %variant** %50, align 8 + %52 = load i64, i64* %.anon9, align 8 + %ptroffset14 = getelementptr inbounds %variant, %variant* %51, i64 %52 + %53 = bitcast %variant* %i13 to i8* + %54 = bitcast %variant* %ptroffset14 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %53, i8* align 8 %54, i32 16, i1 false) + %55 = getelementptr inbounds %variant, %variant* %i13, i32 0, i32 0 + %56 = bitcast i8** %55 to i32** + %57 = load i32*, i32** %56, align 8 + %58 = bitcast i32* %57 to i8* + %59 = insertvalue %variant undef, i8* %58, 0 + %60 = insertvalue %variant %59, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %61 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots16, i64 0, i64 0 + store %variant %60, %variant* %61, align 16 + %62 = bitcast [1 x %variant]* %varargslots16 to %variant* + %63 = insertvalue %"variant[]" undef, %variant* %62, 0 + %64 = insertvalue %"variant[]" %63, i64 1, 1 + store %"variant[]" %64, %"variant[]"* %taddr17, align 8 + %65 = bitcast %"variant[]"* %taddr17 to { i8*, i64 }* + %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 + %lo18 = load i8*, i8** %66, align 8 + %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 + %hi19 = load i64, i64* %67, align 8 + %68 = call i64 @std_io_printfn(i64* %retparam15, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2, i8* %lo18, i64 %hi19) + %not_err20 = icmp eq i64 %68, 0 + br i1 %not_err20, label %after_check21, label %voiderr22 + +after_check21: ; preds = %loop.body12 + br label %voiderr22 + +voiderr22: ; preds = %after_check21, %loop.body12 + %69 = load i64, i64* %.anon9, align 8 + %add23 = add i64 %69, 1 + store i64 %add23, i64* %.anon9, align 8 + br label %loop.cond10 + +loop.exit24: ; preds = %loop.cond10 + ret void +} + diff --git a/test/test_suite2/macros/macro_untyped_varargs.c3 b/test/test_suite14/macros/macro_untyped_varargs.c3 similarity index 100% rename from test/test_suite2/macros/macro_untyped_varargs.c3 rename to test/test_suite14/macros/macro_untyped_varargs.c3 diff --git a/test/test_suite14/macros/macro_untyped_varargs_2.c3t b/test/test_suite14/macros/macro_untyped_varargs_2.c3t new file mode 100644 index 000000000..58643834d --- /dev/null +++ b/test/test_suite14/macros/macro_untyped_varargs_2.c3t @@ -0,0 +1,384 @@ +// #target: macos-x64 + +module test; + +import std::io; + +macro @foo(...) +{ + int i = $vaarg(1) + $vaarg(1); + int j = $vaexpr(2) + $vaexpr(2); + $for (var $i = 0; $i < $vacount; $i++): + io::printfn("%d", $vaarg($i)); + $endfor; +} + +macro foo2(...) +{ + $for (var $i = 0; $i < $vacount; $i++): + { + $vatype($i) x; + } + io::printfn("%s", $vatype($i).nameof); + $endfor; +} + +macro foo3(...) +{ + var $x = 0; + $for (var $i = 0; $i < $vacount; $i++): + $x += $vaconst($i); + $endfor; + return $x; +} + +macro @foo4(...) +{ + $typeof($varef(0)) a = $varef(0); + $varef(0) = $varef(1); + $varef(1) = a; +} +fn int ping(int val) +{ + io::printfn("Ping[%d]", val); + return val; +} + +fn void main() +{ + @foo(ping(1), ping(-1), ping(3141), ping(999 + 1)); + foo2(int, double); + var $x = foo3(1, 4, 100); + io::printfn("%d", $x); + int x = 123; + int y = 33; + @foo4(x, y); + io::printfn("%d, %d", x, y); + @foo4(x, y); + io::printfn("%d, %d", x, y); +} + +/* #expect: test.ll + +define i32 @test_ping(i32 %0) #0 { +entry: + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca i32, align 4 + %taddr1 = alloca %"variant[]", align 8 + store i32 %0, i32* %taddr, align 4 + %1 = bitcast i32* %taddr to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %4 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %3, %variant* %4, align 16 + %5 = bitcast [1 x %variant]* %varargslots to %variant* + %6 = insertvalue %"variant[]" undef, %variant* %5, 0 + %7 = insertvalue %"variant[]" %6, i64 1, 1 + store %"variant[]" %7, %"variant[]"* %taddr1, align 8 + %8 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %9 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 0 + %lo = load i8*, i8** %9, align 8 + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %8, i32 0, i32 1 + %hi = load i64, i64* %10, align 8 + %11 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %11, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + ret i32 %0 +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %.anon = alloca i32, align 4 + %.anon1 = alloca i32, align 4 + %.anon2 = alloca i32, align 4 + %.anon3 = alloca i32, align 4 + %i = alloca i32, align 4 + %j = alloca i32, align 4 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %retparam5 = alloca i64, align 8 + %varargslots6 = alloca [1 x %variant], align 16 + %taddr7 = alloca %"variant[]", align 8 + %retparam13 = alloca i64, align 8 + %varargslots14 = alloca [1 x %variant], align 16 + %taddr15 = alloca %"variant[]", align 8 + %retparam21 = alloca i64, align 8 + %varargslots22 = alloca [1 x %variant], align 16 + %taddr23 = alloca %"variant[]", align 8 + %x = alloca i32, align 4 + %retparam29 = alloca i64, align 8 + %varargslots30 = alloca [1 x %variant], align 16 + %taddr31 = alloca [3 x i8]*, align 8 + %taddr32 = alloca %"variant[]", align 8 + %x38 = alloca double, align 8 + %retparam39 = alloca i64, align 8 + %varargslots40 = alloca [1 x %variant], align 16 + %taddr41 = alloca [6 x i8]*, align 8 + %taddr42 = alloca %"variant[]", align 8 + %retparam48 = alloca i64, align 8 + %varargslots49 = alloca [1 x %variant], align 16 + %taddr50 = alloca i32, align 4 + %taddr51 = alloca %"variant[]", align 8 + %x57 = alloca i32, align 4 + %y = alloca i32, align 4 + %a = alloca i32, align 4 + %retparam58 = alloca i64, align 8 + %varargslots59 = alloca [2 x %variant], align 16 + %taddr60 = alloca %"variant[]", align 8 + %a66 = alloca i32, align 4 + %retparam67 = alloca i64, align 8 + %varargslots68 = alloca [2 x %variant], align 16 + %taddr69 = alloca %"variant[]", align 8 + %0 = call i32 @test_ping(i32 -1) + store i32 %0, i32* %.anon, align 4 + %1 = call i32 @test_ping(i32 1) + store i32 %1, i32* %.anon1, align 4 + %2 = call i32 @test_ping(i32 3141) + store i32 %2, i32* %.anon2, align 4 + %3 = call i32 @test_ping(i32 1000) + store i32 %3, i32* %.anon3, align 4 + %4 = load i32, i32* %.anon, align 4 + %5 = load i32, i32* %.anon, align 4 + %add = add i32 %4, %5 + store i32 %add, i32* %i, align 4 + %6 = call i32 @test_ping(i32 3141) + %7 = call i32 @test_ping(i32 3141) + %add4 = add i32 %6, %7 + store i32 %add4, i32* %j, align 4 + %8 = bitcast i32* %.anon1 to i8* + %9 = insertvalue %variant undef, i8* %8, 0 + %10 = insertvalue %variant %9, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %11 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %10, %variant* %11, align 16 + %12 = bitcast [1 x %variant]* %varargslots to %variant* + %13 = insertvalue %"variant[]" undef, %variant* %12, 0 + %14 = insertvalue %"variant[]" %13, i64 1, 1 + store %"variant[]" %14, %"variant[]"* %taddr, align 8 + %15 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %16 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 0 + %lo = load i8*, i8** %16, align 8 + %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %15, i32 0, i32 1 + %hi = load i64, i64* %17, align 8 + %18 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0), i64 2, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %18, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %19 = bitcast i32* %.anon to i8* + %20 = insertvalue %variant undef, i8* %19, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %22 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots6, i64 0, i64 0 + store %variant %21, %variant* %22, align 16 + %23 = bitcast [1 x %variant]* %varargslots6 to %variant* + %24 = insertvalue %"variant[]" undef, %variant* %23, 0 + %25 = insertvalue %"variant[]" %24, i64 1, 1 + store %"variant[]" %25, %"variant[]"* %taddr7, align 8 + %26 = bitcast %"variant[]"* %taddr7 to { i8*, i64 }* + %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0 + %lo8 = load i8*, i8** %27, align 8 + %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1 + %hi9 = load i64, i64* %28, align 8 + %29 = call i64 @std_io_printfn(i64* %retparam5, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo8, i64 %hi9) + %not_err10 = icmp eq i64 %29, 0 + br i1 %not_err10, label %after_check11, label %voiderr12 + +after_check11: ; preds = %voiderr + br label %voiderr12 + +voiderr12: ; preds = %after_check11, %voiderr + %30 = bitcast i32* %.anon2 to i8* + %31 = insertvalue %variant undef, i8* %30, 0 + %32 = insertvalue %variant %31, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %33 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots14, i64 0, i64 0 + store %variant %32, %variant* %33, align 16 + %34 = bitcast [1 x %variant]* %varargslots14 to %variant* + %35 = insertvalue %"variant[]" undef, %variant* %34, 0 + %36 = insertvalue %"variant[]" %35, i64 1, 1 + store %"variant[]" %36, %"variant[]"* %taddr15, align 8 + %37 = bitcast %"variant[]"* %taddr15 to { i8*, i64 }* + %38 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %37, i32 0, i32 0 + %lo16 = load i8*, i8** %38, align 8 + %39 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %37, i32 0, i32 1 + %hi17 = load i64, i64* %39, align 8 + %40 = call i64 @std_io_printfn(i64* %retparam13, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo16, i64 %hi17) + %not_err18 = icmp eq i64 %40, 0 + br i1 %not_err18, label %after_check19, label %voiderr20 + +after_check19: ; preds = %voiderr12 + br label %voiderr20 + +voiderr20: ; preds = %after_check19, %voiderr12 + %41 = bitcast i32* %.anon3 to i8* + %42 = insertvalue %variant undef, i8* %41, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %44 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots22, i64 0, i64 0 + store %variant %43, %variant* %44, align 16 + %45 = bitcast [1 x %variant]* %varargslots22 to %variant* + %46 = insertvalue %"variant[]" undef, %variant* %45, 0 + %47 = insertvalue %"variant[]" %46, i64 1, 1 + store %"variant[]" %47, %"variant[]"* %taddr23, align 8 + %48 = bitcast %"variant[]"* %taddr23 to { i8*, i64 }* + %49 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 0 + %lo24 = load i8*, i8** %49, align 8 + %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 1 + %hi25 = load i64, i64* %50, align 8 + %51 = call i64 @std_io_printfn(i64* %retparam21, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo24, i64 %hi25) + %not_err26 = icmp eq i64 %51, 0 + br i1 %not_err26, label %after_check27, label %voiderr28 + +after_check27: ; preds = %voiderr20 + br label %voiderr28 + +voiderr28: ; preds = %after_check27, %voiderr20 + store i32 0, i32* %x, align 4 + store [3 x i8]* bitcast ([4 x i8]* @.str.6 to [3 x i8]*), [3 x i8]** %taddr31, align 8 + %52 = bitcast [3 x i8]** %taddr31 to i8* + %53 = insertvalue %variant undef, i8* %52, 0 + %54 = insertvalue %variant %53, i64 ptrtoint (%.introspect* @"ct$p$a3$char" to i64), 1 + %55 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots30, i64 0, i64 0 + store %variant %54, %variant* %55, align 16 + %56 = bitcast [1 x %variant]* %varargslots30 to %variant* + %57 = insertvalue %"variant[]" undef, %variant* %56, 0 + %58 = insertvalue %"variant[]" %57, i64 1, 1 + store %"variant[]" %58, %"variant[]"* %taddr32, align 8 + %59 = bitcast %"variant[]"* %taddr32 to { i8*, i64 }* + %60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %59, i32 0, i32 0 + %lo33 = load i8*, i8** %60, align 8 + %61 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %59, i32 0, i32 1 + %hi34 = load i64, i64* %61, align 8 + %62 = call i64 @std_io_printfn(i64* %retparam29, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i32 0, i32 0), i64 2, i8* %lo33, i64 %hi34) + %not_err35 = icmp eq i64 %62, 0 + br i1 %not_err35, label %after_check36, label %voiderr37 + +after_check36: ; preds = %voiderr28 + br label %voiderr37 + +voiderr37: ; preds = %after_check36, %voiderr28 + store double 0.000000e+00, double* %x38, align 8 + store [6 x i8]* bitcast ([7 x i8]* @.str.8 to [6 x i8]*), [6 x i8]** %taddr41, align 8 + %63 = bitcast [6 x i8]** %taddr41 to i8* + %64 = insertvalue %variant undef, i8* %63, 0 + %65 = insertvalue %variant %64, i64 ptrtoint (%.introspect* @"ct$p$a6$char" to i64), 1 + %66 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots40, i64 0, i64 0 + store %variant %65, %variant* %66, align 16 + %67 = bitcast [1 x %variant]* %varargslots40 to %variant* + %68 = insertvalue %"variant[]" undef, %variant* %67, 0 + %69 = insertvalue %"variant[]" %68, i64 1, 1 + store %"variant[]" %69, %"variant[]"* %taddr42, align 8 + %70 = bitcast %"variant[]"* %taddr42 to { i8*, i64 }* + %71 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %70, i32 0, i32 0 + %lo43 = load i8*, i8** %71, align 8 + %72 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %70, i32 0, i32 1 + %hi44 = load i64, i64* %72, align 8 + %73 = call i64 @std_io_printfn(i64* %retparam39, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.7, i32 0, i32 0), i64 2, i8* %lo43, i64 %hi44) + %not_err45 = icmp eq i64 %73, 0 + br i1 %not_err45, label %after_check46, label %voiderr47 + +after_check46: ; preds = %voiderr37 + br label %voiderr47 + +voiderr47: ; preds = %after_check46, %voiderr37 + store i32 105, i32* %taddr50, align 4 + %74 = bitcast i32* %taddr50 to i8* + %75 = insertvalue %variant undef, i8* %74, 0 + %76 = insertvalue %variant %75, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %77 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots49, i64 0, i64 0 + store %variant %76, %variant* %77, align 16 + %78 = bitcast [1 x %variant]* %varargslots49 to %variant* + %79 = insertvalue %"variant[]" undef, %variant* %78, 0 + %80 = insertvalue %"variant[]" %79, i64 1, 1 + store %"variant[]" %80, %"variant[]"* %taddr51, align 8 + %81 = bitcast %"variant[]"* %taddr51 to { i8*, i64 }* + %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 0 + %lo52 = load i8*, i8** %82, align 8 + %83 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 1 + %hi53 = load i64, i64* %83, align 8 + %84 = call i64 @std_io_printfn(i64* %retparam48, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0), i64 2, i8* %lo52, i64 %hi53) + %not_err54 = icmp eq i64 %84, 0 + br i1 %not_err54, label %after_check55, label %voiderr56 + +after_check55: ; preds = %voiderr47 + br label %voiderr56 + +voiderr56: ; preds = %after_check55, %voiderr47 + store i32 123, i32* %x57, align 4 + store i32 33, i32* %y, align 4 + %85 = load i32, i32* %x57, align 4 + store i32 %85, i32* %a, align 4 + %86 = load i32, i32* %y, align 4 + store i32 %86, i32* %x57, align 4 + %87 = load i32, i32* %a, align 4 + store i32 %87, i32* %y, align 4 + %88 = bitcast i32* %x57 to i8* + %89 = insertvalue %variant undef, i8* %88, 0 + %90 = insertvalue %variant %89, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %91 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots59, i64 0, i64 0 + store %variant %90, %variant* %91, align 16 + %92 = bitcast i32* %y to i8* + %93 = insertvalue %variant undef, i8* %92, 0 + %94 = insertvalue %variant %93, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %95 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots59, i64 0, i64 1 + store %variant %94, %variant* %95, align 16 + %96 = bitcast [2 x %variant]* %varargslots59 to %variant* + %97 = insertvalue %"variant[]" undef, %variant* %96, 0 + %98 = insertvalue %"variant[]" %97, i64 2, 1 + store %"variant[]" %98, %"variant[]"* %taddr60, align 8 + %99 = bitcast %"variant[]"* %taddr60 to { i8*, i64 }* + %100 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %99, i32 0, i32 0 + %lo61 = load i8*, i8** %100, align 8 + %101 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %99, i32 0, i32 1 + %hi62 = load i64, i64* %101, align 8 + %102 = call i64 @std_io_printfn(i64* %retparam58, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i32 0, i32 0), i64 6, i8* %lo61, i64 %hi62) + %not_err63 = icmp eq i64 %102, 0 + br i1 %not_err63, label %after_check64, label %voiderr65 + +after_check64: ; preds = %voiderr56 + br label %voiderr65 + +voiderr65: ; preds = %after_check64, %voiderr56 + %103 = load i32, i32* %x57, align 4 + store i32 %103, i32* %a66, align 4 + %104 = load i32, i32* %y, align 4 + store i32 %104, i32* %x57, align 4 + %105 = load i32, i32* %a66, align 4 + store i32 %105, i32* %y, align 4 + %106 = bitcast i32* %x57 to i8* + %107 = insertvalue %variant undef, i8* %106, 0 + %108 = insertvalue %variant %107, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %109 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots68, i64 0, i64 0 + store %variant %108, %variant* %109, align 16 + %110 = bitcast i32* %y to i8* + %111 = insertvalue %variant undef, i8* %110, 0 + %112 = insertvalue %variant %111, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %113 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots68, i64 0, i64 1 + store %variant %112, %variant* %113, align 16 + %114 = bitcast [2 x %variant]* %varargslots68 to %variant* + %115 = insertvalue %"variant[]" undef, %variant* %114, 0 + %116 = insertvalue %"variant[]" %115, i64 2, 1 + store %"variant[]" %116, %"variant[]"* %taddr69, align 8 + %117 = bitcast %"variant[]"* %taddr69 to { i8*, i64 }* + %118 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %117, i32 0, i32 0 + %lo70 = load i8*, i8** %118, align 8 + %119 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %117, i32 0, i32 1 + %hi71 = load i64, i64* %119, align 8 + %120 = call i64 @std_io_printfn(i64* %retparam67, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.11, i32 0, i32 0), i64 6, i8* %lo70, i64 %hi71) + %not_err72 = icmp eq i64 %120, 0 + br i1 %not_err72, label %after_check73, label %voiderr74 + +after_check73: ; preds = %voiderr65 + br label %voiderr74 + +voiderr74: ; preds = %after_check73, %voiderr65 + ret void +} diff --git a/test/test_suite14/macros/macro_vasplat.c3t b/test/test_suite14/macros/macro_vasplat.c3t new file mode 100644 index 000000000..703022449 --- /dev/null +++ b/test/test_suite14/macros/macro_vasplat.c3t @@ -0,0 +1,753 @@ +// #target: macos-x64 +module test; +import std::io; + +macro @hello(...) +{ + int[*] a = { 1, $vasplat(), 3 }; + foreach (i, x : a) io::printfn("%d: %d", i, x); +} + +macro @hello1(...) +{ + int[*] a = { 1, $vasplat() }; + foreach (i, x : a) io::printfn("x:%d: %d", i, x); +} + +macro @hello2(...) +{ + int[*] a = { $vasplat(), 888 }; + foreach (i, x : a) io::printfn("x:%d: %d", i, x); +} + +macro @hello3(...) +{ + int[*] a = { $vasplat() }; + foreach (i, x : a) io::printfn("x:%d: %d", i, x); +} + +macro @hello4(...) +{ + int[*] a = { 5, $vasplat(2..4), 77 }; + foreach (i, x : a) io::printfn("y:%d: %d", i, x); +} + +macro @hello5(...) +{ + int[*] a = { 5, $vasplat(2..), 77 }; + foreach (i, x : a) io::printfn("y:%d: %d", i, x); + int[*] b = { 55, $vasplat(2..^2), 88 }; + foreach (i, x : b) io::printfn("z:%d: %d", i, x); + int[*] c = { 55, $vasplat(0:^2), 88 }; + foreach (i, x : c) io::printfn("zz:%d: %d", i, x); +} + +macro @hello6(...) +{ + @hello(66, $vasplat()); +} +fn void main() +{ + @hello1(223, 326); + @hello1(); + @hello(26, 36); + @hello(); + @hello2(2123, 3326); + @hello2(); + @hello3(2123, 3326); + @hello4(1, 2, 3, 4, 5, 6, 7, 8); + @hello5(1, 2, 3, 4, 5, 6, 7, 8); + @hello6(1, 2, 3); +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %a = alloca [3 x i32], align 4 + %.anon = alloca i64, align 8 + %i = alloca i64, align 8 + %x = alloca i32, align 4 + %retparam = alloca i64, align 8 + %varargslots = alloca [2 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %a1 = alloca [1 x i32], align 4 + %.anon2 = alloca i64, align 8 + %i6 = alloca i64, align 8 + %x7 = alloca i32, align 4 + %retparam8 = alloca i64, align 8 + %varargslots9 = alloca [2 x %variant], align 16 + %taddr10 = alloca %"variant[]", align 8 + %a18 = alloca [4 x i32], align 16 + %.anon19 = alloca i64, align 8 + %i23 = alloca i64, align 8 + %x24 = alloca i32, align 4 + %retparam25 = alloca i64, align 8 + %varargslots26 = alloca [2 x %variant], align 16 + %taddr27 = alloca %"variant[]", align 8 + %a35 = alloca [2 x i32], align 4 + %.anon36 = alloca i64, align 8 + %i40 = alloca i64, align 8 + %x41 = alloca i32, align 4 + %retparam42 = alloca i64, align 8 + %varargslots43 = alloca [2 x %variant], align 16 + %taddr44 = alloca %"variant[]", align 8 + %a52 = alloca [3 x i32], align 4 + %.anon53 = alloca i64, align 8 + %i57 = alloca i64, align 8 + %x58 = alloca i32, align 4 + %retparam59 = alloca i64, align 8 + %varargslots60 = alloca [2 x %variant], align 16 + %taddr61 = alloca %"variant[]", align 8 + %a69 = alloca [1 x i32], align 4 + %.anon70 = alloca i64, align 8 + %i74 = alloca i64, align 8 + %x75 = alloca i32, align 4 + %retparam76 = alloca i64, align 8 + %varargslots77 = alloca [2 x %variant], align 16 + %taddr78 = alloca %"variant[]", align 8 + %a86 = alloca [2 x i32], align 4 + %.anon87 = alloca i64, align 8 + %i91 = alloca i64, align 8 + %x92 = alloca i32, align 4 + %retparam93 = alloca i64, align 8 + %varargslots94 = alloca [2 x %variant], align 16 + %taddr95 = alloca %"variant[]", align 8 + %a103 = alloca [5 x i32], align 16 + %.anon104 = alloca i64, align 8 + %i108 = alloca i64, align 8 + %x109 = alloca i32, align 4 + %retparam110 = alloca i64, align 8 + %varargslots111 = alloca [2 x %variant], align 16 + %taddr112 = alloca %"variant[]", align 8 + %a120 = alloca [8 x i32], align 16 + %.anon121 = alloca i64, align 8 + %i125 = alloca i64, align 8 + %x126 = alloca i32, align 4 + %retparam127 = alloca i64, align 8 + %varargslots128 = alloca [2 x %variant], align 16 + %taddr129 = alloca %"variant[]", align 8 + %b = alloca [7 x i32], align 16 + %.anon137 = alloca i64, align 8 + %i141 = alloca i64, align 8 + %x142 = alloca i32, align 4 + %retparam143 = alloca i64, align 8 + %varargslots144 = alloca [2 x %variant], align 16 + %taddr145 = alloca %"variant[]", align 8 + %c = alloca [8 x i32], align 16 + %.anon153 = alloca i64, align 8 + %i157 = alloca i64, align 8 + %x158 = alloca i32, align 4 + %retparam159 = alloca i64, align 8 + %varargslots160 = alloca [2 x %variant], align 16 + %taddr161 = alloca %"variant[]", align 8 + %a169 = alloca [6 x i32], align 16 + %.anon170 = alloca i64, align 8 + %i174 = alloca i64, align 8 + %x175 = alloca i32, align 4 + %retparam176 = alloca i64, align 8 + %varargslots177 = alloca [2 x %variant], align 16 + %taddr178 = alloca %"variant[]", align 8 + %0 = bitcast [3 x i32]* %a to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + store i64 0, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %voiderr, %entry + %1 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 3, %1 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %2 = load i64, i64* %.anon, align 8 + store i64 %2, i64* %i, align 8 + %3 = load i64, i64* %.anon, align 8 + %4 = getelementptr inbounds [3 x i32], [3 x i32]* %a, i64 0, i64 %3 + %5 = load i32, i32* %4, align 4 + store i32 %5, i32* %x, align 4 + %6 = bitcast i64* %i to i8* + %7 = insertvalue %variant undef, i8* %6, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %9 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %8, %variant* %9, align 16 + %10 = bitcast i32* %x to i8* + %11 = insertvalue %variant undef, i8* %10, 0 + %12 = insertvalue %variant %11, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %13 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %12, %variant* %13, align 16 + %14 = bitcast [2 x %variant]* %varargslots to %variant* + %15 = insertvalue %"variant[]" undef, %variant* %14, 0 + %16 = insertvalue %"variant[]" %15, i64 2, 1 + store %"variant[]" %16, %"variant[]"* %taddr, align 8 + %17 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 0 + %lo = load i8*, i8** %18, align 8 + %19 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %17, i32 0, i32 1 + %hi = load i64, i64* %19, align 8 + %20 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %20, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %loop.body + br label %voiderr + +voiderr: ; preds = %after_check, %loop.body + %21 = load i64, i64* %.anon, align 8 + %add = add i64 %21, 1 + store i64 %add, i64* %.anon, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %22 = bitcast [1 x i32]* %a1 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %22, i8* align 4 bitcast ([1 x i32]* @.__const.1 to i8*), i32 4, i1 false) + store i64 0, i64* %.anon2, align 8 + br label %loop.cond3 + +loop.cond3: ; preds = %voiderr15, %loop.exit + %23 = load i64, i64* %.anon2, align 8 + %gt4 = icmp ugt i64 1, %23 + br i1 %gt4, label %loop.body5, label %loop.exit17 + +loop.body5: ; preds = %loop.cond3 + %24 = load i64, i64* %.anon2, align 8 + store i64 %24, i64* %i6, align 8 + %25 = load i64, i64* %.anon2, align 8 + %26 = getelementptr inbounds [1 x i32], [1 x i32]* %a1, i64 0, i64 %25 + %27 = load i32, i32* %26, align 4 + store i32 %27, i32* %x7, align 4 + %28 = bitcast i64* %i6 to i8* + %29 = insertvalue %variant undef, i8* %28, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %31 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots9, i64 0, i64 0 + store %variant %30, %variant* %31, align 16 + %32 = bitcast i32* %x7 to i8* + %33 = insertvalue %variant undef, i8* %32, 0 + %34 = insertvalue %variant %33, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %35 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots9, i64 0, i64 1 + store %variant %34, %variant* %35, align 16 + %36 = bitcast [2 x %variant]* %varargslots9 to %variant* + %37 = insertvalue %"variant[]" undef, %variant* %36, 0 + %38 = insertvalue %"variant[]" %37, i64 2, 1 + store %"variant[]" %38, %"variant[]"* %taddr10, align 8 + %39 = bitcast %"variant[]"* %taddr10 to { i8*, i64 }* + %40 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %39, i32 0, i32 0 + %lo11 = load i8*, i8** %40, align 8 + %41 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %39, i32 0, i32 1 + %hi12 = load i64, i64* %41, align 8 + %42 = call i64 @std_io_printfn(i64* %retparam8, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i32 0, i32 0), i64 8, i8* %lo11, i64 %hi12) + %not_err13 = icmp eq i64 %42, 0 + br i1 %not_err13, label %after_check14, label %voiderr15 + +after_check14: ; preds = %loop.body5 + br label %voiderr15 + +voiderr15: ; preds = %after_check14, %loop.body5 + %43 = load i64, i64* %.anon2, align 8 + %add16 = add i64 %43, 1 + store i64 %add16, i64* %.anon2, align 8 + br label %loop.cond3 + +loop.exit17: ; preds = %loop.cond3 + %44 = bitcast [4 x i32]* %a18 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %44, i8* align 16 bitcast ([4 x i32]* @.__const.3 to i8*), i32 16, i1 false) + store i64 0, i64* %.anon19, align 8 + br label %loop.cond20 + +loop.cond20: ; preds = %voiderr32, %loop.exit17 + %45 = load i64, i64* %.anon19, align 8 + %gt21 = icmp ugt i64 4, %45 + br i1 %gt21, label %loop.body22, label %loop.exit34 + +loop.body22: ; preds = %loop.cond20 + %46 = load i64, i64* %.anon19, align 8 + store i64 %46, i64* %i23, align 8 + %47 = load i64, i64* %.anon19, align 8 + %48 = getelementptr inbounds [4 x i32], [4 x i32]* %a18, i64 0, i64 %47 + %49 = load i32, i32* %48, align 4 + store i32 %49, i32* %x24, align 4 + %50 = bitcast i64* %i23 to i8* + %51 = insertvalue %variant undef, i8* %50, 0 + %52 = insertvalue %variant %51, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %53 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots26, i64 0, i64 0 + store %variant %52, %variant* %53, align 16 + %54 = bitcast i32* %x24 to i8* + %55 = insertvalue %variant undef, i8* %54, 0 + %56 = insertvalue %variant %55, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %57 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots26, i64 0, i64 1 + store %variant %56, %variant* %57, align 16 + %58 = bitcast [2 x %variant]* %varargslots26 to %variant* + %59 = insertvalue %"variant[]" undef, %variant* %58, 0 + %60 = insertvalue %"variant[]" %59, i64 2, 1 + store %"variant[]" %60, %"variant[]"* %taddr27, align 8 + %61 = bitcast %"variant[]"* %taddr27 to { i8*, i64 }* + %62 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 0 + %lo28 = load i8*, i8** %62, align 8 + %63 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %61, i32 0, i32 1 + %hi29 = load i64, i64* %63, align 8 + %64 = call i64 @std_io_printfn(i64* %retparam25, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.4, i32 0, i32 0), i64 6, i8* %lo28, i64 %hi29) + %not_err30 = icmp eq i64 %64, 0 + br i1 %not_err30, label %after_check31, label %voiderr32 + +after_check31: ; preds = %loop.body22 + br label %voiderr32 + +voiderr32: ; preds = %after_check31, %loop.body22 + %65 = load i64, i64* %.anon19, align 8 + %add33 = add i64 %65, 1 + store i64 %add33, i64* %.anon19, align 8 + br label %loop.cond20 + +loop.exit34: ; preds = %loop.cond20 + %66 = bitcast [2 x i32]* %a35 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %66, i8* align 4 bitcast ([2 x i32]* @.__const.5 to i8*), i32 8, i1 false) + store i64 0, i64* %.anon36, align 8 + br label %loop.cond37 + +loop.cond37: ; preds = %voiderr49, %loop.exit34 + %67 = load i64, i64* %.anon36, align 8 + %gt38 = icmp ugt i64 2, %67 + br i1 %gt38, label %loop.body39, label %loop.exit51 + +loop.body39: ; preds = %loop.cond37 + %68 = load i64, i64* %.anon36, align 8 + store i64 %68, i64* %i40, align 8 + %69 = load i64, i64* %.anon36, align 8 + %70 = getelementptr inbounds [2 x i32], [2 x i32]* %a35, i64 0, i64 %69 + %71 = load i32, i32* %70, align 4 + store i32 %71, i32* %x41, align 4 + %72 = bitcast i64* %i40 to i8* + %73 = insertvalue %variant undef, i8* %72, 0 + %74 = insertvalue %variant %73, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %75 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots43, i64 0, i64 0 + store %variant %74, %variant* %75, align 16 + %76 = bitcast i32* %x41 to i8* + %77 = insertvalue %variant undef, i8* %76, 0 + %78 = insertvalue %variant %77, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %79 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots43, i64 0, i64 1 + store %variant %78, %variant* %79, align 16 + %80 = bitcast [2 x %variant]* %varargslots43 to %variant* + %81 = insertvalue %"variant[]" undef, %variant* %80, 0 + %82 = insertvalue %"variant[]" %81, i64 2, 1 + store %"variant[]" %82, %"variant[]"* %taddr44, align 8 + %83 = bitcast %"variant[]"* %taddr44 to { i8*, i64 }* + %84 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %83, i32 0, i32 0 + %lo45 = load i8*, i8** %84, align 8 + %85 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %83, i32 0, i32 1 + %hi46 = load i64, i64* %85, align 8 + %86 = call i64 @std_io_printfn(i64* %retparam42, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.6, i32 0, i32 0), i64 6, i8* %lo45, i64 %hi46) + %not_err47 = icmp eq i64 %86, 0 + br i1 %not_err47, label %after_check48, label %voiderr49 + +after_check48: ; preds = %loop.body39 + br label %voiderr49 + +voiderr49: ; preds = %after_check48, %loop.body39 + %87 = load i64, i64* %.anon36, align 8 + %add50 = add i64 %87, 1 + store i64 %add50, i64* %.anon36, align 8 + br label %loop.cond37 + +loop.exit51: ; preds = %loop.cond37 + %88 = bitcast [3 x i32]* %a52 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %88, i8* align 4 bitcast ([3 x i32]* @.__const.7 to i8*), i32 12, i1 false) + store i64 0, i64* %.anon53, align 8 + br label %loop.cond54 + +loop.cond54: ; preds = %voiderr66, %loop.exit51 + %89 = load i64, i64* %.anon53, align 8 + %gt55 = icmp ugt i64 3, %89 + br i1 %gt55, label %loop.body56, label %loop.exit68 + +loop.body56: ; preds = %loop.cond54 + %90 = load i64, i64* %.anon53, align 8 + store i64 %90, i64* %i57, align 8 + %91 = load i64, i64* %.anon53, align 8 + %92 = getelementptr inbounds [3 x i32], [3 x i32]* %a52, i64 0, i64 %91 + %93 = load i32, i32* %92, align 4 + store i32 %93, i32* %x58, align 4 + %94 = bitcast i64* %i57 to i8* + %95 = insertvalue %variant undef, i8* %94, 0 + %96 = insertvalue %variant %95, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %97 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots60, i64 0, i64 0 + store %variant %96, %variant* %97, align 16 + %98 = bitcast i32* %x58 to i8* + %99 = insertvalue %variant undef, i8* %98, 0 + %100 = insertvalue %variant %99, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %101 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots60, i64 0, i64 1 + store %variant %100, %variant* %101, align 16 + %102 = bitcast [2 x %variant]* %varargslots60 to %variant* + %103 = insertvalue %"variant[]" undef, %variant* %102, 0 + %104 = insertvalue %"variant[]" %103, i64 2, 1 + store %"variant[]" %104, %"variant[]"* %taddr61, align 8 + %105 = bitcast %"variant[]"* %taddr61 to { i8*, i64 }* + %106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 0 + %lo62 = load i8*, i8** %106, align 8 + %107 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 1 + %hi63 = load i64, i64* %107, align 8 + %108 = call i64 @std_io_printfn(i64* %retparam59, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.8, i32 0, i32 0), i64 8, i8* %lo62, i64 %hi63) + %not_err64 = icmp eq i64 %108, 0 + br i1 %not_err64, label %after_check65, label %voiderr66 + +after_check65: ; preds = %loop.body56 + br label %voiderr66 + +voiderr66: ; preds = %after_check65, %loop.body56 + %109 = load i64, i64* %.anon53, align 8 + %add67 = add i64 %109, 1 + store i64 %add67, i64* %.anon53, align 8 + br label %loop.cond54 + +loop.exit68: ; preds = %loop.cond54 + %110 = bitcast [1 x i32]* %a69 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %110, i8* align 4 bitcast ([1 x i32]* @.__const.9 to i8*), i32 4, i1 false) + store i64 0, i64* %.anon70, align 8 + br label %loop.cond71 + +loop.cond71: ; preds = %voiderr83, %loop.exit68 + %111 = load i64, i64* %.anon70, align 8 + %gt72 = icmp ugt i64 1, %111 + br i1 %gt72, label %loop.body73, label %loop.exit85 + +loop.body73: ; preds = %loop.cond71 + %112 = load i64, i64* %.anon70, align 8 + store i64 %112, i64* %i74, align 8 + %113 = load i64, i64* %.anon70, align 8 + %114 = getelementptr inbounds [1 x i32], [1 x i32]* %a69, i64 0, i64 %113 + %115 = load i32, i32* %114, align 4 + store i32 %115, i32* %x75, align 4 + %116 = bitcast i64* %i74 to i8* + %117 = insertvalue %variant undef, i8* %116, 0 + %118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %119 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots77, i64 0, i64 0 + store %variant %118, %variant* %119, align 16 + %120 = bitcast i32* %x75 to i8* + %121 = insertvalue %variant undef, i8* %120, 0 + %122 = insertvalue %variant %121, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %123 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots77, i64 0, i64 1 + store %variant %122, %variant* %123, align 16 + %124 = bitcast [2 x %variant]* %varargslots77 to %variant* + %125 = insertvalue %"variant[]" undef, %variant* %124, 0 + %126 = insertvalue %"variant[]" %125, i64 2, 1 + store %"variant[]" %126, %"variant[]"* %taddr78, align 8 + %127 = bitcast %"variant[]"* %taddr78 to { i8*, i64 }* + %128 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %127, i32 0, i32 0 + %lo79 = load i8*, i8** %128, align 8 + %129 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %127, i32 0, i32 1 + %hi80 = load i64, i64* %129, align 8 + %130 = call i64 @std_io_printfn(i64* %retparam76, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.10, i32 0, i32 0), i64 8, i8* %lo79, i64 %hi80) + %not_err81 = icmp eq i64 %130, 0 + br i1 %not_err81, label %after_check82, label %voiderr83 + +after_check82: ; preds = %loop.body73 + br label %voiderr83 + +voiderr83: ; preds = %after_check82, %loop.body73 + %131 = load i64, i64* %.anon70, align 8 + %add84 = add i64 %131, 1 + store i64 %add84, i64* %.anon70, align 8 + br label %loop.cond71 + +loop.exit85: ; preds = %loop.cond71 + %132 = bitcast [2 x i32]* %a86 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %132, i8* align 4 bitcast ([2 x i32]* @.__const.11 to i8*), i32 8, i1 false) + store i64 0, i64* %.anon87, align 8 + br label %loop.cond88 + +loop.cond88: ; preds = %voiderr100, %loop.exit85 + %133 = load i64, i64* %.anon87, align 8 + %gt89 = icmp ugt i64 2, %133 + br i1 %gt89, label %loop.body90, label %loop.exit102 + +loop.body90: ; preds = %loop.cond88 + %134 = load i64, i64* %.anon87, align 8 + store i64 %134, i64* %i91, align 8 + %135 = load i64, i64* %.anon87, align 8 + %136 = getelementptr inbounds [2 x i32], [2 x i32]* %a86, i64 0, i64 %135 + %137 = load i32, i32* %136, align 4 + store i32 %137, i32* %x92, align 4 + %138 = bitcast i64* %i91 to i8* + %139 = insertvalue %variant undef, i8* %138, 0 + %140 = insertvalue %variant %139, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %141 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots94, i64 0, i64 0 + store %variant %140, %variant* %141, align 16 + %142 = bitcast i32* %x92 to i8* + %143 = insertvalue %variant undef, i8* %142, 0 + %144 = insertvalue %variant %143, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %145 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots94, i64 0, i64 1 + store %variant %144, %variant* %145, align 16 + %146 = bitcast [2 x %variant]* %varargslots94 to %variant* + %147 = insertvalue %"variant[]" undef, %variant* %146, 0 + %148 = insertvalue %"variant[]" %147, i64 2, 1 + store %"variant[]" %148, %"variant[]"* %taddr95, align 8 + %149 = bitcast %"variant[]"* %taddr95 to { i8*, i64 }* + %150 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 0 + %lo96 = load i8*, i8** %150, align 8 + %151 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %149, i32 0, i32 1 + %hi97 = load i64, i64* %151, align 8 + %152 = call i64 @std_io_printfn(i64* %retparam93, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i32 0, i32 0), i64 8, i8* %lo96, i64 %hi97) + %not_err98 = icmp eq i64 %152, 0 + br i1 %not_err98, label %after_check99, label %voiderr100 + +after_check99: ; preds = %loop.body90 + br label %voiderr100 + +voiderr100: ; preds = %after_check99, %loop.body90 + %153 = load i64, i64* %.anon87, align 8 + %add101 = add i64 %153, 1 + store i64 %add101, i64* %.anon87, align 8 + br label %loop.cond88 + +loop.exit102: ; preds = %loop.cond88 + %154 = bitcast [5 x i32]* %a103 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %154, i8* align 16 bitcast ([5 x i32]* @.__const.13 to i8*), i32 20, i1 false) + store i64 0, i64* %.anon104, align 8 + br label %loop.cond105 + +loop.cond105: ; preds = %voiderr117, %loop.exit102 + %155 = load i64, i64* %.anon104, align 8 + %gt106 = icmp ugt i64 5, %155 + br i1 %gt106, label %loop.body107, label %loop.exit119 + +loop.body107: ; preds = %loop.cond105 + %156 = load i64, i64* %.anon104, align 8 + store i64 %156, i64* %i108, align 8 + %157 = load i64, i64* %.anon104, align 8 + %158 = getelementptr inbounds [5 x i32], [5 x i32]* %a103, i64 0, i64 %157 + %159 = load i32, i32* %158, align 4 + store i32 %159, i32* %x109, align 4 + %160 = bitcast i64* %i108 to i8* + %161 = insertvalue %variant undef, i8* %160, 0 + %162 = insertvalue %variant %161, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %163 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 0 + store %variant %162, %variant* %163, align 16 + %164 = bitcast i32* %x109 to i8* + %165 = insertvalue %variant undef, i8* %164, 0 + %166 = insertvalue %variant %165, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %167 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots111, i64 0, i64 1 + store %variant %166, %variant* %167, align 16 + %168 = bitcast [2 x %variant]* %varargslots111 to %variant* + %169 = insertvalue %"variant[]" undef, %variant* %168, 0 + %170 = insertvalue %"variant[]" %169, i64 2, 1 + store %"variant[]" %170, %"variant[]"* %taddr112, align 8 + %171 = bitcast %"variant[]"* %taddr112 to { i8*, i64 }* + %172 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %171, i32 0, i32 0 + %lo113 = load i8*, i8** %172, align 8 + %173 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %171, i32 0, i32 1 + %hi114 = load i64, i64* %173, align 8 + %174 = call i64 @std_io_printfn(i64* %retparam110, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.14, i32 0, i32 0), i64 8, i8* %lo113, i64 %hi114) + %not_err115 = icmp eq i64 %174, 0 + br i1 %not_err115, label %after_check116, label %voiderr117 + +after_check116: ; preds = %loop.body107 + br label %voiderr117 + +voiderr117: ; preds = %after_check116, %loop.body107 + %175 = load i64, i64* %.anon104, align 8 + %add118 = add i64 %175, 1 + store i64 %add118, i64* %.anon104, align 8 + br label %loop.cond105 + +loop.exit119: ; preds = %loop.cond105 + %176 = bitcast [8 x i32]* %a120 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %176, i8* align 16 bitcast ([8 x i32]* @.__const.15 to i8*), i32 32, i1 false) + store i64 0, i64* %.anon121, align 8 + br label %loop.cond122 + +loop.cond122: ; preds = %voiderr134, %loop.exit119 + %177 = load i64, i64* %.anon121, align 8 + %gt123 = icmp ugt i64 8, %177 + br i1 %gt123, label %loop.body124, label %loop.exit136 + +loop.body124: ; preds = %loop.cond122 + %178 = load i64, i64* %.anon121, align 8 + store i64 %178, i64* %i125, align 8 + %179 = load i64, i64* %.anon121, align 8 + %180 = getelementptr inbounds [8 x i32], [8 x i32]* %a120, i64 0, i64 %179 + %181 = load i32, i32* %180, align 4 + store i32 %181, i32* %x126, align 4 + %182 = bitcast i64* %i125 to i8* + %183 = insertvalue %variant undef, i8* %182, 0 + %184 = insertvalue %variant %183, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %185 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots128, i64 0, i64 0 + store %variant %184, %variant* %185, align 16 + %186 = bitcast i32* %x126 to i8* + %187 = insertvalue %variant undef, i8* %186, 0 + %188 = insertvalue %variant %187, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %189 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots128, i64 0, i64 1 + store %variant %188, %variant* %189, align 16 + %190 = bitcast [2 x %variant]* %varargslots128 to %variant* + %191 = insertvalue %"variant[]" undef, %variant* %190, 0 + %192 = insertvalue %"variant[]" %191, i64 2, 1 + store %"variant[]" %192, %"variant[]"* %taddr129, align 8 + %193 = bitcast %"variant[]"* %taddr129 to { i8*, i64 }* + %194 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %193, i32 0, i32 0 + %lo130 = load i8*, i8** %194, align 8 + %195 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %193, i32 0, i32 1 + %hi131 = load i64, i64* %195, align 8 + %196 = call i64 @std_io_printfn(i64* %retparam127, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.16, i32 0, i32 0), i64 8, i8* %lo130, i64 %hi131) + %not_err132 = icmp eq i64 %196, 0 + br i1 %not_err132, label %after_check133, label %voiderr134 + +after_check133: ; preds = %loop.body124 + br label %voiderr134 + +voiderr134: ; preds = %after_check133, %loop.body124 + %197 = load i64, i64* %.anon121, align 8 + %add135 = add i64 %197, 1 + store i64 %add135, i64* %.anon121, align 8 + br label %loop.cond122 + +loop.exit136: ; preds = %loop.cond122 + %198 = bitcast [7 x i32]* %b to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %198, i8* align 16 bitcast ([7 x i32]* @.__const.17 to i8*), i32 28, i1 false) + store i64 0, i64* %.anon137, align 8 + br label %loop.cond138 + +loop.cond138: ; preds = %voiderr150, %loop.exit136 + %199 = load i64, i64* %.anon137, align 8 + %gt139 = icmp ugt i64 7, %199 + br i1 %gt139, label %loop.body140, label %loop.exit152 + +loop.body140: ; preds = %loop.cond138 + %200 = load i64, i64* %.anon137, align 8 + store i64 %200, i64* %i141, align 8 + %201 = load i64, i64* %.anon137, align 8 + %202 = getelementptr inbounds [7 x i32], [7 x i32]* %b, i64 0, i64 %201 + %203 = load i32, i32* %202, align 4 + store i32 %203, i32* %x142, align 4 + %204 = bitcast i64* %i141 to i8* + %205 = insertvalue %variant undef, i8* %204, 0 + %206 = insertvalue %variant %205, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %207 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots144, i64 0, i64 0 + store %variant %206, %variant* %207, align 16 + %208 = bitcast i32* %x142 to i8* + %209 = insertvalue %variant undef, i8* %208, 0 + %210 = insertvalue %variant %209, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %211 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots144, i64 0, i64 1 + store %variant %210, %variant* %211, align 16 + %212 = bitcast [2 x %variant]* %varargslots144 to %variant* + %213 = insertvalue %"variant[]" undef, %variant* %212, 0 + %214 = insertvalue %"variant[]" %213, i64 2, 1 + store %"variant[]" %214, %"variant[]"* %taddr145, align 8 + %215 = bitcast %"variant[]"* %taddr145 to { i8*, i64 }* + %216 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %215, i32 0, i32 0 + %lo146 = load i8*, i8** %216, align 8 + %217 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %215, i32 0, i32 1 + %hi147 = load i64, i64* %217, align 8 + %218 = call i64 @std_io_printfn(i64* %retparam143, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.18, i32 0, i32 0), i64 8, i8* %lo146, i64 %hi147) + %not_err148 = icmp eq i64 %218, 0 + br i1 %not_err148, label %after_check149, label %voiderr150 + +after_check149: ; preds = %loop.body140 + br label %voiderr150 + +voiderr150: ; preds = %after_check149, %loop.body140 + %219 = load i64, i64* %.anon137, align 8 + %add151 = add i64 %219, 1 + store i64 %add151, i64* %.anon137, align 8 + br label %loop.cond138 + +loop.exit152: ; preds = %loop.cond138 + %220 = bitcast [8 x i32]* %c to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %220, i8* align 16 bitcast ([8 x i32]* @.__const.19 to i8*), i32 32, i1 false) + store i64 0, i64* %.anon153, align 8 + br label %loop.cond154 + +loop.cond154: ; preds = %voiderr166, %loop.exit152 + %221 = load i64, i64* %.anon153, align 8 + %gt155 = icmp ugt i64 8, %221 + br i1 %gt155, label %loop.body156, label %loop.exit168 + +loop.body156: ; preds = %loop.cond154 + %222 = load i64, i64* %.anon153, align 8 + store i64 %222, i64* %i157, align 8 + %223 = load i64, i64* %.anon153, align 8 + %224 = getelementptr inbounds [8 x i32], [8 x i32]* %c, i64 0, i64 %223 + %225 = load i32, i32* %224, align 4 + store i32 %225, i32* %x158, align 4 + %226 = bitcast i64* %i157 to i8* + %227 = insertvalue %variant undef, i8* %226, 0 + %228 = insertvalue %variant %227, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %229 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots160, i64 0, i64 0 + store %variant %228, %variant* %229, align 16 + %230 = bitcast i32* %x158 to i8* + %231 = insertvalue %variant undef, i8* %230, 0 + %232 = insertvalue %variant %231, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %233 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots160, i64 0, i64 1 + store %variant %232, %variant* %233, align 16 + %234 = bitcast [2 x %variant]* %varargslots160 to %variant* + %235 = insertvalue %"variant[]" undef, %variant* %234, 0 + %236 = insertvalue %"variant[]" %235, i64 2, 1 + store %"variant[]" %236, %"variant[]"* %taddr161, align 8 + %237 = bitcast %"variant[]"* %taddr161 to { i8*, i64 }* + %238 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %237, i32 0, i32 0 + %lo162 = load i8*, i8** %238, align 8 + %239 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %237, i32 0, i32 1 + %hi163 = load i64, i64* %239, align 8 + %240 = call i64 @std_io_printfn(i64* %retparam159, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.20, i32 0, i32 0), i64 9, i8* %lo162, i64 %hi163) + %not_err164 = icmp eq i64 %240, 0 + br i1 %not_err164, label %after_check165, label %voiderr166 + +after_check165: ; preds = %loop.body156 + br label %voiderr166 + +voiderr166: ; preds = %after_check165, %loop.body156 + %241 = load i64, i64* %.anon153, align 8 + %add167 = add i64 %241, 1 + store i64 %add167, i64* %.anon153, align 8 + br label %loop.cond154 + +loop.exit168: ; preds = %loop.cond154 + %242 = bitcast [6 x i32]* %a169 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %242, i8* align 16 bitcast ([6 x i32]* @.__const.21 to i8*), i32 24, i1 false) + store i64 0, i64* %.anon170, align 8 + br label %loop.cond171 + +loop.cond171: ; preds = %voiderr183, %loop.exit168 + %243 = load i64, i64* %.anon170, align 8 + %gt172 = icmp ugt i64 6, %243 + br i1 %gt172, label %loop.body173, label %loop.exit185 + +loop.body173: ; preds = %loop.cond171 + %244 = load i64, i64* %.anon170, align 8 + store i64 %244, i64* %i174, align 8 + %245 = load i64, i64* %.anon170, align 8 + %246 = getelementptr inbounds [6 x i32], [6 x i32]* %a169, i64 0, i64 %245 + %247 = load i32, i32* %246, align 4 + store i32 %247, i32* %x175, align 4 + %248 = bitcast i64* %i174 to i8* + %249 = insertvalue %variant undef, i8* %248, 0 + %250 = insertvalue %variant %249, i64 ptrtoint (%.introspect* @"ct$ulong" to i64), 1 + %251 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots177, i64 0, i64 0 + store %variant %250, %variant* %251, align 16 + %252 = bitcast i32* %x175 to i8* + %253 = insertvalue %variant undef, i8* %252, 0 + %254 = insertvalue %variant %253, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %255 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots177, i64 0, i64 1 + store %variant %254, %variant* %255, align 16 + %256 = bitcast [2 x %variant]* %varargslots177 to %variant* + %257 = insertvalue %"variant[]" undef, %variant* %256, 0 + %258 = insertvalue %"variant[]" %257, i64 2, 1 + store %"variant[]" %258, %"variant[]"* %taddr178, align 8 + %259 = bitcast %"variant[]"* %taddr178 to { i8*, i64 }* + %260 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %259, i32 0, i32 0 + %lo179 = load i8*, i8** %260, align 8 + %261 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %259, i32 0, i32 1 + %hi180 = load i64, i64* %261, align 8 + %262 = call i64 @std_io_printfn(i64* %retparam176, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.22, i32 0, i32 0), i64 6, i8* %lo179, i64 %hi180) + %not_err181 = icmp eq i64 %262, 0 + br i1 %not_err181, label %after_check182, label %voiderr183 + +after_check182: ; preds = %loop.body173 + br label %voiderr183 + +voiderr183: ; preds = %after_check182, %loop.body173 + %263 = load i64, i64* %.anon170, align 8 + %add184 = add i64 %263, 1 + store i64 %add184, i64* %.anon170, align 8 + br label %loop.cond171 + +loop.exit185: ; preds = %loop.cond171 + ret void +} + diff --git a/test/test_suite14/macros/macro_with_body.c3t b/test/test_suite14/macros/macro_with_body.c3t new file mode 100644 index 000000000..d15233bc8 --- /dev/null +++ b/test/test_suite14/macros/macro_with_body.c3t @@ -0,0 +1,108 @@ +module withbody; + + +extern fn int printf(char *, ...); + +struct Foo +{ + int x; +} + +fn int Foo.mutate(Foo *foo) +{ + printf("Mutating\n"); + return 10 * ++foo.x; +} + +macro @macro_with_body(foo, &x; @body(x, y)) +{ + x = foo.x; + @body(foo.mutate(), x); +} + +macro @repeat(int times; @body(x)) +{ + for (int i = 0; i < times; i++) + { + @body(i + 1); + } +} + +fn void main() +{ + Foo f = { 33 }; + int y; + @macro_with_body(f, y; int x, int dy) + { + printf("Got values %d, %d\n", x, dy); + }; + @repeat(10; int loop) + { + printf("Repeat %d\n", loop); + }; + +} + +/* #expect: withbody.ll + +define i32 @withbody_Foo_mutate(%Foo* %0) #0 { +entry: + %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0)) + %2 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 0 + %3 = load i32, i32* %2, align 8 + %add = add i32 %3, 1 + store i32 %add, i32* %2, align 8 + %mul = mul i32 10, %add + ret i32 %mul +} + +define void @withbody_main() #0 { +entry: + %f = alloca %Foo, align 4 + %y = alloca i32, align 4 + %foo = alloca %Foo, align 4 + %x = alloca i32, align 4 + %dy = alloca i32, align 4 + %times = alloca i32, align 4 + %i = alloca i32, align 4 + %loop = alloca i32, align 4 + %0 = bitcast %Foo* %f to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 4, i1 false) + store i32 0, i32* %y, align 4 + %1 = bitcast %Foo* %foo to i8* + %2 = bitcast %Foo* %f to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 %2, i32 4, i1 false) + %3 = getelementptr inbounds %Foo, %Foo* %foo, i32 0, i32 0 + %4 = load i32, i32* %3, align 4 + store i32 %4, i32* %y, align 4 + %5 = call i32 @withbody_Foo_mutate(%Foo* %foo) + store i32 %5, i32* %x, align 4 + %6 = load i32, i32* %y, align 4 + store i32 %6, i32* %dy, align 4 + %7 = load i32, i32* %x, align 4 + %8 = load i32, i32* %dy, align 4 + %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i32 %7, i32 %8) + store i32 10, i32* %times, align 4 + store i32 0, i32* %i, align 4 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %10 = load i32, i32* %i, align 4 + %11 = load i32, i32* %times, align 4 + %lt = icmp slt i32 %10, %11 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %12 = load i32, i32* %i, align 4 + %add = add i32 %12, 1 + store i32 %add, i32* %loop, align 4 + %13 = load i32, i32* %loop, align 4 + %14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %13) + %15 = load i32, i32* %i, align 4 + %add1 = add i32 %15, 1 + store i32 %add1, i32* %i, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + ret void +} diff --git a/test/test_suite2/macros/modify_ct_param.c3 b/test/test_suite14/macros/modify_ct_param.c3 similarity index 100% rename from test/test_suite2/macros/modify_ct_param.c3 rename to test/test_suite14/macros/modify_ct_param.c3 diff --git a/test/test_suite2/macros/no_body.c3 b/test/test_suite14/macros/no_body.c3 similarity index 100% rename from test/test_suite2/macros/no_body.c3 rename to test/test_suite14/macros/no_body.c3 diff --git a/test/test_suite2/macros/type_params.c3t b/test/test_suite14/macros/type_params.c3t similarity index 52% rename from test/test_suite2/macros/type_params.c3t rename to test/test_suite14/macros/type_params.c3t index 1430897b6..d364460be 100644 --- a/test/test_suite2/macros/type_params.c3t +++ b/test/test_suite14/macros/type_params.c3t @@ -26,17 +26,17 @@ fn void test() %a2 = alloca double, align 8 %z = alloca i16, align 2 %a3 = alloca i16, align 2 - store i32 0, ptr %a, align 4 - %0 = load i32, ptr %a, align 4 - store i32 %0, ptr %x, align 4 - store double 0.000000e+00, ptr %a1, align 8 - %1 = load double, ptr %a1, align 8 - store double %1, ptr %d, align 8 - store double 0.000000e+00, ptr %a2, align 8 - %2 = load double, ptr %a2, align 8 - store double %2, ptr %d2, align 8 - store i16 0, ptr %a3, align 2 - %3 = load i16, ptr %a3, align 2 - store i16 %3, ptr %z, align 2 + store i32 0, i32* %a, align 4 + %0 = load i32, i32* %a, align 4 + store i32 %0, i32* %x, align 4 + store double 0.000000e+00, double* %a1, align 8 + %1 = load double, double* %a1, align 8 + store double %1, double* %d, align 8 + store double 0.000000e+00, double* %a2, align 8 + %2 = load double, double* %a2, align 8 + store double %2, double* %d2, align 8 + store i16 0, i16* %a3, align 2 + %3 = load i16, i16* %a3, align 2 + store i16 %3, i16* %z, align 2 ret void } diff --git a/test/test_suite14/macros/userland_bitcast.c3t b/test/test_suite14/macros/userland_bitcast.c3t new file mode 100644 index 000000000..9816bbfc8 --- /dev/null +++ b/test/test_suite14/macros/userland_bitcast.c3t @@ -0,0 +1,344 @@ +// #target: macos-x64 + +macro testbitcast(expr, $Type) +{ + $assert($sizeof(expr) == $Type.sizeof, "Cannot bitcast between types of different size."); + $Type x = void; + var $size = (usz)($sizeof(expr)); + + $if ($alignof(expr) >= 8 && $Type.alignof >= 8): + ulong *b = (ulong*)(&expr); + ulong *to = (ulong*)(&x); + for (usz i = 0; i < $size; i += 8) + { + to[i] = b[i]; + } + $elif ($alignof(expr) >= 4 && $Type.alignof >= 4): + uint* b = (uint*)(&expr); + uint* to = (uint*)(&x); + for (usz i = 0; i < $size; i += 4) + { + to[i] = b[i]; + } + $elif ($alignof(expr) >= 2 && $Type.alignof >= 2): + ushort* b = (ushort*)(&expr); + ushort* to = (ushort*)(&x); + for (usz i = 0; i < $size; i += 2) + { + to[i] = b[i]; + } + $else: + char* b = (char*)(&expr); + char* to = (char*)(&x); + for (usz i = 0; i < $size; i++) + { + to[i] = b[i]; + } + $endif; + return x; +} + +extern fn void printf(char*, ...); + +struct Foo +{ + short a; + char b; + char c; + short d; + short e; +} + +fn ulong testFoo(short x) +{ + Foo z; + z.a = x; + return testbitcast(z, ulong); +} + +fn char[4] test(float x) +{ + return testbitcast(x, char[4]); +} + +fn void main() +{ + float f = 12.353; + int i = testbitcast(f, int); + float f2 = testbitcast(i, float); + printf("%f => %d => %f\n", f, i, f2); + double d = 12.353e267; + ulong l = testbitcast(d, ulong); + double d2 = testbitcast(d, double); + printf("%e => %llu => %e\n", d, l, d2); + +} + +/* #expect: userland_bitcast.ll + +%Foo = type { i16, i8, i8, i16, i16 } + +@"ct$userland_bitcast_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [16 x i8] c"%f => %d => %f\0A\00", align 1 +@.str.1 = private unnamed_addr constant [18 x i8] c"%e => %llu => %e\0A\00", align 1 + +define i64 @userland_bitcast_testFoo(i16 signext %0) #0 { +entry: + %z = alloca %Foo, align 2 + %expr = alloca %Foo, align 2 + %x = alloca i64, align 8 + %b = alloca i16*, align 8 + %to = alloca i16*, align 8 + %i = alloca i64, align 8 + %1 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0 + store i16 0, i16* %1, align 2 + %2 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 1 + store i8 0, i8* %2, align 2 + %3 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 2 + store i8 0, i8* %3, align 1 + %4 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 3 + store i16 0, i16* %4, align 2 + %5 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 4 + store i16 0, i16* %5, align 2 + %6 = getelementptr inbounds %Foo, %Foo* %z, i32 0, i32 0 + store i16 %0, i16* %6, align 2 + %7 = bitcast %Foo* %expr to i8* + %8 = bitcast %Foo* %z to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %7, i8* align 2 %8, i32 8, i1 false) + %ptrptr = bitcast %Foo* %expr to i16* + store i16* %ptrptr, i16** %b, align 8 + %ptrptr1 = bitcast i64* %x to i16* + store i16* %ptrptr1, i16** %to, align 8 + store i64 0, i64* %i, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %9 = load i64, i64* %i, align 8 + %lt = icmp ult i64 %9, 8 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %10 = load i16*, i16** %to, align 8 + %11 = load i64, i64* %i, align 8 + %ptroffset = getelementptr inbounds i16, i16* %10, i64 %11 + %12 = load i16*, i16** %b, align 8 + %13 = load i64, i64* %i, align 8 + %ptroffset2 = getelementptr inbounds i16, i16* %12, i64 %13 + %14 = load i16, i16* %ptroffset2, align 2 + store i16 %14, i16* %ptroffset, align 2 + %15 = load i64, i64* %i, align 8 + %add = add i64 %15, 2 + store i64 %add, i64* %i, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %16 = load i64, i64* %x, align 8 + ret i64 %16 +} + +; Function Attrs: nounwind +define i32 @userland_bitcast_test(float %0) #0 { +entry: + %expr = alloca float, align 4 + %x = alloca [4 x i8], align 1 + %b = alloca i8*, align 8 + %to = alloca i8*, align 8 + %i = alloca i64, align 8 + store float %0, float* %expr, align 4 + %ptrptr = bitcast float* %expr to i8* + store i8* %ptrptr, i8** %b, align 8 + %ptrptr1 = bitcast [4 x i8]* %x to i8* + store i8* %ptrptr1, i8** %to, align 8 + store i64 0, i64* %i, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %1 = load i64, i64* %i, align 8 + %lt = icmp ult i64 %1, 4 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %2 = load i8*, i8** %to, align 8 + %3 = load i64, i64* %i, align 8 + %ptroffset = getelementptr inbounds i8, i8* %2, i64 %3 + %4 = load i8*, i8** %b, align 8 + %5 = load i64, i64* %i, align 8 + %ptroffset2 = getelementptr inbounds i8, i8* %4, i64 %5 + %6 = load i8, i8* %ptroffset2, align 1 + store i8 %6, i8* %ptroffset, align 1 + %7 = load i64, i64* %i, align 8 + %add = add i64 %7, 1 + store i64 %add, i64* %i, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %8 = bitcast [4 x i8]* %x to i32* + %9 = load i32, i32* %8, align 1 + ret i32 %9 +} + +; Function Attrs: nounwind +define void @userland_bitcast_main() #0 { +entry: + %f = alloca float, align 4 + %i = alloca i32, align 4 + %expr = alloca float, align 4 + %x = alloca i32, align 4 + %b = alloca i32*, align 8 + %to = alloca i32*, align 8 + %i1 = alloca i64, align 8 + %f2 = alloca float, align 4 + %expr3 = alloca i32, align 4 + %x4 = alloca float, align 4 + %b5 = alloca i32*, align 8 + %to6 = alloca i32*, align 8 + %i8 = alloca i64, align 8 + %d = alloca double, align 8 + %l = alloca i64, align 8 + %expr17 = alloca double, align 8 + %x18 = alloca i64, align 8 + %b19 = alloca i64*, align 8 + %to21 = alloca i64*, align 8 + %i22 = alloca i64, align 8 + %d2 = alloca double, align 8 + %expr30 = alloca double, align 8 + %x31 = alloca double, align 8 + %b32 = alloca i64*, align 8 + %to34 = alloca i64*, align 8 + %i36 = alloca i64, align 8 + store float 0x4028B4BC60000000, float* %f, align 4 + %0 = load float, float* %f, align 4 + store float %0, float* %expr, align 4 + %ptrptr = bitcast float* %expr to i32* + store i32* %ptrptr, i32** %b, align 8 + store i32* %x, i32** %to, align 8 + store i64 0, i64* %i1, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %1 = load i64, i64* %i1, align 8 + %lt = icmp ult i64 %1, 4 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %2 = load i32*, i32** %to, align 8 + %3 = load i64, i64* %i1, align 8 + %ptroffset = getelementptr inbounds i32, i32* %2, i64 %3 + %4 = load i32*, i32** %b, align 8 + %5 = load i64, i64* %i1, align 8 + %ptroffset2 = getelementptr inbounds i32, i32* %4, i64 %5 + %6 = load i32, i32* %ptroffset2, align 4 + store i32 %6, i32* %ptroffset, align 4 + %7 = load i64, i64* %i1, align 8 + %add = add i64 %7, 4 + store i64 %add, i64* %i1, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %8 = load i32, i32* %x, align 4 + store i32 %8, i32* %i, align 4 + %9 = load i32, i32* %i, align 4 + store i32 %9, i32* %expr3, align 4 + store i32* %expr3, i32** %b5, align 8 + %ptrptr7 = bitcast float* %x4 to i32* + store i32* %ptrptr7, i32** %to6, align 8 + store i64 0, i64* %i8, align 8 + br label %loop.cond9 + +loop.cond9: ; preds = %loop.body11, %loop.exit + %10 = load i64, i64* %i8, align 8 + %lt10 = icmp ult i64 %10, 4 + br i1 %lt10, label %loop.body11, label %loop.exit15 + +loop.body11: ; preds = %loop.cond9 + %11 = load i32*, i32** %to6, align 8 + %12 = load i64, i64* %i8, align 8 + %ptroffset12 = getelementptr inbounds i32, i32* %11, i64 %12 + %13 = load i32*, i32** %b5, align 8 + %14 = load i64, i64* %i8, align 8 + %ptroffset13 = getelementptr inbounds i32, i32* %13, i64 %14 + %15 = load i32, i32* %ptroffset13, align 4 + store i32 %15, i32* %ptroffset12, align 4 + %16 = load i64, i64* %i8, align 8 + %add14 = add i64 %16, 4 + store i64 %add14, i64* %i8, align 8 + br label %loop.cond9 + +loop.exit15: ; preds = %loop.cond9 + %17 = load float, float* %x4, align 4 + store float %17, float* %f2, align 4 + %18 = load float, float* %f, align 4 + %fpfpext = fpext float %18 to double + %19 = load i32, i32* %i, align 4 + %20 = load float, float* %f2, align 4 + %fpfpext16 = fpext float %20 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i32 0, i32 0), double %fpfpext, i32 %19, double %fpfpext16) + store double 1.235300e+268, double* %d, align 8 + %21 = load double, double* %d, align 8 + store double %21, double* %expr17, align 8 + %ptrptr20 = bitcast double* %expr17 to i64* + store i64* %ptrptr20, i64** %b19, align 8 + store i64* %x18, i64** %to21, align 8 + store i64 0, i64* %i22, align 8 + br label %loop.cond23 + +loop.cond23: ; preds = %loop.body25, %loop.exit15 + %22 = load i64, i64* %i22, align 8 + %lt24 = icmp ult i64 %22, 8 + br i1 %lt24, label %loop.body25, label %loop.exit29 + +loop.body25: ; preds = %loop.cond23 + %23 = load i64*, i64** %to21, align 8 + %24 = load i64, i64* %i22, align 8 + %ptroffset26 = getelementptr inbounds i64, i64* %23, i64 %24 + %25 = load i64*, i64** %b19, align 8 + %26 = load i64, i64* %i22, align 8 + %ptroffset27 = getelementptr inbounds i64, i64* %25, i64 %26 + %27 = load i64, i64* %ptroffset27, align 8 + store i64 %27, i64* %ptroffset26, align 8 + %28 = load i64, i64* %i22, align 8 + %add28 = add i64 %28, 8 + store i64 %add28, i64* %i22, align 8 + br label %loop.cond23 + +loop.exit29: ; preds = %loop.cond23 + %29 = load i64, i64* %x18, align 8 + store i64 %29, i64* %l, align 8 + %30 = load double, double* %d, align 8 + store double %30, double* %expr30, align 8 + %ptrptr33 = bitcast double* %expr30 to i64* + store i64* %ptrptr33, i64** %b32, align 8 + %ptrptr35 = bitcast double* %x31 to i64* + store i64* %ptrptr35, i64** %to34, align 8 + store i64 0, i64* %i36, align 8 + br label %loop.cond37 + +loop.cond37: ; preds = %loop.body39, %loop.exit29 + %31 = load i64, i64* %i36, align 8 + %lt38 = icmp ult i64 %31, 8 + br i1 %lt38, label %loop.body39, label %loop.exit43 + +loop.body39: ; preds = %loop.cond37 + %32 = load i64*, i64** %to34, align 8 + %33 = load i64, i64* %i36, align 8 + %ptroffset40 = getelementptr inbounds i64, i64* %32, i64 %33 + %34 = load i64*, i64** %b32, align 8 + %35 = load i64, i64* %i36, align 8 + %ptroffset41 = getelementptr inbounds i64, i64* %34, i64 %35 + %36 = load i64, i64* %ptroffset41, align 8 + store i64 %36, i64* %ptroffset40, align 8 + %37 = load i64, i64* %i36, align 8 + %add42 = add i64 %37, 8 + store i64 %add42, i64* %i36, align 8 + br label %loop.cond37 + +loop.exit43: ; preds = %loop.cond37 + %38 = load double, double* %x31, align 8 + store double %38, double* %d2, align 8 + %39 = load double, double* %d, align 8 + %40 = load i64, i64* %l, align 8 + %41 = load double, double* %d2, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.1, i32 0, i32 0), double %39, i64 %40, double %41) + ret void +} + diff --git a/test/test_suite2/methods/access.c3 b/test/test_suite14/methods/access.c3 similarity index 100% rename from test/test_suite2/methods/access.c3 rename to test/test_suite14/methods/access.c3 diff --git a/test/test_suite2/methods/enum_distinct_err_methods.c3t b/test/test_suite14/methods/enum_distinct_err_methods.c3t similarity index 50% rename from test/test_suite2/methods/enum_distinct_err_methods.c3t rename to test/test_suite14/methods/enum_distinct_err_methods.c3t index dd1127d7d..fa30379b2 100644 --- a/test/test_suite2/methods/enum_distinct_err_methods.c3t +++ b/test/test_suite14/methods/enum_distinct_err_methods.c3t @@ -43,21 +43,21 @@ fn int main() /* #expect: foo.ll -define void @foo_Foo_hello(ptr %0) #0 { +define void @foo_Foo_hello(i64* %0) #0 { entry: - %1 = call i32 @std_io_println(ptr @.str) #1 + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0)) #1 ret void } -define void @foo_Bar_hello(ptr %0) #0 { +define void @foo_Bar_hello(i32* %0) #0 { entry: - %1 = call i32 @std_io_println(ptr @.str.1) #1 + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i32 0, i32 0)) #1 ret void } -define void @foo_MyEnum_hello(ptr %0) #0 { +define void @foo_MyEnum_hello(i32* %0) #0 { entry: - %1 = call i32 @std_io_println(ptr @.str.2) #1 + %1 = call i32 @std_io_println(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.2, i32 0, i32 0)) #1 ret void } @@ -66,11 +66,11 @@ entry: %f = alloca i64, align 8 %b = alloca i32, align 4 %a = alloca i32, align 4 - store i64 0, ptr %f, align 8 - store i32 0, ptr %b, align 4 - store i32 0, ptr %a, align 4 - call void @foo_Foo_hello(ptr %f) - call void @foo_Bar_hello(ptr %b) - call void @foo_MyEnum_hello(ptr %a) + store i64 0, i64* %f, align 8 + store i32 0, i32* %b, align 4 + store i32 0, i32* %a, align 4 + call void @foo_Foo_hello(i64* %f) + call void @foo_Bar_hello(i32* %b) + call void @foo_MyEnum_hello(i32* %a) ret i32 0 } diff --git a/test/test_suite2/methods/extension_method.c3t b/test/test_suite14/methods/extension_method.c3t similarity index 64% rename from test/test_suite2/methods/extension_method.c3t rename to test/test_suite14/methods/extension_method.c3t index 4e795cbc1..c1a3a9a02 100644 --- a/test/test_suite2/methods/extension_method.c3t +++ b/test/test_suite14/methods/extension_method.c3t @@ -25,16 +25,15 @@ fn int main() return 0; } -/* #expect: abc.ll +// #expect: abc.ll -%Bar = type { i32 } -define i32 @main() #0 { +define i32 @main() entry: %bar = alloca %Bar, align 4 - store i32 0, ptr %bar, align 4 - call void @foo_Bar_test(ptr %bar) + %0 = bitcast %Bar* %bar to i32* + store i32 0, i32* %0, align 4 + call void @foo_Bar_test(%Bar* %bar) ret i32 0 -} -declare void @foo_Bar_test(ptr) +declare void @foo_Bar_test(%Bar*) diff --git a/test/test_suite2/methods/extension_method_already_exist.c3 b/test/test_suite14/methods/extension_method_already_exist.c3 similarity index 100% rename from test/test_suite2/methods/extension_method_already_exist.c3 rename to test/test_suite14/methods/extension_method_already_exist.c3 diff --git a/test/test_suite2/methods/extension_method_generic.c3 b/test/test_suite14/methods/extension_method_generic.c3 similarity index 100% rename from test/test_suite2/methods/extension_method_generic.c3 rename to test/test_suite14/methods/extension_method_generic.c3 diff --git a/test/test_suite2/methods/extension_method_in_other_modules.c3t b/test/test_suite14/methods/extension_method_in_other_modules.c3t similarity index 60% rename from test/test_suite2/methods/extension_method_in_other_modules.c3t rename to test/test_suite14/methods/extension_method_in_other_modules.c3t index d890ade5f..771549b60 100644 --- a/test/test_suite2/methods/extension_method_in_other_modules.c3t +++ b/test/test_suite14/methods/extension_method_in_other_modules.c3t @@ -20,14 +20,14 @@ fn void main() /* #expect: foob.ll -define void @foob_Foo_test(ptr %0) #0 { +define void @foob_Foo_test(%Foo* %0) #0 { entry: ret void } // #expect: baz.ll -define void @foob_Foo_test2(ptr %0, i32 %1) #0 { +define void @foob_Foo_test2(%Foo* %0, i32 %1) #0 { entry: ret void } @@ -35,8 +35,9 @@ entry: define void @baz_main() #0 { entry: %f = alloca %Foo, align 4 - store i32 0, ptr %f, align 4 - call void @foob_Foo_test(ptr %f) - call void @foob_Foo_test2(ptr %f, i32 123) + %0 = bitcast %Foo* %f to i32* + store i32 0, i32* %0, align 4 + call void @foob_Foo_test(%Foo* %f) + call void @foob_Foo_test2(%Foo* %f, i32 123) ret void } diff --git a/test/test_suite2/methods/methods_defined_twice.c3 b/test/test_suite14/methods/methods_defined_twice.c3 similarity index 100% rename from test/test_suite2/methods/methods_defined_twice.c3 rename to test/test_suite14/methods/methods_defined_twice.c3 diff --git a/test/test_suite2/module/missing_semi.c3 b/test/test_suite14/module/missing_semi.c3 similarity index 100% rename from test/test_suite2/module/missing_semi.c3 rename to test/test_suite14/module/missing_semi.c3 diff --git a/test/test_suite2/module/module_bad_path_ident.c3 b/test/test_suite14/module/module_bad_path_ident.c3 similarity index 100% rename from test/test_suite2/module/module_bad_path_ident.c3 rename to test/test_suite14/module/module_bad_path_ident.c3 diff --git a/test/test_suite2/module/module_bad_path_invalid.c3 b/test/test_suite14/module/module_bad_path_invalid.c3 similarity index 100% rename from test/test_suite2/module/module_bad_path_invalid.c3 rename to test/test_suite14/module/module_bad_path_invalid.c3 diff --git a/test/test_suite2/module/module_bad_path_keyword.c3 b/test/test_suite14/module/module_bad_path_keyword.c3 similarity index 100% rename from test/test_suite2/module/module_bad_path_keyword.c3 rename to test/test_suite14/module/module_bad_path_keyword.c3 diff --git a/test/test_suite2/module/module_error_string.c3 b/test/test_suite14/module/module_error_string.c3 similarity index 100% rename from test/test_suite2/module/module_error_string.c3 rename to test/test_suite14/module/module_error_string.c3 diff --git a/test/test_suite2/module/module_start_bad_ident.c3 b/test/test_suite14/module/module_start_bad_ident.c3 similarity index 100% rename from test/test_suite2/module/module_start_bad_ident.c3 rename to test/test_suite14/module/module_start_bad_ident.c3 diff --git a/test/test_suite2/module/module_start_invalid.c3 b/test/test_suite14/module/module_start_invalid.c3 similarity index 100% rename from test/test_suite2/module/module_start_invalid.c3 rename to test/test_suite14/module/module_start_invalid.c3 diff --git a/test/test_suite2/module/module_start_keyword.c3 b/test/test_suite14/module/module_start_keyword.c3 similarity index 100% rename from test/test_suite2/module/module_start_keyword.c3 rename to test/test_suite14/module/module_start_keyword.c3 diff --git a/test/test_suite2/module/private_module.c3 b/test/test_suite14/module/private_module.c3 similarity index 100% rename from test/test_suite2/module/private_module.c3 rename to test/test_suite14/module/private_module.c3 diff --git a/test/test_suite2/module/unknown_modules.c3 b/test/test_suite14/module/unknown_modules.c3 similarity index 100% rename from test/test_suite2/module/unknown_modules.c3 rename to test/test_suite14/module/unknown_modules.c3 diff --git a/test/test_suite14/overloading/set_overload.c3t b/test/test_suite14/overloading/set_overload.c3t new file mode 100644 index 000000000..88d086303 --- /dev/null +++ b/test/test_suite14/overloading/set_overload.c3t @@ -0,0 +1,25 @@ +// #target: macos-x64 + +module test; +import std::map; + +define IntMap = HashMap; + +fn void main() +{ + IntMap map; + map.set("Hello", 4); + map["Bye"] = 5; +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %map = alloca %HashMap, align 8 + %0 = bitcast %HashMap* %map to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 40, i1 false) + %1 = call i8 @"std_map$$sa$char.int_HashMap_set"(%HashMap* %map, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i32 4) + %2 = call i8 @"std_map$$sa$char.int_HashMap_set"(%HashMap* %map, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3, i32 5) + ret void +} diff --git a/test/test_suite14/pointers/array_pointer_decay.c3t b/test/test_suite14/pointers/array_pointer_decay.c3t new file mode 100644 index 000000000..377c1c4b3 --- /dev/null +++ b/test/test_suite14/pointers/array_pointer_decay.c3t @@ -0,0 +1,84 @@ +// #target: macos-x64 +module foo; +extern fn void printf(char*, ...); + +fn void main() +{ + int[3] x; + int[3]* y = &x; + int* z = y; + int[] sub = y; + int[3] y1 = y[1]; + int z1 = z[1]; + int* xx = &x + 1; + int[3]* yy = (int[3]*)(xx); + int* zz = yy - 1; + printf("%p = %p = %p, %p = %p\n", y, z, zz, &(*y)[1], xx); + x[1] = 123; + printf("%d = %d\n", x[1], z[1]); +} + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %x = alloca [3 x i32], align 4 + %y = alloca [3 x i32]*, align 8 + %z = alloca i32*, align 8 + %sub = alloca %"int[]", align 8 + %y1 = alloca [3 x i32], align 4 + %z1 = alloca i32, align 4 + %xx = alloca i32*, align 8 + %yy = alloca [3 x i32]*, align 8 + %zz = alloca i32*, align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 + store i32 0, i32* %2, align 4 + store [3 x i32]* %x, [3 x i32]** %y, align 8 + %3 = load [3 x i32]*, [3 x i32]** %y, align 8 + %ptrptr = bitcast [3 x i32]* %3 to i32* + store i32* %ptrptr, i32** %z, align 8 + %4 = load [3 x i32]*, [3 x i32]** %y, align 8 + %5 = bitcast [3 x i32]* %4 to i32* + %6 = insertvalue %"int[]" undef, i32* %5, 0 + %7 = insertvalue %"int[]" %6, i64 3, 1 + store %"int[]" %7, %"int[]"* %sub, align 8 + %8 = load [3 x i32]*, [3 x i32]** %y, align 8 + %ptroffset = getelementptr inbounds [3 x i32], [3 x i32]* %8, i64 1 + %9 = bitcast [3 x i32]* %y1 to i8* + %10 = bitcast [3 x i32]* %ptroffset to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 4 %10, i32 12, i1 false) + %11 = load i32*, i32** %z, align 8 + %ptroffset1 = getelementptr inbounds i32, i32* %11, i64 1 + %12 = load i32, i32* %ptroffset1, align 4 + store i32 %12, i32* %z1, align 4 + %ptrptr2 = bitcast [3 x i32]* %x to i32* + %ptroffset3 = getelementptr i32, i32* %ptrptr2, i64 1 + store i32* %ptroffset3, i32** %xx, align 8 + %13 = load i32*, i32** %xx, align 8 + %ptrptr4 = bitcast i32* %13 to [3 x i32]* + store [3 x i32]* %ptrptr4, [3 x i32]** %yy, align 8 + %14 = load [3 x i32]*, [3 x i32]** %yy, align 8 + %ptrptr5 = bitcast [3 x i32]* %14 to i32* + %ptroffset6 = getelementptr i32, i32* %ptrptr5, i64 -1 + store i32* %ptroffset6, i32** %zz, align 8 + %15 = load [3 x i32]*, [3 x i32]** %y, align 8 + %16 = load i32*, i32** %z, align 8 + %17 = load i32*, i32** %zz, align 8 + %18 = load [3 x i32]*, [3 x i32]** %y, align 8 + %19 = getelementptr inbounds [3 x i32], [3 x i32]* %18, i64 0, i64 1 + %20 = load i32*, i32** %xx, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0), [3 x i32]* %15, i32* %16, i32* %17, i32* %19, i32* %20) + %21 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + store i32 123, i32* %21, align 4 + %22 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + %23 = load i32, i32* %22, align 4 + %24 = load i32*, i32** %z, align 8 + %ptroffset7 = getelementptr inbounds i32, i32* %24, i64 1 + %25 = load i32, i32* %ptroffset7, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0), i32 %23, i32 %25) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/pointers/const_pointer.c3t b/test/test_suite14/pointers/const_pointer.c3t similarity index 64% rename from test/test_suite2/pointers/const_pointer.c3t rename to test/test_suite14/pointers/const_pointer.c3t index b8feacb81..3bbc0fa69 100644 --- a/test/test_suite2/pointers/const_pointer.c3t +++ b/test/test_suite14/pointers/const_pointer.c3t @@ -13,4 +13,4 @@ private void*[3] data = { &foo, &bar, &xx }; @const_pointer_foo = protected global double 1.700000e+01, align 8 @const_pointer_bar = protected global double 1.200000e+01, align 8 @const_pointer_xx = protected global float 1.200000e+01, align 4 -@const_pointer_data = protected unnamed_addr global [3 x ptr] [ptr @const_pointer_foo, ptr @const_pointer_bar, ptr @const_pointer_xx], align 16 +@const_pointer_data = protected unnamed_addr global [3 x i8*] [i8* bitcast (double* @const_pointer_foo to i8*), i8* bitcast (double* @const_pointer_bar to i8*), i8* bitcast (float* @const_pointer_xx to i8*)], align 16 diff --git a/test/test_suite14/pointers/pointer_index.c3t b/test/test_suite14/pointers/pointer_index.c3t new file mode 100644 index 000000000..13b7aa314 --- /dev/null +++ b/test/test_suite14/pointers/pointer_index.c3t @@ -0,0 +1,78 @@ +module pointer_index; + +fn void test1(int* x) +{ + int a = x[0]; + int b = *x; + int c = x[1]; + int d = x[-1]; +} + +fn void test2(char* x) +{ + char a = x[0]; + char b = *x; + char c = x[1]; +} + +fn void test3(long* x) +{ + long a = x[0]; + long b = *x; + long c = x[1]; +} + +// #expect: pointer_index.ll + +define void @pointer_index_test1(i32* %0) #0 { +entry: + %a = alloca i32, align 4 + %b = alloca i32, align 4 + %c = alloca i32, align 4 + %d = alloca i32, align 4 + %ptroffset = getelementptr inbounds i32, i32* %0, i64 0 + %1 = load i32, i32* %ptroffset, align 4 + store i32 %1, i32* %a, align 4 + %2 = load i32, i32* %0, align 8 + store i32 %2, i32* %b, align 4 + %ptroffset1 = getelementptr inbounds i32, i32* %0, i64 1 + %3 = load i32, i32* %ptroffset1, align 4 + store i32 %3, i32* %c, align 4 + %ptroffset2 = getelementptr inbounds i32, i32* %0, i64 -1 + %4 = load i32, i32* %ptroffset2, align 4 + store i32 %4, i32* %d, align 4 + ret void +} + +; Function Attrs: nounwind +define void @pointer_index_test2(i8* %0) #0 { +entry: + %a = alloca i8, align 1 + %b = alloca i8, align 1 + %c = alloca i8, align 1 + %ptroffset = getelementptr inbounds i8, i8* %0, i64 0 + %1 = load i8, i8* %ptroffset, align 1 + store i8 %1, i8* %a, align 1 + %2 = load i8, i8* %0, align 8 + store i8 %2, i8* %b, align 1 + %ptroffset1 = getelementptr inbounds i8, i8* %0, i64 1 + %3 = load i8, i8* %ptroffset1, align 1 + store i8 %3, i8* %c, align 1 + ret void +} + +define void @pointer_index_test3(i64* %0) #0 { +entry: + %a = alloca i64, align 8 + %b = alloca i64, align 8 + %c = alloca i64, align 8 + %ptroffset = getelementptr inbounds i64, i64* %0, i64 0 + %1 = load i64, i64* %ptroffset, align 8 + store i64 %1, i64* %a, align 8 + %2 = load i64, i64* %0, align 8 + store i64 %2, i64* %b, align 8 + %ptroffset1 = getelementptr inbounds i64, i64* %0, i64 1 + %3 = load i64, i64* %ptroffset1, align 8 + store i64 %3, i64* %c, align 8 + ret void +} diff --git a/test/test_suite14/pointers/subarray_variant_to_ptr.c3t b/test/test_suite14/pointers/subarray_variant_to_ptr.c3t new file mode 100644 index 000000000..6b9841930 --- /dev/null +++ b/test/test_suite14/pointers/subarray_variant_to_ptr.c3t @@ -0,0 +1,105 @@ +// #target: macos-x64 +module foo; + +extern fn void printf(char*, ...); + +fn void test1(variant z) +{ + int* w = z.ptr; + printf("%d\n", *w); +} + +fn void test2(int[] z) +{ + int* w = z.ptr; + printf("%d\n", *w); +} + +fn void main() +{ + int x = 123; + int y = 293483; + int[2] w = { 144, 772 }; + test1(&x); + test2(w[..]); +} + +/* #expect: foo.ll + +%variant = type { i8*, i64 } +%"int[]" = type { i32*, i64 } + +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @foo_test1(i64 %0, i8* %1) #0 { +entry: + %z = alloca %variant, align 8 + %w = alloca i32*, align 8 + %pair = bitcast %variant* %z to { i64, i8* }* + %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 + store i8* %1, i8** %3, align 8 + %4 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 + %5 = load i8*, i8** %4, align 8 + %ptrptr = bitcast i8* %5 to i32* + store i32* %ptrptr, i32** %w, align 8 + %6 = load i32*, i32** %w, align 8 + %7 = load i32, i32* %6, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %7) + ret void +} + +; Function Attrs: nounwind +define void @foo_test2(i8* %0, i64 %1) #0 { +entry: + %z = alloca %"int[]", align 8 + %w = alloca i32*, align 8 + %pair = bitcast %"int[]"* %z to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + %4 = getelementptr inbounds %"int[]", %"int[]"* %z, i32 0, i32 0 + %5 = load i32*, i32** %4, align 8 + store i32* %5, i32** %w, align 8 + %6 = load i32*, i32** %w, align 8 + %7 = load i32, i32* %6, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 %7) + ret void +} + +; Function Attrs: nounwind +define void @foo_main() #0 { +entry: + %x = alloca i32, align 4 + %y = alloca i32, align 4 + %w = alloca [2 x i32], align 4 + %taddr = alloca %variant, align 8 + %taddr1 = alloca %"int[]", align 8 + store i32 123, i32* %x, align 4 + store i32 293483, i32* %y, align 4 + %0 = bitcast [2 x i32]* %w to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([2 x i32]* @.__const to i8*), i32 8, i1 false) + %1 = bitcast i32* %x to i8* + %2 = insertvalue %variant undef, i8* %1, 0 + %3 = insertvalue %variant %2, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %3, %variant* %taddr, align 8 + %4 = bitcast %variant* %taddr to { i64, i8* }* + %5 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %4, i32 0, i32 0 + %lo = load i64, i64* %5, align 8 + %6 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %4, i32 0, i32 1 + %hi = load i8*, i8** %6, align 8 + call void @foo_test1(i64 %lo, i8* %hi) + %7 = getelementptr inbounds [2 x i32], [2 x i32]* %w, i64 0, i64 0 + %8 = insertvalue %"int[]" undef, i32* %7, 0 + %9 = insertvalue %"int[]" %8, i64 2, 1 + store %"int[]" %9, %"int[]"* %taddr1, align 8 + %10 = bitcast %"int[]"* %taddr1 to { i8*, i64 }* + %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %10, i32 0, i32 0 + %lo2 = load i8*, i8** %11, align 8 + %12 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %10, i32 0, i32 1 + %hi3 = load i64, i64* %12, align 8 + call void @foo_test2(i8* %lo2, i64 %hi3) + ret void +} \ No newline at end of file diff --git a/test/test_suite2/precedence/required_parens.c3 b/test/test_suite14/precedence/required_parens.c3 similarity index 100% rename from test/test_suite2/precedence/required_parens.c3 rename to test/test_suite14/precedence/required_parens.c3 diff --git a/test/test_suite2/regression/crash_on_right_paren_macro.c3 b/test/test_suite14/regression/crash_on_right_paren_macro.c3 similarity index 100% rename from test/test_suite2/regression/crash_on_right_paren_macro.c3 rename to test/test_suite14/regression/crash_on_right_paren_macro.c3 diff --git a/test/test_suite14/safe/deref.c3t b/test/test_suite14/safe/deref.c3t new file mode 100644 index 000000000..8929aa549 --- /dev/null +++ b/test/test_suite14/safe/deref.c3t @@ -0,0 +1,31 @@ +// #safe: yes +// #target: macos-x64 +module foo; + +fn void main() +{ + int* x; + int y = *x; +} + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %x = alloca i32*, align 8 + %y = alloca i32, align 4 + store i32* null, i32** %x, align 8 + %0 = load i32*, i32** %x, align 8 + %checknull = icmp eq i32* %0, null + br i1 %checknull, label %panic, label %checkok + +panic: ; preds = %entry + %1 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %1(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.file, i64 0, i64 0), i64 8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4, i32 6) + br label %checkok + +checkok: ; preds = %panic, %entry + %2 = load i32, i32* %0, align 8 + store i32 %2, i32* %y, align 4 + ret void +} diff --git a/test/test_suite14/slices/slice_assign.c3t b/test/test_suite14/slices/slice_assign.c3t new file mode 100644 index 000000000..f89d4f9a4 --- /dev/null +++ b/test/test_suite14/slices/slice_assign.c3t @@ -0,0 +1,79 @@ +// #target: macos-x64 +module test; + +extern fn void printf(char*, ...); + +fn void main() +{ + int[8] x; + x[0..1] = 3; + x[1..2] = 5; + x[5..7] = 52; + foreach (i : x) + { + printf("%d\n", i); + } + x[0..7] = 123; +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %x = alloca [8 x i32], align 16 + %.anon = alloca i64, align 8 + %i = alloca i32, align 4 + %0 = bitcast [8 x i32]* %x to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 32, i1 false) + %1 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 0 + store i32 3, i32* %1, align 4 + %2 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 1 + store i32 3, i32* %2, align 4 + %3 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 1 + store i32 5, i32* %3, align 4 + %4 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 2 + store i32 5, i32* %4, align 4 + %5 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 5 + store i32 52, i32* %5, align 4 + %6 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 6 + store i32 52, i32* %6, align 4 + %7 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 7 + store i32 52, i32* %7, align 4 + store i64 0, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %8 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 8, %8 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %9 = load i64, i64* %.anon, align 8 + %10 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %9 + %11 = load i32, i32* %10, align 4 + store i32 %11, i32* %i, align 4 + %12 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %12) + %13 = load i64, i64* %.anon, align 8 + %add = add i64 %13, 1 + store i64 %add, i64* %.anon, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + br label %cond + +cond: ; preds = %assign, %loop.exit + %14 = phi i64 [ 0, %loop.exit ], [ %add1, %assign ] + %lt = icmp slt i64 %14, 8 + br i1 %lt, label %assign, label %exit + +assign: ; preds = %cond + %15 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %14 + store i32 123, i32* %15, align 4 + %add1 = add i64 %14, 1 + br label %cond + +exit: ; preds = %cond + ret void +} + diff --git a/test/test_suite14/slices/slice_to_slice_assign.c3t b/test/test_suite14/slices/slice_to_slice_assign.c3t new file mode 100644 index 000000000..3ba7e642f --- /dev/null +++ b/test/test_suite14/slices/slice_to_slice_assign.c3t @@ -0,0 +1,254 @@ +// #target: macos-x64 +module test; +import std::io; + +fn void main() +{ + int[*] z = { 1, 2, 3, 4, 5, 6, 7 }; + int[6] y; + y[1..3] = z[3..5]; + io::printfn("%s %s", y, z); + y[4..] = z[5..6]; + io::printfn("%s %s", y, z); + int[][] a = { int[] { 1 } }; + int[][] b = { int[] { 2 } }; + io::printfn("%s", a); + a[0..0] = b[0..0]; + io::printfn("%s", a); + a[0..0] = y[2..4]; + io::printfn("%s", a); +} +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %z = alloca [7 x i32], align 16 + %y = alloca [6 x i32], align 16 + %taddr = alloca %"int[]", align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [2 x %variant], align 16 + %taddr1 = alloca %"variant[]", align 8 + %taddr2 = alloca %"int[]", align 8 + %retparam3 = alloca i64, align 8 + %varargslots4 = alloca [2 x %variant], align 16 + %taddr5 = alloca %"variant[]", align 8 + %a = alloca %"int[][]", align 8 + %literal = alloca [1 x %"int[]"], align 16 + %literal11 = alloca [1 x i32], align 4 + %b = alloca %"int[][]", align 8 + %literal12 = alloca [1 x %"int[]"], align 16 + %literal13 = alloca [1 x i32], align 4 + %retparam14 = alloca i64, align 8 + %varargslots15 = alloca [1 x %variant], align 16 + %taddr16 = alloca %"variant[]", align 8 + %taddr23 = alloca %"int[][]", align 8 + %retparam24 = alloca i64, align 8 + %varargslots25 = alloca [1 x %variant], align 16 + %taddr26 = alloca %"variant[]", align 8 + %retparam33 = alloca i64, align 8 + %varargslots34 = alloca [1 x %variant], align 16 + %taddr35 = alloca %"variant[]", align 8 + %0 = bitcast [7 x i32]* %z to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %0, i8* align 16 bitcast ([7 x i32]* @.__const to i8*), i32 28, i1 false) + %1 = bitcast [6 x i32]* %y to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %1, i8 0, i64 24, i1 false) + %2 = getelementptr inbounds [7 x i32], [7 x i32]* %z, i64 0, i64 3 + %3 = insertvalue %"int[]" undef, i32* %2, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + %5 = getelementptr inbounds [6 x i32], [6 x i32]* %y, i64 0, i64 1 + %6 = insertvalue %"int[]" undef, i32* %5, 0 + %7 = insertvalue %"int[]" %6, i64 3, 1 + %8 = extractvalue %"int[]" %7, 0 + %9 = extractvalue %"int[]" %4, 0 + store %"int[]" %4, %"int[]"* %taddr, align 8 + %10 = getelementptr inbounds %"int[]", %"int[]"* %taddr, i32 0, i32 1 + %11 = load i64, i64* %10, align 8 + %12 = mul i64 %11, 4 + %13 = bitcast i32* %8 to i8* + %14 = bitcast i32* %9 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %13, i8* align 4 %14, i64 %12, i1 false) + %15 = bitcast [6 x i32]* %y to i8* + %16 = insertvalue %variant undef, i8* %15, 0 + %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$a6$int" to i64), 1 + %18 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %17, %variant* %18, align 16 + %19 = bitcast [7 x i32]* %z to i8* + %20 = insertvalue %variant undef, i8* %19, 0 + %21 = insertvalue %variant %20, i64 ptrtoint (%.introspect* @"ct$a7$int" to i64), 1 + %22 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %21, %variant* %22, align 16 + %23 = bitcast [2 x %variant]* %varargslots to %variant* + %24 = insertvalue %"variant[]" undef, %variant* %23, 0 + %25 = insertvalue %"variant[]" %24, i64 2, 1 + store %"variant[]" %25, %"variant[]"* %taddr1, align 8 + %26 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %27 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 0 + %lo = load i8*, i8** %27, align 8 + %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %26, i32 0, i32 1 + %hi = load i64, i64* %28, align 8 + %29 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %29, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %30 = getelementptr inbounds [7 x i32], [7 x i32]* %z, i64 0, i64 5 + %31 = insertvalue %"int[]" undef, i32* %30, 0 + %32 = insertvalue %"int[]" %31, i64 2, 1 + %33 = getelementptr inbounds [6 x i32], [6 x i32]* %y, i64 0, i64 4 + %34 = insertvalue %"int[]" undef, i32* %33, 0 + %35 = insertvalue %"int[]" %34, i64 2, 1 + %36 = extractvalue %"int[]" %35, 0 + %37 = extractvalue %"int[]" %32, 0 + store %"int[]" %32, %"int[]"* %taddr2, align 8 + %38 = getelementptr inbounds %"int[]", %"int[]"* %taddr2, i32 0, i32 1 + %39 = load i64, i64* %38, align 8 + %40 = mul i64 %39, 4 + %41 = bitcast i32* %36 to i8* + %42 = bitcast i32* %37 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %41, i8* align 4 %42, i64 %40, i1 false) + %43 = bitcast [6 x i32]* %y to i8* + %44 = insertvalue %variant undef, i8* %43, 0 + %45 = insertvalue %variant %44, i64 ptrtoint (%.introspect* @"ct$a6$int" to i64), 1 + %46 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 0 + store %variant %45, %variant* %46, align 16 + %47 = bitcast [7 x i32]* %z to i8* + %48 = insertvalue %variant undef, i8* %47, 0 + %49 = insertvalue %variant %48, i64 ptrtoint (%.introspect* @"ct$a7$int" to i64), 1 + %50 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 1 + store %variant %49, %variant* %50, align 16 + %51 = bitcast [2 x %variant]* %varargslots4 to %variant* + %52 = insertvalue %"variant[]" undef, %variant* %51, 0 + %53 = insertvalue %"variant[]" %52, i64 2, 1 + store %"variant[]" %53, %"variant[]"* %taddr5, align 8 + %54 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %55 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %54, i32 0, i32 0 + %lo6 = load i8*, i8** %55, align 8 + %56 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %54, i32 0, i32 1 + %hi7 = load i64, i64* %56, align 8 + %57 = call i64 @std_io_printfn(i64* %retparam3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 5, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %57, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %voiderr + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %voiderr + %58 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal, i64 0, i64 0 + %59 = getelementptr inbounds [1 x i32], [1 x i32]* %literal11, i64 0, i64 0 + store i32 1, i32* %59, align 4 + %60 = bitcast [1 x i32]* %literal11 to i32* + %61 = insertvalue %"int[]" undef, i32* %60, 0 + %62 = insertvalue %"int[]" %61, i64 1, 1 + store %"int[]" %62, %"int[]"* %58, align 8 + %63 = bitcast [1 x %"int[]"]* %literal to %"int[]"* + %64 = insertvalue %"int[][]" undef, %"int[]"* %63, 0 + %65 = insertvalue %"int[][]" %64, i64 1, 1 + store %"int[][]" %65, %"int[][]"* %a, align 8 + %66 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal12, i64 0, i64 0 + %67 = getelementptr inbounds [1 x i32], [1 x i32]* %literal13, i64 0, i64 0 + store i32 2, i32* %67, align 4 + %68 = bitcast [1 x i32]* %literal13 to i32* + %69 = insertvalue %"int[]" undef, i32* %68, 0 + %70 = insertvalue %"int[]" %69, i64 1, 1 + store %"int[]" %70, %"int[]"* %66, align 8 + %71 = bitcast [1 x %"int[]"]* %literal12 to %"int[]"* + %72 = insertvalue %"int[][]" undef, %"int[]"* %71, 0 + %73 = insertvalue %"int[][]" %72, i64 1, 1 + store %"int[][]" %73, %"int[][]"* %b, align 8 + %74 = bitcast %"int[][]"* %a to i8* + %75 = insertvalue %variant undef, i8* %74, 0 + %76 = insertvalue %variant %75, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 + %77 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots15, i64 0, i64 0 + store %variant %76, %variant* %77, align 16 + %78 = bitcast [1 x %variant]* %varargslots15 to %variant* + %79 = insertvalue %"variant[]" undef, %variant* %78, 0 + %80 = insertvalue %"variant[]" %79, i64 1, 1 + store %"variant[]" %80, %"variant[]"* %taddr16, align 8 + %81 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* + %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 0 + %lo17 = load i8*, i8** %82, align 8 + %83 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %81, i32 0, i32 1 + %hi18 = load i64, i64* %83, align 8 + %84 = call i64 @std_io_printfn(i64* %retparam14, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo17, i64 %hi18) + %not_err19 = icmp eq i64 %84, 0 + br i1 %not_err19, label %after_check20, label %voiderr21 + +after_check20: ; preds = %voiderr10 + br label %voiderr21 + +voiderr21: ; preds = %after_check20, %voiderr10 + %85 = load %"int[][]", %"int[][]"* %b, align 8 + %86 = extractvalue %"int[][]" %85, 0 + %ptroffset = getelementptr inbounds %"int[]", %"int[]"* %86, i64 0 + %87 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset, 0 + %88 = insertvalue %"int[][]" %87, i64 1, 1 + %89 = load %"int[][]", %"int[][]"* %a, align 8 + %90 = extractvalue %"int[][]" %89, 0 + %ptroffset22 = getelementptr inbounds %"int[]", %"int[]"* %90, i64 0 + %91 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset22, 0 + %92 = insertvalue %"int[][]" %91, i64 1, 1 + %93 = extractvalue %"int[][]" %92, 0 + %94 = extractvalue %"int[][]" %88, 0 + store %"int[][]" %88, %"int[][]"* %taddr23, align 8 + %95 = getelementptr inbounds %"int[][]", %"int[][]"* %taddr23, i32 0, i32 1 + %96 = load i64, i64* %95, align 8 + %97 = mul i64 %96, 16 + %98 = bitcast %"int[]"* %93 to i8* + %99 = bitcast %"int[]"* %94 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %98, i8* align 8 %99, i64 %97, i1 false) + %100 = bitcast %"int[][]"* %a to i8* + %101 = insertvalue %variant undef, i8* %100, 0 + %102 = insertvalue %variant %101, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 + %103 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots25, i64 0, i64 0 + store %variant %102, %variant* %103, align 16 + %104 = bitcast [1 x %variant]* %varargslots25 to %variant* + %105 = insertvalue %"variant[]" undef, %variant* %104, 0 + %106 = insertvalue %"variant[]" %105, i64 1, 1 + store %"variant[]" %106, %"variant[]"* %taddr26, align 8 + %107 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* + %108 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %107, i32 0, i32 0 + %lo27 = load i8*, i8** %108, align 8 + %109 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %107, i32 0, i32 1 + %hi28 = load i64, i64* %109, align 8 + %110 = call i64 @std_io_printfn(i64* %retparam24, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo27, i64 %hi28) + %not_err29 = icmp eq i64 %110, 0 + br i1 %not_err29, label %after_check30, label %voiderr31 + +after_check30: ; preds = %voiderr21 + br label %voiderr31 + +voiderr31: ; preds = %after_check30, %voiderr21 + %111 = getelementptr inbounds [6 x i32], [6 x i32]* %y, i64 0, i64 2 + %112 = insertvalue %"int[]" undef, i32* %111, 0 + %113 = insertvalue %"int[]" %112, i64 3, 1 + %114 = load %"int[][]", %"int[][]"* %a, align 8 + %115 = extractvalue %"int[][]" %114, 0 + %ptroffset32 = getelementptr inbounds %"int[]", %"int[]"* %115, i64 0 + store %"int[]" %113, %"int[]"* %ptroffset32, align 8 + %116 = bitcast %"int[][]"* %a to i8* + %117 = insertvalue %variant undef, i8* %116, 0 + %118 = insertvalue %variant %117, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 + %119 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots34, i64 0, i64 0 + store %variant %118, %variant* %119, align 16 + %120 = bitcast [1 x %variant]* %varargslots34 to %variant* + %121 = insertvalue %"variant[]" undef, %variant* %120, 0 + %122 = insertvalue %"variant[]" %121, i64 1, 1 + store %"variant[]" %122, %"variant[]"* %taddr35, align 8 + %123 = bitcast %"variant[]"* %taddr35 to { i8*, i64 }* + %124 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 0 + %lo36 = load i8*, i8** %124, align 8 + %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %123, i32 0, i32 1 + %hi37 = load i64, i64* %125, align 8 + %126 = call i64 @std_io_printfn(i64* %retparam33, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo36, i64 %hi37) + %not_err38 = icmp eq i64 %126, 0 + br i1 %not_err38, label %after_check39, label %voiderr40 + +after_check39: ; preds = %voiderr31 + br label %voiderr40 + +voiderr40: ; preds = %after_check39, %voiderr31 + ret void +} diff --git a/test/test_suite14/slices/slice_to_slice_vector_assign.c3t b/test/test_suite14/slices/slice_to_slice_vector_assign.c3t new file mode 100644 index 000000000..408b30b79 --- /dev/null +++ b/test/test_suite14/slices/slice_to_slice_vector_assign.c3t @@ -0,0 +1,252 @@ +// #target: macos-x64 +module test; +import std::io; + +fn void main() +{ + int[<*>] z = { 1, 2, 3, 4, 5, 6, 7 }; + int[<6>] y; + y[1..3] = z[3..5]; + io::printfn("%s %s", y, z); + y[4..] = z[5..6]; + io::printfn("%s %s", y, z); + int[][] a = { int[] { 1 } }; + int[][] b = { int[] { 2 } }; + io::printfn("%s", a); + a[0..0] = b[0..0]; + io::printfn("%s", a); + a[0..0] = y[2..4]; + io::printfn("%s", a); +} +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %z = alloca <7 x i32>, align 32 + %y = alloca <6 x i32>, align 32 + %taddr = alloca %"int[]", align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [2 x %variant], align 16 + %taddr1 = alloca %"variant[]", align 8 + %taddr2 = alloca %"int[]", align 8 + %retparam3 = alloca i64, align 8 + %varargslots4 = alloca [2 x %variant], align 16 + %taddr5 = alloca %"variant[]", align 8 + %a = alloca %"int[][]", align 8 + %literal = alloca [1 x %"int[]"], align 16 + %literal11 = alloca [1 x i32], align 4 + %b = alloca %"int[][]", align 8 + %literal12 = alloca [1 x %"int[]"], align 16 + %literal13 = alloca [1 x i32], align 4 + %retparam14 = alloca i64, align 8 + %varargslots15 = alloca [1 x %variant], align 16 + %taddr16 = alloca %"variant[]", align 8 + %taddr23 = alloca %"int[][]", align 8 + %retparam24 = alloca i64, align 8 + %varargslots25 = alloca [1 x %variant], align 16 + %taddr26 = alloca %"variant[]", align 8 + %retparam33 = alloca i64, align 8 + %varargslots34 = alloca [1 x %variant], align 16 + %taddr35 = alloca %"variant[]", align 8 + store <7 x i32> , <7 x i32>* %z, align 32 + store <6 x i32> zeroinitializer, <6 x i32>* %y, align 32 + %0 = getelementptr inbounds <7 x i32>, <7 x i32>* %z, i64 0, i64 3 + %1 = insertvalue %"int[]" undef, i32* %0, 0 + %2 = insertvalue %"int[]" %1, i64 3, 1 + %3 = getelementptr inbounds <6 x i32>, <6 x i32>* %y, i64 0, i64 1 + %4 = insertvalue %"int[]" undef, i32* %3, 0 + %5 = insertvalue %"int[]" %4, i64 3, 1 + %6 = extractvalue %"int[]" %5, 0 + %7 = extractvalue %"int[]" %2, 0 + store %"int[]" %2, %"int[]"* %taddr, align 8 + %8 = getelementptr inbounds %"int[]", %"int[]"* %taddr, i32 0, i32 1 + %9 = load i64, i64* %8, align 8 + %10 = mul i64 %9, 4 + %11 = bitcast i32* %6 to i8* + %12 = bitcast i32* %7 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %11, i8* align 4 %12, i64 %10, i1 false) + %13 = bitcast <6 x i32>* %y to i8* + %14 = insertvalue %variant undef, i8* %13, 0 + %15 = insertvalue %variant %14, i64 ptrtoint (%.introspect* @"ct$v6$int" to i64), 1 + %16 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %15, %variant* %16, align 16 + %17 = bitcast <7 x i32>* %z to i8* + %18 = insertvalue %variant undef, i8* %17, 0 + %19 = insertvalue %variant %18, i64 ptrtoint (%.introspect* @"ct$v7$int" to i64), 1 + %20 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %19, %variant* %20, align 16 + %21 = bitcast [2 x %variant]* %varargslots to %variant* + %22 = insertvalue %"variant[]" undef, %variant* %21, 0 + %23 = insertvalue %"variant[]" %22, i64 2, 1 + store %"variant[]" %23, %"variant[]"* %taddr1, align 8 + %24 = bitcast %"variant[]"* %taddr1 to { i8*, i64 }* + %25 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %24, i32 0, i32 0 + %lo = load i8*, i8** %25, align 8 + %26 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %24, i32 0, i32 1 + %hi = load i64, i64* %26, align 8 + %27 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %27, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %28 = getelementptr inbounds <7 x i32>, <7 x i32>* %z, i64 0, i64 5 + %29 = insertvalue %"int[]" undef, i32* %28, 0 + %30 = insertvalue %"int[]" %29, i64 2, 1 + %31 = getelementptr inbounds <6 x i32>, <6 x i32>* %y, i64 0, i64 4 + %32 = insertvalue %"int[]" undef, i32* %31, 0 + %33 = insertvalue %"int[]" %32, i64 2, 1 + %34 = extractvalue %"int[]" %33, 0 + %35 = extractvalue %"int[]" %30, 0 + store %"int[]" %30, %"int[]"* %taddr2, align 8 + %36 = getelementptr inbounds %"int[]", %"int[]"* %taddr2, i32 0, i32 1 + %37 = load i64, i64* %36, align 8 + %38 = mul i64 %37, 4 + %39 = bitcast i32* %34 to i8* + %40 = bitcast i32* %35 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %39, i8* align 4 %40, i64 %38, i1 false) + %41 = bitcast <6 x i32>* %y to i8* + %42 = insertvalue %variant undef, i8* %41, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$v6$int" to i64), 1 + %44 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 0 + store %variant %43, %variant* %44, align 16 + %45 = bitcast <7 x i32>* %z to i8* + %46 = insertvalue %variant undef, i8* %45, 0 + %47 = insertvalue %variant %46, i64 ptrtoint (%.introspect* @"ct$v7$int" to i64), 1 + %48 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots4, i64 0, i64 1 + store %variant %47, %variant* %48, align 16 + %49 = bitcast [2 x %variant]* %varargslots4 to %variant* + %50 = insertvalue %"variant[]" undef, %variant* %49, 0 + %51 = insertvalue %"variant[]" %50, i64 2, 1 + store %"variant[]" %51, %"variant[]"* %taddr5, align 8 + %52 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %53 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 0 + %lo6 = load i8*, i8** %53, align 8 + %54 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %52, i32 0, i32 1 + %hi7 = load i64, i64* %54, align 8 + %55 = call i64 @std_io_printfn(i64* %retparam3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 5, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %55, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %voiderr + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %voiderr + %56 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal, i64 0, i64 0 + %57 = getelementptr inbounds [1 x i32], [1 x i32]* %literal11, i64 0, i64 0 + store i32 1, i32* %57, align 4 + %58 = bitcast [1 x i32]* %literal11 to i32* + %59 = insertvalue %"int[]" undef, i32* %58, 0 + %60 = insertvalue %"int[]" %59, i64 1, 1 + store %"int[]" %60, %"int[]"* %56, align 8 + %61 = bitcast [1 x %"int[]"]* %literal to %"int[]"* + %62 = insertvalue %"int[][]" undef, %"int[]"* %61, 0 + %63 = insertvalue %"int[][]" %62, i64 1, 1 + store %"int[][]" %63, %"int[][]"* %a, align 8 + %64 = getelementptr inbounds [1 x %"int[]"], [1 x %"int[]"]* %literal12, i64 0, i64 0 + %65 = getelementptr inbounds [1 x i32], [1 x i32]* %literal13, i64 0, i64 0 + store i32 2, i32* %65, align 4 + %66 = bitcast [1 x i32]* %literal13 to i32* + %67 = insertvalue %"int[]" undef, i32* %66, 0 + %68 = insertvalue %"int[]" %67, i64 1, 1 + store %"int[]" %68, %"int[]"* %64, align 8 + %69 = bitcast [1 x %"int[]"]* %literal12 to %"int[]"* + %70 = insertvalue %"int[][]" undef, %"int[]"* %69, 0 + %71 = insertvalue %"int[][]" %70, i64 1, 1 + store %"int[][]" %71, %"int[][]"* %b, align 8 + %72 = bitcast %"int[][]"* %a to i8* + %73 = insertvalue %variant undef, i8* %72, 0 + %74 = insertvalue %variant %73, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 + %75 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots15, i64 0, i64 0 + store %variant %74, %variant* %75, align 16 + %76 = bitcast [1 x %variant]* %varargslots15 to %variant* + %77 = insertvalue %"variant[]" undef, %variant* %76, 0 + %78 = insertvalue %"variant[]" %77, i64 1, 1 + store %"variant[]" %78, %"variant[]"* %taddr16, align 8 + %79 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* + %80 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %79, i32 0, i32 0 + %lo17 = load i8*, i8** %80, align 8 + %81 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %79, i32 0, i32 1 + %hi18 = load i64, i64* %81, align 8 + %82 = call i64 @std_io_printfn(i64* %retparam14, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i64 2, i8* %lo17, i64 %hi18) + %not_err19 = icmp eq i64 %82, 0 + br i1 %not_err19, label %after_check20, label %voiderr21 + +after_check20: ; preds = %voiderr10 + br label %voiderr21 + +voiderr21: ; preds = %after_check20, %voiderr10 + %83 = load %"int[][]", %"int[][]"* %b, align 8 + %84 = extractvalue %"int[][]" %83, 0 + %ptroffset = getelementptr inbounds %"int[]", %"int[]"* %84, i64 0 + %85 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset, 0 + %86 = insertvalue %"int[][]" %85, i64 1, 1 + %87 = load %"int[][]", %"int[][]"* %a, align 8 + %88 = extractvalue %"int[][]" %87, 0 + %ptroffset22 = getelementptr inbounds %"int[]", %"int[]"* %88, i64 0 + %89 = insertvalue %"int[][]" undef, %"int[]"* %ptroffset22, 0 + %90 = insertvalue %"int[][]" %89, i64 1, 1 + %91 = extractvalue %"int[][]" %90, 0 + %92 = extractvalue %"int[][]" %86, 0 + store %"int[][]" %86, %"int[][]"* %taddr23, align 8 + %93 = getelementptr inbounds %"int[][]", %"int[][]"* %taddr23, i32 0, i32 1 + %94 = load i64, i64* %93, align 8 + %95 = mul i64 %94, 16 + %96 = bitcast %"int[]"* %91 to i8* + %97 = bitcast %"int[]"* %92 to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %96, i8* align 8 %97, i64 %95, i1 false) + %98 = bitcast %"int[][]"* %a to i8* + %99 = insertvalue %variant undef, i8* %98, 0 + %100 = insertvalue %variant %99, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 + %101 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots25, i64 0, i64 0 + store %variant %100, %variant* %101, align 16 + %102 = bitcast [1 x %variant]* %varargslots25 to %variant* + %103 = insertvalue %"variant[]" undef, %variant* %102, 0 + %104 = insertvalue %"variant[]" %103, i64 1, 1 + store %"variant[]" %104, %"variant[]"* %taddr26, align 8 + %105 = bitcast %"variant[]"* %taddr26 to { i8*, i64 }* + %106 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 0 + %lo27 = load i8*, i8** %106, align 8 + %107 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %105, i32 0, i32 1 + %hi28 = load i64, i64* %107, align 8 + %108 = call i64 @std_io_printfn(i64* %retparam24, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i64 2, i8* %lo27, i64 %hi28) + %not_err29 = icmp eq i64 %108, 0 + br i1 %not_err29, label %after_check30, label %voiderr31 + +after_check30: ; preds = %voiderr21 + br label %voiderr31 + +voiderr31: ; preds = %after_check30, %voiderr21 + %109 = getelementptr inbounds <6 x i32>, <6 x i32>* %y, i64 0, i64 2 + %110 = insertvalue %"int[]" undef, i32* %109, 0 + %111 = insertvalue %"int[]" %110, i64 3, 1 + %112 = load %"int[][]", %"int[][]"* %a, align 8 + %113 = extractvalue %"int[][]" %112, 0 + %ptroffset32 = getelementptr inbounds %"int[]", %"int[]"* %113, i64 0 + store %"int[]" %111, %"int[]"* %ptroffset32, align 8 + %114 = bitcast %"int[][]"* %a to i8* + %115 = insertvalue %variant undef, i8* %114, 0 + %116 = insertvalue %variant %115, i64 ptrtoint (%.introspect* @"ct$sa$sa$int" to i64), 1 + %117 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots34, i64 0, i64 0 + store %variant %116, %variant* %117, align 16 + %118 = bitcast [1 x %variant]* %varargslots34 to %variant* + %119 = insertvalue %"variant[]" undef, %variant* %118, 0 + %120 = insertvalue %"variant[]" %119, i64 1, 1 + store %"variant[]" %120, %"variant[]"* %taddr35, align 8 + %121 = bitcast %"variant[]"* %taddr35 to { i8*, i64 }* + %122 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %121, i32 0, i32 0 + %lo36 = load i8*, i8** %122, align 8 + %123 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %121, i32 0, i32 1 + %hi37 = load i64, i64* %123, align 8 + %124 = call i64 @std_io_printfn(i64* %retparam33, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i32 0, i32 0), i64 2, i8* %lo36, i64 %hi37) + %not_err38 = icmp eq i64 %124, 0 + br i1 %not_err38, label %after_check39, label %voiderr40 + +after_check39: ; preds = %voiderr31 + br label %voiderr40 + +voiderr40: ; preds = %after_check39, %voiderr31 + ret void +} diff --git a/test/test_suite2/statements/binary_fail.c3 b/test/test_suite14/statements/binary_fail.c3 similarity index 100% rename from test/test_suite2/statements/binary_fail.c3 rename to test/test_suite14/statements/binary_fail.c3 diff --git a/test/test_suite2/statements/call_missing_paren.c3 b/test/test_suite14/statements/call_missing_paren.c3 similarity index 100% rename from test/test_suite2/statements/call_missing_paren.c3 rename to test/test_suite14/statements/call_missing_paren.c3 diff --git a/test/test_suite2/statements/comparison_widening.c3t b/test/test_suite14/statements/comparison_widening.c3t similarity index 70% rename from test/test_suite2/statements/comparison_widening.c3t rename to test/test_suite14/statements/comparison_widening.c3t index 5e873dbb8..2ceef4f9a 100644 --- a/test/test_suite2/statements/comparison_widening.c3t +++ b/test/test_suite14/statements/comparison_widening.c3t @@ -16,19 +16,19 @@ entry: %b = alloca i32, align 4 %c = alloca i8, align 1 %d = alloca i32, align 4 - store i8 1, ptr %a, align 1 - store i32 2, ptr %b, align 4 - %0 = load i32, ptr %b, align 4 - %1 = load i8, ptr %a, align 1 + store i8 1, i8* %a, align 1 + store i32 2, i32* %b, align 4 + %0 = load i32, i32* %b, align 4 + %1 = load i8, i8* %a, align 1 %zext = zext i8 %1 to i32 %gt = icmp sgt i32 %0, %zext %check = icmp sge i32 %zext, 0 %siui-gt = and i1 %check, %gt %ternary = select i1 %siui-gt, i8 1, i8 0 - store i8 %ternary, ptr %c, align 1 - %2 = load i32, ptr %b, align 4 + store i8 %ternary, i8* %c, align 1 + %2 = load i32, i32* %b, align 4 %intbool = icmp ne i32 %2, 0 %ternary1 = select i1 %intbool, i32 %2, i32 1 - store i32 %ternary1, ptr %d, align 4 + store i32 %ternary1, i32* %d, align 4 ret void } \ No newline at end of file diff --git a/test/test_suite2/statements/conditional_return.c3 b/test/test_suite14/statements/conditional_return.c3 similarity index 100% rename from test/test_suite2/statements/conditional_return.c3 rename to test/test_suite14/statements/conditional_return.c3 diff --git a/test/test_suite2/statements/const_statements.c3t b/test/test_suite14/statements/const_statements.c3t similarity index 100% rename from test/test_suite2/statements/const_statements.c3t rename to test/test_suite14/statements/const_statements.c3t diff --git a/test/test_suite14/statements/custom_foreach_with_ref.c3t b/test/test_suite14/statements/custom_foreach_with_ref.c3t new file mode 100644 index 000000000..b45996738 --- /dev/null +++ b/test/test_suite14/statements/custom_foreach_with_ref.c3t @@ -0,0 +1,481 @@ +// #target: macos-x64 +module foo; + +struct Foo +{ + int[3] a; +} + +extern fn void printf(char*, ...); + +macro int* Foo.@operator_element_at_ref(Foo &f, int a) @operator(&[]) +{ + return &f.a[a]; +} + +macro int Foo.@operator_len(Foo &f) @operator(len) +{ + return 3; +} + +macro int Foo.@operator_element_at(Foo &f, int a) @operator([]) +{ + return f.a[a]; +} + +fn int[5] getFields() +{ + printf("getFields\n"); + return int[5] { 3, 5, 2, 10, 111}; +} +fn Foo *call(Foo *f) +{ + printf("Call made\n"); + return f; +} +fn void main() +{ + Foo x = { { 1, 5, 7} }; + printf("%d %d %d\n", x[0], x[1], x[2]); + foreach (i, int y : *call(&x)) + { + printf("Hello %d: %d\n", i, y); + } + foreach (i, int* &y : x) + { + *y += 1; + printf("Hello %d: %d\n", i, *y); + } + foreach (i, int y : x) + { + printf("After one %d: %d\n", i, y); + } + + foreach (i, int y : &x) + { + printf("By pointer %d: %d\n", i, y); + } + + foreach (i, int y : x) + { + printf("Adding %d: %d\n", i, y); + i++; + } + + foreach(i, y : int[5] { 1, 2, 10, 111, 123 } ) + { + printf("Adding %d: %d\n", i, y); + i++; + } + foreach(i, y : getFields() ) + { + printf("Pull value %d: %d\n", i, y); + } + foreach(i, y : &&getFields()) + { + printf("Pull value tempptr %d: %d\n", i, y); + } + printf("%d %d\n", x[0], x[1]); + int* y = &x[1]; + *y += 1; + printf("%d %d\n", x[0], x[1]); +} + +/* #expect: foo.ll + +%Foo = type { [3 x i32] } + +@"ct$foo_Foo" = linkonce constant %.introspect { i8 10, i64 12, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [11 x i8] c"getFields\0A\00", align 1 +@.str.1 = private unnamed_addr constant [11 x i8] c"Call made\0A\00", align 1 +@.__const = private unnamed_addr constant %Foo { [3 x i32] [i32 1, i32 5, i32 7] }, align 4 +@.str.2 = private unnamed_addr constant [10 x i8] c"%d %d %d\0A\00", align 1 +@.str.3 = private unnamed_addr constant [14 x i8] c"Hello %d: %d\0A\00", align 1 +@.str.4 = private unnamed_addr constant [14 x i8] c"Hello %d: %d\0A\00", align 1 +@.str.5 = private unnamed_addr constant [18 x i8] c"After one %d: %d\0A\00", align 1 +@.str.6 = private unnamed_addr constant [19 x i8] c"By pointer %d: %d\0A\00", align 1 +@.str.7 = private unnamed_addr constant [15 x i8] c"Adding %d: %d\0A\00", align 1 +@.__const.8 = private unnamed_addr constant [5 x i32] [i32 1, i32 2, i32 10, i32 111, i32 123], align 16 +@.str.9 = private unnamed_addr constant [15 x i8] c"Adding %d: %d\0A\00", align 1 +@.str.10 = private unnamed_addr constant [19 x i8] c"Pull value %d: %d\0A\00", align 1 +@.str.11 = private unnamed_addr constant [27 x i8] c"Pull value tempptr %d: %d\0A\00", align 1 +@.str.12 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 +@.str.13 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 + +define void @foo_getFields([5 x i32]* noalias sret([5 x i32]) align 4 %0) #0 { +entry: + %literal = alloca [5 x i32], align 16 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0)) + %1 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 0 + store i32 3, i32* %1, align 4 + %2 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 1 + store i32 5, i32* %2, align 4 + %3 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 2 + store i32 2, i32* %3, align 4 + %4 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 3 + store i32 10, i32* %4, align 4 + %5 = getelementptr inbounds [5 x i32], [5 x i32]* %literal, i64 0, i64 4 + store i32 111, i32* %5, align 4 + %6 = bitcast [5 x i32]* %0 to i8* + %7 = bitcast [5 x i32]* %literal to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %6, i8* align 4 %7, i32 20, i1 false) + ret void +} + +; Function Attrs: nounwind +define %Foo* @foo_call(%Foo* %0) #0 { +entry: + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0)) + ret %Foo* %0 +} +define void @foo_main() #0 { +entry: + %x = alloca %Foo, align 4 + %a = alloca i32, align 4 + %a1 = alloca i32, align 4 + %a3 = alloca i32, align 4 + %.anon = alloca %Foo*, align 8 + %.anon5 = alloca i32, align 4 + %.anon6 = alloca i32, align 4 + %i = alloca i32, align 4 + %y = alloca i32, align 4 + %a7 = alloca i32, align 4 + %.anon9 = alloca i32, align 4 + %.anon10 = alloca i32, align 4 + %i14 = alloca i32, align 4 + %y15 = alloca i32*, align 8 + %a16 = alloca i32, align 4 + %.anon21 = alloca i32, align 4 + %.anon22 = alloca i32, align 4 + %i26 = alloca i32, align 4 + %y27 = alloca i32, align 4 + %a28 = alloca i32, align 4 + %.anon32 = alloca i32, align 4 + %.anon33 = alloca i32, align 4 + %i37 = alloca i32, align 4 + %y38 = alloca i32, align 4 + %a39 = alloca i32, align 4 + %.anon43 = alloca i32, align 4 + %.anon44 = alloca i32, align 4 + %i48 = alloca i32, align 4 + %y49 = alloca i32, align 4 + %a50 = alloca i32, align 4 + %.anon55 = alloca [5 x i32], align 16 + %.anon56 = alloca i64, align 8 + %i59 = alloca i64, align 8 + %y60 = alloca i32, align 4 + %.anon64 = alloca [5 x i32], align 16 + %.anon65 = alloca i64, align 8 + %i69 = alloca i64, align 8 + %y70 = alloca i32, align 4 + %.anon73 = alloca [5 x i32]*, align 8 + %sretparam = alloca [5 x i32], align 4 + %.anon74 = alloca i64, align 8 + %i78 = alloca i64, align 8 + %y79 = alloca i32, align 4 + %a82 = alloca i32, align 4 + %a84 = alloca i32, align 4 + %y86 = alloca i32*, align 8 + %a87 = alloca i32, align 4 + %a90 = alloca i32, align 4 + %a92 = alloca i32, align 4 + %0 = bitcast %Foo* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 12, i1 false) + store i32 0, i32* %a, align 4 + %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %2 = load i32, i32* %a, align 4 + %sisiext = sext i32 %2 to i64 + %3 = getelementptr inbounds [3 x i32], [3 x i32]* %1, i64 0, i64 %sisiext + %4 = load i32, i32* %3, align 4 + store i32 1, i32* %a1, align 4 + %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %6 = load i32, i32* %a1, align 4 + %sisiext2 = sext i32 %6 to i64 + %7 = getelementptr inbounds [3 x i32], [3 x i32]* %5, i64 0, i64 %sisiext2 + %8 = load i32, i32* %7, align 4 + store i32 2, i32* %a3, align 4 + %9 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %10 = load i32, i32* %a3, align 4 + %sisiext4 = sext i32 %10 to i64 + %11 = getelementptr inbounds [3 x i32], [3 x i32]* %9, i64 0, i64 %sisiext4 + %12 = load i32, i32* %11, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %4, i32 %8, i32 %12) + %13 = call %Foo* @foo_call(%Foo* %x) + store %Foo* %13, %Foo** %.anon, align 8 + store i32 3, i32* %.anon5, align 4 + store i32 0, i32* %.anon6, align 4 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %14 = load i32, i32* %.anon6, align 4 + %15 = load i32, i32* %.anon5, align 4 + %lt = icmp slt i32 %14, %15 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %16 = load i32, i32* %.anon6, align 4 + store i32 %16, i32* %i, align 4 + %17 = load %Foo*, %Foo** %.anon, align 8 + %18 = load i32, i32* %.anon6, align 4 + store i32 %18, i32* %a7, align 4 + %19 = getelementptr inbounds %Foo, %Foo* %17, i32 0, i32 0 + %20 = load i32, i32* %a7, align 4 + %sisiext8 = sext i32 %20 to i64 + %21 = getelementptr inbounds [3 x i32], [3 x i32]* %19, i64 0, i64 %sisiext8 + %22 = load i32, i32* %21, align 4 + store i32 %22, i32* %y, align 4 + %23 = load i32, i32* %i, align 4 + %24 = load i32, i32* %y, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 %23, i32 %24) + %25 = load i32, i32* %.anon6, align 4 + %add = add i32 %25, 1 + store i32 %add, i32* %.anon6, align 4 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + store i32 3, i32* %.anon9, align 4 + store i32 0, i32* %.anon10, align 4 + br label %loop.cond11 + +loop.cond11: ; preds = %loop.body13, %loop.exit + %26 = load i32, i32* %.anon10, align 4 + %27 = load i32, i32* %.anon9, align 4 + %lt12 = icmp slt i32 %26, %27 + br i1 %lt12, label %loop.body13, label %loop.exit20 + +loop.body13: ; preds = %loop.cond11 + %28 = load i32, i32* %.anon10, align 4 + store i32 %28, i32* %i14, align 4 + %29 = load i32, i32* %.anon10, align 4 + store i32 %29, i32* %a16, align 4 + %30 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %31 = load i32, i32* %a16, align 4 + %sisiext17 = sext i32 %31 to i64 + %32 = getelementptr inbounds [3 x i32], [3 x i32]* %30, i64 0, i64 %sisiext17 + store i32* %32, i32** %y15, align 8 + %33 = load i32*, i32** %y15, align 8 + %34 = load i32, i32* %33, align 8 + %add18 = add i32 %34, 1 + store i32 %add18, i32* %33, align 8 + %35 = load i32, i32* %i14, align 4 + %36 = load i32*, i32** %y15, align 8 + %37 = load i32, i32* %36, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37) + %38 = load i32, i32* %.anon10, align 4 + %add19 = add i32 %38, 1 + store i32 %add19, i32* %.anon10, align 4 + br label %loop.cond11 + +loop.exit20: ; preds = %loop.cond11 + store i32 3, i32* %.anon21, align 4 + store i32 0, i32* %.anon22, align 4 + br label %loop.cond23 + +loop.cond23: ; preds = %loop.body25, %loop.exit20 + %39 = load i32, i32* %.anon22, align 4 + %40 = load i32, i32* %.anon21, align 4 + %lt24 = icmp slt i32 %39, %40 + br i1 %lt24, label %loop.body25, label %loop.exit31 + +loop.body25: ; preds = %loop.cond23 + %41 = load i32, i32* %.anon22, align 4 + store i32 %41, i32* %i26, align 4 + %42 = load i32, i32* %.anon22, align 4 + store i32 %42, i32* %a28, align 4 + %43 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %44 = load i32, i32* %a28, align 4 + %sisiext29 = sext i32 %44 to i64 + %45 = getelementptr inbounds [3 x i32], [3 x i32]* %43, i64 0, i64 %sisiext29 + %46 = load i32, i32* %45, align 4 + store i32 %46, i32* %y27, align 4 + %47 = load i32, i32* %i26, align 4 + %48 = load i32, i32* %y27, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.5, i32 0, i32 0), i32 %47, i32 %48) + %49 = load i32, i32* %.anon22, align 4 + %add30 = add i32 %49, 1 + store i32 %add30, i32* %.anon22, align 4 + br label %loop.cond23 + +loop.exit31: ; preds = %loop.cond23 + store i32 3, i32* %.anon32, align 4 + store i32 0, i32* %.anon33, align 4 + br label %loop.cond34 + +loop.cond34: ; preds = %loop.body36, %loop.exit31 + %50 = load i32, i32* %.anon33, align 4 + %51 = load i32, i32* %.anon32, align 4 + %lt35 = icmp slt i32 %50, %51 + br i1 %lt35, label %loop.body36, label %loop.exit42 + +loop.body36: ; preds = %loop.cond34 + %52 = load i32, i32* %.anon33, align 4 + store i32 %52, i32* %i37, align 4 + %53 = load i32, i32* %.anon33, align 4 + store i32 %53, i32* %a39, align 4 + %54 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %55 = load i32, i32* %a39, align 4 + %sisiext40 = sext i32 %55 to i64 + %56 = getelementptr inbounds [3 x i32], [3 x i32]* %54, i64 0, i64 %sisiext40 + %57 = load i32, i32* %56, align 4 + store i32 %57, i32* %y38, align 4 + %58 = load i32, i32* %i37, align 4 + %59 = load i32, i32* %y38, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.6, i32 0, i32 0), i32 %58, i32 %59) + %60 = load i32, i32* %.anon33, align 4 + %add41 = add i32 %60, 1 + store i32 %add41, i32* %.anon33, align 4 + br label %loop.cond34 + +loop.exit42: ; preds = %loop.cond34 + store i32 3, i32* %.anon43, align 4 + store i32 0, i32* %.anon44, align 4 + br label %loop.cond45 + +loop.cond45: ; preds = %loop.body47, %loop.exit42 + %61 = load i32, i32* %.anon44, align 4 + %62 = load i32, i32* %.anon43, align 4 + %lt46 = icmp slt i32 %61, %62 + br i1 %lt46, label %loop.body47, label %loop.exit54 + +loop.body47: ; preds = %loop.cond45 + %63 = load i32, i32* %.anon44, align 4 + store i32 %63, i32* %i48, align 4 + %64 = load i32, i32* %.anon44, align 4 + store i32 %64, i32* %a50, align 4 + %65 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %66 = load i32, i32* %a50, align 4 + %sisiext51 = sext i32 %66 to i64 + %67 = getelementptr inbounds [3 x i32], [3 x i32]* %65, i64 0, i64 %sisiext51 + %68 = load i32, i32* %67, align 4 + store i32 %68, i32* %y49, align 4 + %69 = load i32, i32* %i48, align 4 + %70 = load i32, i32* %y49, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.7, i32 0, i32 0), i32 %69, i32 %70) + %71 = load i32, i32* %i48, align 4 + %add52 = add i32 %71, 1 + store i32 %add52, i32* %i48, align 4 + %72 = load i32, i32* %.anon44, align 4 + %add53 = add i32 %72, 1 + store i32 %add53, i32* %.anon44, align 4 + br label %loop.cond45 + +loop.exit54: ; preds = %loop.cond45 + %73 = bitcast [5 x i32]* %.anon55 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %73, i8* align 16 bitcast ([5 x i32]* @.__const.8 to i8*), i32 20, i1 false) + store i64 0, i64* %.anon56, align 8 + br label %loop.cond57 + +loop.cond57: ; preds = %loop.body58, %loop.exit54 + %74 = load i64, i64* %.anon56, align 8 + %gt = icmp ugt i64 5, %74 + br i1 %gt, label %loop.body58, label %loop.exit63 + +loop.body58: ; preds = %loop.cond57 + %75 = load i64, i64* %.anon56, align 8 + store i64 %75, i64* %i59, align 8 + %76 = load i64, i64* %.anon56, align 8 + %77 = getelementptr inbounds [5 x i32], [5 x i32]* %.anon55, i64 0, i64 %76 + %78 = load i32, i32* %77, align 4 + store i32 %78, i32* %y60, align 4 + %79 = load i64, i64* %i59, align 8 + %80 = load i32, i32* %y60, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.9, i32 0, i32 0), i64 %79, i32 %80) + %81 = load i64, i64* %i59, align 8 + %add61 = add i64 %81, 1 + store i64 %add61, i64* %i59, align 8 + %82 = load i64, i64* %.anon56, align 8 + %add62 = add i64 %82, 1 + store i64 %add62, i64* %.anon56, align 8 + br label %loop.cond57 + +loop.exit63: ; preds = %loop.cond57 + call void @foo_getFields([5 x i32]* sret([5 x i32]) align 4 %.anon64) + store i64 0, i64* %.anon65, align 8 + br label %loop.cond66 + +loop.cond66: ; preds = %loop.body68, %loop.exit63 + %83 = load i64, i64* %.anon65, align 8 + %gt67 = icmp ugt i64 5, %83 + br i1 %gt67, label %loop.body68, label %loop.exit72 + +loop.body68: ; preds = %loop.cond66 + %84 = load i64, i64* %.anon65, align 8 + store i64 %84, i64* %i69, align 8 + %85 = load i64, i64* %.anon65, align 8 + %86 = getelementptr inbounds [5 x i32], [5 x i32]* %.anon64, i64 0, i64 %85 + %87 = load i32, i32* %86, align 4 + store i32 %87, i32* %y70, align 4 + %88 = load i64, i64* %i69, align 8 + %89 = load i32, i32* %y70, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.10, i32 0, i32 0), i64 %88, i32 %89) + %90 = load i64, i64* %.anon65, align 8 + %add71 = add i64 %90, 1 + store i64 %add71, i64* %.anon65, align 8 + br label %loop.cond66 + +loop.exit72: ; preds = %loop.cond66 + call void @foo_getFields([5 x i32]* sret([5 x i32]) align 4 %sretparam) + store [5 x i32]* %sretparam, [5 x i32]** %.anon73, align 8 + store i64 0, i64* %.anon74, align 8 + br label %loop.cond75 + +loop.cond75: ; preds = %loop.body77, %loop.exit72 + %91 = load i64, i64* %.anon74, align 8 + %gt76 = icmp ugt i64 5, %91 + br i1 %gt76, label %loop.body77, label %loop.exit81 + +loop.body77: ; preds = %loop.cond75 + %92 = load i64, i64* %.anon74, align 8 + store i64 %92, i64* %i78, align 8 + %93 = load [5 x i32]*, [5 x i32]** %.anon73, align 8 + %94 = load i64, i64* %.anon74, align 8 + %95 = getelementptr inbounds [5 x i32], [5 x i32]* %93, i64 0, i64 %94 + %96 = load i32, i32* %95, align 4 + store i32 %96, i32* %y79, align 4 + %97 = load i64, i64* %i78, align 8 + %98 = load i32, i32* %y79, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i32 0, i32 0), i64 %97, i32 %98) + %99 = load i64, i64* %.anon74, align 8 + %add80 = add i64 %99, 1 + store i64 %add80, i64* %.anon74, align 8 + br label %loop.cond75 + +loop.exit81: ; preds = %loop.cond75 + store i32 0, i32* %a82, align 4 + %100 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %101 = load i32, i32* %a82, align 4 + %sisiext83 = sext i32 %101 to i64 + %102 = getelementptr inbounds [3 x i32], [3 x i32]* %100, i64 0, i64 %sisiext83 + %103 = load i32, i32* %102, align 4 + store i32 1, i32* %a84, align 4 + %104 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %105 = load i32, i32* %a84, align 4 + %sisiext85 = sext i32 %105 to i64 + %106 = getelementptr inbounds [3 x i32], [3 x i32]* %104, i64 0, i64 %sisiext85 + %107 = load i32, i32* %106, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i32 0, i32 0), i32 %103, i32 %107) + store i32 1, i32* %a87, align 4 + %108 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %109 = load i32, i32* %a87, align 4 + %sisiext88 = sext i32 %109 to i64 + %110 = getelementptr inbounds [3 x i32], [3 x i32]* %108, i64 0, i64 %sisiext88 + store i32* %110, i32** %y86, align 8 + %111 = load i32*, i32** %y86, align 8 + %112 = load i32, i32* %111, align 8 + %add89 = add i32 %112, 1 + store i32 %add89, i32* %111, align 8 + store i32 0, i32* %a90, align 4 + %113 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %114 = load i32, i32* %a90, align 4 + %sisiext91 = sext i32 %114 to i64 + %115 = getelementptr inbounds [3 x i32], [3 x i32]* %113, i64 0, i64 %sisiext91 + %116 = load i32, i32* %115, align 4 + store i32 1, i32* %a92, align 4 + %117 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %118 = load i32, i32* %a92, align 4 + %sisiext93 = sext i32 %118 to i64 + %119 = getelementptr inbounds [3 x i32], [3 x i32]* %117, i64 0, i64 %sisiext93 + %120 = load i32, i32* %119, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.13, i32 0, i32 0), i32 %116, i32 %120) + ret void +} diff --git a/test/test_suite2/statements/default_args.c3 b/test/test_suite14/statements/default_args.c3 similarity index 100% rename from test/test_suite2/statements/default_args.c3 rename to test/test_suite14/statements/default_args.c3 diff --git a/test/test_suite2/statements/defer_break.c3t b/test/test_suite14/statements/defer_break.c3t similarity index 93% rename from test/test_suite2/statements/defer_break.c3t rename to test/test_suite14/statements/defer_break.c3t index 50260f094..33eb2c9f6 100644 --- a/test/test_suite2/statements/defer_break.c3t +++ b/test/test_suite14/statements/defer_break.c3t @@ -47,12 +47,12 @@ fn int main(int argc, char** argv) /* #expect: foo.ll -define i32 @main(i32 %0, ptr %1) #0 { +define i32 @main(i32 %0, i8** %1) #0 { entry: %a = alloca i32, align 4 - store i32 0, ptr %a, align 4 + store i32 0, i32* %a, align 4 call void @foo_defer2() - %2 = load i32, ptr %a, align 4 + %2 = load i32, i32* %a, align 4 %eq = icmp eq i32 %2, 1 br i1 %eq, label %if.then, label %if.exit @@ -67,7 +67,7 @@ loop.exit: ; preds = %if.exit, %if.then br label %loop.cond loop.cond: ; preds = %if.exit3, %loop.exit - %3 = load i32, ptr %a, align 4 + %3 = load i32, i32* %a, align 4 %intbool = icmp ne i32 %3, 0 br i1 %intbool, label %loop.body, label %loop.exit4 @@ -89,7 +89,7 @@ loop.exit4: ; preds = %if.then2, %loop.con br label %loop.cond5 loop.cond5: ; preds = %loop.exit4 - %4 = load i32, ptr %a, align 4 + %4 = load i32, i32* %a, align 4 %intbool6 = icmp ne i32 %4, 0 br i1 %intbool6, label %loop.body7, label %loop.exit11 diff --git a/test/test_suite2/statements/defer_break_simple.c3t b/test/test_suite14/statements/defer_break_simple.c3t similarity index 91% rename from test/test_suite2/statements/defer_break_simple.c3t rename to test/test_suite14/statements/defer_break_simple.c3t index ccf939509..d361d72b8 100644 --- a/test/test_suite2/statements/defer_break_simple.c3t +++ b/test/test_suite14/statements/defer_break_simple.c3t @@ -25,14 +25,16 @@ fn int main(int argc, char** argv) /* #expect: test.ll -define i32 @main(i32 %0, ptr %1) #0 { + + +define i32 @main(i32 %0, i8** %1) #0 { entry: %a = alloca i32, align 4 - store i32 0, ptr %a, align 4 + store i32 0, i32* %a, align 4 br label %loop.cond loop.cond: ; preds = %if.exit, %entry - %2 = load i32, ptr %a, align 4 + %2 = load i32, i32* %a, align 4 %intbool = icmp ne i32 %2, 0 br i1 %intbool, label %loop.body, label %loop.exit diff --git a/test/test_suite2/statements/defer_break_switch.c3t b/test/test_suite14/statements/defer_break_switch.c3t similarity index 90% rename from test/test_suite2/statements/defer_break_switch.c3t rename to test/test_suite14/statements/defer_break_switch.c3t index d70f10eb4..76be862d3 100644 --- a/test/test_suite2/statements/defer_break_switch.c3t +++ b/test/test_suite14/statements/defer_break_switch.c3t @@ -25,19 +25,19 @@ define void @defer_break_switch_test(i32 %0) #0 { entry: %b = alloca i8, align 1 %switch = alloca i32, align 4 - store i8 1, ptr %b, align 1 - store i32 %0, ptr %switch, align 4 + store i8 1, i8* %b, align 1 + store i32 %0, i32* %switch, align 4 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i32, ptr %switch, align 4 + %1 = load i32, i32* %switch, align 4 switch i32 %1, label %switch.exit [ i32 1, label %switch.case i32 2, label %switch.case1 ] switch.case: ; preds = %switch.entry - %2 = load i8, ptr %b, align 1 + %2 = load i8, i8* %b, align 1 %3 = trunc i8 %2 to i1 br i1 %3, label %if.then, label %if.exit diff --git a/test/test_suite2/statements/defer_do_while.c3t b/test/test_suite14/statements/defer_do_while.c3t similarity index 74% rename from test/test_suite2/statements/defer_do_while.c3t rename to test/test_suite14/statements/defer_do_while.c3t index 3cd84eaae..0902d19c7 100644 --- a/test/test_suite2/statements/defer_do_while.c3t +++ b/test/test_suite14/statements/defer_do_while.c3t @@ -16,21 +16,21 @@ fn void test() define void @foo_test() #0 { entry: %a = alloca i32, align 4 - store i32 0, ptr %a, align 4 + store i32 0, i32* %a, align 4 br label %loop.body loop.cond: ; preds = %loop.body - %0 = load i32, ptr %a, align 4 + %0 = load i32, i32* %a, align 4 %lt = icmp slt i32 %0, 10 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond, %entry - %1 = load i32, ptr %a, align 4 + %1 = load i32, i32* %a, align 4 %add = add i32 %1, 1 - store i32 %add, ptr %a, align 4 - %2 = load i32, ptr %a, align 4 + store i32 %add, i32* %a, align 4 + %2 = load i32, i32* %a, align 4 %add1 = add i32 %2, 1 - store i32 %add1, ptr %a, align 4 + store i32 %add1, i32* %a, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond diff --git a/test/test_suite2/statements/defer_in_block.c3t b/test/test_suite14/statements/defer_in_block.c3t similarity index 54% rename from test/test_suite2/statements/defer_in_block.c3t rename to test/test_suite14/statements/defer_in_block.c3t index df2e63eed..f21d4509d 100644 --- a/test/test_suite2/statements/defer_in_block.c3t +++ b/test/test_suite14/statements/defer_in_block.c3t @@ -31,57 +31,41 @@ fn void main() define void @foo_test(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %0, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 %mul = mul i32 %1, 2 - store i32 %mul, ptr %x, align 4 - %2 = load i32, ptr %x, align 4 + store i32 %mul, i32* %x, align 4 + %2 = load i32, i32* %x, align 4 %lt = icmp slt i32 %2, 100 br i1 %lt, label %if.then, label %if.exit - if.then: ; preds = %entry - %3 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %3) + %3 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i32 %3) br label %expr_block.exit - if.exit: ; preds = %entry - %4 = load i32, ptr %x, align 4 + %4 = load i32, i32* %x, align 4 %mul1 = mul i32 %4, 10000 - store i32 %mul1, ptr %x, align 4 - %5 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %5) + store i32 %mul1, i32* %x, align 4 + %5 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 %5) br label %expr_block.exit - expr_block.exit: ; preds = %if.exit, %if.then - call void (ptr, ...) @printf(ptr @.str.2) - %6 = load i32, ptr %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0)) + %6 = load i32, i32* %x, align 4 %eq = icmp eq i32 %6, 0 br i1 %eq, label %if.then2, label %if.exit3 - if.then2: ; preds = %expr_block.exit - call void (ptr, ...) @printf(ptr @.str.3) - call void (ptr, ...) @printf(ptr @.str.4) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.3, i32 0, i32 0)) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0)) ret void - if.exit3: ; preds = %expr_block.exit - %7 = load i32, ptr %x, align 4 + %7 = load i32, i32* %x, align 4 %eq4 = icmp eq i32 %7, 1 br i1 %eq4, label %if.then5, label %if.exit6 - if.then5: ; preds = %if.exit3 - call void (ptr, ...) @printf(ptr @.str.5) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0)) ret void - if.exit6: ; preds = %if.exit3 - call void (ptr, ...) @printf(ptr @.str.6) - ret void -} - -; Function Attrs: nounwind -define void @foo_main() #0 { -entry: - call void @foo_test(i32 123) - call void @foo_test(i32 1) - call void @foo_test(i32 0) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0)) ret void } diff --git a/test/test_suite2/statements/defer_in_defer.c3t b/test/test_suite14/statements/defer_in_defer.c3t similarity index 100% rename from test/test_suite2/statements/defer_in_defer.c3t rename to test/test_suite14/statements/defer_in_defer.c3t diff --git a/test/test_suite2/statements/defer_in_defer2.c3t b/test/test_suite14/statements/defer_in_defer2.c3t similarity index 56% rename from test/test_suite2/statements/defer_in_defer2.c3t rename to test/test_suite14/statements/defer_in_defer2.c3t index 173cb87e8..78223bc23 100644 --- a/test/test_suite2/statements/defer_in_defer2.c3t +++ b/test/test_suite14/statements/defer_in_defer2.c3t @@ -35,86 +35,86 @@ fn void main() define void @test_test(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %0, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 %eq = icmp eq i32 %1, 1 br i1 %eq, label %if.then, label %if.exit3 if.then: ; preds = %entry - call void (ptr, ...) @printf(ptr @.str) - %2 = load i32, ptr %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0)) + %2 = load i32, i32* %x, align 4 %mul = mul i32 %2, 2 - store i32 %mul, ptr %x, align 4 - %3 = load i32, ptr %x, align 4 + store i32 %mul, i32* %x, align 4 + %3 = load i32, i32* %x, align 4 %lt = icmp slt i32 %3, 100 br i1 %lt, label %if.then1, label %if.exit if.then1: ; preds = %if.then - %4 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %4) + %4 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 %4) br label %loop.exit if.exit: ; preds = %if.then - %5 = load i32, ptr %x, align 4 + %5 = load i32, i32* %x, align 4 %mul2 = mul i32 %5, 10000 - store i32 %mul2, ptr %x, align 4 - %6 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.2, i32 %6) + store i32 %mul2, i32* %x, align 4 + %6 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i32 %6) br label %loop.exit loop.exit: ; preds = %if.exit, %if.then1 ret void if.exit3: ; preds = %entry - %7 = load i32, ptr %x, align 4 + %7 = load i32, i32* %x, align 4 %eq4 = icmp eq i32 %7, 0 br i1 %eq4, label %if.then5, label %if.exit12 if.then5: ; preds = %if.exit3 - %8 = load i32, ptr %x, align 4 + %8 = load i32, i32* %x, align 4 %mul6 = mul i32 %8, 2 - store i32 %mul6, ptr %x, align 4 - %9 = load i32, ptr %x, align 4 + store i32 %mul6, i32* %x, align 4 + %9 = load i32, i32* %x, align 4 %lt7 = icmp slt i32 %9, 100 br i1 %lt7, label %if.then8, label %if.exit9 if.then8: ; preds = %if.then5 - %10 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %10) + %10 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0), i32 %10) br label %loop.exit11 if.exit9: ; preds = %if.then5 - %11 = load i32, ptr %x, align 4 + %11 = load i32, i32* %x, align 4 %mul10 = mul i32 %11, 10000 - store i32 %mul10, ptr %x, align 4 - %12 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.4, i32 %12) + store i32 %mul10, i32* %x, align 4 + %12 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i32 0, i32 0), i32 %12) br label %loop.exit11 loop.exit11: ; preds = %if.exit9, %if.then8 ret void if.exit12: ; preds = %if.exit3 - %13 = load i32, ptr %x, align 4 + %13 = load i32, i32* %x, align 4 %mul13 = mul i32 %13, 2 - store i32 %mul13, ptr %x, align 4 - %14 = load i32, ptr %x, align 4 + store i32 %mul13, i32* %x, align 4 + %14 = load i32, i32* %x, align 4 %lt14 = icmp slt i32 %14, 100 br i1 %lt14, label %if.then15, label %if.exit16 if.then15: ; preds = %if.exit12 - %15 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.5, i32 %15) + %15 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 %15) br label %loop.exit18 if.exit16: ; preds = %if.exit12 - %16 = load i32, ptr %x, align 4 + %16 = load i32, i32* %x, align 4 %mul17 = mul i32 %16, 10000 - store i32 %mul17, ptr %x, align 4 - %17 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.6, i32 %17) + store i32 %mul17, i32* %x, align 4 + %17 = load i32, i32* %x, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0), i32 %17) br label %loop.exit18 loop.exit18: ; preds = %if.exit16, %if.then15 ret void -} +} \ No newline at end of file diff --git a/test/test_suite2/statements/defer_next_switch.c3t b/test/test_suite14/statements/defer_next_switch.c3t similarity index 90% rename from test/test_suite2/statements/defer_next_switch.c3t rename to test/test_suite14/statements/defer_next_switch.c3t index 649c25d55..f752ba0df 100644 --- a/test/test_suite2/statements/defer_next_switch.c3t +++ b/test/test_suite14/statements/defer_next_switch.c3t @@ -25,19 +25,19 @@ define void @defer_next_switch_test(i32 %0) #0 { entry: %b = alloca i8, align 1 %switch = alloca i32, align 4 - store i8 1, ptr %b, align 1 - store i32 %0, ptr %switch, align 4 + store i8 1, i8* %b, align 1 + store i32 %0, i32* %switch, align 4 br label %switch.entry switch.entry: ; preds = %entry - %1 = load i32, ptr %switch, align 4 + %1 = load i32, i32* %switch, align 4 switch i32 %1, label %switch.exit [ i32 1, label %switch.case i32 2, label %switch.case1 ] switch.case: ; preds = %switch.entry - %2 = load i8, ptr %b, align 1 + %2 = load i8, i8* %b, align 1 %3 = trunc i8 %2 to i1 br i1 %3, label %if.then, label %if.exit diff --git a/test/test_suite2/statements/defer_return.c3t b/test/test_suite14/statements/defer_return.c3t similarity index 91% rename from test/test_suite2/statements/defer_return.c3t rename to test/test_suite14/statements/defer_return.c3t index 28e12ff6e..b20533e6f 100644 --- a/test/test_suite2/statements/defer_return.c3t +++ b/test/test_suite14/statements/defer_return.c3t @@ -36,14 +36,14 @@ fn int main(int argc, char **argv) /* #expect: test.ll -define i32 @main(i32 %0, ptr %1) #0 { +define i32 @main(i32 %0, i8** %1) #0 { entry: %a = alloca i32, align 4 - store i32 0, ptr %a, align 4 + store i32 0, i32* %a, align 4 br label %loop.cond loop.cond: ; preds = %if.exit, %entry - %2 = load i32, ptr %a, align 4 + %2 = load i32, i32* %a, align 4 %intbool = icmp ne i32 %2, 0 br i1 %intbool, label %loop.body, label %loop.exit @@ -52,7 +52,7 @@ loop.body: ; preds = %loop.cond br i1 %eq, label %if.then, label %if.exit if.then: ; preds = %loop.body - %3 = load i32, ptr %a, align 4 + %3 = load i32, i32* %a, align 4 %add = add i32 %3, %0 call void @test_test2() call void @test_test1() @@ -68,7 +68,7 @@ loop.exit: ; preds = %loop.cond br label %loop.cond1 loop.cond1: ; preds = %loop.exit - %4 = load i32, ptr %a, align 4 + %4 = load i32, i32* %a, align 4 %intbool2 = icmp ne i32 %4, 0 br i1 %intbool2, label %loop.body3, label %loop.exit8 @@ -77,7 +77,7 @@ loop.body3: ; preds = %loop.cond1 br i1 %eq4, label %if.then5, label %if.exit7 if.then5: ; preds = %loop.body3 - %5 = load i32, ptr %a, align 4 + %5 = load i32, i32* %a, align 4 %add6 = add i32 %5, 2 call void @test_test6() call void @test_test5() diff --git a/test/test_suite2/statements/defer_test.c3 b/test/test_suite14/statements/defer_test.c3 similarity index 100% rename from test/test_suite2/statements/defer_test.c3 rename to test/test_suite14/statements/defer_test.c3 diff --git a/test/test_suite2/statements/defer_with_loop.c3t b/test/test_suite14/statements/defer_with_loop.c3t similarity index 68% rename from test/test_suite2/statements/defer_with_loop.c3t rename to test/test_suite14/statements/defer_with_loop.c3t index 717e5f771..67da269ef 100644 --- a/test/test_suite2/statements/defer_with_loop.c3t +++ b/test/test_suite14/statements/defer_with_loop.c3t @@ -38,22 +38,22 @@ entry: 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 + 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, ptr %i, align 4 + %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, ptr %i, align 4 + %2 = load i32, i32* %i, align 4 %add = add i32 %0, %2 - call void (ptr, ...) @printf(ptr @.str.1, i32 %add) - %3 = load i32, ptr %i, align 4 + 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, ptr %i, align 4 + store i32 %add1, i32* %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond @@ -64,42 +64,42 @@ if.exit: ; preds = %entry br i1 %eq2, label %if.then3, label %if.exit11 if.then3: ; preds = %if.exit - store i32 0, ptr %i4, align 4 + store i32 0, i32* %i4, align 4 br label %loop.cond5 loop.cond5: ; preds = %loop.body7, %if.then3 - %4 = load i32, ptr %i4, align 4 + %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, ptr %i4, align 4 + %5 = load i32, i32* %i4, align 4 %add8 = add i32 %0, %5 - call void (ptr, ...) @printf(ptr @.str.2, i32 %add8) - %6 = load i32, ptr %i4, align 4 + 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, ptr %i4, align 4 + 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, ptr %i12, align 4 + store i32 0, i32* %i12, align 4 br label %loop.cond13 loop.cond13: ; preds = %loop.body15, %if.exit11 - %7 = load i32, ptr %i12, align 4 + %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, ptr %i12, align 4 + %8 = load i32, i32* %i12, align 4 %add16 = add i32 %0, %8 - call void (ptr, ...) @printf(ptr @.str.3, i32 %add16) - %9 = load i32, ptr %i12, align 4 + 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, ptr %i12, align 4 + store i32 %add17, i32* %i12, align 4 br label %loop.cond13 loop.exit18: ; preds = %loop.cond13 diff --git a/test/test_suite2/statements/do_without_compound.c3 b/test/test_suite14/statements/do_without_compound.c3 similarity index 100% rename from test/test_suite2/statements/do_without_compound.c3 rename to test/test_suite14/statements/do_without_compound.c3 diff --git a/test/test_suite2/statements/fallthough_do.c3t b/test/test_suite14/statements/fallthough_do.c3t similarity index 69% rename from test/test_suite2/statements/fallthough_do.c3t rename to test/test_suite14/statements/fallthough_do.c3t index 65c2bfb6b..d37601048 100644 --- a/test/test_suite2/statements/fallthough_do.c3t +++ b/test/test_suite14/statements/fallthough_do.c3t @@ -42,13 +42,13 @@ fn void main() define void @foo_main() #0 { entry: %i = alloca i32, align 4 - store i32 10, ptr %i, align 4 + store i32 10, i32* %i, align 4 %0 = call i32 @foo_test() - call void (ptr, ...) @printf(ptr @.str, i32 %0) - %1 = load i32, ptr %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %0) + %1 = load i32, i32* %i, align 4 %2 = call i32 @foo_test() - call void (ptr, ...) @printf(ptr @.str.1, i32 %1, i32 %2) - %3 = load i32, ptr %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %1, i32 %2) + %3 = load i32, i32* %i, align 4 %lt = icmp slt i32 %3, 0 br i1 %lt, label %if.then, label %if.exit @@ -56,13 +56,13 @@ if.then: ; preds = %entry br label %loop.exit if.exit: ; preds = %entry - %4 = load i32, ptr %i, align 4 + %4 = load i32, i32* %i, align 4 %5 = call i32 @foo_test() - call void (ptr, ...) @printf(ptr @.str.2, i32 %4, i32 %5) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i32 %4, i32 %5) br label %loop.exit loop.exit: ; preds = %if.exit, %if.then - %6 = load i32, ptr %i, align 4 + %6 = load i32, i32* %i, align 4 %lt1 = icmp slt i32 %6, 0 br i1 %lt1, label %if.then2, label %if.exit3 @@ -70,9 +70,9 @@ if.then2: ; preds = %loop.exit br label %loop.exit4 if.exit3: ; preds = %loop.exit - %7 = load i32, ptr %i, align 4 + %7 = load i32, i32* %i, align 4 %8 = call i32 @foo_test() - call void (ptr, ...) @printf(ptr @.str.3, i32 %7, i32 %8) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i32 %7, i32 %8) br label %loop.exit4 loop.exit4: ; preds = %if.exit3, %if.then2 diff --git a/test/test_suite2/statements/for.c3 b/test/test_suite14/statements/for.c3 similarity index 100% rename from test/test_suite2/statements/for.c3 rename to test/test_suite14/statements/for.c3 diff --git a/test/test_suite2/statements/for_empty.c3 b/test/test_suite14/statements/for_empty.c3 similarity index 100% rename from test/test_suite2/statements/for_empty.c3 rename to test/test_suite14/statements/for_empty.c3 diff --git a/test/test_suite2/statements/for_errors.c3 b/test/test_suite14/statements/for_errors.c3 similarity index 100% rename from test/test_suite2/statements/for_errors.c3 rename to test/test_suite14/statements/for_errors.c3 diff --git a/test/test_suite2/statements/for_with_extra_declarations.c3 b/test/test_suite14/statements/for_with_extra_declarations.c3 similarity index 100% rename from test/test_suite2/statements/for_with_extra_declarations.c3 rename to test/test_suite14/statements/for_with_extra_declarations.c3 diff --git a/test/test_suite2/statements/foreach_break.c3t b/test/test_suite14/statements/foreach_break.c3t similarity index 61% rename from test/test_suite2/statements/foreach_break.c3t rename to test/test_suite14/statements/foreach_break.c3t index 000e6b1a5..c735dbc40 100644 --- a/test/test_suite2/statements/foreach_break.c3t +++ b/test/test_suite14/statements/foreach_break.c3t @@ -21,27 +21,27 @@ entry: %g = alloca i32, align 4 %.anon = alloca i64, align 8 %z = alloca i32, align 4 - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 - store i32 0, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 - store i32 0, ptr %2, align 4 - store i32 0, ptr %g, align 4 - store i64 0, ptr %.anon, align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 + store i32 0, i32* %2, align 4 + store i32 0, i32* %g, align 4 + store i64 0, i64* %.anon, align 8 br label %loop.cond loop.cond: ; preds = %loop.inc, %entry - %3 = load i64, ptr %.anon, align 8 + %3 = load i64, i64* %.anon, align 8 %gt = icmp ugt i64 3, %3 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %4 = load i64, ptr %.anon, align 8 - %5 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 %4 - %6 = load i32, ptr %5, align 4 - store i32 %6, ptr %z, align 4 - %7 = load i32, ptr %z, align 4 + %4 = load i64, i64* %.anon, align 8 + %5 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 %4 + %6 = load i32, i32* %5, align 4 + store i32 %6, i32* %z, align 4 + %7 = load i32, i32* %z, align 4 %gt1 = icmp sgt i32 %7, 0 br i1 %gt1, label %if.then, label %if.exit @@ -49,7 +49,7 @@ if.then: ; preds = %loop.body br label %loop.exit if.exit: ; preds = %loop.body - %8 = load i32, ptr %z, align 4 + %8 = load i32, i32* %z, align 4 %eq = icmp eq i32 %8, 1 br i1 %eq, label %if.then2, label %if.exit3 @@ -57,16 +57,16 @@ if.then2: ; preds = %if.exit br label %loop.inc if.exit3: ; preds = %if.exit - %9 = load i32, ptr %g, align 4 - %10 = load i32, ptr %z, align 4 + %9 = load i32, i32* %g, align 4 + %10 = load i32, i32* %z, align 4 %add = add i32 %9, %10 - store i32 %add, ptr %g, align 4 + store i32 %add, i32* %g, align 4 br label %loop.inc loop.inc: ; preds = %if.exit3, %if.then2 - %11 = load i64, ptr %.anon, align 8 + %11 = load i64, i64* %.anon, align 8 %add4 = add i64 %11, 1 - store i64 %add4, ptr %.anon, align 8 + store i64 %add4, i64* %.anon, align 8 br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond diff --git a/test/test_suite14/statements/foreach_common.c3t b/test/test_suite14/statements/foreach_common.c3t new file mode 100644 index 000000000..a5f1918f8 --- /dev/null +++ b/test/test_suite14/statements/foreach_common.c3t @@ -0,0 +1,377 @@ +// #target: macos-x64 +module test; + +extern fn void printf(char*, ...); + +fn void main() +{ + float[3] foo = { 2, 4.5, 8 }; + float[<3>] foo2 = { 2, 4.5, 8 }; + foreach (a : foo) + { + printf("Value: %f\n", a); + } + foreach (float* &a : foo) + { + *a *= 2; + printf("Value: %f\n", *a); + } + foreach (void* &a : foo) + { + printf("Value: %f\n", *((float*)(a))); + } + foreach (i, a : foo) + { + printf("Value[%d]: %f\n", i, a); + } + foreach (char i, double a : foo) + { + printf("Value2[%d]: %f\n", i, a); + } + foreach (double a : foo) + { + printf("Value3: %f\n", a); + } + + foreach (a : foo2) + { + printf("Value: %f\n", a); + } + foreach (float* &a : foo2) + { + *a *= 2; + printf("Value: %f\n", *a); + } + foreach (i, a : foo2) + { + printf("Value[%d]: %f\n", i, a); + } + foreach (char i, double a : foo2) + { + printf("Value2[%d]: %f\n", i, a); + } + foreach (double a : foo2) + { + printf("Value3: %f\n", a); + } +} + +/* #expect: test.ll + +entry: + %foo = alloca [3 x float], align 4 + %foo2 = alloca <3 x float>, align 16 + %.anon = alloca i64, align 8 + %a = alloca float, align 4 + %.anon1 = alloca i64, align 8 + %a5 = alloca float*, align 8 + %.anon9 = alloca i64, align 8 + %a13 = alloca i8*, align 8 + %.anon18 = alloca i64, align 8 + %i = alloca i64, align 8 + %a22 = alloca float, align 4 + %.anon26 = alloca i64, align 8 + %i30 = alloca i8, align 1 + %a31 = alloca double, align 8 + %.anon35 = alloca i64, align 8 + %a39 = alloca double, align 8 + %.anon43 = alloca i64, align 8 + %.anon44 = alloca i64, align 8 + %a47 = alloca float, align 4 + %.anon51 = alloca i64, align 8 + %.anon52 = alloca i64, align 8 + %a56 = alloca float*, align 8 + %.anon61 = alloca i64, align 8 + %.anon62 = alloca i64, align 8 + %i66 = alloca i64, align 8 + %a67 = alloca float, align 4 + %.anon71 = alloca i64, align 8 + %.anon72 = alloca i64, align 8 + %i76 = alloca i8, align 1 + %a78 = alloca double, align 8 + %.anon83 = alloca i64, align 8 + %.anon84 = alloca i64, align 8 + %a88 = alloca double, align 8 + %0 = bitcast [3 x float]* %foo to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x float]* @.__const to i8*), i32 12, i1 false) + store <3 x float> , <3 x float>* %foo2, align 16 + store i64 0, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %1 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 3, %1 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %2 = load i64, i64* %.anon, align 8 + %3 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %2 + %4 = load float, float* %3, align 4 + store float %4, float* %a, align 4 + %5 = load float, float* %a, align 4 + %fpfpext = fpext float %5 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), double %fpfpext) + %6 = load i64, i64* %.anon, align 8 + %add = add i64 %6, 1 + store i64 %add, i64* %.anon, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + store i64 0, i64* %.anon1, align 8 + br label %loop.cond2 + +loop.cond2: ; preds = %loop.body4, %loop.exit + %7 = load i64, i64* %.anon1, align 8 + %gt3 = icmp ugt i64 3, %7 + br i1 %gt3, label %loop.body4, label %loop.exit8 + +loop.body4: ; preds = %loop.cond2 + %8 = load i64, i64* %.anon1, align 8 + %9 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %8 + store float* %9, float** %a5, align 8 + %10 = load float*, float** %a5, align 8 + %11 = load float, float* %10, align 8 + %fmul = fmul float %11, 2.000000e+00 + store float %fmul, float* %10, align 8 + %12 = load float*, float** %a5, align 8 + %13 = load float, float* %12, align 8 + %fpfpext6 = fpext float %13 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %fpfpext6) + %14 = load i64, i64* %.anon1, align 8 + %add7 = add i64 %14, 1 + store i64 %add7, i64* %.anon1, align 8 + br label %loop.cond2 + +loop.exit8: ; preds = %loop.cond2 + store i64 0, i64* %.anon9, align 8 + br label %loop.cond10 + +loop.cond10: ; preds = %loop.body12, %loop.exit8 + %15 = load i64, i64* %.anon9, align 8 + %gt11 = icmp ugt i64 3, %15 + br i1 %gt11, label %loop.body12, label %loop.exit17 + +loop.body12: ; preds = %loop.cond10 + %16 = load i64, i64* %.anon9, align 8 + %17 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %16 + %ptrptr = bitcast float* %17 to i8* + store i8* %ptrptr, i8** %a13, align 8 + %18 = load i8*, i8** %a13, align 8 + %ptrptr14 = bitcast i8* %18 to float* + %19 = load float, float* %ptrptr14, align 8 + %fpfpext15 = fpext float %19 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), double %fpfpext15) + %20 = load i64, i64* %.anon9, align 8 + %add16 = add i64 %20, 1 + store i64 %add16, i64* %.anon9, align 8 + br label %loop.cond10 + +loop.exit17: ; preds = %loop.cond10 + store i64 0, i64* %.anon18, align 8 + br label %loop.cond19 + +loop.cond19: ; preds = %loop.body21, %loop.exit17 + %21 = load i64, i64* %.anon18, align 8 + %gt20 = icmp ugt i64 3, %21 + br i1 %gt20, label %loop.body21, label %loop.exit25 + +loop.body21: ; preds = %loop.cond19 + %22 = load i64, i64* %.anon18, align 8 + store i64 %22, i64* %i, align 8 + %23 = load i64, i64* %.anon18, align 8 + %24 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %23 + %25 = load float, float* %24, align 4 + store float %25, float* %a22, align 4 + %26 = load i64, i64* %i, align 8 + %27 = load float, float* %a22, align 4 + %fpfpext23 = fpext float %27 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 %26, double %fpfpext23) + %28 = load i64, i64* %.anon18, align 8 + %add24 = add i64 %28, 1 + store i64 %add24, i64* %.anon18, align 8 + br label %loop.cond19 + +loop.exit25: ; preds = %loop.cond19 + store i64 0, i64* %.anon26, align 8 + br label %loop.cond27 + +loop.cond27: ; preds = %loop.body29, %loop.exit25 + %29 = load i64, i64* %.anon26, align 8 + %gt28 = icmp ugt i64 3, %29 + br i1 %gt28, label %loop.body29, label %loop.exit34 + +loop.body29: ; preds = %loop.cond27 + %30 = load i64, i64* %.anon26, align 8 + %ztrunc = trunc i64 %30 to i8 + store i8 %ztrunc, i8* %i30, align 1 + %31 = load i64, i64* %.anon26, align 8 + %32 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %31 + %33 = load float, float* %32, align 4 + %fpfpext32 = fpext float %33 to double + store double %fpfpext32, double* %a31, align 8 + %34 = load i8, i8* %i30, align 1 + %uisiext = zext i8 %34 to i32 + %35 = load double, double* %a31, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i32 0, i32 0), i32 %uisiext, double %35) + %36 = load i64, i64* %.anon26, align 8 + %add33 = add i64 %36, 1 + store i64 %add33, i64* %.anon26, align 8 + br label %loop.cond27 + +loop.exit34: ; preds = %loop.cond27 + store i64 0, i64* %.anon35, align 8 + br label %loop.cond36 + +loop.cond36: ; preds = %loop.body38, %loop.exit34 + %37 = load i64, i64* %.anon35, align 8 + %gt37 = icmp ugt i64 3, %37 + br i1 %gt37, label %loop.body38, label %loop.exit42 + +loop.body38: ; preds = %loop.cond36 + %38 = load i64, i64* %.anon35, align 8 + %39 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %38 + %40 = load float, float* %39, align 4 + %fpfpext40 = fpext float %40 to double + store double %fpfpext40, double* %a39, align 8 + %41 = load double, double* %a39, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.5, i32 0, i32 0), double %41) + %42 = load i64, i64* %.anon35, align 8 + %add41 = add i64 %42, 1 + store i64 %add41, i64* %.anon35, align 8 + br label %loop.cond36 + +loop.exit42: ; preds = %loop.cond36 + store i64 3, i64* %.anon43, align 8 + store i64 0, i64* %.anon44, align 8 + br label %loop.cond45 + +loop.cond45: ; preds = %loop.body46, %loop.exit42 + %43 = load i64, i64* %.anon44, align 8 + %44 = load i64, i64* %.anon43, align 8 + %lt = icmp ult i64 %43, %44 + br i1 %lt, label %loop.body46, label %loop.exit50 + +loop.body46: ; preds = %loop.cond45 + %45 = load <3 x float>, <3 x float>* %foo2, align 16 + %46 = load i64, i64* %.anon44, align 8 + %47 = extractelement <3 x float> %45, i64 %46 + store float %47, float* %a47, align 4 + %48 = load float, float* %a47, align 4 + %fpfpext48 = fpext float %48 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i32 0, i32 0), double %fpfpext48) + %49 = load i64, i64* %.anon44, align 8 + %add49 = add i64 %49, 1 + store i64 %add49, i64* %.anon44, align 8 + br label %loop.cond45 + +loop.exit50: ; preds = %loop.cond45 + store i64 3, i64* %.anon51, align 8 + store i64 0, i64* %.anon52, align 8 + br label %loop.cond53 + +loop.cond53: ; preds = %loop.body55, %loop.exit50 + %50 = load i64, i64* %.anon52, align 8 + %51 = load i64, i64* %.anon51, align 8 + %lt54 = icmp ult i64 %50, %51 + br i1 %lt54, label %loop.body55, label %loop.exit60 + +loop.body55: ; preds = %loop.cond53 + %52 = load i64, i64* %.anon52, align 8 + %53 = getelementptr inbounds <3 x float>, <3 x float>* %foo2, i64 0, i64 %52 + store float* %53, float** %a56, align 8 + %54 = load float*, float** %a56, align 8 + %55 = load float, float* %54, align 8 + %fmul57 = fmul float %55, 2.000000e+00 + store float %fmul57, float* %54, align 8 + %56 = load float*, float** %a56, align 8 + %57 = load float, float* %56, align 8 + %fpfpext58 = fpext float %57 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i32 0, i32 0), double %fpfpext58) + %58 = load i64, i64* %.anon52, align 8 + %add59 = add i64 %58, 1 + store i64 %add59, i64* %.anon52, align 8 + br label %loop.cond53 + +loop.exit60: ; preds = %loop.cond53 + store i64 3, i64* %.anon61, align 8 + store i64 0, i64* %.anon62, align 8 + br label %loop.cond63 + +loop.cond63: ; preds = %loop.body65, %loop.exit60 + %59 = load i64, i64* %.anon62, align 8 + %60 = load i64, i64* %.anon61, align 8 + %lt64 = icmp ult i64 %59, %60 + br i1 %lt64, label %loop.body65, label %loop.exit70 + +loop.body65: ; preds = %loop.cond63 + %61 = load i64, i64* %.anon62, align 8 + store i64 %61, i64* %i66, align 8 + %62 = load <3 x float>, <3 x float>* %foo2, align 16 + %63 = load i64, i64* %.anon62, align 8 + %64 = extractelement <3 x float> %62, i64 %63 + store float %64, float* %a67, align 4 + %65 = load i64, i64* %i66, align 8 + %66 = load float, float* %a67, align 4 + %fpfpext68 = fpext float %66 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i32 0, i32 0), i64 %65, double %fpfpext68) + %67 = load i64, i64* %.anon62, align 8 + %add69 = add i64 %67, 1 + store i64 %add69, i64* %.anon62, align 8 + br label %loop.cond63 + +loop.exit70: ; preds = %loop.cond63 + store i64 3, i64* %.anon71, align 8 + store i64 0, i64* %.anon72, align 8 + br label %loop.cond73 + +loop.cond73: ; preds = %loop.body75, %loop.exit70 + %68 = load i64, i64* %.anon72, align 8 + %69 = load i64, i64* %.anon71, align 8 + %lt74 = icmp ult i64 %68, %69 + br i1 %lt74, label %loop.body75, label %loop.exit82 + +loop.body75: ; preds = %loop.cond73 + %70 = load i64, i64* %.anon72, align 8 + %ztrunc77 = trunc i64 %70 to i8 + store i8 %ztrunc77, i8* %i76, align 1 + %71 = load <3 x float>, <3 x float>* %foo2, align 16 + %72 = load i64, i64* %.anon72, align 8 + %73 = extractelement <3 x float> %71, i64 %72 + %fpfpext79 = fpext float %73 to double + store double %fpfpext79, double* %a78, align 8 + %74 = load i8, i8* %i76, align 1 + %uisiext80 = zext i8 %74 to i32 + %75 = load double, double* %a78, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.9, i32 0, i32 0), i32 %uisiext80, double %75) + %76 = load i64, i64* %.anon72, align 8 + %add81 = add i64 %76, 1 + store i64 %add81, i64* %.anon72, align 8 + br label %loop.cond73 + +loop.exit82: ; preds = %loop.cond73 + store i64 3, i64* %.anon83, align 8 + store i64 0, i64* %.anon84, align 8 + br label %loop.cond85 + +loop.cond85: ; preds = %loop.body87, %loop.exit82 + %77 = load i64, i64* %.anon84, align 8 + %78 = load i64, i64* %.anon83, align 8 + %lt86 = icmp ult i64 %77, %78 + br i1 %lt86, label %loop.body87, label %loop.exit91 + +loop.body87: ; preds = %loop.cond85 + %79 = load <3 x float>, <3 x float>* %foo2, align 16 + %80 = load i64, i64* %.anon84, align 8 + %81 = extractelement <3 x float> %79, i64 %80 + %fpfpext89 = fpext float %81 to double + store double %fpfpext89, double* %a88, align 8 + %82 = load double, double* %a88, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.10, i32 0, i32 0), double %82) + %83 = load i64, i64* %.anon84, align 8 + %add90 = add i64 %83, 1 + store i64 %add90, i64* %.anon84, align 8 + br label %loop.cond85 + +loop.exit91: ; preds = %loop.cond85 + ret void +} diff --git a/test/test_suite14/statements/foreach_custom.c3t b/test/test_suite14/statements/foreach_custom.c3t new file mode 100644 index 000000000..481036d1a --- /dev/null +++ b/test/test_suite14/statements/foreach_custom.c3t @@ -0,0 +1,94 @@ +// #target: macos-x64 + +module test; +struct Foo +{ + int[] x; +} + +macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) +{ + return foo.x[index]; +} + +macro usz Foo.@operator_len(Foo &foo) @operator(len) +{ + return foo.x.len; +} + +fn void main() +{ + int[*] i = { 1, 3, 10 }; + Foo x = { &i }; + foreach FOO: (int f : x) { + printf("%d\n", f); + while (1) + { + break FOO; + } + } +} + +extern fn int printf(char *fmt, ...); + +/* #expect: test.ll + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %i = alloca [3 x i32], align 4 + %x = alloca %Foo, align 8 + %.anon = alloca i64, align 8 + %.anon1 = alloca i64, align 8 + %f = alloca i32, align 4 + %index = alloca i64, align 8 + %0 = bitcast [3 x i32]* %i to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %2 = bitcast [3 x i32]* %i to i32* + %3 = insertvalue %"int[]" undef, i32* %2, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, %"int[]"* %1, align 8 + %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %.anon, align 8 + store i64 0, i64* %.anon1, align 8 + br label %loop.cond + +loop.cond: ; preds = %entry + %8 = load i64, i64* %.anon1, align 8 + %9 = load i64, i64* %.anon, align 8 + %lt = icmp ult i64 %8, %9 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %10 = load i64, i64* %.anon1, align 8 + store i64 %10, i64* %index, align 8 + %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 + %13 = load i32*, i32** %12, align 8 + %14 = load i64, i64* %index, align 8 + %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 + %15 = load i32, i32* %ptroffset, align 4 + store i32 %15, i32* %f, align 4 + %16 = load i32, i32* %f, align 4 + %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + br label %loop.body2 + +loop.body2: ; preds = %loop.body + br label %loop.exit + +loop.exit: ; preds = %loop.body2, %loop.cond + ret void +} + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @test_main() + ret i32 0 +} diff --git a/test/test_suite2/statements/foreach_custom_errors.c3 b/test/test_suite14/statements/foreach_custom_errors.c3 similarity index 100% rename from test/test_suite2/statements/foreach_custom_errors.c3 rename to test/test_suite14/statements/foreach_custom_errors.c3 diff --git a/test/test_suite14/statements/foreach_custom_macro.c3t b/test/test_suite14/statements/foreach_custom_macro.c3t new file mode 100644 index 000000000..449c9be9e --- /dev/null +++ b/test/test_suite14/statements/foreach_custom_macro.c3t @@ -0,0 +1,82 @@ +// #target: macos-x64 +module foo; +struct Foo +{ + int[] x; +} + +macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) +{ + return foo.x[index]; +} + +macro usz Foo.@operator_len(Foo &foo) @operator(len) +{ + return foo.x.len; +} + +fn void main() +{ + int[*] i = { 1, 3, 10 }; + Foo x = { &i }; + foreach FOO: (int f : x) { + printf("%d\n", f); + while (1) + { + break FOO; + } + } +} + +extern fn int printf(char *fmt, ...); + +/* #expect: foo.ll + +define void @foo_main() #0 { +entry: + %i = alloca [3 x i32], align 4 + %x = alloca %Foo, align 8 + %.anon = alloca i64, align 8 + %.anon1 = alloca i64, align 8 + %f = alloca i32, align 4 + %index = alloca i64, align 8 + %0 = bitcast [3 x i32]* %i to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %2 = bitcast [3 x i32]* %i to i32* + %3 = insertvalue %"int[]" undef, i32* %2, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, %"int[]"* %1, align 8 + %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %.anon, align 8 + store i64 0, i64* %.anon1, align 8 + br label %loop.cond + +loop.cond: ; preds = %entry + %8 = load i64, i64* %.anon1, align 8 + %9 = load i64, i64* %.anon, align 8 + %lt = icmp ult i64 %8, %9 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %10 = load i64, i64* %.anon1, align 8 + store i64 %10, i64* %index, align 8 + %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 + %13 = load i32*, i32** %12, align 8 + %14 = load i64, i64* %index, align 8 + %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 + %15 = load i32, i32* %ptroffset, align 4 + store i32 %15, i32* %f, align 4 + %16 = load i32, i32* %f, align 4 + %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + br label %loop.body2 + +loop.body2: ; preds = %loop.body + br label %loop.exit + +loop.exit: ; preds = %loop.body2, %loop.cond + ret void +} diff --git a/test/test_suite2/statements/foreach_errors.c3 b/test/test_suite14/statements/foreach_errors.c3 similarity index 100% rename from test/test_suite2/statements/foreach_errors.c3 rename to test/test_suite14/statements/foreach_errors.c3 diff --git a/test/test_suite14/statements/foreach_more_implementations.c3t b/test/test_suite14/statements/foreach_more_implementations.c3t new file mode 100644 index 000000000..8008fed16 --- /dev/null +++ b/test/test_suite14/statements/foreach_more_implementations.c3t @@ -0,0 +1,185 @@ +// #target: macos-x64 +module test; + +import std::io; +struct Vector +{ + usz size; + int* elements; +} + +macro int Vector.get(Vector* vector, usz element) @operator([]) +{ + return vector.elements[element]; +} + +macro int* Vector.get_ref(Vector* vector, usz element) @operator(&[]) +{ + return &vector.elements[element]; +} + +macro usz Vector.size(Vector vector) @operator(len) { + return vector.size; +} + +fn void main() +{ + int[2] x = { 1, 2 }; + Vector v = { 2, &x }; + + foreach (int* &ref : v) + { + std::io::printf("%d\n", *ref); + *ref += 2; + } + foreach (int i : v) + { + std::io::printf("%d\n", i); + } +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %x = alloca [2 x i32], align 4 + %v = alloca %Vector, align 8 + %.anon = alloca i64, align 8 + %vector = alloca %Vector, align 8 + %.anon1 = alloca i64, align 8 + %ref = alloca i32*, align 8 + %vector2 = alloca %Vector*, align 8 + %element = alloca i64, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %.anon4 = alloca i64, align 8 + %vector5 = alloca %Vector, align 8 + %.anon6 = alloca i64, align 8 + %i = alloca i32, align 4 + %vector10 = alloca %Vector*, align 8 + %element11 = alloca i64, align 8 + %retparam13 = alloca i64, align 8 + %varargslots14 = alloca [1 x %variant], align 16 + %taddr15 = alloca %"variant[]", align 8 + %0 = bitcast [2 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([2 x i32]* @.__const to i8*), i32 8, i1 false) + %1 = getelementptr inbounds %Vector, %Vector* %v, i32 0, i32 0 + store i64 2, i64* %1, align 8 + %2 = getelementptr inbounds %Vector, %Vector* %v, i32 0, i32 1 + %ptrptr = bitcast [2 x i32]* %x to i32* + store i32* %ptrptr, i32** %2, align 8 + %3 = bitcast %Vector* %vector to i8* + %4 = bitcast %Vector* %v to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %3, i8* align 8 %4, i32 16, i1 false) + %5 = getelementptr inbounds %Vector, %Vector* %vector, i32 0, i32 0 + %6 = load i64, i64* %5, align 8 + store i64 %6, i64* %.anon, align 8 + store i64 0, i64* %.anon1, align 8 + br label %loop.cond + +loop.cond: ; preds = %voiderr, %entry + %7 = load i64, i64* %.anon1, align 8 + %8 = load i64, i64* %.anon, align 8 + %lt = icmp ult i64 %7, %8 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + store %Vector* %v, %Vector** %vector2, align 8 + %9 = load i64, i64* %.anon1, align 8 + store i64 %9, i64* %element, align 8 + %10 = load %Vector*, %Vector** %vector2, align 8 + %11 = getelementptr inbounds %Vector, %Vector* %10, i32 0, i32 1 + %12 = load i32*, i32** %11, align 8 + %13 = load i64, i64* %element, align 8 + %ptroffset = getelementptr inbounds i32, i32* %12, i64 %13 + store i32* %ptroffset, i32** %ref, align 8 + %14 = load i32*, i32** %ref, align 8 + %15 = bitcast i32* %14 to i8* + %16 = insertvalue %variant undef, i8* %15, 0 + %17 = insertvalue %variant %16, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %18 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %17, %variant* %18, align 16 + %19 = bitcast [1 x %variant]* %varargslots to %variant* + %20 = insertvalue %"variant[]" undef, %variant* %19, 0 + %21 = insertvalue %"variant[]" %20, i64 1, 1 + store %"variant[]" %21, %"variant[]"* %taddr, align 8 + %22 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %23 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 0 + %lo = load i8*, i8** %23, align 8 + %24 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %22, i32 0, i32 1 + %hi = load i64, i64* %24, align 8 + %25 = call i64 @std_io_printf(i64* %retparam, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 3, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %25, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %loop.body + br label %voiderr + +voiderr: ; preds = %after_check, %loop.body + %26 = load i32*, i32** %ref, align 8 + %27 = load i32, i32* %26, align 8 + %add = add i32 %27, 2 + store i32 %add, i32* %26, align 8 + %28 = load i64, i64* %.anon1, align 8 + %add3 = add i64 %28, 1 + store i64 %add3, i64* %.anon1, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %29 = bitcast %Vector* %vector5 to i8* + %30 = bitcast %Vector* %v to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %29, i8* align 8 %30, i32 16, i1 false) + %31 = getelementptr inbounds %Vector, %Vector* %vector5, i32 0, i32 0 + %32 = load i64, i64* %31, align 8 + store i64 %32, i64* %.anon4, align 8 + store i64 0, i64* %.anon6, align 8 + br label %loop.cond7 + +loop.cond7: ; preds = %voiderr20, %loop.exit + %33 = load i64, i64* %.anon6, align 8 + %34 = load i64, i64* %.anon4, align 8 + %lt8 = icmp ult i64 %33, %34 + br i1 %lt8, label %loop.body9, label %loop.exit22 + +loop.body9: ; preds = %loop.cond7 + store %Vector* %v, %Vector** %vector10, align 8 + %35 = load i64, i64* %.anon6, align 8 + store i64 %35, i64* %element11, align 8 + %36 = load %Vector*, %Vector** %vector10, align 8 + %37 = getelementptr inbounds %Vector, %Vector* %36, i32 0, i32 1 + %38 = load i32*, i32** %37, align 8 + %39 = load i64, i64* %element11, align 8 + %ptroffset12 = getelementptr inbounds i32, i32* %38, i64 %39 + %40 = load i32, i32* %ptroffset12, align 4 + store i32 %40, i32* %i, align 4 + %41 = bitcast i32* %i to i8* + %42 = insertvalue %variant undef, i8* %41, 0 + %43 = insertvalue %variant %42, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %44 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots14, i64 0, i64 0 + store %variant %43, %variant* %44, align 16 + %45 = bitcast [1 x %variant]* %varargslots14 to %variant* + %46 = insertvalue %"variant[]" undef, %variant* %45, 0 + %47 = insertvalue %"variant[]" %46, i64 1, 1 + store %"variant[]" %47, %"variant[]"* %taddr15, align 8 + %48 = bitcast %"variant[]"* %taddr15 to { i8*, i64 }* + %49 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 0 + %lo16 = load i8*, i8** %49, align 8 + %50 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %48, i32 0, i32 1 + %hi17 = load i64, i64* %50, align 8 + %51 = call i64 @std_io_printf(i64* %retparam13, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i64 3, i8* %lo16, i64 %hi17) + %not_err18 = icmp eq i64 %51, 0 + br i1 %not_err18, label %after_check19, label %voiderr20 + +after_check19: ; preds = %loop.body9 + br label %voiderr20 + +voiderr20: ; preds = %after_check19, %loop.body9 + %52 = load i64, i64* %.anon6, align 8 + %add21 = add i64 %52, 1 + store i64 %add21, i64* %.anon6, align 8 + br label %loop.cond7 + +loop.exit22: ; preds = %loop.cond7 + ret void +} \ No newline at end of file diff --git a/test/test_suite2/statements/foreach_parse_error.c3 b/test/test_suite14/statements/foreach_parse_error.c3 similarity index 100% rename from test/test_suite2/statements/foreach_parse_error.c3 rename to test/test_suite14/statements/foreach_parse_error.c3 diff --git a/test/test_suite2/statements/foreach_r_break.c3t b/test/test_suite14/statements/foreach_r_break.c3t similarity index 60% rename from test/test_suite2/statements/foreach_r_break.c3t rename to test/test_suite14/statements/foreach_r_break.c3t index a626decf6..7254b5908 100644 --- a/test/test_suite2/statements/foreach_r_break.c3t +++ b/test/test_suite14/statements/foreach_r_break.c3t @@ -22,30 +22,30 @@ entry: %g = alloca i32, align 4 %.anon = alloca i64, align 8 %z = alloca i32, align 4 - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 - store i32 0, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 - store i32 0, ptr %2, align 4 - store i32 0, ptr %g, align 4 - store i64 3, ptr %.anon, align 8 + %0 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 + store i32 0, i32* %0, align 4 + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + store i32 0, i32* %1, align 4 + %2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2 + store i32 0, i32* %2, align 4 + store i32 0, i32* %g, align 4 + store i64 3, i64* %.anon, align 8 br label %loop.cond loop.cond: ; preds = %if.exit3, %if.then2, %entry - %3 = load i64, ptr %.anon, align 8 + %3 = load i64, i64* %.anon, align 8 %gt = icmp ugt i64 %3, 0 br i1 %gt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %4 = load i64, ptr %.anon, align 8 + %4 = load i64, i64* %.anon, align 8 %sub = sub i64 %4, 1 - store i64 %sub, ptr %.anon, align 8 - %5 = load i64, ptr %.anon, align 8 - %6 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 %5 - %7 = load i32, ptr %6, align 4 - store i32 %7, ptr %z, align 4 - %8 = load i32, ptr %z, align 4 + store i64 %sub, i64* %.anon, align 8 + %5 = load i64, i64* %.anon, align 8 + %6 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 %5 + %7 = load i32, i32* %6, align 4 + store i32 %7, i32* %z, align 4 + %8 = load i32, i32* %z, align 4 %gt1 = icmp sgt i32 %8, 0 br i1 %gt1, label %if.then, label %if.exit @@ -53,7 +53,7 @@ if.then: ; preds = %loop.body br label %loop.exit if.exit: ; preds = %loop.body - %9 = load i32, ptr %z, align 4 + %9 = load i32, i32* %z, align 4 %eq = icmp eq i32 %9, 1 br i1 %eq, label %if.then2, label %if.exit3 @@ -61,10 +61,10 @@ if.then2: ; preds = %if.exit br label %loop.cond if.exit3: ; preds = %if.exit - %10 = load i32, ptr %g, align 4 - %11 = load i32, ptr %z, align 4 + %10 = load i32, i32* %g, align 4 + %11 = load i32, i32* %z, align 4 %add = add i32 %10, %11 - store i32 %add, ptr %g, align 4 + store i32 %add, i32* %g, align 4 br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond diff --git a/test/test_suite14/statements/foreach_r_common.c3t b/test/test_suite14/statements/foreach_r_common.c3t new file mode 100644 index 000000000..46bc068e7 --- /dev/null +++ b/test/test_suite14/statements/foreach_r_common.c3t @@ -0,0 +1,112 @@ +// #target: macos-x64 +module test; + +extern fn void printf(char*, ...); + +fn void main() +{ + float[3] foo = { 2, 4.5, 8 }; + float[<3>] foo2 = { 2, 4.5, 8 }; + foreach_r (a : foo) + { + printf("Value: %f\n", a); + } + foreach_r (float* &a : foo) + { + *a *= 2; + printf("Value: %f\n", *a); + } + foreach_r (void* &a : foo) + { + printf("Value: %f\n", *((float*)(a))); + } + foreach_r (i, a : foo) + { + printf("Value[%d]: %f\n", i, a); + } + foreach_r (char i, double a : foo) + { + printf("Value2[%d]: %f\n", i, a); + } + foreach_r (double a : foo) + { + printf("Value3: %f\n", a); + } + + foreach_r (a : foo2) + { + printf("Value: %f\n", a); + } + foreach_r (float* &a : foo2) + { + *a *= 2; + printf("Value: %f\n", *a); + } + foreach_r (i, a : foo2) + { + printf("Value[%d]: %f\n", i, a); + } + foreach_r (char i, double a : foo2) + { + printf("Value2[%d]: %f\n", i, a); + } + foreach_r (double a : foo2) + { + printf("Value3: %f\n", a); + } +} + +/* #expect: test.ll + +entry: + %foo = alloca [3 x float], align 4 + %foo2 = alloca <3 x float>, align 16 + %.anon = alloca i64, align 8 + %a = alloca float, align 4 + %.anon1 = alloca i64, align 8 + %a6 = alloca float*, align 8 + %.anon9 = alloca i64, align 8 + %a14 = alloca i8*, align 8 + %.anon18 = alloca i64, align 8 + %66 = load i64, i64* %.anon69, align 8 + %sub73 = sub i64 %66, 1 + store i64 %sub73, i64* %.anon69, align 8 + %67 = load i64, i64* %.anon69, align 8 + %ztrunc75 = trunc i64 %67 to i8 + store i8 %ztrunc75, i8* %i74, align 1 + %68 = load <3 x float>, <3 x float>* %foo2, align 16 + %69 = load i64, i64* %.anon69, align 8 + %70 = extractelement <3 x float> %68, i64 %69 + %fpfpext77 = fpext float %70 to double + store double %fpfpext77, double* %a76, align 8 + %71 = load i8, i8* %i74, align 1 + %uisiext78 = zext i8 %71 to i32 + %72 = load double, double* %a76, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.9, i32 0, i32 0), i32 %uisiext78, double %72) + br label %loop.cond70 + +loop.exit79: ; preds = %loop.cond70 + store i64 3, i64* %.anon80, align 8 + br label %loop.cond81 + +loop.cond81: ; preds = %loop.body83, %loop.exit79 + %73 = load i64, i64* %.anon80, align 8 + %gt82 = icmp ugt i64 %73, 0 + br i1 %gt82, label %loop.body83, label %loop.exit87 + +loop.body83: ; preds = %loop.cond81 + %74 = load i64, i64* %.anon80, align 8 + %sub84 = sub i64 %74, 1 + store i64 %sub84, i64* %.anon80, align 8 + %75 = load <3 x float>, <3 x float>* %foo2, align 16 + %76 = load i64, i64* %.anon80, align 8 + %77 = extractelement <3 x float> %75, i64 %76 + %fpfpext86 = fpext float %77 to double + store double %fpfpext86, double* %a85, align 8 + %78 = load double, double* %a85, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.10, i32 0, i32 0), double %78) + br label %loop.cond81 + +loop.exit87: ; preds = %loop.cond81 + ret void +} diff --git a/test/test_suite14/statements/foreach_r_custom.c3t b/test/test_suite14/statements/foreach_r_custom.c3t new file mode 100644 index 000000000..646ae4287 --- /dev/null +++ b/test/test_suite14/statements/foreach_r_custom.c3t @@ -0,0 +1,94 @@ +// #target: macos-x64 + +module test; +struct Foo +{ + int[] x; +} + +macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) +{ + return foo.x[index]; +} + +macro usz Foo.@operator_len(Foo &foo) @operator(len) +{ + return foo.x.len; +} + +fn void main() +{ + int[*] i = { 1, 3, 10 }; + Foo x = { &i }; + foreach_r FOO: (int f : x) { + printf("%d\n", f); + while (1) + { + break FOO; + } + } +} + +extern fn int printf(char *fmt, ...); + +/* #expect: test.ll + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %i = alloca [3 x i32], align 4 + %x = alloca %Foo, align 8 + %.anon = alloca i64, align 8 + %f = alloca i32, align 4 + %index = alloca i64, align 8 + %0 = bitcast [3 x i32]* %i to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %2 = bitcast [3 x i32]* %i to i32* + %3 = insertvalue %"int[]" undef, i32* %2, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, %"int[]"* %1, align 8 + %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %entry + %8 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 %8, 0 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %9 = load i64, i64* %.anon, align 8 + %sub = sub i64 %9, 1 + store i64 %sub, i64* %.anon, align 8 + %10 = load i64, i64* %.anon, align 8 + store i64 %10, i64* %index, align 8 + %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 + %13 = load i32*, i32** %12, align 8 + %14 = load i64, i64* %index, align 8 + %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 + %15 = load i32, i32* %ptroffset, align 4 + store i32 %15, i32* %f, align 4 + %16 = load i32, i32* %f, align 4 + %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + br label %loop.body1 + +loop.body1: ; preds = %loop.body + br label %loop.exit + +loop.exit: ; preds = %loop.body1, %loop.cond + ret void +} + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @test_main() + ret i32 0 +} diff --git a/test/test_suite2/statements/foreach_r_custom_errors.c3 b/test/test_suite14/statements/foreach_r_custom_errors.c3 similarity index 100% rename from test/test_suite2/statements/foreach_r_custom_errors.c3 rename to test/test_suite14/statements/foreach_r_custom_errors.c3 diff --git a/test/test_suite14/statements/foreach_r_custom_macro.c3t b/test/test_suite14/statements/foreach_r_custom_macro.c3t new file mode 100644 index 000000000..72bd73583 --- /dev/null +++ b/test/test_suite14/statements/foreach_r_custom_macro.c3t @@ -0,0 +1,93 @@ +// #target: macos-x64 +module test; +struct Foo +{ + int[] x; +} + +macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) +{ + return foo.x[index]; +} + +macro usz Foo.@operator_len(Foo &foo) @operator(len) +{ + return foo.x.len; +} + +fn void main() +{ + int[*] i = { 1, 3, 10 }; + Foo x = { &i }; + foreach_r FOO: (int f : x) { + printf("%d\n", f); + while (1) + { + break FOO; + } + } +} + +extern fn int printf(char *fmt, ...); + +/* #expect: test.ll + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %i = alloca [3 x i32], align 4 + %x = alloca %Foo, align 8 + %.anon = alloca i64, align 8 + %f = alloca i32, align 4 + %index = alloca i64, align 8 + %0 = bitcast [3 x i32]* %i to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %2 = bitcast [3 x i32]* %i to i32* + %3 = insertvalue %"int[]" undef, i32* %2, 0 + %4 = insertvalue %"int[]" %3, i64 3, 1 + store %"int[]" %4, %"int[]"* %1, align 8 + %5 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %entry + %8 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 %8, 0 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %9 = load i64, i64* %.anon, align 8 + %sub = sub i64 %9, 1 + store i64 %sub, i64* %.anon, align 8 + %10 = load i64, i64* %.anon, align 8 + store i64 %10, i64* %index, align 8 + %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 + %12 = getelementptr inbounds %"int[]", %"int[]"* %11, i32 0, i32 0 + %13 = load i32*, i32** %12, align 8 + %14 = load i64, i64* %index, align 8 + %ptroffset = getelementptr inbounds i32, i32* %13, i64 %14 + %15 = load i32, i32* %ptroffset, align 4 + store i32 %15, i32* %f, align 4 + %16 = load i32, i32* %f, align 4 + %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) + br label %loop.body1 + +loop.body1: ; preds = %loop.body + br label %loop.exit + +loop.exit: ; preds = %loop.body1, %loop.cond + ret void +} + +; Function Attrs: nounwind +declare i32 @printf(i8*, ...) #0 + +; Function Attrs: nounwind +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @test_main() + ret i32 0 +} diff --git a/test/test_suite2/statements/foreach_r_errors.c3 b/test/test_suite14/statements/foreach_r_errors.c3 similarity index 100% rename from test/test_suite2/statements/foreach_r_errors.c3 rename to test/test_suite14/statements/foreach_r_errors.c3 diff --git a/test/test_suite2/statements/foreach_r_parse_error.c3 b/test/test_suite14/statements/foreach_r_parse_error.c3 similarity index 100% rename from test/test_suite2/statements/foreach_r_parse_error.c3 rename to test/test_suite14/statements/foreach_r_parse_error.c3 diff --git a/test/test_suite2/statements/foreach_r_with_error.c3 b/test/test_suite14/statements/foreach_r_with_error.c3 similarity index 100% rename from test/test_suite2/statements/foreach_r_with_error.c3 rename to test/test_suite14/statements/foreach_r_with_error.c3 diff --git a/test/test_suite2/statements/foreach_with_error.c3 b/test/test_suite14/statements/foreach_with_error.c3 similarity index 100% rename from test/test_suite2/statements/foreach_with_error.c3 rename to test/test_suite14/statements/foreach_with_error.c3 diff --git a/test/test_suite2/statements/foreach_wrong_index.c3 b/test/test_suite14/statements/foreach_wrong_index.c3 similarity index 78% rename from test/test_suite2/statements/foreach_wrong_index.c3 rename to test/test_suite14/statements/foreach_wrong_index.c3 index a89041c8b..67f1580b3 100644 --- a/test/test_suite2/statements/foreach_wrong_index.c3 +++ b/test/test_suite14/statements/foreach_wrong_index.c3 @@ -19,9 +19,9 @@ fn void main() { Foo f; - io::printfln("%s", f[12.2]); + io::printfn("%s", f[12.2]); foreach (int i, value : f) // #error: Only integer { - io::printfln("v[%s] = %s", i, value); + io::printfn("v[%s] = %s", i, value); } } \ No newline at end of file diff --git a/test/test_suite2/statements/if_decl.c3 b/test/test_suite14/statements/if_decl.c3 similarity index 100% rename from test/test_suite2/statements/if_decl.c3 rename to test/test_suite14/statements/if_decl.c3 diff --git a/test/test_suite2/statements/if_single.c3 b/test/test_suite14/statements/if_single.c3 similarity index 100% rename from test/test_suite2/statements/if_single.c3 rename to test/test_suite14/statements/if_single.c3 diff --git a/test/test_suite2/statements/if_tests.c3t b/test/test_suite14/statements/if_tests.c3t similarity index 79% rename from test/test_suite2/statements/if_tests.c3t rename to test/test_suite14/statements/if_tests.c3t index 472808f28..153203ad7 100644 --- a/test/test_suite2/statements/if_tests.c3t +++ b/test/test_suite14/statements/if_tests.c3t @@ -31,15 +31,15 @@ fn void test3(int x) define void @iftest_test1(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %0, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 %gt = icmp sgt i32 %1, 0 br i1 %gt, label %if.then, label %if.exit if.then: ; preds = %entry - %2 = load i32, ptr %x, align 4 + %2 = load i32, i32* %x, align 4 %add = add i32 %2, 1 - store i32 %add, ptr %x, align 4 + store i32 %add, i32* %x, align 4 br label %if.exit if.exit: ; preds = %if.then, %entry @@ -55,15 +55,15 @@ entry: define void @iftest_test3(i32 %0) #0 { entry: %x = alloca i32, align 4 - store i32 %0, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 + store i32 %0, i32* %x, align 4 + %1 = load i32, i32* %x, align 4 %gt = icmp sgt i32 %1, 0 br i1 %gt, label %if.exit, label %if.else if.else: ; preds = %entry - %2 = load i32, ptr %x, align 4 + %2 = load i32, i32* %x, align 4 %add = add i32 %2, 1 - store i32 %add, ptr %x, align 4 + store i32 %add, i32* %x, align 4 br label %if.exit if.exit: ; preds = %if.else, %entry diff --git a/test/test_suite2/statements/if_while_do_error.c3 b/test/test_suite14/statements/if_while_do_error.c3 similarity index 100% rename from test/test_suite2/statements/if_while_do_error.c3 rename to test/test_suite14/statements/if_while_do_error.c3 diff --git a/test/test_suite2/statements/infinite_do_while.c3t b/test/test_suite14/statements/infinite_do_while.c3t similarity index 100% rename from test/test_suite2/statements/infinite_do_while.c3t rename to test/test_suite14/statements/infinite_do_while.c3t diff --git a/test/test_suite2/statements/label_errors.c3 b/test/test_suite14/statements/label_errors.c3 similarity index 100% rename from test/test_suite2/statements/label_errors.c3 rename to test/test_suite14/statements/label_errors.c3 diff --git a/test/test_suite2/statements/labelled_continue_for.c3t b/test/test_suite14/statements/labelled_continue_for.c3t similarity index 84% rename from test/test_suite2/statements/labelled_continue_for.c3t rename to test/test_suite14/statements/labelled_continue_for.c3t index c5b3c254c..5ceb5be9b 100644 --- a/test/test_suite2/statements/labelled_continue_for.c3t +++ b/test/test_suite14/statements/labelled_continue_for.c3t @@ -29,24 +29,24 @@ entry: %i = alloca i32, align 4 %j = alloca i32, align 4 %k = alloca i32, align 4 - store i32 0, ptr %i, align 4 + store i32 0, i32* %i, align 4 br label %loop.cond loop.cond: ; preds = %loop.inc, %entry - %0 = load i32, ptr %i, align 4 + %0 = load i32, i32* %i, align 4 %lt = icmp slt i32 %0, 10 br i1 %lt, label %loop.body, label %loop.exit9 loop.body: ; preds = %loop.cond - store i32 0, ptr %j, align 4 + store i32 0, i32* %j, align 4 br label %loop.cond1 loop.cond1: ; preds = %loop.exit, %loop.body - %1 = load i32, ptr %j, align 4 + %1 = load i32, i32* %j, align 4 %lt2 = icmp slt i32 %1, 10 br i1 %lt2, label %loop.body3, label %loop.exit7 loop.body3: ; preds = %loop.cond1 - store i32 0, ptr %k, align 4 + store i32 0, i32* %k, align 4 br label %loop.cond4 loop.cond4: ; preds = %loop.body3 - %2 = load i32, ptr %k, align 4 + %2 = load i32, i32* %k, align 4 %lt5 = icmp slt i32 %2, 10 br i1 %lt5, label %loop.body6, label %loop.exit loop.body6: ; preds = %loop.cond4 @@ -54,17 +54,17 @@ loop.body6: ; preds = %loop.cond4 br label %loop.inc loop.exit: ; preds = %loop.cond4 call void @labelled_continue_for_errored() - %3 = load i32, ptr %j, align 4 + %3 = load i32, i32* %j, align 4 %add = add i32 %3, 1 - store i32 %add, ptr %j, align 4 + store i32 %add, i32* %j, align 4 br label %loop.cond1 loop.exit7: ; preds = %loop.cond1 call void @labelled_continue_for_errored() br label %loop.inc loop.inc: ; preds = %loop.exit7, %loop.body6 - %4 = load i32, ptr %i, align 4 + %4 = load i32, i32* %i, align 4 %add8 = add i32 %4, 1 - store i32 %add8, ptr %i, align 4 + store i32 %add8, i32* %i, align 4 br label %loop.cond loop.exit9: ; preds = %loop.cond ret void diff --git a/test/test_suite/statements/nextcase_no_switch.c3 b/test/test_suite14/statements/nextcase_no_switch.c3 similarity index 100% rename from test/test_suite/statements/nextcase_no_switch.c3 rename to test/test_suite14/statements/nextcase_no_switch.c3 diff --git a/test/test_suite2/statements/ranged_switch.c3t b/test/test_suite14/statements/ranged_switch.c3t similarity index 67% rename from test/test_suite2/statements/ranged_switch.c3t rename to test/test_suite14/statements/ranged_switch.c3t index 1dd39bef2..4b36be425 100644 --- a/test/test_suite2/statements/ranged_switch.c3t +++ b/test/test_suite14/statements/ranged_switch.c3t @@ -48,25 +48,6 @@ fn void main() /* #expect: foo.ll -source_filename = "foo" -target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-darwin" - -@.str = private unnamed_addr constant [5 x i8] c"1-3\0A\00", align 1 -@.str.1 = private unnamed_addr constant [10 x i8] c"7-277 %d\0A\00", align 1 -@.str.2 = private unnamed_addr constant [8 x i8] c"4-5 %d\0A\00", align 1 -@.str.3 = private unnamed_addr constant [6 x i8] c"6 %d\0A\00", align 1 -@.str.4 = private unnamed_addr constant [20 x i8] c"Something else: %d\0A\00", align 1 -@.str.5 = private unnamed_addr constant [5 x i8] c"1-3\0A\00", align 1 -@.str.6 = private unnamed_addr constant [8 x i8] c"4-6 %d\0A\00", align 1 -@.str.7 = private unnamed_addr constant [20 x i8] c"Something else: %d\0A\00", align 1 -@.str.8 = private unnamed_addr constant [11 x i8] c"Was true!\0A\00", align 1 -@.str.9 = private unnamed_addr constant [12 x i8] c"Was false!\0A\00", align 1 - -; Function Attrs: nounwind -declare void @printf(ptr, ...) #0 - -; Function Attrs: nounwind define void @foo_main() #0 { entry: %i = alloca i32, align 4 @@ -75,28 +56,28 @@ entry: %switch15 = alloca i32, align 4 %x = alloca i8, align 1 %switch23 = alloca i8, align 1 - store i32 0, ptr %i, align 4 + store i32 0, i32* %i, align 4 br label %loop.cond loop.cond: ; preds = %switch.exit, %entry - %0 = load i32, ptr %i, align 4 + %0 = load i32, i32* %i, align 4 %lt = icmp slt i32 %0, 12 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond - %1 = load i32, ptr %i, align 4 - store i32 %1, ptr %switch, align 4 + %1 = load i32, i32* %i, align 4 + store i32 %1, i32* %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body - %2 = load i32, ptr %switch, align 4 + %2 = load i32, i32* %switch, align 4 %le = icmp sle i32 1, %2 %ge = icmp sge i32 3, %2 %3 = and i1 %le, %ge br i1 %3, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - call void (ptr, ...) @printf(ptr @.str) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0)) br label %switch.exit next_if: ; preds = %switch.entry @@ -106,8 +87,8 @@ next_if: ; preds = %switch.entry br i1 %4, label %switch.case3, label %next_if4 switch.case3: ; preds = %next_if - %5 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %5) + %5 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 %5) br label %switch.exit next_if4: ; preds = %next_if @@ -117,8 +98,8 @@ next_if4: ; preds = %next_if br i1 %6, label %switch.case7, label %next_if8 switch.case7: ; preds = %switch.default, %next_if4 - %7 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.2, i32 %7) + %7 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i32 0, i32 0), i32 %7) br label %switch.exit next_if8: ; preds = %next_if4 @@ -126,40 +107,40 @@ next_if8: ; preds = %next_if4 br i1 %eq, label %switch.case9, label %next_if10 switch.case9: ; preds = %next_if8 - %8 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %8) + %8 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i32 %8) br label %switch.exit next_if10: ; preds = %next_if8 br label %switch.default switch.default: ; preds = %next_if10 - %9 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str.4, i32 %9) + %9 = load i32, i32* %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %9) br label %switch.case7 switch.exit: ; preds = %switch.case9, %switch.case7, %switch.case3, %switch.case - %10 = load i32, ptr %i, align 4 + %10 = load i32, i32* %i, align 4 %add = add i32 %10, 1 - store i32 %add, ptr %i, align 4 + store i32 %add, i32* %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond - store i32 0, ptr %i11, align 4 + store i32 0, i32* %i11, align 4 br label %loop.cond12 loop.cond12: ; preds = %switch.exit20, %loop.exit - %11 = load i32, ptr %i11, align 4 + %11 = load i32, i32* %i11, align 4 %lt13 = icmp slt i32 %11, 12 br i1 %lt13, label %loop.body14, label %loop.exit22 loop.body14: ; preds = %loop.cond12 - %12 = load i32, ptr %i11, align 4 - store i32 %12, ptr %switch15, align 4 + %12 = load i32, i32* %i11, align 4 + store i32 %12, i32* %switch15, align 4 br label %switch.entry16 switch.entry16: ; preds = %loop.body14 - %13 = load i32, ptr %switch15, align 4 + %13 = load i32, i32* %switch15, align 4 switch i32 %13, label %switch.default19 [ i32 1, label %switch.case17 i32 2, label %switch.case17 @@ -170,39 +151,39 @@ switch.entry16: ; preds = %loop.body14 ] switch.case17: ; preds = %switch.entry16, %switch.entry16, %switch.entry16 - call void (ptr, ...) @printf(ptr @.str.5) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0)) br label %switch.exit20 switch.case18: ; preds = %switch.default19, %switch.entry16, %switch.entry16, %switch.entry16 - %14 = load i32, ptr %i11, align 4 - call void (ptr, ...) @printf(ptr @.str.6, i32 %14) + %14 = load i32, i32* %i11, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.6, i32 0, i32 0), i32 %14) br label %switch.exit20 switch.default19: ; preds = %switch.entry16 - %15 = load i32, ptr %i11, align 4 - call void (ptr, ...) @printf(ptr @.str.7, i32 %15) + %15 = load i32, i32* %i11, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.7, i32 0, i32 0), i32 %15) br label %switch.case18 switch.exit20: ; preds = %switch.case18, %switch.case17 - %16 = load i32, ptr %i11, align 4 + %16 = load i32, i32* %i11, align 4 %add21 = add i32 %16, 1 - store i32 %add21, ptr %i11, align 4 + store i32 %add21, i32* %i11, align 4 br label %loop.cond12 loop.exit22: ; preds = %loop.cond12 - store i8 0, ptr %x, align 1 - %17 = load i8, ptr %x, align 1 - store i8 %17, ptr %switch23, align 1 + store i8 0, i8* %x, align 1 + %17 = load i8, i8* %x, align 1 + store i8 %17, i8* %switch23, align 1 br label %switch.entry24 switch.entry24: ; preds = %loop.exit22 - %18 = load i8, ptr %switch23, align 1 + %18 = load i8, i8* %switch23, align 1 %19 = trunc i8 %18 to i1 %eq25 = icmp eq i1 true, %19 br i1 %eq25, label %switch.case26, label %next_if27 switch.case26: ; preds = %switch.entry24 - call void (ptr, ...) @printf(ptr @.str.8) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.8, i32 0, i32 0)) br label %switch.exit31 next_if27: ; preds = %switch.entry24 @@ -210,7 +191,7 @@ next_if27: ; preds = %switch.entry24 br i1 %eq28, label %switch.case29, label %next_if30 switch.case29: ; preds = %next_if27 - call void (ptr, ...) @printf(ptr @.str.9) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i32 0, i32 0)) br label %switch.exit31 next_if30: ; preds = %next_if27 @@ -219,12 +200,3 @@ next_if30: ; preds = %next_if27 switch.exit31: ; preds = %next_if30, %switch.case29, %switch.case26 ret void } - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @foo_main() - ret i32 0 -} - -attributes #0 = { nounwind } diff --git a/test/test_suite2/statements/return_stmt.c3 b/test/test_suite14/statements/return_stmt.c3 similarity index 100% rename from test/test_suite2/statements/return_stmt.c3 rename to test/test_suite14/statements/return_stmt.c3 diff --git a/test/test_suite2/statements/return_switch.c3t b/test/test_suite14/statements/return_switch.c3t similarity index 94% rename from test/test_suite2/statements/return_switch.c3t rename to test/test_suite14/statements/return_switch.c3t index 4b8295f83..40b43ea6b 100644 --- a/test/test_suite2/statements/return_switch.c3t +++ b/test/test_suite14/statements/return_switch.c3t @@ -17,7 +17,7 @@ fn int testReturnSwitch() // #expect: return_switch.ll switch.entry: - %1 = load i32, ptr %switch + %1 = load i32, i32* %switch switch i32 %1, label %switch.default [ i32 0, label %switch.case i32 3, label %switch.case diff --git a/test/test_suite2/statements/return_with_other_at_end.c3 b/test/test_suite14/statements/return_with_other_at_end.c3 similarity index 100% rename from test/test_suite2/statements/return_with_other_at_end.c3 rename to test/test_suite14/statements/return_with_other_at_end.c3 diff --git a/test/test_suite2/statements/simple_do.c3t b/test/test_suite14/statements/simple_do.c3t similarity index 60% rename from test/test_suite2/statements/simple_do.c3t rename to test/test_suite14/statements/simple_do.c3t index e2e4a18a3..132605831 100644 --- a/test/test_suite2/statements/simple_do.c3t +++ b/test/test_suite14/statements/simple_do.c3t @@ -25,46 +25,25 @@ fn void main() } while (i++ < 100); } -/* #expect: foo.ll -source_filename = "foo" -target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-darwin" +// #expect: foo.ll -@"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 - -; Function Attrs: nounwind -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 -} - -; Function Attrs: nounwind -declare void @printf(ptr, ...) #0 - -; Function Attrs: nounwind define void @foo_main() #0 { entry: %i = alloca i32, align 4 - store i32 10, ptr %i, align 4 + store i32 10, i32* %i, align 4 br label %loop.body loop.cond: ; preds = %if.exit - %0 = load i32, ptr %i, align 4 + %0 = load i32, i32* %i, align 4 %sub = sub i32 %0, 1 - store i32 %sub, ptr %i, align 4 + store i32 %sub, i32* %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 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) + %2 = load i32, i32* %i, align 4 %gt1 = icmp sgt i32 %2, 100 br i1 %gt1, label %if.then, label %if.exit @@ -75,21 +54,21 @@ if.exit: ; preds = %loop.body br label %loop.cond loop.exit: ; preds = %if.then, %loop.cond - store i32 1, ptr %i, align 4 + store i32 1, i32* %i, align 4 br label %loop.body3 loop.cond2: ; preds = %if.exit5 - %3 = load i32, ptr %i, align 4 + %3 = load i32, i32* %i, align 4 %add = add i32 %3, 1 - store i32 %add, ptr %i, align 4 + store i32 %add, i32* %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 = load i32, ptr %i, align 4 + %4 = load i32, i32* %i, align 4 %5 = call i32 @foo_test() - call void (ptr, ...) @printf(ptr @.str.1, i32 %4, i32 %5) - %6 = load i32, ptr %i, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %4, i32 %5) + %6 = load i32, i32* %i, align 4 %smod = srem i32 %6, 3 %eq = icmp eq i32 %smod, 0 br i1 %eq, label %if.then4, label %if.exit5 @@ -102,11 +81,4 @@ if.exit5: ; preds = %loop.body3 loop.exit6: ; preds = %if.then4, %loop.cond2 ret void -} - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @foo_main() - ret i32 0 -} +} \ No newline at end of file diff --git a/test/test_suite2/statements/switch_error_range.c3 b/test/test_suite14/statements/switch_error_range.c3 similarity index 100% rename from test/test_suite2/statements/switch_error_range.c3 rename to test/test_suite14/statements/switch_error_range.c3 diff --git a/test/test_suite2/statements/switch_errors.c3 b/test/test_suite14/statements/switch_errors.c3 similarity index 100% rename from test/test_suite2/statements/switch_errors.c3 rename to test/test_suite14/statements/switch_errors.c3 diff --git a/test/test_suite2/statements/various_switching.c3t b/test/test_suite14/statements/various_switching.c3t similarity index 70% rename from test/test_suite2/statements/various_switching.c3t rename to test/test_suite14/statements/various_switching.c3t index 8962c0bb4..758c6c146 100644 --- a/test/test_suite2/statements/various_switching.c3t +++ b/test/test_suite14/statements/various_switching.c3t @@ -81,82 +81,82 @@ entry: %zy = alloca i32, align 4 %switch17 = alloca i32, align 4 %switch27 = alloca i8, align 1 - store i64 ptrtoint (ptr @"mymodule_ByeErr$BAR" to i64), ptr %x.f, align 8 - store i64 ptrtoint (ptr @"ct$int" to i64), ptr %z, align 8 + store i64 ptrtoint (%.fault* @"mymodule_ByeErr$BAR" to i64), i64* %x.f, align 8 + store i64 ptrtoint (%.introspect* @"ct$int" to i64), i64* %z, align 8 br label %testblock testblock: ; preds = %entry - %optval = load i64, ptr %x.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 = %testblock - store i64 %optval, ptr %err, align 8 + store i64 %optval, i64* %err, align 8 br label %end_block after_check: ; preds = %testblock - store i64 0, ptr %err, align 8 + store i64 0, i64* %err, align 8 br label %end_block end_block: ; preds = %after_check, %assign_optional - %0 = load i64, ptr %err, align 8 + %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 i64 %0, ptr %switch, align 8 + store i64 %0, i64* %switch, align 8 br label %switch.entry switch.entry: ; preds = %if.then - %1 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"mymodule_HelloErr$FOO" to i64), %1 + %1 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.fault* @"mymodule_HelloErr$FOO" to i64), %1 br i1 %eq, label %switch.case, label %next_if switch.case: ; preds = %switch.entry - call void (ptr, ...) @printf(ptr @.str) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i32 0, i32 0)) br label %switch.exit next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (ptr @"mymodule_ByeErr$BAR" to i64), %1 + %eq1 = icmp eq i64 ptrtoint (%.fault* @"mymodule_ByeErr$BAR" to i64), %1 br i1 %eq1, label %switch.case2, label %next_if3 switch.case2: ; preds = %next_if - call void (ptr, ...) @printf(ptr @.str.3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i32 0, i32 0)) br label %switch.exit next_if3: ; preds = %next_if br label %switch.default switch.default: ; preds = %next_if3 - call void (ptr, ...) @printf(ptr @.str.4) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i32 0, i32 0)) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case2, %switch.case br label %if.exit if.exit: ; preds = %switch.exit, %end_block - %2 = load i64, ptr %z, align 8 - store i64 %2, ptr %switch4, align 8 + %2 = load i64, i64* %z, align 8 + store i64 %2, i64* %switch4, align 8 br label %switch.entry5 switch.entry5: ; preds = %if.exit - %3 = load i64, ptr %switch4, align 8 - %eq6 = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %3 + %3 = load i64, i64* %switch4, align 8 + %eq6 = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %3 br i1 %eq6, label %switch.case7, label %next_if8 switch.case7: ; preds = %switch.entry5 - call void (ptr, ...) @printf(ptr @.str.5) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0)) br label %switch.exit16 next_if8: ; preds = %switch.entry5 - %eq9 = icmp eq i64 ptrtoint (ptr @"ct$bool" to i64), %3 + %eq9 = icmp eq i64 ptrtoint (%.introspect* @"ct$bool" to i64), %3 br i1 %eq9, label %switch.case10, label %next_if11 switch.case10: ; preds = %next_if8 br label %switch.case13 next_if11: ; preds = %next_if8 - %eq12 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %3 + %eq12 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %3 br i1 %eq12, label %switch.case13, label %next_if14 switch.case13: ; preds = %next_if11, %switch.case10 @@ -166,79 +166,79 @@ next_if14: ; preds = %next_if11 br label %switch.default15 switch.default15: ; preds = %next_if14, %switch.case13 - call void (ptr, ...) @printf(ptr @.str.6) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.6, i32 0, i32 0)) br label %switch.exit16 switch.exit16: ; preds = %switch.default15, %switch.case7 - store i32 1, ptr %a, align 4 - store i32 2, ptr %b, align 4 - %4 = load i32, ptr %b, align 4 - %5 = load i32, ptr %a, align 4 + store i32 1, i32* %a, align 4 + store i32 2, i32* %b, align 4 + %4 = load i32, i32* %b, align 4 + %5 = load i32, i32* %a, align 4 %add = add i32 %4, %5 - store i32 %add, ptr %zy, align 4 - %6 = load i32, ptr %zy, align 4 - store i32 %6, ptr %switch17, align 4 + store i32 %add, i32* %zy, align 4 + %6 = load i32, i32* %zy, align 4 + store i32 %6, i32* %switch17, align 4 br label %switch.entry18 switch.entry18: ; preds = %switch.exit16 - %7 = load i32, ptr %switch17, align 4 - %8 = load i32, ptr %a, align 4 + %7 = load i32, i32* %switch17, align 4 + %8 = load i32, i32* %a, align 4 %eq19 = icmp eq i32 %8, %7 br i1 %eq19, label %switch.case20, label %next_if21 switch.case20: ; preds = %switch.entry18 - call void (ptr, ...) @printf(ptr @.str.7) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.7, i32 0, i32 0)) br label %switch.exit26 next_if21: ; preds = %switch.entry18 - %9 = load i32, ptr %b, align 4 + %9 = load i32, i32* %b, align 4 %eq22 = icmp eq i32 %9, %7 br i1 %eq22, label %switch.case23, label %next_if24 switch.case23: ; preds = %next_if21 - call void (ptr, ...) @printf(ptr @.str.8) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.8, i32 0, i32 0)) br label %switch.exit26 next_if24: ; preds = %next_if21 br label %switch.default25 switch.default25: ; preds = %next_if24 - call void (ptr, ...) @printf(ptr @.str.9) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.9, i32 0, i32 0)) br label %switch.exit26 switch.exit26: ; preds = %switch.default25, %switch.case23, %switch.case20 - store i8 1, ptr %switch27, align 1 + store i8 1, i8* %switch27, align 1 br label %switch.entry28 switch.entry28: ; preds = %switch.exit26 - %10 = load i8, ptr %switch27, align 1 + %10 = load i8, i8* %switch27, align 1 %11 = trunc i8 %10 to i1 - %12 = load i32, ptr %a, align 4 + %12 = load i32, i32* %a, align 4 %lt = icmp slt i32 %12, 0 %eq29 = icmp eq i1 %lt, %11 br i1 %eq29, label %switch.case30, label %next_if31 switch.case30: ; preds = %switch.entry28 - call void (ptr, ...) @printf(ptr @.str.10) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.10, i32 0, i32 0)) br label %switch.exit37 next_if31: ; preds = %switch.entry28 - %13 = load i32, ptr %a, align 4 + %13 = load i32, i32* %a, align 4 %eq32 = icmp eq i32 %13, 1 %eq33 = icmp eq i1 %eq32, %11 br i1 %eq33, label %switch.case34, label %next_if35 switch.case34: ; preds = %next_if31 - call void (ptr, ...) @printf(ptr @.str.11) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.11, i32 0, i32 0)) br label %switch.exit37 next_if35: ; preds = %next_if31 br label %switch.default36 switch.default36: ; preds = %next_if35 - call void (ptr, ...) @printf(ptr @.str.12) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.12, i32 0, i32 0)) br label %switch.exit37 switch.exit37: ; preds = %switch.default36, %switch.case34, %switch.case30 ret void -} +} \ No newline at end of file diff --git a/test/test_suite2/statements/while_statement_placement.c3 b/test/test_suite14/statements/while_statement_placement.c3 similarity index 100% rename from test/test_suite2/statements/while_statement_placement.c3 rename to test/test_suite14/statements/while_statement_placement.c3 diff --git a/test/test_suite2/statements/while_switch.c3t b/test/test_suite14/statements/while_switch.c3t similarity index 79% rename from test/test_suite2/statements/while_switch.c3t rename to test/test_suite14/statements/while_switch.c3t index 0167e2c3b..855ddbfa7 100644 --- a/test/test_suite2/statements/while_switch.c3t +++ b/test/test_suite14/statements/while_switch.c3t @@ -30,20 +30,10 @@ fn int main() /* #expect: test.ll -source_filename = "test" -target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-darwin" @.str = private unnamed_addr constant [2 x i8] c"3\00", align 1 @.str.1 = private unnamed_addr constant [2 x i8] c"4\00", align 1 -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -declare i32 @foo() #0 - -; Function Attrs: nounwind define i32 @main() #0 { entry: %switch = alloca i32, align 4 @@ -56,11 +46,11 @@ loop.cond: ; preds = %switch.exit, %entry loop.body: ; preds = %loop.cond %1 = call i32 @foo() - store i32 %1, ptr %switch, align 4 + store i32 %1, i32* %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body - %2 = load i32, ptr %switch, align 4 + %2 = load i32, i32* %switch, align 4 switch i32 %2, label %switch.default [ i32 0, label %switch.case i32 1, label %switch.case @@ -72,11 +62,11 @@ switch.entry: ; preds = %loop.body ] switch.case: ; preds = %switch.entry, %switch.entry, %switch.entry, %switch.entry - %3 = call i32 (ptr, ...) @printf(ptr @.str) + %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) br label %switch.case1 switch.case1: ; preds = %switch.entry, %switch.case - %4 = call i32 (ptr, ...) @printf(ptr @.str.1) + %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) br label %switch.default switch.default: ; preds = %switch.entry, %switch.entry, %switch.case1, %switch.entry @@ -89,4 +79,3 @@ loop.exit: ; preds = %loop.cond ret i32 0 } -attributes #0 = { nounwind } \ No newline at end of file diff --git a/test/test_suite2/stdlib/ascii.c3 b/test/test_suite14/stdlib/ascii.c3 similarity index 57% rename from test/test_suite2/stdlib/ascii.c3 rename to test/test_suite14/stdlib/ascii.c3 index 345569d91..8390b1160 100644 --- a/test/test_suite2/stdlib/ascii.c3 +++ b/test/test_suite14/stdlib/ascii.c3 @@ -5,19 +5,19 @@ fn void main() { for(char c = 0; c < 255; c++) { - io::printfln("%c (%s) is...:", c, c); - io::printfln("lower: %s; upper: %s; digit: %s; bdigit: %s; odigit: %s; xdigit: %s; alpha: %s; print: %s; graph: %s; space: %s; alnum: %s; punct: %s; blank: %s; cntrl: %s;", + io::printfn("%c (%s) is...:", c, c); + io::printfn("lower: %s; upper: %s; digit: %s; bdigit: %s; odigit: %s; xdigit: %s; alpha: %s; print: %s; graph: %s; space: %s; alnum: %s; punct: %s; blank: %s; cntrl: %s;", c.is_lower(), c.is_upper(), c.is_digit(), c.is_bdigit(), c.is_odigit(), c.is_xdigit(), c.is_alpha(), c.is_print(), c.is_graph(), c.is_space(), c.is_alnum(), c.is_punct(), c.is_blank(), c.is_cntrl()); } foreach(c : "0123456789abcdefghijklmnopqrstuvwxyz") { - io::printfln("'%c'.to_upper(): %c", c, c.to_upper()); + io::printfn("'%c'.to_upper(): %c", c, c.to_upper()); } foreach(c : "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") { - io::printfln("'%c'.to_lower(): %c", c, c.to_lower()); + io::printfn("'%c'.to_lower(): %c", c, c.to_lower()); } } diff --git a/test/test_suite14/stdlib/map.c3t b/test/test_suite14/stdlib/map.c3t new file mode 100644 index 000000000..578eefe0b --- /dev/null +++ b/test/test_suite14/stdlib/map.c3t @@ -0,0 +1,587 @@ +// #target: macos-x64 + +module test; +import std::io; +import std::map; + +struct Foo { int x; void* bar; } + +define IntFooMap = std::map::HashMap; +define IntDoubleMap = std::map::HashMap; + +fn char[] Foo.to_string(Foo* foo, Allocator* allocator = mem::current_allocator()) +{ + VarString s = string::new_with_capacity(128, allocator); + s.printf("{%s, %p}", foo.x, foo.bar); + return s.str(); +} + +static initialize +{ + io::formatter_register_type(Foo); +} + +fn void main() +{ + IntFooMap map; + map.tinit(); + io::printfn("Map size: %d", map.count); + map.set(1, Foo { 1, null }); + io::printfn("Map size: %d", map.count); + map.set(1, Foo { 2, null }); + io::printfn("Map size: %d", map.count); + io::printfn("Val: %d", map.get(1).x); + io::printfn("Has 1: %s", map.has_key(1)); + io::printfn("Has 2: %s", map.has_key(2)); + map.set(7, Foo { 4, null }); + io::printfn("Values: %s", map.value_list()); + IntDoubleMap map2; + map2.tinit(); + map2.set(4, 1.3); + io::printfn("Map find: %s", map2.has_value(1.3)); + io::printfn("Map find: %s", map2.has_value(1.2)); + map2.set(100, 3.4); + io::printfn("%s", map2.key_list()); + io::printfn("%s", map2.value_list()); + @pool() + { + IntDoubleMap map3; + map3.tinit(); + map3.set(5, 3.2); + map3.set(7, 5.2); + io::printfn("%s", map3.key_list()); + }; +} + +/* #expect: test.ll + + +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @.static_initialize.0, i8* null }] + +define internal void @.static_initialize.0() { +entry: + %0 = load i64, i64* getelementptr inbounds (%HashMap, %HashMap* @std_io_tostring_functions, i32 0, i32 0, i32 1), align 8 + %not = icmp eq i64 %0, 0 + br i1 %not, label %if.then, label %if.exit + +if.then: ; preds = %entry + %1 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 + call void @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_init"(%HashMap* @std_io_tostring_functions, i32 512, float 7.500000e-01, %Allocator* %1) + br label %if.exit + +if.exit: ; preds = %if.then, %entry + %2 = call i8 @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_set"(%HashMap* @std_io_tostring_functions, i64 ptrtoint (%.introspect* @"ct$test_Foo" to i64), { i8*, i64 } (i8*, %Allocator*)* bitcast ({ i8*, i64 } (%Foo*, %Allocator*)* @test_Foo_to_string to { i8*, i64 } (i8*, %Allocator*)*)) + ret void +} + +declare void @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_init"(%HashMap*, i32, float, %Allocator*) + +declare i8 @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_set"(%HashMap*, i64, { i8*, i64 } (i8*, %Allocator*)*) + +; Function Attrs: nounwind +define { i8*, i64 } @test_Foo_to_string(%Foo* %0, %Allocator* %1) #0 { +entry: + %s = alloca i8*, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [2 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %result = alloca %"char[]", align 8 + %2 = call i8* @std_core_string_new_with_capacity(i64 128, %Allocator* %1) + store i8* %2, i8** %s, align 8 + %3 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 0 + %4 = bitcast i32* %3 to i8* + %5 = insertvalue %variant undef, i8* %4, 0 + %6 = insertvalue %variant %5, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %7 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 0 + store %variant %6, %variant* %7, align 16 + %8 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 1 + %9 = bitcast i8** %8 to i8* + %10 = insertvalue %variant undef, i8* %9, 0 + %11 = insertvalue %variant %10, i64 ptrtoint (%.introspect* @"ct$p$void" to i64), 1 + %12 = getelementptr inbounds [2 x %variant], [2 x %variant]* %varargslots, i64 0, i64 1 + store %variant %11, %variant* %12, align 16 + %13 = bitcast [2 x %variant]* %varargslots to %variant* + %14 = insertvalue %"variant[]" undef, %variant* %13, 0 + %15 = insertvalue %"variant[]" %14, i64 2, 1 + store %"variant[]" %15, %"variant[]"* %taddr, align 8 + %16 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %17 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 0 + %lo = load i8*, i8** %17, align 8 + %18 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %16, i32 0, i32 1 + %hi = load i64, i64* %18, align 8 + %19 = call i64 @std_core_string_VarString_printf(i64* %retparam, i8** %s, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i32 0, i32 0), i64 8, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %19, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %20 = load i8*, i8** %s, align 8 + %21 = call { i8*, i64 } @std_core_string_VarString_str(i8* %20) + %22 = bitcast %"char[]"* %result to { i8*, i64 }* + store { i8*, i64 } %21, { i8*, i64 }* %22, align 8 + %23 = bitcast %"char[]"* %result to { i8*, i64 }* + %24 = load { i8*, i64 }, { i8*, i64 }* %23, align 8 + ret { i8*, i64 } %24 +} + +; Function Attrs: nounwind +define void @test_main() #0 { +entry: + %map = alloca %HashMap.0, align 8 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %variant], align 16 + %taddr = alloca %"variant[]", align 8 + %literal = alloca %Foo, align 8 + %retparam3 = alloca i64, align 8 + %varargslots4 = alloca [1 x %variant], align 16 + %taddr5 = alloca %"variant[]", align 8 + %literal11 = alloca %Foo, align 8 + %retparam14 = alloca i64, align 8 + %varargslots15 = alloca [1 x %variant], align 16 + %taddr16 = alloca %"variant[]", align 8 + %retparam22 = alloca i64, align 8 + %varargslots23 = alloca [1 x %variant], align 16 + %retparam24 = alloca %Foo, align 8 + %taddr27 = alloca %"variant[]", align 8 + %retparam33 = alloca i64, align 8 + %varargslots34 = alloca [1 x %variant], align 16 + %taddr35 = alloca i8, align 1 + %taddr36 = alloca %"variant[]", align 8 + %retparam42 = alloca i64, align 8 + %varargslots43 = alloca [1 x %variant], align 16 + %taddr44 = alloca i8, align 1 + %taddr45 = alloca %"variant[]", align 8 + %literal51 = alloca %Foo, align 8 + %retparam54 = alloca i64, align 8 + %varargslots55 = alloca [1 x %variant], align 16 + %result = alloca %"Foo[]", align 8 + %taddr56 = alloca %"variant[]", align 8 + %map2 = alloca %HashMap.3, align 8 + %retparam62 = alloca i64, align 8 + %varargslots63 = alloca [1 x %variant], align 16 + %taddr64 = alloca i8, align 1 + %taddr65 = alloca %"variant[]", align 8 + %retparam71 = alloca i64, align 8 + %varargslots72 = alloca [1 x %variant], align 16 + %taddr73 = alloca i8, align 1 + %taddr74 = alloca %"variant[]", align 8 + %retparam80 = alloca i64, align 8 + %varargslots81 = alloca [1 x %variant], align 16 + %result82 = alloca %"int[]", align 8 + %taddr83 = alloca %"variant[]", align 8 + %retparam89 = alloca i64, align 8 + %varargslots90 = alloca [1 x %variant], align 16 + %result91 = alloca %"double[]", align 8 + %taddr92 = alloca %"variant[]", align 8 + %temp = alloca %TempAllocator*, align 8 + %error_var = alloca i64, align 8 + %retparam98 = alloca %TempAllocator*, align 8 + %mark = alloca i64, align 8 + %map3 = alloca %HashMap.3, align 8 + %retparam101 = alloca i64, align 8 + %varargslots102 = alloca [1 x %variant], align 16 + %result103 = alloca %"int[]", align 8 + %taddr104 = alloca %"variant[]", align 8 + %0 = bitcast %HashMap.0* %map to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 40, i1 false) + call void @"std_map$$int.test_Foo_HashMap_tinit"(%HashMap.0* %map, i32 16, float 7.500000e-01) + %1 = getelementptr inbounds %HashMap.0, %HashMap.0* %map, i32 0, i32 2 + %2 = bitcast i32* %1 to i8* + %3 = insertvalue %variant undef, i8* %2, 0 + %4 = insertvalue %variant %3, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %5 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots, i64 0, i64 0 + store %variant %4, %variant* %5, align 16 + %6 = bitcast [1 x %variant]* %varargslots to %variant* + %7 = insertvalue %"variant[]" undef, %variant* %6, 0 + %8 = insertvalue %"variant[]" %7, i64 1, 1 + store %"variant[]" %8, %"variant[]"* %taddr, align 8 + %9 = bitcast %"variant[]"* %taddr to { i8*, i64 }* + %10 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 0 + %lo = load i8*, i8** %10, align 8 + %11 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %9, i32 0, i32 1 + %hi = load i64, i64* %11, align 8 + %12 = call i64 @std_io_printfn(i64* %retparam, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), i64 12, i8* %lo, i64 %hi) + %not_err = icmp eq i64 %12, 0 + br i1 %not_err, label %after_check, label %voiderr + +after_check: ; preds = %entry + br label %voiderr + +voiderr: ; preds = %after_check, %entry + %13 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 0 + store i32 1, i32* %13, align 8 + %14 = getelementptr inbounds %Foo, %Foo* %literal, i32 0, i32 1 + store i8* null, i8** %14, align 8 + %15 = bitcast %Foo* %literal to { i64, i8* }* + %16 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %15, i32 0, i32 0 + %lo1 = load i64, i64* %16, align 8 + %17 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %15, i32 0, i32 1 + %hi2 = load i8*, i8** %17, align 8 + %18 = call i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0* %map, i32 1, i64 %lo1, i8* %hi2) + %19 = getelementptr inbounds %HashMap.0, %HashMap.0* %map, i32 0, i32 2 + %20 = bitcast i32* %19 to i8* + %21 = insertvalue %variant undef, i8* %20, 0 + %22 = insertvalue %variant %21, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %23 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots4, i64 0, i64 0 + store %variant %22, %variant* %23, align 16 + %24 = bitcast [1 x %variant]* %varargslots4 to %variant* + %25 = insertvalue %"variant[]" undef, %variant* %24, 0 + %26 = insertvalue %"variant[]" %25, i64 1, 1 + store %"variant[]" %26, %"variant[]"* %taddr5, align 8 + %27 = bitcast %"variant[]"* %taddr5 to { i8*, i64 }* + %28 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 0 + %lo6 = load i8*, i8** %28, align 8 + %29 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %27, i32 0, i32 1 + %hi7 = load i64, i64* %29, align 8 + %30 = call i64 @std_io_printfn(i64* %retparam3, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i32 0, i32 0), i64 12, i8* %lo6, i64 %hi7) + %not_err8 = icmp eq i64 %30, 0 + br i1 %not_err8, label %after_check9, label %voiderr10 + +after_check9: ; preds = %voiderr + br label %voiderr10 + +voiderr10: ; preds = %after_check9, %voiderr + %31 = getelementptr inbounds %Foo, %Foo* %literal11, i32 0, i32 0 + store i32 2, i32* %31, align 8 + %32 = getelementptr inbounds %Foo, %Foo* %literal11, i32 0, i32 1 + store i8* null, i8** %32, align 8 + %33 = bitcast %Foo* %literal11 to { i64, i8* }* + %34 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %33, i32 0, i32 0 + %lo12 = load i64, i64* %34, align 8 + %35 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %33, i32 0, i32 1 + %hi13 = load i8*, i8** %35, align 8 + %36 = call i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0* %map, i32 1, i64 %lo12, i8* %hi13) + %37 = getelementptr inbounds %HashMap.0, %HashMap.0* %map, i32 0, i32 2 + %38 = bitcast i32* %37 to i8* + %39 = insertvalue %variant undef, i8* %38, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$uint" to i64), 1 + %41 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots15, i64 0, i64 0 + store %variant %40, %variant* %41, align 16 + %42 = bitcast [1 x %variant]* %varargslots15 to %variant* + %43 = insertvalue %"variant[]" undef, %variant* %42, 0 + %44 = insertvalue %"variant[]" %43, i64 1, 1 + store %"variant[]" %44, %"variant[]"* %taddr16, align 8 + %45 = bitcast %"variant[]"* %taddr16 to { i8*, i64 }* + %46 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 0 + %lo17 = load i8*, i8** %46, align 8 + %47 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %45, i32 0, i32 1 + %hi18 = load i64, i64* %47, align 8 + %48 = call i64 @std_io_printfn(i64* %retparam14, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0), i64 12, i8* %lo17, i64 %hi18) + %not_err19 = icmp eq i64 %48, 0 + br i1 %not_err19, label %after_check20, label %voiderr21 + +after_check20: ; preds = %voiderr10 + br label %voiderr21 + +voiderr21: ; preds = %after_check20, %voiderr10 + %49 = call i64 @"std_map$$int.test_Foo_HashMap_get"(%Foo* %retparam24, %HashMap.0* %map, i32 1) + %not_err25 = icmp eq i64 %49, 0 + br i1 %not_err25, label %after_check26, label %voiderr32 + +after_check26: ; preds = %voiderr21 + %50 = getelementptr inbounds %Foo, %Foo* %retparam24, i32 0, i32 0 + %51 = bitcast i32* %50 to i8* + %52 = insertvalue %variant undef, i8* %51, 0 + %53 = insertvalue %variant %52, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + %54 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots23, i64 0, i64 0 + store %variant %53, %variant* %54, align 16 + %55 = bitcast [1 x %variant]* %varargslots23 to %variant* + %56 = insertvalue %"variant[]" undef, %variant* %55, 0 + %57 = insertvalue %"variant[]" %56, i64 1, 1 + store %"variant[]" %57, %"variant[]"* %taddr27, align 8 + %58 = bitcast %"variant[]"* %taddr27 to { i8*, i64 }* + %59 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 0 + %lo28 = load i8*, i8** %59, align 8 + %60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 1 + %hi29 = load i64, i64* %60, align 8 + %61 = call i64 @std_io_printfn(i64* %retparam22, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.3, i32 0, i32 0), i64 7, i8* %lo28, i64 %hi29) + %not_err30 = icmp eq i64 %61, 0 + br i1 %not_err30, label %after_check31, label %voiderr32 + +after_check31: ; preds = %after_check26 + br label %voiderr32 + +voiderr32: ; preds = %after_check31, %after_check26, %voiderr21 + %62 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(%HashMap.0* %map, i32 1) + store i8 %62, i8* %taddr35, align 1 + %63 = insertvalue %variant undef, i8* %taddr35, 0 + %64 = insertvalue %variant %63, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %65 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots34, i64 0, i64 0 + store %variant %64, %variant* %65, align 16 + %66 = bitcast [1 x %variant]* %varargslots34 to %variant* + %67 = insertvalue %"variant[]" undef, %variant* %66, 0 + %68 = insertvalue %"variant[]" %67, i64 1, 1 + store %"variant[]" %68, %"variant[]"* %taddr36, align 8 + %69 = bitcast %"variant[]"* %taddr36 to { i8*, i64 }* + %70 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %69, i32 0, i32 0 + %lo37 = load i8*, i8** %70, align 8 + %71 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %69, i32 0, i32 1 + %hi38 = load i64, i64* %71, align 8 + %72 = call i64 @std_io_printfn(i64* %retparam33, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.4, i32 0, i32 0), i64 9, i8* %lo37, i64 %hi38) + %not_err39 = icmp eq i64 %72, 0 + br i1 %not_err39, label %after_check40, label %voiderr41 + +after_check40: ; preds = %voiderr32 + br label %voiderr41 + +voiderr41: ; preds = %after_check40, %voiderr32 + %73 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(%HashMap.0* %map, i32 2) + store i8 %73, i8* %taddr44, align 1 + %74 = insertvalue %variant undef, i8* %taddr44, 0 + %75 = insertvalue %variant %74, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %76 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots43, i64 0, i64 0 + store %variant %75, %variant* %76, align 16 + %77 = bitcast [1 x %variant]* %varargslots43 to %variant* + %78 = insertvalue %"variant[]" undef, %variant* %77, 0 + %79 = insertvalue %"variant[]" %78, i64 1, 1 + store %"variant[]" %79, %"variant[]"* %taddr45, align 8 + %80 = bitcast %"variant[]"* %taddr45 to { i8*, i64 }* + %81 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 0 + %lo46 = load i8*, i8** %81, align 8 + %82 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %80, i32 0, i32 1 + %hi47 = load i64, i64* %82, align 8 + %83 = call i64 @std_io_printfn(i64* %retparam42, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i64 9, i8* %lo46, i64 %hi47) + %not_err48 = icmp eq i64 %83, 0 + br i1 %not_err48, label %after_check49, label %voiderr50 + +after_check49: ; preds = %voiderr41 + br label %voiderr50 + +voiderr50: ; preds = %after_check49, %voiderr41 + %84 = getelementptr inbounds %Foo, %Foo* %literal51, i32 0, i32 0 + store i32 4, i32* %84, align 8 + %85 = getelementptr inbounds %Foo, %Foo* %literal51, i32 0, i32 1 + store i8* null, i8** %85, align 8 + %86 = bitcast %Foo* %literal51 to { i64, i8* }* + %87 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %86, i32 0, i32 0 + %lo52 = load i64, i64* %87, align 8 + %88 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %86, i32 0, i32 1 + %hi53 = load i8*, i8** %88, align 8 + %89 = call i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0* %map, i32 7, i64 %lo52, i8* %hi53) + %90 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 + %91 = call { i8*, i64 } @"std_map$$int.test_Foo_HashMap_value_list"(%HashMap.0* %map, %Allocator* %90) + %92 = bitcast %"Foo[]"* %result to { i8*, i64 }* + store { i8*, i64 } %91, { i8*, i64 }* %92, align 8 + %93 = bitcast %"Foo[]"* %result to i8* + %94 = insertvalue %variant undef, i8* %93, 0 + %95 = insertvalue %variant %94, i64 ptrtoint (%.introspect* @"ct$sa$test_Foo" to i64), 1 + %96 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots55, i64 0, i64 0 + store %variant %95, %variant* %96, align 16 + %97 = bitcast [1 x %variant]* %varargslots55 to %variant* + %98 = insertvalue %"variant[]" undef, %variant* %97, 0 + %99 = insertvalue %"variant[]" %98, i64 1, 1 + store %"variant[]" %99, %"variant[]"* %taddr56, align 8 + %100 = bitcast %"variant[]"* %taddr56 to { i8*, i64 }* + %101 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %100, i32 0, i32 0 + %lo57 = load i8*, i8** %101, align 8 + %102 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %100, i32 0, i32 1 + %hi58 = load i64, i64* %102, align 8 + %103 = call i64 @std_io_printfn(i64* %retparam54, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.6, i32 0, i32 0), i64 10, i8* %lo57, i64 %hi58) + %not_err59 = icmp eq i64 %103, 0 + br i1 %not_err59, label %after_check60, label %voiderr61 + +after_check60: ; preds = %voiderr50 + br label %voiderr61 + +voiderr61: ; preds = %after_check60, %voiderr50 + %104 = bitcast %HashMap.3* %map2 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %104, i8 0, i64 40, i1 false) + call void @"std_map$$int.double_HashMap_tinit"(%HashMap.3* %map2, i32 16, float 7.500000e-01) + %105 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map2, i32 4, double 1.300000e+00) + %106 = call i8 @"std_map$$int.double_HashMap_has_value"(%HashMap.3* %map2, double 1.300000e+00) + store i8 %106, i8* %taddr64, align 1 + %107 = insertvalue %variant undef, i8* %taddr64, 0 + %108 = insertvalue %variant %107, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %109 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots63, i64 0, i64 0 + store %variant %108, %variant* %109, align 16 + %110 = bitcast [1 x %variant]* %varargslots63 to %variant* + %111 = insertvalue %"variant[]" undef, %variant* %110, 0 + %112 = insertvalue %"variant[]" %111, i64 1, 1 + store %"variant[]" %112, %"variant[]"* %taddr65, align 8 + %113 = bitcast %"variant[]"* %taddr65 to { i8*, i64 }* + %114 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %113, i32 0, i32 0 + %lo66 = load i8*, i8** %114, align 8 + %115 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %113, i32 0, i32 1 + %hi67 = load i64, i64* %115, align 8 + %116 = call i64 @std_io_printfn(i64* %retparam62, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0), i64 12, i8* %lo66, i64 %hi67) + %not_err68 = icmp eq i64 %116, 0 + br i1 %not_err68, label %after_check69, label %voiderr70 + +after_check69: ; preds = %voiderr61 + br label %voiderr70 + +voiderr70: ; preds = %after_check69, %voiderr61 + %117 = call i8 @"std_map$$int.double_HashMap_has_value"(%HashMap.3* %map2, double 1.200000e+00) + store i8 %117, i8* %taddr73, align 1 + %118 = insertvalue %variant undef, i8* %taddr73, 0 + %119 = insertvalue %variant %118, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + %120 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots72, i64 0, i64 0 + store %variant %119, %variant* %120, align 16 + %121 = bitcast [1 x %variant]* %varargslots72 to %variant* + %122 = insertvalue %"variant[]" undef, %variant* %121, 0 + %123 = insertvalue %"variant[]" %122, i64 1, 1 + store %"variant[]" %123, %"variant[]"* %taddr74, align 8 + %124 = bitcast %"variant[]"* %taddr74 to { i8*, i64 }* + %125 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 0 + %lo75 = load i8*, i8** %125, align 8 + %126 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %124, i32 0, i32 1 + %hi76 = load i64, i64* %126, align 8 + %127 = call i64 @std_io_printfn(i64* %retparam71, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0), i64 12, i8* %lo75, i64 %hi76) + %not_err77 = icmp eq i64 %127, 0 + br i1 %not_err77, label %after_check78, label %voiderr79 + +after_check78: ; preds = %voiderr70 + br label %voiderr79 + +voiderr79: ; preds = %after_check78, %voiderr70 + %128 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map2, i32 100, double 3.400000e+00) + %129 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 + %130 = call { i8*, i64 } @"std_map$$int.double_HashMap_key_list"(%HashMap.3* %map2, %Allocator* %129) + %131 = bitcast %"int[]"* %result82 to { i8*, i64 }* + store { i8*, i64 } %130, { i8*, i64 }* %131, align 8 + %132 = bitcast %"int[]"* %result82 to i8* + %133 = insertvalue %variant undef, i8* %132, 0 + %134 = insertvalue %variant %133, i64 ptrtoint (%.introspect* @"ct$sa$int" to i64), 1 + %135 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots81, i64 0, i64 0 + store %variant %134, %variant* %135, align 16 + %136 = bitcast [1 x %variant]* %varargslots81 to %variant* + %137 = insertvalue %"variant[]" undef, %variant* %136, 0 + %138 = insertvalue %"variant[]" %137, i64 1, 1 + store %"variant[]" %138, %"variant[]"* %taddr83, align 8 + %139 = bitcast %"variant[]"* %taddr83 to { i8*, i64 }* + %140 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %139, i32 0, i32 0 + %lo84 = load i8*, i8** %140, align 8 + %141 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %139, i32 0, i32 1 + %hi85 = load i64, i64* %141, align 8 + %142 = call i64 @std_io_printfn(i64* %retparam80, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i32 0, i32 0), i64 2, i8* %lo84, i64 %hi85) + %not_err86 = icmp eq i64 %142, 0 + br i1 %not_err86, label %after_check87, label %voiderr88 + +after_check87: ; preds = %voiderr79 + br label %voiderr88 + +voiderr88: ; preds = %after_check87, %voiderr79 + %143 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 + %144 = call { i8*, i64 } @"std_map$$int.double_HashMap_value_list"(%HashMap.3* %map2, %Allocator* %143) + %145 = bitcast %"double[]"* %result91 to { i8*, i64 }* + store { i8*, i64 } %144, { i8*, i64 }* %145, align 8 + %146 = bitcast %"double[]"* %result91 to i8* + %147 = insertvalue %variant undef, i8* %146, 0 + %148 = insertvalue %variant %147, i64 ptrtoint (%.introspect* @"ct$sa$double" to i64), 1 + %149 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots90, i64 0, i64 0 + store %variant %148, %variant* %149, align 16 + %150 = bitcast [1 x %variant]* %varargslots90 to %variant* + %151 = insertvalue %"variant[]" undef, %variant* %150, 0 + %152 = insertvalue %"variant[]" %151, i64 1, 1 + store %"variant[]" %152, %"variant[]"* %taddr92, align 8 + %153 = bitcast %"variant[]"* %taddr92 to { i8*, i64 }* + %154 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %153, i32 0, i32 0 + %lo93 = load i8*, i8** %154, align 8 + %155 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %153, i32 0, i32 1 + %hi94 = load i64, i64* %155, align 8 + %156 = call i64 @std_io_printfn(i64* %retparam89, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.10, i32 0, i32 0), i64 2, i8* %lo93, i64 %hi94) + %not_err95 = icmp eq i64 %156, 0 + br i1 %not_err95, label %after_check96, label %voiderr97 + +after_check96: ; preds = %voiderr88 + br label %voiderr97 + +voiderr97: ; preds = %after_check96, %voiderr88 + %157 = load %TempAllocator*, %TempAllocator** @std_core_mem_thread_temp_allocator, align 8 + %not = icmp eq %TempAllocator* %157, null + br i1 %not, label %if.then, label %if.exit + +if.then: ; preds = %voiderr97 + %158 = call i64 @std_core_mem_allocator_new_temp(%TempAllocator** %retparam98, i64 131072, %Allocator* @std_core_mem_allocator__SYSTEM_ALLOCATOR) + %not_err99 = icmp eq i64 %158, 0 + br i1 %not_err99, label %after_check100, label %assign_optional + +assign_optional: ; preds = %if.then + store i64 %158, i64* %error_var, align 8 + br label %panic_block + +after_check100: ; preds = %if.then + %159 = load %TempAllocator*, %TempAllocator** %retparam98, align 8 + br label %noerr_block + +panic_block: ; preds = %assign_optional + %160 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %160(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.panic_msg, i64 0, i64 0), i64 27, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.file, i64 0, i64 0), i64 6, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.func, i64 0, i64 0), i64 4, + unreachable + +noerr_block: ; preds = %after_check100 + store %TempAllocator* %159, %TempAllocator** @std_core_mem_thread_temp_allocator, align 8 + br label %if.exit + +if.exit: ; preds = %noerr_block, %voiderr97 + %161 = load %TempAllocator*, %TempAllocator** @std_core_mem_thread_temp_allocator, align 8 + store %TempAllocator* %161, %TempAllocator** %temp, align 8 + %162 = load %TempAllocator*, %TempAllocator** %temp, align 8 + %163 = getelementptr inbounds %TempAllocator, %TempAllocator* %162, i32 0, i32 3 + %164 = load i64, i64* %163, align 8 + store i64 %164, i64* %mark, align 8 + %165 = bitcast %HashMap.3* %map3 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %165, i8 0, i64 40, i1 false) + call void @"std_map$$int.double_HashMap_tinit"(%HashMap.3* %map3, i32 16, float 7.500000e-01) + %166 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map3, i32 5, double 3.200000e+00) + %167 = call i8 @"std_map$$int.double_HashMap_set"(%HashMap.3* %map3, i32 7, double 5.200000e+00) + %168 = load %Allocator*, %Allocator** @std_core_mem_thread_allocator, align 8 + %169 = call { i8*, i64 } @"std_map$$int.double_HashMap_key_list"(%HashMap.3* %map3, %Allocator* %168) + %170 = bitcast %"int[]"* %result103 to { i8*, i64 }* + store { i8*, i64 } %169, { i8*, i64 }* %170, align 8 + %171 = bitcast %"int[]"* %result103 to i8* + %172 = insertvalue %variant undef, i8* %171, 0 + %173 = insertvalue %variant %172, i64 ptrtoint (%.introspect* @"ct$sa$int" to i64), 1 + %174 = getelementptr inbounds [1 x %variant], [1 x %variant]* %varargslots102, i64 0, i64 0 + store %variant %173, %variant* %174, align 16 + %175 = bitcast [1 x %variant]* %varargslots102 to %variant* + %176 = insertvalue %"variant[]" undef, %variant* %175, 0 + %177 = insertvalue %"variant[]" %176, i64 1, 1 + store %"variant[]" %177, %"variant[]"* %taddr104, align 8 + %178 = bitcast %"variant[]"* %taddr104 to { i8*, i64 }* + %179 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %178, i32 0, i32 0 + %lo105 = load i8*, i8** %179, align 8 + %180 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %178, i32 0, i32 1 + %hi106 = load i64, i64* %180, align 8 + %181 = call i64 @std_io_printfn(i64* %retparam101, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.11, i32 0, i32 0), i64 2, i8* %lo105, i64 %hi106) + %not_err107 = icmp eq i64 %181, 0 + br i1 %not_err107, label %after_check108, label %voiderr109 + +after_check108: ; preds = %if.exit + br label %voiderr109 + +voiderr109: ; preds = %after_check108, %if.exit + %182 = load %TempAllocator*, %TempAllocator** %temp, align 8 + %183 = getelementptr inbounds %TempAllocator, %TempAllocator* %182, i32 0, i32 0 + %184 = load i64, i64* %mark, align 8 + call void @std_core_mem_allocator_Allocator_reset(%Allocator* %183, i64 %184) + ret void +} + +; Function Attrs: nounwind +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @test_main() + ret i32 0 +} + +; Function Attrs: argmemonly nofree nounwind willreturn writeonly +declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg) #1 + +declare void @"std_map$$int.test_Foo_HashMap_tinit"(%HashMap.0*, i32, float) + +declare i64 @std_io_printfn(i64*, i8*, i64, i8*, i64) + +declare i8 @"std_map$$int.test_Foo_HashMap_set"(%HashMap.0*, i32, i64, i8*) + +declare i64 @"std_map$$int.test_Foo_HashMap_get"(%Foo*, %HashMap.0*, i32) + +declare i8 @"std_map$$int.test_Foo_HashMap_has_key"(%HashMap.0*, i32) + +declare { i8*, i64 } @"std_map$$int.test_Foo_HashMap_value_list"(%HashMap.0*, %Allocator*) + +declare void @"std_map$$int.double_HashMap_tinit"(%HashMap.3*, i32, float) + +declare i8 @"std_map$$int.double_HashMap_set"(%HashMap.3*, i32, double) diff --git a/test/test_suite14/stdlib/memcomp.c3t b/test/test_suite14/stdlib/memcomp.c3t new file mode 100644 index 000000000..1b9dfd516 --- /dev/null +++ b/test/test_suite14/stdlib/memcomp.c3t @@ -0,0 +1,16 @@ +// #target: macos-x64 +module test; +import std::io; +import libc; + +fn void main() +{ + int[] ab = { 3, 5, 6, 10, 0x0b2399 }; + int[] cd = { 3, 5, 6, 10, 0x0b2399 }; + char[] x = "hello world!"; + char[] y = "hello world?"; + io::printfn("is matching: %s", mem::equals(ab, cd)); + io::printfn("is matching: %s", mem::equals(x, y)); + io::printfn("is matching: %s", mem::equals(x.ptr, y.ptr, x.len)); + io::printfn("is matching: %s", mem::equals(ab.ptr, cd.ptr, ab.len * 4, 4)); +} \ No newline at end of file diff --git a/test/test_suite14/stdlib/minmax.c3 b/test/test_suite14/stdlib/minmax.c3 new file mode 100644 index 000000000..b8bfa7446 --- /dev/null +++ b/test/test_suite14/stdlib/minmax.c3 @@ -0,0 +1,9 @@ +import std::io; + +fn void main() +{ + io::printfn("min(-1, 1) == %s", min(-1, 1)); + io::printfn("max(-1, 1) == %s", max(-1, 1)); + io::printfn("min(-1, 0, 1) == %s", min(-1, 0, 1)); + io::printfn("max(-1, 0, 1) == %s", max(-1, 0, 1)); +} diff --git a/test/test_suite14/stdlib/print_env_defines.c3 b/test/test_suite14/stdlib/print_env_defines.c3 new file mode 100644 index 000000000..e764da65e --- /dev/null +++ b/test/test_suite14/stdlib/print_env_defines.c3 @@ -0,0 +1,15 @@ +import std::io; + +fn void main() +{ + io::printfn("LLVM version: %s", env::LLVM_VERSION); + io::printfn("Optimization level: %s", env::COMPILER_OPT_LEVEL); + io::printfn("Safe mode: %s", env::COMPILER_SAFE_MODE); + io::printfn("OS type: %s", env::OS_TYPE); + io::printfn("Big endian: %s", env::BIG_ENDIAN); + io::printfn("i128 support: %s", env::I128_NATIVE_SUPPORT); + io::printfn("f16 support: %s", env::F16_SUPPORT); + io::printfn("f128 support: %s", env::F128_SUPPORT); + io::printfn("Benchmarking: %s", env::BENCHMARKING); + io::printfn("Testing: %s", env::TESTING); +} \ No newline at end of file diff --git a/test/test_suite2/stdlib/priorityqueue.c3t b/test/test_suite14/stdlib/priorityqueue.c3t similarity index 100% rename from test/test_suite2/stdlib/priorityqueue.c3t rename to test/test_suite14/stdlib/priorityqueue.c3t diff --git a/test/test_suite14/stdlib/rounding_mode.c3 b/test/test_suite14/stdlib/rounding_mode.c3 new file mode 100644 index 000000000..f955b1795 --- /dev/null +++ b/test/test_suite14/stdlib/rounding_mode.c3 @@ -0,0 +1,30 @@ +import std::io; +import std::math; + +fn void main() +{ + io::printfn("Current rounding mode: %s", $$get_rounding_mode()); + float f1 = 11.5; + float f2 = -11.5; + + foreach (int mode : RoundingMode.values) + { + $$set_rounding_mode(mode); + io::printfn("Rounding mode: %s", $$get_rounding_mode()); + + io::printfn(" ceil(%s) == %s", f1, math::ceil(f1)); + io::printfn(" ceil(%s) == %s", f2, math::ceil(f2)); + io::printfn(" floor(%s) == %s", f1, math::floor(f1)); + io::printfn(" floor(%s) == %s", f2, math::floor(f2)); + io::printfn(" nearbyint(%s) == %s", f1, math::nearbyint(f1)); + io::printfn(" nearbyint(%s) == %s", f2, math::nearbyint(f2)); + io::printfn(" rint(%s) == %s", f1, math::rint(f1)); + io::printfn(" rint(%s) == %s", f2, math::rint(f2)); + io::printfn(" round(%s) == %s", f1, math::round(f1)); + io::printfn(" round(%s) == %s", f2, math::round(f2)); + io::printfn(" roundeven(%s) == %s", f1, math::roundeven(f1)); + io::printfn(" roundeven(%s) == %s", f2, math::roundeven(f2)); + io::printfn(" trunc(%s) == %s", f1, math::trunc(f1)); + io::printfn(" trunc(%s) == %s", f2, math::trunc(f2)); + } +} diff --git a/test/test_suite2/strings/literal_errors.c3 b/test/test_suite14/strings/literal_errors.c3 similarity index 100% rename from test/test_suite2/strings/literal_errors.c3 rename to test/test_suite14/strings/literal_errors.c3 diff --git a/test/test_suite2/strings/literal_hex_ok.c3 b/test/test_suite14/strings/literal_hex_ok.c3 similarity index 100% rename from test/test_suite2/strings/literal_hex_ok.c3 rename to test/test_suite14/strings/literal_hex_ok.c3 diff --git a/test/test_suite2/strings/literal_to_subarray.c3t b/test/test_suite14/strings/literal_to_subarray.c3t similarity index 56% rename from test/test_suite2/strings/literal_to_subarray.c3t rename to test/test_suite14/strings/literal_to_subarray.c3t index 4a7efe479..15477a67d 100644 --- a/test/test_suite2/strings/literal_to_subarray.c3t +++ b/test/test_suite14/strings/literal_to_subarray.c3t @@ -9,16 +9,14 @@ fn void test() /* #expect: literal_to_subarray.ll -%"char[]" = type { ptr, i64 } - +%"char[]" = type { i8*, i64 } @.str = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@literal_to_subarray_y = local_unnamed_addr global %"char[]" { ptr @.str, i64 5 }, align 8 +@literal_to_subarray_y = local_unnamed_addr global %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 5 }, align 8 @.str.1 = private unnamed_addr constant [6 x i8] c"world\00", align 1 - ; Function Attrs: nounwind define void @literal_to_subarray_test() #0 { entry: %x = alloca %"char[]", align 8 - store %"char[]" { ptr @.str.1, i64 5 }, ptr %x, align 8 + store %"char[]" { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i64 5 }, %"char[]"* %x, align 8 ret void } diff --git a/test/test_suite2/strings/multiline_strings.c3t b/test/test_suite14/strings/multiline_strings.c3t similarity index 100% rename from test/test_suite2/strings/multiline_strings.c3t rename to test/test_suite14/strings/multiline_strings.c3t diff --git a/test/test_suite2/strings/string_escape.c3t b/test/test_suite14/strings/string_escape.c3t similarity index 65% rename from test/test_suite2/strings/string_escape.c3t rename to test/test_suite14/strings/string_escape.c3t index 448a0a796..404136fa3 100644 --- a/test/test_suite2/strings/string_escape.c3t +++ b/test/test_suite14/strings/string_escape.c3t @@ -10,12 +10,12 @@ fn void main() define void @string_escape_main() #0 { entry: - %s = alloca ptr, align 8 - store ptr @.str, ptr %s, align 8 + %s = alloca i8*, align 8 + store i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str, i32 0, i32 0), i8** %s, align 8 ret void } -define i32 @main(i32 %0, ptr %1) #0 { +define i32 @main(i32 %0, i8** %1) #0 { entry: call void @string_escape_main() ret i32 0 diff --git a/test/test_suite2/strings/string_len.c3t b/test/test_suite14/strings/string_len.c3t similarity index 100% rename from test/test_suite2/strings/string_len.c3t rename to test/test_suite14/strings/string_len.c3t diff --git a/test/test_suite2/strings/string_to_array.c3t b/test/test_suite14/strings/string_to_array.c3t similarity index 50% rename from test/test_suite2/strings/string_to_array.c3t rename to test/test_suite14/strings/string_to_array.c3t index bc0f90b5a..c5cdd6308 100644 --- a/test/test_suite2/strings/string_to_array.c3t +++ b/test/test_suite14/strings/string_to_array.c3t @@ -17,7 +17,9 @@ define i32 @main() #0 { entry: %x = alloca [2 x i8], align 1 %y = alloca [3 x i8], align 1 - call void @llvm.memcpy.p0.p0.i32(ptr align 1 %x, ptr align 1 @.str, i32 2, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 1 %y, ptr align 1 @.str.1, i32 3, i1 false) + %0 = bitcast [2 x i8]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %0, i8* align 1 getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i32 2, i1 false) + %1 = bitcast [3 x i8]* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %1, i8* align 1 getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i32 0, i32 0), i32 3, i1 false) ret i32 0 } diff --git a/test/test_suite2/struct/duplicate_member.c3 b/test/test_suite14/struct/duplicate_member.c3 similarity index 100% rename from test/test_suite2/struct/duplicate_member.c3 rename to test/test_suite14/struct/duplicate_member.c3 diff --git a/test/test_suite2/struct/flex_array_struct_err.c3 b/test/test_suite14/struct/flex_array_struct_err.c3 similarity index 100% rename from test/test_suite2/struct/flex_array_struct_err.c3 rename to test/test_suite14/struct/flex_array_struct_err.c3 diff --git a/test/test_suite2/struct/func_return_struct.c3 b/test/test_suite14/struct/func_return_struct.c3 similarity index 100% rename from test/test_suite2/struct/func_return_struct.c3 rename to test/test_suite14/struct/func_return_struct.c3 diff --git a/test/test_suite2/struct/member_access.c3 b/test/test_suite14/struct/member_access.c3 similarity index 100% rename from test/test_suite2/struct/member_access.c3 rename to test/test_suite14/struct/member_access.c3 diff --git a/test/test_suite2/struct/member_expr.c3 b/test/test_suite14/struct/member_expr.c3 similarity index 100% rename from test/test_suite2/struct/member_expr.c3 rename to test/test_suite14/struct/member_expr.c3 diff --git a/test/test_suite2/struct/nested_struct_init.c3t b/test/test_suite14/struct/nested_struct_init.c3t similarity index 52% rename from test/test_suite2/struct/nested_struct_init.c3t rename to test/test_suite14/struct/nested_struct_init.c3t index fcb8e549c..fff61d8fc 100644 --- a/test/test_suite2/struct/nested_struct_init.c3t +++ b/test/test_suite14/struct/nested_struct_init.c3t @@ -53,24 +53,37 @@ define void @foo_main() #0 { entry: %m = alloca %Matrix2x2, align 4 %m2 = alloca %Matrix2x2_b, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m, ptr align 4 @.__const, i32 16, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m2, ptr align 4 @.__const.8, i32 16, i1 false) - %0 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 - %1 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 0 - %2 = load float, ptr %1, align 4 - %fpfpext = fpext float %2 to double - %3 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 - %4 = getelementptr inbounds [4 x float], ptr %3, i64 0, i64 1 - %5 = load float, ptr %4, align 4 - %fpfpext1 = fpext float %5 to double - %6 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 - %7 = getelementptr inbounds %.anon.0, ptr %6, i32 0, i32 2 - %8 = load float, ptr %7, align 4 - %fpfpext2 = fpext float %8 to double - %9 = getelementptr inbounds %Matrix2x2, ptr %m, i32 0, i32 0 - %10 = getelementptr inbounds [4 x float], ptr %9, i64 0, i64 3 - %11 = load float, ptr %10, align 4 - %fpfpext3 = fpext float %11 to double - %12 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) + %0 = bitcast %Matrix2x2* %m to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Matrix2x2* @.__const to i8*), i32 16, i1 false) + %1 = bitcast %Matrix2x2_b* %m2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Matrix2x2_b* @.__const.8 to i8*), i32 16, i1 false) + %2 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 + %3 = bitcast %.anon* %2 to %.anon.0* + %4 = getelementptr inbounds %.anon.0, %.anon.0* %3, i32 0, i32 0 + %5 = load float, float* %4, align 4 + %fpfpext = fpext float %5 to double + %6 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 + %7 = bitcast %.anon* %6 to [4 x float]* + %8 = getelementptr inbounds [4 x float], [4 x float]* %7, i64 0, i64 1 + %9 = load float, float* %8, align 4 + %fpfpext1 = fpext float %9 to double + %10 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 + %11 = bitcast %.anon* %10 to %.anon.0* + %12 = getelementptr inbounds %.anon.0, %.anon.0* %11, i32 0, i32 2 + %13 = load float, float* %12, align 4 + %fpfpext2 = fpext float %13 to double + %14 = getelementptr inbounds %Matrix2x2, %Matrix2x2* %m, i32 0, i32 0 + %15 = bitcast %.anon* %14 to [4 x float]* + %16 = getelementptr inbounds [4 x float], [4 x float]* %15, i64 0, i64 3 + %17 = load float, float* %16, align 4 + %fpfpext3 = fpext float %17 to double + %18 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) ret void } + +; Function Attrs: nounwind +define i32 @main(i32 %0, i8** %1) #0 { +entry: + call void @foo_main() + ret i32 0 +} \ No newline at end of file diff --git a/test/test_suite14/struct/nested_struct_union_init.c3t b/test/test_suite14/struct/nested_struct_union_init.c3t new file mode 100644 index 000000000..3b78a2e60 --- /dev/null +++ b/test/test_suite14/struct/nested_struct_union_init.c3t @@ -0,0 +1,116 @@ +// #target: macos-x64 +module foob; +import libc; +struct Matrix2x2 +{ + union + { + float[4] m; + struct { + float m00, m01, m10, m11; + } + } +} + +struct Matrix2x2_b +{ + union + { + struct { + float m00, m01, m10, m11; + } + float[4] m; + } +} +struct Matrix4x4 { + union { + struct { + float m00, m01, m02, m03; + float m10, m11, m12, m13; + float m20, m21, m22, m23; + float m30, m31, m32, m33; + } + float[16] m; + } +} + + +struct Matrix3x3 { + union { + struct { + float m00, m01, m02, m10, m11, m12, m20, m21, m22; + } + float[9] m; + } +} +fn void main() +{ + Matrix3x3 x = { 1, 2, 3, 4, 5, 6, 7,8 ,9}; + Matrix2x2 m = { float[4] { 1, 2, 3, 4 } }; + Matrix2x2_b m2 = { 1, 2, 3, 4 }; + libc::printf("%f %f %f %f\n", x.m00, x.m[1], x.m10, x.m[3]); +} + +/* #expect: foob.ll + +%Matrix2x2 = type { %.anon.1 } +%.anon.1 = type { [4 x float] } +%Matrix2x2_b = type { %.anon.2 } +%.anon.2 = type { %.anon.3 } +%.anon.3 = type { float, float, float, float } +%Matrix3x3 = type { %.anon } +%.anon = type { %.anon.0 } +%.anon.0 = type { float, float, float, float, float, float, float, float, float } + +define void @foob_main() #0 { +entry: + %x = alloca %Matrix3x3, align 4 + %m = alloca %Matrix2x2, align 4 + %m2 = alloca %Matrix2x2_b, align 4 + %0 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 + %1 = bitcast %.anon* %0 to %.anon.0* + %2 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 0 + store float 1.000000e+00, float* %2, align 4 + %3 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 1 + store float 2.000000e+00, float* %3, align 4 + %4 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 2 + store float 3.000000e+00, float* %4, align 4 + %5 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 3 + store float 4.000000e+00, float* %5, align 4 + %6 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 4 + store float 5.000000e+00, float* %6, align 4 + %7 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 5 + store float 6.000000e+00, float* %7, align 4 + %8 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 6 + store float 7.000000e+00, float* %8, align 4 + %9 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 7 + store float 8.000000e+00, float* %9, align 4 + %10 = getelementptr inbounds %.anon.0, %.anon.0* %1, i32 0, i32 8 + store float 9.000000e+00, float* %10, align 4 + %11 = bitcast %Matrix2x2* %m to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %11, i8* align 4 bitcast (%Matrix2x2* @.__const to i8*), i32 16, i1 false) + %12 = bitcast %Matrix2x2_b* %m2 to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %12, i8* align 4 bitcast (%Matrix2x2_b* @.__const.16 to i8*), i32 16, i1 false) + %13 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 + %14 = bitcast %.anon* %13 to %.anon.0* + %15 = getelementptr inbounds %.anon.0, %.anon.0* %14, i32 0, i32 0 + %16 = load float, float* %15, align 4 + %fpfpext = fpext float %16 to double + %17 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 + %18 = bitcast %.anon* %17 to [9 x float]* + %19 = getelementptr inbounds [9 x float], [9 x float]* %18, i64 0, i64 1 + %20 = load float, float* %19, align 4 + %fpfpext1 = fpext float %20 to double + %21 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 + %22 = bitcast %.anon* %21 to %.anon.0* + %23 = getelementptr inbounds %.anon.0, %.anon.0* %22, i32 0, i32 3 + %24 = load float, float* %23, align 4 + %fpfpext2 = fpext float %24 to double + %25 = getelementptr inbounds %Matrix3x3, %Matrix3x3* %x, i32 0, i32 0 + %26 = bitcast %.anon* %25 to [9 x float]* + %27 = getelementptr inbounds [9 x float], [9 x float]* %26, i64 0, i64 3 + %28 = load float, float* %27, align 4 + %fpfpext3 = fpext float %28 to double + %29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) + ret void +} diff --git a/test/test_suite2/struct/recursive_structs.c3 b/test/test_suite14/struct/recursive_structs.c3 similarity index 100% rename from test/test_suite2/struct/recursive_structs.c3 rename to test/test_suite14/struct/recursive_structs.c3 diff --git a/test/test_suite2/struct/simple_struct.c3t b/test/test_suite14/struct/simple_struct.c3t similarity index 100% rename from test/test_suite2/struct/simple_struct.c3t rename to test/test_suite14/struct/simple_struct.c3t diff --git a/test/test_suite2/struct/sret.c3t b/test/test_suite14/struct/sret.c3t similarity index 100% rename from test/test_suite2/struct/sret.c3t rename to test/test_suite14/struct/sret.c3t diff --git a/test/test_suite2/struct/struct_as_value.c3t b/test/test_suite14/struct/struct_as_value.c3t similarity index 60% rename from test/test_suite2/struct/struct_as_value.c3t rename to test/test_suite14/struct/struct_as_value.c3t index e8d2156b0..c5d19f659 100644 --- a/test/test_suite2/struct/struct_as_value.c3t +++ b/test/test_suite14/struct/struct_as_value.c3t @@ -14,6 +14,7 @@ fn Event test(int x) } /* #expect: test.ll + %Event = type { i32 } @"ct$test_Event" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 @@ -25,23 +26,25 @@ entry: %foo = alloca %Event, align 4 %bar = alloca %Event, align 4 %taddr = alloca %Event, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 4, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %bar, ptr align 4 @.__const.1, i32 4, i1 false) + %1 = bitcast %Event* %foo to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Event* @.__const to i8*), i32 4, i1 false) + %2 = bitcast %Event* %bar to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast (%Event* @.__const.1 to i8*), i32 4, i1 false) %intbool = icmp ne i32 %0, 0 br i1 %intbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %1 = load %Event, ptr %foo, align 4 + %3 = load %Event, %Event* %foo, align 4 br label %cond.phi cond.rhs: ; preds = %entry - %2 = load %Event, ptr %bar, align 4 + %4 = load %Event, %Event* %bar, align 4 br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %Event [ %1, %cond.lhs ], [ %2, %cond.rhs ] - store %Event %val, ptr %taddr, align 4 - %3 = getelementptr inbounds %Event, ptr %taddr, i32 0, i32 0 - %4 = load i32, ptr %3, align 4 - ret i32 %4 -} \ No newline at end of file + %val = phi %Event [ %3, %cond.lhs ], [ %4, %cond.rhs ] + store %Event %val, %Event* %taddr, align 4 + %5 = getelementptr inbounds %Event, %Event* %taddr, i32 0, i32 0 + %6 = load i32, i32* %5, align 4 + ret i32 %6 +} diff --git a/test/test_suite2/struct/struct_as_value_aarch64.c3t b/test/test_suite14/struct/struct_as_value_aarch64.c3t similarity index 52% rename from test/test_suite2/struct/struct_as_value_aarch64.c3t rename to test/test_suite14/struct/struct_as_value_aarch64.c3t index 54740fa84..43ed1c9e9 100644 --- a/test/test_suite2/struct/struct_as_value_aarch64.c3t +++ b/test/test_suite14/struct/struct_as_value_aarch64.c3t @@ -20,23 +20,25 @@ entry: %foo = alloca %Event, align 4 %bar = alloca %Event, align 4 %taddr = alloca %Event, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 4, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %bar, ptr align 4 @.__const.1, i32 4, i1 false) + %1 = bitcast %Event* %foo to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 4 bitcast (%Event* @.__const to i8*), i32 4, i1 false) + %2 = bitcast %Event* %bar to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %2, i8* align 4 bitcast (%Event* @.__const.1 to i8*), i32 4, i1 false) %intbool = icmp ne i32 %0, 0 br i1 %intbool, label %cond.lhs, label %cond.rhs cond.lhs: ; preds = %entry - %1 = load %Event, ptr %foo, align 4 + %3 = load %Event, %Event* %foo, align 4 br label %cond.phi cond.rhs: ; preds = %entry - %2 = load %Event, ptr %bar, align 4 + %4 = load %Event, %Event* %bar, align 4 br label %cond.phi cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %Event [ %1, %cond.lhs ], [ %2, %cond.rhs ] - store %Event %val, ptr %taddr, align 4 - %3 = getelementptr inbounds %Event, ptr %taddr, i32 0, i32 0 - %4 = load i32, ptr %3, align 4 - ret i32 %4 -} + %val = phi %Event [ %3, %cond.lhs ], [ %4, %cond.rhs ] + store %Event %val, %Event* %taddr, align 4 + %5 = getelementptr inbounds %Event, %Event* %taddr, i32 0, i32 0 + %6 = load i32, i32* %5, align 4 + ret i32 %6 +} \ No newline at end of file diff --git a/test/test_suite2/struct/struct_codegen.c3t b/test/test_suite14/struct/struct_codegen.c3t similarity index 74% rename from test/test_suite2/struct/struct_codegen.c3t rename to test/test_suite14/struct/struct_codegen.c3t index 9cefb4e9a..4b2519125 100644 --- a/test/test_suite2/struct/struct_codegen.c3t +++ b/test/test_suite14/struct/struct_codegen.c3t @@ -22,6 +22,7 @@ fn void test1() define void @test_test1() #0 { entry: %p = alloca %Point, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %p, ptr align 4 @.__const, i32 8, i1 false) + %0 = bitcast %Point* %p to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Point* @.__const to i8*), i32 8, i1 false) ret void -} \ No newline at end of file +} diff --git a/test/test_suite14/struct/struct_codegen_empty.c3t b/test/test_suite14/struct/struct_codegen_empty.c3t new file mode 100644 index 000000000..bdcc6c909 --- /dev/null +++ b/test/test_suite14/struct/struct_codegen_empty.c3t @@ -0,0 +1,41 @@ +// #target: macos-x64 +struct StructA +{ + int a; +} + +struct StructB +{ + struct b + { + int a; + } +} + +fn void test() +{ + StructA a = {}; + StructA a2; + StructB b = {}; + StructB b2; + StructB b3 = { .b = { } }; +} + +/* #expect: struct_codegen_empty.ll + + %a = alloca %StructA, align 4 + %a2 = alloca %StructA, align 4 + %b = alloca %StructB, align 4 + %b2 = alloca %StructB, align 4 + %b3 = alloca %StructB, align 4 + %0 = bitcast %StructA* %a to i32* + store i32 0, i32* %0, align 4 + %1 = bitcast %StructA* %a2 to i32* + store i32 0, i32* %1, align 4 + %2 = bitcast %StructB* %b to i32* + store i32 0, i32* %2, align 4 + %3 = bitcast %StructB* %b2 to i32* + store i32 0, i32* %3, align 4 + %4 = bitcast %StructB* %b3 to i32* + store i32 0, i32* %4, align 4 + ret void \ No newline at end of file diff --git a/test/test_suite2/struct/struct_codegen_fam.c3t b/test/test_suite14/struct/struct_codegen_fam.c3t similarity index 57% rename from test/test_suite2/struct/struct_codegen_fam.c3t rename to test/test_suite14/struct/struct_codegen_fam.c3t index a056ab326..68b9945a2 100644 --- a/test/test_suite2/struct/struct_codegen_fam.c3t +++ b/test/test_suite14/struct/struct_codegen_fam.c3t @@ -22,9 +22,9 @@ fn void test(Bar b) %Bar = type { %.anon, i32, [0 x i32] } %.anon = type { i32 } -define void @foo_test(ptr byval(%Bar) align 8 %0) #0 { +define void @foo_test(%Bar* byval(%Bar) align 8 %0) #0 { entry: - %1 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 2 - %2 = getelementptr inbounds [0 x i32], ptr %1, i64 0, i64 1 + %1 = getelementptr inbounds %Bar, %Bar* %0, i32 0, i32 2 + %2 = getelementptr inbounds [0 x i32], [0 x i32]* %1, i64 0, i64 1 ret void } \ No newline at end of file diff --git a/test/test_suite2/struct/struct_const_construct_simple.c3t b/test/test_suite14/struct/struct_const_construct_simple.c3t similarity index 97% rename from test/test_suite2/struct/struct_const_construct_simple.c3t rename to test/test_suite14/struct/struct_const_construct_simple.c3t index 0f3192eb8..badb3449d 100644 --- a/test/test_suite2/struct/struct_const_construct_simple.c3t +++ b/test/test_suite14/struct/struct_const_construct_simple.c3t @@ -19,6 +19,7 @@ private const Foo FOO7 = { 1, 2 }; private Foo foo8 = FOO7; /* #expect: structo.ll +%Foo = type { i32, i64 } @"ct$structo_Foo" = linkonce constant %.introspect { i8 10, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 @structo_x = protected unnamed_addr global i64 16, align 8 diff --git a/test/test_suite2/struct/struct_pack_and_align.c3t b/test/test_suite14/struct/struct_pack_and_align.c3t similarity index 80% rename from test/test_suite2/struct/struct_pack_and_align.c3t rename to test/test_suite14/struct/struct_pack_and_align.c3t index a2b58755f..3e868d33e 100644 --- a/test/test_suite2/struct/struct_pack_and_align.c3t +++ b/test/test_suite14/struct/struct_pack_and_align.c3t @@ -88,14 +88,14 @@ Foo6 foo6 = { 1, 2, 3 }; define i32 @struct2_test5(i8 signext %0) #0 { entry: %y = alloca %Foo5, align 16 - call void @llvm.memset.p0.i64(ptr align 16 %y, i8 0, i64 32, i1 false) - %1 = getelementptr inbounds %Foo5, ptr %y, i32 0, i32 2 - store i8 %0, ptr %1, align 16 - %2 = getelementptr inbounds %Foo5, ptr %y, i32 0, i32 2 - %3 = load i8, ptr %2, align 16 - %sisiext = sext i8 %3 to i32 - %4 = getelementptr inbounds %Foo5, ptr %y, i32 0, i32 0 - %5 = load i32, ptr %4, align 16 - %add = add i32 %sisiext, %5 + %1 = bitcast %Foo5* %y to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %1, i8 0, i64 32, i1 false) + %2 = getelementptr inbounds %Foo5, %Foo5* %y, i32 0, i32 2 + store i8 %0, i8* %2, align 16 + %3 = getelementptr inbounds %Foo5, %Foo5* %y, i32 0, i32 2 + %4 = load i8, i8* %3, align 16 + %sisiext = sext i8 %4 to i32 + %5 = getelementptr inbounds %Foo5, %Foo5* %y, i32 0, i32 0 + %6 = load i32, i32* %5, align 16 + %add = add i32 %sisiext, %6 ret i32 %add -} diff --git a/test/test_suite2/struct/struct_params.c3 b/test/test_suite14/struct/struct_params.c3 similarity index 100% rename from test/test_suite2/struct/struct_params.c3 rename to test/test_suite14/struct/struct_params.c3 diff --git a/test/test_suite2/struct/zero_member.c3 b/test/test_suite14/struct/zero_member.c3 similarity index 100% rename from test/test_suite2/struct/zero_member.c3 rename to test/test_suite14/struct/zero_member.c3 diff --git a/test/test_suite2/subarrays/slice_comparison.c3t b/test/test_suite14/subarrays/slice_comparison.c3t similarity index 64% rename from test/test_suite2/subarrays/slice_comparison.c3t rename to test/test_suite14/subarrays/slice_comparison.c3t index b7e4b5d72..1d55c5ff6 100644 --- a/test/test_suite2/subarrays/slice_comparison.c3t +++ b/test/test_suite14/subarrays/slice_comparison.c3t @@ -31,8 +31,7 @@ fn void main() } -/* #expect: mymodule.ll - +// #expect: mymodule.ll define void @mymodule_main() #0 { entry: @@ -44,31 +43,31 @@ entry: %cmp.idx18 = alloca i64, align 8 %cmp.idx29 = alloca i64, align 8 %cmp.idx42 = alloca i64, align 8 - store %"char[]" { ptr @.str, i64 4 }, ptr %y, align 8 - store %"char[]" { ptr @.str.1, i64 4 }, ptr %z, align 8 - %0 = load %"char[]", ptr %y, align 8 + store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i32 0, i32 0), i64 4 }, %"char[]"* %y, align 8 + store %"char[]" { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i32 0, i32 0), i64 4 }, %"char[]"* %z, align 8 + %0 = load %"char[]", %"char[]"* %y, align 8 %1 = extractvalue %"char[]" %0, 1 %2 = extractvalue %"char[]" %0, 0 %eq = icmp eq i64 %1, 4 br i1 %eq, label %subarray_cmp_values, label %subarray_cmp_exit subarray_cmp_values: ; preds = %entry - store i64 0, ptr %cmp.idx, align 8 + store i64 0, i64* %cmp.idx, align 8 br label %subarray_loop_start subarray_loop_start: ; preds = %subarray_loop_comparison, %subarray_cmp_values - %3 = load i64, ptr %cmp.idx, align 8 + %3 = load i64, i64* %cmp.idx, align 8 %lt = icmp ult i64 %3, %1 br i1 %lt, label %subarray_loop_comparison, label %subarray_cmp_exit subarray_loop_comparison: ; preds = %subarray_loop_start - %ptroffset = getelementptr inbounds i8, ptr %2, i64 %3 - %ptroffset1 = getelementptr inbounds i8, ptr @.str.2, i64 %3 - %4 = load i8, ptr %ptroffset, align 1 - %5 = load i8, ptr %ptroffset1, align 1 + %ptroffset = getelementptr inbounds i8, i8* %2, i64 %3 + %ptroffset1 = getelementptr inbounds i8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0), i64 %3 + %4 = load i8, i8* %ptroffset, align 1 + %5 = load i8, i8* %ptroffset1, align 1 %eq2 = icmp eq i8 %4, %5 %6 = add i64 %3, 1 - store i64 %6, ptr %cmp.idx, align 8 + store i64 %6, i64* %cmp.idx, align 8 br i1 %eq2, label %subarray_loop_start, label %subarray_cmp_exit subarray_cmp_exit: ; preds = %subarray_loop_comparison, %subarray_loop_start, %entry @@ -76,12 +75,12 @@ subarray_cmp_exit: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi, label %if.then, label %if.exit if.then: ; preds = %subarray_cmp_exit - call void (ptr, ...) @printf(ptr @.str.3) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.3, i32 0, i32 0)) br label %if.exit if.exit: ; preds = %if.then, %subarray_cmp_exit - %7 = load %"char[]", ptr %y, align 8 - %8 = load %"char[]", ptr %z, align 8 + %7 = load %"char[]", %"char[]"* %y, align 8 + %8 = load %"char[]", %"char[]"* %z, align 8 %9 = extractvalue %"char[]" %7, 1 %10 = extractvalue %"char[]" %8, 1 %11 = extractvalue %"char[]" %7, 0 @@ -90,22 +89,22 @@ if.exit: ; preds = %if.then, %subarray_ br i1 %eq3, label %subarray_cmp_values4, label %subarray_cmp_exit12 subarray_cmp_values4: ; preds = %if.exit - store i64 0, ptr %cmp.idx5, align 8 + store i64 0, i64* %cmp.idx5, align 8 br label %subarray_loop_start6 subarray_loop_start6: ; preds = %subarray_loop_comparison8, %subarray_cmp_values4 - %13 = load i64, ptr %cmp.idx5, align 8 + %13 = load i64, i64* %cmp.idx5, align 8 %lt7 = icmp ult i64 %13, %9 br i1 %lt7, label %subarray_loop_comparison8, label %subarray_cmp_exit12 subarray_loop_comparison8: ; preds = %subarray_loop_start6 - %ptroffset9 = getelementptr inbounds i8, ptr %11, i64 %13 - %ptroffset10 = getelementptr inbounds i8, ptr %12, i64 %13 - %14 = load i8, ptr %ptroffset9, align 1 - %15 = load i8, ptr %ptroffset10, align 1 + %ptroffset9 = getelementptr inbounds i8, i8* %11, i64 %13 + %ptroffset10 = getelementptr inbounds i8, i8* %12, i64 %13 + %14 = load i8, i8* %ptroffset9, align 1 + %15 = load i8, i8* %ptroffset10, align 1 %eq11 = icmp eq i8 %14, %15 %16 = add i64 %13, 1 - store i64 %16, ptr %cmp.idx5, align 8 + store i64 %16, i64* %cmp.idx5, align 8 br i1 %eq11, label %subarray_loop_start6, label %subarray_cmp_exit12 subarray_cmp_exit12: ; preds = %subarray_loop_comparison8, %subarray_loop_start6, %if.exit @@ -113,37 +112,39 @@ subarray_cmp_exit12: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi13, label %if.then14, label %if.exit15 if.then14: ; preds = %subarray_cmp_exit12 - call void (ptr, ...) @printf(ptr @.str.4) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i32 0, i32 0)) br label %if.exit15 if.exit15: ; preds = %if.then14, %subarray_cmp_exit12 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %switch, ptr align 8 %y, i32 16, i1 false) + %17 = bitcast %"char[]"* %switch to i8* + %18 = bitcast %"char[]"* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %17, i8* align 8 %18, i32 16, i1 false) br label %switch.entry switch.entry: ; preds = %if.exit15 - %17 = load %"char[]", ptr %switch, align 8 - %18 = extractvalue %"char[]" %17, 1 - %19 = extractvalue %"char[]" %17, 0 - %eq16 = icmp eq i64 4, %18 + %19 = load %"char[]", %"char[]"* %switch, align 8 + %20 = extractvalue %"char[]" %19, 1 + %21 = extractvalue %"char[]" %19, 0 + %eq16 = icmp eq i64 4, %20 br i1 %eq16, label %subarray_cmp_values17, label %subarray_cmp_exit25 subarray_cmp_values17: ; preds = %switch.entry - store i64 0, ptr %cmp.idx18, align 8 + store i64 0, i64* %cmp.idx18, align 8 br label %subarray_loop_start19 subarray_loop_start19: ; preds = %subarray_loop_comparison21, %subarray_cmp_values17 - %20 = load i64, ptr %cmp.idx18, align 8 - %lt20 = icmp ult i64 %20, 4 + %22 = load i64, i64* %cmp.idx18, align 8 + %lt20 = icmp ult i64 %22, 4 br i1 %lt20, label %subarray_loop_comparison21, label %subarray_cmp_exit25 subarray_loop_comparison21: ; preds = %subarray_loop_start19 - %ptroffset22 = getelementptr inbounds i8, ptr @.str.5, i64 %20 - %ptroffset23 = getelementptr inbounds i8, ptr %19, i64 %20 - %21 = load i8, ptr %ptroffset22, align 1 - %22 = load i8, ptr %ptroffset23, align 1 - %eq24 = icmp eq i8 %21, %22 - %23 = add i64 %20, 1 - store i64 %23, ptr %cmp.idx18, align 8 + %ptroffset22 = getelementptr inbounds i8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i32 0, i32 0), i64 %22 + %ptroffset23 = getelementptr inbounds i8, i8* %21, i64 %22 + %23 = load i8, i8* %ptroffset22, align 1 + %24 = load i8, i8* %ptroffset23, align 1 + %eq24 = icmp eq i8 %23, %24 + %25 = add i64 %22, 1 + store i64 %25, i64* %cmp.idx18, align 8 br i1 %eq24, label %subarray_loop_start19, label %subarray_cmp_exit25 subarray_cmp_exit25: ; preds = %subarray_loop_comparison21, %subarray_loop_start19, %switch.entry @@ -151,32 +152,32 @@ subarray_cmp_exit25: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi26, label %switch.case, label %next_if switch.case: ; preds = %subarray_cmp_exit25 - call void (ptr, ...) @printf(ptr @.str.6) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i32 0, i32 0)) br label %switch.exit next_if: ; preds = %subarray_cmp_exit25 - %24 = extractvalue %"char[]" %17, 1 - %25 = extractvalue %"char[]" %17, 0 - %eq27 = icmp eq i64 5, %24 + %26 = extractvalue %"char[]" %19, 1 + %27 = extractvalue %"char[]" %19, 0 + %eq27 = icmp eq i64 5, %26 br i1 %eq27, label %subarray_cmp_values28, label %subarray_cmp_exit36 subarray_cmp_values28: ; preds = %next_if - store i64 0, ptr %cmp.idx29, align 8 + store i64 0, i64* %cmp.idx29, align 8 br label %subarray_loop_start30 subarray_loop_start30: ; preds = %subarray_loop_comparison32, %subarray_cmp_values28 - %26 = load i64, ptr %cmp.idx29, align 8 - %lt31 = icmp ult i64 %26, 5 + %28 = load i64, i64* %cmp.idx29, align 8 + %lt31 = icmp ult i64 %28, 5 br i1 %lt31, label %subarray_loop_comparison32, label %subarray_cmp_exit36 subarray_loop_comparison32: ; preds = %subarray_loop_start30 - %ptroffset33 = getelementptr inbounds i8, ptr @.str.7, i64 %26 - %ptroffset34 = getelementptr inbounds i8, ptr %25, i64 %26 - %27 = load i8, ptr %ptroffset33, align 1 - %28 = load i8, ptr %ptroffset34, align 1 - %eq35 = icmp eq i8 %27, %28 - %29 = add i64 %26, 1 - store i64 %29, ptr %cmp.idx29, align 8 + %ptroffset33 = getelementptr inbounds i8, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.7, i32 0, i32 0), i64 %28 + %ptroffset34 = getelementptr inbounds i8, i8* %27, i64 %28 + %29 = load i8, i8* %ptroffset33, align 1 + %30 = load i8, i8* %ptroffset34, align 1 + %eq35 = icmp eq i8 %29, %30 + %31 = add i64 %28, 1 + store i64 %31, i64* %cmp.idx29, align 8 br i1 %eq35, label %subarray_loop_start30, label %subarray_cmp_exit36 subarray_cmp_exit36: ; preds = %subarray_loop_comparison32, %subarray_loop_start30, %next_if @@ -184,32 +185,32 @@ subarray_cmp_exit36: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi37, label %switch.case38, label %next_if39 switch.case38: ; preds = %subarray_cmp_exit36 - call void (ptr, ...) @printf(ptr @.str.8) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.8, i32 0, i32 0)) br label %switch.exit next_if39: ; preds = %subarray_cmp_exit36 - %30 = extractvalue %"char[]" %17, 1 - %31 = extractvalue %"char[]" %17, 0 - %eq40 = icmp eq i64 4, %30 + %32 = extractvalue %"char[]" %19, 1 + %33 = extractvalue %"char[]" %19, 0 + %eq40 = icmp eq i64 4, %32 br i1 %eq40, label %subarray_cmp_values41, label %subarray_cmp_exit49 subarray_cmp_values41: ; preds = %next_if39 - store i64 0, ptr %cmp.idx42, align 8 + store i64 0, i64* %cmp.idx42, align 8 br label %subarray_loop_start43 subarray_loop_start43: ; preds = %subarray_loop_comparison45, %subarray_cmp_values41 - %32 = load i64, ptr %cmp.idx42, align 8 - %lt44 = icmp ult i64 %32, 4 + %34 = load i64, i64* %cmp.idx42, align 8 + %lt44 = icmp ult i64 %34, 4 br i1 %lt44, label %subarray_loop_comparison45, label %subarray_cmp_exit49 subarray_loop_comparison45: ; preds = %subarray_loop_start43 - %ptroffset46 = getelementptr inbounds i8, ptr @.str.9, i64 %32 - %ptroffset47 = getelementptr inbounds i8, ptr %31, i64 %32 - %33 = load i8, ptr %ptroffset46, align 1 - %34 = load i8, ptr %ptroffset47, align 1 - %eq48 = icmp eq i8 %33, %34 - %35 = add i64 %32, 1 - store i64 %35, ptr %cmp.idx42, align 8 + %ptroffset46 = getelementptr inbounds i8, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.9, i32 0, i32 0), i64 %34 + %ptroffset47 = getelementptr inbounds i8, i8* %33, i64 %34 + %35 = load i8, i8* %ptroffset46, align 1 + %36 = load i8, i8* %ptroffset47, align 1 + %eq48 = icmp eq i8 %35, %36 + %37 = add i64 %34, 1 + store i64 %37, i64* %cmp.idx42, align 8 br i1 %eq48, label %subarray_loop_start43, label %subarray_cmp_exit49 subarray_cmp_exit49: ; preds = %subarray_loop_comparison45, %subarray_loop_start43, %next_if39 @@ -217,16 +218,16 @@ subarray_cmp_exit49: ; preds = %subarray_loop_compa br i1 %subarray_cmp_phi50, label %switch.case51, label %next_if52 switch.case51: ; preds = %subarray_cmp_exit49 - call void (ptr, ...) @printf(ptr @.str.10) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.10, i32 0, i32 0)) br label %switch.exit next_if52: ; preds = %subarray_cmp_exit49 br label %switch.default switch.default: ; preds = %next_if52 - call void (ptr, ...) @printf(ptr @.str.11) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0)) br label %switch.exit switch.exit: ; preds = %switch.default, %switch.case51, %switch.case38, %switch.case ret void -} +} \ No newline at end of file diff --git a/test/test_suite2/subarrays/slice_negative_len.c3 b/test/test_suite14/subarrays/slice_negative_len.c3 similarity index 100% rename from test/test_suite2/subarrays/slice_negative_len.c3 rename to test/test_suite14/subarrays/slice_negative_len.c3 diff --git a/test/test_suite14/subarrays/slice_offset.c3t b/test/test_suite14/subarrays/slice_offset.c3t new file mode 100644 index 000000000..8b4aeff47 --- /dev/null +++ b/test/test_suite14/subarrays/slice_offset.c3t @@ -0,0 +1,16 @@ +fn void test() +{ + int[3] x = { 1, 2, 3 }; + int[] y = x[1..2]; +} + +// #expect: slice_offset.ll + + %x = alloca [3 x i32], align 4 + %y = alloca %"int[]", align 8 + %0 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + %2 = insertvalue %"int[]" undef, i32* %1, 0 + %3 = insertvalue %"int[]" %2, i64 2, 1 + store %"int[]" %3, %"int[]"* %y, align 8 diff --git a/test/test_suite14/subarrays/slice_offset_neg_end.c3t b/test/test_suite14/subarrays/slice_offset_neg_end.c3t new file mode 100644 index 000000000..5e33af0f3 --- /dev/null +++ b/test/test_suite14/subarrays/slice_offset_neg_end.c3t @@ -0,0 +1,18 @@ + +fn void test() +{ + int[3] x = { 1, 2, 3 }; + int[] y = x[1..^1]; +} + +// #expect: slice_offset_neg_end.ll + + %x = alloca [3 x i32], align 4 + %y = alloca %"int[]", align 8 + %0 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + %2 = insertvalue %"int[]" undef, i32* %1, 0 + %3 = insertvalue %"int[]" %2, i64 2, 1 + store %"int[]" %3, %"int[]"* %y, align 8 + diff --git a/test/test_suite14/subarrays/slice_offset_neg_start.c3t b/test/test_suite14/subarrays/slice_offset_neg_start.c3t new file mode 100644 index 000000000..13a406179 --- /dev/null +++ b/test/test_suite14/subarrays/slice_offset_neg_start.c3t @@ -0,0 +1,16 @@ +fn void test() +{ + int[3] x = { 1, 2, 3 }; + int[] y = x[^2..1]; +} + +// #expect: slice_offset_neg_start.ll + + %x = alloca [3 x i32], align 4 + %y = alloca %"int[]", align 8 + %0 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1 + %2 = insertvalue %"int[]" undef, i32* %1, 0 + %3 = insertvalue %"int[]" %2, i64 1, 1 + store %"int[]" %3, %"int[]"* %y, align 8 diff --git a/test/test_suite14/subarrays/slice_start.c3t b/test/test_suite14/subarrays/slice_start.c3t new file mode 100644 index 000000000..6f94e5d7c --- /dev/null +++ b/test/test_suite14/subarrays/slice_start.c3t @@ -0,0 +1,16 @@ +fn void test() +{ + int[3] x = { 1, 2, 3 }; + int[] y = x[..]; +} + +// #expect: slice_start.ll + + %x = alloca [3 x i32], align 4 + %y = alloca %"int[]", align 8 + %0 = bitcast [3 x i32]* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @.__const to i8*), i32 12, i1 false) + %1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0 + %2 = insertvalue %"int[]" undef, i32* %1, 0 + %3 = insertvalue %"int[]" %2, i64 3, 1 + store %"int[]" %3, %"int[]"* %y, align 8 diff --git a/test/test_suite2/subarrays/slice_syntax.c3 b/test/test_suite14/subarrays/slice_syntax.c3 similarity index 100% rename from test/test_suite2/subarrays/slice_syntax.c3 rename to test/test_suite14/subarrays/slice_syntax.c3 diff --git a/test/test_suite2/subarrays/sub_array_init.c3 b/test/test_suite14/subarrays/sub_array_init.c3 similarity index 100% rename from test/test_suite2/subarrays/sub_array_init.c3 rename to test/test_suite14/subarrays/sub_array_init.c3 diff --git a/test/test_suite2/switch/failable_switch.c3 b/test/test_suite14/switch/failable_switch.c3 similarity index 100% rename from test/test_suite2/switch/failable_switch.c3 rename to test/test_suite14/switch/failable_switch.c3 diff --git a/test/test_suite2/symbols/allow_local_shadowing.c3 b/test/test_suite14/symbols/allow_local_shadowing.c3 similarity index 100% rename from test/test_suite2/symbols/allow_local_shadowing.c3 rename to test/test_suite14/symbols/allow_local_shadowing.c3 diff --git a/test/test_suite2/symbols/shadow_struct.c3 b/test/test_suite14/symbols/shadow_struct.c3 similarity index 100% rename from test/test_suite2/symbols/shadow_struct.c3 rename to test/test_suite14/symbols/shadow_struct.c3 diff --git a/test/test_suite2/symbols/various.c3 b/test/test_suite14/symbols/various.c3 similarity index 99% rename from test/test_suite2/symbols/various.c3 rename to test/test_suite14/symbols/various.c3 index db36e6479..2dd2fe1e9 100644 --- a/test/test_suite2/symbols/various.c3 +++ b/test/test_suite14/symbols/various.c3 @@ -184,6 +184,3 @@ fn void test24() { int a = b123; // #error: 'int[2][3]' to 'int' } - - - diff --git a/test/test_suite2/types/enum_illegal_type.c3 b/test/test_suite14/types/enum_illegal_type.c3 similarity index 100% rename from test/test_suite2/types/enum_illegal_type.c3 rename to test/test_suite14/types/enum_illegal_type.c3 diff --git a/test/test_suite2/types/enum_implicit_overflow.c3 b/test/test_suite14/types/enum_implicit_overflow.c3 similarity index 100% rename from test/test_suite2/types/enum_implicit_overflow.c3 rename to test/test_suite14/types/enum_implicit_overflow.c3 diff --git a/test/test_suite2/types/enum_inference.c3 b/test/test_suite14/types/enum_inference.c3 similarity index 100% rename from test/test_suite2/types/enum_inference.c3 rename to test/test_suite14/types/enum_inference.c3 diff --git a/test/test_suite2/types/enum_ok.c3 b/test/test_suite14/types/enum_ok.c3 similarity index 100% rename from test/test_suite2/types/enum_ok.c3 rename to test/test_suite14/types/enum_ok.c3 diff --git a/test/test_suite2/types/enum_param.c3 b/test/test_suite14/types/enum_param.c3 similarity index 100% rename from test/test_suite2/types/enum_param.c3 rename to test/test_suite14/types/enum_param.c3 diff --git a/test/test_suite2/types/enum_parse_errors.c3 b/test/test_suite14/types/enum_parse_errors.c3 similarity index 100% rename from test/test_suite2/types/enum_parse_errors.c3 rename to test/test_suite14/types/enum_parse_errors.c3 diff --git a/test/test_suite2/types/recursive_array.c3 b/test/test_suite14/types/recursive_array.c3 similarity index 100% rename from test/test_suite2/types/recursive_array.c3 rename to test/test_suite14/types/recursive_array.c3 diff --git a/test/test_suite2/types/recursive_typedef.c3 b/test/test_suite14/types/recursive_typedef.c3 similarity index 100% rename from test/test_suite2/types/recursive_typedef.c3 rename to test/test_suite14/types/recursive_typedef.c3 diff --git a/test/test_suite2/types/redefinition.c3 b/test/test_suite14/types/redefinition.c3 similarity index 100% rename from test/test_suite2/types/redefinition.c3 rename to test/test_suite14/types/redefinition.c3 diff --git a/test/test_suite2/types/typedefs.c3 b/test/test_suite14/types/typedefs.c3 similarity index 100% rename from test/test_suite2/types/typedefs.c3 rename to test/test_suite14/types/typedefs.c3 diff --git a/test/test_suite2/types/various.c3 b/test/test_suite14/types/various.c3 similarity index 100% rename from test/test_suite2/types/various.c3 rename to test/test_suite14/types/various.c3 diff --git a/test/test_suite2/unicode/commenting-out.c3 b/test/test_suite14/unicode/commenting-out.c3 similarity index 100% rename from test/test_suite2/unicode/commenting-out.c3 rename to test/test_suite14/unicode/commenting-out.c3 diff --git a/test/test_suite2/union/flexible_array_union.c3 b/test/test_suite14/union/flexible_array_union.c3 similarity index 100% rename from test/test_suite2/union/flexible_array_union.c3 rename to test/test_suite14/union/flexible_array_union.c3 diff --git a/test/test_suite2/union/test_unions.c3 b/test/test_suite14/union/test_unions.c3 similarity index 100% rename from test/test_suite2/union/test_unions.c3 rename to test/test_suite14/union/test_unions.c3 diff --git a/test/test_suite2/union/union_codegen_const.c3t b/test/test_suite14/union/union_codegen_const.c3t similarity index 100% rename from test/test_suite2/union/union_codegen_const.c3t rename to test/test_suite14/union/union_codegen_const.c3t diff --git a/test/test_suite14/union/union_codegen_empty.c3t b/test/test_suite14/union/union_codegen_empty.c3t new file mode 100644 index 000000000..f52d5aa4e --- /dev/null +++ b/test/test_suite14/union/union_codegen_empty.c3t @@ -0,0 +1,46 @@ +union UnionA +{ + int a; +} + +union UnionB +{ + struct b + { + int a; + } + int c; + double d; +} + +fn void test() +{ + UnionA a = {}; + UnionA a2; + UnionB b = {}; + UnionB b2; + UnionB b3 = { .b = {} }; + UnionB b4 = { .b.a = 23, .c = 4, .d = 0.4, .b = {} }; +} + +// #expect: union_codegen_empty.ll + + %a = alloca %UnionA, align 4 + %a2 = alloca %UnionA, align 4 + %b = alloca %UnionB, align 8 + %b2 = alloca %UnionB, align 8 + %b3 = alloca %UnionB, align 8 + %b4 = alloca %UnionB, align 8 + %0 = bitcast %UnionA* %a to i32* + store i32 0, i32* %0, align 4 + %1 = bitcast %UnionA* %a2 to i32* + store i32 0, i32* %1, align 4 + %2 = bitcast %UnionB* %b to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %2, i8 0, i64 8, i1 false) + %3 = bitcast %UnionB* %b2 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %3, i8 0, i64 8, i1 false) + %4 = bitcast %UnionB* %b3 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %4, i8 0, i64 8, i1 false) + %5 = bitcast %UnionB* %b4 to i8* + call void @llvm.memset.p0i8.i64(i8* align 8 %5, i8 0, i64 8, i1 false) + ret void diff --git a/test/test_suite2/union/union_codegen_overwrite_call.c3t b/test/test_suite14/union/union_codegen_overwrite_call.c3t similarity index 52% rename from test/test_suite2/union/union_codegen_overwrite_call.c3t rename to test/test_suite14/union/union_codegen_overwrite_call.c3t index 25a5bf02c..01521672c 100644 --- a/test/test_suite2/union/union_codegen_overwrite_call.c3t +++ b/test/test_suite14/union/union_codegen_overwrite_call.c3t @@ -17,13 +17,15 @@ fn void test() UnionB b = { .c = bar(), .b = {} }; } -/* #expect: test.ll +// #expect: test.ll -define void @test_test() #0 { entry: %b = alloca %UnionB, align 8 - %0 = call i32 @bar() - store i32 %0, ptr %b, align 8 - store i32 0, ptr %b, align 8 + %0 = bitcast %UnionB* %b to i32* + %1 = call i32 @bar() + store i32 %1, i32* %0, align 8 + %2 = bitcast %UnionB* %b to %b* + %3 = bitcast %b* %2 to i32* + store i32 0, i32* %3, align 8 ret void -} + diff --git a/test/test_suite2/union/union_in_struct.c3t b/test/test_suite14/union/union_in_struct.c3t similarity index 100% rename from test/test_suite2/union/union_in_struct.c3t rename to test/test_suite14/union/union_in_struct.c3t diff --git a/test/test_suite2/union/union_member_voidcast.c3 b/test/test_suite14/union/union_member_voidcast.c3 similarity index 100% rename from test/test_suite2/union/union_member_voidcast.c3 rename to test/test_suite14/union/union_member_voidcast.c3 diff --git a/test/test_suite2/variables/consts.c3 b/test/test_suite14/variables/consts.c3 similarity index 100% rename from test/test_suite2/variables/consts.c3 rename to test/test_suite14/variables/consts.c3 diff --git a/test/test_suite14/variant/variant_assign.c3t b/test/test_suite14/variant/variant_assign.c3t new file mode 100644 index 000000000..0077353ed --- /dev/null +++ b/test/test_suite14/variant/variant_assign.c3t @@ -0,0 +1,367 @@ +// #target: macos-x64 +module foo; + +extern fn void printf(char*, ...); + +fn void test(variant z) +{ + switch (z) + { + case int: + printf("int: %d\n", *z); + case double: + printf("double %f\n", *z); + default: + printf("Unknown type.\n"); + } +} +fn void test2(variant y) +{ + switch (z = y) + { + case int: + y = &&12; + printf("int: %d\n", *z); + case double: + printf("double %f\n", *z); + default: + printf("Unknown type.\n"); + } +} + +fn void test3(variant y) +{ + switch (z = *y) + { + case int: + printf("int: %d\n", z); + case double: + printf("double %f\n", z); + default: + printf("Unknown type.\n"); + } +} + +fn int main() +{ + test(&&123.0); + test(&&1); + test(&&true); + test2(&&123.5); + test2(&&1); + test2(&&true); + test3(&&124.0); + test3(&&2); + test3(&&true); + return 0; +} + +/* #expect: foo.ll + +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @foo_test(i64 %0, i8* %1) #0 { +entry: + %z = alloca %variant, align 8 + %switch = alloca i64, align 8 + %z1 = alloca i32*, align 8 + %z4 = alloca double*, align 8 + %pair = bitcast %variant* %z to { i64, i8* }* + %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 + store i8* %1, i8** %3, align 8 + %4 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 1 + %5 = load i64, i64* %4, align 8 + store i64 %5, i64* %switch, align 8 + br label %switch.entry + +switch.entry: ; preds = %entry + %6 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %6 + br i1 %eq, label %switch.case, label %next_if + +switch.case: ; preds = %switch.entry + %7 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 + %8 = bitcast i8** %7 to i32** + %9 = load i32*, i32** %8, align 8 + store i32* %9, i32** %z1, align 8 + %10 = load i32*, i32** %z1, align 8 + %11 = load i32, i32* %10, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %11) + br label %switch.exit + +next_if: ; preds = %switch.entry + %eq2 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %6 + br i1 %eq2, label %switch.case3, label %next_if5 + +switch.case3: ; preds = %next_if + %12 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 + %13 = bitcast i8** %12 to double** + %14 = load double*, double** %13, align 8 + store double* %14, double** %z4, align 8 + %15 = load double*, double** %z4, align 8 + %16 = load double, double* %15, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %16) + br label %switch.exit + +next_if5: ; preds = %next_if + br label %switch.default + +switch.default: ; preds = %next_if5 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i32 0, i32 0)) + br label %switch.exit + +switch.exit: ; preds = %switch.default, %switch.case3, %switch.case + ret void +} + +define void @foo_test2(i64 %0, i8* %1) #0 { +entry: + %y = alloca %variant, align 8 + %.anon = alloca %variant, align 8 + %switch = alloca i64, align 8 + %z = alloca i32*, align 8 + %taddr = alloca i32, align 4 + %z3 = alloca double*, align 8 + %pair = bitcast %variant* %y to { i64, i8* }* + %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 + store i8* %1, i8** %3, align 8 + %4 = bitcast %variant* %.anon to i8* + %5 = bitcast %variant* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 16, i1 false) + %6 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %switch, align 8 + br label %switch.entry + +switch.entry: ; preds = %entry + %8 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %8 + br i1 %eq, label %switch.case, label %next_if + +switch.case: ; preds = %switch.entry + %9 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 + %10 = bitcast i8** %9 to i32** + %11 = load i32*, i32** %10, align 8 + store i32* %11, i32** %z, align 8 + store i32 12, i32* %taddr, align 4 + %12 = bitcast i32* %taddr to i8* + %13 = insertvalue %variant undef, i8* %12, 0 + %14 = insertvalue %variant %13, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %14, %variant* %y, align 8 + %15 = load i32*, i32** %z, align 8 + %16 = load i32, i32* %15, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %16) + br label %switch.exit + +next_if: ; preds = %switch.entry + %eq1 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %8 + br i1 %eq1, label %switch.case2, label %next_if4 + +switch.case2: ; preds = %next_if + %17 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 + %18 = bitcast i8** %17 to double** + %19 = load double*, double** %18, align 8 + store double* %19, double** %z3, align 8 + %20 = load double*, double** %z3, align 8 + %21 = load double, double* %20, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i32 0, i32 0), double %21) + br label %switch.exit + +next_if4: ; preds = %next_if + br label %switch.default + +switch.default: ; preds = %next_if4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i32 0, i32 0)) + br label %switch.exit + +switch.exit: ; preds = %switch.default, %switch.case2, %switch.case + ret void +} + +; Function Attrs: nounwind +define void @foo_test3(i64 %0, i8* %1) #0 { +entry: + %y = alloca %variant, align 8 + %.anon = alloca %variant, align 8 + %switch = alloca i64, align 8 + %z = alloca i32, align 4 + %z3 = alloca double, align 8 + %pair = bitcast %variant* %y to { i64, i8* }* + %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 + store i8* %1, i8** %3, align 8 + %4 = bitcast %variant* %.anon to i8* + %5 = bitcast %variant* %y to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %4, i8* align 8 %5, i32 16, i1 false) + %6 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %switch, align 8 + br label %switch.entry + +switch.entry: ; preds = %entry + %8 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %8 + br i1 %eq, label %switch.case, label %next_if + +switch.case: ; preds = %switch.entry + %9 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 + %10 = bitcast i8** %9 to i32** + %11 = load i32*, i32** %10, align 8 + %12 = load i32, i32* %11, align 8 + store i32 %12, i32* %z, align 4 + %13 = load i32, i32* %z, align 4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.6, i32 0, i32 0), i32 %13) + br label %switch.exit + +next_if: ; preds = %switch.entry + %eq1 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %8 + br i1 %eq1, label %switch.case2, label %next_if4 + +switch.case2: ; preds = %next_if + %14 = getelementptr inbounds %variant, %variant* %.anon, i32 0, i32 0 + %15 = bitcast i8** %14 to double** + %16 = load double*, double** %15, align 8 + %17 = load double, double* %16, align 8 + store double %17, double* %z3, align 8 + %18 = load double, double* %z3, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i32 0, i32 0), double %18) + br label %switch.exit + +next_if4: ; preds = %next_if + br label %switch.default + +switch.default: ; preds = %next_if4 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.8, i32 0, i32 0)) + br label %switch.exit + +switch.exit: ; preds = %switch.default, %switch.case2, %switch.case + ret void +} + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + %taddr = alloca double, align 8 + %taddr1 = alloca %variant, align 8 + %taddr2 = alloca i32, align 4 + %taddr3 = alloca %variant, align 8 + %taddr6 = alloca i8, align 1 + %taddr7 = alloca %variant, align 8 + %taddr10 = alloca double, align 8 + %taddr11 = alloca %variant, align 8 + %taddr14 = alloca i32, align 4 + %taddr15 = alloca %variant, align 8 + %taddr18 = alloca i8, align 1 + %taddr19 = alloca %variant, align 8 + %taddr22 = alloca double, align 8 + %taddr23 = alloca %variant, align 8 + %taddr26 = alloca i32, align 4 + %taddr27 = alloca %variant, align 8 + %taddr30 = alloca i8, align 1 + %taddr31 = alloca %variant, align 8 + store double 1.230000e+02, double* %taddr, align 8 + %0 = bitcast double* %taddr to i8* + %1 = insertvalue %variant undef, i8* %0, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + store %variant %2, %variant* %taddr1, align 8 + %3 = bitcast %variant* %taddr1 to { i64, i8* }* + %4 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 0 + %lo = load i64, i64* %4, align 8 + %5 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 1 + %hi = load i8*, i8** %5, align 8 + call void @foo_test(i64 %lo, i8* %hi) + store i32 1, i32* %taddr2, align 4 + %6 = bitcast i32* %taddr2 to i8* + %7 = insertvalue %variant undef, i8* %6, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %8, %variant* %taddr3, align 8 + %9 = bitcast %variant* %taddr3 to { i64, i8* }* + %10 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 0 + %lo4 = load i64, i64* %10, align 8 + %11 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 1 + %hi5 = load i8*, i8** %11, align 8 + call void @foo_test(i64 %lo4, i8* %hi5) + store i8 1, i8* %taddr6, align 1 + %12 = insertvalue %variant undef, i8* %taddr6, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + store %variant %13, %variant* %taddr7, align 8 + %14 = bitcast %variant* %taddr7 to { i64, i8* }* + %15 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 0 + %lo8 = load i64, i64* %15, align 8 + %16 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 1 + %hi9 = load i8*, i8** %16, align 8 + call void @foo_test(i64 %lo8, i8* %hi9) + store double 1.235000e+02, double* %taddr10, align 8 + %17 = bitcast double* %taddr10 to i8* + %18 = insertvalue %variant undef, i8* %17, 0 + %19 = insertvalue %variant %18, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + store %variant %19, %variant* %taddr11, align 8 + %20 = bitcast %variant* %taddr11 to { i64, i8* }* + %21 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %20, i32 0, i32 0 + %lo12 = load i64, i64* %21, align 8 + %22 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %20, i32 0, i32 1 + %hi13 = load i8*, i8** %22, align 8 + call void @foo_test2(i64 %lo12, i8* %hi13) + store i32 1, i32* %taddr14, align 4 + %23 = bitcast i32* %taddr14 to i8* + %24 = insertvalue %variant undef, i8* %23, 0 + %25 = insertvalue %variant %24, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %25, %variant* %taddr15, align 8 + %26 = bitcast %variant* %taddr15 to { i64, i8* }* + %27 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %26, i32 0, i32 0 + %lo16 = load i64, i64* %27, align 8 + %28 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %26, i32 0, i32 1 + %hi17 = load i8*, i8** %28, align 8 + call void @foo_test2(i64 %lo16, i8* %hi17) + store i8 1, i8* %taddr18, align 1 + %29 = insertvalue %variant undef, i8* %taddr18, 0 + %30 = insertvalue %variant %29, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + store %variant %30, %variant* %taddr19, align 8 + %31 = bitcast %variant* %taddr19 to { i64, i8* }* + %32 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %31, i32 0, i32 0 + %lo20 = load i64, i64* %32, align 8 + %33 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %31, i32 0, i32 1 + %hi21 = load i8*, i8** %33, align 8 + call void @foo_test2(i64 %lo20, i8* %hi21) + store double 1.240000e+02, double* %taddr22, align 8 + %34 = bitcast double* %taddr22 to i8* + %35 = insertvalue %variant undef, i8* %34, 0 + %36 = insertvalue %variant %35, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + store %variant %36, %variant* %taddr23, align 8 + %37 = bitcast %variant* %taddr23 to { i64, i8* }* + %38 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %37, i32 0, i32 0 + %lo24 = load i64, i64* %38, align 8 + %39 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %37, i32 0, i32 1 + %hi25 = load i8*, i8** %39, align 8 + call void @foo_test3(i64 %lo24, i8* %hi25) + store i32 2, i32* %taddr26, align 4 + %40 = bitcast i32* %taddr26 to i8* + %41 = insertvalue %variant undef, i8* %40, 0 + %42 = insertvalue %variant %41, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %42, %variant* %taddr27, align 8 + %43 = bitcast %variant* %taddr27 to { i64, i8* }* + %44 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %43, i32 0, i32 0 + %lo28 = load i64, i64* %44, align 8 + %45 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %43, i32 0, i32 1 + %hi29 = load i8*, i8** %45, align 8 + call void @foo_test3(i64 %lo28, i8* %hi29) + store i8 1, i8* %taddr30, align 1 + %46 = insertvalue %variant undef, i8* %taddr30, 0 + %47 = insertvalue %variant %46, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + store %variant %47, %variant* %taddr31, align 8 + %48 = bitcast %variant* %taddr31 to { i64, i8* }* + %49 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %48, i32 0, i32 0 + %lo32 = load i64, i64* %49, align 8 + %50 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %48, i32 0, i32 1 + %hi33 = load i8*, i8** %50, align 8 + call void @foo_test3(i64 %lo32, i8* %hi33) + ret i32 0 +} + diff --git a/test/test_suite14/variant/variant_switch.c3t b/test/test_suite14/variant/variant_switch.c3t new file mode 100644 index 000000000..0de5b2d8e --- /dev/null +++ b/test/test_suite14/variant/variant_switch.c3t @@ -0,0 +1,151 @@ +// #target: macos-x64 +module foo; + +extern fn void printf(char*, ...); + +fn void test(variant z) +{ + switch (z) + { + case int: + printf("int: %d\n", *z); + *z = 3; + case double: + printf("double %f\n", *z); + default: + printf("Unknown type.\n"); + } + if (z.type == int.typeid) + { + printf("int: %d\n", *(int*)(z)); + } +} +fn int main() +{ + test(&&123.0); + test(&&1); + test(&&true); + return 0; +} + +/* #expect: foo.ll + +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @foo_test(i64 %0, i8* %1) #0 { +entry: + %z = alloca %variant, align 8 + %switch = alloca i64, align 8 + %z1 = alloca i32*, align 8 + %z4 = alloca double*, align 8 + %pair = bitcast %variant* %z to { i64, i8* }* + %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 + store i8* %1, i8** %3, align 8 + %4 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 1 + %5 = load i64, i64* %4, align 8 + store i64 %5, i64* %switch, align 8 + br label %switch.entry + +switch.entry: ; preds = %entry + %6 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %6 + br i1 %eq, label %switch.case, label %next_if + +switch.case: ; preds = %switch.entry + %7 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 + %8 = bitcast i8** %7 to i32** + %9 = load i32*, i32** %8, align 8 + store i32* %9, i32** %z1, align 8 + %10 = load i32*, i32** %z1, align 8 + %11 = load i32, i32* %10, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), i32 %11) + %12 = load i32*, i32** %z1, align 8 + store i32 3, i32* %12, align 8 + br label %switch.exit + +next_if: ; preds = %switch.entry + %eq2 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %6 + br i1 %eq2, label %switch.case3, label %next_if5 + +switch.case3: ; preds = %next_if + %13 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 + %14 = bitcast i8** %13 to double** + %15 = load double*, double** %14, align 8 + store double* %15, double** %z4, align 8 + %16 = load double*, double** %z4, align 8 + %17 = load double, double* %16, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %17) + br label %switch.exit + +next_if5: ; preds = %next_if + br label %switch.default + +switch.default: ; preds = %next_if5 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i32 0, i32 0)) + br label %switch.exit + +switch.exit: ; preds = %switch.default, %switch.case3, %switch.case + %18 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 1 + %19 = load i64, i64* %18, align 8 + %eq6 = icmp eq i64 %19, ptrtoint (%.introspect* @"ct$int" to i64) + br i1 %eq6, label %if.then, label %if.exit + +if.then: ; preds = %switch.exit + %20 = getelementptr inbounds %variant, %variant* %z, i32 0, i32 0 + %21 = bitcast i8** %20 to i32** + %22 = load i32*, i32** %21, align 8 + %23 = load i32, i32* %22, align 8 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %23) + br label %if.exit + +if.exit: ; preds = %if.then, %switch.exit + ret void +} + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + %taddr = alloca double, align 8 + %taddr1 = alloca %variant, align 8 + %taddr2 = alloca i32, align 4 + %taddr3 = alloca %variant, align 8 + %taddr6 = alloca i8, align 1 + %taddr7 = alloca %variant, align 8 + store double 1.230000e+02, double* %taddr, align 8 + %0 = bitcast double* %taddr to i8* + %1 = insertvalue %variant undef, i8* %0, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + store %variant %2, %variant* %taddr1, align 8 + %3 = bitcast %variant* %taddr1 to { i64, i8* }* + %4 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 0 + %lo = load i64, i64* %4, align 8 + %5 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %3, i32 0, i32 1 + %hi = load i8*, i8** %5, align 8 + call void @foo_test(i64 %lo, i8* %hi) + store i32 1, i32* %taddr2, align 4 + %6 = bitcast i32* %taddr2 to i8* + %7 = insertvalue %variant undef, i8* %6, 0 + %8 = insertvalue %variant %7, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %8, %variant* %taddr3, align 8 + %9 = bitcast %variant* %taddr3 to { i64, i8* }* + %10 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 0 + %lo4 = load i64, i64* %10, align 8 + %11 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %9, i32 0, i32 1 + %hi5 = load i8*, i8** %11, align 8 + call void @foo_test(i64 %lo4, i8* %hi5) + store i8 1, i8* %taddr6, align 1 + %12 = insertvalue %variant undef, i8* %taddr6, 0 + %13 = insertvalue %variant %12, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + store %variant %13, %variant* %taddr7, align 8 + %14 = bitcast %variant* %taddr7 to { i64, i8* }* + %15 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 0 + %lo8 = load i64, i64* %15, align 8 + %16 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %14, i32 0, i32 1 + %hi9 = load i8*, i8** %16, align 8 + call void @foo_test(i64 %lo8, i8* %hi9) + ret i32 0 +} diff --git a/test/test_suite14/variant/variant_test.c3t b/test/test_suite14/variant/variant_test.c3t new file mode 100644 index 000000000..fcc4464c3 --- /dev/null +++ b/test/test_suite14/variant/variant_test.c3t @@ -0,0 +1,340 @@ +// #target: macos-x64 +module foo; +extern fn void printf(char*, ...); + +fn void test(variant x) +{ + switch (x.type) + { + case int: + printf("Was int\n"); + case double: + printf("Was double\n"); + case variant: + printf("Was variant\n"); + case int*: + printf("Was int*\n"); + default: + printf("Unknown type\n"); + } +} + +fn void test_all(variant... y) +{ + foreach (element : y) + { + test(element); + } +} + +fn void main() +{ + variant x = &&1; + int z; + variant y = &z; + typeid g = y.type; + typeid h = x.type; + if (y.type == int.typeid) + { + printf("y int match\n"); + } + if (x.type == int.typeid) + { + printf("x int match\n"); + } + y = &&1.0; + x = &x; + if (y.type == int.typeid) + { + printf("y int match\n"); + } + if (x.type == int.typeid) + { + printf("x int match\n"); + } + test(x); + test(&&1.0); + test(&&1); + test(&&true); + printf("----\n"); + int* df = null; + test_all(x, x, &&1.0, &x, &df); +} + +/* #expect: foo.ll + +%variant = type { i8*, i64 } +%"variant[]" = type { %variant*, i64 } + +@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$variant" = linkonce constant %.introspect { i8 7, i64 16, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$p$int" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (%.introspect* @"ct$int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 +@"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @foo_test(i64 %0, i8* %1) #0 { +entry: + %x = alloca %variant, align 8 + %switch = alloca i64, align 8 + %pair = bitcast %variant* %x to { i64, i8* }* + %2 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 0 + store i64 %0, i64* %2, align 8 + %3 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %pair, i32 0, i32 1 + store i8* %1, i8** %3, align 8 + %4 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 + %5 = load i64, i64* %4, align 8 + store i64 %5, i64* %switch, align 8 + br label %switch.entry + +switch.entry: ; preds = %entry + %6 = load i64, i64* %switch, align 8 + %eq = icmp eq i64 ptrtoint (%.introspect* @"ct$int" to i64), %6 + br i1 %eq, label %switch.case, label %next_if + +switch.case: ; preds = %switch.entry + call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0)) + br label %switch.exit + +next_if: ; preds = %switch.entry + %eq1 = icmp eq i64 ptrtoint (%.introspect* @"ct$double" to i64), %6 + br i1 %eq1, label %switch.case2, label %next_if3 + +switch.case2: ; preds = %next_if + call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i32 0, i32 0)) + br label %switch.exit + +next_if3: ; preds = %next_if + %eq4 = icmp eq i64 ptrtoint (%.introspect* @"ct$variant" to i64), %6 + br i1 %eq4, label %switch.case5, label %next_if6 + +switch.case5: ; preds = %next_if3 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i32 0, i32 0)) + br label %switch.exit + +next_if6: ; preds = %next_if3 + %eq7 = icmp eq i64 ptrtoint (%.introspect* @"ct$p$int" to i64), %6 + br i1 %eq7, label %switch.case8, label %next_if9 + +switch.case8: ; preds = %next_if6 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i32 0, i32 0)) + br label %switch.exit + +next_if9: ; preds = %next_if6 + br label %switch.default + +switch.default: ; preds = %next_if9 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0)) + br label %switch.exit + +switch.exit: ; preds = %switch.default, %switch.case8, %switch.case5, %switch.case2, %switch.case + ret void +} + +; Function Attrs: nounwind +define void @foo_test_all(i8* %0, i64 %1) #0 { +entry: + %y = alloca %"variant[]", align 8 + %.anon = alloca i64, align 8 + %.anon1 = alloca i64, align 8 + %element = alloca %variant, align 8 + %pair = bitcast %"variant[]"* %y to { i8*, i64 }* + %2 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 0 + store i8* %0, i8** %2, align 8 + %3 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %pair, i32 0, i32 1 + store i64 %1, i64* %3, align 8 + %4 = getelementptr inbounds %"variant[]", %"variant[]"* %y, i32 0, i32 1 + %5 = load i64, i64* %4, align 8 + store i64 %5, i64* %.anon, align 8 + store i64 0, i64* %.anon1, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %6 = load i64, i64* %.anon1, align 8 + %7 = load i64, i64* %.anon, align 8 + %lt = icmp ult i64 %6, %7 + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %8 = getelementptr inbounds %"variant[]", %"variant[]"* %y, i32 0, i32 0 + %9 = load %variant*, %variant** %8, align 8 + %10 = load i64, i64* %.anon1, align 8 + %ptroffset = getelementptr inbounds %variant, %variant* %9, i64 %10 + %11 = bitcast %variant* %element to i8* + %12 = bitcast %variant* %ptroffset to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %11, i8* align 8 %12, i32 16, i1 false) + %13 = bitcast %variant* %element to { i64, i8* }* + %14 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %13, i32 0, i32 0 + %lo = load i64, i64* %14, align 8 + %15 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %13, i32 0, i32 1 + %hi = load i8*, i8** %15, align 8 + call void @foo_test(i64 %lo, i8* %hi) + %16 = load i64, i64* %.anon1, align 8 + %add = add i64 %16, 1 + store i64 %add, i64* %.anon1, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + ret void +} + +; Function Attrs: nounwind +define void @foo_main() #0 { +entry: + %x = alloca %variant, align 8 + %taddr = alloca i32, align 4 + %z = alloca i32, align 4 + %y = alloca %variant, align 8 + %g = alloca i64, align 8 + %h = alloca i64, align 8 + %taddr4 = alloca double, align 8 + %taddr11 = alloca double, align 8 + %taddr12 = alloca %variant, align 8 + %taddr15 = alloca i32, align 4 + %taddr16 = alloca %variant, align 8 + %taddr19 = alloca i8, align 1 + %taddr20 = alloca %variant, align 8 + %df = alloca i32*, align 8 + %varargslots = alloca [5 x %variant], align 16 + %taddr23 = alloca double, align 8 + %taddr24 = alloca %"variant[]", align 8 + store i32 1, i32* %taddr, align 4 + %0 = bitcast i32* %taddr to i8* + %1 = insertvalue %variant undef, i8* %0, 0 + %2 = insertvalue %variant %1, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %2, %variant* %x, align 8 + store i32 0, i32* %z, align 4 + %3 = bitcast i32* %z to i8* + %4 = insertvalue %variant undef, i8* %3, 0 + %5 = insertvalue %variant %4, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %5, %variant* %y, align 8 + %6 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 + %7 = load i64, i64* %6, align 8 + store i64 %7, i64* %g, align 8 + %8 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 + %9 = load i64, i64* %8, align 8 + store i64 %9, i64* %h, align 8 + %10 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 + %11 = load i64, i64* %10, align 8 + %eq = icmp eq i64 %11, ptrtoint (%.introspect* @"ct$int" to i64) + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %entry + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.5, i32 0, i32 0)) + br label %if.exit + +if.exit: ; preds = %if.then, %entry + %12 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 + %13 = load i64, i64* %12, align 8 + %eq1 = icmp eq i64 %13, ptrtoint (%.introspect* @"ct$int" to i64) + br i1 %eq1, label %if.then2, label %if.exit3 + +if.then2: ; preds = %if.exit + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0)) + br label %if.exit3 + +if.exit3: ; preds = %if.then2, %if.exit + store double 1.000000e+00, double* %taddr4, align 8 + %14 = bitcast double* %taddr4 to i8* + %15 = insertvalue %variant undef, i8* %14, 0 + %16 = insertvalue %variant %15, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + store %variant %16, %variant* %y, align 8 + %17 = bitcast %variant* %x to i8* + %18 = insertvalue %variant undef, i8* %17, 0 + %19 = insertvalue %variant %18, i64 ptrtoint (%.introspect* @"ct$variant" to i64), 1 + store %variant %19, %variant* %x, align 8 + %20 = getelementptr inbounds %variant, %variant* %y, i32 0, i32 1 + %21 = load i64, i64* %20, align 8 + %eq5 = icmp eq i64 %21, ptrtoint (%.introspect* @"ct$int" to i64) + br i1 %eq5, label %if.then6, label %if.exit7 + +if.then6: ; preds = %if.exit3 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0)) + br label %if.exit7 + +if.exit7: ; preds = %if.then6, %if.exit3 + %22 = getelementptr inbounds %variant, %variant* %x, i32 0, i32 1 + %23 = load i64, i64* %22, align 8 + %eq8 = icmp eq i64 %23, ptrtoint (%.introspect* @"ct$int" to i64) + br i1 %eq8, label %if.then9, label %if.exit10 + +if.then9: ; preds = %if.exit7 + call void (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0)) + br label %if.exit10 + +if.exit10: ; preds = %if.then9, %if.exit7 + %24 = bitcast %variant* %x to { i64, i8* }* + %25 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %24, i32 0, i32 0 + %lo = load i64, i64* %25, align 8 + %26 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %24, i32 0, i32 1 + %hi = load i8*, i8** %26, align 8 + call void @foo_test(i64 %lo, i8* %hi) + store double 1.000000e+00, double* %taddr11, align 8 + %27 = bitcast double* %taddr11 to i8* + %28 = insertvalue %variant undef, i8* %27, 0 + %29 = insertvalue %variant %28, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + store %variant %29, %variant* %taddr12, align 8 + %30 = bitcast %variant* %taddr12 to { i64, i8* }* + %31 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %30, i32 0, i32 0 + %lo13 = load i64, i64* %31, align 8 + %32 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %30, i32 0, i32 1 + %hi14 = load i8*, i8** %32, align 8 + call void @foo_test(i64 %lo13, i8* %hi14) + store i32 1, i32* %taddr15, align 4 + %33 = bitcast i32* %taddr15 to i8* + %34 = insertvalue %variant undef, i8* %33, 0 + %35 = insertvalue %variant %34, i64 ptrtoint (%.introspect* @"ct$int" to i64), 1 + store %variant %35, %variant* %taddr16, align 8 + %36 = bitcast %variant* %taddr16 to { i64, i8* }* + %37 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %36, i32 0, i32 0 + %lo17 = load i64, i64* %37, align 8 + %38 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %36, i32 0, i32 1 + %hi18 = load i8*, i8** %38, align 8 + call void @foo_test(i64 %lo17, i8* %hi18) + store i8 1, i8* %taddr19, align 1 + %39 = insertvalue %variant undef, i8* %taddr19, 0 + %40 = insertvalue %variant %39, i64 ptrtoint (%.introspect* @"ct$bool" to i64), 1 + store %variant %40, %variant* %taddr20, align 8 + %41 = bitcast %variant* %taddr20 to { i64, i8* }* + %42 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %41, i32 0, i32 0 + %lo21 = load i64, i64* %42, align 8 + %43 = getelementptr inbounds { i64, i8* }, { i64, i8* }* %41, i32 0, i32 1 + %hi22 = load i8*, i8** %43, align 8 + call void @foo_test(i64 %lo21, i8* %hi22) + call void (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.9, i32 0, i32 0)) + store i32* null, i32** %df, align 8 + %44 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 0 + %45 = bitcast %variant* %44 to i8* + %46 = bitcast %variant* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %45, i8* align 8 %46, i32 16, i1 false) + %47 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 1 + %48 = bitcast %variant* %47 to i8* + %49 = bitcast %variant* %x to i8* + call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %48, i8* align 8 %49, i32 16, i1 false) + store double 1.000000e+00, double* %taddr23, align 8 + %50 = bitcast double* %taddr23 to i8* + %51 = insertvalue %variant undef, i8* %50, 0 + %52 = insertvalue %variant %51, i64 ptrtoint (%.introspect* @"ct$double" to i64), 1 + %53 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 2 + store %variant %52, %variant* %53, align 16 + %54 = bitcast %variant* %x to i8* + %55 = insertvalue %variant undef, i8* %54, 0 + %56 = insertvalue %variant %55, i64 ptrtoint (%.introspect* @"ct$variant" to i64), 1 + %57 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 3 + store %variant %56, %variant* %57, align 16 + %58 = bitcast i32** %df to i8* + %59 = insertvalue %variant undef, i8* %58, 0 + %60 = insertvalue %variant %59, i64 ptrtoint (%.introspect* @"ct$p$int" to i64), 1 + %61 = getelementptr inbounds [5 x %variant], [5 x %variant]* %varargslots, i64 0, i64 4 + store %variant %60, %variant* %61, align 16 + %62 = bitcast [5 x %variant]* %varargslots to %variant* + %63 = insertvalue %"variant[]" undef, %variant* %62, 0 + %64 = insertvalue %"variant[]" %63, i64 5, 1 + store %"variant[]" %64, %"variant[]"* %taddr24, align 8 + %65 = bitcast %"variant[]"* %taddr24 to { i8*, i64 }* + %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 + %lo25 = load i8*, i8** %66, align 8 + %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 + %hi26 = load i64, i64* %67, align 8 + call void @foo_test_all(i8* %lo25, i64 %hi26) + ret void +} diff --git a/test/test_suite14/vector/vector_bit.c3t b/test/test_suite14/vector/vector_bit.c3t new file mode 100644 index 000000000..a415568da --- /dev/null +++ b/test/test_suite14/vector/vector_bit.c3t @@ -0,0 +1,155 @@ +// #target: macos-x64 + +import libc; + +fn void testf() +{ + float[<4>] y = { 0, 2, 3, 0 }; + int[<4>] w = !y; + libc::printf("Notf %d %d %d %d\n", w[0], w[1], w[2], w[3]); +} + +fn void testi() +{ + int[<4>] y = { 1, 2, 3, 4 }; + int[<4>] z = { 2, 3, 13, -100 }; + int[<4>] w; + w = y & z; + libc::printf("And %d %d %d %d\n", w[0], w[1], w[2], w[3]); + w = y | z; + libc::printf("Or %d %d %d %d\n", w[0], w[1], w[2], w[3]); + w = y ^ z; + libc::printf("Xor %d %d %d %d\n", w[0], w[1], w[2], w[3]); + w = ~y; + libc::printf("BitNeg %d %d %d %d\n", w[0], w[1], w[2], w[3]); + w = -y; + libc::printf("Neg %d %d %d %d\n", w[0], w[1], w[2], w[3]); + w = !y; + w = { -1, 13, 0, 0 }; + w = !w; + libc::printf("Not %d %d %d %d\n", w[0], w[1], w[2], w[3]); +} + +fn void main() +{ + testf(); + testi(); +} + +/* #expect: vector_bit.ll + +; Function Attrs: nounwind +define void @vector_bit_testf() #0 { +entry: + %y = alloca <4 x float>, align 16 + %w = alloca <4 x i32>, align 16 + store <4 x float> , <4 x float>* %y, align 16 + %0 = load <4 x float>, <4 x float>* %y, align 16 + %not = fcmp une <4 x float> %0, zeroinitializer + %1 = sext <4 x i1> %not to <4 x i32> + store <4 x i32> %1, <4 x i32>* %w, align 16 + %2 = load <4 x i32>, <4 x i32>* %w, align 16 + %3 = extractelement <4 x i32> %2, i64 0 + %4 = load <4 x i32>, <4 x i32>* %w, align 16 + %5 = extractelement <4 x i32> %4, i64 1 + %6 = load <4 x i32>, <4 x i32>* %w, align 16 + %7 = extractelement <4 x i32> %6, i64 2 + %8 = load <4 x i32>, <4 x i32>* %w, align 16 + %9 = extractelement <4 x i32> %8, i64 3 + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9) + ret void +} + +; Function Attrs: nounwind +define void @vector_bit_testi() #0 { +entry: + %y = alloca <4 x i32>, align 16 + %z = alloca <4 x i32>, align 16 + %w = alloca <4 x i32>, align 16 + store <4 x i32> , <4 x i32>* %y, align 16 + store <4 x i32> , <4 x i32>* %z, align 16 + store <4 x i32> zeroinitializer, <4 x i32>* %w, align 16 + %0 = load <4 x i32>, <4 x i32>* %y, align 16 + %1 = load <4 x i32>, <4 x i32>* %z, align 16 + %and = and <4 x i32> %0, %1 + store <4 x i32> %and, <4 x i32>* %w, align 16 + %2 = load <4 x i32>, <4 x i32>* %w, align 16 + %3 = extractelement <4 x i32> %2, i64 0 + %4 = load <4 x i32>, <4 x i32>* %w, align 16 + %5 = extractelement <4 x i32> %4, i64 1 + %6 = load <4 x i32>, <4 x i32>* %w, align 16 + %7 = extractelement <4 x i32> %6, i64 2 + %8 = load <4 x i32>, <4 x i32>* %w, align 16 + %9 = extractelement <4 x i32> %8, i64 3 + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9) + %11 = load <4 x i32>, <4 x i32>* %y, align 16 + %12 = load <4 x i32>, <4 x i32>* %z, align 16 + %or = or <4 x i32> %11, %12 + store <4 x i32> %or, <4 x i32>* %w, align 16 + %13 = load <4 x i32>, <4 x i32>* %w, align 16 + %14 = extractelement <4 x i32> %13, i64 0 + %15 = load <4 x i32>, <4 x i32>* %w, align 16 + %16 = extractelement <4 x i32> %15, i64 1 + %17 = load <4 x i32>, <4 x i32>* %w, align 16 + %18 = extractelement <4 x i32> %17, i64 2 + %19 = load <4 x i32>, <4 x i32>* %w, align 16 + %20 = extractelement <4 x i32> %19, i64 3 + %21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), i32 %14, i32 %16, i32 %18, i32 %20) + %22 = load <4 x i32>, <4 x i32>* %y, align 16 + %23 = load <4 x i32>, <4 x i32>* %z, align 16 + %xor = xor <4 x i32> %22, %23 + store <4 x i32> %xor, <4 x i32>* %w, align 16 + %24 = load <4 x i32>, <4 x i32>* %w, align 16 + %25 = extractelement <4 x i32> %24, i64 0 + %26 = load <4 x i32>, <4 x i32>* %w, align 16 + %27 = extractelement <4 x i32> %26, i64 1 + %28 = load <4 x i32>, <4 x i32>* %w, align 16 + %29 = extractelement <4 x i32> %28, i64 2 + %30 = load <4 x i32>, <4 x i32>* %w, align 16 + %31 = extractelement <4 x i32> %30, i64 3 + %32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), i32 %25, i32 %27, i32 %29, i32 %31) + %33 = load <4 x i32>, <4 x i32>* %y, align 16 + %bnot = xor <4 x i32> %33, + store <4 x i32> %bnot, <4 x i32>* %w, align 16 + %34 = load <4 x i32>, <4 x i32>* %w, align 16 + %35 = extractelement <4 x i32> %34, i64 0 + %36 = load <4 x i32>, <4 x i32>* %w, align 16 + %37 = extractelement <4 x i32> %36, i64 1 + %38 = load <4 x i32>, <4 x i32>* %w, align 16 + %39 = extractelement <4 x i32> %38, i64 2 + %40 = load <4 x i32>, <4 x i32>* %w, align 16 + %41 = extractelement <4 x i32> %40, i64 3 + %42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37, i32 %39, i32 %41) + %43 = load <4 x i32>, <4 x i32>* %y, align 16 + %44 = load <4 x i32>, <4 x i32>* %y, align 16 + %neg = sub <4 x i32> zeroinitializer, %44 + store <4 x i32> %neg, <4 x i32>* %w, align 16 + %45 = load <4 x i32>, <4 x i32>* %w, align 16 + %46 = extractelement <4 x i32> %45, i64 0 + %47 = load <4 x i32>, <4 x i32>* %w, align 16 + %48 = extractelement <4 x i32> %47, i64 1 + %49 = load <4 x i32>, <4 x i32>* %w, align 16 + %50 = extractelement <4 x i32> %49, i64 2 + %51 = load <4 x i32>, <4 x i32>* %w, align 16 + %52 = extractelement <4 x i32> %51, i64 3 + %53 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %46, i32 %48, i32 %50, i32 %52) + %54 = load <4 x i32>, <4 x i32>* %y, align 16 + %not = icmp eq <4 x i32> %54, zeroinitializer + %55 = sext <4 x i1> %not to <4 x i32> + store <4 x i32> %55, <4 x i32>* %w, align 16 + store <4 x i32> , <4 x i32>* %w, align 16 + %56 = load <4 x i32>, <4 x i32>* %w, align 16 + %not1 = icmp eq <4 x i32> %56, zeroinitializer + %57 = sext <4 x i1> %not1 to <4 x i32> + store <4 x i32> %57, <4 x i32>* %w, align 16 + %58 = load <4 x i32>, <4 x i32>* %w, align 16 + %59 = extractelement <4 x i32> %58, i64 0 + %60 = load <4 x i32>, <4 x i32>* %w, align 16 + %61 = extractelement <4 x i32> %60, i64 1 + %62 = load <4 x i32>, <4 x i32>* %w, align 16 + %63 = extractelement <4 x i32> %62, i64 2 + %64 = load <4 x i32>, <4 x i32>* %w, align 16 + %65 = extractelement <4 x i32> %64, i64 3 + %66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %59, i32 %61, i32 %63, i32 %65) + ret void +} diff --git a/test/test_suite14/vector/vector_incdec.c3t b/test/test_suite14/vector/vector_incdec.c3t new file mode 100644 index 000000000..75c1132b6 --- /dev/null +++ b/test/test_suite14/vector/vector_incdec.c3t @@ -0,0 +1,190 @@ +// #target: macos-x64 +import libc; + +fn void testf() +{ + float[<4>] y = { 1, 2, 3, 4 }; + float[<4>] z = { 2, 2, 2, -100 }; + y += z; + libc::printf("Add %f %f %f %f\n", y[0], y[1], y[2], y[3]); + y++; + libc::printf("Inc %f %f %f %f\n", y[0], y[1], y[2], y[3]); + ++y; + libc::printf("Inc %f %f %f %f\n", y[0], y[1], y[2], y[3]); + y--; + libc::printf("Dec %f %f %f %f\n", y[0], y[1], y[2], y[3]); +} + +fn void testi() +{ + int[<4>] y = { 1, 2, 3, 4 }; + int[<4>] z = { 2, 2, 2, -100 }; + y += z; + libc::printf("Add %d %d %d %d\n", y[0], y[1], y[2], y[3]); + y++; + libc::printf("Inc %d %d %d %d\n", y[0], y[1], y[2], y[3]); + ++y; + libc::printf("Inc %d %d %d %d\n", y[0], y[1], y[2], y[3]); + int[<4>]w = y--; + libc::printf("Dec %d %d %d %d\n", y[0], y[1], y[2], y[3]); + libc::printf("Original %d %d %d %d\n", w[0], w[1], w[2], w[3]); +} + +fn void main() +{ + testf(); + testi(); +} + +/* #expect: vector_incdec.ll + +define void @vector_incdec_testf() #0 { +entry: + %y = alloca <4 x float>, align 16 + %z = alloca <4 x float>, align 16 + store <4 x float> , <4 x float>* %y, align 16 + store <4 x float> , <4 x float>* %z, align 16 + %0 = load <4 x float>, <4 x float>* %y, align 16 + %1 = load <4 x float>, <4 x float>* %z, align 16 + %fadd = fadd <4 x float> %0, %1 + store <4 x float> %fadd, <4 x float>* %y, align 16 + %2 = load <4 x float>, <4 x float>* %y, align 16 + %3 = extractelement <4 x float> %2, i64 0 + %fpfpext = fpext float %3 to double + %4 = load <4 x float>, <4 x float>* %y, align 16 + %5 = extractelement <4 x float> %4, i64 1 + %fpfpext1 = fpext float %5 to double + %6 = load <4 x float>, <4 x float>* %y, align 16 + %7 = extractelement <4 x float> %6, i64 2 + %fpfpext2 = fpext float %7 to double + %8 = load <4 x float>, <4 x float>* %y, align 16 + %9 = extractelement <4 x float> %8, i64 3 + %fpfpext3 = fpext float %9 to double + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str, i32 0, i32 0), double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) + %11 = load <4 x float>, <4 x float>* %y, align 16 + %fincdec = fadd <4 x float> %11, + store <4 x float> %fincdec, <4 x float>* %y, align 16 + %12 = load <4 x float>, <4 x float>* %y, align 16 + %13 = extractelement <4 x float> %12, i64 0 + %fpfpext4 = fpext float %13 to double + %14 = load <4 x float>, <4 x float>* %y, align 16 + %15 = extractelement <4 x float> %14, i64 1 + %fpfpext5 = fpext float %15 to double + %16 = load <4 x float>, <4 x float>* %y, align 16 + %17 = extractelement <4 x float> %16, i64 2 + %fpfpext6 = fpext float %17 to double + %18 = load <4 x float>, <4 x float>* %y, align 16 + %19 = extractelement <4 x float> %18, i64 3 + %fpfpext7 = fpext float %19 to double + %20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.1, i32 0, i32 0), double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7) + %21 = load <4 x float>, <4 x float>* %y, align 16 + %fincdec8 = fadd <4 x float> %21, + store <4 x float> %fincdec8, <4 x float>* %y, align 16 + %22 = load <4 x float>, <4 x float>* %y, align 16 + %23 = extractelement <4 x float> %22, i64 0 + %fpfpext9 = fpext float %23 to double + %24 = load <4 x float>, <4 x float>* %y, align 16 + %25 = extractelement <4 x float> %24, i64 1 + %fpfpext10 = fpext float %25 to double + %26 = load <4 x float>, <4 x float>* %y, align 16 + %27 = extractelement <4 x float> %26, i64 2 + %fpfpext11 = fpext float %27 to double + %28 = load <4 x float>, <4 x float>* %y, align 16 + %29 = extractelement <4 x float> %28, i64 3 + %fpfpext12 = fpext float %29 to double + %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), double %fpfpext9, double %fpfpext10, double %fpfpext11, double %fpfpext12) + %31 = load <4 x float>, <4 x float>* %y, align 16 + %fincdec13 = fadd <4 x float> %31, + store <4 x float> %fincdec13, <4 x float>* %y, align 16 + %32 = load <4 x float>, <4 x float>* %y, align 16 + %33 = extractelement <4 x float> %32, i64 0 + %fpfpext14 = fpext float %33 to double + %34 = load <4 x float>, <4 x float>* %y, align 16 + %35 = extractelement <4 x float> %34, i64 1 + %fpfpext15 = fpext float %35 to double + %36 = load <4 x float>, <4 x float>* %y, align 16 + %37 = extractelement <4 x float> %36, i64 2 + %fpfpext16 = fpext float %37 to double + %38 = load <4 x float>, <4 x float>* %y, align 16 + %39 = extractelement <4 x float> %38, i64 3 + %fpfpext17 = fpext float %39 to double + %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i32 0, i32 0), double %fpfpext14, double %fpfpext15, double %fpfpext16, double %fpfpext17) + ret void +} + +; Function Attrs: nounwind +define void @vector_incdec_testi() #0 { +entry: + %y = alloca <4 x i32>, align 16 + %z = alloca <4 x i32>, align 16 + %w = alloca <4 x i32>, align 16 + store <4 x i32> , <4 x i32>* %y, align 16 + store <4 x i32> , <4 x i32>* %z, align 16 + %0 = load <4 x i32>, <4 x i32>* %y, align 16 + %1 = load <4 x i32>, <4 x i32>* %z, align 16 + %add = add <4 x i32> %0, %1 + store <4 x i32> %add, <4 x i32>* %y, align 16 + %2 = load <4 x i32>, <4 x i32>* %y, align 16 + %3 = extractelement <4 x i32> %2, i64 0 + %4 = load <4 x i32>, <4 x i32>* %y, align 16 + %5 = extractelement <4 x i32> %4, i64 1 + %6 = load <4 x i32>, <4 x i32>* %y, align 16 + %7 = extractelement <4 x i32> %6, i64 2 + %8 = load <4 x i32>, <4 x i32>* %y, align 16 + %9 = extractelement <4 x i32> %8, i64 3 + %10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.4, i32 0, i32 0), i32 %3, i32 %5, i32 %7, i32 %9) + %11 = load <4 x i32>, <4 x i32>* %y, align 16 + %add1 = add <4 x i32> %11, + store <4 x i32> %add1, <4 x i32>* %y, align 16 + %12 = load <4 x i32>, <4 x i32>* %y, align 16 + %13 = extractelement <4 x i32> %12, i64 0 + %14 = load <4 x i32>, <4 x i32>* %y, align 16 + %15 = extractelement <4 x i32> %14, i64 1 + %16 = load <4 x i32>, <4 x i32>* %y, align 16 + %17 = extractelement <4 x i32> %16, i64 2 + %18 = load <4 x i32>, <4 x i32>* %y, align 16 + %19 = extractelement <4 x i32> %18, i64 3 + %20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %13, i32 %15, i32 %17, i32 %19) + %21 = load <4 x i32>, <4 x i32>* %y, align 16 + %add2 = add <4 x i32> %21, + store <4 x i32> %add2, <4 x i32>* %y, align 16 + %22 = load <4 x i32>, <4 x i32>* %y, align 16 + %23 = extractelement <4 x i32> %22, i64 0 + %24 = load <4 x i32>, <4 x i32>* %y, align 16 + %25 = extractelement <4 x i32> %24, i64 1 + %26 = load <4 x i32>, <4 x i32>* %y, align 16 + %27 = extractelement <4 x i32> %26, i64 2 + %28 = load <4 x i32>, <4 x i32>* %y, align 16 + %29 = extractelement <4 x i32> %28, i64 3 + %30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.6, i32 0, i32 0), i32 %23, i32 %25, i32 %27, i32 %29) + %31 = load <4 x i32>, <4 x i32>* %y, align 16 + %sub = sub <4 x i32> %31, + store <4 x i32> %sub, <4 x i32>* %y, align 16 + store <4 x i32> %31, <4 x i32>* %w, align 16 + %32 = load <4 x i32>, <4 x i32>* %y, align 16 + %33 = extractelement <4 x i32> %32, i64 0 + %34 = load <4 x i32>, <4 x i32>* %y, align 16 + %35 = extractelement <4 x i32> %34, i64 1 + %36 = load <4 x i32>, <4 x i32>* %y, align 16 + %37 = extractelement <4 x i32> %36, i64 2 + %38 = load <4 x i32>, <4 x i32>* %y, align 16 + %39 = extractelement <4 x i32> %38, i64 3 + %40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.7, i32 0, i32 0), i32 %33, i32 %35, i32 %37, i32 %39) + %41 = load <4 x i32>, <4 x i32>* %w, align 16 + %42 = extractelement <4 x i32> %41, i64 0 + %43 = load <4 x i32>, <4 x i32>* %w, align 16 + %44 = extractelement <4 x i32> %43, i64 1 + %45 = load <4 x i32>, <4 x i32>* %w, align 16 + %46 = extractelement <4 x i32> %45, i64 2 + %47 = load <4 x i32>, <4 x i32>* %w, align 16 + %48 = extractelement <4 x i32> %47, i64 3 + %49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.8, i32 0, i32 0), i32 %42, i32 %44, i32 %46, i32 %48) + ret void +} + +define void @vector_incdec_main() #0 { +entry: + call void @vector_incdec_testf() + call void @vector_incdec_testi() + ret void +} diff --git a/test/test_suite2/vector/vector_init.c3t b/test/test_suite14/vector/vector_init.c3t similarity index 67% rename from test/test_suite2/vector/vector_init.c3t rename to test/test_suite14/vector/vector_init.c3t index 04ab6c6e8..e1ed717de 100644 --- a/test/test_suite2/vector/vector_init.c3t +++ b/test/test_suite14/vector/vector_init.c3t @@ -25,29 +25,29 @@ entry: %bar2 = alloca <4 x i32>, align 16 %bar3 = alloca <4 x i32>, align 16 %bar4 = alloca <4 x i32>, align 16 - store <4 x i32> , ptr %foo, align 16 - %0 = load <4 x i32>, ptr %foo, align 16 + store <4 x i32> , <4 x i32>* %foo, align 16 + %0 = load <4 x i32>, <4 x i32>* %foo, align 16 %1 = extractelement <4 x i32> %0, i64 0 - store i32 %1, ptr %z, align 4 - %2 = load <4 x i32>, ptr %foo, align 16 - %3 = load i32, ptr %z, align 4 + store i32 %1, i32* %z, align 4 + %2 = load <4 x i32>, <4 x i32>* %foo, align 16 + %3 = load i32, i32* %z, align 4 %add = add i32 %3, 1 %elemset = insertelement <4 x i32> %2, i32 %add, i64 2 - store <4 x i32> %elemset, ptr %foo, align 16 - store <4 x i32> zeroinitializer, ptr %bar, align 16 - %4 = load i32, ptr %z, align 4 + store <4 x i32> %elemset, <4 x i32>* %foo, align 16 + store <4 x i32> zeroinitializer, <4 x i32>* %bar, align 16 + %4 = load i32, i32* %z, align 4 %5 = insertelement <4 x i32> , i32 %4, i64 1 %6 = insertelement <4 x i32> %5, i32 3, i64 2 %7 = insertelement <4 x i32> %6, i32 4, i64 3 - store <4 x i32> %7, ptr %bar2, align 16 - %8 = load i32, ptr %z, align 4 + store <4 x i32> %7, <4 x i32>* %bar2, align 16 + %8 = load i32, i32* %z, align 4 %9 = insertelement <4 x i32> zeroinitializer, i32 %8, i64 1 - store <4 x i32> %9, ptr %bar3, align 16 - %10 = load i32, ptr %z, align 4 + store <4 x i32> %9, <4 x i32>* %bar3, align 16 + %10 = load i32, i32* %z, align 4 %11 = insertelement <4 x i32> zeroinitializer, i32 %10, i64 0 %12 = insertelement <4 x i32> %11, i32 %10, i64 1 %13 = insertelement <4 x i32> %12, i32 %10, i64 2 %14 = insertelement <4 x i32> %13, i32 %10, i64 3 - store <4 x i32> %14, ptr %bar4, align 16 + store <4 x i32> %14, <4 x i32>* %bar4, align 16 ret void } \ No newline at end of file diff --git a/test/test_suite14/vector/vector_init_regression.c3t b/test/test_suite14/vector/vector_init_regression.c3t new file mode 100644 index 000000000..55b243b35 --- /dev/null +++ b/test/test_suite14/vector/vector_init_regression.c3t @@ -0,0 +1,416 @@ +// #target: macos-x64 +module test; +extern fn int printf(char* format, ...); + +fn void main() { + float radians = 3.1415 / 4; + float[<3>] axis = {0.0, 0.0, 1.0}; + + float cosr = (float) $$cos(radians); + float sinr = (float) $$sin(radians); + float x = axis[0]; + float y = axis[1]; + float z = axis[2]; + + float[<4>][4] a = {}; + a[0] = { + cosr + (x * x) * (float) (1.0 - cosr), + (x * y) * (float) (1.0 - cosr) - (z * sinr), + (x * z) * (float) (1.0 - cosr) + (y * sinr), + 0.0 + }; + + a[1] = { + (y * x) * (float) (1.0 - cosr) + (z * sinr), + cosr + (y * y) * (float) (1.0 - cosr), + (y * z) * (float) (1.0 - cosr) - (x * sinr), + 0.0 + }; + + a[2] = { + (z * x) * (float) (1.0 - cosr) - (y * sinr), + (z * y) * (float) (1.0 - cosr) + (x * sinr), + cosr + (z * z) * (float) (1.0 - cosr), + 0.0 + }; + + a[3] = { + 0.0, + 0.0, + 0.0, + 1.0 + }; + + float[<4>][4] b = { + { + cosr + (x * x) * (float) (1.0 - cosr), + (x * y) * (float) (1.0 - cosr) - (z * sinr), + (x * z) * (float) (1.0 - cosr) + (y * sinr), + 0.0 + }, + { + (y * x) * (float) (1.0 - cosr) + (z * sinr), + cosr + (y * y) * (float) (1.0 - cosr), + (y * z) * (float) (1.0 - cosr) - (x * sinr), + 0.0 + }, + { + (z * x) * (float) (1.0 - cosr) - (y * sinr), + (z * y) * (float) (1.0 - cosr) + (x * sinr), + cosr + (z * z) * (float) (1.0 - cosr), + 0.0 + }, + { + 0.0, + 0.0, + 0.0, + 1.0 + } + }; + + foreach(v : a) { + printf("A: %f %f %f %f\n", v[0], v[1], v[2], v[3]); + } + + printf("\n"); + + foreach(v : b) { + printf("B: %f %f %f %f\n", v[0], v[1], v[2], v[3]); + } +} + +/* #expect: test.ll + +define void @test_main() #0 { +entry: + %radians = alloca float, align 4 + %axis = alloca <3 x float>, align 16 + %cosr = alloca float, align 4 + %sinr = alloca float, align 4 + %x = alloca float, align 4 + %y = alloca float, align 4 + %z = alloca float, align 4 + %a = alloca [4 x <4 x float>], align 16 + %b = alloca [4 x <4 x float>], align 16 + %.anon = alloca i64, align 8 + %v = alloca <4 x float>, align 16 + %.anon85 = alloca i64, align 8 + %v89 = alloca <4 x float>, align 16 + store float 0x3FE921CAC0000000, float* %radians, align 4 + store <3 x float> , <3 x float>* %axis, align 16 + %0 = load float, float* %radians, align 4 + %1 = call float @llvm.cos.f32(float %0) + store float %1, float* %cosr, align 4 + %2 = load float, float* %radians, align 4 + %3 = call float @llvm.sin.f32(float %2) + store float %3, float* %sinr, align 4 + %4 = load <3 x float>, <3 x float>* %axis, align 16 + %5 = extractelement <3 x float> %4, i64 0 + store float %5, float* %x, align 4 + %6 = load <3 x float>, <3 x float>* %axis, align 16 + %7 = extractelement <3 x float> %6, i64 1 + store float %7, float* %y, align 4 + %8 = load <3 x float>, <3 x float>* %axis, align 16 + %9 = extractelement <3 x float> %8, i64 2 + store float %9, float* %z, align 4 + %10 = bitcast [4 x <4 x float>]* %a to i8* + call void @llvm.memset.p0i8.i64(i8* align 16 %10, i8 0, i64 64, i1 false) + %11 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 0 + %12 = load float, float* %cosr, align 4 + %13 = load float, float* %x, align 4 + %14 = load float, float* %x, align 4 + %fmul = fmul float %13, %14 + %15 = load float, float* %cosr, align 4 + %fpfpext = fpext float %15 to double + %fsub = fsub double 1.000000e+00, %fpfpext + %fpfptrunc = fptrunc double %fsub to float + %16 = call float @llvm.fmuladd.f32(float %fmul, float %fpfptrunc, float %12) + %17 = insertelement <4 x float> undef, float %16, i64 0 + %18 = load float, float* %x, align 4 + %19 = load float, float* %y, align 4 + %fmul1 = fmul float %18, %19 + %20 = load float, float* %cosr, align 4 + %fpfpext2 = fpext float %20 to double + %fsub3 = fsub double 1.000000e+00, %fpfpext2 + %fpfptrunc4 = fptrunc double %fsub3 to float + %21 = load float, float* %z, align 4 + %22 = load float, float* %sinr, align 4 + %fmul5 = fmul float %21, %22 + %23 = fneg float %fmul5 + %24 = call float @llvm.fmuladd.f32(float %fmul1, float %fpfptrunc4, float %23) + %25 = insertelement <4 x float> %17, float %24, i64 1 + %26 = load float, float* %x, align 4 + %27 = load float, float* %z, align 4 + %fmul6 = fmul float %26, %27 + %28 = load float, float* %cosr, align 4 + %fpfpext7 = fpext float %28 to double + %fsub8 = fsub double 1.000000e+00, %fpfpext7 + %fpfptrunc9 = fptrunc double %fsub8 to float + %29 = load float, float* %y, align 4 + %30 = load float, float* %sinr, align 4 + %fmul10 = fmul float %29, %30 + %31 = call float @llvm.fmuladd.f32(float %fmul6, float %fpfptrunc9, float %fmul10) + %32 = insertelement <4 x float> %25, float %31, i64 2 + %33 = insertelement <4 x float> %32, float 0.000000e+00, i64 3 + store <4 x float> %33, <4 x float>* %11, align 16 + %34 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 1 + %35 = load float, float* %y, align 4 + %36 = load float, float* %x, align 4 + %fmul11 = fmul float %35, %36 + %37 = load float, float* %cosr, align 4 + %fpfpext12 = fpext float %37 to double + %fsub13 = fsub double 1.000000e+00, %fpfpext12 + %fpfptrunc14 = fptrunc double %fsub13 to float + %38 = load float, float* %z, align 4 + %39 = load float, float* %sinr, align 4 + %fmul15 = fmul float %38, %39 + %40 = call float @llvm.fmuladd.f32(float %fmul11, float %fpfptrunc14, float %fmul15) + %41 = insertelement <4 x float> undef, float %40, i64 0 + %42 = load float, float* %cosr, align 4 + %43 = load float, float* %y, align 4 + %44 = load float, float* %y, align 4 + %fmul16 = fmul float %43, %44 + %45 = load float, float* %cosr, align 4 + %fpfpext17 = fpext float %45 to double + %fsub18 = fsub double 1.000000e+00, %fpfpext17 + %fpfptrunc19 = fptrunc double %fsub18 to float + %46 = call float @llvm.fmuladd.f32(float %fmul16, float %fpfptrunc19, float %42) + %47 = insertelement <4 x float> %41, float %46, i64 1 + %48 = load float, float* %y, align 4 + %49 = load float, float* %z, align 4 + %fmul20 = fmul float %48, %49 + %50 = load float, float* %cosr, align 4 + %fpfpext21 = fpext float %50 to double + %fsub22 = fsub double 1.000000e+00, %fpfpext21 + %fpfptrunc23 = fptrunc double %fsub22 to float + %51 = load float, float* %x, align 4 + %52 = load float, float* %sinr, align 4 + %fmul24 = fmul float %51, %52 + %53 = fneg float %fmul24 + %54 = call float @llvm.fmuladd.f32(float %fmul20, float %fpfptrunc23, float %53) + %55 = insertelement <4 x float> %47, float %54, i64 2 + %56 = insertelement <4 x float> %55, float 0.000000e+00, i64 3 + store <4 x float> %56, <4 x float>* %34, align 16 + %57 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 2 + %58 = load float, float* %z, align 4 + %59 = load float, float* %x, align 4 + %fmul25 = fmul float %58, %59 + %60 = load float, float* %cosr, align 4 + %fpfpext26 = fpext float %60 to double + %fsub27 = fsub double 1.000000e+00, %fpfpext26 + %fpfptrunc28 = fptrunc double %fsub27 to float + %61 = load float, float* %y, align 4 + %62 = load float, float* %sinr, align 4 + %fmul29 = fmul float %61, %62 + %63 = fneg float %fmul29 + %64 = call float @llvm.fmuladd.f32(float %fmul25, float %fpfptrunc28, float %63) + %65 = insertelement <4 x float> undef, float %64, i64 0 + %66 = load float, float* %z, align 4 + %67 = load float, float* %y, align 4 + %fmul30 = fmul float %66, %67 + %68 = load float, float* %cosr, align 4 + %fpfpext31 = fpext float %68 to double + %fsub32 = fsub double 1.000000e+00, %fpfpext31 + %fpfptrunc33 = fptrunc double %fsub32 to float + %69 = load float, float* %x, align 4 + %70 = load float, float* %sinr, align 4 + %fmul34 = fmul float %69, %70 + %71 = call float @llvm.fmuladd.f32(float %fmul30, float %fpfptrunc33, float %fmul34) + %72 = insertelement <4 x float> %65, float %71, i64 1 + %73 = load float, float* %cosr, align 4 + %74 = load float, float* %z, align 4 + %75 = load float, float* %z, align 4 + %fmul35 = fmul float %74, %75 + %76 = load float, float* %cosr, align 4 + %fpfpext36 = fpext float %76 to double + %fsub37 = fsub double 1.000000e+00, %fpfpext36 + %fpfptrunc38 = fptrunc double %fsub37 to float + %77 = call float @llvm.fmuladd.f32(float %fmul35, float %fpfptrunc38, float %73) + %78 = insertelement <4 x float> %72, float %77, i64 2 + %79 = insertelement <4 x float> %78, float 0.000000e+00, i64 3 + store <4 x float> %79, <4 x float>* %57, align 16 + %80 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 3 + store <4 x float> , <4 x float>* %80, align 16 + %81 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 0 + %82 = load float, float* %cosr, align 4 + %83 = load float, float* %x, align 4 + %84 = load float, float* %x, align 4 + %fmul39 = fmul float %83, %84 + %85 = load float, float* %cosr, align 4 + %fpfpext40 = fpext float %85 to double + %fsub41 = fsub double 1.000000e+00, %fpfpext40 + %fpfptrunc42 = fptrunc double %fsub41 to float + %86 = call float @llvm.fmuladd.f32(float %fmul39, float %fpfptrunc42, float %82) + %87 = insertelement <4 x float> undef, float %86, i64 0 + %88 = load float, float* %x, align 4 + %89 = load float, float* %y, align 4 + %fmul43 = fmul float %88, %89 + %90 = load float, float* %cosr, align 4 + %fpfpext44 = fpext float %90 to double + %fsub45 = fsub double 1.000000e+00, %fpfpext44 + %fpfptrunc46 = fptrunc double %fsub45 to float + %91 = load float, float* %z, align 4 + %92 = load float, float* %sinr, align 4 + %fmul47 = fmul float %91, %92 + %93 = fneg float %fmul47 + %94 = call float @llvm.fmuladd.f32(float %fmul43, float %fpfptrunc46, float %93) + %95 = insertelement <4 x float> %87, float %94, i64 1 + %96 = load float, float* %x, align 4 + %97 = load float, float* %z, align 4 + %fmul48 = fmul float %96, %97 + %98 = load float, float* %cosr, align 4 + %fpfpext49 = fpext float %98 to double + %fsub50 = fsub double 1.000000e+00, %fpfpext49 + %fpfptrunc51 = fptrunc double %fsub50 to float + %99 = load float, float* %y, align 4 + %100 = load float, float* %sinr, align 4 + %fmul52 = fmul float %99, %100 + %101 = call float @llvm.fmuladd.f32(float %fmul48, float %fpfptrunc51, float %fmul52) + %102 = insertelement <4 x float> %95, float %101, i64 2 + %103 = insertelement <4 x float> %102, float 0.000000e+00, i64 3 + store <4 x float> %103, <4 x float>* %81, align 16 + %104 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 1 + %105 = load float, float* %y, align 4 + %106 = load float, float* %x, align 4 + %fmul53 = fmul float %105, %106 + %107 = load float, float* %cosr, align 4 + %fpfpext54 = fpext float %107 to double + %fsub55 = fsub double 1.000000e+00, %fpfpext54 + %fpfptrunc56 = fptrunc double %fsub55 to float + %108 = load float, float* %z, align 4 + %109 = load float, float* %sinr, align 4 + %fmul57 = fmul float %108, %109 + %110 = call float @llvm.fmuladd.f32(float %fmul53, float %fpfptrunc56, float %fmul57) + %111 = insertelement <4 x float> undef, float %110, i64 0 + %112 = load float, float* %cosr, align 4 + %113 = load float, float* %y, align 4 + %114 = load float, float* %y, align 4 + %fmul58 = fmul float %113, %114 + %115 = load float, float* %cosr, align 4 + %fpfpext59 = fpext float %115 to double + %fsub60 = fsub double 1.000000e+00, %fpfpext59 + %fpfptrunc61 = fptrunc double %fsub60 to float + %116 = call float @llvm.fmuladd.f32(float %fmul58, float %fpfptrunc61, float %112) + %117 = insertelement <4 x float> %111, float %116, i64 1 + %118 = load float, float* %y, align 4 + %119 = load float, float* %z, align 4 + %fmul62 = fmul float %118, %119 + %120 = load float, float* %cosr, align 4 + %fpfpext63 = fpext float %120 to double + %fsub64 = fsub double 1.000000e+00, %fpfpext63 + %fpfptrunc65 = fptrunc double %fsub64 to float + %121 = load float, float* %x, align 4 + %122 = load float, float* %sinr, align 4 + %fmul66 = fmul float %121, %122 + %123 = fneg float %fmul66 + %124 = call float @llvm.fmuladd.f32(float %fmul62, float %fpfptrunc65, float %123) + %125 = insertelement <4 x float> %117, float %124, i64 2 + %126 = insertelement <4 x float> %125, float 0.000000e+00, i64 3 + store <4 x float> %126, <4 x float>* %104, align 16 + %127 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 2 + %128 = load float, float* %z, align 4 + %129 = load float, float* %x, align 4 + %fmul67 = fmul float %128, %129 + %130 = load float, float* %cosr, align 4 + %fpfpext68 = fpext float %130 to double + %fsub69 = fsub double 1.000000e+00, %fpfpext68 + %fpfptrunc70 = fptrunc double %fsub69 to float + %131 = load float, float* %y, align 4 + %132 = load float, float* %sinr, align 4 + %fmul71 = fmul float %131, %132 + %133 = fneg float %fmul71 + %134 = call float @llvm.fmuladd.f32(float %fmul67, float %fpfptrunc70, float %133) + %135 = insertelement <4 x float> undef, float %134, i64 0 + %136 = load float, float* %z, align 4 + %137 = load float, float* %y, align 4 + %fmul72 = fmul float %136, %137 + %138 = load float, float* %cosr, align 4 + %fpfpext73 = fpext float %138 to double + %fsub74 = fsub double 1.000000e+00, %fpfpext73 + %fpfptrunc75 = fptrunc double %fsub74 to float + %139 = load float, float* %x, align 4 + %140 = load float, float* %sinr, align 4 + %fmul76 = fmul float %139, %140 + %141 = call float @llvm.fmuladd.f32(float %fmul72, float %fpfptrunc75, float %fmul76) + %142 = insertelement <4 x float> %135, float %141, i64 1 + %143 = load float, float* %cosr, align 4 + %144 = load float, float* %z, align 4 + %145 = load float, float* %z, align 4 + %fmul77 = fmul float %144, %145 + %146 = load float, float* %cosr, align 4 + %fpfpext78 = fpext float %146 to double + %fsub79 = fsub double 1.000000e+00, %fpfpext78 + %fpfptrunc80 = fptrunc double %fsub79 to float + %147 = call float @llvm.fmuladd.f32(float %fmul77, float %fpfptrunc80, float %143) + %148 = insertelement <4 x float> %142, float %147, i64 2 + %149 = insertelement <4 x float> %148, float 0.000000e+00, i64 3 + store <4 x float> %149, <4 x float>* %127, align 16 + %150 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 3 + store <4 x float> , <4 x float>* %150, align 16 + store i64 0, i64* %.anon, align 8 + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry + %151 = load i64, i64* %.anon, align 8 + %gt = icmp ugt i64 4, %151 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %152 = load i64, i64* %.anon, align 8 + %153 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %a, i64 0, i64 %152 + %154 = load <4 x float>, <4 x float>* %153, align 16 + store <4 x float> %154, <4 x float>* %v, align 16 + %155 = load <4 x float>, <4 x float>* %v, align 16 + %156 = extractelement <4 x float> %155, i64 0 + %fpfpext81 = fpext float %156 to double + %157 = load <4 x float>, <4 x float>* %v, align 16 + %158 = extractelement <4 x float> %157, i64 1 + %fpfpext82 = fpext float %158 to double + %159 = load <4 x float>, <4 x float>* %v, align 16 + %160 = extractelement <4 x float> %159, i64 2 + %fpfpext83 = fpext float %160 to double + %161 = load <4 x float>, <4 x float>* %v, align 16 + %162 = extractelement <4 x float> %161, i64 3 + %fpfpext84 = fpext float %162 to double + %163 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i32 0, i32 0), double %fpfpext81, double %fpfpext82, double %fpfpext83, double %fpfpext84) + %164 = load i64, i64* %.anon, align 8 + %add = add i64 %164, 1 + store i64 %add, i64* %.anon, align 8 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + %165 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) + store i64 0, i64* %.anon85, align 8 + br label %loop.cond86 + +loop.cond86: ; preds = %loop.body88, %loop.exit + %166 = load i64, i64* %.anon85, align 8 + %gt87 = icmp ugt i64 4, %166 + br i1 %gt87, label %loop.body88, label %loop.exit95 + +loop.body88: ; preds = %loop.cond86 + %167 = load i64, i64* %.anon85, align 8 + %168 = getelementptr inbounds [4 x <4 x float>], [4 x <4 x float>]* %b, i64 0, i64 %167 + %169 = load <4 x float>, <4 x float>* %168, align 16 + store <4 x float> %169, <4 x float>* %v89, align 16 + %170 = load <4 x float>, <4 x float>* %v89, align 16 + %171 = extractelement <4 x float> %170, i64 0 + %fpfpext90 = fpext float %171 to double + %172 = load <4 x float>, <4 x float>* %v89, align 16 + %173 = extractelement <4 x float> %172, i64 1 + %fpfpext91 = fpext float %173 to double + %174 = load <4 x float>, <4 x float>* %v89, align 16 + %175 = extractelement <4 x float> %174, i64 2 + %fpfpext92 = fpext float %175 to double + %176 = load <4 x float>, <4 x float>* %v89, align 16 + %177 = extractelement <4 x float> %176, i64 3 + %fpfpext93 = fpext float %177 to double + %178 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i32 0, i32 0), double %fpfpext90, double %fpfpext91, double %fpfpext92, double %fpfpext93) + %179 = load i64, i64* %.anon85, align 8 + %add94 = add i64 %179, 1 + store i64 %add94, i64* %.anon85, align 8 + br label %loop.cond86 + +loop.exit95: ; preds = %loop.cond86 + ret void +} \ No newline at end of file diff --git a/test/test_suite14/vector/vector_ops2.c3t b/test/test_suite14/vector/vector_ops2.c3t new file mode 100644 index 000000000..f895878df --- /dev/null +++ b/test/test_suite14/vector/vector_ops2.c3t @@ -0,0 +1,104 @@ +// #target: macos-x64 +// #safe: yes +module test; +import libc; + +fn void testf() +{ + float[<4>] y = { 1, 2, 3, 4 }; + float[<4>] z = { 2, 2, 2, -100 }; + float[<4>] w = y + z; + w = y / z; +} + + +fn void testi() +{ + int[<4>] y = { 1, 2, 3, 4 }; + int[<4>] z = { 2, 2, 2, -100 }; + int[<4>] w = y / z; + w = z >> y; + w = z << y; +} + +/* #expect: test.ll + + %4 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %3) + %5 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %4) + %zero = fcmp ueq float %5, 0.000000e+00 + br i1 %zero, label %panic, label %checkok + +panic: ; preds = %entry + %6 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %6(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func, i64 0, i64 0), i64 5, i32 9) + br label %checkok + +checkok: ; preds = %panic, %entry + %fdiv = fdiv <4 x float> %2, %3 + store <4 x float> %fdiv, <4 x float>* %w, align 16 + + %2 = call i32 @llvm.vector.reduce.umin.v4i32(<4 x i32> %1) + %zero = icmp eq i32 %2, 0 + br i1 %zero, label %panic, label %checkok + +panic: ; preds = %entry + %3 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %3(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.panic_msg.1, i64 0, i64 0), i64 17, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.2, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.3, i64 0, i64 0), i64 5, i32 17) + br label %checkok + +checkok: ; preds = %panic, %entry + %sdiv = sdiv <4 x i32> %0, %1 + store <4 x i32> %sdiv, <4 x i32>* %w, align 16 + %4 = load <4 x i32>, <4 x i32>* %z, align 16 + %5 = load <4 x i32>, <4 x i32>* %y, align 16 + %6 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %5) + %shift_underflow = icmp slt i32 %6, 0 + br i1 %shift_underflow, label %panic1, label %checkok2 + +panic1: ; preds = %checkok + %7 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %7(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.4, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.5, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.6, i64 0, i64 0), i64 5, i32 18) + br label %checkok2 + +checkok2: ; preds = %panic1, %checkok + %8 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %5) + %shift_exceeds = icmp sge i32 %8, 32 + br i1 %shift_exceeds, label %panic3, label %checkok4 + +panic3: ; preds = %checkok2 + %9 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %9(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.7, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.8, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.9, i64 0, i64 0), i64 5, i32 18) + br label %checkok4 + +checkok4: ; preds = %panic3, %checkok2 + %ashr = ashr <4 x i32> %4, %5 + %10 = freeze <4 x i32> %ashr + store <4 x i32> %10, <4 x i32>* %w, align 16 + %11 = load <4 x i32>, <4 x i32>* %z, align 16 + %12 = load <4 x i32>, <4 x i32>* %y, align 16 + %13 = call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> %12) + %shift_underflow5 = icmp slt i32 %13, 0 + br i1 %shift_underflow5, label %panic6, label %checkok7 + +panic6: ; preds = %checkok4 + %14 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %14(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.10, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.11, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.12, i64 0, i64 0), i64 5, i32 19) + br label %checkok7 + +checkok7: ; preds = %panic6, %checkok4 + %15 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %12) + %shift_exceeds8 = icmp sge i32 %15, 32 + br i1 %shift_exceeds8, label %panic9, label %checkok10 + +panic9: ; preds = %checkok7 + %16 = load void (i8*, i64, i8*, i64, i8*, i64, i32)*, void (i8*, i64, i8*, i64, i8*, i64, i32)** @std_core_builtin_panic, align 8 + call void %16(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.panic_msg.13, i64 0, i64 0), i64 26, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.file.14, i64 0, i64 0), i64 14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.func.15, i64 0, i64 0), i64 5, i32 19) + br label %checkok10 + +checkok10: ; preds = %panic9, %checkok7 + %shl = shl <4 x i32> %11, %12 + %17 = freeze <4 x i32> %shl + store <4 x i32> %17, <4 x i32>* %w, align 16 + ret void +} + diff --git a/test/test_suite2/vector/vector_to_array_cast.c3t b/test/test_suite14/vector/vector_to_array_cast.c3t similarity index 77% rename from test/test_suite2/vector/vector_to_array_cast.c3t rename to test/test_suite14/vector/vector_to_array_cast.c3t index 1d11f86f1..50410c149 100644 --- a/test/test_suite2/vector/vector_to_array_cast.c3t +++ b/test/test_suite14/vector/vector_to_array_cast.c3t @@ -21,18 +21,18 @@ define void @test_tester() #0 { entry: %x = alloca <2 x i32>, align 8 %y = alloca [2 x i32], align 4 - store <2 x i32> , ptr %x, align 8 - %0 = load <2 x i32>, ptr %x, align 8 + store <2 x i32> , <2 x i32>* %x, align 8 + %0 = load <2 x i32>, <2 x i32>* %x, align 8 %1 = extractelement <2 x i32> %0, i64 0 %2 = insertvalue [2 x i32] undef, i32 %1, 0 %3 = extractelement <2 x i32> %0, i64 1 %4 = insertvalue [2 x i32] %2, i32 %3, 1 - store [2 x i32] %4, ptr %y, align 4 - %5 = load [2 x i32], ptr %y, align 4 + store [2 x i32] %4, [2 x i32]* %y, align 4 + %5 = load [2 x i32], [2 x i32]* %y, align 4 %6 = extractvalue [2 x i32] %5, 0 %7 = insertelement <2 x i32> undef, i32 %6, i64 0 %8 = extractvalue [2 x i32] %5, 1 %9 = insertelement <2 x i32> %7, i32 %8, i64 1 - store <2 x i32> %9, ptr %x, align 8 + store <2 x i32> %9, <2 x i32>* %x, align 8 ret void } diff --git a/test/test_suite2/vector/vector_to_array_fail.c3 b/test/test_suite14/vector/vector_to_array_fail.c3 similarity index 100% rename from test/test_suite2/vector/vector_to_array_fail.c3 rename to test/test_suite14/vector/vector_to_array_fail.c3 diff --git a/test/test_suite2/visibility/ambiguous_var.c3t b/test/test_suite14/visibility/ambiguous_var.c3t similarity index 100% rename from test/test_suite2/visibility/ambiguous_var.c3t rename to test/test_suite14/visibility/ambiguous_var.c3t diff --git a/test/test_suite2/visibility/no_shared_imports.c3t b/test/test_suite14/visibility/no_shared_imports.c3t similarity index 100% rename from test/test_suite2/visibility/no_shared_imports.c3t rename to test/test_suite14/visibility/no_shared_imports.c3t diff --git a/test/test_suite2/visibility/not_visible.c3t b/test/test_suite14/visibility/not_visible.c3t similarity index 100% rename from test/test_suite2/visibility/not_visible.c3t rename to test/test_suite14/visibility/not_visible.c3t diff --git a/test/test_suite2/visibility/private_import.c3 b/test/test_suite14/visibility/private_import.c3 similarity index 100% rename from test/test_suite2/visibility/private_import.c3 rename to test/test_suite14/visibility/private_import.c3 diff --git a/test/test_suite2/visibility/private_module.c3 b/test/test_suite14/visibility/private_module.c3 similarity index 100% rename from test/test_suite2/visibility/private_module.c3 rename to test/test_suite14/visibility/private_module.c3 diff --git a/test/test_suite2/visibility/shared_module.c3t b/test/test_suite14/visibility/shared_module.c3t similarity index 100% rename from test/test_suite2/visibility/shared_module.c3t rename to test/test_suite14/visibility/shared_module.c3t diff --git a/test/test_suite2/visibility/simple_visibility.c3t b/test/test_suite14/visibility/simple_visibility.c3t similarity index 100% rename from test/test_suite2/visibility/simple_visibility.c3t rename to test/test_suite14/visibility/simple_visibility.c3t diff --git a/test/test_suite2/abi/aarch64_args.c3t b/test/test_suite2/abi/aarch64_args.c3t deleted file mode 100644 index 498a388c2..000000000 --- a/test/test_suite2/abi/aarch64_args.c3t +++ /dev/null @@ -1,29 +0,0 @@ -// #target: macos-aarch64 -module test; - -struct Large { - void*[8] pointers; -} - -extern fn void pass_large(Large); - -fn void example() { - Large l = {}; - pass_large(l); - pass_large(l); -} - -/* #expect: test.ll - -define void @test_example() #0 { -entry: - %l = alloca %Large, align 8 - %indirectarg = alloca %Large, align 8 - %indirectarg1 = alloca %Large, align 8 - call void @llvm.memset.p0.i64(ptr align 8 %l, i8 0, i64 64, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 8 %l, i32 64, i1 false) - call void @pass_large(ptr align 8 %indirectarg) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg1, ptr align 8 %l, i32 64, i1 false) - call void @pass_large(ptr align 8 %indirectarg1) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/abi/darwin64_sret.c3t b/test/test_suite2/abi/darwin64_sret.c3t deleted file mode 100644 index bab17c41d..000000000 --- a/test/test_suite2/abi/darwin64_sret.c3t +++ /dev/null @@ -1,19 +0,0 @@ -// #target: macos-x64 -module foo; - -struct SimdDouble4x4 -{ - double[<4>][4] columns; -} - -fn SimdDouble4x4 ident(SimdDouble4x4 x) { - return x; -} - -/* #expect: foo.ll - -define void @foo_ident(ptr noalias sret(%SimdDouble4x4) align 32 %0, ptr byval(%SimdDouble4x4) align 32 %1) #0 { -entry: - call void @llvm.memcpy.p0.p0.i32(ptr align 32 %0, ptr align 32 %1, i32 128, i1 false) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/abi/darwin_arg.c3t b/test/test_suite2/abi/darwin_arg.c3t deleted file mode 100644 index 39502e1b0..000000000 --- a/test/test_suite2/abi/darwin_arg.c3t +++ /dev/null @@ -1,25 +0,0 @@ -// #target: macos-x64 -module test; -struct Str -{ - union - { - float128 a; - long c; - } -} - -extern fn void d(Str s); -Str ss; -fn void f9122143() -{ - d(ss); -} - -/* #expect: test.ll - -declare void @d(i64, double) #0 - - %lo = load i64, ptr @test_ss, align 16 - %hi = load double, ptr getelementptr inbounds ({ i64, double }, ptr @test_ss, i32 0, i32 1), align 8 - call void @d(i64 %lo, double %hi) diff --git a/test/test_suite2/abi/literal_load.c3t b/test/test_suite2/abi/literal_load.c3t deleted file mode 100644 index 797ce3bdb..000000000 --- a/test/test_suite2/abi/literal_load.c3t +++ /dev/null @@ -1,32 +0,0 @@ -// #target: macos-x64 - -struct Test -{ - int x; -} - -Test foo = {}; - -extern fn void blorg(Test t); - -fn Test creator() -{ - blorg(Test{}); - return Test{}; -} - -/* #expect: literal_load.ll - -define i32 @literal_load_creator() #0 { -entry: - %literal = alloca %Test, align 4 - %literal1 = alloca %Test, align 4 - store i32 0, ptr %literal, align 4 - %0 = getelementptr inbounds %Test, ptr %literal, i32 0, i32 0 - %1 = load i32, ptr %0, align 4 - call void @blorg(i32 %1) - store i32 0, ptr %literal1, align 4 - %2 = getelementptr inbounds %Test, ptr %literal1, i32 0, i32 0 - %3 = load i32, ptr %2, align 4 - ret i32 %3 -} diff --git a/test/test_suite2/abi/literal_load_aarch64.c3t b/test/test_suite2/abi/literal_load_aarch64.c3t deleted file mode 100644 index dde880cfa..000000000 --- a/test/test_suite2/abi/literal_load_aarch64.c3t +++ /dev/null @@ -1,36 +0,0 @@ -// #target: linux-aarch64 -module literal_load; - -struct Test -{ - int x; -} - -Test foo = {}; - -extern fn void blorg(Test t); - -fn Test creator() -{ - blorg(Test{}); - return Test{}; -} - -/* #expect: literal_load.ll - -declare void @blorg(i64) #0 - -define i32 @literal_load_creator() #0 { -entry: - %literal = alloca %Test, align 4 - %literal1 = alloca %Test, align 4 - store i32 0, ptr %literal, align 4 - %0 = getelementptr inbounds %Test, ptr %literal, i32 0, i32 0 - %1 = load i32, ptr %0, align 4 - %2 = zext i32 %1 to i64 - call void @blorg(i64 %2) - store i32 0, ptr %literal1, align 4 - %3 = getelementptr inbounds %Test, ptr %literal1, i32 0, i32 0 - %4 = load i32, ptr %3, align 4 - ret i32 %4 -} \ No newline at end of file diff --git a/test/test_suite2/abi/literal_load_mingw.c3t b/test/test_suite2/abi/literal_load_mingw.c3t deleted file mode 100644 index 430a9da08..000000000 --- a/test/test_suite2/abi/literal_load_mingw.c3t +++ /dev/null @@ -1,33 +0,0 @@ -// #target: mingw-x64 -module literal_load; - -struct Test -{ - int x; -} - -Test foo = {}; - -extern fn void blorg(Test t); - -fn Test creator() -{ - blorg(Test{}); - return Test{}; -} - -/* #expect: literal_load.ll - -define i32 @literal_load_creator() #0 { -entry: - %literal = alloca %Test, align 4 - %literal1 = alloca %Test, align 4 - store i32 0, ptr %literal, align 4 - %0 = getelementptr inbounds %Test, ptr %literal, i32 0, i32 0 - %1 = load i32, ptr %0, align 4 - call void @blorg(i32 %1) - store i32 0, ptr %literal1, align 4 - %2 = getelementptr inbounds %Test, ptr %literal1, i32 0, i32 0 - %3 = load i32, ptr %2, align 4 - ret i32 %3 -} diff --git a/test/test_suite2/abi/pass_large_aarch.c3t b/test/test_suite2/abi/pass_large_aarch.c3t deleted file mode 100644 index ad4f36305..000000000 --- a/test/test_suite2/abi/pass_large_aarch.c3t +++ /dev/null @@ -1,32 +0,0 @@ -// #target: linux-aarch64 - -module pass_large; - - -struct Large -{ - void*[8] pointers; -} - -extern fn void pass_large(Large large); - -fn void example() -{ - Large l = {}; - pass_large(l); - pass_large(l); -} - -/* #expect: pass_large.ll - -define void @pass_large_example() -entry: - %l = alloca %Large, align 8 - %indirectarg = alloca %Large, align 8 - %indirectarg1 = alloca %Large, align 8 - call void @llvm.memset.p0.i64(ptr align 8 %l, i8 0, i64 64, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 8 %l, i32 64, i1 false) - call void @pass_large(ptr align 8 %indirectarg) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg1, ptr align 8 %l, i32 64, i1 false) - call void @pass_large(ptr align 8 %indirectarg1) - ret void diff --git a/test/test_suite2/abi/regcall_expand.c3t b/test/test_suite2/abi/regcall_expand.c3t deleted file mode 100644 index d250c8c77..000000000 --- a/test/test_suite2/abi/regcall_expand.c3t +++ /dev/null @@ -1,57 +0,0 @@ -// #target: mingw-x64 -module test; - -extern fn void printf(char*, ...); - -struct Foo -{ - float[2] x; -} -fn void test(Foo x) @regcall -{ -} - -fn int main() -{ - test(Foo { }); - return 0; -} - -/* #expect: test.ll - -%Foo = type { [2 x float] } - -$"ct$test_Foo" = comdat any - -@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 - -declare void @printf(ptr, ...) #0 - -define x86_regcallcc void @test_test(float %0, float %1) #0 { -entry: - %x = alloca %Foo, align 4 - %2 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %3 = getelementptr inbounds [2 x float], ptr %2, i64 0, i64 0 - store float %0, ptr %3, align 4 - %4 = getelementptr inbounds [2 x float], ptr %2, i64 0, i64 1 - store float %1, ptr %4, align 4 - ret void -} - -; Function Attrs: nounwind -define i32 @main() #0 { -entry: - %literal = alloca %Foo, align 4 - %0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 - %1 = getelementptr inbounds [2 x float], ptr %0, i64 0, i64 0 - store float 0.000000e+00, ptr %1, align 4 - %2 = getelementptr inbounds [2 x float], ptr %0, i64 0, i64 1 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 - %4 = getelementptr inbounds [2 x float], ptr %3, i64 0, i64 0 - %loadexpanded = load float, ptr %4, align 4 - %5 = getelementptr inbounds [2 x float], ptr %3, i64 0, i64 1 - %loadexpanded1 = load float, ptr %5, align 4 - call x86_regcallcc void @test_test(float %loadexpanded, float %loadexpanded1) - ret i32 0 -} \ No newline at end of file diff --git a/test/test_suite2/abi/riscv64-lp64-abi.c3t b/test/test_suite2/abi/riscv64-lp64-abi.c3t deleted file mode 100644 index 70eab8d76..000000000 --- a/test/test_suite2/abi/riscv64-lp64-abi.c3t +++ /dev/null @@ -1,47 +0,0 @@ -// #target: linux-riscv64 -module test; - -struct Large { - long a, b, c, d; -} - -define V32i8 = char[<32>]; - -fn int f_scalar_stack_1(int a, int128 b, float c, float128 d, V32i8 e, - char f, char g, char h) { - return g + h; -} - -fn Large f_scalar_stack_2(double a, int128 b, float128 c, V32i8 d, - char e, ichar f, char g) { - return Large {(long)(a), e, f, g}; -} - -/* #expect: test.ll - -define signext i32 @test_f_scalar_stack_1(i32 signext %0, i128 %1, float %2, fp128 %3, ptr align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { -entry: - %uisiext = zext i8 %6 to i32 - %uisiext1 = zext i8 %7 to i32 - %add = add i32 %uisiext, %uisiext1 - ret i32 %add -} - -define void @test_f_scalar_stack_2(ptr noalias sret(%Large) align 8 %0, double %1, i128 %2, fp128 %3, ptr align 32 %4, i8 zeroext %5, i8 %6, i8 %7) #0 { -entry: - %literal = alloca %Large, align 8 - %8 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 0 - %fpsi = fptosi double %1 to i64 - store i64 %fpsi, ptr %8, align 8 - %9 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 1 - %uisiext = zext i8 %5 to i64 - store i64 %uisiext, ptr %9, align 8 - %10 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 2 - %sisiext = sext i8 %6 to i64 - store i64 %sisiext, ptr %10, align 8 - %11 = getelementptr inbounds %Large, ptr %literal, i32 0, i32 3 - %uisiext1 = zext i8 %7 to i64 - store i64 %uisiext1, ptr %11, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal, i32 32, i1 false) - ret void -} diff --git a/test/test_suite2/abi/small_struct_x64.c3t b/test/test_suite2/abi/small_struct_x64.c3t deleted file mode 100644 index bf7f52e1a..000000000 --- a/test/test_suite2/abi/small_struct_x64.c3t +++ /dev/null @@ -1,79 +0,0 @@ -// #target: macos-x64 -module test; -struct Foo -{ - char a; - char b; - char c; -} - -fn int testing() -{ - Foo y = getFoo(Foo { 4, 5, 6 }); - return y.a + y.c; -} - -fn Foo getFoo(Foo f) -{ - return Foo { 1, 2, 3 }; -} - -/* #expect: test.ll - -%.introspect = type { i8, i64, i64, i64, [0 x i64] } -%Foo = type { i8, i8, i8 } - -@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 3, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 - -; Function Attrs: nounwind -define i32 @test_testing() #0 { -entry: - %y = alloca %Foo, align 1 - %literal = alloca %Foo, align 1 - %tempcoerce = alloca i24, align 4 - %result = alloca %Foo, align 1 - %tempcoerce1 = alloca i24, align 4 - %0 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 - store i8 4, ptr %0, align 1 - %1 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 - store i8 5, ptr %1, align 1 - %2 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 2 - store i8 6, ptr %2, align 1 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %tempcoerce, ptr align 1 %literal, i32 3, i1 false) - %3 = load i24, ptr %tempcoerce, align 4 - %4 = call i24 @test_getFoo(i24 %3) - store i24 %4, ptr %tempcoerce1, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 1 %result, ptr align 4 %tempcoerce1, i32 3, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 1 %y, ptr align 1 %result, i32 3, i1 false) - %5 = getelementptr inbounds %Foo, ptr %y, i32 0, i32 0 - %6 = load i8, ptr %5, align 1 - %uisiext = zext i8 %6 to i32 - %7 = getelementptr inbounds %Foo, ptr %y, i32 0, i32 2 - %8 = load i8, ptr %7, align 1 - %uisiext2 = zext i8 %8 to i32 - %add = add i32 %uisiext, %uisiext2 - ret i32 %add -} - -; Function Attrs: nounwind -define i24 @test_getFoo(i24 %0) #0 { -entry: - %f = alloca %Foo, align 1 - %tempcoerce = alloca i24, align 4 - %literal = alloca %Foo, align 1 - %tempcoerce1 = alloca i24, align 4 - store i24 %0, ptr %tempcoerce, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 1 %f, ptr align 4 %tempcoerce, i32 3, i1 false) - %1 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 - store i8 1, ptr %1, align 1 - %2 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 - store i8 2, ptr %2, align 1 - %3 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 2 - store i8 3, ptr %3, align 1 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %tempcoerce1, ptr align 1 %literal, i32 3, i1 false) - %4 = load i24, ptr %tempcoerce1, align 4 - ret i24 %4 -} - -declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg) #1 - diff --git a/test/test_suite2/abi/sysv_direct_coerce.c3t b/test/test_suite2/abi/sysv_direct_coerce.c3t deleted file mode 100644 index 05dbffc86..000000000 --- a/test/test_suite2/abi/sysv_direct_coerce.c3t +++ /dev/null @@ -1,43 +0,0 @@ -// #target: macos-x64 -module foo; - -struct Rectangle -{ - float x; // Rectangle top-left corner position x - float y; // Rectangle top-left corner position y - float width; // Rectangle width - float height; // Rectangle height -} - -fn void test(Rectangle r) -{ - test(Rectangle { 1, 2, 3, 4 }); -} - -/* #expect: foo.ll - -define void @foo_test(<2 x float> %0, <2 x float> %1) #0 { -entry: - %r = alloca %Rectangle, align 4 - %literal = alloca %Rectangle, align 4 - %coerce = alloca %Rectangle, align 8 - %2 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %r, i32 0, i32 0 - store <2 x float> %0, ptr %2, align 4 - %3 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %r, i32 0, i32 1 - store <2 x float> %1, ptr %3, align 4 - %4 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 0 - store float 1.000000e+00, ptr %4, align 4 - %5 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 1 - store float 2.000000e+00, ptr %5, align 4 - %6 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 2 - store float 3.000000e+00, ptr %6, align 4 - %7 = getelementptr inbounds %Rectangle, ptr %literal, i32 0, i32 3 - store float 4.000000e+00, ptr %7, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %coerce, ptr align 4 %literal, i32 16, i1 false) - %8 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %coerce, i32 0, i32 0 - %lo = load <2 x float>, ptr %8, align 8 - %9 = getelementptr inbounds { <2 x float>, <2 x float> }, ptr %coerce, i32 0, i32 1 - %hi = load <2 x float>, ptr %9, align 8 - call void @foo_test(<2 x float> %lo, <2 x float> %hi) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/abi/test_sret.c3t b/test/test_suite2/abi/test_sret.c3t deleted file mode 100644 index 39eb03e04..000000000 --- a/test/test_suite2/abi/test_sret.c3t +++ /dev/null @@ -1,32 +0,0 @@ -// #target: macos-x64 - -struct Abc { - long a; - long b; - long c; - long d; - long e; -} - -extern fn Abc foo1(); -extern fn Abc foo2(); - -fn void bar() { - Abc dummy1 = foo1(); - Abc dummy2 = foo2(); -} - -/* #expect: test_sret.ll - -declare void @foo1(ptr noalias sret(%Abc) align 8) #0 - -declare void @foo2(ptr noalias sret(%Abc) align 8) #0 - -define void @test_sret_bar() #0 { -entry: - %dummy1 = alloca %Abc, align 8 - %dummy2 = alloca %Abc, align 8 - call void @foo1(ptr sret(%Abc) align 8 %dummy1) - call void @foo2(ptr sret(%Abc) align 8 %dummy2) - ret void -} diff --git a/test/test_suite2/abi/union_x64.c3t b/test/test_suite2/abi/union_x64.c3t deleted file mode 100644 index daf3b8dd5..000000000 --- a/test/test_suite2/abi/union_x64.c3t +++ /dev/null @@ -1,37 +0,0 @@ -// #target: macos-x64 - -module unionx64; - -union Foo -{ - long a; - char[12] b; -} -extern fn void hello2(Foo f); - -fn void hello(Foo f) -{ - hello2(f); -} - -/* #expect: unionx64.ll - -%Foo = type { i64, [8 x i8] } - -declare void @hello2(i64, i64) #0 - -define void @unionx64_hello(i64 %0, i64 %1) #0 { -entry: - %f = alloca %Foo, align 8 - %2 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - %4 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 0 - %lo = load i64, ptr %4, align 8 - %5 = getelementptr inbounds { i64, i64 }, ptr %f, i32 0, i32 1 - %hi = load i64, ptr %5, align 8 - call void @hello2(i64 %lo, i64 %hi) - ret void -} - diff --git a/test/test_suite2/abi/vec2_aarch64.c3t b/test/test_suite2/abi/vec2_aarch64.c3t deleted file mode 100644 index df230db68..000000000 --- a/test/test_suite2/abi/vec2_aarch64.c3t +++ /dev/null @@ -1,95 +0,0 @@ -// #target: linux-aarch64 -module abi; - -struct Vector2 { - float x; - float y; -} -extern fn Vector2 vector2_zero() { return Vector2 {}; } -extern fn Vector2 vector2_one() { return Vector2 {}; } -extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } -extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } -extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } -extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } - -/* #expect: abi.ll - -%Vector2 = type { float, float } - -define %Vector2 @vector2_zero() #0 { -entry: - %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %0, align 4 - %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %1, align 4 - %2 = load %Vector2, ptr %literal, align 4 - ret %Vector2 %2 -} - -define %Vector2 @vector2_one() #0 { -entry: - %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %0, align 4 - %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %1, align 4 - %2 = load %Vector2, ptr %literal, align 4 - ret %Vector2 %2 -} - -define %Vector2 @vector2_add([2 x float] %0, [2 x float] %1) #0 { -entry: - %v1 = alloca %Vector2, align 4 - %v2 = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store [2 x float] %0, ptr %v1, align 4 - store [2 x float] %1, ptr %v2, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load %Vector2, ptr %literal, align 4 - ret %Vector2 %4 -} - -define %Vector2 @vector2_add_value([2 x float] %0, float %1) #0 { -entry: - %v = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store [2 x float] %0, ptr %v, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load %Vector2, ptr %literal, align 4 - ret %Vector2 %4 -} - -define %Vector2 @vector2_subtract([2 x float] %0, [2 x float] %1) #0 { -entry: - %v1 = alloca %Vector2, align 4 - %v2 = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store [2 x float] %0, ptr %v1, align 4 - store [2 x float] %1, ptr %v2, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load %Vector2, ptr %literal, align 4 - ret %Vector2 %4 -} - -define %Vector2 @vector2_subtract_value([2 x float] %0, float %1) #0 { -entry: - %v = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store [2 x float] %0, ptr %v, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load %Vector2, ptr %literal, align 4 - ret %Vector2 %4 -} diff --git a/test/test_suite2/abi/vec2_wasm.c3t b/test/test_suite2/abi/vec2_wasm.c3t deleted file mode 100644 index 783bd350b..000000000 --- a/test/test_suite2/abi/vec2_wasm.c3t +++ /dev/null @@ -1,87 +0,0 @@ -// #target: wasm32 -module abi; - -struct Vector2 { - float x; - float y; -} -extern fn Vector2 vector2_zero() { return Vector2 {}; } -extern fn Vector2 vector2_one() { return Vector2 {}; } -extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } -extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } -extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } -extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } - -/* #expect: abi.ll - -target triple = "wasm32-unknown-unknown" - -%Vector2 = type { float, float } - -define void @vector2_zero(ptr noalias sret(%Vector2) align 4 %0) #0 { -entry: - %literal = alloca %Vector2, align 4 - %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %1, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %2, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) - ret void -} - -define void @vector2_one(ptr noalias sret(%Vector2) align 4 %0) #0 { -entry: - %literal = alloca %Vector2, align 4 - %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %1, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %2, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) - ret void -} - -define void @vector2_add(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, ptr byval(%Vector2) align 4 %2) #0 { -entry: - %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %3, align 4 - %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %4, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) - ret void -} - -define void @vector2_add_value(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, float %2) #0 { -entry: - %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %3, align 4 - %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %4, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) - ret void -} - -define void @vector2_subtract(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, ptr byval(%Vector2) align 4 %2) #0 { -entry: - %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %3, align 4 - %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %4, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) - ret void -} - -; Function Attrs: nounwind -define void @vector2_subtract_value(ptr noalias sret(%Vector2) align 4 %0, ptr byval(%Vector2) align 4 %1, float %2) #0 { -entry: - %literal = alloca %Vector2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %3, align 4 - %4 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %4, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 8, i1 false) - ret void -} - diff --git a/test/test_suite2/abi/vec2_x64.c3t b/test/test_suite2/abi/vec2_x64.c3t deleted file mode 100644 index 00c2e1129..000000000 --- a/test/test_suite2/abi/vec2_x64.c3t +++ /dev/null @@ -1,95 +0,0 @@ -// #target: macos-x64 -module abi; - -struct Vector2 { - float x; - float y; -} -extern fn Vector2 vector2_zero() { return Vector2 {}; } -extern fn Vector2 vector2_one() { return Vector2 {}; } -extern fn Vector2 vector2_add(Vector2 v1, Vector2 v2) { return Vector2 {}; } -extern fn Vector2 vector2_add_value(Vector2 v, float add) { return Vector2 {}; } -extern fn Vector2 vector2_subtract(Vector2 v1, Vector2 v2) { return Vector2 {}; } -extern fn Vector2 vector2_subtract_value(Vector2 v, float sub) { return Vector2 {}; } - -/* #expect: abi.ll - -%Vector2 = type { float, float } - -define <2 x float> @vector2_zero() #0 { -entry: - %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %0, align 4 - %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %1, align 4 - %2 = load <2 x float>, ptr %literal, align 4 - ret <2 x float> %2 -} - -define <2 x float> @vector2_one() #0 { -entry: - %literal = alloca %Vector2, align 4 - %0 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %0, align 4 - %1 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %1, align 4 - %2 = load <2 x float>, ptr %literal, align 4 - ret <2 x float> %2 -} - -define <2 x float> @vector2_add(<2 x float> %0, <2 x float> %1) #0 { -entry: - %v1 = alloca %Vector2, align 4 - %v2 = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store <2 x float> %0, ptr %v1, align 4 - store <2 x float> %1, ptr %v2, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load <2 x float>, ptr %literal, align 4 - ret <2 x float> %4 -} - -define <2 x float> @vector2_add_value(<2 x float> %0, float %1) #0 { -entry: - %v = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store <2 x float> %0, ptr %v, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load <2 x float>, ptr %literal, align 4 - ret <2 x float> %4 -} - -define <2 x float> @vector2_subtract(<2 x float> %0, <2 x float> %1) #0 { -entry: - %v1 = alloca %Vector2, align 4 - %v2 = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store <2 x float> %0, ptr %v1, align 4 - store <2 x float> %1, ptr %v2, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load <2 x float>, ptr %literal, align 4 - ret <2 x float> %4 -} - -define <2 x float> @vector2_subtract_value(<2 x float> %0, float %1) #0 { -entry: - %v = alloca %Vector2, align 4 - %literal = alloca %Vector2, align 4 - store <2 x float> %0, ptr %v, align 4 - %2 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Vector2, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %3, align 4 - %4 = load <2 x float>, ptr %literal, align 4 - ret <2 x float> %4 -} diff --git a/test/test_suite2/abi/x64alignarray.c3t b/test/test_suite2/abi/x64alignarray.c3t deleted file mode 100644 index 8c4ee8a6b..000000000 --- a/test/test_suite2/abi/x64alignarray.c3t +++ /dev/null @@ -1,27 +0,0 @@ -// #target: macos-x64 -module test; - -extern fn void test1_f(void *); - -fn void test1_g() -{ - float[4] x; - test1_f(&x); -} - -/* #expect: test.ll - -define void @test_test1_g() #0 { -entry: - %x = alloca [4 x float], align 16 - %0 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 0 - store float 0.000000e+00, ptr %0, align 4 - %1 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 1 - store float 0.000000e+00, ptr %1, align 4 - %2 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 2 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds [4 x float], ptr %x, i64 0, i64 3 - store float 0.000000e+00, ptr %3, align 4 - call void @test1_f(ptr %x) - ret void -} diff --git a/test/test_suite2/arrays/array_casts.c3t b/test/test_suite2/arrays/array_casts.c3t deleted file mode 100644 index e2b7065c3..000000000 --- a/test/test_suite2/arrays/array_casts.c3t +++ /dev/null @@ -1,32 +0,0 @@ -// #target: macos-x64 - -module array_casts; - -fn void test() -{ - int[3] x; - int *y = &x; - int[] z = &x; -} - -/* #expect: array_casts.ll - -%"int[]" = type { ptr, i64 } - -define void @array_casts_test() #0 { -entry: - %x = alloca [3 x i32], align 4 - %y = alloca ptr, align 8 - %z = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 - store i32 0, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 - store i32 0, ptr %2, align 4 - store ptr %x, ptr %y, align 8 - %3 = insertvalue %"int[]" undef, ptr %x, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, ptr %z, align 8 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/arrays/global_init.c3t b/test/test_suite2/arrays/global_init.c3t deleted file mode 100644 index 88698f917..000000000 --- a/test/test_suite2/arrays/global_init.c3t +++ /dev/null @@ -1,62 +0,0 @@ -// #target: macos-x64 -module test; - -int* foo = &&3; - -int a; -int c; -int d; -int[3] abc; -int *b = (&((&a + 1)[2]) + 1 - 2) + 5; -int *bf = &abc[2] + 2; -int *bf2 = &abc[2]; -int *bf3 = &abc[2] + 2; - -fn void main() { - int *bf34 = (&abc[2] + 2) + 3; - static variant[3] x = { &&42, &&'c', &&"for" }; - variant[3] y = { &&42, &&'c', &&"for" }; -} - -/* #expect: test.ll - -@.taddr = private global i32 3, align 4 -@test_foo = local_unnamed_addr global ptr @.taddr, align 8 -@test_a = global i32 0, align 4 -@test_c = local_unnamed_addr global i32 0, align 4 -@test_d = local_unnamed_addr global i32 0, align 4 -@test_abc = local_unnamed_addr global [3 x i32] zeroinitializer, align 4 -@test_b = local_unnamed_addr global ptr getelementptr (i32, ptr @test_a, i64 7), align 8 -@test_bf = local_unnamed_addr global ptr getelementptr ([3 x i32], ptr @test_abc, i64 1, i64 1), align 8 -@test_bf2 = local_unnamed_addr global ptr getelementptr inbounds ([3 x i32], ptr @test_abc, i64 0, i64 2), align 8 -@test_bf3 = local_unnamed_addr global ptr getelementptr ([3 x i32], ptr @test_abc, i64 1, i64 1), align 8 -@.taddr.9 = private global i32 42, align 4 -@.taddr.10 = private global i8 99, align 1 -@.taddr.11 = private global ptr @.str, align 8 -@"main$x" = internal unnamed_addr global [3 x %variant] [%variant { ptr @.taddr.9, i64 ptrtoint (ptr @"ct$int" to i64) }, %variant { ptr @.taddr.10, i64 ptrtoint (ptr @"ct$char" to i64) }, %variant { ptr @.taddr.11, i64 ptrtoint (ptr @"ct$p$a3$char" to i64) }], align 16 - -define void @test_main() #0 { -entry: - %bf34 = alloca ptr, align 8 - %y = alloca [3 x %variant], align 16 - %taddr = alloca i32, align 4 - %taddr1 = alloca i8, align 1 - %taddr2 = alloca ptr, align 8 - store ptr getelementptr ([3 x i32], ptr @test_abc, i64 2, i64 1), ptr %bf34, align 8 - %0 = getelementptr inbounds [3 x %variant], ptr %y, i64 0, i64 0 - store i32 42, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %2, ptr %0, align 16 - %3 = getelementptr inbounds [3 x %variant], ptr %y, i64 0, i64 1 - store i8 99, ptr %taddr1, align 1 - %4 = insertvalue %variant undef, ptr %taddr1, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$char" to i64), 1 - store %variant %5, ptr %3, align 16 - %6 = getelementptr inbounds [3 x %variant], ptr %y, i64 0, i64 2 - store ptr @.str.12, ptr %taddr2, align 8 - %7 = insertvalue %variant undef, ptr %taddr2, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - store %variant %8, ptr %6, align 16 - ret void -} diff --git a/test/test_suite2/arrays/index_from_back.c3t b/test/test_suite2/arrays/index_from_back.c3t deleted file mode 100644 index 32a1f13c3..000000000 --- a/test/test_suite2/arrays/index_from_back.c3t +++ /dev/null @@ -1,53 +0,0 @@ -// #target: macos-x64 - -module test; - -fn void test(int[10] x, int[<10>] y) -{ - int a = x[4]; - int b = x[^2]; - int c = y[4]; - int d = y[^2]; - int j = 3; - int e = y[^j]; - int f = x[^j]; -} - -/* #expect: test.ll - -define void @test_test(ptr byval([10 x i32]) align 8 %0, ptr byval(<10 x i32>) align 64 %1) #0 { -entry: - %a = alloca i32, align 4 - %b = alloca i32, align 4 - %c = alloca i32, align 4 - %d = alloca i32, align 4 - %j = alloca i32, align 4 - %e = alloca i32, align 4 - %f = alloca i32, align 4 - %2 = getelementptr inbounds [10 x i32], ptr %0, i64 0, i64 4 - %3 = load i32, ptr %2, align 4 - store i32 %3, ptr %a, align 4 - %4 = getelementptr inbounds [10 x i32], ptr %0, i64 0, i64 8 - %5 = load i32, ptr %4, align 4 - store i32 %5, ptr %b, align 4 - %6 = load <10 x i32>, ptr %1, align 64 - %7 = extractelement <10 x i32> %6, i64 4 - store i32 %7, ptr %c, align 4 - %8 = load <10 x i32>, ptr %1, align 64 - %9 = extractelement <10 x i32> %8, i64 8 - store i32 %9, ptr %d, align 4 - store i32 3, ptr %j, align 4 - %10 = load <10 x i32>, ptr %1, align 64 - %11 = load i32, ptr %j, align 4 - %sisiext = sext i32 %11 to i64 - %12 = sub nuw i64 10, %sisiext - %13 = extractelement <10 x i32> %10, i64 %12 - store i32 %13, ptr %e, align 4 - %14 = load i32, ptr %j, align 4 - %sisiext1 = sext i32 %14 to i64 - %15 = sub nuw i64 10, %sisiext1 - %16 = getelementptr inbounds [10 x i32], ptr %0, i64 0, i64 %15 - %17 = load i32, ptr %16, align 4 - store i32 %17, ptr %f, align 4 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/asm/asm_regression.c3t b/test/test_suite2/asm/asm_regression.c3t deleted file mode 100644 index 5064780d7..000000000 --- a/test/test_suite2/asm/asm_regression.c3t +++ /dev/null @@ -1,50 +0,0 @@ -// #target: macos-x64 - -module test; -import std::io; -fn void main() -{ - int x = 222; - int y = 223; - long z = 0; - z = x + y; - z *= x; - int g = 0; - int* gp = &g; - int[4] a = { 3, 4, 5, 6 }; - int* xa = &a; - usz asf = 1; - int aa = 3; - asm - { - - movl x, 4; - movl [gp], x; - movl x, 1; - movl [xa + asf * 4 + 4], x; - movl $eax, (23 + x); - movl x, $eax; - movq [&z], 33; - addl aa, 22; - } - io::printfln("aa: %d", aa); - io::printfln("Z: %d", z); - io::printfln("x: %d", x); - io::printfln("G was: %d", g); - foreach(int abc : a) io::printfln("%d", abc); - -} - -/* #expect: test.ll - - %4 = load ptr, ptr %gp, align 8 - %5 = load ptr, ptr %xa, align 8 - %6 = load i64, ptr %asf, align 8 - %7 = load i32, ptr %x, align 4 - %add3 = add i32 23, %7 - %8 = load i32, ptr %aa, align 4 - %9 = call { i32, i32 } asm alignstack "movl $$4, $0\0Amovl $0, ($3)\0Amovl $$1, $0\0Amovl $0, 4($4,$5,4)\0Amovl $6, %eax\0Amovl %eax, $0\0Amovq $$33, $1\0Aaddl $$22, $2\0A", "=&r,=*&m,=r,r,r,r,r,2,~{cc},~{rax},~{flags},~{dirflag},~{fspr}"(ptr elementtype(i64) %z, ptr %4, ptr %5, i64 %6, i32 %add3, i32 %8) - %10 = extractvalue { i32, i32 } %9, 0 - store i32 %10, ptr %x, align 4 - %11 = extractvalue { i32, i32 } %9, 1 - store i32 %11, ptr %aa, align 4 \ No newline at end of file diff --git a/test/test_suite2/assignment/int_assign.c3t b/test/test_suite2/assignment/int_assign.c3t deleted file mode 100644 index f6663027d..000000000 --- a/test/test_suite2/assignment/int_assign.c3t +++ /dev/null @@ -1,69 +0,0 @@ -module test; - -fn int foo() -{ - int x = 0; - int y; - x += y; - x -= y; - x %= y; - x /= y; - x *= y; - x <<= y; - x >>= y; - x ^= y; - x |= y; - x &= y; - return x; -} - - -// #expect: test.ll - - %x = alloca i32, align 4 - %y = alloca i32, align 4 - store i32 0, ptr %x, align 4 - store i32 0, ptr %y, align 4 - %0 = load i32, ptr %x, align 4 - %1 = load i32, ptr %y, align 4 - %add = add i32 %0, %1 - store i32 %add, ptr %x, align 4 - %2 = load i32, ptr %x, align 4 - %3 = load i32, ptr %y, align 4 - %sub = sub i32 %2, %3 - store i32 %sub, ptr %x, align 4 - %4 = load i32, ptr %x, align 4 - %5 = load i32, ptr %y, align 4 - %smod = srem i32 %4, %5 - store i32 %smod, ptr %x, align 4 - %6 = load i32, ptr %x, align 4 - %7 = load i32, ptr %y, align 4 - %sdiv = sdiv i32 %6, %7 - store i32 %sdiv, ptr %x, align 4 - %8 = load i32, ptr %x, align 4 - %9 = load i32, ptr %y, align 4 - %mul = mul i32 %8, %9 - store i32 %mul, ptr %x, align 4 - %10 = load i32, ptr %x, align 4 - %11 = load i32, ptr %y, align 4 - %shl = shl i32 %10, %11 - %12 = freeze i32 %shl - store i32 %12, ptr %x, align 4 - %13 = load i32, ptr %x, align 4 - %14 = load i32, ptr %y, align 4 - %ashr = ashr i32 %13, %14 - %15 = freeze i32 %ashr - store i32 %15, ptr %x, align 4 - %16 = load i32, ptr %x, align 4 - %17 = load i32, ptr %y, align 4 - %xor = xor i32 %16, %17 - store i32 %xor, ptr %x, align 4 - %18 = load i32, ptr %x, align 4 - %19 = load i32, ptr %y, align 4 - %or = or i32 %18, %19 - store i32 %or, ptr %x, align 4 - %20 = load i32, ptr %x, align 4 - %21 = load i32, ptr %y, align 4 - %and = and i32 %20, %21 - store i32 %and, ptr %x, align 4 - %22 = load i32, ptr %x, align 4 diff --git a/test/test_suite2/bitstruct/bitstruct_arrays_be.c3t b/test/test_suite2/bitstruct/bitstruct_arrays_be.c3t deleted file mode 100644 index d2325338b..000000000 --- a/test/test_suite2/bitstruct/bitstruct_arrays_be.c3t +++ /dev/null @@ -1,144 +0,0 @@ -// #target: macos-x64 -module foo; - -module foo; - -bitstruct BitField3 : char[4] @bigendian -{ - uint c : 4..19; -} - -bitstruct BitField4 : char[4] -{ - uint c : 4..19; -} - -extern fn void printf(char*, ...); - -fn void main() -{ - test3(); -} -fn void test3() -{ - //BitField3 xx = { 0xdeadbeef }; - BitField3 xx = { 0xbeaf }; - printf("%x = beaf\n", xx.c); - BitField4 xy = { 0xbeaf }; - void *abc = &xy; - char[4]* z = abc; - printf("%x = beaf\n", xy.c); - xy.c = 0xbeef; - printf("%x = beef\n", xy.c); - xx.c = 0xbeef; - printf("%x = beef\n", xx.c); -} - - -/* #expect: foo.ll - -define void @foo_test3() #0 { -entry: - %xx = alloca [4 x i8], align 1 - %xy = alloca [4 x i8], align 1 - %abc = alloca ptr, align 8 - %z = alloca ptr, align 8 - store [4 x i8] c"\E0\FB\0A\00", ptr %xx, align 1 - %0 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 0 - %1 = load i8, ptr %0, align 1 - %zext = zext i8 %1 to i32 - %lshrl = lshr i32 %zext, 4 - %2 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 1 - %3 = load i8, ptr %2, align 1 - %zext1 = zext i8 %3 to i32 - %shl = shl i32 %zext1, 4 - %4 = or i32 %shl, %lshrl - %5 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 2 - %6 = load i8, ptr %5, align 1 - %zext2 = zext i8 %6 to i32 - %shl3 = shl i32 %zext2, 12 - %7 = or i32 %shl3, %4 - %shl4 = shl i32 %7, 16 - %8 = call i32 @llvm.bswap.i32(i32 %shl4) - %9 = and i32 65535, %8 - call void (ptr, ...) @printf(ptr @.str, i32 %9) - store [4 x i8] c"\F0\EA\0B\00", ptr %xy, align 1 - store ptr %xy, ptr %abc, align 8 - %10 = load ptr, ptr %abc, align 8 - store ptr %10, ptr %z, align 8 - %11 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 0 - %12 = load i8, ptr %11, align 1 - %zext5 = zext i8 %12 to i32 - %lshrl6 = lshr i32 %zext5, 4 - %13 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 1 - %14 = load i8, ptr %13, align 1 - %zext7 = zext i8 %14 to i32 - %shl8 = shl i32 %zext7, 4 - %15 = or i32 %shl8, %lshrl6 - %16 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 2 - %17 = load i8, ptr %16, align 1 - %zext9 = zext i8 %17 to i32 - %shl10 = shl i32 %zext9, 12 - %18 = or i32 %shl10, %15 - %19 = and i32 65535, %18 - call void (ptr, ...) @printf(ptr @.str.1, i32 %19) - %20 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 0 - %21 = load i8, ptr %20, align 1 - %22 = and i8 %21, 15 - %23 = or i8 %22, -16 - store i8 %23, ptr %20, align 1 - %24 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 1 - store i8 -18, ptr %24, align 1 - %25 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 2 - %26 = load i8, ptr %25, align 1 - %27 = and i8 %26, -16 - %28 = or i8 %27, 11 - store i8 %27, ptr %25, align 1 - %29 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 0 - %30 = load i8, ptr %29, align 1 - %zext11 = zext i8 %30 to i32 - %lshrl12 = lshr i32 %zext11, 4 - %31 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 1 - %32 = load i8, ptr %31, align 1 - %zext13 = zext i8 %32 to i32 - %shl14 = shl i32 %zext13, 4 - %33 = or i32 %shl14, %lshrl12 - %34 = getelementptr inbounds [4 x i8], ptr %xy, i64 0, i64 2 - %35 = load i8, ptr %34, align 1 - %zext15 = zext i8 %35 to i32 - %shl16 = shl i32 %zext15, 12 - %36 = or i32 %shl16, %33 - %37 = and i32 65535, %36 - call void (ptr, ...) @printf(ptr @.str.2, i32 %37) - %38 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 0 - %39 = load i8, ptr %38, align 1 - %40 = and i8 %39, 15 - %41 = or i8 %40, -32 - store i8 %41, ptr %38, align 1 - %42 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 1 - store i8 -5, ptr %42, align 1 - %43 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 2 - %44 = load i8, ptr %43, align 1 - %45 = and i8 %44, -16 - %46 = or i8 %45, 14 - store i8 %45, ptr %43, align 1 - %47 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 0 - %48 = load i8, ptr %47, align 1 - %zext17 = zext i8 %48 to i32 - %lshrl18 = lshr i32 %zext17, 4 - %49 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 1 - %50 = load i8, ptr %49, align 1 - %zext19 = zext i8 %50 to i32 - %shl20 = shl i32 %zext19, 4 - %51 = or i32 %shl20, %lshrl18 - %52 = getelementptr inbounds [4 x i8], ptr %xx, i64 0, i64 2 - %53 = load i8, ptr %52, align 1 - %zext21 = zext i8 %53 to i32 - %shl22 = shl i32 %zext21, 12 - %54 = or i32 %shl22, %51 - %shl23 = shl i32 %54, 16 - %55 = call i32 @llvm.bswap.i32(i32 %shl23) - %56 = and i32 65535, %55 - call void (ptr, ...) @printf(ptr @.str.3, i32 %56) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitstruct_be.c3t b/test/test_suite2/bitstruct/bitstruct_be.c3t deleted file mode 100644 index 0ae6725a5..000000000 --- a/test/test_suite2/bitstruct/bitstruct_be.c3t +++ /dev/null @@ -1,245 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -bitstruct Test : int @bigendian -{ - ushort a : 0..15; - ushort b : 16..31; -} - -bitstruct Test2 : char[4] @bigendian -{ - ushort a : 0..15; - ushort b : 16..31; -} - -fn void main() -{ - IntBE x; - x.val = 123; - - io::printf("BE 123 => %d (%d)\n", (int)x, x.val); - Test abc = { .a = 0x1234, .b = 0x5678 }; - Test2 abc2 = { .a = 0x1234, .b = 0x5678 }; - char[4]* z = (char[4]*)&abc; - char[4]* z2 = (char[4]*)&abc2; - foreach (d : z2) io::printf(" %x", d); - io::println(""); - foreach (d : z) io::printf(" %x", d); - io::println(""); - io::printfln("abc.a = %x", abc.a); - abc.a = 0x1234; - abc.b = 0x5678; - io::printfln("->abc.a = %x", abc.a); - foreach (d : z) io::printf(" %x", d); - io::println(""); - - IntLE y; - y.val = 123; - io::printf("LE 123 => %d (%d)\n", (int)y, y.val); - -} - -/* #expect: test.ll - - %0 = load i32, ptr %x, align 4 - %1 = call i32 @llvm.bswap.i32(i32 %0) - store i32 2063597568, ptr %x, align 4 - %2 = insertvalue %variant undef, ptr %x, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %4 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %3, ptr %4, align 16 - %5 = load i32, ptr %x, align 4 - %6 = call i32 @llvm.bswap.i32(i32 %5) - store i32 %6, ptr %taddr, align 4 - %7 = insertvalue %variant undef, ptr %taddr, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %9 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %8, ptr %9, align 16 - %10 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %10, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - store i32 873625686, ptr %abc, align 4 - store [4 x i8] c"\124Vx", ptr %abc2, align 1 - store ptr %abc, ptr %z, align 8 - store ptr %abc2, ptr %z2, align 8 - %11 = load ptr, ptr %z2, align 8 - store ptr %11, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %voiderr6, %voiderr - %12 = load i64, ptr %.anon1, align 8 - %gt = icmp ugt i64 4, %12 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %13 = load ptr, ptr %.anon, align 8 - %14 = load i64, ptr %.anon1, align 8 - %15 = getelementptr inbounds [4 x i8], ptr %13, i64 0, i64 %14 - %16 = load i8, ptr %15, align 1 - store i8 %16, ptr %d, align 1 - %17 = insertvalue %variant undef, ptr %d, 0 - %18 = insertvalue %variant %17, i64 ptrtoint (ptr @"ct$char" to i64), 1 - %19 = getelementptr inbounds [1 x %variant], ptr %varargslots3, i64 0, i64 0 - store %variant %18, ptr %19, align 16 - %20 = call i64 @std_io_printf(ptr %retparam2, ptr @.str.1, i64 3, ptr %varargslots3, i64 1) - %not_err4 = icmp eq i64 %20, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %loop.body - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %loop.body - %21 = load i64, ptr %.anon1, align 8 - %add = add i64 %21, 1 - store i64 %add, ptr %.anon1, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %22 = call i32 @std_io_println(ptr @.str.2) #2 - %23 = load ptr, ptr %z, align 8 - store ptr %23, ptr %.anon7, align 8 - store i64 0, ptr %.anon8, align 8 - br label %loop.cond9 - -loop.cond9: ; preds = %voiderr17, %loop.exit - %24 = load i64, ptr %.anon8, align 8 - %gt10 = icmp ugt i64 4, %24 - br i1 %gt10, label %loop.body11, label %loop.exit19 - -loop.body11: ; preds = %loop.cond9 - %25 = load ptr, ptr %.anon7, align 8 - %26 = load i64, ptr %.anon8, align 8 - %27 = getelementptr inbounds [4 x i8], ptr %25, i64 0, i64 %26 - %28 = load i8, ptr %27, align 1 - store i8 %28, ptr %d12, align 1 - %29 = insertvalue %variant undef, ptr %d12, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$char" to i64), 1 - %31 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 - store %variant %30, ptr %31, align 16 - %32 = call i64 @std_io_printf(ptr %retparam13, ptr @.str.3, i64 3, ptr %varargslots14, i64 1) - %not_err15 = icmp eq i64 %32, 0 - br i1 %not_err15, label %after_check16, label %voiderr17 - -after_check16: ; preds = %loop.body11 - br label %voiderr17 - -voiderr17: ; preds = %after_check16, %loop.body11 - %33 = load i64, ptr %.anon8, align 8 - %add18 = add i64 %33, 1 - store i64 %add18, ptr %.anon8, align 8 - br label %loop.cond9 - -loop.exit19: ; preds = %loop.cond9 - %34 = call i32 @std_io_println(ptr @.str.4) #2 - %35 = load i32, ptr %abc, align 4 - %36 = call i32 @llvm.bswap.i32(i32 %35) - %37 = and i32 65535, %36 - %ztrunc = trunc i32 %37 to i16 - store i16 %ztrunc, ptr %taddr22, align 2 - %38 = insertvalue %variant undef, ptr %taddr22, 0 - %39 = insertvalue %variant %38, i64 ptrtoint (ptr @"ct$ushort" to i64), 1 - %40 = getelementptr inbounds [1 x %variant], ptr %varargslots21, i64 0, i64 0 - store %variant %39, ptr %40, align 16 - %41 = call i64 @std_io_printfln(ptr %retparam20, ptr @.str.5, i64 10, ptr %varargslots21, i64 1) - %not_err23 = icmp eq i64 %41, 0 - br i1 %not_err23, label %after_check24, label %voiderr25 - -after_check24: ; preds = %loop.exit19 - br label %voiderr25 - -voiderr25: ; preds = %after_check24, %loop.exit19 - %42 = load i32, ptr %abc, align 4 - %43 = call i32 @llvm.bswap.i32(i32 %42) - %44 = and i32 %43, -65536 - %45 = or i32 %44, 4660 - %46 = call i32 @llvm.bswap.i32(i32 %45) - store i32 %46, ptr %abc, align 4 - %47 = load i32, ptr %abc, align 4 - %48 = call i32 @llvm.bswap.i32(i32 %47) - %49 = and i32 %48, 65535 - %50 = or i32 %49, 1450704896 - %51 = call i32 @llvm.bswap.i32(i32 %50) - store i32 %51, ptr %abc, align 4 - %52 = load i32, ptr %abc, align 4 - %53 = call i32 @llvm.bswap.i32(i32 %52) - %54 = and i32 65535, %53 - %ztrunc28 = trunc i32 %54 to i16 - store i16 %ztrunc28, ptr %taddr29, align 2 - %55 = insertvalue %variant undef, ptr %taddr29, 0 - %56 = insertvalue %variant %55, i64 ptrtoint (ptr @"ct$ushort" to i64), 1 - %57 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0 - store %variant %56, ptr %57, align 16 - %58 = call i64 @std_io_printfln(ptr %retparam26, ptr @.str.6, i64 12, ptr %varargslots27, i64 1) - %not_err30 = icmp eq i64 %58, 0 - br i1 %not_err30, label %after_check31, label %voiderr32 - -after_check31: ; preds = %voiderr25 - br label %voiderr32 - -voiderr32: ; preds = %after_check31, %voiderr25 - %59 = load ptr, ptr %z, align 8 - store ptr %59, ptr %.anon33, align 8 - store i64 0, ptr %.anon34, align 8 - br label %loop.cond35 - -loop.cond35: ; preds = %voiderr43, %voiderr32 - %60 = load i64, ptr %.anon34, align 8 - %gt36 = icmp ugt i64 4, %60 - br i1 %gt36, label %loop.body37, label %loop.exit45 - -loop.body37: ; preds = %loop.cond35 - %61 = load ptr, ptr %.anon33, align 8 - %62 = load i64, ptr %.anon34, align 8 - %63 = getelementptr inbounds [4 x i8], ptr %61, i64 0, i64 %62 - %64 = load i8, ptr %63, align 1 - store i8 %64, ptr %d38, align 1 - %65 = insertvalue %variant undef, ptr %d38, 0 - %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$char" to i64), 1 - %67 = getelementptr inbounds [1 x %variant], ptr %varargslots40, i64 0, i64 0 - store %variant %66, ptr %67, align 16 - %68 = call i64 @std_io_printf(ptr %retparam39, ptr @.str.7, i64 3, ptr %varargslots40, i64 1) - %not_err41 = icmp eq i64 %68, 0 - br i1 %not_err41, label %after_check42, label %voiderr43 - -after_check42: ; preds = %loop.body37 - br label %voiderr43 - -voiderr43: ; preds = %after_check42, %loop.body37 - %69 = load i64, ptr %.anon34, align 8 - %add44 = add i64 %69, 1 - store i64 %add44, ptr %.anon34, align 8 - br label %loop.cond35 - -loop.exit45: ; preds = %loop.cond35 - %70 = call i32 @std_io_println(ptr @.str.8) #2 - store i32 0, ptr %y, align 4 - %71 = load i32, ptr %y, align 4 - store i32 123, ptr %y, align 4 - %72 = insertvalue %variant undef, ptr %y, 0 - %73 = insertvalue %variant %72, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %74 = getelementptr inbounds [2 x %variant], ptr %varargslots47, i64 0, i64 0 - store %variant %73, ptr %74, align 16 - %75 = load i32, ptr %y, align 4 - store i32 %75, ptr %taddr48, align 4 - %76 = insertvalue %variant undef, ptr %taddr48, 0 - %77 = insertvalue %variant %76, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %78 = getelementptr inbounds [2 x %variant], ptr %varargslots47, i64 0, i64 1 - store %variant %77, ptr %78, align 16 - %79 = call i64 @std_io_printf(ptr %retparam46, ptr @.str.9, i64 18, ptr %varargslots47, i64 2) - %not_err49 = icmp eq i64 %79, 0 - br i1 %not_err49, label %after_check50, label %voiderr51 - -after_check50: ; preds = %loop.exit45 - br label %voiderr51 - -voiderr51: ; preds = %after_check50, %loop.exit45 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/bitstruct/bitstruct_initializer.c3t b/test/test_suite2/bitstruct/bitstruct_initializer.c3t deleted file mode 100644 index a031d5c98..000000000 --- a/test/test_suite2/bitstruct/bitstruct_initializer.c3t +++ /dev/null @@ -1,502 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -bitstruct Foo : ulong -{ - uint x : 0..31; - uint y : 32..62; - bool w : 63; -} - -bitstruct Bar : char[8] -{ - uint x : 0..31; - uint y : 32..62; - bool w : 63; -} -struct Abc -{ - int x; - Foo b; -} - -fn void hello(int z) -{ - Foo x; - x = { .x = z, .w = z < 100 }; - Abc y = { .b.x = 32, .b.y = 10 }; - Abc d = { .b = { 23, 11, true } }; - Bar b; - b = { .x = z, .w = z < 100 }; - io::printfln("%s %s %s", x.x, x.y, x.w); - io::printfln("%s %s %s", y.b.x, y.b.y, y.b.w); - io::printfln("%s %s %s", b.x, b.y, b.w); - x = { z + 1, 1, z > 100 }; - y.b = { 33, 11, true }; - b = { z + 1, 1, z > 100 }; - io::printfln("%s %s %s", x.x, x.y, x.w); - io::printfln("%s %s %s", y.b.x, y.b.y, y.b.w); - io::printfln("%s %s %s", b.x, b.y, b.w); - -} - -fn void main() -{ - hello(12); -} - -/* #expect: test.ll - -define void @test_hello(i32 %0) #0 { -entry: - %x = alloca i64, align 8 - %y = alloca %Abc, align 8 - %d = alloca %Abc, align 8 - %b = alloca [8 x i8], align 1 - %retparam = alloca i64, align 8 - %varargslots = alloca [3 x %variant], align 16 - %taddr = alloca i32, align 4 - %taddr13 = alloca i32, align 4 - %taddr16 = alloca i8, align 1 - %retparam17 = alloca i64, align 8 - %varargslots18 = alloca [3 x %variant], align 16 - %taddr20 = alloca i32, align 4 - %taddr23 = alloca i32, align 4 - %taddr26 = alloca i8, align 1 - %retparam30 = alloca i64, align 8 - %varargslots31 = alloca [3 x %variant], align 16 - %taddr39 = alloca i32, align 4 - %taddr47 = alloca i32, align 4 - %taddr49 = alloca i8, align 1 - %retparam67 = alloca i64, align 8 - %varargslots68 = alloca [3 x %variant], align 16 - %taddr70 = alloca i32, align 4 - %taddr73 = alloca i32, align 4 - %taddr76 = alloca i8, align 1 - %retparam80 = alloca i64, align 8 - %varargslots81 = alloca [3 x %variant], align 16 - %taddr83 = alloca i32, align 4 - %taddr86 = alloca i32, align 4 - %taddr89 = alloca i8, align 1 - %retparam93 = alloca i64, align 8 - %varargslots94 = alloca [3 x %variant], align 16 - %taddr102 = alloca i32, align 4 - %taddr110 = alloca i32, align 4 - %taddr112 = alloca i8, align 1 - store i64 0, ptr %x, align 8 - %zext = zext i32 %0 to i64 - %1 = and i64 %zext, 4294967295 - %lt = icmp slt i32 %0, 100 - %2 = zext i1 %lt to i8 - %zext1 = zext i8 %2 to i64 - %shl = shl i64 %zext1, 63 - %3 = and i64 %shl, -9223372036854775808 - %4 = and i64 %1, 9223372036854775807 - %5 = or i64 %4, %3 - store i64 %5, ptr %x, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %y, ptr align 8 @.__const, i32 16, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %d, ptr align 8 @.__const.1, i32 16, i1 false) - %6 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - store i8 0, ptr %6, align 1 - %7 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - store i8 0, ptr %7, align 1 - %8 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - store i8 0, ptr %8, align 1 - %9 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - store i8 0, ptr %9, align 1 - %10 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 - store i8 0, ptr %10, align 1 - %11 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 - store i8 0, ptr %11, align 1 - %12 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 - store i8 0, ptr %12, align 1 - %13 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - store i8 0, ptr %13, align 1 - %14 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - store i8 0, ptr %14, align 1 - %15 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - store i8 0, ptr %15, align 1 - %16 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - store i8 0, ptr %16, align 1 - %17 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - store i8 0, ptr %17, align 1 - %18 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 - store i8 0, ptr %18, align 1 - %19 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 - store i8 0, ptr %19, align 1 - %20 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 - store i8 0, ptr %20, align 1 - %21 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - store i8 0, ptr %21, align 1 - %22 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - %ztrunc = trunc i32 %0 to i8 - store i8 %ztrunc, ptr %22, align 1 - %lshrl = lshr i32 %0, 8 - %23 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - %ztrunc2 = trunc i32 %lshrl to i8 - store i8 %ztrunc2, ptr %23, align 1 - %lshrl3 = lshr i32 %lshrl, 8 - %24 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - %ztrunc4 = trunc i32 %lshrl3 to i8 - store i8 %ztrunc4, ptr %24, align 1 - %lshrl5 = lshr i32 %lshrl3, 8 - %25 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - %ztrunc6 = trunc i32 %lshrl5 to i8 - store i8 %ztrunc6, ptr %25, align 1 - %lshrl7 = lshr i32 %lshrl5, 8 - %lt8 = icmp slt i32 %0, 100 - %26 = zext i1 %lt8 to i8 - %shl9 = shl i8 %26, 7 - %27 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %28 = load i8, ptr %27, align 1 - %29 = and i8 %28, 127 - %30 = or i8 %29, %shl9 - store i8 %30, ptr %27, align 1 - %31 = load i64, ptr %x, align 8 - %32 = and i64 4294967295, %31 - %ztrunc10 = trunc i64 %32 to i32 - store i32 %ztrunc10, ptr %taddr, align 4 - %33 = insertvalue %variant undef, ptr %taddr, 0 - %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %35 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %34, ptr %35, align 16 - %36 = load i64, ptr %x, align 8 - %lshrl11 = lshr i64 %36, 32 - %37 = and i64 2147483647, %lshrl11 - %ztrunc12 = trunc i64 %37 to i32 - store i32 %ztrunc12, ptr %taddr13, align 4 - %38 = insertvalue %variant undef, ptr %taddr13, 0 - %39 = insertvalue %variant %38, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %40 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %39, ptr %40, align 16 - %41 = load i64, ptr %x, align 8 - %lshrl14 = lshr i64 %41, 63 - %42 = and i64 1, %lshrl14 - %ztrunc15 = trunc i64 %42 to i8 - store i8 %ztrunc15, ptr %taddr16, align 1 - %43 = insertvalue %variant undef, ptr %taddr16, 0 - %44 = insertvalue %variant %43, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %45 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 2 - store %variant %44, ptr %45, align 16 - %46 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 3) - %not_err = icmp eq i64 %46, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %47 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - %48 = load i64, ptr %47, align 8 - %49 = and i64 4294967295, %48 - %ztrunc19 = trunc i64 %49 to i32 - store i32 %ztrunc19, ptr %taddr20, align 4 - %50 = insertvalue %variant undef, ptr %taddr20, 0 - %51 = insertvalue %variant %50, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %52 = getelementptr inbounds [3 x %variant], ptr %varargslots18, i64 0, i64 0 - store %variant %51, ptr %52, align 16 - %53 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - %54 = load i64, ptr %53, align 8 - %lshrl21 = lshr i64 %54, 32 - %55 = and i64 2147483647, %lshrl21 - %ztrunc22 = trunc i64 %55 to i32 - store i32 %ztrunc22, ptr %taddr23, align 4 - %56 = insertvalue %variant undef, ptr %taddr23, 0 - %57 = insertvalue %variant %56, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %58 = getelementptr inbounds [3 x %variant], ptr %varargslots18, i64 0, i64 1 - store %variant %57, ptr %58, align 16 - %59 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - %60 = load i64, ptr %59, align 8 - %lshrl24 = lshr i64 %60, 63 - %61 = and i64 1, %lshrl24 - %ztrunc25 = trunc i64 %61 to i8 - store i8 %ztrunc25, ptr %taddr26, align 1 - %62 = insertvalue %variant undef, ptr %taddr26, 0 - %63 = insertvalue %variant %62, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %64 = getelementptr inbounds [3 x %variant], ptr %varargslots18, i64 0, i64 2 - store %variant %63, ptr %64, align 16 - %65 = call i64 @std_io_printfln(ptr %retparam17, ptr @.str.2, i64 8, ptr %varargslots18, i64 3) - %not_err27 = icmp eq i64 %65, 0 - br i1 %not_err27, label %after_check28, label %voiderr29 - -after_check28: ; preds = %voiderr - br label %voiderr29 - -voiderr29: ; preds = %after_check28, %voiderr - %66 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - %67 = load i8, ptr %66, align 1 - %zext32 = zext i8 %67 to i32 - %68 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - %69 = load i8, ptr %68, align 1 - %zext33 = zext i8 %69 to i32 - %shl34 = shl i32 %zext33, 8 - %70 = or i32 %shl34, %zext32 - %71 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - %72 = load i8, ptr %71, align 1 - %zext35 = zext i8 %72 to i32 - %shl36 = shl i32 %zext35, 16 - %73 = or i32 %shl36, %70 - %74 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - %75 = load i8, ptr %74, align 1 - %zext37 = zext i8 %75 to i32 - %shl38 = shl i32 %zext37, 24 - %76 = or i32 %shl38, %73 - store i32 %76, ptr %taddr39, align 4 - %77 = insertvalue %variant undef, ptr %taddr39, 0 - %78 = insertvalue %variant %77, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %79 = getelementptr inbounds [3 x %variant], ptr %varargslots31, i64 0, i64 0 - store %variant %78, ptr %79, align 16 - %80 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 - %81 = load i8, ptr %80, align 1 - %zext40 = zext i8 %81 to i32 - %82 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 - %83 = load i8, ptr %82, align 1 - %zext41 = zext i8 %83 to i32 - %shl42 = shl i32 %zext41, 8 - %84 = or i32 %shl42, %zext40 - %85 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 - %86 = load i8, ptr %85, align 1 - %zext43 = zext i8 %86 to i32 - %shl44 = shl i32 %zext43, 16 - %87 = or i32 %shl44, %84 - %88 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %89 = load i8, ptr %88, align 1 - %zext45 = zext i8 %89 to i32 - %shl46 = shl i32 %zext45, 24 - %90 = or i32 %shl46, %87 - %91 = and i32 2147483647, %90 - store i32 %91, ptr %taddr47, align 4 - %92 = insertvalue %variant undef, ptr %taddr47, 0 - %93 = insertvalue %variant %92, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %94 = getelementptr inbounds [3 x %variant], ptr %varargslots31, i64 0, i64 1 - store %variant %93, ptr %94, align 16 - %95 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %96 = load i8, ptr %95, align 1 - %lshrl48 = lshr i8 %96, 7 - %97 = trunc i8 %lshrl48 to i1 - %98 = zext i1 %97 to i8 - store i8 %98, ptr %taddr49, align 1 - %99 = insertvalue %variant undef, ptr %taddr49, 0 - %100 = insertvalue %variant %99, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %101 = getelementptr inbounds [3 x %variant], ptr %varargslots31, i64 0, i64 2 - store %variant %100, ptr %101, align 16 - %102 = call i64 @std_io_printfln(ptr %retparam30, ptr @.str.3, i64 8, ptr %varargslots31, i64 3) - %not_err50 = icmp eq i64 %102, 0 - br i1 %not_err50, label %after_check51, label %voiderr52 - -after_check51: ; preds = %voiderr29 - br label %voiderr52 - -voiderr52: ; preds = %after_check51, %voiderr29 - %add = add i32 %0, 1 - %zext53 = zext i32 %add to i64 - %103 = and i64 %zext53, 4294967295 - %104 = and i64 %103, -9223372032559808513 - %105 = or i64 %104, 4294967296 - %gt = icmp sgt i32 %0, 100 - %106 = zext i1 %gt to i8 - %zext54 = zext i8 %106 to i64 - %shl55 = shl i64 %zext54, 63 - %107 = and i64 %shl55, -9223372036854775808 - %108 = and i64 %105, 9223372036854775807 - %109 = or i64 %108, %107 - store i64 %109, ptr %x, align 8 - %110 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - store i64 -9223371989610135519, ptr %110, align 8 - %111 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - store i8 0, ptr %111, align 1 - %112 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - store i8 0, ptr %112, align 1 - %113 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - store i8 0, ptr %113, align 1 - %114 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - store i8 0, ptr %114, align 1 - %115 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 - store i8 0, ptr %115, align 1 - %116 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 - store i8 0, ptr %116, align 1 - %117 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 - store i8 0, ptr %117, align 1 - %118 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - store i8 0, ptr %118, align 1 - %add56 = add i32 %0, 1 - %119 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - %ztrunc57 = trunc i32 %add56 to i8 - store i8 %ztrunc57, ptr %119, align 1 - %lshrl58 = lshr i32 %add56, 8 - %120 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - %ztrunc59 = trunc i32 %lshrl58 to i8 - store i8 %ztrunc59, ptr %120, align 1 - %lshrl60 = lshr i32 %lshrl58, 8 - %121 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - %ztrunc61 = trunc i32 %lshrl60 to i8 - store i8 %ztrunc61, ptr %121, align 1 - %lshrl62 = lshr i32 %lshrl60, 8 - %122 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - %ztrunc63 = trunc i32 %lshrl62 to i8 - store i8 %ztrunc63, ptr %122, align 1 - %lshrl64 = lshr i32 %lshrl62, 8 - %123 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 - store i8 1, ptr %123, align 1 - %124 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 - store i8 0, ptr %124, align 1 - %125 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 - store i8 0, ptr %125, align 1 - %126 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %127 = load i8, ptr %126, align 1 - %128 = and i8 %127, -128 - store i8 %128, ptr %126, align 1 - %gt65 = icmp sgt i32 %0, 100 - %129 = zext i1 %gt65 to i8 - %shl66 = shl i8 %129, 7 - %130 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %131 = load i8, ptr %130, align 1 - %132 = and i8 %131, 127 - %133 = or i8 %132, %shl66 - store i8 %133, ptr %130, align 1 - %134 = load i64, ptr %x, align 8 - %135 = and i64 4294967295, %134 - %ztrunc69 = trunc i64 %135 to i32 - store i32 %ztrunc69, ptr %taddr70, align 4 - %136 = insertvalue %variant undef, ptr %taddr70, 0 - %137 = insertvalue %variant %136, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %138 = getelementptr inbounds [3 x %variant], ptr %varargslots68, i64 0, i64 0 - store %variant %137, ptr %138, align 16 - %139 = load i64, ptr %x, align 8 - %lshrl71 = lshr i64 %139, 32 - %140 = and i64 2147483647, %lshrl71 - %ztrunc72 = trunc i64 %140 to i32 - store i32 %ztrunc72, ptr %taddr73, align 4 - %141 = insertvalue %variant undef, ptr %taddr73, 0 - %142 = insertvalue %variant %141, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %143 = getelementptr inbounds [3 x %variant], ptr %varargslots68, i64 0, i64 1 - store %variant %142, ptr %143, align 16 - %144 = load i64, ptr %x, align 8 - %lshrl74 = lshr i64 %144, 63 - %145 = and i64 1, %lshrl74 - %ztrunc75 = trunc i64 %145 to i8 - store i8 %ztrunc75, ptr %taddr76, align 1 - %146 = insertvalue %variant undef, ptr %taddr76, 0 - %147 = insertvalue %variant %146, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %148 = getelementptr inbounds [3 x %variant], ptr %varargslots68, i64 0, i64 2 - store %variant %147, ptr %148, align 16 - %149 = call i64 @std_io_printfln(ptr %retparam67, ptr @.str.4, i64 8, ptr %varargslots68, i64 3) - %not_err77 = icmp eq i64 %149, 0 - br i1 %not_err77, label %after_check78, label %voiderr79 - -after_check78: ; preds = %voiderr52 - br label %voiderr79 - -voiderr79: ; preds = %after_check78, %voiderr52 - %150 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - %151 = load i64, ptr %150, align 8 - %152 = and i64 4294967295, %151 - %ztrunc82 = trunc i64 %152 to i32 - store i32 %ztrunc82, ptr %taddr83, align 4 - %153 = insertvalue %variant undef, ptr %taddr83, 0 - %154 = insertvalue %variant %153, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %155 = getelementptr inbounds [3 x %variant], ptr %varargslots81, i64 0, i64 0 - store %variant %154, ptr %155, align 16 - %156 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - %157 = load i64, ptr %156, align 8 - %lshrl84 = lshr i64 %157, 32 - %158 = and i64 2147483647, %lshrl84 - %ztrunc85 = trunc i64 %158 to i32 - store i32 %ztrunc85, ptr %taddr86, align 4 - %159 = insertvalue %variant undef, ptr %taddr86, 0 - %160 = insertvalue %variant %159, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %161 = getelementptr inbounds [3 x %variant], ptr %varargslots81, i64 0, i64 1 - store %variant %160, ptr %161, align 16 - %162 = getelementptr inbounds %Abc, ptr %y, i32 0, i32 1 - %163 = load i64, ptr %162, align 8 - %lshrl87 = lshr i64 %163, 63 - %164 = and i64 1, %lshrl87 - %ztrunc88 = trunc i64 %164 to i8 - store i8 %ztrunc88, ptr %taddr89, align 1 - %165 = insertvalue %variant undef, ptr %taddr89, 0 - %166 = insertvalue %variant %165, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %167 = getelementptr inbounds [3 x %variant], ptr %varargslots81, i64 0, i64 2 - store %variant %166, ptr %167, align 16 - %168 = call i64 @std_io_printfln(ptr %retparam80, ptr @.str.5, i64 8, ptr %varargslots81, i64 3) - %not_err90 = icmp eq i64 %168, 0 - br i1 %not_err90, label %after_check91, label %voiderr92 - -after_check91: ; preds = %voiderr79 - br label %voiderr92 - -voiderr92: ; preds = %after_check91, %voiderr79 - %169 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 0 - %170 = load i8, ptr %169, align 1 - %zext95 = zext i8 %170 to i32 - %171 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 1 - %172 = load i8, ptr %171, align 1 - %zext96 = zext i8 %172 to i32 - %shl97 = shl i32 %zext96, 8 - %173 = or i32 %shl97, %zext95 - %174 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 2 - %175 = load i8, ptr %174, align 1 - %zext98 = zext i8 %175 to i32 - %shl99 = shl i32 %zext98, 16 - %176 = or i32 %shl99, %173 - %177 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 3 - %178 = load i8, ptr %177, align 1 - %zext100 = zext i8 %178 to i32 - %shl101 = shl i32 %zext100, 24 - %179 = or i32 %shl101, %176 - store i32 %179, ptr %taddr102, align 4 - %180 = insertvalue %variant undef, ptr %taddr102, 0 - %181 = insertvalue %variant %180, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %182 = getelementptr inbounds [3 x %variant], ptr %varargslots94, i64 0, i64 0 - store %variant %181, ptr %182, align 16 - %183 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 4 - %184 = load i8, ptr %183, align 1 - %zext103 = zext i8 %184 to i32 - %185 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 5 - %186 = load i8, ptr %185, align 1 - %zext104 = zext i8 %186 to i32 - %shl105 = shl i32 %zext104, 8 - %187 = or i32 %shl105, %zext103 - %188 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 6 - %189 = load i8, ptr %188, align 1 - %zext106 = zext i8 %189 to i32 - %shl107 = shl i32 %zext106, 16 - %190 = or i32 %shl107, %187 - %191 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %192 = load i8, ptr %191, align 1 - %zext108 = zext i8 %192 to i32 - %shl109 = shl i32 %zext108, 24 - %193 = or i32 %shl109, %190 - %194 = and i32 2147483647, %193 - store i32 %194, ptr %taddr110, align 4 - %195 = insertvalue %variant undef, ptr %taddr110, 0 - %196 = insertvalue %variant %195, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %197 = getelementptr inbounds [3 x %variant], ptr %varargslots94, i64 0, i64 1 - store %variant %196, ptr %197, align 16 - %198 = getelementptr inbounds [8 x i8], ptr %b, i64 0, i64 7 - %199 = load i8, ptr %198, align 1 - %lshrl111 = lshr i8 %199, 7 - %200 = trunc i8 %lshrl111 to i1 - %201 = zext i1 %200 to i8 - store i8 %201, ptr %taddr112, align 1 - %202 = insertvalue %variant undef, ptr %taddr112, 0 - %203 = insertvalue %variant %202, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %204 = getelementptr inbounds [3 x %variant], ptr %varargslots94, i64 0, i64 2 - store %variant %203, ptr %204, align 16 - %205 = call i64 @std_io_printfln(ptr %retparam93, ptr @.str.6, i64 8, ptr %varargslots94, i64 3) - %not_err113 = icmp eq i64 %205, 0 - br i1 %not_err113, label %after_check114, label %voiderr115 - -after_check114: ; preds = %voiderr92 - br label %voiderr115 - -voiderr115: ; preds = %after_check114, %voiderr92 - ret void -} - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - call void @test_hello(i32 12) - ret void -} diff --git a/test/test_suite2/bitstruct/bitstruct_to_int.c3t b/test/test_suite2/bitstruct/bitstruct_to_int.c3t deleted file mode 100644 index 70724f7b2..000000000 --- a/test/test_suite2/bitstruct/bitstruct_to_int.c3t +++ /dev/null @@ -1,103 +0,0 @@ -// #target: macos-x64 - -module foo; - -extern fn void printf(char*, ...); - -bitstruct Foo : uint -{ - int x : 1..3; - uint y : 11..13; - int z : 15..15; -} - -bitstruct Foo2 : char[4] -{ - int x : 1..3; - uint y : 11..13; - int z : 15..15; -} - -fn void test() -{ - Foo b = {}; - int x = (int)b; - char[4] y = (char[4])b; - Foo *c = &b; - c.x; - int* x2 = (int*)c; - char[4]* y2 = (char[4]*)c; -} - -fn void test2() -{ - Foo2 b = { 3, 2, -1 }; - int x = (int)b; - char[4] y = (char[4])b; - Foo2 *c = &b; - printf("%d\n", c.x); - int* x2 = (int*)c; - char[4]* y2 = (char[4]*)c; -} - -fn void main() -{ - test(); - test2(); -} - -/* #expect: foo.ll - -define void @foo_test() #0 { -entry: - %b = alloca i32, align 4 - %x = alloca i32, align 4 - %y = alloca [4 x i8], align 1 - %c = alloca ptr, align 8 - %x2 = alloca ptr, align 8 - %y2 = alloca ptr, align 8 - store i32 0, ptr %b, align 4 - %0 = load i32, ptr %b, align 4 - store i32 %0, ptr %x, align 4 - %1 = load [4 x i8], ptr %b, align 4 - store [4 x i8] %1, ptr %y, align 1 - store ptr %b, ptr %c, align 8 - %2 = load ptr, ptr %c, align 8 - %3 = load i32, ptr %2, align 8 - %shl = shl i32 %3, 28 - %ashr = ashr i32 %shl, 29 - %4 = load ptr, ptr %c, align 8 - store ptr %4, ptr %x2, align 8 - %5 = load ptr, ptr %c, align 8 - store ptr %5, ptr %y2, align 8 - ret void -} - -; Function Attrs: nounwind -define void @foo_test2() #0 { -entry: - %b = alloca [4 x i8], align 1 - %x = alloca i32, align 4 - %y = alloca [4 x i8], align 1 - %c = alloca ptr, align 8 - %x2 = alloca ptr, align 8 - %y2 = alloca ptr, align 8 - store [4 x i8] c"\06\90\00\00", ptr %b, align 1 - %0 = load i32, ptr %b, align 1 - store i32 %0, ptr %x, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 1 %y, ptr align 1 %b, i32 4, i1 false) - store ptr %b, ptr %c, align 8 - %1 = load ptr, ptr %c, align 8 - %2 = getelementptr inbounds [4 x i8], ptr %1, i64 0, i64 0 - %3 = load i8, ptr %2, align 1 - %zext = zext i8 %3 to i32 - %lshrl = lshr i32 %zext, 1 - %shl = shl i32 %lshrl, 29 - %ashr = ashr i32 %shl, 29 - call void (ptr, ...) @printf(ptr @.str, i32 %ashr) - %4 = load ptr, ptr %c, align 8 - store ptr %4, ptr %x2, align 8 - %5 = load ptr, ptr %c, align 8 - store ptr %5, ptr %y2, align 8 - ret void -} diff --git a/test/test_suite2/bitstruct/embedded_bitstruct.c3t b/test/test_suite2/bitstruct/embedded_bitstruct.c3t deleted file mode 100644 index 580cf5a57..000000000 --- a/test/test_suite2/bitstruct/embedded_bitstruct.c3t +++ /dev/null @@ -1,79 +0,0 @@ -// #target: macos-x64 - -module foo; - -struct Bar -{ - int x; - struct - { - struct - { - int y; - } - } - bitstruct : uint - { - int ww : 2..10; - } -} - -struct Foo -{ - struct - { - struct - { - int x; - } - struct - { - int y; - } - int z; - } - int w; -} -extern fn void printf(char*, ...); - -fn void main() -{ - Bar b = { 1, 2, -5 }; - printf("%d %d\n", b.y, b.ww); - Foo f = { 5, 6, 7, 8 }; - printf("%d %d %d %d\n", f.x, f.y, f.z, f.w); -} - -/* #expect: foo.ll - -define void @foo_main() #0 { -entry: - %b = alloca %Bar, align 4 - %f = alloca %Foo, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %b, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 - %1 = getelementptr inbounds %.anon, ptr %0, i32 0, i32 0 - %2 = getelementptr inbounds %.anon.0, ptr %1, i32 0, i32 0 - %3 = load i32, ptr %2, align 4 - %4 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 2 - %5 = load i32, ptr %4, align 4 - %shl = shl i32 %5, 21 - %ashr = ashr i32 %shl, 23 - call void (ptr, ...) @printf(ptr @.str, i32 %3, i32 %ashr) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %f, ptr align 4 @.__const.10, i32 16, i1 false) - %6 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 0 - %7 = getelementptr inbounds %.anon.1, ptr %6, i32 0, i32 0 - %8 = getelementptr inbounds %.anon.2, ptr %7, i32 0, i32 0 - %9 = load i32, ptr %8, align 4 - %10 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 0 - %11 = getelementptr inbounds %.anon.1, ptr %10, i32 0, i32 1 - %12 = getelementptr inbounds %.anon.3, ptr %11, i32 0, i32 0 - %13 = load i32, ptr %12, align 4 - %14 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 0 - %15 = getelementptr inbounds %.anon.1, ptr %14, i32 0, i32 2 - %16 = load i32, ptr %15, align 4 - %17 = getelementptr inbounds %Foo, ptr %f, i32 0, i32 1 - %18 = load i32, ptr %17, align 4 - call void (ptr, ...) @printf(ptr @.str.11, i32 %9, i32 %13, i32 %16, i32 %18) - ret void -} diff --git a/test/test_suite2/builtins/prefetch.c3t b/test/test_suite2/builtins/prefetch.c3t deleted file mode 100644 index 24bac0177..000000000 --- a/test/test_suite2/builtins/prefetch.c3t +++ /dev/null @@ -1,22 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fn void main() -{ - int a; - $$prefetch(&a, 1, 3); - $$prefetch(&a, 0, 1); - prefetch(&a); -} - -/* #expect: test.ll - - %a = alloca i32, align 4 - %ptr = alloca ptr, align 8 - store i32 0, ptr %a, align 4 - call void @llvm.prefetch.p0(ptr %a, i32 1, i32 3, i32 1) - call void @llvm.prefetch.p0(ptr %a, i32 0, i32 1, i32 1) - store ptr %a, ptr %ptr, align 8 - %0 = load ptr, ptr %ptr, align 8 - call void @llvm.prefetch.p0(ptr %0, i32 0, i32 3, i32 1) diff --git a/test/test_suite2/builtins/shufflevector.c3t b/test/test_suite2/builtins/shufflevector.c3t deleted file mode 100644 index cb1544b7a..000000000 --- a/test/test_suite2/builtins/shufflevector.c3t +++ /dev/null @@ -1,96 +0,0 @@ -// #target: macos-x64 - -module test; -import std::io; - -struct Matrix2x2 -{ - union - { - struct - { - float m00, m01; - float m10, m11; - } - struct - { - float[<2>] m0; - float[<2>] m1; - } - float[<4>] m; - } -} - -fn float[<2>] apply1(Matrix2x2* mat, float[<2>] vec) -{ - return float[<2>] { - mat.m00 * vec[0] + mat.m01 * vec[1], - mat.m10 * vec[0] + mat.m11 * vec[1], - }; -} - -fn float[<2>] apply2(Matrix2x2* mat, float[<2>] vec) -{ - return float[<2>] { - mat.m0[0] * vec[0] + mat.m0[1] * vec[1], - mat.m1[0] * vec[0] + mat.m1[1] * vec[1], - }; -} - -fn float[<2>] apply3(Matrix2x2* mat, float[<2>] vec) -{ - float[<2>] a = $$shufflevector(mat.m0, mat.m1, { 0, 3 }); - float[<2>] b = $$shufflevector(mat.m0, mat.m1, { 1, 2 }); - float[<2>] flip = $$shufflevector(vec, { 1, 0 }); - return a * vec + b * flip; -} - - -fn void main() -{ - Matrix2x2 a = { 1, -3, 5, -7 }; - io::printfln("1: %s", apply1(&a, float[<2>] { 11, 13 })); - io::printfln("2: %s", apply2(&a, float[<2>] { 11, 13 })); - io::printfln("3: %s", apply3(&a, float[<2>] { 11, 13 })); -} - -/* #expect: test.ll - -define double @test_apply3(ptr %0, double %1) #0 { -entry: - %vec = alloca <2 x float>, align 8 - %a = alloca <2 x float>, align 8 - %b = alloca <2 x float>, align 8 - %flip = alloca <2 x float>, align 8 - %taddr = alloca <2 x float>, align 8 - store double %1, ptr %vec, align 8 - %2 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 - %3 = getelementptr inbounds %.anon.1, ptr %2, i32 0, i32 0 - %4 = load <2 x float>, ptr %3, align 8 - %5 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 - %6 = getelementptr inbounds %.anon.1, ptr %5, i32 0, i32 1 - %7 = load <2 x float>, ptr %6, align 8 - %shuffle = shufflevector <2 x float> %4, <2 x float> %7, <2 x i32> - store <2 x float> %shuffle, ptr %a, align 8 - %8 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 - %9 = getelementptr inbounds %.anon.1, ptr %8, i32 0, i32 0 - %10 = load <2 x float>, ptr %9, align 8 - %11 = getelementptr inbounds %Matrix2x2, ptr %0, i32 0, i32 0 - %12 = getelementptr inbounds %.anon.1, ptr %11, i32 0, i32 1 - %13 = load <2 x float>, ptr %12, align 8 - %shuffle1 = shufflevector <2 x float> %10, <2 x float> %13, <2 x i32> - store <2 x float> %shuffle1, ptr %b, align 8 - %14 = load <2 x float>, ptr %vec, align 8 - %shuffle2 = shufflevector <2 x float> %14, <2 x float> poison, <2 x i32> - store <2 x float> %shuffle2, ptr %flip, align 8 - %15 = load <2 x float>, ptr %a, align 8 - %16 = load <2 x float>, ptr %vec, align 8 - %fmul = fmul <2 x float> %15, %16 - %17 = load <2 x float>, ptr %b, align 8 - %18 = load <2 x float>, ptr %flip, align 8 - %fmul3 = fmul <2 x float> %17, %18 - %fadd = fadd <2 x float> %fmul, %fmul3 - store <2 x float> %fadd, ptr %taddr, align 8 - %19 = load double, ptr %taddr, align 8 - ret double %19 -} \ No newline at end of file diff --git a/test/test_suite2/builtins/simple_builtins.c3t b/test/test_suite2/builtins/simple_builtins.c3t deleted file mode 100644 index b603bebc1..000000000 --- a/test/test_suite2/builtins/simple_builtins.c3t +++ /dev/null @@ -1,62 +0,0 @@ -// #target: macos-x64 -module foo; - -fn int foo(double b) -{ - double d = $$ceil(b); - double e = $$max(1.0, d); - double f = $$fma(d, 2.0, 3.0); - double m = $$fmuladd(d, 2.0, 3.0); - int xeb = 13; - - int[3] abcd; - int sy = $$volatile_load(&xeb); - $$volatile_store(&xeb, sy + 1); - $$volatile_store(&abcd[2], sy + 2); - sy = $$volatile_load(&abcd[2]); - return 1; -} - -/* #expect: foo.ll - -define i32 @foo_foo(double %0) #0 { -entry: - %d = alloca double, align 8 - %e = alloca double, align 8 - %f = alloca double, align 8 - %m = alloca double, align 8 - %xeb = alloca i32, align 4 - %abcd = alloca [3 x i32], align 4 - %sy = alloca i32, align 4 - %1 = call double @llvm.ceil.f64(double %0) - store double %1, ptr %d, align 8 - %2 = load double, ptr %d, align 8 - %3 = call double @llvm.maxnum.f64(double 1.000000e+00, double %2) - store double %3, ptr %e, align 8 - %4 = load double, ptr %d, align 8 - %5 = call double @llvm.fma.f64(double %4, double 2.000000e+00, double 3.000000e+00) - store double %5, ptr %f, align 8 - %6 = load double, ptr %d, align 8 - %7 = call double @llvm.fmuladd.f64(double %6, double 2.000000e+00, double 3.000000e+00) - store double %7, ptr %m, align 8 - store i32 13, ptr %xeb, align 4 - %8 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 0 - store i32 0, ptr %8, align 4 - %9 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 1 - store i32 0, ptr %9, align 4 - %10 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 2 - store i32 0, ptr %10, align 4 - %11 = load volatile i32, ptr %xeb, align 4 - store i32 %11, ptr %sy, align 4 - %12 = load i32, ptr %sy, align 4 - %add = add i32 %12, 1 - store volatile i32 %add, ptr %xeb, align 4 - %13 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 2 - %14 = load i32, ptr %sy, align 4 - %add1 = add i32 %14, 2 - store volatile i32 %add1, ptr %13, align 4 - %15 = getelementptr inbounds [3 x i32], ptr %abcd, i64 0, i64 2 - %16 = load volatile i32, ptr %15, align 4 - store i32 %16, ptr %sy, align 4 - ret i32 1 -} diff --git a/test/test_suite2/cast/cast_from_ptr.c3t b/test/test_suite2/cast/cast_from_ptr.c3t deleted file mode 100644 index 523ea2c60..000000000 --- a/test/test_suite2/cast/cast_from_ptr.c3t +++ /dev/null @@ -1,22 +0,0 @@ -module test; - -fn void tester() -{ - int *x; - short y = (short)((uptr)(x)); - uptr z = (uptr)((short)((uptr)(x))); -} - -/* #expect: test.ll - - %x = alloca ptr, align 8 - %y = alloca i16, align 2 - %z = alloca i64, align 8 - store ptr null, ptr %x, align 8 - %0 = load ptr, ptr %x, align 8 - %ptrxi = ptrtoint ptr %0 to i16 - store i16 %ptrxi, ptr %y, align 2 - %1 = load ptr, ptr %x, align 8 - %ptrxi1 = ptrtoint ptr %1 to i16 - %siuiext = sext i16 %ptrxi1 to i64 - store i64 %siuiext, ptr %z, align 8 diff --git a/test/test_suite2/cast/implicit_infer_len_cast.c3t b/test/test_suite2/cast/implicit_infer_len_cast.c3t deleted file mode 100644 index 945a96145..000000000 --- a/test/test_suite2/cast/implicit_infer_len_cast.c3t +++ /dev/null @@ -1,56 +0,0 @@ -// #target: macos-x64 -module test; - -macro int test(int[*][*]* y) -{ - $typeof(*y) z = *y; - return z[1][1]; -} -fn void main() -{ - int[2][*] x = { { 2, 3}, { 5, 6 }}; - int[<2>][*] y = { { 1, 3 }}; - int[<*>][*] z = y; - int[<2>][1] w = z; - int[<2>][] aa = { { 1, 3 }}; - int[][*] bb = { { 1, 3 } }; - test(&x); -} -/* #expect: test.ll - - %x = alloca [2 x [2 x i32]], align 16 - %y = alloca [1 x <2 x i32>], align 8 - %z = alloca [1 x <2 x i32>], align 8 - %w = alloca [1 x <2 x i32>], align 8 - %aa = alloca %"int[<2>][]", align 8 - %literal = alloca [1 x <2 x i32>], align 8 - %bb = alloca [1 x %"int[]"], align 16 - %literal1 = alloca [2 x i32], align 4 - %y2 = alloca ptr, align 8 - %z3 = alloca [2 x [2 x i32]], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 16 @.__const, i32 16, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %y, ptr align 8 @.__const.1, i32 8, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %z, ptr align 8 %y, i32 8, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %w, ptr align 8 %z, i32 8, i1 false) - %0 = getelementptr inbounds [1 x <2 x i32>], ptr %literal, i64 0, i64 0 - %1 = getelementptr inbounds <2 x i32>, ptr %0, i64 0, i64 0 - store i32 1, ptr %1, align 4 - %2 = getelementptr inbounds <2 x i32>, ptr %0, i64 0, i64 1 - store i32 3, ptr %2, align 4 - %3 = insertvalue %"int[<2>][]" undef, ptr %literal, 0 - %4 = insertvalue %"int[<2>][]" %3, i64 1, 1 - store %"int[<2>][]" %4, ptr %aa, align 8 - %5 = getelementptr inbounds [1 x %"int[]"], ptr %bb, i64 0, i64 0 - %6 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 0 - store i32 1, ptr %6, align 4 - %7 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 1 - store i32 3, ptr %7, align 4 - %8 = insertvalue %"int[]" undef, ptr %literal1, 0 - %9 = insertvalue %"int[]" %8, i64 2, 1 - store %"int[]" %9, ptr %5, align 16 - store ptr %x, ptr %y2, align 8 - %10 = load ptr, ptr %y2, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %z3, ptr align 8 %10, i32 16, i1 false) - %11 = getelementptr inbounds [2 x [2 x i32]], ptr %z3, i64 0, i64 1 - %12 = getelementptr inbounds [2 x i32], ptr %11, i64 0, i64 1 - ret void diff --git a/test/test_suite2/clang/2002-01_02.c3t b/test/test_suite2/clang/2002-01_02.c3t deleted file mode 100644 index 5b22b65c8..000000000 --- a/test/test_suite2/clang/2002-01_02.c3t +++ /dev/null @@ -1,344 +0,0 @@ -// #target: macos-x64 -module test; - -struct Foo { int x, y; } -Foo[10] array; - -fn void foo() {} - -fn void *dlclose(void*); - -fn void ap_os_dso_unload(void *handle) -{ - dlclose(handle); - return; -} - -extern fn void foo2(int, double, float); - -fn void bar(int x) { - foo2(x, x ? 1.0 : 12.5, 1.0f); -} - -extern fn int tolower(int); - -fn char *rangematch(char *pattern, int teste, int c) { - - if ((c <= teste) | (tolower(c) <= tolower((char)(teste)))) return (char*)(0); - - return pattern; -} - -struct Foostruct { - short x; -} - -extern fn int foo3(Foostruct ic); - -fn void teste2() { - Foostruct xqic; - foo3(xqic); -} - -struct Vertex -{ - float a, b, c; -} -struct Edge_rec -{ - Vertex *v; - Edge_rec *next; - int wasseen; - int more_data; -} - -define QuadEdge = Edge_rec*; - -struct EdgePair { - QuadEdge left, right; -} - -struct EdgeStack { - int ptr; - QuadEdge *elts; - int stack_size; -} - -fn int do_merge(QuadEdge ldo, QuadEdge rdo) { - int lvalid; - QuadEdge basel; - QuadEdge rcand; - while (1) { - if (!lvalid) { - return (int)((iptr)(basel.next)); - } - } - return 1; -} - -fn int test(int x) { - return x; -} - -fn void abc(int *x); -fn int def(int y, int z) { - abc(&z); - return y; -} - -struct Test { short x, x2; int y, z; } - -fn int testing(Test *a) { - return a.x2+a.y; -} - -fn int test2(int x, Test a, int y) { - return x+y+a.x2+a.y; -} -fn int test3(Test a, Test b) { - return a.x2+a.y+b.y+b.z; -} - -fn Test test4(Test a) { - return a; -} - -fn int test6() { - int[200] b; - return b[4]; -} - -struct STest2 { int x; short[4] y; double z; } - -fn STest2 test7(STest2 x) { - return x; -} - -extern fn int printf(char * format, ...); - -fn int main2() { - long v = 123455678902i64; - printf("%lld\n", v); - return 1; -} - -double afoo = 17; -double abar = 12.0; -float axx = 12.0f; - -char*[*] procnames = { - "EXIT" -}; - -void *[*] data = { &afoo, &abar, &axx }; - -/* #expect: test.ll - -%Foo = type { i32, i32 } -%Foostruct = type { i16 } -%Edge_rec = type { ptr, ptr, i32, i32 } -%Test = type { i16, i16, i32, i32 } -%STest2 = type { i32, [4 x i16], double } - -@test_array = local_unnamed_addr global [10 x %Foo] zeroinitializer, align 16 -@test_afoo = global double 1.700000e+01, align 8 -@test_abar = global double 1.200000e+01, align 8 -@test_axx = global float 1.200000e+01, align 4 -@.str = private unnamed_addr constant [5 x i8] c"EXIT\00", align 1 -@test_procnames = local_unnamed_addr global [1 x ptr] [ptr @.str], align 8 -@test_data = local_unnamed_addr global [3 x ptr] [ptr @test_afoo, ptr @test_abar, ptr @test_axx], align 16 -@.str.6 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1 - -define void @test_foo() #0 { -entry: - ret void -} - -declare ptr @test_dlclose(ptr) #0 - -define void @test_ap_os_dso_unload(ptr %0) #0 { -entry: - %1 = call ptr @test_dlclose(ptr %0) - ret void -} - -declare void @foo2(i32, double, float) #0 - -define void @test_bar(i32 %0) #0 { -entry: - %intbool = icmp ne i32 %0, 0 - %ternary = select i1 %intbool, double 1.000000e+00, double 1.250000e+01 - call void @foo2(i32 %0, double %ternary, float 1.000000e+00) - ret void -} - -declare i32 @tolower(i32) #0 - -define ptr @test_rangematch(ptr %0, i32 %1, i32 %2) #0 { -entry: - %le = icmp sle i32 %2, %1 - %3 = call i32 @tolower(i32 %2) - %siuitrunc = trunc i32 %1 to i8 - %uisiext = zext i8 %siuitrunc to i32 - %4 = call i32 @tolower(i32 %uisiext) - %le1 = icmp sle i32 %3, %4 - %or = or i1 %le, %le1 - br i1 %or, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret ptr null - -if.exit: ; preds = %entry - ret ptr %0 -} - -declare i32 @foo3(i16) #0 - -define void @test_teste2() #0 { -entry: - %xqic = alloca %Foostruct, align 2 - store i16 0, ptr %xqic, align 2 - %0 = getelementptr inbounds %Foostruct, ptr %xqic, i32 0, i32 0 - %1 = load i16, ptr %0, align 2 - %2 = call i32 @foo3(i16 %1) - ret void -} - -define i32 @test_do_merge(ptr %0, ptr %1) #0 { -entry: - %lvalid = alloca i32, align 4 - %basel = alloca ptr, align 8 - %rcand = alloca ptr, align 8 - store i32 0, ptr %lvalid, align 4 - store ptr null, ptr %basel, align 8 - store ptr null, ptr %rcand, align 8 - br label %loop.body - -loop.body: ; preds = %if.exit, %entry - %2 = load i32, ptr %lvalid, align 4 - %not = icmp eq i32 %2, 0 - br i1 %not, label %if.then, label %if.exit - -if.then: ; preds = %loop.body - %3 = load ptr, ptr %basel, align 8 - %4 = getelementptr inbounds %Edge_rec, ptr %3, i32 0, i32 1 - %5 = load ptr, ptr %4, align 8 - %ptrxi = ptrtoint ptr %5 to i32 - ret i32 %ptrxi - -if.exit: ; preds = %loop.body - br label %loop.body - -loop.exit: ; No predecessors! - ret i32 1 -} - -define i32 @test_test(i32 %0) #0 { -entry: - ret i32 %0 -} - -declare void @test_abc(ptr) #0 - -define i32 @test_def(i32 %0, i32 %1) #0 { -entry: - %z = alloca i32, align 4 - store i32 %1, ptr %z, align 4 - call void @test_abc(ptr %z) - ret i32 %0 -} - -define i32 @test_testing(ptr %0) #0 { -entry: - %1 = getelementptr inbounds %Test, ptr %0, i32 0, i32 1 - %2 = load i16, ptr %1, align 2 - %sisiext = sext i16 %2 to i32 - %3 = getelementptr inbounds %Test, ptr %0, i32 0, i32 2 - %4 = load i32, ptr %3, align 4 - %add = add i32 %sisiext, %4 - ret i32 %add -} - -define i32 @test_test2(i32 %0, i64 %1, i32 %2, i32 %3) #0 { -entry: - %4 = alloca { i64, i32 }, align 8 - %5 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 0 - store i64 %1, ptr %5, align 8 - %6 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 1 - store i32 %2, ptr %6, align 8 - %add = add i32 %0, %3 - %7 = getelementptr inbounds %Test, ptr %4, i32 0, i32 1 - %8 = load i16, ptr %7, align 2 - %sisiext = sext i16 %8 to i32 - %add1 = add i32 %add, %sisiext - %9 = getelementptr inbounds %Test, ptr %4, i32 0, i32 2 - %10 = load i32, ptr %9, align 4 - %add2 = add i32 %add1, %10 - ret i32 %add2 -} - -define i32 @test_test3(i64 %0, i32 %1, i64 %2, i32 %3) #0 { -entry: - %4 = alloca { i64, i32 }, align 8 - %5 = alloca { i64, i32 }, align 8 - %6 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 0 - store i64 %0, ptr %6, align 8 - %7 = getelementptr inbounds { i64, i32 }, ptr %4, i32 0, i32 1 - store i32 %1, ptr %7, align 8 - %8 = getelementptr inbounds { i64, i32 }, ptr %5, i32 0, i32 0 - store i64 %2, ptr %8, align 8 - %9 = getelementptr inbounds { i64, i32 }, ptr %5, i32 0, i32 1 - store i32 %3, ptr %9, align 8 - %10 = getelementptr inbounds %Test, ptr %4, i32 0, i32 1 - %11 = load i16, ptr %10, align 2 - %sisiext = sext i16 %11 to i32 - %12 = getelementptr inbounds %Test, ptr %4, i32 0, i32 2 - %13 = load i32, ptr %12, align 4 - %add = add i32 %sisiext, %13 - %14 = getelementptr inbounds %Test, ptr %5, i32 0, i32 2 - %15 = load i32, ptr %14, align 4 - %add1 = add i32 %add, %15 - %16 = getelementptr inbounds %Test, ptr %5, i32 0, i32 3 - %17 = load i32, ptr %16, align 8 - %add2 = add i32 %add1, %17 - ret i32 %add2 -} - -define { i64, i32 } @test_test4(i64 %0, i32 %1) #0 { -entry: - %2 = alloca { i64, i32 }, align 8 - %tempcoerce = alloca { i64, i32 }, align 8 - %3 = getelementptr inbounds { i64, i32 }, ptr %2, i32 0, i32 0 - store i64 %0, ptr %3, align 8 - %4 = getelementptr inbounds { i64, i32 }, ptr %2, i32 0, i32 1 - store i32 %1, ptr %4, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %tempcoerce, ptr align 8 %2, i32 12, i1 false) - %5 = load { i64, i32 }, ptr %tempcoerce, align 8 - ret { i64, i32 } %5 -} - -define i32 @test_test6() #0 { -entry: - %b = alloca [200 x i32], align 16 - call void @llvm.memset.p0.i64(ptr align 16 %b, i8 0, i64 800, i1 false) - %0 = getelementptr inbounds [200 x i32], ptr %b, i64 0, i64 4 - %1 = load i32, ptr %0, align 4 - ret i32 %1 -} - -define void @test_test7(ptr noalias sret(%STest2) align 8 %0, ptr byval(%STest2) align 8 %1) #0 { -entry: - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %1, i32 24, i1 false) - ret void -} - -declare i32 @printf(ptr, ...) #0 - -define i32 @test_main2() #0 { -entry: - %v = alloca i64, align 8 - store i64 123455678902, ptr %v, align 8 - %0 = load i64, ptr %v, align 8 - %1 = call i32 (ptr, ...) @printf(ptr @.str.6, i64 %0) - ret i32 1 -} diff --git a/test/test_suite2/compile_time/compile_time_access_subscript.c3t b/test/test_suite2/compile_time/compile_time_access_subscript.c3t deleted file mode 100644 index 5e6eaef55..000000000 --- a/test/test_suite2/compile_time/compile_time_access_subscript.c3t +++ /dev/null @@ -1,110 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; -struct Abc -{ - float m00, m01, m10, m11; -} - -Abc a = flip(Abc { 1, 2, 3, 4 }); - -macro flip($init) -{ - return Abc { $init.m01, $init.m10, $init.m11, $init.m00 }; -} - -macro check_type($Type) -{ - var $b = $Type[4][4] {}; - $Type z = $b[2][2]; - return z; -} - -enum Blurb { FOO } - -define Bdd = distinct Abc; -fn void main() -{ - var $i = int[4] { 1, 2, 3, 4 }; - var $b = Abc[2] { Abc {}, Abc { 11, 22, 33, 44 }}; - var $c = variant[4] {}; - check_type(int); - check_type(Abc); - check_type(anyerr); - check_type(Blurb); - check_type(int*); - check_type(bool); - check_type(typeid); - check_type(int[<3>]); - check_type(Bdd); - check_type(int[2]); - check_type(int[]); - io::printfln("%d", $b[0].m11); -} - -/* #expect: test.ll - - %z = alloca i32, align 4 - %z1 = alloca %Abc, align 4 - %z2 = alloca i64, align 8 - %z3 = alloca i32, align 4 - %z4 = alloca ptr, align 8 - %z5 = alloca i8, align 1 - %z6 = alloca i64, align 8 - %z7 = alloca <3 x i32>, align 16 - %z8 = alloca %Abc, align 4 - %z9 = alloca [2 x i32], align 4 - %z10 = alloca %"int[]", align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %literal = alloca %Abc, align 4 - store i32 0, ptr %z, align 4 - %0 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 0 - store float 0.000000e+00, ptr %0, align 4 - %1 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 1 - store float 0.000000e+00, ptr %1, align 4 - %2 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 2 - store float 0.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %Abc, ptr %z1, i32 0, i32 3 - store float 0.000000e+00, ptr %3, align 4 - store i64 0, ptr %z2, align 8 - store i32 0, ptr %z3, align 4 - store ptr null, ptr %z4, align 8 - store i8 0, ptr %z5, align 1 - store i64 0, ptr %z6, align 8 - store <3 x i32> zeroinitializer, ptr %z7, align 16 - %4 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 0 - store float 0.000000e+00, ptr %4, align 4 - %5 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 1 - store float 0.000000e+00, ptr %5, align 4 - %6 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 2 - store float 0.000000e+00, ptr %6, align 4 - %7 = getelementptr inbounds %Abc, ptr %z8, i32 0, i32 3 - store float 0.000000e+00, ptr %7, align 4 - %8 = getelementptr inbounds [2 x i32], ptr %z9, i64 0, i64 0 - store i32 0, ptr %8, align 4 - %9 = getelementptr inbounds [2 x i32], ptr %z9, i64 0, i64 1 - store i32 0, ptr %9, align 4 - call void @llvm.memset.p0.i64(ptr align 8 %z10, i8 0, i64 16, i1 false) - %10 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 0 - store float 0.000000e+00, ptr %10, align 4 - %11 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 1 - store float 0.000000e+00, ptr %11, align 4 - %12 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 2 - store float 0.000000e+00, ptr %12, align 4 - %13 = getelementptr inbounds %Abc, ptr %literal, i32 0, i32 3 - store float 0.000000e+00, ptr %13, align 4 - %14 = insertvalue %variant undef, ptr %literal, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$test_Abc" to i64), 1 - %16 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %15, ptr %16, align 16 - %17 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %17, 0 - br i1 %not_err, label %after_check, label %voiderr - - after_check: ; preds = %entry - br label %voiderr - - voiderr: ; preds = %after_check, %entry - ret void - } diff --git a/test/test_suite2/compile_time/compile_time_array_ref.c3t b/test/test_suite2/compile_time/compile_time_array_ref.c3t deleted file mode 100644 index 2955ab0db..000000000 --- a/test/test_suite2/compile_time/compile_time_array_ref.c3t +++ /dev/null @@ -1,18 +0,0 @@ -// #target: macos-x64 -module foo; - -char[8192] stack; -char* x = &stack[0] + 1000; - -fn void test() -{ - static char[2] y; - static char* z = &y[1]; -} - -/* #expect: foo.ll - -@foo_stack = local_unnamed_addr global [8192 x i8] zeroinitializer, align 16 -@foo_x = local_unnamed_addr global ptr getelementptr (i8, ptr @foo_stack, i64 1000), align 8 -@"test$y" = internal unnamed_addr global [2 x i8] zeroinitializer, align 1 -@"test$z" = internal unnamed_addr global ptr getelementptr inbounds ([2 x i8], ptr @"test$y", i64 0, i64 1), align 8 \ No newline at end of file diff --git a/test/test_suite2/compile_time/compile_time_ptr_ref.c3t b/test/test_suite2/compile_time/compile_time_ptr_ref.c3t deleted file mode 100644 index e4fc87bf1..000000000 --- a/test/test_suite2/compile_time/compile_time_ptr_ref.c3t +++ /dev/null @@ -1,22 +0,0 @@ -// #target: macos-x64 -module test; - - -int*[] blurp = { &ptr, &ptr, (&ptr + 1), &ptr - 1, (int*)((iptr)(&ptr) - 4) }; -int* c = (int*)((iptr)(&ptr) - 4); -int* c2 = (int*)((iptr)(&ptr) + 4); -int* c3 = (int*)(4 + (iptr)(&ptr)); -iptr ff = (iptr)(&ptr); -int ptr = 0; - -/* #expect: test.ll - -%"int*[]" = type { ptr, i64 } - -@.taddr = private global [5 x ptr] [ptr @test_ptr, ptr @test_ptr, ptr getelementptr inbounds (i32, ptr @test_ptr, i64 1), ptr getelementptr (i32, ptr @test_ptr, i64 -1), ptr getelementptr (i8, ptr @test_ptr, i64 -4)], align 8 -@test_blurp = local_unnamed_addr global %"int*[]" { ptr @.taddr, i64 5 }, align 8 -@test_c = local_unnamed_addr global ptr getelementptr (i8, ptr @test_ptr, i64 -4), align 8 -@test_c2 = local_unnamed_addr global ptr getelementptr (i8, ptr @test_ptr, i64 4), align 8 -@test_c3 = local_unnamed_addr global ptr getelementptr (i8, ptr @test_ptr, i64 4), align 8 -@test_ff = local_unnamed_addr global i64 ptrtoint (ptr @test_ptr to i64), align 8 -@test_ptr = global i32 0, align 4 \ No newline at end of file diff --git a/test/test_suite2/compile_time/ct_builtin_time_date.c3t b/test/test_suite2/compile_time/ct_builtin_time_date.c3t deleted file mode 100644 index c7d179d7d..000000000 --- a/test/test_suite2/compile_time/ct_builtin_time_date.c3t +++ /dev/null @@ -1,94 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -macro printline() -{ - io::printfln("%d", $$LINE); io::printfln("%d", $$LINE_RAW); -} -fn void test(int x) -{ - io::printfln("%d", x); - if (x > 0) $$FUNCTION(x - 1); - io::println($$TIME); - io::println($$DATE); - printline(); - io::println($$FILE); - io::println($$MODULE); -} - -bool is_def = $defined($$FUNCTION); -fn void main() -{ - bool is_def2 = $defined($$FUNCTION); - test(10); -} - -/* #expect: test.ll - - -define void @test_test(i32 %0) #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %taddr3 = alloca i64, align 8 - %retparam7 = alloca i64, align 8 - %varargslots8 = alloca [1 x %variant], align 16 - %taddr9 = alloca i64, align 8 - store i32 %0, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %gt = icmp sgt i32 %0, 0 - br i1 %gt, label %if.then, label %if.exit - -if.then: ; preds = %voiderr - %sub = sub i32 %0, 1 - call void @test_test(i32 %sub) - br label %if.exit - -if.exit: ; preds = %if.then, %voiderr - %5 = call i32 @std_io_println(ptr @.str.1) #1 - %6 = call i32 @std_io_println(ptr @.str.2) #1 - store i64 14, ptr %taddr3, align 8 - %7 = insertvalue %variant undef, ptr %taddr3, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$long" to i64), 1 - %9 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %8, ptr %9, align 16 - %10 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.3, i64 2, ptr %varargslots2, i64 1) - %not_err4 = icmp eq i64 %10, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %if.exit - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %if.exit - store i64 6, ptr %taddr9, align 8 - %11 = insertvalue %variant undef, ptr %taddr9, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$long" to i64), 1 - %13 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 - store %variant %12, ptr %13, align 16 - %14 = call i64 @std_io_printfln(ptr %retparam7, ptr @.str.4, i64 2, ptr %varargslots8, i64 1) - %not_err10 = icmp eq i64 %14, 0 - br i1 %not_err10, label %after_check11, label %voiderr12 - -after_check11: ; preds = %voiderr6 - br label %voiderr12 - -voiderr12: ; preds = %after_check11, %voiderr6 - %15 = call i32 @std_io_println(ptr @.str.5) #1 - %16 = call i32 @std_io_println(ptr @.str.6) #1 - ret void -} diff --git a/test/test_suite2/compile_time/ct_for.c3t b/test/test_suite2/compile_time/ct_for.c3t deleted file mode 100644 index 34d6b921b..000000000 --- a/test/test_suite2/compile_time/ct_for.c3t +++ /dev/null @@ -1,32 +0,0 @@ -// #target: macos-x64 - -module test; - -extern fn void printf(char*, ...); - -fn void main() -{ - - $for (var $i = 0; $i < 3; $i++): - printf("Foo %d\n", $i); - $endfor; - - $for ($i = 0, var $j = 100; $i < 4;): - printf("Foo %d %d\n", $i++, $j--); - $endfor; - -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - call void (ptr, ...) @printf(ptr @.str, i32 0) - call void (ptr, ...) @printf(ptr @.str.1, i32 1) - call void (ptr, ...) @printf(ptr @.str.2, i32 2) - call void (ptr, ...) @printf(ptr @.str.3, i32 0, i32 100) - call void (ptr, ...) @printf(ptr @.str.4, i32 1, i32 99) - call void (ptr, ...) @printf(ptr @.str.5, i32 2, i32 98) - call void (ptr, ...) @printf(ptr @.str.6, i32 3, i32 97) - ret void -} diff --git a/test/test_suite2/compile_time/ct_foreach.c3t b/test/test_suite2/compile_time/ct_foreach.c3t deleted file mode 100644 index 752a86234..000000000 --- a/test/test_suite2/compile_time/ct_foreach.c3t +++ /dev/null @@ -1,52 +0,0 @@ -// #target: macos-x64 -module test; - -extern fn void printf(char*, ...); - -fn void main() -{ - - var $foo = { 1, 10, 34 }; - $foreach ($i : $foo): - printf("Foo %d\n", $i); - $endforeach; - - $foreach ($i, $j : $foo): - printf("Bar %d %d\n", $i, $j); - $endforeach; - - $foreach ($x : { 123, "abc", 1177, "hello" }): - $typeof($x) z = $x; - $switch ($typeof($x)): - $case int: - printf("Bar %d\n", $x); - $default: - printf("Bar %s\n", $x); - $endswitch; - $endforeach; - -} - -/* #expect: test.ll -define void @test_main() #0 { -entry: - %z = alloca i32, align 4 - %z1 = alloca ptr, align 8 - %z2 = alloca i32, align 4 - %z3 = alloca ptr, align 8 - call void (ptr, ...) @printf(ptr @.str, i32 1) - call void (ptr, ...) @printf(ptr @.str.1, i32 10) - call void (ptr, ...) @printf(ptr @.str.2, i32 34) - call void (ptr, ...) @printf(ptr @.str.3, i32 0, i32 1) - call void (ptr, ...) @printf(ptr @.str.4, i32 1, i32 10) - call void (ptr, ...) @printf(ptr @.str.5, i32 2, i32 34) - store i32 123, ptr %z, align 4 - call void (ptr, ...) @printf(ptr @.str.6, i32 123) - store ptr @.str.7, ptr %z1, align 8 - call void (ptr, ...) @printf(ptr @.str.8, ptr @.str.9) - store i32 1177, ptr %z2, align 4 - call void (ptr, ...) @printf(ptr @.str.10, i32 1177) - store ptr @.str.11, ptr %z3, align 8 - call void (ptr, ...) @printf(ptr @.str.12, ptr @.str.13) - ret void -} diff --git a/test/test_suite2/compile_time/ct_funcptr.c3t b/test/test_suite2/compile_time/ct_funcptr.c3t deleted file mode 100644 index 13036980e..000000000 --- a/test/test_suite2/compile_time/ct_funcptr.c3t +++ /dev/null @@ -1,50 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fn void test(int x) -{ - $typeof(&$$FUNCTION) ptr = &$$FUNCTION; - io::printfln("%d", x); - if (x > 0) ptr(x - 1); -} - -fn void main() -{ - test(10); -} - -/* #expect: test.ll - -define void @test_test(i32 %0) #0 { -entry: - %ptr = alloca ptr, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - store ptr @test_test, ptr %ptr, align 8 - store i32 %0, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %gt = icmp sgt i32 %0, 0 - br i1 %gt, label %if.then, label %if.exit - -if.then: ; preds = %voiderr - %5 = load ptr, ptr %ptr, align 8 - %sub = sub i32 %0, 1 - call void %5(i32 %sub) - br label %if.exit - -if.exit: ; preds = %if.then, %voiderr - ret void -} diff --git a/test/test_suite2/compile_time/ct_memberof.c3t b/test/test_suite2/compile_time/ct_memberof.c3t deleted file mode 100644 index 72b420e93..000000000 --- a/test/test_suite2/compile_time/ct_memberof.c3t +++ /dev/null @@ -1,629 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fn int hell() { return 1; } - -macro print_args($Type) -{ - var $params = $Type.params; - $foreach ($param : $params): - io::println($param.nameof); - $endforeach; -} - -bitstruct Bark : ulong -{ - int x : 1..4; - short y : 6..10; -} - -struct Foo -{ - int x; - union test { - int y; - double z; - } - struct { - int abc; - int bcd; - } - double q; -} -macro print_fields($Type) -{ - io::printfln("Type: %s", $Type.nameof); - var $params = $Type.membersof; - $foreach ($param : $params): - io::printfln("%s: %s", $param.nameof, $param.typeid.nameof); - $endforeach; -} - -fn void hello(int a, double b, int[4] d, args...) {} -fn void test(int x) -{ - print_args($typeof(&test)); - print_args($typeof(&hell)); - print_args($typeof(&hello)); - io::println($typeof(&test).returns.nameof); - io::println($typeof(&hell).returns.nameof); - print_fields(Foo); - print_fields(Bar); - print_fields(Bark); -} - -struct BarInner -{ - char a; - char b; -} - -struct Bar -{ - char a; - short b; - struct - { - union - { - BarInner y; - char z; - struct { - char z1; - char z2; - } - } - } - struct baz - { - int foo; - } -} -fn void main() -{ - var $x = Bar.a; - - io::printfln("len: %d", Bar.membersof.len); - io::printfln("len: %d", Bar.baz.membersof.len); - io::printfln("a: %d %d", Bar.a.offsetof, Bar.a.alignof); - io::printfln("b: %d %d", Bar.b.offsetof, Bar.b.alignof); - io::printfln("y: %d %d", Bar.y.offsetof, Bar.y.alignof); - io::printfln("z: %d %d", Bar.z.offsetof, Bar.z.alignof); - io::printfln("z1: %d %d", Bar.z1.offsetof, Bar.z1.alignof); - io::printfln("z2: %d %d", Bar.z2.offsetof, Bar.z2.alignof); - io::printfln("baz: %d %d", Bar.baz.offsetof, Bar.baz.alignof); - io::printfln("Bar: %d", $x.alignof); - io::printfln("foo: %d %d", Bar.baz.foo.offsetof, Bar.baz.foo.alignof); - - test(10); -} - -/* #expect: test.ll - -define void @test_hello(i32 %0, double %1, i64 %2, i64 %3, ptr %4, i64 %5) #0 { -entry: - %d = alloca [4 x i32], align 4 - %args = alloca %"variant[]", align 8 - %6 = getelementptr inbounds { i64, i64 }, ptr %d, i32 0, i32 0 - store i64 %2, ptr %6, align 4 - %7 = getelementptr inbounds { i64, i64 }, ptr %d, i32 0, i32 1 - store i64 %3, ptr %7, align 4 - %8 = getelementptr inbounds { ptr, i64 }, ptr %args, i32 0, i32 0 - store ptr %4, ptr %8, align 8 - %9 = getelementptr inbounds { ptr, i64 }, ptr %args, i32 0, i32 1 - store i64 %5, ptr %9, align 8 - ret void -} - -; Function Attrs: nounwind -define void @test_test(i32 %0) #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca ptr, align 8 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [2 x %variant], align 16 - %taddr3 = alloca ptr, align 8 - %taddr4 = alloca ptr, align 8 - %retparam8 = alloca i64, align 8 - %varargslots9 = alloca [2 x %variant], align 16 - %taddr10 = alloca ptr, align 8 - %taddr11 = alloca ptr, align 8 - %retparam15 = alloca i64, align 8 - %varargslots16 = alloca [2 x %variant], align 16 - %taddr17 = alloca ptr, align 8 - %taddr18 = alloca ptr, align 8 - %retparam22 = alloca i64, align 8 - %varargslots23 = alloca [2 x %variant], align 16 - %taddr24 = alloca ptr, align 8 - %taddr25 = alloca ptr, align 8 - %retparam29 = alloca i64, align 8 - %varargslots30 = alloca [1 x %variant], align 16 - %taddr31 = alloca ptr, align 8 - %retparam35 = alloca i64, align 8 - %varargslots36 = alloca [2 x %variant], align 16 - %taddr37 = alloca ptr, align 8 - %taddr38 = alloca ptr, align 8 - %retparam42 = alloca i64, align 8 - %varargslots43 = alloca [2 x %variant], align 16 - %taddr44 = alloca ptr, align 8 - %taddr45 = alloca ptr, align 8 - %retparam49 = alloca i64, align 8 - %varargslots50 = alloca [2 x %variant], align 16 - %taddr51 = alloca ptr, align 8 - %taddr52 = alloca ptr, align 8 - %retparam56 = alloca i64, align 8 - %varargslots57 = alloca [2 x %variant], align 16 - %taddr58 = alloca ptr, align 8 - %taddr59 = alloca ptr, align 8 - %retparam63 = alloca i64, align 8 - %varargslots64 = alloca [1 x %variant], align 16 - %taddr65 = alloca ptr, align 8 - %retparam69 = alloca i64, align 8 - %varargslots70 = alloca [2 x %variant], align 16 - %taddr71 = alloca ptr, align 8 - %taddr72 = alloca ptr, align 8 - %retparam76 = alloca i64, align 8 - %varargslots77 = alloca [2 x %variant], align 16 - %taddr78 = alloca ptr, align 8 - %taddr79 = alloca ptr, align 8 - %1 = call i32 @std_io_println(ptr @.str) #1 - %2 = call i32 @std_io_println(ptr @.str.10) #1 - %3 = call i32 @std_io_println(ptr @.str.11) #1 - %4 = call i32 @std_io_println(ptr @.str.12) #1 - %5 = call i32 @std_io_println(ptr @.str.13) #1 - %6 = call i32 @std_io_println(ptr @.str.14) #1 - %7 = call i32 @std_io_println(ptr @.str.15) #1 - store ptr @.str.17, ptr %taddr, align 8 - %8 = insertvalue %variant undef, ptr %taddr, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %10 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %9, ptr %10, align 16 - %11 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.16, i64 8, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %11, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - store ptr @.str.19, ptr %taddr3, align 8 - %12 = insertvalue %variant undef, ptr %taddr3, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 - %14 = getelementptr inbounds [2 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %13, ptr %14, align 16 - store ptr @.str.20, ptr %taddr4, align 8 - %15 = insertvalue %variant undef, ptr %taddr4, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %17 = getelementptr inbounds [2 x %variant], ptr %varargslots2, i64 0, i64 1 - store %variant %16, ptr %17, align 16 - %18 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.18, i64 6, ptr %varargslots2, i64 2) - %not_err5 = icmp eq i64 %18, 0 - br i1 %not_err5, label %after_check6, label %voiderr7 - -after_check6: ; preds = %voiderr - br label %voiderr7 - -voiderr7: ; preds = %after_check6, %voiderr - store ptr @.str.22, ptr %taddr10, align 8 - %19 = insertvalue %variant undef, ptr %taddr10, 0 - %20 = insertvalue %variant %19, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 - %21 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 0 - store %variant %20, ptr %21, align 16 - store ptr @.str.23, ptr %taddr11, align 8 - %22 = insertvalue %variant undef, ptr %taddr11, 0 - %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 - %24 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 1 - store %variant %23, ptr %24, align 16 - %25 = call i64 @std_io_printfln(ptr %retparam8, ptr @.str.21, i64 6, ptr %varargslots9, i64 2) - %not_err12 = icmp eq i64 %25, 0 - br i1 %not_err12, label %after_check13, label %voiderr14 - -after_check13: ; preds = %voiderr7 - br label %voiderr14 - -voiderr14: ; preds = %after_check13, %voiderr7 - store ptr @.str.25, ptr %taddr17, align 8 - %26 = insertvalue %variant undef, ptr %taddr17, 0 - %27 = insertvalue %variant %26, i64 ptrtoint (ptr @"ct$p$a0$char" to i64), 1 - %28 = getelementptr inbounds [2 x %variant], ptr %varargslots16, i64 0, i64 0 - store %variant %27, ptr %28, align 16 - store ptr @.str.26, ptr %taddr18, align 8 - %29 = insertvalue %variant undef, ptr %taddr18, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 - %31 = getelementptr inbounds [2 x %variant], ptr %varargslots16, i64 0, i64 1 - store %variant %30, ptr %31, align 16 - %32 = call i64 @std_io_printfln(ptr %retparam15, ptr @.str.24, i64 6, ptr %varargslots16, i64 2) - %not_err19 = icmp eq i64 %32, 0 - br i1 %not_err19, label %after_check20, label %voiderr21 - -after_check20: ; preds = %voiderr14 - br label %voiderr21 - -voiderr21: ; preds = %after_check20, %voiderr14 - store ptr @.str.28, ptr %taddr24, align 8 - %33 = insertvalue %variant undef, ptr %taddr24, 0 - %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 - %35 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 0 - store %variant %34, ptr %35, align 16 - store ptr @.str.29, ptr %taddr25, align 8 - %36 = insertvalue %variant undef, ptr %taddr25, 0 - %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$p$a6$char" to i64), 1 - %38 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 1 - store %variant %37, ptr %38, align 16 - %39 = call i64 @std_io_printfln(ptr %retparam22, ptr @.str.27, i64 6, ptr %varargslots23, i64 2) - %not_err26 = icmp eq i64 %39, 0 - br i1 %not_err26, label %after_check27, label %voiderr28 - -after_check27: ; preds = %voiderr21 - br label %voiderr28 - -voiderr28: ; preds = %after_check27, %voiderr21 - store ptr @.str.31, ptr %taddr31, align 8 - %40 = insertvalue %variant undef, ptr %taddr31, 0 - %41 = insertvalue %variant %40, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %42 = getelementptr inbounds [1 x %variant], ptr %varargslots30, i64 0, i64 0 - store %variant %41, ptr %42, align 16 - %43 = call i64 @std_io_printfln(ptr %retparam29, ptr @.str.30, i64 8, ptr %varargslots30, i64 1) - %not_err32 = icmp eq i64 %43, 0 - br i1 %not_err32, label %after_check33, label %voiderr34 - -after_check33: ; preds = %voiderr28 - br label %voiderr34 - -voiderr34: ; preds = %after_check33, %voiderr28 - store ptr @.str.33, ptr %taddr37, align 8 - %44 = insertvalue %variant undef, ptr %taddr37, 0 - %45 = insertvalue %variant %44, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 - %46 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 0 - store %variant %45, ptr %46, align 16 - store ptr @.str.34, ptr %taddr38, align 8 - %47 = insertvalue %variant undef, ptr %taddr38, 0 - %48 = insertvalue %variant %47, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 - %49 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 1 - store %variant %48, ptr %49, align 16 - %50 = call i64 @std_io_printfln(ptr %retparam35, ptr @.str.32, i64 6, ptr %varargslots36, i64 2) - %not_err39 = icmp eq i64 %50, 0 - br i1 %not_err39, label %after_check40, label %voiderr41 - -after_check40: ; preds = %voiderr34 - br label %voiderr41 - -voiderr41: ; preds = %after_check40, %voiderr34 - store ptr @.str.36, ptr %taddr44, align 8 - %51 = insertvalue %variant undef, ptr %taddr44, 0 - %52 = insertvalue %variant %51, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 - %53 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 0 - store %variant %52, ptr %53, align 16 - store ptr @.str.37, ptr %taddr45, align 8 - %54 = insertvalue %variant undef, ptr %taddr45, 0 - %55 = insertvalue %variant %54, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 - %56 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 1 - store %variant %55, ptr %56, align 16 - %57 = call i64 @std_io_printfln(ptr %retparam42, ptr @.str.35, i64 6, ptr %varargslots43, i64 2) - %not_err46 = icmp eq i64 %57, 0 - br i1 %not_err46, label %after_check47, label %voiderr48 - -after_check47: ; preds = %voiderr41 - br label %voiderr48 - -voiderr48: ; preds = %after_check47, %voiderr41 - store ptr @.str.39, ptr %taddr51, align 8 - %58 = insertvalue %variant undef, ptr %taddr51, 0 - %59 = insertvalue %variant %58, i64 ptrtoint (ptr @"ct$p$a0$char" to i64), 1 - %60 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 0 - store %variant %59, ptr %60, align 16 - store ptr @.str.40, ptr %taddr52, align 8 - %61 = insertvalue %variant undef, ptr %taddr52, 0 - %62 = insertvalue %variant %61, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 - %63 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 1 - store %variant %62, ptr %63, align 16 - %64 = call i64 @std_io_printfln(ptr %retparam49, ptr @.str.38, i64 6, ptr %varargslots50, i64 2) - %not_err53 = icmp eq i64 %64, 0 - br i1 %not_err53, label %after_check54, label %voiderr55 - -after_check54: ; preds = %voiderr48 - br label %voiderr55 - -voiderr55: ; preds = %after_check54, %voiderr48 - store ptr @.str.42, ptr %taddr58, align 8 - %65 = insertvalue %variant undef, ptr %taddr58, 0 - %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %67 = getelementptr inbounds [2 x %variant], ptr %varargslots57, i64 0, i64 0 - store %variant %66, ptr %67, align 16 - store ptr @.str.43, ptr %taddr59, align 8 - %68 = insertvalue %variant undef, ptr %taddr59, 0 - %69 = insertvalue %variant %68, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %70 = getelementptr inbounds [2 x %variant], ptr %varargslots57, i64 0, i64 1 - store %variant %69, ptr %70, align 16 - %71 = call i64 @std_io_printfln(ptr %retparam56, ptr @.str.41, i64 6, ptr %varargslots57, i64 2) - %not_err60 = icmp eq i64 %71, 0 - br i1 %not_err60, label %after_check61, label %voiderr62 - -after_check61: ; preds = %voiderr55 - br label %voiderr62 - -voiderr62: ; preds = %after_check61, %voiderr55 - store ptr @.str.45, ptr %taddr65, align 8 - %72 = insertvalue %variant undef, ptr %taddr65, 0 - %73 = insertvalue %variant %72, i64 ptrtoint (ptr @"ct$p$a4$char" to i64), 1 - %74 = getelementptr inbounds [1 x %variant], ptr %varargslots64, i64 0, i64 0 - store %variant %73, ptr %74, align 16 - %75 = call i64 @std_io_printfln(ptr %retparam63, ptr @.str.44, i64 8, ptr %varargslots64, i64 1) - %not_err66 = icmp eq i64 %75, 0 - br i1 %not_err66, label %after_check67, label %voiderr68 - -after_check67: ; preds = %voiderr62 - br label %voiderr68 - -voiderr68: ; preds = %after_check67, %voiderr62 - store ptr @.str.47, ptr %taddr71, align 8 - %76 = insertvalue %variant undef, ptr %taddr71, 0 - %77 = insertvalue %variant %76, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 - %78 = getelementptr inbounds [2 x %variant], ptr %varargslots70, i64 0, i64 0 - store %variant %77, ptr %78, align 16 - store ptr @.str.48, ptr %taddr72, align 8 - %79 = insertvalue %variant undef, ptr %taddr72, 0 - %80 = insertvalue %variant %79, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %81 = getelementptr inbounds [2 x %variant], ptr %varargslots70, i64 0, i64 1 - store %variant %80, ptr %81, align 16 - %82 = call i64 @std_io_printfln(ptr %retparam69, ptr @.str.46, i64 6, ptr %varargslots70, i64 2) - %not_err73 = icmp eq i64 %82, 0 - br i1 %not_err73, label %after_check74, label %voiderr75 - -after_check74: ; preds = %voiderr68 - br label %voiderr75 - -voiderr75: ; preds = %after_check74, %voiderr68 - store ptr @.str.50, ptr %taddr78, align 8 - %83 = insertvalue %variant undef, ptr %taddr78, 0 - %84 = insertvalue %variant %83, i64 ptrtoint (ptr @"ct$p$a1$char" to i64), 1 - %85 = getelementptr inbounds [2 x %variant], ptr %varargslots77, i64 0, i64 0 - store %variant %84, ptr %85, align 16 - store ptr @.str.51, ptr %taddr79, align 8 - %86 = insertvalue %variant undef, ptr %taddr79, 0 - %87 = insertvalue %variant %86, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 - %88 = getelementptr inbounds [2 x %variant], ptr %varargslots77, i64 0, i64 1 - store %variant %87, ptr %88, align 16 - %89 = call i64 @std_io_printfln(ptr %retparam76, ptr @.str.49, i64 6, ptr %varargslots77, i64 2) - %not_err80 = icmp eq i64 %89, 0 - br i1 %not_err80, label %after_check81, label %voiderr82 - -after_check81: ; preds = %voiderr75 - br label %voiderr82 - -voiderr82: ; preds = %after_check81, %voiderr75 - ret void -} - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i64, align 8 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %taddr3 = alloca i64, align 8 - %retparam7 = alloca i64, align 8 - %varargslots8 = alloca [2 x %variant], align 16 - %taddr9 = alloca i64, align 8 - %taddr10 = alloca i64, align 8 - %retparam14 = alloca i64, align 8 - %varargslots15 = alloca [2 x %variant], align 16 - %taddr16 = alloca i64, align 8 - %taddr17 = alloca i64, align 8 - %retparam21 = alloca i64, align 8 - %varargslots22 = alloca [2 x %variant], align 16 - %taddr23 = alloca i64, align 8 - %taddr24 = alloca i64, align 8 - %retparam28 = alloca i64, align 8 - %varargslots29 = alloca [2 x %variant], align 16 - %taddr30 = alloca i64, align 8 - %taddr31 = alloca i64, align 8 - %retparam35 = alloca i64, align 8 - %varargslots36 = alloca [2 x %variant], align 16 - %taddr37 = alloca i64, align 8 - %taddr38 = alloca i64, align 8 - %retparam42 = alloca i64, align 8 - %varargslots43 = alloca [2 x %variant], align 16 - %taddr44 = alloca i64, align 8 - %taddr45 = alloca i64, align 8 - %retparam49 = alloca i64, align 8 - %varargslots50 = alloca [2 x %variant], align 16 - %taddr51 = alloca i64, align 8 - %taddr52 = alloca i64, align 8 - %retparam56 = alloca i64, align 8 - %varargslots57 = alloca [1 x %variant], align 16 - %taddr58 = alloca i64, align 8 - %retparam62 = alloca i64, align 8 - %varargslots63 = alloca [2 x %variant], align 16 - %taddr64 = alloca i64, align 8 - %taddr65 = alloca i64, align 8 - store i64 4, ptr %taddr, align 8 - %0 = insertvalue %variant undef, ptr %taddr, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$long" to i64), 1 - %2 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %1, ptr %2, align 16 - %3 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.52, i64 7, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %3, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - store i64 1, ptr %taddr3, align 8 - %4 = insertvalue %variant undef, ptr %taddr3, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$long" to i64), 1 - %6 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %5, ptr %6, align 16 - %7 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.53, i64 7, ptr %varargslots2, i64 1) - %not_err4 = icmp eq i64 %7, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %voiderr - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %voiderr - store i64 0, ptr %taddr9, align 8 - %8 = insertvalue %variant undef, ptr %taddr9, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %10 = getelementptr inbounds [2 x %variant], ptr %varargslots8, i64 0, i64 0 - store %variant %9, ptr %10, align 16 - store i64 4, ptr %taddr10, align 8 - %11 = insertvalue %variant undef, ptr %taddr10, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %13 = getelementptr inbounds [2 x %variant], ptr %varargslots8, i64 0, i64 1 - store %variant %12, ptr %13, align 16 - %14 = call i64 @std_io_printfln(ptr %retparam7, ptr @.str.54, i64 8, ptr %varargslots8, i64 2) - %not_err11 = icmp eq i64 %14, 0 - br i1 %not_err11, label %after_check12, label %voiderr13 - -after_check12: ; preds = %voiderr6 - br label %voiderr13 - -voiderr13: ; preds = %after_check12, %voiderr6 - store i64 2, ptr %taddr16, align 8 - %15 = insertvalue %variant undef, ptr %taddr16, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %17 = getelementptr inbounds [2 x %variant], ptr %varargslots15, i64 0, i64 0 - store %variant %16, ptr %17, align 16 - store i64 2, ptr %taddr17, align 8 - %18 = insertvalue %variant undef, ptr %taddr17, 0 - %19 = insertvalue %variant %18, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %20 = getelementptr inbounds [2 x %variant], ptr %varargslots15, i64 0, i64 1 - store %variant %19, ptr %20, align 16 - %21 = call i64 @std_io_printfln(ptr %retparam14, ptr @.str.55, i64 8, ptr %varargslots15, i64 2) - %not_err18 = icmp eq i64 %21, 0 - br i1 %not_err18, label %after_check19, label %voiderr20 - -after_check19: ; preds = %voiderr13 - br label %voiderr20 - -voiderr20: ; preds = %after_check19, %voiderr13 - store i64 4, ptr %taddr23, align 8 - %22 = insertvalue %variant undef, ptr %taddr23, 0 - %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %24 = getelementptr inbounds [2 x %variant], ptr %varargslots22, i64 0, i64 0 - store %variant %23, ptr %24, align 16 - store i64 4, ptr %taddr24, align 8 - %25 = insertvalue %variant undef, ptr %taddr24, 0 - %26 = insertvalue %variant %25, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %27 = getelementptr inbounds [2 x %variant], ptr %varargslots22, i64 0, i64 1 - store %variant %26, ptr %27, align 16 - %28 = call i64 @std_io_printfln(ptr %retparam21, ptr @.str.56, i64 8, ptr %varargslots22, i64 2) - %not_err25 = icmp eq i64 %28, 0 - br i1 %not_err25, label %after_check26, label %voiderr27 - -after_check26: ; preds = %voiderr20 - br label %voiderr27 - -voiderr27: ; preds = %after_check26, %voiderr20 - store i64 4, ptr %taddr30, align 8 - %29 = insertvalue %variant undef, ptr %taddr30, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %31 = getelementptr inbounds [2 x %variant], ptr %varargslots29, i64 0, i64 0 - store %variant %30, ptr %31, align 16 - store i64 4, ptr %taddr31, align 8 - %32 = insertvalue %variant undef, ptr %taddr31, 0 - %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %34 = getelementptr inbounds [2 x %variant], ptr %varargslots29, i64 0, i64 1 - store %variant %33, ptr %34, align 16 - %35 = call i64 @std_io_printfln(ptr %retparam28, ptr @.str.57, i64 8, ptr %varargslots29, i64 2) - %not_err32 = icmp eq i64 %35, 0 - br i1 %not_err32, label %after_check33, label %voiderr34 - -after_check33: ; preds = %voiderr27 - br label %voiderr34 - -voiderr34: ; preds = %after_check33, %voiderr27 - store i64 4, ptr %taddr37, align 8 - %36 = insertvalue %variant undef, ptr %taddr37, 0 - %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %38 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 0 - store %variant %37, ptr %38, align 16 - store i64 4, ptr %taddr38, align 8 - %39 = insertvalue %variant undef, ptr %taddr38, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %41 = getelementptr inbounds [2 x %variant], ptr %varargslots36, i64 0, i64 1 - store %variant %40, ptr %41, align 16 - %42 = call i64 @std_io_printfln(ptr %retparam35, ptr @.str.58, i64 9, ptr %varargslots36, i64 2) - %not_err39 = icmp eq i64 %42, 0 - br i1 %not_err39, label %after_check40, label %voiderr41 - -after_check40: ; preds = %voiderr34 - br label %voiderr41 - -voiderr41: ; preds = %after_check40, %voiderr34 - store i64 5, ptr %taddr44, align 8 - %43 = insertvalue %variant undef, ptr %taddr44, 0 - %44 = insertvalue %variant %43, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %45 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 0 - store %variant %44, ptr %45, align 16 - store i64 1, ptr %taddr45, align 8 - %46 = insertvalue %variant undef, ptr %taddr45, 0 - %47 = insertvalue %variant %46, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %48 = getelementptr inbounds [2 x %variant], ptr %varargslots43, i64 0, i64 1 - store %variant %47, ptr %48, align 16 - %49 = call i64 @std_io_printfln(ptr %retparam42, ptr @.str.59, i64 9, ptr %varargslots43, i64 2) - %not_err46 = icmp eq i64 %49, 0 - br i1 %not_err46, label %after_check47, label %voiderr48 - -after_check47: ; preds = %voiderr41 - br label %voiderr48 - -voiderr48: ; preds = %after_check47, %voiderr41 - store i64 8, ptr %taddr51, align 8 - %50 = insertvalue %variant undef, ptr %taddr51, 0 - %51 = insertvalue %variant %50, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %52 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 0 - store %variant %51, ptr %52, align 16 - store i64 4, ptr %taddr52, align 8 - %53 = insertvalue %variant undef, ptr %taddr52, 0 - %54 = insertvalue %variant %53, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %55 = getelementptr inbounds [2 x %variant], ptr %varargslots50, i64 0, i64 1 - store %variant %54, ptr %55, align 16 - %56 = call i64 @std_io_printfln(ptr %retparam49, ptr @.str.60, i64 10, ptr %varargslots50, i64 2) - %not_err53 = icmp eq i64 %56, 0 - br i1 %not_err53, label %after_check54, label %voiderr55 - -after_check54: ; preds = %voiderr48 - br label %voiderr55 - -voiderr55: ; preds = %after_check54, %voiderr48 - store i64 4, ptr %taddr58, align 8 - %57 = insertvalue %variant undef, ptr %taddr58, 0 - %58 = insertvalue %variant %57, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %59 = getelementptr inbounds [1 x %variant], ptr %varargslots57, i64 0, i64 0 - store %variant %58, ptr %59, align 16 - %60 = call i64 @std_io_printfln(ptr %retparam56, ptr @.str.61, i64 7, ptr %varargslots57, i64 1) - %not_err59 = icmp eq i64 %60, 0 - br i1 %not_err59, label %after_check60, label %voiderr61 - -after_check60: ; preds = %voiderr55 - br label %voiderr61 - -voiderr61: ; preds = %after_check60, %voiderr55 - store i64 8, ptr %taddr64, align 8 - %61 = insertvalue %variant undef, ptr %taddr64, 0 - %62 = insertvalue %variant %61, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %63 = getelementptr inbounds [2 x %variant], ptr %varargslots63, i64 0, i64 0 - store %variant %62, ptr %63, align 16 - store i64 4, ptr %taddr65, align 8 - %64 = insertvalue %variant undef, ptr %taddr65, 0 - %65 = insertvalue %variant %64, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %66 = getelementptr inbounds [2 x %variant], ptr %varargslots63, i64 0, i64 1 - store %variant %65, ptr %66, align 16 - %67 = call i64 @std_io_printfln(ptr %retparam62, ptr @.str.62, i64 10, ptr %varargslots63, i64 2) - %not_err66 = icmp eq i64 %67, 0 - br i1 %not_err66, label %after_check67, label %voiderr68 - -after_check67: ; preds = %voiderr61 - br label %voiderr68 - -voiderr68: ; preds = %after_check67, %voiderr61 - call void @test_test(i32 10) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/compile_time/typeof_example.c3t b/test/test_suite2/compile_time/typeof_example.c3t deleted file mode 100644 index 5ba86b817..000000000 --- a/test/test_suite2/compile_time/typeof_example.c3t +++ /dev/null @@ -1,52 +0,0 @@ -extern fn void printf(char *, ...); - -macro bitcast($Target, value) -{ - $typeof(value) temp = value; - $Target* result = ($Target*)(&temp); - return *result; -} - -fn void main() -{ - float f = 100; - int i = bitcast(int, f); - float f2 = bitcast(float, i); - printf("Bitcast %f to %d to %f", f, i, f2); -} - -/* #expect: typeof_example.ll - - %f = alloca float, align 4 - %i = alloca i32, align 4 - %value = alloca float, align 4 - %temp = alloca float, align 4 - %result = alloca ptr, align 8 - %f2 = alloca float, align 4 - %value1 = alloca i32, align 4 - %temp2 = alloca i32, align 4 - %result3 = alloca ptr, align 8 - store float 1.000000e+02, ptr %f, align 4 - %0 = load float, ptr %f, align 4 - store float %0, ptr %value, align 4 - %1 = load float, ptr %value, align 4 - store float %1, ptr %temp, align 4 - store ptr %temp, ptr %result, align 8 - %2 = load ptr, ptr %result, align 8 - %3 = load i32, ptr %2, align 8 - store i32 %3, ptr %i, align 4 - %4 = load i32, ptr %i, align 4 - store i32 %4, ptr %value1, align 4 - %5 = load i32, ptr %value1, align 4 - store i32 %5, ptr %temp2, align 4 - store ptr %temp2, ptr %result3, align 8 - %6 = load ptr, ptr %result3, align 8 - %7 = load float, ptr %6, align 8 - store float %7, ptr %f2, align 4 - %8 = load float, ptr %f, align 4 - %fpfpext = fpext float %8 to double - %9 = load i32, ptr %i, align 4 - %10 = load float, ptr %f2, align 4 - %fpfpext4 = fpext float %10 to double - call void (ptr, ...) @printf(ptr @.str, double %fpfpext, i32 %9, double %fpfpext4) - ret void \ No newline at end of file diff --git a/test/test_suite2/compile_time/untyped_conversions.c3t b/test/test_suite2/compile_time/untyped_conversions.c3t deleted file mode 100644 index 447f66f62..000000000 --- a/test/test_suite2/compile_time/untyped_conversions.c3t +++ /dev/null @@ -1,155 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; -struct Foo -{ - int a; int b; -} -fn void test(int[2] a, int[] b, int[<2>] c) -{ - io::printfln("%s %s %s", a, b, c); -} -fn void main() -{ - var $x = { { 1, 2 } }; - Foo[1] abc = (Foo[1])$x; - Foo def = (Foo)$x[0]; - int[2][1] y = (int[2][1])$x; - double[2][1] y2 = $x; - io::printfln("%s %s {%s, %s}", y, y2, def.a, def.b); - test({ 1, 2 }, { 3, 4}, { 5, 6 }); - var $a = { 2, 7 }; - test($a, $a, $a); -} - -/* #expect: test.ll - -%.introspect = type { i8, i64, i64, i64, [0 x i64] } -%Foo = type { i32, i32 } -%"int[]" = type { ptr, i64 } -%variant = type { ptr, i64 } - -@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@.str = private unnamed_addr constant [9 x i8] c"%s %s %s\00", align 1 -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$a2$int" = linkonce constant %.introspect { i8 15, i64 8, i64 ptrtoint (ptr @"ct$int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$sa$int" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (ptr @"ct$int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$v2$int" = linkonce constant %.introspect { i8 17, i64 8, i64 ptrtoint (ptr @"ct$int" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 -@.__const = private unnamed_addr constant [1 x %Foo] [%Foo { i32 1, i32 2 }], align 4 -@.__const.1 = private unnamed_addr constant %Foo { i32 1, i32 2 }, align 4 -@.__const.2 = private unnamed_addr constant [1 x [2 x i32]] [[2 x i32] [i32 1, i32 2]], align 4 -@.__const.3 = private unnamed_addr constant [1 x [2 x double]] [[2 x double] [double 1.000000e+00, double 2.000000e+00]], align 16 -@.str.4 = private unnamed_addr constant [15 x i8] c"%s %s {%s, %s}\00", align 1 -@"ct$a1$a2$int" = linkonce constant %.introspect { i8 15, i64 8, i64 ptrtoint (ptr @"ct$a2$int" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 -@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$a2$double" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (ptr @"ct$double" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$a1$a2$double" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (ptr @"ct$a2$double" to i64), i64 1, [0 x i64] zeroinitializer }, align 8 - -; Function Attrs: nounwind -define void @test_test(i64 %0, ptr %1, i64 %2, double %3) #0 { -entry: - %a = alloca [2 x i32], align 4 - %b = alloca %"int[]", align 8 - %c = alloca <2 x i32>, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [3 x %variant], align 16 - store i64 %0, ptr %a, align 4 - %4 = getelementptr inbounds { ptr, i64 }, ptr %b, i32 0, i32 0 - store ptr %1, ptr %4, align 8 - %5 = getelementptr inbounds { ptr, i64 }, ptr %b, i32 0, i32 1 - store i64 %2, ptr %5, align 8 - store double %3, ptr %c, align 8 - %6 = insertvalue %variant undef, ptr %a, 0 - %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$a2$int" to i64), 1 - %8 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %7, ptr %8, align 16 - %9 = insertvalue %variant undef, ptr %b, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$sa$int" to i64), 1 - %11 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %10, ptr %11, align 16 - %12 = insertvalue %variant undef, ptr %c, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$v2$int" to i64), 1 - %14 = getelementptr inbounds [3 x %variant], ptr %varargslots, i64 0, i64 2 - store %variant %13, ptr %14, align 16 - %15 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 3) - %not_err = icmp eq i64 %15, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - ret void -} - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %abc = alloca [1 x %Foo], align 4 - %def = alloca %Foo, align 4 - %y = alloca [1 x [2 x i32]], align 4 - %y2 = alloca [1 x [2 x double]], align 16 - %retparam = alloca i64, align 8 - %varargslots = alloca [4 x %variant], align 16 - %literal = alloca [2 x i32], align 4 - %literal1 = alloca [2 x i32], align 4 - %taddr = alloca <2 x i32>, align 8 - %literal2 = alloca [2 x i32], align 4 - %literal3 = alloca [2 x i32], align 4 - %taddr4 = alloca <2 x i32>, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %abc, ptr align 4 @.__const, i32 8, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %def, ptr align 4 @.__const.1, i32 8, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 @.__const.2, i32 8, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %y2, ptr align 16 @.__const.3, i32 16, i1 false) - %0 = insertvalue %variant undef, ptr %y, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$a1$a2$int" to i64), 1 - %2 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %1, ptr %2, align 16 - %3 = insertvalue %variant undef, ptr %y2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (ptr @"ct$a1$a2$double" to i64), 1 - %5 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %4, ptr %5, align 16 - %6 = getelementptr inbounds %Foo, ptr %def, i32 0, i32 0 - %7 = insertvalue %variant undef, ptr %6, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %9 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 2 - store %variant %8, ptr %9, align 16 - %10 = getelementptr inbounds %Foo, ptr %def, i32 0, i32 1 - %11 = insertvalue %variant undef, ptr %10, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %13 = getelementptr inbounds [4 x %variant], ptr %varargslots, i64 0, i64 3 - store %variant %12, ptr %13, align 16 - %14 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.4, i64 14, ptr %varargslots, i64 4) - %not_err = icmp eq i64 %14, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %15 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 0 - store i32 1, ptr %15, align 4 - %16 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 1 - store i32 2, ptr %16, align 4 - %17 = load i64, ptr %literal, align 4 - %18 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 0 - store i32 3, ptr %18, align 4 - %19 = getelementptr inbounds [2 x i32], ptr %literal1, i64 0, i64 1 - store i32 4, ptr %19, align 4 - store <2 x i32> , ptr %taddr, align 8 - %20 = load double, ptr %taddr, align 8 - call void @test_test(i64 %17, ptr %literal1, i64 2, double %20) - %21 = getelementptr inbounds [2 x i32], ptr %literal2, i64 0, i64 0 - store i32 2, ptr %21, align 4 - %22 = getelementptr inbounds [2 x i32], ptr %literal2, i64 0, i64 1 - store i32 7, ptr %22, align 4 - %23 = load i64, ptr %literal2, align 4 - %24 = getelementptr inbounds [2 x i32], ptr %literal3, i64 0, i64 0 - store i32 2, ptr %24, align 4 - %25 = getelementptr inbounds [2 x i32], ptr %literal3, i64 0, i64 1 - store i32 7, ptr %25, align 4 - store <2 x i32> , ptr %taddr4, align 8 - %26 = load double, ptr %taddr4, align 8 - call void @test_test(i64 %23, ptr %literal3, i64 2, double %26) - ret void -} diff --git a/test/test_suite2/defer/defer_static_var.c3t b/test/test_suite2/defer/defer_static_var.c3t deleted file mode 100644 index 7712cfb52..000000000 --- a/test/test_suite2/defer/defer_static_var.c3t +++ /dev/null @@ -1,204 +0,0 @@ -// #target: macos-x64 -module foo; -extern fn void printf(char*,...); - -fn int foo(int x) -{ - defer - { - static int y = 0; - y++; - printf("Here we go %d\n", y); - } - if (x > 0) return 2; - return x; -} - -macro void foo2(int x) -{ - printf("->%d\n", x); - for (int i = 0; i < 100; i++) - { - defer - { - static int y = 0; - y++; - printf(">%d--%d\n", i, y); - } - if (i == x) break; - printf("--"); - } -} - -fn void main() -{ - foo(1); - foo(2); - foo(-2); - foo2(0); - foo2(1); - foo2(2); -} - -/* #expect: foo.ll - -@"foo$y" = internal unnamed_addr global i32 0, align 4 -@"main$y" = internal unnamed_addr global i32 0, align 4 -@"main$y.7" = internal unnamed_addr global i32 0, align 4 -@"main$y.12" = internal unnamed_addr global i32 0, align 4 - -define i32 @foo_foo(i32 %0) #0 { -entry: - %gt = icmp sgt i32 %0, 0 - br i1 %gt, label %if.then, label %if.exit - -if.then: ; preds = %entry - %1 = load i32, ptr @"foo$y", align 4 - %add = add i32 %1, 1 - store i32 %add, ptr @"foo$y", align 4 - %2 = load i32, ptr @"foo$y", align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %2) - ret i32 2 - -if.exit: ; preds = %entry - %3 = load i32, ptr @"foo$y", align 4 - %add1 = add i32 %3, 1 - store i32 %add1, ptr @"foo$y", align 4 - %4 = load i32, ptr @"foo$y", align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %4) - ret i32 %0 -} - -define void @foo_main() #0 { -entry: - %x = alloca i32, align 4 - %i = alloca i32, align 4 - %x3 = alloca i32, align 4 - %i4 = alloca i32, align 4 - %x15 = alloca i32, align 4 - %i16 = alloca i32, align 4 - %0 = call i32 @foo_foo(i32 1) - %1 = call i32 @foo_foo(i32 2) - %2 = call i32 @foo_foo(i32 -2) - store i32 0, ptr %x, align 4 - %3 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.2, i32 %3) - store i32 0, ptr %i, align 4 - br label %loop.cond - -loop.cond: ; preds = %if.exit, %entry - %4 = load i32, ptr %i, align 4 - %lt = icmp slt i32 %4, 100 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %5 = load i32, ptr %i, align 4 - %6 = load i32, ptr %x, align 4 - %eq = icmp eq i32 %5, %6 - br i1 %eq, label %if.then, label %if.exit - -if.then: ; preds = %loop.body - %7 = load i32, ptr @"main$y", align 4 - %add = add i32 %7, 1 - store i32 %add, ptr @"main$y", align 4 - %8 = load i32, ptr %i, align 4 - %9 = load i32, ptr @"main$y", align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %8, i32 %9) - br label %loop.exit - -if.exit: ; preds = %loop.body - call void (ptr, ...) @printf(ptr @.str.4) - %10 = load i32, ptr @"main$y", align 4 - %add1 = add i32 %10, 1 - store i32 %add1, ptr @"main$y", align 4 - %11 = load i32, ptr %i, align 4 - %12 = load i32, ptr @"main$y", align 4 - call void (ptr, ...) @printf(ptr @.str.5, i32 %11, i32 %12) - %13 = load i32, ptr %i, align 4 - %add2 = add i32 %13, 1 - store i32 %add2, ptr %i, align 4 - br label %loop.cond - -loop.exit: ; preds = %if.then, %loop.cond - store i32 1, ptr %x3, align 4 - %14 = load i32, ptr %x3, align 4 - call void (ptr, ...) @printf(ptr @.str.6, i32 %14) - store i32 0, ptr %i4, align 4 - br label %loop.cond5 - -loop.cond5: ; preds = %if.exit11, %loop.exit - %15 = load i32, ptr %i4, align 4 - %lt6 = icmp slt i32 %15, 100 - br i1 %lt6, label %loop.body7, label %loop.exit14 - -loop.body7: ; preds = %loop.cond5 - %16 = load i32, ptr %i4, align 4 - %17 = load i32, ptr %x3, align 4 - %eq8 = icmp eq i32 %16, %17 - br i1 %eq8, label %if.then9, label %if.exit11 - -if.then9: ; preds = %loop.body7 - %18 = load i32, ptr @"main$y.7", align 4 - %add10 = add i32 %18, 1 - store i32 %add10, ptr @"main$y.7", align 4 - %19 = load i32, ptr %i4, align 4 - %20 = load i32, ptr @"main$y.7", align 4 - call void (ptr, ...) @printf(ptr @.str.8, i32 %19, i32 %20) - br label %loop.exit14 - -if.exit11: ; preds = %loop.body7 - call void (ptr, ...) @printf(ptr @.str.9) - %21 = load i32, ptr @"main$y.7", align 4 - %add12 = add i32 %21, 1 - store i32 %add12, ptr @"main$y.7", align 4 - %22 = load i32, ptr %i4, align 4 - %23 = load i32, ptr @"main$y.7", align 4 - call void (ptr, ...) @printf(ptr @.str.10, i32 %22, i32 %23) - %24 = load i32, ptr %i4, align 4 - %add13 = add i32 %24, 1 - store i32 %add13, ptr %i4, align 4 - br label %loop.cond5 - -loop.exit14: ; preds = %if.then9, %loop.cond5 - store i32 2, ptr %x15, align 4 - %25 = load i32, ptr %x15, align 4 - call void (ptr, ...) @printf(ptr @.str.11, i32 %25) - store i32 0, ptr %i16, align 4 - br label %loop.cond17 - -loop.cond17: ; preds = %if.exit23, %loop.exit14 - %26 = load i32, ptr %i16, align 4 - %lt18 = icmp slt i32 %26, 100 - br i1 %lt18, label %loop.body19, label %loop.exit26 - -loop.body19: ; preds = %loop.cond17 - %27 = load i32, ptr %i16, align 4 - %28 = load i32, ptr %x15, align 4 - %eq20 = icmp eq i32 %27, %28 - br i1 %eq20, label %if.then21, label %if.exit23 - -if.then21: ; preds = %loop.body19 - %29 = load i32, ptr @"main$y.12", align 4 - %add22 = add i32 %29, 1 - store i32 %add22, ptr @"main$y.12", align 4 - %30 = load i32, ptr %i16, align 4 - %31 = load i32, ptr @"main$y.12", align 4 - call void (ptr, ...) @printf(ptr @.str.13, i32 %30, i32 %31) - br label %loop.exit26 - -if.exit23: ; preds = %loop.body19 - call void (ptr, ...) @printf(ptr @.str.14) - %32 = load i32, ptr @"main$y.12", align 4 - %add24 = add i32 %32, 1 - store i32 %add24, ptr @"main$y.12", align 4 - %33 = load i32, ptr %i16, align 4 - %34 = load i32, ptr @"main$y.12", align 4 - call void (ptr, ...) @printf(ptr @.str.15, i32 %33, i32 %34) - %35 = load i32, ptr %i16, align 4 - %add25 = add i32 %35, 1 - store i32 %add25, ptr %i16, align 4 - br label %loop.cond17 - -loop.exit26: ; preds = %if.then21, %loop.cond17 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/enumerations/enum_associated_value.c3t b/test/test_suite2/enumerations/enum_associated_value.c3t deleted file mode 100644 index 980cd93b1..000000000 --- a/test/test_suite2/enumerations/enum_associated_value.c3t +++ /dev/null @@ -1,52 +0,0 @@ -// #target: macos-x64 -module test; -import libc; - -enum Foo : uint (int val, char* testme) -{ - A(123, "Number A"), - B(333, "Number B"), -} - -fn void main() -{ - int x = Foo.A.val; - Foo f = Foo.B; - Foo g = Foo.A; - libc::printf("%d (%s) %d (%s)\n", f.val, f.testme, g.val, g.testme); -} - -/* #expect: test.ll - -@"ct$uint" = linkonce constant %.introspect { i8 3, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$test_Foo" = linkonce constant { i8, i64, i64, i64, [2 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (ptr @"ct$uint" to i64), i64 2, [2 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 1 }, %"char[]" { ptr @.enum.1, i64 1 }] }, align 8 -@"test_Foo$val" = linkonce constant [2 x i32] [i32 123, i32 333], align 4 -@.str = private unnamed_addr constant [9 x i8] c"Number A\00", align 1 -@.str.1 = private unnamed_addr constant [9 x i8] c"Number B\00", align 1 -@"test_Foo$testme" = linkonce constant [2 x ptr] [ptr @.str, ptr @.str.1], align 8 -@.str.2 = private unnamed_addr constant [17 x i8] c"%d (%s) %d (%s)\0A\00", align 1 - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %x = alloca i32, align 4 - %f = alloca i32, align 4 - %g = alloca i32, align 4 - store i32 123, ptr %x, align 4 - store i32 1, ptr %f, align 4 - store i32 0, ptr %g, align 4 - %0 = load i32, ptr %f, align 4 - %1 = getelementptr inbounds [2 x i32], ptr @"test_Foo$val", i32 0, i32 %0 - %2 = load i32, ptr %1, align 4 - %3 = load i32, ptr %f, align 4 - %4 = getelementptr inbounds [2 x ptr], ptr @"test_Foo$testme", i32 0, i32 %3 - %5 = load ptr, ptr %4, align 8 - %6 = load i32, ptr %g, align 4 - %7 = getelementptr inbounds [2 x i32], ptr @"test_Foo$val", i32 0, i32 %6 - %8 = load i32, ptr %7, align 4 - %9 = load i32, ptr %g, align 4 - %10 = getelementptr inbounds [2 x ptr], ptr @"test_Foo$testme", i32 0, i32 %9 - %11 = load ptr, ptr %10, align 8 - %12 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %2, ptr %5, i32 %8, ptr %11) - ret void -} diff --git a/test/test_suite2/enumerations/enum_values.c3t b/test/test_suite2/enumerations/enum_values.c3t deleted file mode 100644 index 7e69c75da..000000000 --- a/test/test_suite2/enumerations/enum_values.c3t +++ /dev/null @@ -1,40 +0,0 @@ -// #target: macos-x64 - -module test; - -enum Foo -{ - ABC, - BCD -} - -Foo zfok = Foo.values[0]; -Foo[] zw = &&Foo.values; - -fn void test(int x) -{ - Foo zonk = Foo.values[x]; -} - -/* #expect: test.ll - -%"Foo[]" = type { ptr, i64 } - -@test_zfok = local_unnamed_addr global i32 0, align 4 -@.taddr = private global [2 x i32] [i32 0, i32 1], align 4 -@test_zw = local_unnamed_addr global %"Foo[]" { ptr @.taddr, i64 2 }, align 8 - -define void @test_test(i32 %0) #0 { -entry: - %zonk = alloca i32, align 4 - %literal = alloca [2 x i32], align 4 - %1 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 0 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 1 - store i32 1, ptr %2, align 4 - %sisiext = sext i32 %0 to i64 - %3 = getelementptr inbounds [2 x i32], ptr %literal, i64 0, i64 %sisiext - %4 = load i32, ptr %3, align 4 - store i32 %4, ptr %zonk, align 4 - ret void -} diff --git a/test/test_suite2/errors/error_introspect.c3t b/test/test_suite2/errors/error_introspect.c3t deleted file mode 100644 index 91f7333be..000000000 --- a/test/test_suite2/errors/error_introspect.c3t +++ /dev/null @@ -1,97 +0,0 @@ -// #target: macos-x64 -module foo; -import std::io; - -fault Foo -{ - BAR, - BAZ -} - -fn void main() -{ - char[][] x = Foo.names; - io::printfln("Foo.names: %s", x); - io::printfln("Foo.values: %s", Foo.values); - io::printfln("Foo.elements: %s", Foo.elements); -} - -/* #expect: foo.ll - -@"foo_Foo$BAR" = linkonce constant %.fault { i64 ptrtoint (ptr @"ct$foo_Foo" to i64), %"char[]" { ptr @.fault, i64 3 } }, align 8 -@.fault = internal constant [4 x i8] c"BAR\00", align 1 -@"foo_Foo$BAZ" = linkonce constant %.fault { i64 ptrtoint (ptr @"ct$foo_Foo" to i64), %"char[]" { ptr @.fault.1, i64 3 } }, align 8 -@.fault.1 = internal constant [4 x i8] c"BAZ\00", align 1 -@"ct$foo_Foo" = linkonce constant %.introspect { i8 9, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@.str = private unnamed_addr constant [4 x i8] c"BAR\00", align 1 -@.str.2 = private unnamed_addr constant [4 x i8] c"BAZ\00", align 1 -@.str.3 = private unnamed_addr constant [14 x i8] c"Foo.names: %s\00", align 1 -@"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (ptr @"ct$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$sa$sa$char" = linkonce constant %.introspect { i8 16, i64 16, i64 ptrtoint (ptr @"ct$sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@.str.4 = private unnamed_addr constant [15 x i8] c"Foo.values: %s\00", align 1 -@"ct$a2$foo_Foo" = linkonce constant %.introspect { i8 15, i64 16, i64 ptrtoint (ptr @"ct$foo_Foo" to i64), i64 2, [0 x i64] zeroinitializer }, align 8 -@.str.5 = private unnamed_addr constant [17 x i8] c"Foo.elements: %s\00", align 1 -@"ct$long" = linkonce constant %.introspect { i8 2, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - -entry: - %x = alloca %"char[][]", align 8 - %literal = alloca [2 x %"char[]"], align 16 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %literal3 = alloca [2 x i64], align 16 - %retparam7 = alloca i64, align 8 - %varargslots8 = alloca [1 x %variant], align 16 - %taddr = alloca i64, align 8 - %0 = getelementptr inbounds [2 x %"char[]"], ptr %literal, i64 0, i64 0 - store %"char[]" { ptr @.str, i64 3 }, ptr %0, align 8 - %1 = getelementptr inbounds [2 x %"char[]"], ptr %literal, i64 0, i64 1 - store %"char[]" { ptr @.str.2, i64 3 }, ptr %1, align 8 - %2 = insertvalue %"char[][]" undef, ptr %literal, 0 - %3 = insertvalue %"char[][]" %2, i64 2, 1 - store %"char[][]" %3, ptr %x, align 8 - %4 = insertvalue %variant undef, ptr %x, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$sa$sa$char" to i64), 1 - %6 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %5, ptr %6, align 16 - %7 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.3, i64 13, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %7, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %8 = getelementptr inbounds [2 x i64], ptr %literal3, i64 0, i64 0 - store i64 ptrtoint (ptr @"foo_Foo$BAR" to i64), ptr %8, align 8 - %9 = getelementptr inbounds [2 x i64], ptr %literal3, i64 0, i64 1 - store i64 ptrtoint (ptr @"foo_Foo$BAZ" to i64), ptr %9, align 8 - %10 = insertvalue %variant undef, ptr %literal3, 0 - %11 = insertvalue %variant %10, i64 ptrtoint (ptr @"ct$a2$foo_Foo" to i64), 1 - %12 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %11, ptr %12, align 16 - %13 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.4, i64 14, ptr %varargslots2, i64 1) - %not_err4 = icmp eq i64 %13, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %voiderr - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %voiderr - store i64 2, ptr %taddr, align 8 - %14 = insertvalue %variant undef, ptr %taddr, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$long" to i64), 1 - %16 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 - store %variant %15, ptr %16, align 16 - %17 = call i64 @std_io_printfln(ptr %retparam7, ptr @.str.5, i64 16, ptr %varargslots8, i64 1) - %not_err9 = icmp eq i64 %17, 0 - br i1 %not_err9, label %after_check10, label %voiderr11 - -after_check10: ; preds = %voiderr6 - br label %voiderr11 - -voiderr11: ; preds = %after_check10, %voiderr6 - ret void -} diff --git a/test/test_suite2/errors/error_regression_2.c3t b/test/test_suite2/errors/error_regression_2.c3t deleted file mode 100644 index 5021b89c5..000000000 --- a/test/test_suite2/errors/error_regression_2.c3t +++ /dev/null @@ -1,870 +0,0 @@ -// #target: macos-x64 -module test; -import std; -import libc; - -struct Doc { Head *head; } -struct Head { char[]* title; } - -struct Summary -{ - char[]* title; - bool ok; -} - -fn void Summary.print(Summary *s, CFile out) -{ - // We don't have a native printf in C3 yet, so use libc, - // which is not all that nice for the strings but... - char[] title = s.title ? *s.title : "missing"; - libc::fprintf(out, "Summary({ .title = %.*s, .ok = %s})", (int)title.len, title.ptr, s.ok ? (char*)"true" : (char*)"false"); -} - -fn bool contains(char[] haystack, char[] needle) -{ - usz len = haystack.len; - usz needle_len = needle.len; - if (len < needle_len) return false; - if (!needle_len) return true; - len -= needle_len - 1; - for (usz i = 0; i < len; i++) - { - if (libc::memcmp(&haystack[i], needle.ptr, needle_len) == 0) - { - return true; - } - } - return false; -} - -macro dupe(value) -{ - $typeof(&value) temp = malloc($sizeof(value)); - if (!temp) return ReadError.OUT_OF_MEMORY!; - *temp = value; - return temp; -} - -fault ReadError -{ - BAD_READ, - OUT_OF_MEMORY -} - -fn Doc! readDoc(char[] url) -{ - if (contains(url, "fail")) return ReadError.BAD_READ!; - if (contains(url, "head-missing")) return { .head = null }; - if (contains(url, "title-missing")) return { dupe(Head { .title = null })? }; - if (contains(url, "title-empty")) return { dupe(Head { .title = dupe((char[])"")? })? }; - // Not particularly elegant due to missing string functions. - int len = libc::snprintf(null, 0, "Title of %.*s", (int)url.len, url.ptr); - char* str = malloc(len + 1); - if (!str) return ReadError.OUT_OF_MEMORY!; - libc::snprintf(str, len + 1, "Title of %.*s", (int)url.len, url.ptr); - return { dupe(Head { .title = dupe(str[..len - 1])? })? }; -} - -fn Summary buildSummary(Doc doc) -{ - return Summary { - .title = doc.head ? doc.head.title : null, - .ok = true, - }; -} - -fn Summary readAndBuildSummary(char[] url) -{ - return buildSummary(readDoc(url)) ?? Summary { .title = null, .ok = false }; - /* - // or - Summary summary = buildSummary(readDoc(url)); - if (catch summary) return Summary { .title = null, .ok = false }; - return summary; - // or - Summary summary = buildSummary(readDoc(url)); - if (try summary) return summary; - return Summary { .title = null, .ok = false }; - */ -} - - -fault TitleResult -{ - TITLE_MISSING -} - -fn bool! isTitleNonEmpty(Doc doc) -{ - if (!doc.head) return TitleResult.TITLE_MISSING!; - char[]* head = doc.head.title; - if (!head) return TitleResult.TITLE_MISSING!; - return (*head).len > 0; -} - - -fn bool! readWhetherTitleNonEmpty(char[] url) -{ - return isTitleNonEmpty(readDoc(url)); -} - -fn char* bool_to_string(bool b) -{ - return b ? "true" : "false"; -} -fn char* nameFromError(anyerr e) -{ - switch (e) - { - case TitleResult.TITLE_MISSING: - return "no title"; - case ReadError.BAD_READ: - return "bad read"; - case ReadError.OUT_OF_MEMORY: - return "out of memory"; - default: - return "unknown error"; - } -} - - -fn void main() -{ - const char[][] URLS = { "good", "title-empty", "title-missing", "head-missing", "fail" }; - foreach (char[] url : URLS) - { - // Yes, it's pretty onerous to print strings for the moment in C3 - libc::printf(`Checking "https://%.*s/":` "\n", (int)url.len, url.ptr); - Summary summary = readAndBuildSummary(url); - libc::printf(" Summary: "); - summary.print(libc::stdout()); - libc::printf("\n"); - char[] title_sure = summary.title ? *summary.title : ""; - libc::printf(" Title: %.*s\n", (int)title_sure.len, title_sure.ptr); - bool! has_title = readWhetherTitleNonEmpty(url); - // This looks a bit less than elegant, but as you see it's mostly due to having to - // use printf here. - libc::printf(" Has title: %s vs %s\n", bool_to_string(has_title) ?? nameFromError(catch(has_title)), (has_title ?? false) ? (char*)"true" : (char*)"false"); - } -} - -/* #expect: test.ll - -define void @test_Summary_print(ptr %0, ptr %1) #0 { -entry: - %title = alloca %"char[]", align 8 - %2 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0 - %3 = load ptr, ptr %2, align 8 - %ptrbool = icmp ne ptr %3, null - br i1 %ptrbool, label %cond.lhs, label %cond.rhs - -cond.lhs: ; preds = %entry - %4 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %6 = load %"char[]", ptr %5, align 8 - br label %cond.phi - -cond.rhs: ; preds = %entry - br label %cond.phi - -cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %"char[]" [ %6, %cond.lhs ], [ { ptr @.str.28, i64 7 }, %cond.rhs ] - store %"char[]" %val, ptr %title, align 8 - %7 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 1 - %8 = load i64, ptr %7, align 8 - %uisitrunc = trunc i64 %8 to i32 - %9 = getelementptr inbounds %"char[]", ptr %title, i32 0, i32 0 - %10 = load ptr, ptr %9, align 8 - %11 = getelementptr inbounds %Summary, ptr %0, i32 0, i32 1 - %12 = load i8, ptr %11, align 8 - %13 = trunc i8 %12 to i1 - %ternary = select i1 %13, ptr @.str.30, ptr @.str.31 - %14 = call i32 (ptr, ptr, ...) @fprintf(ptr %1, ptr @.str.29, i32 %uisitrunc, ptr %10, ptr %ternary) - ret void -} - -; Function Attrs: nounwind -define zeroext i8 @test_contains(ptr %0, i64 %1, ptr %2, i64 %3) #0 { -entry: - %haystack = alloca %"char[]", align 8 - %needle = alloca %"char[]", align 8 - %len = alloca i64, align 8 - %needle_len = alloca i64, align 8 - %i = alloca i64, align 8 - %4 = getelementptr inbounds { ptr, i64 }, ptr %haystack, i32 0, i32 0 - store ptr %0, ptr %4, align 8 - %5 = getelementptr inbounds { ptr, i64 }, ptr %haystack, i32 0, i32 1 - store i64 %1, ptr %5, align 8 - %6 = getelementptr inbounds { ptr, i64 }, ptr %needle, i32 0, i32 0 - store ptr %2, ptr %6, align 8 - %7 = getelementptr inbounds { ptr, i64 }, ptr %needle, i32 0, i32 1 - store i64 %3, ptr %7, align 8 - %8 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 1 - %9 = load i64, ptr %8, align 8 - store i64 %9, ptr %len, align 8 - %10 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 1 - %11 = load i64, ptr %10, align 8 - store i64 %11, ptr %needle_len, align 8 - %12 = load i64, ptr %len, align 8 - %13 = load i64, ptr %needle_len, align 8 - %lt = icmp ult i64 %12, %13 - br i1 %lt, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i8 0 - -if.exit: ; preds = %entry - %14 = load i64, ptr %needle_len, align 8 - %not = icmp eq i64 %14, 0 - br i1 %not, label %if.then1, label %if.exit2 - -if.then1: ; preds = %if.exit - ret i8 1 - -if.exit2: ; preds = %if.exit - %15 = load i64, ptr %len, align 8 - %16 = load i64, ptr %needle_len, align 8 - %sub = sub i64 %16, 1 - %sub3 = sub i64 %15, %sub - store i64 %sub3, ptr %len, align 8 - store i64 0, ptr %i, align 8 - br label %loop.cond - -loop.cond: ; preds = %if.exit6, %if.exit2 - %17 = load i64, ptr %i, align 8 - %18 = load i64, ptr %len, align 8 - %lt4 = icmp ult i64 %17, %18 - br i1 %lt4, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %19 = getelementptr inbounds %"char[]", ptr %haystack, i32 0, i32 0 - %20 = load ptr, ptr %19, align 8 - %21 = load i64, ptr %i, align 8 - %ptroffset = getelementptr inbounds i8, ptr %20, i64 %21 - %22 = getelementptr inbounds %"char[]", ptr %needle, i32 0, i32 0 - %23 = load ptr, ptr %22, align 8 - %24 = load i64, ptr %needle_len, align 8 - %25 = call i32 @memcmp(ptr %ptroffset, ptr %23, i64 %24) - %eq = icmp eq i32 %25, 0 - br i1 %eq, label %if.then5, label %if.exit6 - -if.then5: ; preds = %loop.body - ret i8 1 - -if.exit6: ; preds = %loop.body - %26 = load i64, ptr %i, align 8 - %add = add i64 %26, 1 - store i64 %add, ptr %i, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - ret i8 0 -} - -; Function Attrs: nounwind -define i64 @test_readDoc(ptr %0, ptr %1, i64 %2) #0 { -entry: - %url = alloca %"char[]", align 8 - %reterr = alloca i64, align 8 - %literal = alloca %Doc, align 8 - %reterr8 = alloca i64, align 8 - %literal9 = alloca %Doc, align 8 - %error_var = alloca i64, align 8 - %value = alloca %Head, align 8 - %literal10 = alloca %Head, align 8 - %temp = alloca ptr, align 8 - %reterr17 = alloca i64, align 8 - %literal18 = alloca %Doc, align 8 - %error_var19 = alloca i64, align 8 - %value20 = alloca %Head, align 8 - %literal21 = alloca %Head, align 8 - %error_var22 = alloca i64, align 8 - %value23 = alloca %"char[]", align 8 - %temp24 = alloca ptr, align 8 - %temp30 = alloca ptr, align 8 - %len = alloca i32, align 4 - %str = alloca ptr, align 8 - %reterr43 = alloca i64, align 8 - %literal44 = alloca %Doc, align 8 - %error_var45 = alloca i64, align 8 - %value46 = alloca %Head, align 8 - %literal47 = alloca %Head, align 8 - %error_var48 = alloca i64, align 8 - %value49 = alloca %"char[]", align 8 - %temp50 = alloca ptr, align 8 - %temp56 = alloca ptr, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 0 - store ptr %1, ptr %3, align 8 - %4 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 1 - store i64 %2, ptr %4, align 8 - %5 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo = load ptr, ptr %5, align 8 - %6 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi = load i64, ptr %6, align 8 - %7 = call i8 @test_contains(ptr %lo, i64 %hi, ptr @.str, i64 4) - %8 = trunc i8 %7 to i1 - br i1 %8, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i64 ptrtoint (ptr @"test_ReadError$BAD_READ" to i64) - -if.exit: ; preds = %entry - %9 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo1 = load ptr, ptr %9, align 8 - %10 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi2 = load i64, ptr %10, align 8 - %11 = call i8 @test_contains(ptr %lo1, i64 %hi2, ptr @.str.3, i64 12) - %12 = trunc i8 %11 to i1 - br i1 %12, label %if.then3, label %if.exit4 - -if.then3: ; preds = %if.exit - %13 = getelementptr inbounds %Doc, ptr %literal, i32 0, i32 0 - store ptr null, ptr %13, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal, i32 8, i1 false) - ret i64 0 - -if.exit4: ; preds = %if.exit - %14 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo5 = load ptr, ptr %14, align 8 - %15 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi6 = load i64, ptr %15, align 8 - %16 = call i8 @test_contains(ptr %lo5, i64 %hi6, ptr @.str.4, i64 13) - %17 = trunc i8 %16 to i1 - br i1 %17, label %if.then7, label %if.exit13 - -if.then7: ; preds = %if.exit4 - %18 = getelementptr inbounds %Doc, ptr %literal9, i32 0, i32 0 - %19 = getelementptr inbounds %Head, ptr %literal10, i32 0, i32 0 - store ptr null, ptr %19, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value, ptr align 8 %literal10, i32 8, i1 false) - %20 = call ptr @std_core_mem_malloc(i64 8) #2 - store ptr %20, ptr %temp, align 8 - %21 = load ptr, ptr %temp, align 8 - %not = icmp eq ptr %21, null - br i1 %not, label %if.then11, label %if.exit12 - -if.then11: ; preds = %if.then7 - store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var, align 8 - br label %guard_block - -if.exit12: ; preds = %if.then7 - %22 = load ptr, ptr %temp, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %22, ptr align 8 %value, i32 8, i1 false) - br label %noerr_block - -guard_block: ; preds = %if.then11 - %23 = load i64, ptr %error_var, align 8 - ret i64 %23 - -noerr_block: ; preds = %if.exit12 - %24 = load ptr, ptr %temp, align 8 - store ptr %24, ptr %18, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal9, i32 8, i1 false) - ret i64 0 - -if.exit13: ; preds = %if.exit4 - %25 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo14 = load ptr, ptr %25, align 8 - %26 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi15 = load i64, ptr %26, align 8 - %27 = call i8 @test_contains(ptr %lo14, i64 %hi15, ptr @.str.5, i64 11) - %28 = trunc i8 %27 to i1 - br i1 %28, label %if.then16, label %if.exit36 - -if.then16: ; preds = %if.exit13 - %29 = getelementptr inbounds %Doc, ptr %literal18, i32 0, i32 0 - store ptr null, ptr %literal21, align 8 - %30 = getelementptr inbounds %Head, ptr %literal21, i32 0, i32 0 - store %"char[]" zeroinitializer, ptr %value23, align 8 - %31 = call ptr @std_core_mem_malloc(i64 16) #2 - store ptr %31, ptr %temp24, align 8 - %32 = load ptr, ptr %temp24, align 8 - %not25 = icmp eq ptr %32, null - br i1 %not25, label %if.then26, label %if.exit27 - -if.then26: ; preds = %if.then16 - store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var22, align 8 - br label %guard_block28 - -if.exit27: ; preds = %if.then16 - %33 = load ptr, ptr %temp24, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %33, ptr align 8 %value23, i32 16, i1 false) - br label %noerr_block29 - -guard_block28: ; preds = %if.then26 - %34 = load i64, ptr %error_var22, align 8 - ret i64 %34 - -noerr_block29: ; preds = %if.exit27 - %35 = load ptr, ptr %temp24, align 8 - store ptr %35, ptr %30, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value20, ptr align 8 %literal21, i32 8, i1 false) - %36 = call ptr @std_core_mem_malloc(i64 8) #2 - store ptr %36, ptr %temp30, align 8 - %37 = load ptr, ptr %temp30, align 8 - %not31 = icmp eq ptr %37, null - br i1 %not31, label %if.then32, label %if.exit33 - -if.then32: ; preds = %noerr_block29 - store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var19, align 8 - br label %guard_block34 - -if.exit33: ; preds = %noerr_block29 - %38 = load ptr, ptr %temp30, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %38, ptr align 8 %value20, i32 8, i1 false) - br label %noerr_block35 - -guard_block34: ; preds = %if.then32 - %39 = load i64, ptr %error_var19, align 8 - ret i64 %39 - -noerr_block35: ; preds = %if.exit33 - %40 = load ptr, ptr %temp30, align 8 - store ptr %40, ptr %29, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal18, i32 8, i1 false) - ret i64 0 - -if.exit36: ; preds = %if.exit13 - %41 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %42 = load i64, ptr %41, align 8 - %uisitrunc = trunc i64 %42 to i32 - %43 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %44 = load ptr, ptr %43, align 8 - %45 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @.str.7, i32 %uisitrunc, ptr %44) - store i32 %45, ptr %len, align 4 - %46 = load i32, ptr %len, align 4 - %siuiext = sext i32 %46 to i64 - %add = add i64 %siuiext, 1 - %47 = call ptr @std_core_mem_malloc(i64 %add) #2 - store ptr %47, ptr %str, align 8 - %48 = load ptr, ptr %str, align 8 - %not37 = icmp eq ptr %48, null - br i1 %not37, label %if.then38, label %if.exit39 - -if.then38: ; preds = %if.exit36 - ret i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64) - -if.exit39: ; preds = %if.exit36 - %49 = load ptr, ptr %str, align 8 - %50 = load i32, ptr %len, align 4 - %siuiext40 = sext i32 %50 to i64 - %add41 = add i64 %siuiext40, 1 - %51 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %52 = load i64, ptr %51, align 8 - %uisitrunc42 = trunc i64 %52 to i32 - %53 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %54 = load ptr, ptr %53, align 8 - %55 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr %49, i64 %add41, ptr @.str.8, i32 %uisitrunc42, ptr %54) - %56 = getelementptr inbounds %Doc, ptr %literal44, i32 0, i32 0 - store ptr null, ptr %literal47, align 8 - %57 = getelementptr inbounds %Head, ptr %literal47, i32 0, i32 0 - %58 = load ptr, ptr %str, align 8 - %59 = load i32, ptr %len, align 4 - %sub = sub i32 %59, 1 - %sisiext = sext i32 %sub to i64 - %60 = add i64 %sisiext, 1 - %size = sub i64 %60, 0 - %ptroffset = getelementptr inbounds i8, ptr %58, i64 0 - %61 = insertvalue %"char[]" undef, ptr %ptroffset, 0 - %62 = insertvalue %"char[]" %61, i64 %size, 1 - store %"char[]" %62, ptr %value49, align 8 - %63 = call ptr @std_core_mem_malloc(i64 16) #2 - store ptr %63, ptr %temp50, align 8 - %64 = load ptr, ptr %temp50, align 8 - %not51 = icmp eq ptr %64, null - br i1 %not51, label %if.then52, label %if.exit53 - -if.then52: ; preds = %if.exit39 - store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var48, align 8 - br label %guard_block54 - -if.exit53: ; preds = %if.exit39 - %65 = load ptr, ptr %temp50, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %65, ptr align 8 %value49, i32 16, i1 false) - br label %noerr_block55 - -guard_block54: ; preds = %if.then52 - %66 = load i64, ptr %error_var48, align 8 - ret i64 %66 - -noerr_block55: ; preds = %if.exit53 - %67 = load ptr, ptr %temp50, align 8 - store ptr %67, ptr %57, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %value46, ptr align 8 %literal47, i32 8, i1 false) - %68 = call ptr @std_core_mem_malloc(i64 8) #2 - store ptr %68, ptr %temp56, align 8 - %69 = load ptr, ptr %temp56, align 8 - %not57 = icmp eq ptr %69, null - br i1 %not57, label %if.then58, label %if.exit59 - -if.then58: ; preds = %noerr_block55 - store i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), ptr %error_var45, align 8 - br label %guard_block60 - -if.exit59: ; preds = %noerr_block55 - %70 = load ptr, ptr %temp56, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %70, ptr align 8 %value46, i32 8, i1 false) - br label %noerr_block61 - -guard_block60: ; preds = %if.then58 - %71 = load i64, ptr %error_var45, align 8 - ret i64 %71 - -noerr_block61: ; preds = %if.exit59 - %72 = load ptr, ptr %temp56, align 8 - store ptr %72, ptr %56, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %0, ptr align 8 %literal44, i32 8, i1 false) - ret i64 0 -} - -; Function Attrs: nounwind -define { ptr, i8 } @test_buildSummary(ptr %0) #0 { -entry: - %doc = alloca %Doc, align 8 - %literal = alloca %Summary, align 8 - %1 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 - store ptr %0, ptr %1, align 8 - %2 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0 - store ptr null, ptr %2, align 8 - %3 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1 - store i8 0, ptr %3, align 8 - %4 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0 - %5 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 - %6 = load ptr, ptr %5, align 8 - %ptrbool = icmp ne ptr %6, null - br i1 %ptrbool, label %cond.lhs, label %cond.rhs - -cond.lhs: ; preds = %entry - %7 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - %9 = getelementptr inbounds %Head, ptr %8, i32 0, i32 0 - %10 = load ptr, ptr %9, align 8 - br label %cond.phi - -cond.rhs: ; preds = %entry - br label %cond.phi - -cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi ptr [ %10, %cond.lhs ], [ null, %cond.rhs ] - store ptr %val, ptr %4, align 8 - %11 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1 - store i8 1, ptr %11, align 8 - %12 = load { ptr, i8 }, ptr %literal, align 8 - ret { ptr, i8 } %12 -} - -; Function Attrs: nounwind -define { ptr, i8 } @test_readAndBuildSummary(ptr %0, i64 %1) #0 { -entry: - %url = alloca %"char[]", align 8 - %retparam = alloca %Doc, align 8 - %result = alloca %Summary, align 8 - %literal = alloca %Summary, align 8 - %taddr = alloca %Summary, align 8 - %2 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - %4 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo = load ptr, ptr %4, align 8 - %5 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi = load i64, ptr %5, align 8 - %6 = call i64 @test_readDoc(ptr %retparam, ptr %lo, i64 %hi) - %not_err = icmp eq i64 %6, 0 - br i1 %not_err, label %after_check, label %else_block - -after_check: ; preds = %entry - %7 = getelementptr inbounds %Doc, ptr %retparam, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - %9 = call { ptr, i8 } @test_buildSummary(ptr %8) - store { ptr, i8 } %9, ptr %result, align 8 - %10 = load %Summary, ptr %result, align 8 - br label %phi_block - -else_block: ; preds = %entry - %11 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 0 - store ptr null, ptr %11, align 8 - %12 = getelementptr inbounds %Summary, ptr %literal, i32 0, i32 1 - store i8 0, ptr %12, align 8 - %13 = load %Summary, ptr %literal, align 8 - br label %phi_block - -phi_block: ; preds = %else_block, %after_check - %val = phi %Summary [ %10, %after_check ], [ %13, %else_block ] - store %Summary %val, ptr %taddr, align 8 - %14 = load { ptr, i8 }, ptr %taddr, align 8 - ret { ptr, i8 } %14 -} - -; Function Attrs: nounwind -define i64 @test_isTitleNonEmpty(ptr %0, ptr %1) #0 { -entry: - %doc = alloca %Doc, align 8 - %head = alloca ptr, align 8 - %reterr = alloca i64, align 8 - %2 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 - store ptr %1, ptr %2, align 8 - %3 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 - %4 = load ptr, ptr %3, align 8 - %not = icmp eq ptr %4, null - br i1 %not, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i64 ptrtoint (ptr @"test_TitleResult$TITLE_MISSING" to i64) - -if.exit: ; preds = %entry - %5 = getelementptr inbounds %Doc, ptr %doc, i32 0, i32 0 - %6 = load ptr, ptr %5, align 8 - %7 = getelementptr inbounds %Head, ptr %6, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - store ptr %8, ptr %head, align 8 - %9 = load ptr, ptr %head, align 8 - %not1 = icmp eq ptr %9, null - br i1 %not1, label %if.then2, label %if.exit3 - -if.then2: ; preds = %if.exit - ret i64 ptrtoint (ptr @"test_TitleResult$TITLE_MISSING" to i64) - -if.exit3: ; preds = %if.exit - %10 = load ptr, ptr %head, align 8 - %11 = getelementptr inbounds %"char[]", ptr %10, i32 0, i32 1 - %12 = load i64, ptr %11, align 8 - %lt = icmp ult i64 0, %12 - %13 = zext i1 %lt to i8 - store i8 %13, ptr %0, align 1 - ret i64 0 -} - -; Function Attrs: nounwind -define i64 @test_readWhetherTitleNonEmpty(ptr %0, ptr %1, i64 %2) #0 { -entry: - %url = alloca %"char[]", align 8 - %reterr = alloca i64, align 8 - %retparam = alloca i8, align 1 - %retparam1 = alloca %Doc, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 0 - store ptr %1, ptr %3, align 8 - %4 = getelementptr inbounds { ptr, i64 }, ptr %url, i32 0, i32 1 - store i64 %2, ptr %4, align 8 - %5 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo = load ptr, ptr %5, align 8 - %6 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi = load i64, ptr %6, align 8 - %7 = call i64 @test_readDoc(ptr %retparam1, ptr %lo, i64 %hi) - %not_err = icmp eq i64 %7, 0 - br i1 %not_err, label %after_check, label %assign_optional - -assign_optional: ; preds = %entry - store i64 %7, ptr %reterr, align 8 - br label %err_retblock - -after_check: ; preds = %entry - %8 = getelementptr inbounds %Doc, ptr %retparam1, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = call i64 @test_isTitleNonEmpty(ptr %retparam, ptr %9) - %not_err2 = icmp eq i64 %10, 0 - br i1 %not_err2, label %after_check4, label %assign_optional3 - -assign_optional3: ; preds = %after_check - store i64 %10, ptr %reterr, align 8 - br label %err_retblock - -after_check4: ; preds = %after_check - %11 = load i8, ptr %retparam, align 1 - store i8 %11, ptr %0, align 1 - ret i64 0 - -err_retblock: ; preds = %assign_optional3, %assign_optional - %12 = load i64, ptr %reterr, align 8 - ret i64 %12 -} - -; Function Attrs: nounwind -define ptr @test_bool_to_string(i8 zeroext %0) #0 { -entry: - %1 = trunc i8 %0 to i1 - %ternary = select i1 %1, %"char[]" { ptr @.str.9, i64 4 }, %"char[]" { ptr @.str.10, i64 5 } - %2 = extractvalue %"char[]" %ternary, 0 - ret ptr %2 -} - -; Function Attrs: nounwind -define ptr @test_nameFromError(i64 %0) #0 { -entry: - %switch = alloca i64, align 8 - store i64 %0, ptr %switch, align 8 - br label %switch.entry - -switch.entry: ; preds = %entry - %1 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"test_TitleResult$TITLE_MISSING" to i64), %1 - br i1 %eq, label %switch.case, label %next_if - -switch.case: ; preds = %switch.entry - ret ptr @.str.11 - -next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (ptr @"test_ReadError$BAD_READ" to i64), %1 - br i1 %eq1, label %switch.case2, label %next_if3 - -switch.case2: ; preds = %next_if - ret ptr @.str.12 - -next_if3: ; preds = %next_if - %eq4 = icmp eq i64 ptrtoint (ptr @"test_ReadError$OUT_OF_MEMORY" to i64), %1 - br i1 %eq4, label %switch.case5, label %next_if6 - -switch.case5: ; preds = %next_if3 - ret ptr @.str.13 - -next_if6: ; preds = %next_if3 - br label %switch.default - -switch.default: ; preds = %next_if6 - ret ptr @.str.14 -} - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %URLS = alloca %"char[][]", align 8 - %literal = alloca [5 x %"char[]"], align 16 - %.anon = alloca i64, align 8 - %.anon1 = alloca i64, align 8 - %url = alloca %"char[]", align 8 - %summary = alloca %Summary, align 8 - %result = alloca %Summary, align 8 - %title_sure = alloca %"char[]", align 8 - %has_title = alloca i8, align 1 - %has_title.f = alloca i64, align 8 - %retparam = alloca i8, align 1 - %0 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 0 - store %"char[]" { ptr @.str.15, i64 4 }, ptr %0, align 8 - %1 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 1 - store %"char[]" { ptr @.str.16, i64 11 }, ptr %1, align 8 - %2 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 2 - store %"char[]" { ptr @.str.17, i64 13 }, ptr %2, align 8 - %3 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 3 - store %"char[]" { ptr @.str.18, i64 12 }, ptr %3, align 8 - %4 = getelementptr inbounds [5 x %"char[]"], ptr %literal, i64 0, i64 4 - store %"char[]" { ptr @.str.19, i64 4 }, ptr %4, align 8 - %5 = insertvalue %"char[][]" undef, ptr %literal, 0 - %6 = insertvalue %"char[][]" %5, i64 5, 1 - store %"char[][]" %6, ptr %URLS, align 8 - %7 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 1 - %8 = load i64, ptr %7, align 8 - store i64 %8, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %phi_block12, %entry - %9 = load i64, ptr %.anon1, align 8 - %10 = load i64, ptr %.anon, align 8 - %lt = icmp ult i64 %9, %10 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %11 = getelementptr inbounds %"char[][]", ptr %URLS, i32 0, i32 0 - %12 = load ptr, ptr %11, align 8 - %13 = load i64, ptr %.anon1, align 8 - %ptroffset = getelementptr inbounds %"char[]", ptr %12, i64 %13 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %url, ptr align 8 %ptroffset, i32 16, i1 false) - %14 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %15 = load i64, ptr %14, align 8 - %uisitrunc = trunc i64 %15 to i32 - %16 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %17 = load ptr, ptr %16, align 8 - %18 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %uisitrunc, ptr %17) - %19 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo = load ptr, ptr %19, align 8 - %20 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi = load i64, ptr %20, align 8 - %21 = call { ptr, i8 } @test_readAndBuildSummary(ptr %lo, i64 %hi) - store { ptr, i8 } %21, ptr %result, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %summary, ptr align 8 %result, i32 16, i1 false) - %22 = call i32 (ptr, ...) @printf(ptr @.str.21) - %23 = load ptr, ptr @__stdoutp, align 8 - call void @test_Summary_print(ptr %summary, ptr %23) - %24 = call i32 (ptr, ...) @printf(ptr @.str.22) - %25 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0 - %26 = load ptr, ptr %25, align 8 - %ptrbool = icmp ne ptr %26, null - br i1 %ptrbool, label %cond.lhs, label %cond.rhs - -cond.lhs: ; preds = %loop.body - %27 = getelementptr inbounds %Summary, ptr %summary, i32 0, i32 0 - %28 = load ptr, ptr %27, align 8 - %29 = load %"char[]", ptr %28, align 8 - br label %cond.phi - -cond.rhs: ; preds = %loop.body - br label %cond.phi - -cond.phi: ; preds = %cond.rhs, %cond.lhs - %val = phi %"char[]" [ %29, %cond.lhs ], [ zeroinitializer, %cond.rhs ] - store %"char[]" %val, ptr %title_sure, align 8 - %30 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 1 - %31 = load i64, ptr %30, align 8 - %uisitrunc2 = trunc i64 %31 to i32 - %32 = getelementptr inbounds %"char[]", ptr %title_sure, i32 0, i32 0 - %33 = load ptr, ptr %32, align 8 - %34 = call i32 (ptr, ...) @printf(ptr @.str.24, i32 %uisitrunc2, ptr %33) - %35 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 0 - %lo3 = load ptr, ptr %35, align 8 - %36 = getelementptr inbounds %"char[]", ptr %url, i32 0, i32 1 - %hi4 = load i64, ptr %36, align 8 - %37 = call i64 @test_readWhetherTitleNonEmpty(ptr %retparam, ptr %lo3, i64 %hi4) - %not_err = icmp eq i64 %37, 0 - br i1 %not_err, label %after_check, label %assign_optional - -assign_optional: ; preds = %cond.phi - store i64 %37, ptr %has_title.f, align 8 - br label %after_assign - -after_check: ; preds = %cond.phi - %38 = load i8, ptr %retparam, align 1 - store i8 %38, ptr %has_title, align 1 - store i64 0, ptr %has_title.f, align 8 - br label %after_assign - -after_assign: ; preds = %after_check, %assign_optional - %optval = load i64, ptr %has_title.f, align 8 - %not_err5 = icmp eq i64 %optval, 0 - br i1 %not_err5, label %after_check6, label %else_block - -after_check6: ; preds = %after_assign - %39 = load i8, ptr %has_title, align 1 - %40 = call ptr @test_bool_to_string(i8 %39) - br label %phi_block - -else_block: ; preds = %after_assign - %41 = load i64, ptr %has_title.f, align 8 - %42 = call ptr @test_nameFromError(i64 %41) - br label %phi_block - -phi_block: ; preds = %else_block, %after_check6 - %val7 = phi ptr [ %40, %after_check6 ], [ %42, %else_block ] - %optval8 = load i64, ptr %has_title.f, align 8 - %not_err9 = icmp eq i64 %optval8, 0 - br i1 %not_err9, label %after_check10, label %else_block11 - -after_check10: ; preds = %phi_block - %43 = load i8, ptr %has_title, align 1 - %44 = trunc i8 %43 to i1 - br label %phi_block12 - -else_block11: ; preds = %phi_block - br label %phi_block12 - -phi_block12: ; preds = %else_block11, %after_check10 - %val13 = phi i1 [ %44, %after_check10 ], [ false, %else_block11 ] - %ternary = select i1 %val13, ptr @.str.26, ptr @.str.27 - %45 = call i32 (ptr, ...) @printf(ptr @.str.25, ptr %val7, ptr %ternary) - %46 = load i64, ptr %.anon1, align 8 - %add = add i64 %46, 1 - store i64 %add, ptr %.anon1, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - ret void -} diff --git a/test/test_suite2/errors/general_error_regression.c3t b/test/test_suite2/errors/general_error_regression.c3t deleted file mode 100644 index cd268875a..000000000 --- a/test/test_suite2/errors/general_error_regression.c3t +++ /dev/null @@ -1,141 +0,0 @@ -// #target: macos-x64 -module foo; -import std::io; -import libc; -fault Foo -{ - X, - Y, - Z, - W, - W1 - - -} - -fault Foob -{ - X1, - Y2 -} - -define Bar = distinct int; - -enum MyEnum -{ - A, - B -} - -fn void Foo.hello(Foo *f) -{ - io::println("Hello from Foo"); -} - -fn void Bar.hello(Bar *b) -{ - io::println("Hello from Bar"); -} - -fn void MyEnum.hello(MyEnum *myenum) -{ - io::println("Hello from MyEnum"); -} -fn void main() -{ - Foo f = Foo.X; - Foo ef = Foo.Y; - anyerr x = f; - ulong z = (ulong)(x); - libc::printf("1: %p\n", z); - x = ef; - z = (ulong)(x); - libc::printf("2: %p\n", z); - x = Foo.W; - z = (ulong)(x); - libc::printf("21: %p\n", z); - x = Foo.W1; - z = (ulong)(x); - libc::printf("22: %p\n", z); - x = Foob.X1; - z = (ulong)(x); - libc::printf("3: %p\n", z); - x = Foob.Y2; - z = (ulong)(x); - libc::printf("4: %p\n", z); - Bar b; - MyEnum a = MyEnum.A; - f.hello(); - b.hello(); - a.hello(); -} - -/* #expect: foo.ll - -define void @foo_Foo_hello(ptr %0) #0 { -entry: - %1 = call i32 @std_io_println(ptr @.str.12) #1 - ret void -} - -define void @foo_Bar_hello(ptr %0) #0 { -entry: - %1 = call i32 @std_io_println(ptr @.str.13) #1 - ret void -} - -define void @foo_MyEnum_hello(ptr %0) #0 { -entry: - %1 = call i32 @std_io_println(ptr @.str.14) #1 - ret void -} - -define void @foo_main() #0 { -entry: - %f = alloca i64, align 8 - %ef = alloca i64, align 8 - %x = alloca i64, align 8 - %z = alloca i64, align 8 - %b = alloca i32, align 4 - %a = alloca i32, align 4 - store i64 ptrtoint (ptr @"foo_Foo$X" to i64), ptr %f, align 8 - store i64 ptrtoint (ptr @"foo_Foo$Y" to i64), ptr %ef, align 8 - %0 = load i64, ptr %f, align 8 - store i64 %0, ptr %x, align 8 - %1 = load i64, ptr %x, align 8 - store i64 %1, ptr %z, align 8 - %2 = load i64, ptr %z, align 8 - %3 = call i32 (ptr, ...) @printf(ptr @.str, i64 %2) - %4 = load i64, ptr %ef, align 8 - store i64 %4, ptr %x, align 8 - %5 = load i64, ptr %x, align 8 - store i64 %5, ptr %z, align 8 - %6 = load i64, ptr %z, align 8 - %7 = call i32 (ptr, ...) @printf(ptr @.str.7, i64 %6) - store i64 ptrtoint (ptr @"foo_Foo$W" to i64), ptr %x, align 8 - %8 = load i64, ptr %x, align 8 - store i64 %8, ptr %z, align 8 - %9 = load i64, ptr %z, align 8 - %10 = call i32 (ptr, ...) @printf(ptr @.str.8, i64 %9) - store i64 ptrtoint (ptr @"foo_Foo$W1" to i64), ptr %x, align 8 - %11 = load i64, ptr %x, align 8 - store i64 %11, ptr %z, align 8 - %12 = load i64, ptr %z, align 8 - %13 = call i32 (ptr, ...) @printf(ptr @.str.9, i64 %12) - store i64 ptrtoint (ptr @"foo_Foob$X1" to i64), ptr %x, align 8 - %14 = load i64, ptr %x, align 8 - store i64 %14, ptr %z, align 8 - %15 = load i64, ptr %z, align 8 - %16 = call i32 (ptr, ...) @printf(ptr @.str.10, i64 %15) - store i64 ptrtoint (ptr @"foo_Foob$Y2" to i64), ptr %x, align 8 - %17 = load i64, ptr %x, align 8 - store i64 %17, ptr %z, align 8 - %18 = load i64, ptr %z, align 8 - %19 = call i32 (ptr, ...) @printf(ptr @.str.11, i64 %18) - store i32 0, ptr %b, align 4 - store i32 0, ptr %a, align 4 - call void @foo_Foo_hello(ptr %f) - call void @foo_Bar_hello(ptr %b) - call void @foo_MyEnum_hello(ptr %a) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/errors/optional_chained_init.c3t b/test/test_suite2/errors/optional_chained_init.c3t deleted file mode 100644 index 05c1e308d..000000000 --- a/test/test_suite2/errors/optional_chained_init.c3t +++ /dev/null @@ -1,492 +0,0 @@ -// #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 - -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 - %varargslots = alloca [1 x %variant], align 16 - %err3 = alloca i64, align 8 - %retparam12 = alloca i64, align 8 - %varargslots13 = alloca [1 x %variant], align 16 - %retparam18 = alloca i64, align 8 - %varargslots19 = alloca [1 x %variant], align 16 - %retparam26 = alloca i64, align 8 - %varargslots27 = alloca [1 x %variant], align 16 - store i32 1, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 - store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %a.f, align 8 - store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %b.f, align 8 - br label %after_assign - -after_assign: ; preds = %entry - br label %testblock - -testblock: ; preds = %after_assign - %optval = load i64, ptr %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, ptr %err, align 8 - br label %end_block - -after_check: ; preds = %testblock - store i64 0, ptr %err, align 8 - br label %end_block - -end_block: ; preds = %after_check, %assign_optional - %0 = load i64, ptr %err, align 8 - %neq = icmp ne i64 %0, 0 - br i1 %neq, label %if.then, label %if.exit - -if.then: ; preds = %end_block - %1 = insertvalue %variant undef, ptr %err, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 13, ptr %varargslots, i64 1) - %not_err1 = icmp eq i64 %4, 0 - br i1 %not_err1, label %after_check2, label %voiderr - -after_check2: ; preds = %if.then - br label %voiderr - -voiderr: ; preds = %after_check2, %if.then - br label %if.exit - -if.exit: ; preds = %voiderr, %end_block - br label %testblock4 - -testblock4: ; preds = %if.exit - %optval5 = load i64, ptr %b.f, align 8 - %not_err6 = icmp eq i64 %optval5, 0 - br i1 %not_err6, label %after_check8, label %assign_optional7 - -assign_optional7: ; preds = %testblock4 - store i64 %optval5, ptr %err3, align 8 - br label %end_block9 - -after_check8: ; preds = %testblock4 - store i64 0, ptr %err3, align 8 - br label %end_block9 - -end_block9: ; preds = %after_check8, %assign_optional7 - %5 = load i64, ptr %err3, align 8 - %neq10 = icmp ne i64 %5, 0 - br i1 %neq10, label %if.then11, label %if.exit17 - -if.then11: ; preds = %end_block9 - %6 = insertvalue %variant undef, ptr %err3, 0 - %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %8 = getelementptr inbounds [1 x %variant], ptr %varargslots13, i64 0, i64 0 - store %variant %7, ptr %8, align 16 - %9 = call i64 @std_io_printfln(ptr %retparam12, ptr @.str.1, i64 13, ptr %varargslots13, i64 1) - %not_err14 = icmp eq i64 %9, 0 - br i1 %not_err14, label %after_check15, label %voiderr16 - -after_check15: ; preds = %if.then11 - br label %voiderr16 - -voiderr16: ; preds = %after_check15, %if.then11 - br label %if.exit17 - -if.exit17: ; preds = %voiderr16, %end_block9 - %optval20 = load i64, ptr %a.f, align 8 - %not_err21 = icmp eq i64 %optval20, 0 - br i1 %not_err21, label %after_check22, label %voiderr25 - -after_check22: ; preds = %if.exit17 - %10 = insertvalue %variant undef, ptr %a, 0 - %11 = insertvalue %variant %10, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %12 = getelementptr inbounds [1 x %variant], ptr %varargslots19, i64 0, i64 0 - store %variant %11, ptr %12, align 16 - %13 = call i64 @std_io_printfln(ptr %retparam18, ptr @.str.2, i64 9, ptr %varargslots19, i64 1) - %not_err23 = icmp eq i64 %13, 0 - br i1 %not_err23, label %after_check24, label %voiderr25 - -after_check24: ; preds = %after_check22 - br label %voiderr25 - -voiderr25: ; preds = %after_check24, %after_check22, %if.exit17 - %optval28 = load i64, ptr %b.f, align 8 - %not_err29 = icmp eq i64 %optval28, 0 - br i1 %not_err29, label %after_check30, label %voiderr33 - -after_check30: ; preds = %voiderr25 - %14 = insertvalue %variant undef, ptr %b, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %16 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0 - store %variant %15, ptr %16, align 16 - %17 = call i64 @std_io_printfln(ptr %retparam26, ptr @.str.3, i64 9, ptr %varargslots27, i64 1) - %not_err31 = icmp eq i64 %17, 0 - br i1 %not_err31, label %after_check32, label %voiderr33 - -after_check32: ; preds = %after_check30 - br label %voiderr33 - -voiderr33: ; preds = %after_check32, %after_check30, %voiderr25 - 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 - %varargslots = alloca [1 x %variant], align 16 - %err8 = alloca i64, align 8 - %retparam17 = alloca i64, align 8 - %varargslots18 = alloca [1 x %variant], align 16 - %retparam23 = alloca i64, align 8 - %varargslots24 = alloca [1 x %variant], align 16 - %retparam31 = alloca i64, align 8 - %varargslots32 = alloca [1 x %variant], align 16 - store i64 ptrtoint (ptr @"test_Test$FOO" to i64), ptr %x.f, align 8 - store i32 1, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 - %optval = load i64, ptr %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, ptr %a.f, align 8 - br label %optional_assign_jump - -after_check: ; preds = %entry - %0 = load i32, ptr %x, align 4 - store i32 %0, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 - br label %after_assign - -optional_assign_jump: ; preds = %assign_optional - %reload_err = load i64, ptr %a.f, align 8 - store i64 %reload_err, ptr %b.f, align 8 - br label %after_assign1 - -after_assign: ; preds = %after_check - store i32 %0, ptr %b, align 4 - store i64 0, ptr %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, ptr %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, ptr %err, align 8 - br label %end_block - -after_check5: ; preds = %testblock - store i64 0, ptr %err, align 8 - br label %end_block - -end_block: ; preds = %after_check5, %assign_optional4 - %1 = load i64, ptr %err, align 8 - %neq = icmp ne i64 %1, 0 - br i1 %neq, label %if.then, label %if.exit - -if.then: ; preds = %end_block - %2 = insertvalue %variant undef, ptr %err, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %3, ptr %4, align 16 - %5 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.4, i64 13, ptr %varargslots, i64 1) - %not_err6 = icmp eq i64 %5, 0 - br i1 %not_err6, label %after_check7, label %voiderr - -after_check7: ; preds = %if.then - br label %voiderr - -voiderr: ; preds = %after_check7, %if.then - br label %if.exit - -if.exit: ; preds = %voiderr, %end_block - br label %testblock9 - -testblock9: ; preds = %if.exit - %optval10 = load i64, ptr %b.f, align 8 - %not_err11 = icmp eq i64 %optval10, 0 - br i1 %not_err11, label %after_check13, label %assign_optional12 - -assign_optional12: ; preds = %testblock9 - store i64 %optval10, ptr %err8, align 8 - br label %end_block14 - -after_check13: ; preds = %testblock9 - store i64 0, ptr %err8, align 8 - br label %end_block14 - -end_block14: ; preds = %after_check13, %assign_optional12 - %6 = load i64, ptr %err8, align 8 - %neq15 = icmp ne i64 %6, 0 - br i1 %neq15, label %if.then16, label %if.exit22 - -if.then16: ; preds = %end_block14 - %7 = insertvalue %variant undef, ptr %err8, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %9 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 - store %variant %8, ptr %9, align 16 - %10 = call i64 @std_io_printfln(ptr %retparam17, ptr @.str.5, i64 13, ptr %varargslots18, i64 1) - %not_err19 = icmp eq i64 %10, 0 - br i1 %not_err19, label %after_check20, label %voiderr21 - -after_check20: ; preds = %if.then16 - br label %voiderr21 - -voiderr21: ; preds = %after_check20, %if.then16 - br label %if.exit22 - -if.exit22: ; preds = %voiderr21, %end_block14 - %optval25 = load i64, ptr %a.f, align 8 - %not_err26 = icmp eq i64 %optval25, 0 - br i1 %not_err26, label %after_check27, label %voiderr30 - -after_check27: ; preds = %if.exit22 - %11 = insertvalue %variant undef, ptr %a, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %13 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 - store %variant %12, ptr %13, align 16 - %14 = call i64 @std_io_printfln(ptr %retparam23, ptr @.str.6, i64 9, ptr %varargslots24, i64 1) - %not_err28 = icmp eq i64 %14, 0 - br i1 %not_err28, label %after_check29, label %voiderr30 - -after_check29: ; preds = %after_check27 - br label %voiderr30 - -voiderr30: ; preds = %after_check29, %after_check27, %if.exit22 - %optval33 = load i64, ptr %b.f, align 8 - %not_err34 = icmp eq i64 %optval33, 0 - br i1 %not_err34, label %after_check35, label %voiderr38 - -after_check35: ; preds = %voiderr30 - %15 = insertvalue %variant undef, ptr %b, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %17 = getelementptr inbounds [1 x %variant], ptr %varargslots32, i64 0, i64 0 - store %variant %16, ptr %17, align 16 - %18 = call i64 @std_io_printfln(ptr %retparam31, ptr @.str.7, i64 9, ptr %varargslots32, i64 1) - %not_err36 = icmp eq i64 %18, 0 - br i1 %not_err36, label %after_check37, label %voiderr38 - -after_check37: ; preds = %after_check35 - br label %voiderr38 - -voiderr38: ; preds = %after_check37, %after_check35, %voiderr30 - 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 - %varargslots = alloca [1 x %variant], align 16 - %err8 = alloca i64, align 8 - %retparam17 = alloca i64, align 8 - %varargslots18 = alloca [1 x %variant], align 16 - %retparam23 = alloca i64, align 8 - %varargslots24 = alloca [1 x %variant], align 16 - %retparam31 = alloca i64, align 8 - %varargslots32 = alloca [1 x %variant], align 16 - store i32 23, ptr %x, align 4 - store i64 0, ptr %x.f, align 8 - store i32 1, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 - %optval = load i64, ptr %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, ptr %a.f, align 8 - br label %optional_assign_jump - -after_check: ; preds = %entry - %0 = load i32, ptr %x, align 4 - store i32 %0, ptr %a, align 4 - store i64 0, ptr %a.f, align 8 - br label %after_assign - -optional_assign_jump: ; preds = %assign_optional - %reload_err = load i64, ptr %a.f, align 8 - store i64 %reload_err, ptr %b.f, align 8 - br label %after_assign1 - -after_assign: ; preds = %after_check - store i32 %0, ptr %b, align 4 - store i64 0, ptr %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, ptr %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, ptr %err, align 8 - br label %end_block - -after_check5: ; preds = %testblock - store i64 0, ptr %err, align 8 - br label %end_block - -end_block: ; preds = %after_check5, %assign_optional4 - %1 = load i64, ptr %err, align 8 - %neq = icmp ne i64 %1, 0 - br i1 %neq, label %if.then, label %if.exit - -if.then: ; preds = %end_block - %2 = insertvalue %variant undef, ptr %err, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %3, ptr %4, align 16 - %5 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.8, i64 13, ptr %varargslots, i64 1) - %not_err6 = icmp eq i64 %5, 0 - br i1 %not_err6, label %after_check7, label %voiderr - -after_check7: ; preds = %if.then - br label %voiderr - -voiderr: ; preds = %after_check7, %if.then - br label %if.exit - -if.exit: ; preds = %voiderr, %end_block - br label %testblock9 - -testblock9: ; preds = %if.exit - %optval10 = load i64, ptr %b.f, align 8 - %not_err11 = icmp eq i64 %optval10, 0 - br i1 %not_err11, label %after_check13, label %assign_optional12 - -assign_optional12: ; preds = %testblock9 - store i64 %optval10, ptr %err8, align 8 - br label %end_block14 - -after_check13: ; preds = %testblock9 - store i64 0, ptr %err8, align 8 - br label %end_block14 - -end_block14: ; preds = %after_check13, %assign_optional12 - %6 = load i64, ptr %err8, align 8 - %neq15 = icmp ne i64 %6, 0 - br i1 %neq15, label %if.then16, label %if.exit22 - -if.then16: ; preds = %end_block14 - %7 = insertvalue %variant undef, ptr %err8, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %9 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 - store %variant %8, ptr %9, align 16 - %10 = call i64 @std_io_printfln(ptr %retparam17, ptr @.str.9, i64 13, ptr %varargslots18, i64 1) - %not_err19 = icmp eq i64 %10, 0 - br i1 %not_err19, label %after_check20, label %voiderr21 - -after_check20: ; preds = %if.then16 - br label %voiderr21 - -voiderr21: ; preds = %after_check20, %if.then16 - br label %if.exit22 - -if.exit22: ; preds = %voiderr21, %end_block14 - %optval25 = load i64, ptr %a.f, align 8 - %not_err26 = icmp eq i64 %optval25, 0 - br i1 %not_err26, label %after_check27, label %voiderr30 - -after_check27: ; preds = %if.exit22 - %11 = insertvalue %variant undef, ptr %a, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %13 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 - store %variant %12, ptr %13, align 16 - %14 = call i64 @std_io_printfln(ptr %retparam23, ptr @.str.10, i64 9, ptr %varargslots24, i64 1) - %not_err28 = icmp eq i64 %14, 0 - br i1 %not_err28, label %after_check29, label %voiderr30 - -after_check29: ; preds = %after_check27 - br label %voiderr30 - -voiderr30: ; preds = %after_check29, %after_check27, %if.exit22 - %optval33 = load i64, ptr %b.f, align 8 - %not_err34 = icmp eq i64 %optval33, 0 - br i1 %not_err34, label %after_check35, label %voiderr38 - -after_check35: ; preds = %voiderr30 - %15 = insertvalue %variant undef, ptr %b, 0 - %16 = insertvalue %variant %15, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %17 = getelementptr inbounds [1 x %variant], ptr %varargslots32, i64 0, i64 0 - store %variant %16, ptr %17, align 16 - %18 = call i64 @std_io_printfln(ptr %retparam31, ptr @.str.11, i64 9, ptr %varargslots32, i64 1) - %not_err36 = icmp eq i64 %18, 0 - br i1 %not_err36, label %after_check37, label %voiderr38 - -after_check37: ; preds = %after_check35 - br label %voiderr38 - -voiderr38: ; preds = %after_check37, %after_check35, %voiderr30 - ret void -} diff --git a/test/test_suite2/errors/optional_with_optional.c3t b/test/test_suite2/errors/optional_with_optional.c3t deleted file mode 100644 index 3074c174d..000000000 --- a/test/test_suite2/errors/optional_with_optional.c3t +++ /dev/null @@ -1,293 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fault Foo { ABC, DEF } - -fn void main() -{ - io::printfln("1:%d", get_a(1) ?? get_b(4) ?? -1); - io::printfln("2:%d", get_a(2) ?? get_b(4) ?? -1); - io::printfln("3:%d", get_a(1) ?? get_b(5) ?? -1); - io::printfln("4:%s", catch(Foo.ABC! ?? Foo.DEF!)); - io::printfln("5:%s", Foo.ABC! ?? 3); - io::printfln("6:%s", catch((3 > 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); - io::printfln("7:%s", catch((3 < 2 ? Foo.ABC! : 4) ?? Foo.DEF!)); - long x = Foo.DEF! ?? 3; - io::printfln("8:%s", x); - int! xy = Foo.ABC! ?? Foo.DEF!; -} - -fn int! get_a(int x) -{ - if (x % 2) return Foo.ABC!; - return x * 2; -} - -fn int! get_b(int x) -{ - if (x % 2 == 0) return Foo.ABC!; - return x * 2; -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %retparam1 = alloca i32, align 4 - %retparam2 = alloca i32, align 4 - %taddr = alloca i32, align 4 - %retparam10 = alloca i64, align 8 - %varargslots11 = alloca [1 x %variant], align 16 - %retparam12 = alloca i32, align 4 - %retparam16 = alloca i32, align 4 - %taddr24 = alloca i32, align 4 - %retparam28 = alloca i64, align 8 - %varargslots29 = alloca [1 x %variant], align 16 - %retparam30 = alloca i32, align 4 - %retparam34 = alloca i32, align 4 - %taddr42 = alloca i32, align 4 - %retparam46 = alloca i64, align 8 - %varargslots47 = alloca [1 x %variant], align 16 - %taddr48 = alloca i64, align 8 - %retparam52 = alloca i64, align 8 - %varargslots53 = alloca [1 x %variant], align 16 - %taddr54 = alloca i32, align 4 - %retparam58 = alloca i64, align 8 - %varargslots59 = alloca [1 x %variant], align 16 - %taddr60 = alloca i64, align 8 - %retparam64 = alloca i64, align 8 - %varargslots65 = alloca [1 x %variant], align 16 - %error_var = alloca i64, align 8 - %x = alloca i64, align 8 - %retparam71 = alloca i64, align 8 - %varargslots72 = alloca [1 x %variant], align 16 - %xy = alloca i32, align 4 - %xy.f = alloca i64, align 8 - %0 = call i64 @test_get_a(ptr %retparam1, i32 1) - %not_err = icmp eq i64 %0, 0 - br i1 %not_err, label %after_check, label %else_block - -after_check: ; preds = %entry - %1 = load i32, ptr %retparam1, align 4 - br label %phi_block - -else_block: ; preds = %entry - %2 = call i64 @test_get_b(ptr %retparam2, i32 4) - %not_err3 = icmp eq i64 %2, 0 - br i1 %not_err3, label %after_check4, label %else_block5 - -after_check4: ; preds = %else_block - %3 = load i32, ptr %retparam2, align 4 - br label %phi_block - -phi_block: ; preds = %after_check4, %after_check - %val = phi i32 [ %1, %after_check ], [ %3, %after_check4 ] - br label %phi_block6 - -else_block5: ; preds = %else_block - br label %phi_block6 - -phi_block6: ; preds = %else_block5, %phi_block - %val7 = phi i32 [ %val, %phi_block ], [ -1, %else_block5 ] - store i32 %val7, ptr %taddr, align 4 - %4 = insertvalue %variant undef, ptr %taddr, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %6 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %5, ptr %6, align 16 - %7 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 4, ptr %varargslots, i64 1) - %not_err8 = icmp eq i64 %7, 0 - br i1 %not_err8, label %after_check9, label %voiderr - -after_check9: ; preds = %phi_block6 - br label %voiderr - -voiderr: ; preds = %after_check9, %phi_block6 - %8 = call i64 @test_get_a(ptr %retparam12, i32 2) - %not_err13 = icmp eq i64 %8, 0 - br i1 %not_err13, label %after_check14, label %else_block15 - -after_check14: ; preds = %voiderr - %9 = load i32, ptr %retparam12, align 4 - br label %phi_block19 - -else_block15: ; preds = %voiderr - %10 = call i64 @test_get_b(ptr %retparam16, i32 4) - %not_err17 = icmp eq i64 %10, 0 - br i1 %not_err17, label %after_check18, label %else_block21 - -after_check18: ; preds = %else_block15 - %11 = load i32, ptr %retparam16, align 4 - br label %phi_block19 - -phi_block19: ; preds = %after_check18, %after_check14 - %val20 = phi i32 [ %9, %after_check14 ], [ %11, %after_check18 ] - br label %phi_block22 - -else_block21: ; preds = %else_block15 - br label %phi_block22 - -phi_block22: ; preds = %else_block21, %phi_block19 - %val23 = phi i32 [ %val20, %phi_block19 ], [ -1, %else_block21 ] - store i32 %val23, ptr %taddr24, align 4 - %12 = insertvalue %variant undef, ptr %taddr24, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %14 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 - store %variant %13, ptr %14, align 16 - %15 = call i64 @std_io_printfln(ptr %retparam10, ptr @.str.2, i64 4, ptr %varargslots11, i64 1) - %not_err25 = icmp eq i64 %15, 0 - br i1 %not_err25, label %after_check26, label %voiderr27 - -after_check26: ; preds = %phi_block22 - br label %voiderr27 - -voiderr27: ; preds = %after_check26, %phi_block22 - %16 = call i64 @test_get_a(ptr %retparam30, i32 1) - %not_err31 = icmp eq i64 %16, 0 - br i1 %not_err31, label %after_check32, label %else_block33 - -after_check32: ; preds = %voiderr27 - %17 = load i32, ptr %retparam30, align 4 - br label %phi_block37 - -else_block33: ; preds = %voiderr27 - %18 = call i64 @test_get_b(ptr %retparam34, i32 5) - %not_err35 = icmp eq i64 %18, 0 - br i1 %not_err35, label %after_check36, label %else_block39 - -after_check36: ; preds = %else_block33 - %19 = load i32, ptr %retparam34, align 4 - br label %phi_block37 - -phi_block37: ; preds = %after_check36, %after_check32 - %val38 = phi i32 [ %17, %after_check32 ], [ %19, %after_check36 ] - br label %phi_block40 - -else_block39: ; preds = %else_block33 - br label %phi_block40 - -phi_block40: ; preds = %else_block39, %phi_block37 - %val41 = phi i32 [ %val38, %phi_block37 ], [ -1, %else_block39 ] - store i32 %val41, ptr %taddr42, align 4 - %20 = insertvalue %variant undef, ptr %taddr42, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %22 = getelementptr inbounds [1 x %variant], ptr %varargslots29, i64 0, i64 0 - store %variant %21, ptr %22, align 16 - %23 = call i64 @std_io_printfln(ptr %retparam28, ptr @.str.3, i64 4, ptr %varargslots29, i64 1) - %not_err43 = icmp eq i64 %23, 0 - br i1 %not_err43, label %after_check44, label %voiderr45 - -after_check44: ; preds = %phi_block40 - br label %voiderr45 - -voiderr45: ; preds = %after_check44, %phi_block40 - store i64 ptrtoint (ptr @"test_Foo$DEF" to i64), ptr %taddr48, align 8 - %24 = insertvalue %variant undef, ptr %taddr48, 0 - %25 = insertvalue %variant %24, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %26 = getelementptr inbounds [1 x %variant], ptr %varargslots47, i64 0, i64 0 - store %variant %25, ptr %26, align 16 - %27 = call i64 @std_io_printfln(ptr %retparam46, ptr @.str.4, i64 4, ptr %varargslots47, i64 1) - %not_err49 = icmp eq i64 %27, 0 - br i1 %not_err49, label %after_check50, label %voiderr51 - -after_check50: ; preds = %voiderr45 - br label %voiderr51 - -voiderr51: ; preds = %after_check50, %voiderr45 - store i32 3, ptr %taddr54, align 4 - %28 = insertvalue %variant undef, ptr %taddr54, 0 - %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %30 = getelementptr inbounds [1 x %variant], ptr %varargslots53, i64 0, i64 0 - store %variant %29, ptr %30, align 16 - %31 = call i64 @std_io_printfln(ptr %retparam52, ptr @.str.5, i64 4, ptr %varargslots53, i64 1) - %not_err55 = icmp eq i64 %31, 0 - br i1 %not_err55, label %after_check56, label %voiderr57 - -after_check56: ; preds = %voiderr51 - br label %voiderr57 - -voiderr57: ; preds = %after_check56, %voiderr51 - store i64 ptrtoint (ptr @"test_Foo$DEF" to i64), ptr %taddr60, align 8 - %32 = insertvalue %variant undef, ptr %taddr60, 0 - %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %34 = getelementptr inbounds [1 x %variant], ptr %varargslots59, i64 0, i64 0 - store %variant %33, ptr %34, align 16 - %35 = call i64 @std_io_printfln(ptr %retparam58, ptr @.str.6, i64 4, ptr %varargslots59, i64 1) - %not_err61 = icmp eq i64 %35, 0 - br i1 %not_err61, label %after_check62, label %voiderr63 - -after_check62: ; preds = %voiderr57 - br label %voiderr63 - -voiderr63: ; preds = %after_check62, %voiderr57 - store i64 0, ptr %error_var, align 8 - br label %phi_block67 - -phi_block67: ; preds = %voiderr63 - br label %noerr_block - -noerr_block: ; preds = %phi_block67 - %36 = insertvalue %variant undef, ptr %error_var, 0 - %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$anyerr" to i64), 1 - %38 = getelementptr inbounds [1 x %variant], ptr %varargslots65, i64 0, i64 0 - store %variant %37, ptr %38, align 16 - %39 = call i64 @std_io_printfln(ptr %retparam64, ptr @.str.7, i64 4, ptr %varargslots65, i64 1) - %not_err68 = icmp eq i64 %39, 0 - br i1 %not_err68, label %after_check69, label %voiderr70 - -after_check69: ; preds = %noerr_block - br label %voiderr70 - -voiderr70: ; preds = %after_check69, %noerr_block - store i64 3, ptr %x, align 8 - %40 = insertvalue %variant undef, ptr %x, 0 - %41 = insertvalue %variant %40, i64 ptrtoint (ptr @"ct$long" to i64), 1 - %42 = getelementptr inbounds [1 x %variant], ptr %varargslots72, i64 0, i64 0 - store %variant %41, ptr %42, align 16 - %43 = call i64 @std_io_printfln(ptr %retparam71, ptr @.str.8, i64 4, ptr %varargslots72, i64 1) - %not_err73 = icmp eq i64 %43, 0 - br i1 %not_err73, label %after_check74, label %voiderr75 - -after_check74: ; preds = %voiderr70 - br label %voiderr75 - -voiderr75: ; preds = %after_check74, %voiderr70 - store i64 ptrtoint (ptr @"test_Foo$DEF" to i64), ptr %xy.f, align 8 - ret void -} - -; Function Attrs: nounwind -define i64 @test_get_a(ptr %0, i32 %1) #0 { -entry: - %reterr = alloca i64, align 8 - %smod = srem i32 %1, 2 - %intbool = icmp ne i32 %smod, 0 - br i1 %intbool, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i64 ptrtoint (ptr @"test_Foo$ABC" to i64) - -if.exit: ; preds = %entry - %mul = mul i32 %1, 2 - store i32 %mul, ptr %0, align 4 - ret i64 0 -} - -; Function Attrs: nounwind -define i64 @test_get_b(ptr %0, i32 %1) #0 { -entry: - %reterr = alloca i64, align 8 - %smod = srem i32 %1, 2 - %eq = icmp eq i32 %smod, 0 - br i1 %eq, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i64 ptrtoint (ptr @"test_Foo$ABC" to i64) - -if.exit: ; preds = %entry - %mul = mul i32 %1, 2 - store i32 %mul, ptr %0, align 4 - ret i64 0 -} \ No newline at end of file diff --git a/test/test_suite2/errors/or_and_rethrow.c3t b/test/test_suite2/errors/or_and_rethrow.c3t deleted file mode 100644 index 1b58a141c..000000000 --- a/test/test_suite2/errors/or_and_rethrow.c3t +++ /dev/null @@ -1,163 +0,0 @@ -// #target: macos-x64 -module foo; -import std::io; - -fault Foo { ABC } - -fn void blurb() { io::println("Blurb");} - -macro int! tester() -{ - defer blurb(); - return Foo.ABC!; -} -fn void! test(int x) -{ - io::printfln("test(%d)", x); - if (x || (tester()?)) io::println("Ok1"); - io::println("Test next"); - if (tester()? || x) io::println("Ok?"); - io::println("Test ok"); -} - -fn void! test2(int x) -{ - io::printfln("test2(%d)", x); - if (x && (tester()?)) io::println("Ok1"); - io::println("Test next"); - if ((tester()?) && x) io::println("Ok?"); - io::println("Test ok"); -} - -fn void main() -{ - anyerr a = test(0); - anyerr b = test(1); - anyerr c = test2(0); - anyerr d = test2(1); -} - -/* #expect: foo.ll - -define i64 @foo_test(i32 %0) #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - %error_var = alloca i64, align 8 - %blockret = alloca i32, align 4 - %error_var1 = alloca i64, align 8 - %blockret2 = alloca i32, align 4 - %reterr = alloca i64, align 8 - store i32 %0, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.1, i64 8, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %intbool = icmp ne i32 %0, 0 - br i1 %intbool, label %or.phi, label %or.rhs - -or.rhs: ; preds = %voiderr - store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var, align 8 - br label %opt_block_cleanup - -opt_block_cleanup: ; preds = %or.rhs - call void @foo_blurb() - br label %guard_block - -guard_block: ; preds = %opt_block_cleanup - %5 = load i64, ptr %error_var, align 8 - ret i64 %5 - -or.phi: ; preds = %voiderr - br label %if.then - -if.then: ; preds = %or.phi - %6 = call i32 @std_io_println(ptr @.str.2) #1 - br label %if.exit - -if.exit: ; preds = %if.then - %7 = call i32 @std_io_println(ptr @.str.3) #1 - store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var1, align 8 - br label %opt_block_cleanup3 - -opt_block_cleanup3: ; preds = %if.exit - call void @foo_blurb() - br label %guard_block4 - -guard_block4: ; preds = %opt_block_cleanup3 - %8 = load i64, ptr %error_var1, align 8 - ret i64 %8 - -if.exit6: ; No predecessors! - %9 = call i32 @std_io_println(ptr @.str.5) #1 - ret i64 0 -} - -; Function Attrs: nounwind -define i64 @foo_test2(i32 %0) #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - %error_var = alloca i64, align 8 - %blockret = alloca i32, align 4 - %error_var1 = alloca i64, align 8 - %blockret2 = alloca i32, align 4 - %reterr = alloca i64, align 8 - store i32 %0, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.6, i64 9, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %intbool = icmp ne i32 %0, 0 - br i1 %intbool, label %and.rhs, label %and.phi - -and.rhs: ; preds = %voiderr - store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var, align 8 - br label %opt_block_cleanup - -opt_block_cleanup: ; preds = %and.rhs - call void @foo_blurb() - br label %guard_block - -guard_block: ; preds = %opt_block_cleanup - %5 = load i64, ptr %error_var, align 8 - ret i64 %5 - -and.phi: ; preds = %voiderr - br label %if.exit - -if.exit: ; preds = %and.phi - %6 = call i32 @std_io_println(ptr @.str.7) #1 - store i64 ptrtoint (ptr @"foo_Foo$ABC" to i64), ptr %error_var1, align 8 - br label %opt_block_cleanup3 - -opt_block_cleanup3: ; preds = %if.exit - call void @foo_blurb() - br label %guard_block4 - -guard_block4: ; preds = %opt_block_cleanup3 - %7 = load i64, ptr %error_var1, align 8 - ret i64 %7 - -if.exit5: ; No predecessors! - %8 = call i32 @std_io_println(ptr @.str.8) #1 - ret i64 0 -} diff --git a/test/test_suite2/errors/printing_errors.c3t b/test/test_suite2/errors/printing_errors.c3t deleted file mode 100644 index 35623daea..000000000 --- a/test/test_suite2/errors/printing_errors.c3t +++ /dev/null @@ -1,59 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fault Cde -{ - HELLO, - WORLD, -} -fn void main() -{ - anyerr x = Cde.WORLD; - io::printf("%s %s\n", Cde.HELLO.nameof, x.nameof); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %x = alloca i64, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [2 x %variant], align 16 - %taddr = alloca ptr, align 8 - %faultname_zero = alloca %"char[]", align 8 - store i64 ptrtoint (ptr @"test_Cde$WORLD" to i64), ptr %x, align 8 - store ptr @.str.2, ptr %taddr, align 8 - %0 = insertvalue %variant undef, ptr %taddr, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$p$a5$char" to i64), 1 - %2 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %1, ptr %2, align 16 - %3 = load i64, ptr %x, align 8 - %eq = icmp eq i64 %3, 0 - br i1 %eq, label %faultname_no, label %faultname_ok - -faultname_no: ; preds = %entry - call void @llvm.memset.p0.i64(ptr align 8 %faultname_zero, i8 0, i64 16, i1 false) - br label %faultname_exit - -faultname_ok: ; preds = %entry - %4 = inttoptr i64 %3 to ptr - %5 = getelementptr inbounds %.fault, ptr %4, i32 0, i32 1 - br label %faultname_exit - -faultname_exit: ; preds = %faultname_ok, %faultname_no - %faultname = phi ptr [ %faultname_zero, %faultname_no ], [ %5, %faultname_ok ] - %6 = insertvalue %variant undef, ptr %faultname, 0 - %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$sa$char" to i64), 1 - %8 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %7, ptr %8, align 16 - %9 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 6, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %9, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %faultname_exit - br label %voiderr - -voiderr: ; preds = %after_check, %faultname_exit - ret void -} diff --git a/test/test_suite2/expressions/addr_compiles.c3t b/test/test_suite2/expressions/addr_compiles.c3t deleted file mode 100644 index b69bb3107..000000000 --- a/test/test_suite2/expressions/addr_compiles.c3t +++ /dev/null @@ -1,142 +0,0 @@ -// #target: macos-x64 - -module test; - -extern fn void printf(char*, ...); - -fn void main() -{ - test(); - test2(); - test3(); -} - -fn void test() -{ - int f = 3; - int* x = &(((f))); - int* h = &&(f++); - printf("x = %d (4), h = %d (3)\n", *x, *h); -} - - -const int XX = 314; -fn void test2() -{ - int* w = &XX; - printf("w = %d (314)\n", *w); -} - -struct Foo -{ - int x; - int y; -} -fn void test3() -{ - Foo h = { 345, 555 }; - int* zx = &h.x; - int* zy = &h.y; - int[3] arr = { 333, 444, 999 }; - printf("zx = %d (345) zy = %d (555)\n", *zx, *zy); - arr[0]--; - arr[1]--; - arr[2]--; - int* d = &arr[2]; - int[]* e = &&arr[1..2]; - printf("d = %d (998) e = %d (443)\n", *d, (*e)[0]); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - call void @test_test() - call void @test_test2() - call void @test_test3() - ret void -} - -; Function Attrs: nounwind -define void @test_test() #0 { -entry: - %f = alloca i32, align 4 - %x = alloca ptr, align 8 - %h = alloca ptr, align 8 - %taddr = alloca i32, align 4 - store i32 3, ptr %f, align 4 - store ptr %f, ptr %x, align 8 - %0 = load i32, ptr %f, align 4 - %add = add i32 %0, 1 - store i32 %add, ptr %f, align 4 - store i32 %0, ptr %taddr, align 4 - store ptr %taddr, ptr %h, align 8 - %1 = load ptr, ptr %x, align 8 - %2 = load i32, ptr %1, align 8 - %3 = load ptr, ptr %h, align 8 - %4 = load i32, ptr %3, align 8 - call void (ptr, ...) @printf(ptr @.str, i32 %2, i32 %4) - ret void -} - -; Function Attrs: nounwind -define void @test_test2() #0 { -entry: - %w = alloca ptr, align 8 - store ptr @test_XX, ptr %w, align 8 - %0 = load ptr, ptr %w, align 8 - %1 = load i32, ptr %0, align 8 - call void (ptr, ...) @printf(ptr @.str.1, i32 %1) - ret void -} - -; Function Attrs: nounwind -define void @test_test3() #0 { -entry: - %h = alloca %Foo, align 4 - %zx = alloca ptr, align 8 - %zy = alloca ptr, align 8 - %arr = alloca [3 x i32], align 4 - %d = alloca ptr, align 8 - %e = alloca ptr, align 8 - %taddr = alloca %"int[]", align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %h, ptr align 4 @.__const, i32 8, i1 false) - %0 = getelementptr inbounds %Foo, ptr %h, i32 0, i32 0 - store ptr %0, ptr %zx, align 8 - %1 = getelementptr inbounds %Foo, ptr %h, i32 0, i32 1 - store ptr %1, ptr %zy, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %arr, ptr align 4 @.__const.2, i32 12, i1 false) - %2 = load ptr, ptr %zx, align 8 - %3 = load i32, ptr %2, align 8 - %4 = load ptr, ptr %zy, align 8 - %5 = load i32, ptr %4, align 8 - call void (ptr, ...) @printf(ptr @.str.3, i32 %3, i32 %5) - %6 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 0 - %7 = load i32, ptr %6, align 4 - %sub = sub i32 %7, 1 - store i32 %sub, ptr %6, align 4 - %8 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 1 - %9 = load i32, ptr %8, align 4 - %sub1 = sub i32 %9, 1 - store i32 %sub1, ptr %8, align 4 - %10 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 2 - %11 = load i32, ptr %10, align 4 - %sub2 = sub i32 %11, 1 - store i32 %sub2, ptr %10, align 4 - %12 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 2 - store ptr %12, ptr %d, align 8 - %13 = getelementptr inbounds [3 x i32], ptr %arr, i64 0, i64 1 - %14 = insertvalue %"int[]" undef, ptr %13, 0 - %15 = insertvalue %"int[]" %14, i64 2, 1 - store %"int[]" %15, ptr %taddr, align 8 - store ptr %taddr, ptr %e, align 8 - %16 = load ptr, ptr %d, align 8 - %17 = load i32, ptr %16, align 8 - %18 = load ptr, ptr %e, align 8 - %19 = getelementptr inbounds %"int[]", ptr %18, i32 0, i32 0 - %20 = load ptr, ptr %19, align 8 - %ptroffset = getelementptr inbounds i32, ptr %20, i64 0 - %21 = load i32, ptr %ptroffset, align 4 - call void (ptr, ...) @printf(ptr @.str.4, i32 %17, i32 %21) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/expressions/incdec.c3t b/test/test_suite2/expressions/incdec.c3t deleted file mode 100644 index cb4404e02..000000000 --- a/test/test_suite2/expressions/incdec.c3t +++ /dev/null @@ -1,44 +0,0 @@ -fn void test(int* foo) -{ - foo++; - foo--; - int y = 10; - y++; - y--; - float z = 2.0; - z++; - ++z; - z--; -} - -/* #expect: incdec.ll - - - %foo = alloca ptr, align 8 - %y = alloca i32, align 4 - %z = alloca float, align 4 - store ptr %0, ptr %foo, align 8 - %1 = load ptr, ptr %foo, align 8 - %ptroffset = getelementptr i32, ptr %1, i8 1 - store ptr %ptroffset, ptr %foo, align 8 - %2 = load ptr, ptr %foo, align 8 - %ptroffset1 = getelementptr i32, ptr %2, i8 -1 - store ptr %ptroffset1, ptr %foo, align 8 - store i32 10, ptr %y, align 4 - %3 = load i32, ptr %y, align 4 - %add = add i32 %3, 1 - store i32 %add, ptr %y, align 4 - %4 = load i32, ptr %y, align 4 - %sub = sub i32 %4, 1 - store i32 %sub, ptr %y, align 4 - store float 2.000000e+00, ptr %z, align 4 - %5 = load float, ptr %z, align 4 - %fincdec = fadd float %5, 1.000000e+00 - store float %fincdec, ptr %z, align 4 - %6 = load float, ptr %z, align 4 - %fincdec2 = fadd float %6, 1.000000e+00 - store float %fincdec2, ptr %z, align 4 - %7 = load float, ptr %z, align 4 - %fincdec3 = fadd float %7, -1.000000e+00 - store float %fincdec3, ptr %z, align 4 - ret void diff --git a/test/test_suite2/expressions/pointer_access.c3t b/test/test_suite2/expressions/pointer_access.c3t deleted file mode 100644 index 66aba105f..000000000 --- a/test/test_suite2/expressions/pointer_access.c3t +++ /dev/null @@ -1,104 +0,0 @@ -// #target: macos-x64 -extern fn void printf(char* c, ...); - -struct ExtraSimple -{ - int a; - int b; - struct c - { - double e; - double f0; - double f1; - double f; - double j; - } - struct - { - int r; - int s; - } - union - { - double o0; - int o1; - } - int g; -} - - -fn void testSimple() -{ - ExtraSimple a = { .c.j = 3.3 }; - a.c.j = 3.4; - printf("a = %d, c.e = %f, c.f = %f, c.j = %f, g = %d, o0 = %f, r = %d, s = %d\n", a.a, a.c.e, a.c.f, a.c.j, a.g, a.o0, a.r, a.s); -} - -// TODO these may be wrong. -/* #expect: pointer_access.ll - -%ExtraSimple = type { i32, i32, %c, %.anon, %.anon.0, i32 } -%c = type { double, double, double, double, double } -%.anon = type { i32, i32 } -%.anon.0 = type { double } - -@"ct$pointer_access_c" = linkonce constant %.introspect { i8 10, i64 40, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 -@"ct$pointer_access_$anon" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$pointer_access_$anon.4" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$pointer_access_ExtraSimple" = linkonce constant %.introspect { i8 10, i64 72, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 -@.str = private unnamed_addr constant [71 x i8] c"a = %d, c.e = %f, c.f = %f, c.j = %f, g = %d, o0 = %f, r = %d, s = %d\0A\00", align 1 - -define void @pointer_access_testSimple() #0 { -entry: - %a = alloca %ExtraSimple, align 8 - %0 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 0 - store i32 0, ptr %0, align 8 - %1 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 1 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 - %3 = getelementptr inbounds %c, ptr %2, i32 0, i32 0 - store double 0.000000e+00, ptr %3, align 8 - %4 = getelementptr inbounds %c, ptr %2, i32 0, i32 1 - store double 0.000000e+00, ptr %4, align 8 - %5 = getelementptr inbounds %c, ptr %2, i32 0, i32 2 - store double 0.000000e+00, ptr %5, align 8 - %6 = getelementptr inbounds %c, ptr %2, i32 0, i32 3 - store double 0.000000e+00, ptr %6, align 8 - %7 = getelementptr inbounds %c, ptr %2, i32 0, i32 4 - store double 3.300000e+00, ptr %7, align 8 - %8 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 3 - %9 = getelementptr inbounds %.anon, ptr %8, i32 0, i32 0 - store i32 0, ptr %9, align 8 - %10 = getelementptr inbounds %.anon, ptr %8, i32 0, i32 1 - store i32 0, ptr %10, align 4 - %11 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 4 - call void @llvm.memset.p0.i64(ptr align 8 %11, i8 0, i64 8, i1 false) - %12 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 5 - store i32 0, ptr %12, align 8 - %13 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 - %14 = getelementptr inbounds %c, ptr %13, i32 0, i32 4 - store double 3.400000e+00, ptr %14, align 8 - %15 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 0 - %16 = load i32, ptr %15, align 8 - %17 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 - %18 = getelementptr inbounds %c, ptr %17, i32 0, i32 0 - %19 = load double, ptr %18, align 8 - %20 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 - %21 = getelementptr inbounds %c, ptr %20, i32 0, i32 3 - %22 = load double, ptr %21, align 8 - %23 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 2 - %24 = getelementptr inbounds %c, ptr %23, i32 0, i32 4 - %25 = load double, ptr %24, align 8 - %26 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 5 - %27 = load i32, ptr %26, align 8 - %28 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 4 - %29 = load double, ptr %28, align 8 - %30 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 3 - %31 = getelementptr inbounds %.anon, ptr %30, i32 0, i32 0 - %32 = load i32, ptr %31, align 8 - %33 = getelementptr inbounds %ExtraSimple, ptr %a, i32 0, i32 3 - %34 = getelementptr inbounds %.anon, ptr %33, i32 0, i32 1 - %35 = load i32, ptr %34, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %16, double %19, double %22, double %25, i32 %27, double %29, i32 %32, i32 %35) - ret void -} diff --git a/test/test_suite2/expressions/type_support.c3t b/test/test_suite2/expressions/type_support.c3t deleted file mode 100644 index 3a08d7781..000000000 --- a/test/test_suite2/expressions/type_support.c3t +++ /dev/null @@ -1,76 +0,0 @@ -// #target: macos-x64 - -module test; -import std::io; - -macro print_type_info(...) -{ - $for (var $i = 0; $i < $vacount; $i++): - io::printfln("type: %s", $vatype($i).nameof); - io::printfln("%s.sizeof = %d", $vatype($i).nameof, $vatype($i).sizeof); - io::printfln("%s.min = %s", $vatype($i).nameof, $vatype($i).min); - io::printfln("%s.max = %s\n", $vatype($i).nameof, $vatype($i).max); - $endfor; -} - -fn void main() -{ - io::printfln("Unsigned integers:"); - print_type_info(char, ushort, uint, ulong, uptr, usz, usz); - io::printfln("Signed integers:"); - print_type_info(ichar, short, int, long, iptr, isz, isz); - io::printfln("Floats:"); - print_type_info(float, double); -} - -/* #expect: test.ll - - i64 0 - i64 1 - i8 0 - i8 -1 - i16 0 - i16 -1 - i64 4 - i64 2 - i32 0 - i32 -1 - i64 8 - i64 0 - i64 -1 - i64 8 - i64 0 - i64 -1 - i64 8 - i64 0 - i64 -1 - i64 8 - i64 0 - i64 -1 - i64 1 - i8 -128 - i8 127 - i64 2 - i16 -32768 - i16 32767 - i64 4 - i32 -2147483648 - i32 2147483647 - i64 8 - i64 -9223372036854775808 - i64 9223372036854775807 - i64 8 - i64 -9223372036854775808 - i64 9223372036854775807 - i64 8 - i64 -9223372036854775808 - i64 9223372036854775807 - i64 8 - i64 -9223372036854775808 - i64 9223372036854775807 - i64 4 - float 0xC7EFFFFFE0000000 - float 0x47EFFFFFE0000000 - i64 8 - double 0xFFEFFFFFFFFFFFFF - double 0x7FEFFFFFFFFFFFFF \ No newline at end of file diff --git a/test/test_suite2/functions/func_ptr_conversions_and_names.c3t b/test/test_suite2/functions/func_ptr_conversions_and_names.c3t deleted file mode 100644 index 6d459694a..000000000 --- a/test/test_suite2/functions/func_ptr_conversions_and_names.c3t +++ /dev/null @@ -1,204 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; -define Func = fn int(int y); -define FuncOther = fn bool(char*); -define FuncSame = fn int(int z = 444); - -fn int test(int a) { return a; } -fn int test2(int b = 3) { return b; } - -fn int! test3(int b = 3) { return b; } -fn int! test4(int b = 3) { return b; } - -fn void main() -{ - Func a = &test; - Func b = &test2; - io::printfln("%d", a(.y = 123)); - io::printfln("%d", (&test2)()); - FuncSame z = &test2; - io::printfln("%d", z()); - io::printfln("%s", $typeof(b ? &test2 : &test).qnameof); - io::printfln("%s", $typeof(b ? &test2 : &test).nameof); - io::printfln("%s", $typeof(&test2).qnameof); - io::printfln("%s", $typeof(&test2).nameof); - io::printfln("%s", $typeof(b ? &test4 : &test3).nameof); - - $typeof(b ? &test2 : &test) y = &test2; - typeid zfoke = $typeof(y).typeid; -} - -/* #expect: test.ll - -@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@.str.1 = private unnamed_addr constant [3 x i8] c"%d\00", align 1 -@.str.2 = private unnamed_addr constant [3 x i8] c"%d\00", align 1 -@.str.3 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 -@.str.4 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 -@"ct$char" = linkonce constant %.introspect { i8 3, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$a12$char" = linkonce constant %.introspect { i8 15, i64 12, i64 ptrtoint (ptr @"ct$char" to i64), i64 12, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a12$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$a12$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@.str.5 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 -@.str.6 = private unnamed_addr constant [13 x i8] c"fn int(int)*\00", align 1 -@.str.7 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 -@.str.8 = private unnamed_addr constant [13 x i8] c"test::test2*\00", align 1 -@.str.9 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 -@.str.10 = private unnamed_addr constant [7 x i8] c"test2*\00", align 1 -@"ct$a6$char" = linkonce constant %.introspect { i8 15, i64 6, i64 ptrtoint (ptr @"ct$char" to i64), i64 6, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a6$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$a6$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@.str.11 = private unnamed_addr constant [3 x i8] c"%s\00", align 1 -@.str.12 = private unnamed_addr constant [14 x i8] c"fn int!(int)*\00", align 1 -@"ct$a13$char" = linkonce constant %.introspect { i8 15, i64 13, i64 ptrtoint (ptr @"ct$char" to i64), i64 13, [0 x i64] zeroinitializer }, align 8 -@"ct$p$a13$char" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$a13$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$fn$int$int$" = linkonce constant %.introspect { i8 13, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$p$fn$int$int$" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$fn$int$int$" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 - -define void @test_main() #0 { -entry: - %a = alloca ptr, align 8 - %b = alloca ptr, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %taddr3 = alloca i32, align 4 - %z = alloca ptr, align 8 - %retparam7 = alloca i64, align 8 - %varargslots8 = alloca [1 x %variant], align 16 - %taddr9 = alloca i32, align 4 - %retparam13 = alloca i64, align 8 - %varargslots14 = alloca [1 x %variant], align 16 - %taddr15 = alloca ptr, align 8 - %retparam19 = alloca i64, align 8 - %varargslots20 = alloca [1 x %variant], align 16 - %taddr21 = alloca ptr, align 8 - %retparam25 = alloca i64, align 8 - %varargslots26 = alloca [1 x %variant], align 16 - %taddr27 = alloca ptr, align 8 - %retparam31 = alloca i64, align 8 - %varargslots32 = alloca [1 x %variant], align 16 - %taddr33 = alloca ptr, align 8 - %retparam37 = alloca i64, align 8 - %varargslots38 = alloca [1 x %variant], align 16 - %taddr39 = alloca ptr, align 8 - %y = alloca ptr, align 8 - %zfoke = alloca i64, align 8 - store ptr @test_test, ptr %a, align 8 - store ptr @test_test2, ptr %b, align 8 - %0 = load ptr, ptr %a, align 8 - %1 = call i32 %0(i32 123) - store i32 %1, ptr %taddr, align 4 - %2 = insertvalue %variant undef, ptr %taddr, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %3, ptr %4, align 16 - %5 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %5, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %6 = call i32 @test_test2(i32 3) - store i32 %6, ptr %taddr3, align 4 - %7 = insertvalue %variant undef, ptr %taddr3, 0 - %8 = insertvalue %variant %7, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %9 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %8, ptr %9, align 16 - %10 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.1, i64 2, ptr %varargslots2, i64 1) - %not_err4 = icmp eq i64 %10, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %voiderr - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %voiderr - store ptr @test_test2, ptr %z, align 8 - %11 = load ptr, ptr %z, align 8 - %12 = call i32 %11(i32 444) - store i32 %12, ptr %taddr9, align 4 - %13 = insertvalue %variant undef, ptr %taddr9, 0 - %14 = insertvalue %variant %13, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %15 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 - store %variant %14, ptr %15, align 16 - %16 = call i64 @std_io_printfln(ptr %retparam7, ptr @.str.2, i64 2, ptr %varargslots8, i64 1) - %not_err10 = icmp eq i64 %16, 0 - br i1 %not_err10, label %after_check11, label %voiderr12 - -after_check11: ; preds = %voiderr6 - br label %voiderr12 - -voiderr12: ; preds = %after_check11, %voiderr6 - store ptr @.str.4, ptr %taddr15, align 8 - %17 = insertvalue %variant undef, ptr %taddr15, 0 - %18 = insertvalue %variant %17, i64 ptrtoint (ptr @"ct$p$a12$char" to i64), 1 - %19 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 - store %variant %18, ptr %19, align 16 - %20 = call i64 @std_io_printfln(ptr %retparam13, ptr @.str.3, i64 2, ptr %varargslots14, i64 1) - %not_err16 = icmp eq i64 %20, 0 - br i1 %not_err16, label %after_check17, label %voiderr18 - -after_check17: ; preds = %voiderr12 - br label %voiderr18 - -voiderr18: ; preds = %after_check17, %voiderr12 - store ptr @.str.6, ptr %taddr21, align 8 - %21 = insertvalue %variant undef, ptr %taddr21, 0 - %22 = insertvalue %variant %21, i64 ptrtoint (ptr @"ct$p$a12$char" to i64), 1 - %23 = getelementptr inbounds [1 x %variant], ptr %varargslots20, i64 0, i64 0 - store %variant %22, ptr %23, align 16 - %24 = call i64 @std_io_printfln(ptr %retparam19, ptr @.str.5, i64 2, ptr %varargslots20, i64 1) - %not_err22 = icmp eq i64 %24, 0 - br i1 %not_err22, label %after_check23, label %voiderr24 - -after_check23: ; preds = %voiderr18 - br label %voiderr24 - -voiderr24: ; preds = %after_check23, %voiderr18 - store ptr @.str.8, ptr %taddr27, align 8 - %25 = insertvalue %variant undef, ptr %taddr27, 0 - %26 = insertvalue %variant %25, i64 ptrtoint (ptr @"ct$p$a12$char" to i64), 1 - %27 = getelementptr inbounds [1 x %variant], ptr %varargslots26, i64 0, i64 0 - store %variant %26, ptr %27, align 16 - %28 = call i64 @std_io_printfln(ptr %retparam25, ptr @.str.7, i64 2, ptr %varargslots26, i64 1) - %not_err28 = icmp eq i64 %28, 0 - br i1 %not_err28, label %after_check29, label %voiderr30 - -after_check29: ; preds = %voiderr24 - br label %voiderr30 - -voiderr30: ; preds = %after_check29, %voiderr24 - store ptr @.str.10, ptr %taddr33, align 8 - %29 = insertvalue %variant undef, ptr %taddr33, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$p$a6$char" to i64), 1 - %31 = getelementptr inbounds [1 x %variant], ptr %varargslots32, i64 0, i64 0 - store %variant %30, ptr %31, align 16 - %32 = call i64 @std_io_printfln(ptr %retparam31, ptr @.str.9, i64 2, ptr %varargslots32, i64 1) - %not_err34 = icmp eq i64 %32, 0 - br i1 %not_err34, label %after_check35, label %voiderr36 - -after_check35: ; preds = %voiderr30 - br label %voiderr36 - -voiderr36: ; preds = %after_check35, %voiderr30 - store ptr @.str.12, ptr %taddr39, align 8 - %33 = insertvalue %variant undef, ptr %taddr39, 0 - %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$p$a13$char" to i64), 1 - %35 = getelementptr inbounds [1 x %variant], ptr %varargslots38, i64 0, i64 0 - store %variant %34, ptr %35, align 16 - %36 = call i64 @std_io_printfln(ptr %retparam37, ptr @.str.11, i64 2, ptr %varargslots38, i64 1) - %not_err40 = icmp eq i64 %36, 0 - br i1 %not_err40, label %after_check41, label %voiderr42 - -after_check41: ; preds = %voiderr36 - br label %voiderr42 - -voiderr42: ; preds = %after_check41, %voiderr36 - store ptr @test_test2, ptr %y, align 8 - store i64 ptrtoint (ptr @"ct$p$fn$int$int$" to i64), ptr %zfoke, align 8 - ret void -} diff --git a/test/test_suite2/functions/simple_test.c3t b/test/test_suite2/functions/simple_test.c3t deleted file mode 100644 index cd197087a..000000000 --- a/test/test_suite2/functions/simple_test.c3t +++ /dev/null @@ -1,30 +0,0 @@ -// #target: macos-x64 - -fn int foo() -{ - char *pp; - uint w_cnt; - - w_cnt += *pp; - - return w_cnt; -} - -/* #expect: simple_test.ll - - -define i32 @simple_test_foo() #0 { -entry: - %pp = alloca ptr, align 8 - %w_cnt = alloca i32, align 4 - store ptr null, ptr %pp, align 8 - store i32 0, ptr %w_cnt, align 4 - %0 = load i32, ptr %w_cnt, align 4 - %1 = load ptr, ptr %pp, align 8 - %2 = load i8, ptr %1, align 8 - %zext = zext i8 %2 to i32 - %add = add i32 %0, %zext - store i32 %add, ptr %w_cnt, align 4 - %3 = load i32, ptr %w_cnt, align 4 - ret i32 %3 -} \ No newline at end of file diff --git a/test/test_suite2/functions/splat.c3t b/test/test_suite2/functions/splat.c3t deleted file mode 100644 index de3dae794..000000000 --- a/test/test_suite2/functions/splat.c3t +++ /dev/null @@ -1,43 +0,0 @@ -// #target: macos-x64 -module splat; - -extern fn int sum_us(int... x); - -fn void test() -{ - sum_us(1, 2, 3); - int[3] x = { 1, 2, 3 }; - int[] z = &x; - sum_us(...x); - sum_us(...z); - sum_us(); -} - -/* #expect: splat.ll - - -declare i32 @sum_us(ptr, i64) #0 - - %varargslots = alloca [3 x i32], align 4 - %x = alloca [3 x i32], align 4 - %z = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 0 - store i32 1, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 1 - store i32 2, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 2 - store i32 3, ptr %2, align 4 - %3 = call i32 @sum_us(ptr %varargslots, i64 3) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %4 = insertvalue %"int[]" undef, ptr %x, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - store %"int[]" %5, ptr %z, align 8 - %6 = call i32 @sum_us(ptr %x, i64 3) - %7 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 0 - %lo = load ptr, ptr %7, align 8 - %8 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 1 - %hi = load i64, ptr %8, align 8 - %9 = call i32 @sum_us(ptr %lo, i64 %hi) - %10 = call i32 @sum_us(ptr null, i64 0) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/functions/splat_aarch64.c3t b/test/test_suite2/functions/splat_aarch64.c3t deleted file mode 100644 index 902213b4b..000000000 --- a/test/test_suite2/functions/splat_aarch64.c3t +++ /dev/null @@ -1,57 +0,0 @@ -// #target: linux-aarch64 -module splat; - -extern fn int sum_us(int... x); - -fn void test() -{ - sum_us(1, 2, 3); - int[3] x = { 1, 2, 3 }; - int[] z = &x; - sum_us(...x); - sum_us(...z); - sum_us(); -} - -/* #expect: splat.ll - - -%"int[]" = type { ptr, i64 } - -declare i32 @sum_us([2 x i64]) #0 - -define void @splat_test() #0 { -entry: - %varargslots = alloca [3 x i32], align 4 - %taddr = alloca %"int[]", align 8 - %x = alloca [3 x i32], align 4 - %z = alloca %"int[]", align 8 - %taddr1 = alloca %"int[]", align 8 - %taddr2 = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 0 - store i32 1, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 1 - store i32 2, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 2 - store i32 3, ptr %2, align 4 - %3 = insertvalue %"int[]" undef, ptr %varargslots, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, ptr %taddr, align 8 - %5 = load [2 x i64], ptr %taddr, align 8 - %6 = call i32 @sum_us([2 x i64] %5) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %7 = insertvalue %"int[]" undef, ptr %x, 0 - %8 = insertvalue %"int[]" %7, i64 3, 1 - store %"int[]" %8, ptr %z, align 8 - %9 = insertvalue %"int[]" undef, ptr %x, 0 - %10 = insertvalue %"int[]" %9, i64 3, 1 - store %"int[]" %10, ptr %taddr1, align 8 - %11 = load [2 x i64], ptr %taddr1, align 8 - %12 = call i32 @sum_us([2 x i64] %11) - %13 = load [2 x i64], ptr %z, align 8 - %14 = call i32 @sum_us([2 x i64] %13) - store %"int[]" zeroinitializer, ptr %taddr2, align 8 - %15 = load [2 x i64], ptr %taddr2, align 8 - %16 = call i32 @sum_us([2 x i64] %15) - ret void -} diff --git a/test/test_suite2/functions/splat_mingw.c3t b/test/test_suite2/functions/splat_mingw.c3t deleted file mode 100644 index bcedcd954..000000000 --- a/test/test_suite2/functions/splat_mingw.c3t +++ /dev/null @@ -1,51 +0,0 @@ -// #target: mingw-x64 -module splat; - -extern fn int sum_us(int... x); - -fn void test() -{ - sum_us(1, 2, 3); - int[3] x = { 1, 2, 3 }; - int[] z = &x; - sum_us(...x); - sum_us(...z); - sum_us(); -} - -/* #expect: splat.ll - -declare i32 @sum_us(ptr align 8) #0 - -define void @splat_test() #0 { -entry: - %varargslots = alloca [3 x i32], align 4 - %indirectarg = alloca %"int[]", align 8 - %x = alloca [3 x i32], align 4 - %z = alloca %"int[]", align 8 - %indirectarg1 = alloca %"int[]", align 8 - %indirectarg2 = alloca %"int[]", align 8 - %indirectarg3 = alloca %"int[]", align 8 - %0 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 0 - store i32 1, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 1 - store i32 2, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %varargslots, i64 0, i64 2 - store i32 3, ptr %2, align 4 - %3 = insertvalue %"int[]" undef, ptr %varargslots, 0 - %4 = insertvalue %"int[]" %3, i64 3, 1 - store %"int[]" %4, ptr %indirectarg, align 8 - %5 = call i32 @sum_us(ptr align 8 %indirectarg) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %6 = insertvalue %"int[]" undef, ptr %x, 0 - %7 = insertvalue %"int[]" %6, i64 3, 1 - store %"int[]" %7, ptr %z, align 8 - %8 = insertvalue %"int[]" undef, ptr %x, 0 - %9 = insertvalue %"int[]" %8, i64 3, 1 - store %"int[]" %9, ptr %indirectarg1, align 8 - %10 = call i32 @sum_us(ptr align 8 %indirectarg1) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg2, ptr align 8 %z, i32 16, i1 false) - %11 = call i32 @sum_us(ptr align 8 %indirectarg2) - store %"int[]" zeroinitializer, ptr %indirectarg3, align 8 - %12 = call i32 @sum_us(ptr align 8 %indirectarg3) - ret void diff --git a/test/test_suite2/functions/test_regression.c3t b/test/test_suite2/functions/test_regression.c3t deleted file mode 100644 index 0092950a4..000000000 --- a/test/test_suite2/functions/test_regression.c3t +++ /dev/null @@ -1,618 +0,0 @@ -// #target: macos-x64 - -module test; -import test2; -import std::array::list; -import std::array::linkedlist; -import hello_world; - - -extern fn int printf(char *, ...); - -fn void helloWorld() -{ - printf("helloWorld!\n"); -} -fn int test_static() -{ - static int x = 1; - x++; - printf("Test static %d\n", x); - return x; -} - -struct Bobo { short b; float c; short d; short e; float f; short g; } - - -struct Blob { int z; int f; } - -union Foor -{ - long a; - char[12] b; -} - - -fn int helo(double d, Bobo b) -{ - int[3] de = { 1, 2, 3 }; - Bobo c = b; - helo(1.0, c); - return 1; -} - - -fn int test1(int a, int b) -{ - a = a >> b; - if (b > 128) return -1; - return a; -} - -struct Foo2 -{ - int x; -} - -fn void Foo2.printme(Foo2 *foo) -{ - printf("Foo is: %d\n", foo.x); -} - -fn int Foo2.mutate(Foo2 *foo) -{ - printf("Mutating"); - return ++foo.x; -} - -define oopsInt = test2::argh; -define oopsDouble = test2::argh; -define Argh = fn int(double, Bobo); -define Argh2 = fn int(double, Bobo); - - - -fn int sum_us(int... x) -{ - int sum = 0; - if (x.len == 0) return 0; - sum += x[0] + sum_us(...x[1..^1]); - return sum; -} - -define Frob = long; - -fn int sumd(int[] x) -{ - int sum = 0; - for (int i = 0; i < x.len; i++) sum += x[i]; - return sum; -} - -struct Foo -{ - int a; - int b; -} - -define getValueInt = test2::getValue; -define getValueDouble = test2::getValue; -define IntBlob = test2::Blob; -define DoubleBlob = Blob; -define getMultInt = test2::getMult; -define getMultDouble = test2::getMult; - -define IntArray = List; -define IntList = LinkedList; - -enum MyEnum : int -{ - HELO, - WORLD, - BYE -} - - -fn void main() -{ - test_static(); - test_static(); - test_static(); - hello_world::hello(); - IntList list; - list.push(10); - list.push(15); - list.push(30); - for (int i = 0; i < (int)(list.len()); i++) - { - printf("Element[%d]: %d\n", i, list.get(i)); - } - list.free(); - - printf("Elements: %d\n", (int)(MyEnum.elements)); - - int elements = MyEnum.elements; - printf("Hello\n"); - IntArray array; - array.append(100); - array.append(200); - array.append(400); - array.push(600); - array.insert_at(2, 300); - for (int i = 0; i < (int)(array.len()); i++) - { - printf("Element[%d]: %d\n", i, array.get(i)); - } - array.free(); - IntBlob a = { 42 }; - DoubleBlob b = { 33.3 }; - printf("a was %d\n", getValueInt(a)); - printf("b was %f\n", getValueDouble(b)); - printf("Mult int was %d\n", getMultInt(25)); - printf("Mult double was %f\n", getMultDouble(3.3)); - - - helloWorld(); - Foo ddx; - int fro = 3; - int[4] x = { 1, 2, 3, 3 }; - fro += printf("1Vararg4splatA: %d\n", sum_us(...x)); - printf("%d\n", fro); - int[] z = &x; - int[3] de = { 1, 2, 3 }; - printf("Vararg4splatB: %d\n", sum_us(...&x)); - printf("Vararg4splatC: %d\n", sum_us(...z)); - printf("Vararg4: %d\n", sum_us(1, 2, 4, 5)); - printf("Vararg1: %d\n", sum_us(1)); - printf("Vararg0: %d\n", sum_us()); - Argh a1; - Argh2 b2; -} - -module hello_world; -import foo; - -extern fn int printf(char *, ...); -define doubleMult = foo::check; - -fn void hello() -{ - printf("Hello baby\n"); - printf("Mult %f\n", doubleMult(11.1)); -} - -module foo ; - -fn Type check(Type i) -{ - return i * i; -} - -module test2 ; - -struct Blob -{ - Type a; -} - -fn Type getMult(Type a) -{ - return a * a; -} -Type argh = 234; - -fault MyErr -{ - X, - Y -} - -enum Hello : int -{ - FOO, - BAR, -} - -macro Hello wut() -{ - return Hello.FOO; -} - -define Bye = Hello; -define wat = wut; -define byebye = hello; - -fn int hello() -{ - return 1; -} - -fn Type getValue(Blob blob) -{ - return blob.a; -} - -/* #expect: test.ll - - %Blob = type { i32 } - %Blob.0 = type { double } - %Foo2 = type { i32 } - %Bobo = type { i16, float, i16, i16, float, i16 } - %"int[]" = type { ptr, i64 } - %LinkedList = type { i64, ptr, ptr } - %List = type { i64, i64, ptr, ptr } - %Foo = type { i32, i32 } - - @"ct$test_Bobo" = linkonce constant %.introspect { i8 10, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8 - @"ct$test_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 - @"ct$test_Foor" = linkonce constant %.introspect { i8 11, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 - @"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 - @"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 - @"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - @"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (ptr @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 4 }, %"char[]" { ptr @.enum.1, i64 5 }, %"char[]" { ptr @.enum.2, i64 3 }] }, align 8 - @"test_static$x" = internal unnamed_addr global i32 1, align 4 - - define void @test_Foo2_printme(ptr %0) #0 { - entry: - %1 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 - %2 = load i32, ptr %1, align 8 - %3 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %2) - ret void - } - - ; Function Attrs: nounwind - define i32 @test_Foo2_mutate(ptr %0) #0 { - entry: - %1 = call i32 (ptr, ...) @printf(ptr @.str.22) - %2 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 - %3 = load i32, ptr %2, align 8 - %add = add i32 %3, 1 - store i32 %add, ptr %2, align 8 - ret i32 %add - } - - ; Function Attrs: nounwind - declare i32 @printf(ptr, ...) #0 - - ; Function Attrs: nounwind - define void @test_helloWorld() #0 { - entry: - %0 = call i32 (ptr, ...) @printf(ptr @.str) - ret void - } - - ; Function Attrs: nounwind - define i32 @test_test_static() #0 { - entry: - %0 = load i32, ptr @"test_static$x", align 4 - %add = add i32 %0, 1 - store i32 %add, ptr @"test_static$x", align 4 - %1 = load i32, ptr @"test_static$x", align 4 - %2 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %1) - %3 = load i32, ptr @"test_static$x", align 4 - ret i32 %3 - } - - ; Function Attrs: nounwind - define i32 @test_helo(double %0, ptr byval(%Bobo) align 8 %1) #0 { - entry: - %de = alloca [3 x i32], align 4 - %c = alloca %Bobo, align 4 - %indirectarg = alloca %Bobo, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const, i32 12, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %c, ptr align 4 %1, i32 20, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg, ptr align 4 %c, i32 20, i1 false) - %2 = call i32 @test_helo(double 1.000000e+00, ptr byval(%Bobo) align 8 %indirectarg) - ret i32 1 - } - - ; Function Attrs: nounwind - define i32 @test_test1(i32 %0, i32 %1) #0 { - entry: - %a = alloca i32, align 4 - store i32 %0, ptr %a, align 4 - %2 = load i32, ptr %a, align 4 - %ashr = ashr i32 %2, %1 - %3 = freeze i32 %ashr - store i32 %3, ptr %a, align 4 - %gt = icmp sgt i32 %1, 128 - br i1 %gt, label %if.then, label %if.exit - - if.then: ; preds = %entry - ret i32 -1 - - if.exit: ; preds = %entry - %4 = load i32, ptr %a, align 4 - ret i32 %4 - } - - ; Function Attrs: nounwind - define i32 @test_sum_us(ptr %0, i64 %1) #0 { - entry: - %x = alloca %"int[]", align 8 - %sum = alloca i32, align 4 - %2 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - store i32 0, ptr %sum, align 4 - %4 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - %eq = icmp eq i64 0, %5 - br i1 %eq, label %if.then, label %if.exit - - if.then: ; preds = %entry - ret i32 0 - - if.exit: ; preds = %entry - %6 = load i32, ptr %sum, align 4 - %7 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - %ptroffset = getelementptr inbounds i32, ptr %8, i64 0 - %9 = load i32, ptr %ptroffset, align 4 - %10 = load %"int[]", ptr %x, align 8 - %11 = extractvalue %"int[]" %10, 0 - %12 = extractvalue %"int[]" %10, 1 - %sub = sub i64 %12, 1 - %13 = add i64 %sub, 1 - %size = sub i64 %13, 1 - %ptroffset1 = getelementptr inbounds i32, ptr %11, i64 1 - %14 = call i32 @test_sum_us(ptr %ptroffset1, i64 %size) - %add = add i32 %9, %14 - %add2 = add i32 %6, %add - store i32 %add2, ptr %sum, align 4 - %15 = load i32, ptr %sum, align 4 - ret i32 %15 - } - - ; Function Attrs: nounwind - define i32 @test_sumd(ptr %0, i64 %1) #0 { - entry: - %x = alloca %"int[]", align 8 - %sum = alloca i32, align 4 - %i = alloca i32, align 4 - %2 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %x, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - store i32 0, ptr %sum, align 4 - store i32 0, ptr %i, align 4 - br label %loop.cond - - loop.cond: ; preds = %loop.body, %entry - %4 = load i32, ptr %i, align 4 - %sisiext = sext i32 %4 to i64 - %5 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 - %6 = load i64, ptr %5, align 8 - %lt = icmp slt i64 %sisiext, %6 - %check = icmp slt i64 %6, 0 - %siui-lt = or i1 %check, %lt - br i1 %siui-lt, label %loop.body, label %loop.exit - - loop.body: ; preds = %loop.cond - %7 = load i32, ptr %sum, align 4 - %8 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = load i32, ptr %i, align 4 - %sisiext1 = sext i32 %10 to i64 - %ptroffset = getelementptr inbounds i32, ptr %9, i64 %sisiext1 - %11 = load i32, ptr %ptroffset, align 4 - %add = add i32 %7, %11 - store i32 %add, ptr %sum, align 4 - %12 = load i32, ptr %i, align 4 - %add2 = add i32 %12, 1 - store i32 %add2, ptr %i, align 4 - br label %loop.cond - - loop.exit: ; preds = %loop.cond - %13 = load i32, ptr %sum, align 4 - ret i32 %13 - } - - ; Function Attrs: nounwind - define void @test_main() #0 { - entry: - %list = alloca %LinkedList, align 8 - %i = alloca i32, align 4 - %elements = alloca i32, align 4 - %array = alloca %List, align 8 - %i1 = alloca i32, align 4 - %a = alloca %Blob, align 4 - %b = alloca %Blob.0, align 8 - %ddx = alloca %Foo, align 4 - %fro = alloca i32, align 4 - %x = alloca [4 x i32], align 16 - %z = alloca %"int[]", align 8 - %de = alloca [3 x i32], align 4 - %varargslots = alloca [4 x i32], align 16 - %varargslots10 = alloca [1 x i32], align 4 - %a1 = alloca ptr, align 8 - %b2 = alloca ptr, align 8 - %0 = call i32 @test_test_static() - %1 = call i32 @test_test_static() - %2 = call i32 @test_test_static() - call void @hello_world_hello() - call void @llvm.memset.p0.i64(ptr align 8 %list, i8 0, i64 24, i1 false) - call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 10) - call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 15) - call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 30) - store i32 0, ptr %i, align 4 - br label %loop.cond - - loop.cond: ; preds = %loop.body, %entry - %3 = load i32, ptr %i, align 4 - %4 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(ptr %list) #3 - %uisitrunc = trunc i64 %4 to i32 - %lt = icmp slt i32 %3, %uisitrunc - br i1 %lt, label %loop.body, label %loop.exit - - loop.body: ; preds = %loop.cond - %5 = load i32, ptr %i, align 4 - %6 = load i32, ptr %i, align 4 - %siuiext = sext i32 %6 to i64 - %7 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(ptr %list, i64 %siuiext) - %8 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %5, i32 %7) - %9 = load i32, ptr %i, align 4 - %add = add i32 %9, 1 - store i32 %add, ptr %i, align 4 - br label %loop.cond - - loop.exit: ; preds = %loop.cond - call void @"std_array_linkedlist$$int_LinkedList_free"(ptr %list) - %10 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 3) - store i32 3, ptr %elements, align 4 - %11 = call i32 (ptr, ...) @printf(ptr @.str.4) - call void @llvm.memset.p0.i64(ptr align 8 %array, i8 0, i64 32, i1 false) - call void @"std_array_list$$int_List_append"(ptr %array, i32 100) - call void @"std_array_list$$int_List_append"(ptr %array, i32 200) - call void @"std_array_list$$int_List_append"(ptr %array, i32 400) - call void @"std_array_list$$int_List_push"(ptr %array, i32 600) #3 - call void @"std_array_list$$int_List_insert_at"(ptr %array, i64 2, i32 300) - store i32 0, ptr %i1, align 4 - br label %loop.cond2 - - loop.cond2: ; preds = %loop.body5, %loop.exit - %12 = load i32, ptr %i1, align 4 - %13 = call i64 @"std_array_list$$int_List_len"(ptr %array) - %uisitrunc3 = trunc i64 %13 to i32 - %lt4 = icmp slt i32 %12, %uisitrunc3 - br i1 %lt4, label %loop.body5, label %loop.exit8 - - loop.body5: ; preds = %loop.cond2 - %14 = load i32, ptr %i1, align 4 - %15 = load i32, ptr %i1, align 4 - %siuiext6 = sext i32 %15 to i64 - %16 = call i32 @"std_array_list$$int_List_get"(ptr %array, i64 %siuiext6) - %17 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %14, i32 %16) - %18 = load i32, ptr %i1, align 4 - %add7 = add i32 %18, 1 - store i32 %add7, ptr %i1, align 4 - br label %loop.cond2 - - loop.exit8: ; preds = %loop.cond2 - call void @"std_array_list$$int_List_free"(ptr %array) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 @.__const.6, i32 4, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %b, ptr align 8 @.__const.7, i32 8, i1 false) - %19 = getelementptr inbounds %Blob, ptr %a, i32 0, i32 0 - %20 = load i32, ptr %19, align 4 - %21 = call i32 @"test2$$int_getValue"(i32 %20) - %22 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %21) - %23 = getelementptr inbounds %Blob.0, ptr %b, i32 0, i32 0 - %24 = load double, ptr %23, align 8 - %25 = call double @"test2$$double_getValue"(double %24) - %26 = call i32 (ptr, ...) @printf(ptr @.str.9, double %25) - %27 = call i32 @"test2$$int_getMult"(i32 25) - %28 = call i32 (ptr, ...) @printf(ptr @.str.10, i32 %27) - %29 = call double @"test2$$double_getMult"(double 3.300000e+00) - %30 = call i32 (ptr, ...) @printf(ptr @.str.11, double %29) - call void @test_helloWorld() - %31 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 0 - store i32 0, ptr %31, align 4 - %32 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 1 - store i32 0, ptr %32, align 4 - store i32 3, ptr %fro, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 16 @.__const.12, i32 16, i1 false) - %33 = load i32, ptr %fro, align 4 - %34 = call i32 @test_sum_us(ptr %x, i64 4) - %35 = call i32 (ptr, ...) @printf(ptr @.str.13, i32 %34) - %add9 = add i32 %33, %35 - store i32 %add9, ptr %fro, align 4 - %36 = load i32, ptr %fro, align 4 - %37 = call i32 (ptr, ...) @printf(ptr @.str.14, i32 %36) - %38 = insertvalue %"int[]" undef, ptr %x, 0 - %39 = insertvalue %"int[]" %38, i64 4, 1 - store %"int[]" %39, ptr %z, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const.15, i32 12, i1 false) - %40 = call i32 @test_sum_us(ptr %x, i64 4) - %41 = call i32 (ptr, ...) @printf(ptr @.str.16, i32 %40) - %42 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 0 - %lo = load ptr, ptr %42, align 8 - %43 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 1 - %hi = load i64, ptr %43, align 8 - %44 = call i32 @test_sum_us(ptr %lo, i64 %hi) - %45 = call i32 (ptr, ...) @printf(ptr @.str.17, i32 %44) - %46 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 0 - store i32 1, ptr %46, align 4 - %47 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 1 - store i32 2, ptr %47, align 4 - %48 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 2 - store i32 4, ptr %48, align 4 - %49 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 3 - store i32 5, ptr %49, align 4 - %50 = call i32 @test_sum_us(ptr %varargslots, i64 4) - %51 = call i32 (ptr, ...) @printf(ptr @.str.18, i32 %50) - %52 = getelementptr inbounds [1 x i32], ptr %varargslots10, i64 0, i64 0 - store i32 1, ptr %52, align 4 - %53 = call i32 @test_sum_us(ptr %varargslots10, i64 1) - %54 = call i32 (ptr, ...) @printf(ptr @.str.19, i32 %53) - %55 = call i32 @test_sum_us(ptr null, i64 0) - %56 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %55) - store ptr null, ptr %a1, align 8 - store ptr null, ptr %b2, align 8 - ret void - } -// #expect: hello_world.ll - -define void @hello_world_hello() -entry: - %0 = call i32 (ptr, ...) @printf(ptr @.str) - %1 = call double @"foo$$double_check"(double 1.110000e+01) - %2 = call i32 (ptr, ...) @printf(ptr @.str.1, double %1) - ret void - -// #expect: foo.double.ll - -define double @"foo$$double_check"(double %0) -entry: - %fmul = fmul double %0, %0 - ret double %fmul - - -// #expect: test2.int.ll - -%Blob = type { i32 } -@"test2$$int_argh" = local_unnamed_addr global i32 234, align 4 - -define i32 @"test2$$int_getMult"(i32 %0) #0 { -entry: - %mul = mul i32 %0, %0 - ret i32 %mul -} - -define i32 @"test2$$int_hello"() #0 { -entry: - ret i32 1 -} - -define i32 @"test2$$int_getValue"(i32 %0) #0 { -entry: - %blob = alloca %Blob, align 4 - %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - store i32 %0, ptr %1, align 4 - %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - %3 = load i32, ptr %2, align 4 - ret i32 %3 -} - -// #expect: test2.double.ll - -%Blob = type { double } -@"test2$$double_argh" = local_unnamed_addr global double 2.340000e+02, align 8 - -define double @"test2$$double_getMult"(double %0) -entry: - %fmul = fmul double %0, %0 - ret double %fmul - -define i32 @"test2$$double_hello"() -entry: - ret i32 1 - -define double @"test2$$double_getValue"(double %0) - entry: - %blob = alloca %Blob, align 8 - %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - store double %0, ptr %1, align 8 - %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - %3 = load double, ptr %2, align 8 - ret double %3 \ No newline at end of file diff --git a/test/test_suite2/functions/test_regression_mingw.c3t b/test/test_suite2/functions/test_regression_mingw.c3t deleted file mode 100644 index feb7dd13e..000000000 --- a/test/test_suite2/functions/test_regression_mingw.c3t +++ /dev/null @@ -1,699 +0,0 @@ -// #target: mingw-x64 - -module test; -import test2; -import std::array::list; -import std::array::linkedlist; -import hello_world; - - -extern fn int printf(char *, ...); - -fn void helloWorld() -{ - printf("helloWorld!\n"); -} -fn int test_static() -{ - static int x = 1; - x++; - printf("Test static %d\n", x); - return x; -} - -struct Bobo { short b; float c; short d; short e; float f; short g; } - - -struct Blob { int z; int f; } - -union Foor -{ - long a; - char[12] b; -} - - -fn int helo(double d, Bobo b) -{ - int[3] de = { 1, 2, 3 }; - Bobo c = b; - helo(1.0, c); - return 1; -} - - -fn int test1(int a, int b) -{ - a = a >> b; - if (b > 128) return -1; - return a; -} - -struct Foo2 -{ - int x; -} - -fn void Foo2.printme(Foo2 *foo) -{ - printf("Foo is: %d\n", foo.x); -} - -fn int Foo2.mutate(Foo2 *foo) -{ - printf("Mutating"); - return ++foo.x; -} - - - -define oopsInt = test2::argh; -define oopsDouble = test2::argh; -define Argh = fn int(double, Bobo); -define Argh2 = fn int(double, Bobo); - - - -fn int sum_us(int... x) -{ - int sum = 0; - if (x.len == 0) return 0; - sum += x[0] + sum_us(...x[1..^1]); - return sum; -} - -define Frob = long; - -fn int sumd(int[] x) -{ - int sum = 0; - for (int i = 0; i < x.len; i++) sum += x[i]; - return sum; -} - -struct Foo -{ - int a; - int b; -} - -define getValueInt = test2::getValue; -define getValueDouble = test2::getValue; -define IntBlob = test2::Blob; -define DoubleBlob = Blob; -define getMultInt = test2::getMult; -define getMultDouble = test2::getMult; - -define IntArray = List; -define IntList = LinkedList; - -enum MyEnum : int -{ - HELO, - WORLD, - BYE -} - - -fn void main() -{ - test_static(); - test_static(); - test_static(); - hello_world::hello(); - IntList list; - list.push(10); - list.push(15); - list.push(30); - for (int i = 0; i < (int)(list.len()); i++) - { - printf("Element[%d]: %d\n", i, list.get(i)); - } - list.free(); - - printf("Elements: %d\n", (int)(MyEnum.elements)); - - int elements = MyEnum.elements; - printf("Hello\n"); - IntArray array; - array.append(100); - array.append(200); - array.append(400); - array.push(600); - array.insert_at(2, 300); - for (int i = 0; i < (int)(array.len()); i++) - { - printf("Element[%d]: %d\n", i, array.get(i)); - } - array.free(); - IntBlob a = { 42 }; - DoubleBlob b = { 33.3 }; - printf("a was %d\n", getValueInt(a)); - printf("b was %f\n", getValueDouble(b)); - printf("Mult int was %d\n", getMultInt(25)); - printf("Mult double was %f\n", getMultDouble(3.3)); - - - helloWorld(); - Foo ddx; - int fro = 3; - int[4] x = { 1, 2, 3, 3 }; - fro += printf("1Vararg4splatA: %d\n", sum_us(...x)); - printf("%d\n", fro); - int[] z = &x; - int[3] de = { 1, 2, 3 }; - printf("Vararg4splatB: %d\n", sum_us(...&x)); - printf("Vararg4splatC: %d\n", sum_us(...z)); - printf("Vararg4: %d\n", sum_us(1, 2, 4, 5)); - printf("Vararg1: %d\n", sum_us(1)); - printf("Vararg0: %d\n", sum_us()); - Argh a1; - Argh2 b2; -} - -module hello_world; -import foo; - -extern fn int printf(char *, ...); -define doubleMult = foo::check; - -fn void hello() -{ - printf("Hello baby\n"); - printf("Mult %f\n", doubleMult(11.1)); -} - -module foo ; - -fn Type check(Type i) -{ - return i * i; -} - -module test2 ; - -struct Blob -{ - Type a; -} - -fn Type getMult(Type a) -{ - return a * a; -} -Type argh = 234; - -fault MyErr -{ - X, - Y -} - -enum Hello : int -{ - FOO, - BAR, -} - -macro Hello wut() -{ - return Hello.FOO; -} - -define Bye = Hello; -define wat = wut; -define byebye = hello; - -fn int hello() -{ - return 1; -} - -fn Type getValue(Blob blob) -{ - return blob.a; -} - -/* #expect: test.ll - -%Blob = type { i32 } -%Blob.0 = type { double } -%Foo2 = type { i32 } -%Bobo = type { i16, float, i16, i16, float, i16 } -%"int[]" = type { ptr, i64 } -%LinkedList = type { i64, ptr, ptr } -%List = type { i64, i64, ptr, ptr } -%Foo = type { i32, i32 } - -$"ct$test_Bobo" = comdat any - -$"ct$test_Blob" = comdat any - -$"ct$test_Foor" = comdat any - -$"ct$test_Foo2" = comdat any - -$"ct$test_Foo" = comdat any - -$"ct$int" = comdat any - -$"ct$test_MyEnum" = comdat any - -@"ct$test_Bobo" = linkonce constant %.introspect { i8 10, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$test_Blob" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$test_Foor" = linkonce constant %.introspect { i8 11, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$test_Foo2" = linkonce constant %.introspect { i8 10, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$test_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, comdat, align 8 -@"ct$test_MyEnum" = linkonce constant { i8, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 4, i64 ptrtoint (ptr @"ct$int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.0, i64 4 }, %"char[]" { ptr @.enum.1, i64 5 }, %"char[]" { ptr @.enum.2, i64 3 }] }, comdat, align 8 -@.str = private unnamed_addr constant [13 x i8] c"helloWorld!\0A\00", align 1 -@"test_static$x" = internal unnamed_addr global i32 1, align 4 -@.str.1 = private unnamed_addr constant [16 x i8] c"Test static %d\0A\00", align 1 -@.__const = private unnamed_addr constant [3 x i32] [i32 1, i32 2, i32 3], align 4 -@.str.2 = private unnamed_addr constant [17 x i8] c"Element[%d]: %d\0A\00", align 1 -@.str.3 = private unnamed_addr constant [14 x i8] c"Elements: %d\0A\00", align 1 -@.str.4 = private unnamed_addr constant [7 x i8] c"Hello\0A\00", align 1 -@.str.5 = private unnamed_addr constant [17 x i8] c"Element[%d]: %d\0A\00", align 1 -@.__const.6 = private unnamed_addr constant %Blob { i32 42 }, align 4 -@.__const.7 = private unnamed_addr constant %Blob.0 { double 3.330000e+01 }, align 8 -@.str.8 = private unnamed_addr constant [10 x i8] c"a was %d\0A\00", align 1 -@.str.9 = private unnamed_addr constant [10 x i8] c"b was %f\0A\00", align 1 -@.str.10 = private unnamed_addr constant [17 x i8] c"Mult int was %d\0A\00", align 1 -@.str.11 = private unnamed_addr constant [20 x i8] c"Mult double was %f\0A\00", align 1 -@.__const.12 = private unnamed_addr constant [4 x i32] [i32 1, i32 2, i32 3, i32 3], align 16 -@.str.13 = private unnamed_addr constant [20 x i8] c"1Vararg4splatA: %d\0A\00", align 1 -@.str.14 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 -@.__const.15 = private unnamed_addr constant [3 x i32] [i32 1, i32 2, i32 3], align 4 -@.str.16 = private unnamed_addr constant [19 x i8] c"Vararg4splatB: %d\0A\00", align 1 -@.str.17 = private unnamed_addr constant [19 x i8] c"Vararg4splatC: %d\0A\00", align 1 -@.str.18 = private unnamed_addr constant [13 x i8] c"Vararg4: %d\0A\00", align 1 -@.str.19 = private unnamed_addr constant [13 x i8] c"Vararg1: %d\0A\00", align 1 -@.str.20 = private unnamed_addr constant [13 x i8] c"Vararg0: %d\0A\00", align 1 -@.str.21 = private unnamed_addr constant [12 x i8] c"Foo is: %d\0A\00", align 1 -@.str.22 = private unnamed_addr constant [9 x i8] c"Mutating\00", align 1 - -; Function Attrs: nounwind -define void @test_Foo2_printme(ptr %0) #0 { -entry: - %1 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 - %2 = load i32, ptr %1, align 8 - %3 = call i32 (ptr, ...) @printf(ptr @.str.21, i32 %2) - ret void -} - -; Function Attrs: nounwind -define i32 @test_Foo2_mutate(ptr %0) #0 { -entry: - %1 = call i32 (ptr, ...) @printf(ptr @.str.22) - %2 = getelementptr inbounds %Foo2, ptr %0, i32 0, i32 0 - %3 = load i32, ptr %2, align 8 - %add = add i32 %3, 1 - store i32 %add, ptr %2, align 8 - ret i32 %add -} - -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -define void @test_helloWorld() #0 { -entry: - %0 = call i32 (ptr, ...) @printf(ptr @.str) - ret void -} - -; Function Attrs: nounwind -define i32 @test_test_static() #0 { -entry: - %0 = load i32, ptr @"test_static$x", align 4 - %add = add i32 %0, 1 - store i32 %add, ptr @"test_static$x", align 4 - %1 = load i32, ptr @"test_static$x", align 4 - %2 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %1) - %3 = load i32, ptr @"test_static$x", align 4 - ret i32 %3 -} - -; Function Attrs: nounwind -define i32 @test_helo(double %0, ptr align 4 %1) #0 { -entry: - %de = alloca [3 x i32], align 4 - %c = alloca %Bobo, align 4 - %indirectarg = alloca %Bobo, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const, i32 12, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %c, ptr align 4 %1, i32 20, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %indirectarg, ptr align 4 %c, i32 20, i1 false) - %2 = call i32 @test_helo(double 1.000000e+00, ptr align 4 %indirectarg) - ret i32 1 -} - -; Function Attrs: nounwind -define i32 @test_test1(i32 %0, i32 %1) #0 { -entry: - %a = alloca i32, align 4 - store i32 %0, ptr %a, align 4 - %2 = load i32, ptr %a, align 4 - %ashr = ashr i32 %2, %1 - %3 = freeze i32 %ashr - store i32 %3, ptr %a, align 4 - %gt = icmp sgt i32 %1, 128 - br i1 %gt, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i32 -1 - -if.exit: ; preds = %entry - %4 = load i32, ptr %a, align 4 - ret i32 %4 -} - -; Function Attrs: nounwind -define i32 @test_sum_us(ptr align 8 %0) #0 { -entry: - %sum = alloca i32, align 4 - %indirectarg = alloca %"int[]", align 8 - store i32 0, ptr %sum, align 4 - %1 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 1 - %2 = load i64, ptr %1, align 8 - %eq = icmp eq i64 0, %2 - br i1 %eq, label %if.then, label %if.exit - -if.then: ; preds = %entry - ret i32 0 - -if.exit: ; preds = %entry - %3 = load i32, ptr %sum, align 4 - %4 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %ptroffset = getelementptr inbounds i32, ptr %5, i64 0 - %6 = load i32, ptr %ptroffset, align 4 - %7 = load %"int[]", ptr %0, align 8 - %8 = extractvalue %"int[]" %7, 0 - %9 = extractvalue %"int[]" %7, 1 - %sub = sub i64 %9, 1 - %10 = add i64 %sub, 1 - %size = sub i64 %10, 1 - %ptroffset1 = getelementptr inbounds i32, ptr %8, i64 1 - %11 = insertvalue %"int[]" undef, ptr %ptroffset1, 0 - %12 = insertvalue %"int[]" %11, i64 %size, 1 - store %"int[]" %12, ptr %indirectarg, align 8 - %13 = call i32 @test_sum_us(ptr align 8 %indirectarg) - %add = add i32 %6, %13 - %add2 = add i32 %3, %add - store i32 %add2, ptr %sum, align 4 - %14 = load i32, ptr %sum, align 4 - ret i32 %14 -} - -; Function Attrs: nounwind -define i32 @test_sumd(ptr align 8 %0) #0 { -entry: - %sum = alloca i32, align 4 - %i = alloca i32, align 4 - store i32 0, ptr %sum, align 4 - store i32 0, ptr %i, align 4 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %1 = load i32, ptr %i, align 4 - %sisiext = sext i32 %1 to i64 - %2 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 1 - %3 = load i64, ptr %2, align 8 - %lt = icmp slt i64 %sisiext, %3 - %check = icmp slt i64 %3, 0 - %siui-lt = or i1 %check, %lt - br i1 %siui-lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %4 = load i32, ptr %sum, align 4 - %5 = getelementptr inbounds %"int[]", ptr %0, i32 0, i32 0 - %6 = load ptr, ptr %5, align 8 - %7 = load i32, ptr %i, align 4 - %sisiext1 = sext i32 %7 to i64 - %ptroffset = getelementptr inbounds i32, ptr %6, i64 %sisiext1 - %8 = load i32, ptr %ptroffset, align 4 - %add = add i32 %4, %8 - store i32 %add, ptr %sum, align 4 - %9 = load i32, ptr %i, align 4 - %add2 = add i32 %9, 1 - store i32 %add2, ptr %i, align 4 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %10 = load i32, ptr %sum, align 4 - ret i32 %10 -} - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %list = alloca %LinkedList, align 8 - %i = alloca i32, align 4 - %elements = alloca i32, align 4 - %array = alloca %List, align 8 - %i1 = alloca i32, align 4 - %a = alloca %Blob, align 4 - %b = alloca %Blob.0, align 8 - %ddx = alloca %Foo, align 4 - %fro = alloca i32, align 4 - %x = alloca [4 x i32], align 16 - %indirectarg = alloca %"int[]", align 8 - %z = alloca %"int[]", align 8 - %de = alloca [3 x i32], align 4 - %indirectarg10 = alloca %"int[]", align 8 - %indirectarg11 = alloca %"int[]", align 8 - %varargslots = alloca [4 x i32], align 16 - %indirectarg12 = alloca %"int[]", align 8 - %varargslots13 = alloca [1 x i32], align 4 - %indirectarg14 = alloca %"int[]", align 8 - %indirectarg15 = alloca %"int[]", align 8 - %a1 = alloca ptr, align 8 - %b2 = alloca ptr, align 8 - %0 = call i32 @test_test_static() - %1 = call i32 @test_test_static() - %2 = call i32 @test_test_static() - call void @hello_world_hello() - call void @llvm.memset.p0.i64(ptr align 8 %list, i8 0, i64 24, i1 false) - call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 10) - call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 15) - call void @"std_array_linkedlist$$int_LinkedList_push"(ptr %list, i32 30) - store i32 0, ptr %i, align 4 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %3 = load i32, ptr %i, align 4 - %4 = call i64 @"std_array_linkedlist$$int_LinkedList_len"(ptr %list) #3 - %uisitrunc = trunc i64 %4 to i32 - %lt = icmp slt i32 %3, %uisitrunc - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %5 = load i32, ptr %i, align 4 - %6 = load i32, ptr %i, align 4 - %siuiext = sext i32 %6 to i64 - %7 = call i32 @"std_array_linkedlist$$int_LinkedList_get"(ptr %list, i64 %siuiext) - %8 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %5, i32 %7) - %9 = load i32, ptr %i, align 4 - %add = add i32 %9, 1 - store i32 %add, ptr %i, align 4 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - call void @"std_array_linkedlist$$int_LinkedList_free"(ptr %list) - %10 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 3) - store i32 3, ptr %elements, align 4 - %11 = call i32 (ptr, ...) @printf(ptr @.str.4) - call void @llvm.memset.p0.i64(ptr align 8 %array, i8 0, i64 32, i1 false) - call void @"std_array_list$$int_List_append"(ptr %array, i32 100) - call void @"std_array_list$$int_List_append"(ptr %array, i32 200) - call void @"std_array_list$$int_List_append"(ptr %array, i32 400) - call void @"std_array_list$$int_List_push"(ptr %array, i32 600) #3 - call void @"std_array_list$$int_List_insert_at"(ptr %array, i64 2, i32 300) - store i32 0, ptr %i1, align 4 - br label %loop.cond2 - -loop.cond2: ; preds = %loop.body5, %loop.exit - %12 = load i32, ptr %i1, align 4 - %13 = call i64 @"std_array_list$$int_List_len"(ptr %array) - %uisitrunc3 = trunc i64 %13 to i32 - %lt4 = icmp slt i32 %12, %uisitrunc3 - br i1 %lt4, label %loop.body5, label %loop.exit8 - -loop.body5: ; preds = %loop.cond2 - %14 = load i32, ptr %i1, align 4 - %15 = load i32, ptr %i1, align 4 - %siuiext6 = sext i32 %15 to i64 - %16 = call i32 @"std_array_list$$int_List_get"(ptr %array, i64 %siuiext6) - %17 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %14, i32 %16) - %18 = load i32, ptr %i1, align 4 - %add7 = add i32 %18, 1 - store i32 %add7, ptr %i1, align 4 - br label %loop.cond2 - -loop.exit8: ; preds = %loop.cond2 - call void @"std_array_list$$int_List_free"(ptr %array) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 @.__const.6, i32 4, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %b, ptr align 8 @.__const.7, i32 8, i1 false) - %19 = getelementptr inbounds %Blob, ptr %a, i32 0, i32 0 - %20 = load i32, ptr %19, align 4 - %21 = call i32 @"test2$$int_getValue"(i32 %20) - %22 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %21) - %23 = getelementptr inbounds %Blob.0, ptr %b, i32 0, i32 0 - %24 = load i64, ptr %23, align 8 - %25 = call double @"test2$$double_getValue"(i64 %24) - %26 = call i32 (ptr, ...) @printf(ptr @.str.9, double %25) - %27 = call i32 @"test2$$int_getMult"(i32 25) - %28 = call i32 (ptr, ...) @printf(ptr @.str.10, i32 %27) - %29 = call double @"test2$$double_getMult"(double 3.300000e+00) - %30 = call i32 (ptr, ...) @printf(ptr @.str.11, double %29) - call void @test_helloWorld() - %31 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 0 - store i32 0, ptr %31, align 4 - %32 = getelementptr inbounds %Foo, ptr %ddx, i32 0, i32 1 - store i32 0, ptr %32, align 4 - store i32 3, ptr %fro, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %x, ptr align 16 @.__const.12, i32 16, i1 false) - %33 = load i32, ptr %fro, align 4 - %34 = insertvalue %"int[]" undef, ptr %x, 0 - %35 = insertvalue %"int[]" %34, i64 4, 1 - store %"int[]" %35, ptr %indirectarg, align 8 - %36 = call i32 @test_sum_us(ptr align 8 %indirectarg) - %37 = call i32 (ptr, ...) @printf(ptr @.str.13, i32 %36) - %add9 = add i32 %33, %37 - store i32 %add9, ptr %fro, align 4 - %38 = load i32, ptr %fro, align 4 - %39 = call i32 (ptr, ...) @printf(ptr @.str.14, i32 %38) - %40 = insertvalue %"int[]" undef, ptr %x, 0 - %41 = insertvalue %"int[]" %40, i64 4, 1 - store %"int[]" %41, ptr %z, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %de, ptr align 4 @.__const.15, i32 12, i1 false) - %42 = insertvalue %"int[]" undef, ptr %x, 0 - %43 = insertvalue %"int[]" %42, i64 4, 1 - store %"int[]" %43, ptr %indirectarg10, align 8 - %44 = call i32 @test_sum_us(ptr align 8 %indirectarg10) - %45 = call i32 (ptr, ...) @printf(ptr @.str.16, i32 %44) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %indirectarg11, ptr align 8 %z, i32 16, i1 false) - %46 = call i32 @test_sum_us(ptr align 8 %indirectarg11) - %47 = call i32 (ptr, ...) @printf(ptr @.str.17, i32 %46) - %48 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 0 - store i32 1, ptr %48, align 4 - %49 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 1 - store i32 2, ptr %49, align 4 - %50 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 2 - store i32 4, ptr %50, align 4 - %51 = getelementptr inbounds [4 x i32], ptr %varargslots, i64 0, i64 3 - store i32 5, ptr %51, align 4 - %52 = insertvalue %"int[]" undef, ptr %varargslots, 0 - %53 = insertvalue %"int[]" %52, i64 4, 1 - store %"int[]" %53, ptr %indirectarg12, align 8 - %54 = call i32 @test_sum_us(ptr align 8 %indirectarg12) - %55 = call i32 (ptr, ...) @printf(ptr @.str.18, i32 %54) - %56 = getelementptr inbounds [1 x i32], ptr %varargslots13, i64 0, i64 0 - store i32 1, ptr %56, align 4 - %57 = insertvalue %"int[]" undef, ptr %varargslots13, 0 - %58 = insertvalue %"int[]" %57, i64 1, 1 - store %"int[]" %58, ptr %indirectarg14, align 8 - %59 = call i32 @test_sum_us(ptr align 8 %indirectarg14) - %60 = call i32 (ptr, ...) @printf(ptr @.str.19, i32 %59) - store %"int[]" zeroinitializer, ptr %indirectarg15, align 8 - %61 = call i32 @test_sum_us(ptr align 8 %indirectarg15) - %62 = call i32 (ptr, ...) @printf(ptr @.str.20, i32 %61) - store ptr null, ptr %a1, align 8 - store ptr null, ptr %b2, align 8 - ret void -} - -declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg) #1 - -declare void @hello_world_hello() - -declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #2 - -declare void @"std_array_linkedlist$$int_LinkedList_push"(ptr, i32) - -declare i64 @"std_array_linkedlist$$int_LinkedList_len"(ptr) - -declare i32 @"std_array_linkedlist$$int_LinkedList_get"(ptr, i64) - -declare void @"std_array_linkedlist$$int_LinkedList_free"(ptr) - -declare void @"std_array_list$$int_List_append"(ptr, i32) - -declare void @"std_array_list$$int_List_push"(ptr, i32) - -declare void @"std_array_list$$int_List_insert_at"(ptr, i64, i32) - -declare i64 @"std_array_list$$int_List_len"(ptr) - -declare i32 @"std_array_list$$int_List_get"(ptr, i64) - -declare double @"test2$$double_getMult"(double) - - -// #expect: hello_world.ll - -define void @hello_world_hello() #0 { -entry: - %0 = call i32 (ptr, ...) @printf(ptr @.str) - %1 = call double @"foo$$double_check"(double 1.110000e+01) - %2 = call i32 (ptr, ...) @printf(ptr @.str.1, double %1) - ret void -} - -// #expect: foo.double.ll - -define double @"foo$$double_check"(double %0) -entry: - %fmul = fmul double %0, %0 - ret double %fmul - - -// #expect: test2.int.ll - -%Blob = type { i32 } -@"test2$$int_argh" = local_unnamed_addr global i32 234, align 4 - -define i32 @"test2$$int_getMult"(i32 %0) -entry: - %mul = mul i32 %0, %0 - ret i32 %mul - -define i32 @"test2$$int_hello"() -entry: - ret i32 1 -} - -define i32 @"test2$$int_getValue"(i32 %0) -entry: - %blob = alloca %Blob, align 4 - %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - store i32 %0, ptr %1, align 4 - %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - %3 = load i32, ptr %2, align 4 - ret i32 %3 - - -// #expect: test2.double.ll - -%Blob = type { double } -@"test2$$double_argh" = local_unnamed_addr global double 2.340000e+02, align 8 - -define double @"test2$$double_getMult"(double %0) -entry: - %fmul = fmul double %0, %0 - ret double %fmul - - -define i32 @"test2$$double_hello"() -entry: - ret i32 1 - -define double @"test2$$double_getValue"(i64 %0) -entry: - %blob = alloca %Blob, align 8 - %1 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - store i64 %0, ptr %1, align 8 - %2 = getelementptr inbounds %Blob, ptr %blob, i32 0, i32 0 - %3 = load double, ptr %2, align 8 - ret double %3 - diff --git a/test/test_suite2/functions/typeless_varargs.c3t b/test/test_suite2/functions/typeless_varargs.c3t deleted file mode 100644 index 3bb818d89..000000000 --- a/test/test_suite2/functions/typeless_varargs.c3t +++ /dev/null @@ -1,80 +0,0 @@ -// #target: macos-x64 - -module test; - -extern fn void printf(char*, ...); - -fn void retest(foo...) -{ - test(...foo); -} -fn void test(foo...) -{ - printf("Foo1 was: %d\n", *((int*)foo[0])); -} -fn int main() -{ - int i = 1; - test(1); - retest(1); - return 1; -} - -/* #expect: test.ll - -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - -define void @test_retest(ptr %0, i64 %1) #0 { -entry: - %foo = alloca %"variant[]", align 8 - %2 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - %4 = getelementptr inbounds %"variant[]", ptr %foo, i32 0, i32 0 - %lo = load ptr, ptr %4, align 8 - %5 = getelementptr inbounds %"variant[]", ptr %foo, i32 0, i32 1 - %hi = load i64, ptr %5, align 8 - call void @test_test(ptr %lo, i64 %hi) - ret void -} - -define void @test_test(ptr %0, i64 %1) #0 { -entry: - %foo = alloca %"variant[]", align 8 - %2 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %foo, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - %4 = getelementptr inbounds %"variant[]", ptr %foo, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - %ptroffset = getelementptr inbounds %variant, ptr %5, i64 0 - %6 = getelementptr inbounds %variant, ptr %ptroffset, i32 0, i32 0 - %7 = load ptr, ptr %6, align 8 - %8 = load i32, ptr %7, align 8 - call void (ptr, ...) @printf(ptr @.str, i32 %8) - ret void -} - -define i32 @main() #0 { -entry: - %i = alloca i32, align 4 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - %varargslots1 = alloca [1 x %variant], align 16 - %taddr2 = alloca i32, align 4 - store i32 1, ptr %i, align 4 - store i32 1, ptr %taddr, align 4 - %0 = insertvalue %variant undef, ptr %taddr, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %2 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %1, ptr %2, align 16 - call void @test_test(ptr %varargslots, i64 1) - store i32 1, ptr %taddr2, align 4 - %3 = insertvalue %variant undef, ptr %taddr2, 0 - %4 = insertvalue %variant %3, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %5 = getelementptr inbounds [1 x %variant], ptr %varargslots1, i64 0, i64 0 - store %variant %4, ptr %5, align 16 - call void @test_retest(ptr %varargslots1, i64 1) - ret i32 1 -} \ No newline at end of file diff --git a/test/test_suite2/functions/varargs.c3t b/test/test_suite2/functions/varargs.c3t deleted file mode 100644 index 1147930f1..000000000 --- a/test/test_suite2/functions/varargs.c3t +++ /dev/null @@ -1,42 +0,0 @@ -module varargs; - -extern fn void printf(char* c, ...); - -fn void test() -{ - printf("%d\n", true); - printf("%d\n", 123); - printf("%f\n", 12.3); - ichar x1 = -123; - bool b = false; - float z1 = 12.3; - printf("%d\n", b); - printf("%d\n", x1); - printf("%f\n", z1); -} - -/* #expect: varargs.ll - -define void @varargs_test() #0 { -entry: - %x1 = alloca i8, align 1 - %b = alloca i8, align 1 - %z1 = alloca float, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 1) - call void (ptr, ...) @printf(ptr @.str.1, i32 123) - call void (ptr, ...) @printf(ptr @.str.2, double 1.230000e+01) - store i8 -123, ptr %x1, align 1 - store i8 0, ptr %b, align 1 - store float 0x40289999A0000000, ptr %z1, align 4 - %0 = load i8, ptr %b, align 1 - %1 = trunc i8 %0 to i1 - %boolsi = zext i1 %1 to i32 - call void (ptr, ...) @printf(ptr @.str.3, i32 %boolsi) - %2 = load i8, ptr %x1, align 1 - %sisiext = sext i8 %2 to i32 - call void (ptr, ...) @printf(ptr @.str.4, i32 %sisiext) - %3 = load float, ptr %z1, align 4 - %fpfpext = fpext float %3 to double - call void (ptr, ...) @printf(ptr @.str.5, double %fpfpext) - ret void -} diff --git a/test/test_suite2/functions/varargs_followed_by_named.c3t b/test/test_suite2/functions/varargs_followed_by_named.c3t deleted file mode 100644 index 10eb6f76e..000000000 --- a/test/test_suite2/functions/varargs_followed_by_named.c3t +++ /dev/null @@ -1,102 +0,0 @@ -// #target: macos-x64 -module foo; - -extern fn void printf(char* format, ...); - -fn void test(int x, int... y, int z = 2) -{ - printf("Got %d %d %d %d\n", x, (int)y.len, z, y[0]); -} -fn void test2(int x, y..., int z = 2) -{ - printf("Got %d %d %d\n", x, (int)y.len, z); -} - -fn void main() -{ - test(3, 4, 5, .z = 123); - test2(3, 4, 5, .z = 123); - test(3, 4, 5); - test2(3, 4, 5); -} - -/* #expect: foo.ll - -define void @foo_test(i32 %0, ptr %1, i64 %2, i32 %3) #0 { -entry: - %y = alloca %"int[]", align 8 - %4 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 0 - store ptr %1, ptr %4, align 8 - %5 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 1 - store i64 %2, ptr %5, align 8 - %6 = getelementptr inbounds %"int[]", ptr %y, i32 0, i32 1 - %7 = load i64, ptr %6, align 8 - %uisitrunc = trunc i64 %7 to i32 - %8 = getelementptr inbounds %"int[]", ptr %y, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %ptroffset = getelementptr inbounds i32, ptr %9, i64 0 - %10 = load i32, ptr %ptroffset, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %0, i32 %uisitrunc, i32 %3, i32 %10) - ret void -} - -; Function Attrs: nounwind -define void @foo_test2(i32 %0, ptr %1, i64 %2, i32 %3) #0 { -entry: - %y = alloca %"variant[]", align 8 - %4 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 0 - store ptr %1, ptr %4, align 8 - %5 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 1 - store i64 %2, ptr %5, align 8 - %6 = getelementptr inbounds %"variant[]", ptr %y, i32 0, i32 1 - %7 = load i64, ptr %6, align 8 - %uisitrunc = trunc i64 %7 to i32 - call void (ptr, ...) @printf(ptr @.str.1, i32 %0, i32 %uisitrunc, i32 %3) - ret void -} - -; Function Attrs: nounwind -define void @foo_main() #0 { -entry: - %varargslots = alloca [2 x i32], align 4 - %varargslots1 = alloca [2 x %variant], align 16 - %taddr = alloca i32, align 4 - %taddr2 = alloca i32, align 4 - %varargslots3 = alloca [2 x i32], align 4 - %varargslots4 = alloca [2 x %variant], align 16 - %taddr5 = alloca i32, align 4 - %taddr6 = alloca i32, align 4 - %0 = getelementptr inbounds [2 x i32], ptr %varargslots, i64 0, i64 0 - store i32 4, ptr %0, align 4 - %1 = getelementptr inbounds [2 x i32], ptr %varargslots, i64 0, i64 1 - store i32 5, ptr %1, align 4 - call void @foo_test(i32 3, ptr %varargslots, i64 2, i32 123) - store i32 4, ptr %taddr, align 4 - %2 = insertvalue %variant undef, ptr %taddr, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %4 = getelementptr inbounds [2 x %variant], ptr %varargslots1, i64 0, i64 0 - store %variant %3, ptr %4, align 16 - store i32 5, ptr %taddr2, align 4 - %5 = insertvalue %variant undef, ptr %taddr2, 0 - %6 = insertvalue %variant %5, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %7 = getelementptr inbounds [2 x %variant], ptr %varargslots1, i64 0, i64 1 - store %variant %6, ptr %7, align 16 - call void @foo_test2(i32 3, ptr %varargslots1, i64 2, i32 123) - %8 = getelementptr inbounds [2 x i32], ptr %varargslots3, i64 0, i64 0 - store i32 4, ptr %8, align 4 - %9 = getelementptr inbounds [2 x i32], ptr %varargslots3, i64 0, i64 1 - store i32 5, ptr %9, align 4 - call void @foo_test(i32 3, ptr %varargslots3, i64 2, i32 2) - store i32 4, ptr %taddr5, align 4 - %10 = insertvalue %variant undef, ptr %taddr5, 0 - %11 = insertvalue %variant %10, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %12 = getelementptr inbounds [2 x %variant], ptr %varargslots4, i64 0, i64 0 - store %variant %11, ptr %12, align 16 - store i32 5, ptr %taddr6, align 4 - %13 = insertvalue %variant undef, ptr %taddr6, 0 - %14 = insertvalue %variant %13, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %15 = getelementptr inbounds [2 x %variant], ptr %varargslots4, i64 0, i64 1 - store %variant %14, ptr %15, align 16 - call void @foo_test2(i32 3, ptr %varargslots4, i64 2, i32 2) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/generic/enum_set_test.c3t b/test/test_suite2/generic/enum_set_test.c3t deleted file mode 100644 index 88ba51c23..000000000 --- a/test/test_suite2/generic/enum_set_test.c3t +++ /dev/null @@ -1,128 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; -import std::enumset; - -define AbcEnumSet = EnumSet; - -enum Abc -{ - HELLO, - WORLD -} -fn void main() -{ - AbcEnumSet set; - io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); - set.add(Abc.HELLO); - io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); - set.add(Abc.WORLD); - io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); - AbcEnumSet set2; - set2.add_all(set); - io::printf("Has WORLD: %s\n", set2.has(Abc.WORLD)); - set.remove_all(set2); - io::printf("Has WORLD: %s\n", set.has(Abc.WORLD)); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %set = alloca i32, align 4 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i8, align 1 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %taddr3 = alloca i8, align 1 - %retparam7 = alloca i64, align 8 - %varargslots8 = alloca [1 x %variant], align 16 - %taddr9 = alloca i8, align 1 - %set2 = alloca i32, align 4 - %retparam13 = alloca i64, align 8 - %varargslots14 = alloca [1 x %variant], align 16 - %taddr15 = alloca i8, align 1 - %retparam19 = alloca i64, align 8 - %varargslots20 = alloca [1 x %variant], align 16 - %taddr21 = alloca i8, align 1 - store i32 0, ptr %set, align 4 - %0 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) - store i8 %0, ptr %taddr, align 1 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 14, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - call void @"std_enumset$$test_Abc_EnumSet_add"(ptr %set, i32 0) - %5 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) - store i8 %5, ptr %taddr3, align 1 - %6 = insertvalue %variant undef, ptr %taddr3, 0 - %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %8 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %7, ptr %8, align 16 - %9 = call i64 @std_io_printf(ptr %retparam1, ptr @.str.1, i64 14, ptr %varargslots2, i64 1) - %not_err4 = icmp eq i64 %9, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %voiderr - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %voiderr - call void @"std_enumset$$test_Abc_EnumSet_add"(ptr %set, i32 1) - %10 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) - store i8 %10, ptr %taddr9, align 1 - %11 = insertvalue %variant undef, ptr %taddr9, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %13 = getelementptr inbounds [1 x %variant], ptr %varargslots8, i64 0, i64 0 - store %variant %12, ptr %13, align 16 - %14 = call i64 @std_io_printf(ptr %retparam7, ptr @.str.2, i64 14, ptr %varargslots8, i64 1) - %not_err10 = icmp eq i64 %14, 0 - br i1 %not_err10, label %after_check11, label %voiderr12 - -after_check11: ; preds = %voiderr6 - br label %voiderr12 - -voiderr12: ; preds = %after_check11, %voiderr6 - store i32 0, ptr %set2, align 4 - %15 = load i32, ptr %set, align 4 - call void @"std_enumset$$test_Abc_EnumSet_add_all"(ptr %set2, i32 %15) - %16 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set2, i32 1) - store i8 %16, ptr %taddr15, align 1 - %17 = insertvalue %variant undef, ptr %taddr15, 0 - %18 = insertvalue %variant %17, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %19 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 - store %variant %18, ptr %19, align 16 - %20 = call i64 @std_io_printf(ptr %retparam13, ptr @.str.3, i64 14, ptr %varargslots14, i64 1) - %not_err16 = icmp eq i64 %20, 0 - br i1 %not_err16, label %after_check17, label %voiderr18 - -after_check17: ; preds = %voiderr12 - br label %voiderr18 - -voiderr18: ; preds = %after_check17, %voiderr12 - %21 = load i32, ptr %set2, align 4 - call void @"std_enumset$$test_Abc_EnumSet_remove_all"(ptr %set, i32 %21) - %22 = call i8 @"std_enumset$$test_Abc_EnumSet_has"(ptr %set, i32 1) - store i8 %22, ptr %taddr21, align 1 - %23 = insertvalue %variant undef, ptr %taddr21, 0 - %24 = insertvalue %variant %23, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %25 = getelementptr inbounds [1 x %variant], ptr %varargslots20, i64 0, i64 0 - store %variant %24, ptr %25, align 16 - %26 = call i64 @std_io_printf(ptr %retparam19, ptr @.str.4, i64 14, ptr %varargslots20, i64 1) - %not_err22 = icmp eq i64 %26, 0 - br i1 %not_err22, label %after_check23, label %voiderr24 - -after_check23: ; preds = %voiderr18 - br label %voiderr24 - -voiderr24: ; preds = %after_check23, %voiderr18 - ret void -} diff --git a/test/test_suite2/generic/generic_num.c3t b/test/test_suite2/generic/generic_num.c3t deleted file mode 100644 index a7397e84e..000000000 --- a/test/test_suite2/generic/generic_num.c3t +++ /dev/null @@ -1,43 +0,0 @@ -// #target: macos-x64 -module hello; - -fn Type x(Type t) -{ - return t * t + FOO; -} - -module test; -import hello; -define xint = hello::x; - -import std::io; - -fn void main() -{ - io::printfln("%d", xint(4)); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - %0 = call i32 @"hello$$int._123_x"(i32 4) - store i32 %0, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - ret void -} - diff --git a/test/test_suite2/initialize/initialize_finalize.c3t b/test/test_suite2/initialize/initialize_finalize.c3t deleted file mode 100644 index a3df1e4e2..000000000 --- a/test/test_suite2/initialize/initialize_finalize.c3t +++ /dev/null @@ -1,62 +0,0 @@ -// #target: linux-x64 -module test; -import std::io; - -fn void main() -{ - io::println("Hello, world!"); -} -extern fn void puts(char*); - -static initialize @priority(300) -{ - puts("Hello startup2"); -} -static initialize -{ - puts("Let's start main..."); -} -static initialize @priority(200) -{ - puts("Hello startup"); -} - -static initialize -{} - -static finalize -{ - puts("Bye bye"); -} - -/* #expect: test.ll - -@llvm.global_ctors = appending global [3 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 300, ptr @.static_initialize.0, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @.static_initialize.1, ptr null }, { i32, ptr, ptr } { i32 200, ptr @.static_initialize.2, ptr null }] -@llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @.static_finalize.0, ptr null }] - -define internal void @.static_initialize.0() { -entry: - call void @puts(ptr @.str) - ret void -} - -; Function Attrs: nounwind -declare void @puts(ptr) #0 - -define internal void @.static_initialize.1() { -entry: - call void @puts(ptr @.str.1) - ret void -} - -define internal void @.static_initialize.2() { -entry: - call void @puts(ptr @.str.2) - ret void -} - -define internal void @.static_finalize.0() { -entry: - call void @puts(ptr @.str.3) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/initializer_lists/fasta.c3t b/test/test_suite2/initializer_lists/fasta.c3t deleted file mode 100644 index bb38c3c9c..000000000 --- a/test/test_suite2/initializer_lists/fasta.c3t +++ /dev/null @@ -1,373 +0,0 @@ -// #target: macos-x64 -module fasta; - -const IM = 139968u; -const IA = 3877u; -const IC = 29573u; -const SEED = 42u; - -uint seed = SEED; - -fn float fasta_rand(float maxval) -{ - seed = (seed * IA + IC) % IM; - return maxval * seed / IM; -} - -private char[] alu = - "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" - "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" - "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" - "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" - "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" - "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" - "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"; - -extern fn int atoi(char *s); -extern fn int printf(char *s, ...); -extern fn void putchar(int c); - -char[] iub = "acgtBDHKMNRSVWY"; -double[] iub_p = { - 0.27, - 0.12, - 0.12, - 0.27, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02, - 0.02 }; - -char[] homosapiens = "acgt"; -double[] homosapiens_p = { - 0.3029549426680, - 0.1979883004921, - 0.1975473066391, - 0.3015094502008 -}; - -const LINELEN = 60; - -// slowest character-at-a-time output -fn void repeat_fasta(char[] seq, int n) -{ - usz len = seq.len; - int i = void; - for (i = 0; i < n; i++) - { - putchar(seq[i % len]); - if (i % LINELEN == LINELEN - 1) putchar('\n'); - } - if (i % LINELEN != 0) putchar('\n'); -} - -fn void random_fasta(char[] symb, double[] probability, int n) -{ - assert(symb.len == probability.len); - int len = probability.len; - int i = void; - for (i = 0; i < n; i++) - { - double v = fasta_rand(1.0); - /* slowest idiomatic linear lookup. Fast if len is short though. */ - int j = void; - for (j = 0; j < len - 1; j++) - { - v -= probability[j]; - if (v < 0) break; - } - putchar(symb[j]); - if (i % LINELEN == LINELEN - 1) putchar('\n'); - } - if (i % LINELEN != 0) putchar('\n'); -} - -fn void main(int argc, char **argv) -{ - int n = 1000; - if (argc > 1) n = atoi(argv[1]); - - printf(">ONE Homo sapiens alu\n"); - repeat_fasta(alu, n * 2); - - printf(">TWO IUB ambiguity codes\n"); - random_fasta(iub, iub_p, n * 3); - - printf(">THREE Homo sapiens frequency\n"); - random_fasta(homosapiens, homosapiens_p, n * 5); - -} - -/* #expect: fasta.ll - -%"char[]" = type { ptr, i64 } -%"double[]" = type { ptr, i64 } - -@fasta_IM = local_unnamed_addr constant i32 139968, align 4 -@fasta_IA = local_unnamed_addr constant i32 3877, align 4 -@fasta_IC = local_unnamed_addr constant i32 29573, align 4 -@fasta_SEED = local_unnamed_addr constant i32 42, align 4 -@fasta_seed = local_unnamed_addr global i32 42, align 4 -@.str = private unnamed_addr constant [288 x i8] c"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA\00", align 1 -@fasta_alu = protected unnamed_addr global %"char[]" { ptr @.str, i64 287 }, align 8 -@.str.11 = private unnamed_addr constant [16 x i8] c"acgtBDHKMNRSVWY\00", align 1 -@fasta_iub = local_unnamed_addr global %"char[]" { ptr @.str.11, i64 15 }, align 8 -@.taddr = private global [15 x double] [double 2.700000e-01, double 1.200000e-01, double 1.200000e-01, double 2.700000e-01, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02, double 2.000000e-02], align 8 -@fasta_iub_p = local_unnamed_addr global %"double[]" { ptr @.taddr, i64 15 }, align 8 -@.str.12 = private unnamed_addr constant [5 x i8] c"acgt\00", align 1 -@fasta_homosapiens = local_unnamed_addr global %"char[]" { ptr @.str.12, i64 4 }, align 8 -@.taddr.13 = private global [4 x double] [double 0x3FD3639D20BAEB5B, double 0x3FC957AE3DCD561B, double 0x3FC9493AEAB6C2BF, double 0x3FD34BEE4B030838], align 8 -@fasta_homosapiens_p = local_unnamed_addr global %"double[]" { ptr @.taddr.13, i64 4 }, align 8 -@fasta_LINELEN = local_unnamed_addr constant i32 60, align 4 -@.str.14 = private unnamed_addr constant [23 x i8] c">ONE Homo sapiens alu\0A\00", align 1 -@.str.15 = private unnamed_addr constant [26 x i8] c">TWO IUB ambiguity codes\0A\00", align 1 -@.str.16 = private unnamed_addr constant [31 x i8] c">THREE Homo sapiens frequency\0A\00", align 1 - -; Function Attrs: nounwind -define float @fasta_fasta_rand(float %0) #0 { -entry: - %1 = load i32, ptr @fasta_seed, align 4 - %mul = mul i32 %1, 3877 - %add = add i32 %mul, 29573 - %umod = urem i32 %add, 139968 - store i32 %umod, ptr @fasta_seed, align 4 - %2 = load i32, ptr @fasta_seed, align 4 - %uifp = uitofp i32 %2 to float - %fmul = fmul float %0, %uifp - %fdiv = fdiv float %fmul, 1.399680e+05 - ret float %fdiv -} - -; Function Attrs: nounwind -declare i32 @atoi(ptr) #0 - -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -declare void @putchar(i32) #0 - -; Function Attrs: nounwind -define void @fasta_repeat_fasta(ptr %0, i64 %1, i32 %2) #0 { -entry: - %seq = alloca %"char[]", align 8 - %len = alloca i64, align 8 - %i = alloca i32, align 4 - %3 = getelementptr inbounds { ptr, i64 }, ptr %seq, i32 0, i32 0 - store ptr %0, ptr %3, align 8 - %4 = getelementptr inbounds { ptr, i64 }, ptr %seq, i32 0, i32 1 - store i64 %1, ptr %4, align 8 - %5 = getelementptr inbounds %"char[]", ptr %seq, i32 0, i32 1 - %6 = load i64, ptr %5, align 8 - store i64 %6, ptr %len, align 8 - store i32 0, ptr %i, align 4 - br label %loop.cond - -loop.cond: ; preds = %if.exit, %entry - %7 = load i32, ptr %i, align 4 - %lt = icmp slt i32 %7, %2 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %8 = getelementptr inbounds %"char[]", ptr %seq, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = load i32, ptr %i, align 4 - %sisiext = sext i32 %10 to i64 - %11 = load i64, ptr %len, align 8 - %smod = srem i64 %sisiext, %11 - %ptroffset = getelementptr inbounds i8, ptr %9, i64 %smod - %12 = load i8, ptr %ptroffset, align 1 - %uisiext = zext i8 %12 to i32 - call void @putchar(i32 %uisiext) - %13 = load i32, ptr %i, align 4 - %smod1 = srem i32 %13, 60 - %eq = icmp eq i32 %smod1, 59 - br i1 %eq, label %if.then, label %if.exit - -if.then: ; preds = %loop.body - call void @putchar(i32 10) - br label %if.exit - -if.exit: ; preds = %if.then, %loop.body - %14 = load i32, ptr %i, align 4 - %add = add i32 %14, 1 - store i32 %add, ptr %i, align 4 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %15 = load i32, ptr %i, align 4 - %smod2 = srem i32 %15, 60 - %neq = icmp ne i32 %smod2, 0 - br i1 %neq, label %if.then3, label %if.exit4 - -if.then3: ; preds = %loop.exit - call void @putchar(i32 10) - br label %if.exit4 - -if.exit4: ; preds = %if.then3, %loop.exit - ret void -} - -; Function Attrs: nounwind -define void @fasta_random_fasta(ptr %0, i64 %1, ptr %2, i64 %3, i32 %4) #0 { -entry: - %symb = alloca %"char[]", align 8 - %probability = alloca %"double[]", align 8 - %len = alloca i32, align 4 - %i = alloca i32, align 4 - %v = alloca double, align 8 - %j = alloca i32, align 4 - %5 = getelementptr inbounds { ptr, i64 }, ptr %symb, i32 0, i32 0 - store ptr %0, ptr %5, align 8 - %6 = getelementptr inbounds { ptr, i64 }, ptr %symb, i32 0, i32 1 - store i64 %1, ptr %6, align 8 - %7 = getelementptr inbounds { ptr, i64 }, ptr %probability, i32 0, i32 0 - store ptr %2, ptr %7, align 8 - %8 = getelementptr inbounds { ptr, i64 }, ptr %probability, i32 0, i32 1 - store i64 %3, ptr %8, align 8 - %9 = getelementptr inbounds %"char[]", ptr %symb, i32 0, i32 1 - %10 = load i64, ptr %9, align 8 - %11 = getelementptr inbounds %"double[]", ptr %probability, i32 0, i32 1 - %12 = load i64, ptr %11, align 8 - %eq = icmp eq i64 %10, %12 - call void @llvm.assume(i1 %eq) - %13 = getelementptr inbounds %"double[]", ptr %probability, i32 0, i32 1 - %14 = load i64, ptr %13, align 8 - %uisitrunc = trunc i64 %14 to i32 - store i32 %uisitrunc, ptr %len, align 4 - store i32 0, ptr %i, align 4 - br label %loop.cond - -loop.cond: ; preds = %if.exit9, %entry - %15 = load i32, ptr %i, align 4 - %lt = icmp slt i32 %15, %4 - br i1 %lt, label %loop.body, label %loop.exit11 - -loop.body: ; preds = %loop.cond - %16 = call float @fasta_fasta_rand(float 1.000000e+00) - %fpfpext = fpext float %16 to double - store double %fpfpext, ptr %v, align 8 - store i32 0, ptr %j, align 4 - br label %loop.cond1 - -loop.cond1: ; preds = %if.exit, %loop.body - %17 = load i32, ptr %j, align 4 - %18 = load i32, ptr %len, align 4 - %sub = sub i32 %18, 1 - %lt2 = icmp slt i32 %17, %sub - br i1 %lt2, label %loop.body3, label %loop.exit - -loop.body3: ; preds = %loop.cond1 - %19 = load double, ptr %v, align 8 - %20 = getelementptr inbounds %"double[]", ptr %probability, i32 0, i32 0 - %21 = load ptr, ptr %20, align 8 - %22 = load i32, ptr %j, align 4 - %sisiext = sext i32 %22 to i64 - %ptroffset = getelementptr inbounds double, ptr %21, i64 %sisiext - %23 = load double, ptr %ptroffset, align 8 - %fsub = fsub double %19, %23 - store double %fsub, ptr %v, align 8 - %24 = load double, ptr %v, align 8 - %lt4 = fcmp olt double %24, 0.000000e+00 - br i1 %lt4, label %if.then, label %if.exit - -if.then: ; preds = %loop.body3 - br label %loop.exit - -if.exit: ; preds = %loop.body3 - %25 = load i32, ptr %j, align 4 - %add = add i32 %25, 1 - store i32 %add, ptr %j, align 4 - br label %loop.cond1 - -loop.exit: ; preds = %if.then, %loop.cond1 - %26 = getelementptr inbounds %"char[]", ptr %symb, i32 0, i32 0 - %27 = load ptr, ptr %26, align 8 - %28 = load i32, ptr %j, align 4 - %sisiext5 = sext i32 %28 to i64 - %ptroffset6 = getelementptr inbounds i8, ptr %27, i64 %sisiext5 - %29 = load i8, ptr %ptroffset6, align 1 - %uisiext = zext i8 %29 to i32 - call void @putchar(i32 %uisiext) - %30 = load i32, ptr %i, align 4 - %smod = srem i32 %30, 60 - %eq7 = icmp eq i32 %smod, 59 - br i1 %eq7, label %if.then8, label %if.exit9 - -if.then8: ; preds = %loop.exit - call void @putchar(i32 10) - br label %if.exit9 - -if.exit9: ; preds = %if.then8, %loop.exit - %31 = load i32, ptr %i, align 4 - %add10 = add i32 %31, 1 - store i32 %add10, ptr %i, align 4 - br label %loop.cond - -loop.exit11: ; preds = %loop.cond - %32 = load i32, ptr %i, align 4 - %smod12 = srem i32 %32, 60 - %neq = icmp ne i32 %smod12, 0 - br i1 %neq, label %if.then13, label %if.exit14 - -if.then13: ; preds = %loop.exit11 - call void @putchar(i32 10) - br label %if.exit14 - -if.exit14: ; preds = %if.then13, %loop.exit11 - ret void -} - -; Function Attrs: nounwind -define void @fasta_main(i32 %0, ptr %1) #0 { -entry: - %n = alloca i32, align 4 - store i32 1000, ptr %n, align 4 - %gt = icmp sgt i32 %0, 1 - br i1 %gt, label %if.then, label %if.exit - -if.then: ; preds = %entry - %ptroffset = getelementptr inbounds ptr, ptr %1, i64 1 - %2 = load ptr, ptr %ptroffset, align 8 - %3 = call i32 @atoi(ptr %2) - store i32 %3, ptr %n, align 4 - br label %if.exit - -if.exit: ; preds = %if.then, %entry - %4 = call i32 (ptr, ...) @printf(ptr @.str.14) - %lo = load ptr, ptr @fasta_alu, align 8 - %hi = load i64, ptr getelementptr inbounds (%"char[]", ptr @fasta_alu, i32 0, i32 1), align 8 - %5 = load i32, ptr %n, align 4 - %mul = mul i32 %5, 2 - call void @fasta_repeat_fasta(ptr %lo, i64 %hi, i32 %mul) - %6 = call i32 (ptr, ...) @printf(ptr @.str.15) - %lo1 = load ptr, ptr @fasta_iub, align 8 - %hi2 = load i64, ptr getelementptr inbounds (%"char[]", ptr @fasta_iub, i32 0, i32 1), align 8 - %lo3 = load ptr, ptr @fasta_iub_p, align 8 - %hi4 = load i64, ptr getelementptr inbounds (%"double[]", ptr @fasta_iub_p, i32 0, i32 1), align 8 - %7 = load i32, ptr %n, align 4 - %mul5 = mul i32 %7, 3 - call void @fasta_random_fasta(ptr %lo1, i64 %hi2, ptr %lo3, i64 %hi4, i32 %mul5) - %8 = call i32 (ptr, ...) @printf(ptr @.str.16) - %lo6 = load ptr, ptr @fasta_homosapiens, align 8 - %hi7 = load i64, ptr getelementptr inbounds (%"char[]", ptr @fasta_homosapiens, i32 0, i32 1), align 8 - %lo8 = load ptr, ptr @fasta_homosapiens_p, align 8 - %hi9 = load i64, ptr getelementptr inbounds (%"double[]", ptr @fasta_homosapiens_p, i32 0, i32 1), align 8 - %9 = load i32, ptr %n, align 4 - %mul10 = mul i32 %9, 5 - call void @fasta_random_fasta(ptr %lo6, i64 %hi7, ptr %lo8, i64 %hi9, i32 %mul10) - ret void -} - -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @fasta_main(i32 %0, ptr %1) - ret i32 0 -} \ No newline at end of file diff --git a/test/test_suite2/initializer_lists/general_tests.c3t b/test/test_suite2/initializer_lists/general_tests.c3t deleted file mode 100644 index 0789d91ef..000000000 --- a/test/test_suite2/initializer_lists/general_tests.c3t +++ /dev/null @@ -1,86 +0,0 @@ -// #target: macos-x64 - -union Baz -{ - int x; - double y; -} -struct Bar -{ - int x; - int y; -} - -fn int test() -{ - Baz ffe = { .x = 1 }; - int[1] azz = {}; - var $foo = { 11, 22, 33 }; - static int foo1 = $foo[1]; - int foo2 = $foo[2]; - var $foos = { "Hello!" }; - char* str = $foos[0]; - bool x = ! int[] { 1, 2, 3 }; - Bar b = {}; - Baz z = {}; - int[] sub = {}; - Bar[] foo = {}; - Baz[3] baz = {}; - return 1; -} - - -/* #expect: general_tests.ll - -%Baz = type { double } -%Bar = type { i32, i32 } -%"int[]" = type { ptr, i64 } -%"Bar[]" = type { ptr, i64 } - -@"ct$general_tests_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$general_tests_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8 -@"test$foo1" = internal unnamed_addr global i32 22, align 4 -@.str = private unnamed_addr constant [7 x i8] c"Hello!\00", align 1 - -; Function Attrs: nounwind -define i32 @general_tests_test() #0 { -entry: - %ffe = alloca %Baz, align 8 - %azz = alloca [1 x i32], align 4 - %foo2 = alloca i32, align 4 - %str = alloca ptr, align 8 - %x = alloca i8, align 1 - %literal = alloca [3 x i32], align 4 - %b = alloca %Bar, align 4 - %z = alloca %Baz, align 8 - %sub = alloca %"int[]", align 8 - %foo = alloca %"Bar[]", align 8 - %baz = alloca [3 x %Baz], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %ffe, ptr align 8 @.__const, i32 8, i1 false) - %0 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0 - store i32 0, ptr %0, align 4 - store i32 33, ptr %foo2, align 4 - store ptr @.str, ptr %str, align 8 - %1 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 0 - store i32 1, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 1 - store i32 2, ptr %2, align 4 - %3 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 2 - store i32 3, ptr %3, align 4 - %4 = insertvalue %"int[]" undef, ptr %literal, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - %6 = extractvalue %"int[]" %5, 1 - %not = icmp eq i64 %6, 0 - %7 = zext i1 %not to i8 - store i8 %7, ptr %x, align 1 - %8 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0 - store i32 0, ptr %8, align 4 - %9 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 - store i32 0, ptr %9, align 4 - call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false) - store %"int[]" zeroinitializer, ptr %sub, align 8 - store %"Bar[]" zeroinitializer, ptr %foo, align 8 - call void @llvm.memset.p0.i64(ptr align 16 %baz, i8 0, i64 24, i1 false) - ret i32 1 -} diff --git a/test/test_suite2/initializer_lists/ranges_to_dynamic.c3t b/test/test_suite2/initializer_lists/ranges_to_dynamic.c3t deleted file mode 100644 index e5a62f0af..000000000 --- a/test/test_suite2/initializer_lists/ranges_to_dynamic.c3t +++ /dev/null @@ -1,64 +0,0 @@ -// #target: mingw-x64 -module test; - -extern fn void printf(char*, ...); - -fn void test(int x) -{ - int[10] y = { [0..3] = 4, [6..8] = x }; - foreach (int v : y) - { - printf("%d\n", v); - } -} - -fn void main() -{ - test(101); -} - -/* #expect: test.ll - -define void @test_test(i32 %0) #0 { -entry: - %y = alloca [10 x i32], align 16 - %.anon = alloca i64, align 8 - %v = alloca i32, align 4 - call void @llvm.memset.p0.i64(ptr align 16 %y, i8 0, i64 40, i1 false) - %1 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 0 - store i32 4, ptr %1, align 4 - %2 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 1 - store i32 4, ptr %2, align 4 - %3 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 2 - store i32 4, ptr %3, align 4 - %4 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 3 - store i32 4, ptr %4, align 4 - %5 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 6 - store i32 %0, ptr %5, align 4 - %6 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 7 - store i32 %0, ptr %6, align 4 - %7 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 8 - store i32 %0, ptr %7, align 4 - store i64 0, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %8 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 10, %8 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %9 = load i64, ptr %.anon, align 8 - %10 = getelementptr inbounds [10 x i32], ptr %y, i64 0, i64 %9 - %11 = load i32, ptr %10, align 4 - store i32 %11, ptr %v, align 4 - %12 = load i32, ptr %v, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %12) - %13 = load i64, ptr %.anon, align 8 - %add = add i64 %13, 1 - store i64 %add, ptr %.anon, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - ret void -} \ No newline at end of file diff --git a/test/test_suite2/initializer_lists/statics.c3t b/test/test_suite2/initializer_lists/statics.c3t deleted file mode 100644 index 899956ca0..000000000 --- a/test/test_suite2/initializer_lists/statics.c3t +++ /dev/null @@ -1,90 +0,0 @@ -// #target: macos-x64 -import std::io; -import libc; -union Baz -{ - int x; - double y; -} -struct Bar -{ - int x; - int y; -} - - -fn void test() -{ - Bar[] b = { { 1, 2 } }; - static Bar[] c = { { 1, 2 } }; - libc::printf("%d %d\n", b[0].y, c[0].y); - b[0].y += 1; - c[0].y += 1; - -} -fn int main() -{ - test(); - test(); - test(); - return 1; -} - -/* #expect: statics.ll - -%Bar = type { i32, i32 } -%"Bar[]" = type { ptr, i64 } - -@"ct$statics_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$statics_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@.taddr = private global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 8 -@"test$c" = internal unnamed_addr global %"Bar[]" { ptr @.taddr, i64 1 }, align 8 -@.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 - -define void @statics_test() #0 { -entry: - %b = alloca %"Bar[]", align 8 - %literal = alloca [1 x %Bar], align 4 - %0 = getelementptr inbounds [1 x %Bar], ptr %literal, i64 0, i64 0 - %1 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 0 - store i32 1, ptr %1, align 4 - %2 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 1 - store i32 2, ptr %2, align 4 - %3 = insertvalue %"Bar[]" undef, ptr %literal, 0 - %4 = insertvalue %"Bar[]" %3, i64 1, 1 - store %"Bar[]" %4, ptr %b, align 8 - %5 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0 - %6 = load ptr, ptr %5, align 8 - %ptroffset = getelementptr inbounds %Bar, ptr %6, i64 0 - %7 = getelementptr inbounds %Bar, ptr %ptroffset, i32 0, i32 1 - %8 = load i32, ptr %7, align 4 - %9 = load ptr, ptr @"test$c", align 8 - %ptroffset1 = getelementptr inbounds %Bar, ptr %9, i64 0 - %10 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 1 - %11 = load i32, ptr %10, align 4 - %12 = call i32 (ptr, ...) @printf(ptr @.str, i32 %8, i32 %11) - %13 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0 - %14 = load ptr, ptr %13, align 8 - %ptroffset2 = getelementptr inbounds %Bar, ptr %14, i64 0 - %15 = getelementptr inbounds %Bar, ptr %ptroffset2, i32 0, i32 1 - %16 = load i32, ptr %15, align 4 - %add = add i32 %16, 1 - store i32 %add, ptr %15, align 4 - %17 = load ptr, ptr @"test$c", align 8 - %ptroffset3 = getelementptr inbounds %Bar, ptr %17, i64 0 - %18 = getelementptr inbounds %Bar, ptr %ptroffset3, i32 0, i32 1 - %19 = load i32, ptr %18, align 4 - %add4 = add i32 %19, 1 - store i32 %add4, ptr %18, align 4 - ret void -} - -define i32 @main() #0 { -entry: - call void @statics_test() - call void @statics_test() - call void @statics_test() - ret i32 1 -} - -declare i32 @printf(ptr, ...) \ No newline at end of file diff --git a/test/test_suite2/initializer_lists/subarrays.c3t b/test/test_suite2/initializer_lists/subarrays.c3t deleted file mode 100644 index e850895e1..000000000 --- a/test/test_suite2/initializer_lists/subarrays.c3t +++ /dev/null @@ -1,160 +0,0 @@ -// #target: macos-x64 - -import std::io; -import std::core::mem; -import libc; -union Baz -{ - int x; - double y; -} -struct Bar -{ - int x; - int y; -} - - -Bar[] arrbar = { { 3, 4 }, { 8, 9 }}; -int[] xd = { 1, 2 }; -int* fofeo = &&(int[2]{ 3, 4 }); - -fn int main() -{ - Bar w = arrbar[1]; - libc::printf("%d\n", arrbar[1].x); - int[] x = { 1, 2, 3 }; - int* y = &&(int[3]{ 123, 234, 567 }); - io::println("Start:"); - libc::printf("X len: %d mid element %d\n", (int)(x.len), x[1]); - libc::printf("Y mid element %d\n", y[1]); - libc::printf("Fofeo second element %d\n", fofeo[1]); - Baz ffe = { .x = 1 }; - int[1] azz = {}; - - //var $foo = { 1, 2, 3 }; - bool xy = ! int[] { 1, 2, 3 }; - if (!xy) io::println("Ok"); - Bar b = {}; - Baz z = {}; - int[] sub = {}; - Bar[] foo = {}; - Baz[3] baz = {}; - return 1; -} - -/* #expect: subarrays.ll - -%Bar = type { i32, i32 } -%"Bar[]" = type { ptr, i64 } -%"int[]" = type { ptr, i64 } -%Baz = type { double } - -@"ct$subarrays_Baz" = linkonce constant %.introspect { i8 11, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@"ct$subarrays_Bar" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8 -@.taddr = private global [2 x %Bar] [%Bar { i32 3, i32 4 }, %Bar { i32 8, i32 9 }], align 8 -@subarrays_arrbar = local_unnamed_addr global %"Bar[]" { ptr @.taddr, i64 2 }, align 8 -@.taddr.3 = private global [2 x i32] [i32 1, i32 2], align 4 -@subarrays_xd = local_unnamed_addr global %"int[]" { ptr @.taddr.3, i64 2 }, align 8 -@.taddr.4 = private global [2 x i32] [i32 3, i32 4], align 4 -@subarrays_fofeo = local_unnamed_addr global ptr @.taddr.4, align 8 -@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 -@.str.5 = private unnamed_addr constant [7 x i8] c"Start:\00", align 1 -@.str.6 = private unnamed_addr constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1 -@.str.7 = private unnamed_addr constant [18 x i8] c"Y mid element %d\0A\00", align 1 -@.str.8 = private unnamed_addr constant [25 x i8] c"Fofeo second element %d\0A\00", align 1 -@.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8 -@.str.9 = private unnamed_addr constant [3 x i8] c"Ok\00", align 1 - -define i32 @main() #0 { -entry: - %w = alloca %Bar, align 4 - %x = alloca %"int[]", align 8 - %literal = alloca [3 x i32], align 4 - %y = alloca ptr, align 8 - %literal2 = alloca [3 x i32], align 4 - %ffe = alloca %Baz, align 8 - %azz = alloca [1 x i32], align 4 - %xy = alloca i8, align 1 - %literal6 = alloca [3 x i32], align 4 - %b = alloca %Bar, align 4 - %z = alloca %Baz, align 8 - %sub = alloca %"int[]", align 8 - %foo = alloca %"Bar[]", align 8 - %baz = alloca [3 x %Baz], align 16 - %0 = load ptr, ptr @subarrays_arrbar, align 8 - %ptroffset = getelementptr inbounds %Bar, ptr %0, i64 1 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %w, ptr align 4 %ptroffset, i32 8, i1 false) - %1 = load ptr, ptr @subarrays_arrbar, align 8 - %ptroffset1 = getelementptr inbounds %Bar, ptr %1, i64 1 - %2 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 0 - %3 = load i32, ptr %2, align 4 - %4 = call i32 (ptr, ...) @printf(ptr @.str, i32 %3) - %5 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 0 - store i32 1, ptr %5, align 4 - %6 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 1 - store i32 2, ptr %6, align 4 - %7 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 2 - store i32 3, ptr %7, align 4 - %8 = insertvalue %"int[]" undef, ptr %literal, 0 - %9 = insertvalue %"int[]" %8, i64 3, 1 - store %"int[]" %9, ptr %x, align 8 - %10 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 0 - store i32 123, ptr %10, align 4 - %11 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 1 - store i32 234, ptr %11, align 4 - %12 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 2 - store i32 567, ptr %12, align 4 - store ptr %literal2, ptr %y, align 8 - %13 = call i32 @std_io_println(ptr @.str.5) #3 - %14 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 - %15 = load i64, ptr %14, align 8 - %uisitrunc = trunc i64 %15 to i32 - %16 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 - %17 = load ptr, ptr %16, align 8 - %ptroffset3 = getelementptr inbounds i32, ptr %17, i64 1 - %18 = load i32, ptr %ptroffset3, align 4 - %19 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %uisitrunc, i32 %18) - %20 = load ptr, ptr %y, align 8 - %ptroffset4 = getelementptr inbounds i32, ptr %20, i64 1 - %21 = load i32, ptr %ptroffset4, align 4 - %22 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %21) - %23 = load ptr, ptr @subarrays_fofeo, align 8 - %ptroffset5 = getelementptr inbounds i32, ptr %23, i64 1 - %24 = load i32, ptr %ptroffset5, align 4 - %25 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %24) - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %ffe, ptr align 8 @.__const, i32 8, i1 false) - %26 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0 - store i32 0, ptr %26, align 4 - %27 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 0 - store i32 1, ptr %27, align 4 - %28 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 1 - store i32 2, ptr %28, align 4 - %29 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 2 - store i32 3, ptr %29, align 4 - %30 = insertvalue %"int[]" undef, ptr %literal6, 0 - %31 = insertvalue %"int[]" %30, i64 3, 1 - %32 = extractvalue %"int[]" %31, 1 - %not = icmp eq i64 %32, 0 - %33 = zext i1 %not to i8 - store i8 %33, ptr %xy, align 1 - %34 = load i8, ptr %xy, align 1 - %35 = trunc i8 %34 to i1 - %not7 = xor i1 %35, true - br i1 %not7, label %if.then, label %if.exit - -if.then: ; preds = %entry - %36 = call i32 @std_io_println(ptr @.str.9) #3 - br label %if.exit - -if.exit: ; preds = %if.then, %entry - %37 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0 - store i32 0, ptr %37, align 4 - %38 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 - store i32 0, ptr %38, align 4 - call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false) - store %"int[]" zeroinitializer, ptr %sub, align 8 - store %"Bar[]" zeroinitializer, ptr %foo, align 8 - call void @llvm.memset.p0.i64(ptr align 16 %baz, i8 0, i64 24, i1 false) - ret i32 1 -} diff --git a/test/test_suite2/initializer_lists/zero_init.c3t b/test/test_suite2/initializer_lists/zero_init.c3t deleted file mode 100644 index 7c6fbf1bc..000000000 --- a/test/test_suite2/initializer_lists/zero_init.c3t +++ /dev/null @@ -1,58 +0,0 @@ -// #target: macos-x64 - -union Baz -{ - int x; - double y; -} -struct Bar -{ - int x; - int y; -} - -struct Mega -{ - int[10] z; -} - -fn int test() -{ - Mega m = {}; - int[1] azz = {}; - Bar b = {}; - Baz z = {}; - int[] sub = {}; - Bar[] foo = {}; - Baz[3] baz = {}; - return 1; -} - -/* #expect: zero_init.ll - -%Mega = type { [10 x i32] } -%Bar = type { i32, i32 } -%Baz = type { double } - -define i32 @zero_init_test() #0 { -entry: - %m = alloca %Mega, align 4 - %azz = alloca [1 x i32], align 4 - %b = alloca %Bar, align 4 - %z = alloca %Baz, align 8 - %sub = alloca %"int[]", align 8 - %foo = alloca %"Bar[]", align 8 - %baz = alloca [3 x %Baz], align 16 - call void @llvm.memset.p0.i64(ptr align 4 %m, i8 0, i64 40, i1 false) - %0 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0 - store i32 0, ptr %0, align 4 - %1 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1 - store i32 0, ptr %2, align 4 - call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false) - store %"int[]" zeroinitializer, ptr %sub, align 8 - store %"Bar[]" zeroinitializer, ptr %foo, align 8 - call void @llvm.memset.p0.i64(ptr align 16 %baz, i8 0, i64 24, i1 false) - ret i32 1 -} diff --git a/test/test_suite2/literals/bin_literal.c3t b/test/test_suite2/literals/bin_literal.c3t deleted file mode 100644 index f25a8170c..000000000 --- a/test/test_suite2/literals/bin_literal.c3t +++ /dev/null @@ -1,99 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; -import std::bits; -fn void main() -{ - int a = 123; - int b = -23; - int c = $$min(a, b); - int d = $$max(a, b); - io::printfln("%d %d", c, d); - char z = 0b1101_1101; - io::printfln("%b %b %b", z, z.rotr(1), z.rotl(1)); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %a = alloca i32, align 4 - %b = alloca i32, align 4 - %c = alloca i32, align 4 - %d = alloca i32, align 4 - %retparam = alloca i64, align 8 - %varargslots = alloca [2 x %variant], align 16 - %z = alloca i8, align 1 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [3 x %variant], align 16 - %i = alloca i8, align 1 - %shift = alloca i8, align 1 - %taddr = alloca i8, align 1 - %i3 = alloca i8, align 1 - %shift4 = alloca i8, align 1 - %taddr5 = alloca i8, align 1 - store i32 123, ptr %a, align 4 - store i32 -23, ptr %b, align 4 - %0 = load i32, ptr %a, align 4 - %1 = load i32, ptr %b, align 4 - %2 = call i32 @llvm.smin.i32(i32 %0, i32 %1) - store i32 %2, ptr %c, align 4 - %3 = load i32, ptr %a, align 4 - %4 = load i32, ptr %b, align 4 - %5 = call i32 @llvm.smax.i32(i32 %3, i32 %4) - store i32 %5, ptr %d, align 4 - %6 = insertvalue %variant undef, ptr %c, 0 - %7 = insertvalue %variant %6, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %8 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %7, ptr %8, align 16 - %9 = insertvalue %variant undef, ptr %d, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %11 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %10, ptr %11, align 16 - %12 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 5, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %12, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - store i8 -35, ptr %z, align 1 - %13 = insertvalue %variant undef, ptr %z, 0 - %14 = insertvalue %variant %13, i64 ptrtoint (ptr @"ct$char" to i64), 1 - %15 = getelementptr inbounds [3 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %14, ptr %15, align 16 - %16 = load i8, ptr %z, align 1 - store i8 %16, ptr %i, align 1 - store i8 1, ptr %shift, align 1 - %17 = load i8, ptr %i, align 1 - %18 = load i8, ptr %i, align 1 - %19 = load i8, ptr %shift, align 1 - %20 = call i8 @llvm.fshr.i8(i8 %17, i8 %18, i8 %19) - store i8 %20, ptr %taddr, align 1 - %21 = insertvalue %variant undef, ptr %taddr, 0 - %22 = insertvalue %variant %21, i64 ptrtoint (ptr @"ct$char" to i64), 1 - %23 = getelementptr inbounds [3 x %variant], ptr %varargslots2, i64 0, i64 1 - store %variant %22, ptr %23, align 16 - %24 = load i8, ptr %z, align 1 - store i8 %24, ptr %i3, align 1 - store i8 1, ptr %shift4, align 1 - %25 = load i8, ptr %i3, align 1 - %26 = load i8, ptr %i3, align 1 - %27 = load i8, ptr %shift4, align 1 - %28 = call i8 @llvm.fshl.i8(i8 %25, i8 %26, i8 %27) - store i8 %28, ptr %taddr5, align 1 - %29 = insertvalue %variant undef, ptr %taddr5, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$char" to i64), 1 - %31 = getelementptr inbounds [3 x %variant], ptr %varargslots2, i64 0, i64 2 - store %variant %30, ptr %31, align 16 - %32 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.1, i64 8, ptr %varargslots2, i64 3) - %not_err6 = icmp eq i64 %32, 0 - br i1 %not_err6, label %after_check7, label %voiderr8 - -after_check7: ; preds = %voiderr - br label %voiderr8 - -voiderr8: ; preds = %after_check7, %voiderr - ret void -} diff --git a/test/test_suite2/macro_methods/macro_method_different_args.c3t b/test/test_suite2/macro_methods/macro_method_different_args.c3t deleted file mode 100644 index f9bbb4540..000000000 --- a/test/test_suite2/macro_methods/macro_method_different_args.c3t +++ /dev/null @@ -1,62 +0,0 @@ -// #target: macos-x64 -module foo; - -extern fn void printf(char* fmt, ...); -struct Foo -{ - int x; -} - -macro void Foo.@hello(Foo &this) { this.x = 3; printf("-%d\n", this.x); } -macro void Foo.hello(Foo* this) { this.x = 4; printf("-%d\n", this.x); } -macro void Foo.hello2(Foo this) { this.x = 5; printf("-%d\n", this.x); } - -fn void main() -{ - Foo a; - a.@hello(); - printf("%d\n", a.x); - a.hello(); - printf("%d\n", a.x); - a.hello2(); - printf("%d\n", a.x); -} - -/* #expect: foo.ll - -define void @foo_main() #0 { -entry: - %a = alloca %Foo, align 4 - %this = alloca ptr, align 8 - %this1 = alloca %Foo, align 4 - store i32 0, ptr %a, align 4 - %0 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 - store i32 3, ptr %0, align 4 - %1 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 - %2 = load i32, ptr %1, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %2) - %3 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 - %4 = load i32, ptr %3, align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %4) - store ptr %a, ptr %this, align 8 - %5 = load ptr, ptr %this, align 8 - %6 = getelementptr inbounds %Foo, ptr %5, i32 0, i32 0 - store i32 4, ptr %6, align 8 - %7 = load ptr, ptr %this, align 8 - %8 = getelementptr inbounds %Foo, ptr %7, i32 0, i32 0 - %9 = load i32, ptr %8, align 8 - call void (ptr, ...) @printf(ptr @.str.2, i32 %9) - %10 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 - %11 = load i32, ptr %10, align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %11) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %this1, ptr align 4 %a, i32 4, i1 false) - %12 = getelementptr inbounds %Foo, ptr %this1, i32 0, i32 0 - store i32 5, ptr %12, align 4 - %13 = getelementptr inbounds %Foo, ptr %this1, i32 0, i32 0 - %14 = load i32, ptr %13, align 4 - call void (ptr, ...) @printf(ptr @.str.4, i32 %14) - %15 = getelementptr inbounds %Foo, ptr %a, i32 0, i32 0 - %16 = load i32, ptr %15, align 4 - call void (ptr, ...) @printf(ptr @.str.5, i32 %16) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/macros/macro_defer_exit.c3t b/test/test_suite2/macros/macro_defer_exit.c3t deleted file mode 100644 index dac68826c..000000000 --- a/test/test_suite2/macros/macro_defer_exit.c3t +++ /dev/null @@ -1,83 +0,0 @@ -// #target: macos-x64 -module foo; -extern fn void printf(char*,...); - -macro int abc(x) -{ - defer printf("Out x %d\n", x); - x *= 2; - if (x > 100) return x = x - 100; - printf("Normal end\n"); - return x; -} - -fn void main() -{ - defer printf("On exit\n"); - abc(123); - abc(3); -} - -/* #expect: foo.ll - -define void @foo_main() #0 { -entry: - %x = alloca i32, align 4 - %blockret = alloca i32, align 4 - %x1 = alloca i32, align 4 - %blockret2 = alloca i32, align 4 - store i32 123, ptr %x, align 4 - %0 = load i32, ptr %x, align 4 - %mul = mul i32 %0, 2 - store i32 %mul, ptr %x, align 4 - %1 = load i32, ptr %x, align 4 - %gt = icmp sgt i32 %1, 100 - br i1 %gt, label %if.then, label %if.exit - -if.then: ; preds = %entry - %2 = load i32, ptr %x, align 4 - %sub = sub i32 %2, 100 - store i32 %sub, ptr %x, align 4 - %3 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %3) - store i32 %sub, ptr %blockret, align 4 - br label %expr_block.exit - -if.exit: ; preds = %entry - call void (ptr, ...) @printf(ptr @.str.1) - %4 = load i32, ptr %x, align 4 - call void (ptr, ...) @printf(ptr @.str.2, i32 %4) - %5 = load i32, ptr %x, align 4 - store i32 %5, ptr %blockret, align 4 - br label %expr_block.exit - -expr_block.exit: ; preds = %if.exit, %if.then - store i32 3, ptr %x1, align 4 - %6 = load i32, ptr %x1, align 4 - %mul3 = mul i32 %6, 2 - store i32 %mul3, ptr %x1, align 4 - %7 = load i32, ptr %x1, align 4 - %gt4 = icmp sgt i32 %7, 100 - br i1 %gt4, label %if.then5, label %if.exit7 - -if.then5: ; preds = %expr_block.exit - %8 = load i32, ptr %x1, align 4 - %sub6 = sub i32 %8, 100 - store i32 %sub6, ptr %x1, align 4 - %9 = load i32, ptr %x1, align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %9) - store i32 %sub6, ptr %blockret2, align 4 - br label %expr_block.exit8 - -if.exit7: ; preds = %expr_block.exit - call void (ptr, ...) @printf(ptr @.str.4) - %10 = load i32, ptr %x1, align 4 - call void (ptr, ...) @printf(ptr @.str.5, i32 %10) - %11 = load i32, ptr %x1, align 4 - store i32 %11, ptr %blockret2, align 4 - br label %expr_block.exit8 - -expr_block.exit8: ; preds = %if.exit7, %if.then5 - call void (ptr, ...) @printf(ptr @.str.6) - ret void -} diff --git a/test/test_suite2/macros/macro_defer_with_body.c3t b/test/test_suite2/macros/macro_defer_with_body.c3t deleted file mode 100644 index fc1932c92..000000000 --- a/test/test_suite2/macros/macro_defer_with_body.c3t +++ /dev/null @@ -1,55 +0,0 @@ -module foo; -macro int @cofefe(a; @body(x)) -{ - @body(a); - @body(a); - return 1; -} - -extern fn int printf(char *, ...); - -fn void main() -{ - int x = 0; - @cofefe(1; int y) - { - defer printf("defer: %d\n", x++); - printf("%d\n", x++); - }; - printf("Done!\n"); -} - -/* #expect: foo.ll - -define void @foo_main() #0 { -entry: - %x = alloca i32, align 4 - %a = alloca i32, align 4 - %y = alloca i32, align 4 - store i32 0, ptr %x, align 4 - store i32 1, ptr %a, align 4 - %0 = load i32, ptr %a, align 4 - store i32 %0, ptr %y, align 4 - %1 = load i32, ptr %x, align 4 - %add = add i32 %1, 1 - store i32 %add, ptr %x, align 4 - %2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1) - %3 = load i32, ptr %x, align 4 - %add1 = add i32 %3, 1 - store i32 %add1, ptr %x, align 4 - %4 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %3) - %5 = load i32, ptr %a, align 4 - store i32 %5, ptr %y, align 4 - %6 = load i32, ptr %x, align 4 - %add2 = add i32 %6, 1 - store i32 %add2, ptr %x, align 4 - %7 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %6) - %8 = load i32, ptr %x, align 4 - %add3 = add i32 %8, 1 - store i32 %add3, ptr %x, align 4 - %9 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 %8) - %10 = call i32 (ptr, ...) @printf(ptr @.str.4) - ret void -} - - diff --git a/test/test_suite2/macros/macro_typed_varargs.c3t b/test/test_suite2/macros/macro_typed_varargs.c3t deleted file mode 100644 index 90031117d..000000000 --- a/test/test_suite2/macros/macro_typed_varargs.c3t +++ /dev/null @@ -1,161 +0,0 @@ -// #target: macos-x64 - -module test; - -import std::io; - -macro foo(int... x) -{ - foreach (i : x) - { - io::printfln("%d", i); - } -} - -macro foo2(x...) -{ - foreach (i : x) - { - io::printfln("%d", *(int*)i); - } -} - -fn void main() -{ - foo(1, -1, 3141, 999 + 1); - foo2(1, -1, 3141, 999 + 1); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %x = alloca %"int[]", align 8 - %literal = alloca [4 x i32], align 16 - %.anon = alloca i64, align 8 - %.anon1 = alloca i64, align 8 - %i = alloca i32, align 4 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %x2 = alloca %"variant[]", align 8 - %literal3 = alloca [4 x %variant], align 16 - %taddr = alloca i32, align 4 - %taddr4 = alloca i32, align 4 - %taddr5 = alloca i32, align 4 - %taddr6 = alloca i32, align 4 - %.anon7 = alloca i64, align 8 - %.anon8 = alloca i64, align 8 - %i12 = alloca %variant, align 8 - %retparam14 = alloca i64, align 8 - %varargslots15 = alloca [1 x %variant], align 16 - %0 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 0 - store i32 1, ptr %0, align 4 - %1 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 1 - store i32 -1, ptr %1, align 4 - %2 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 2 - store i32 3141, ptr %2, align 4 - %3 = getelementptr inbounds [4 x i32], ptr %literal, i64 0, i64 3 - store i32 1000, ptr %3, align 4 - %4 = insertvalue %"int[]" undef, ptr %literal, 0 - %5 = insertvalue %"int[]" %4, i64 4, 1 - store %"int[]" %5, ptr %x, align 8 - %6 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1 - %7 = load i64, ptr %6, align 8 - store i64 %7, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %voiderr, %entry - %8 = load i64, ptr %.anon1, align 8 - %9 = load i64, ptr %.anon, align 8 - %lt = icmp ult i64 %8, %9 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %10 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0 - %11 = load ptr, ptr %10, align 8 - %12 = load i64, ptr %.anon1, align 8 - %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 - %13 = load i32, ptr %ptroffset, align 4 - store i32 %13, ptr %i, align 4 - %14 = insertvalue %variant undef, ptr %i, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %16 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %15, ptr %16, align 16 - %17 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %17, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %loop.body - br label %voiderr - -voiderr: ; preds = %after_check, %loop.body - %18 = load i64, ptr %.anon1, align 8 - %add = add i64 %18, 1 - store i64 %add, ptr %.anon1, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %19 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 0 - store i32 1, ptr %taddr, align 4 - %20 = insertvalue %variant undef, ptr %taddr, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %21, ptr %19, align 8 - %22 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 1 - store i32 -1, ptr %taddr4, align 4 - %23 = insertvalue %variant undef, ptr %taddr4, 0 - %24 = insertvalue %variant %23, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %24, ptr %22, align 8 - %25 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 2 - store i32 3141, ptr %taddr5, align 4 - %26 = insertvalue %variant undef, ptr %taddr5, 0 - %27 = insertvalue %variant %26, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %27, ptr %25, align 8 - %28 = getelementptr inbounds [4 x %variant], ptr %literal3, i64 0, i64 3 - store i32 1000, ptr %taddr6, align 4 - %29 = insertvalue %variant undef, ptr %taddr6, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %30, ptr %28, align 8 - %31 = insertvalue %"variant[]" undef, ptr %literal3, 0 - %32 = insertvalue %"variant[]" %31, i64 4, 1 - store %"variant[]" %32, ptr %x2, align 8 - %33 = getelementptr inbounds %"variant[]", ptr %x2, i32 0, i32 1 - %34 = load i64, ptr %33, align 8 - store i64 %34, ptr %.anon7, align 8 - store i64 0, ptr %.anon8, align 8 - br label %loop.cond9 - -loop.cond9: ; preds = %voiderr18, %loop.exit - %35 = load i64, ptr %.anon8, align 8 - %36 = load i64, ptr %.anon7, align 8 - %lt10 = icmp ult i64 %35, %36 - br i1 %lt10, label %loop.body11, label %loop.exit20 - -loop.body11: ; preds = %loop.cond9 - %37 = getelementptr inbounds %"variant[]", ptr %x2, i32 0, i32 0 - %38 = load ptr, ptr %37, align 8 - %39 = load i64, ptr %.anon8, align 8 - %ptroffset13 = getelementptr inbounds %variant, ptr %38, i64 %39 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %i12, ptr align 8 %ptroffset13, i32 16, i1 false) - %40 = getelementptr inbounds %variant, ptr %i12, i32 0, i32 0 - %41 = load ptr, ptr %40, align 8 - %42 = insertvalue %variant undef, ptr %41, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %44 = getelementptr inbounds [1 x %variant], ptr %varargslots15, i64 0, i64 0 - store %variant %43, ptr %44, align 16 - %45 = call i64 @std_io_printfln(ptr %retparam14, ptr @.str.1, i64 2, ptr %varargslots15, i64 1) - %not_err16 = icmp eq i64 %45, 0 - br i1 %not_err16, label %after_check17, label %voiderr18 - -after_check17: ; preds = %loop.body11 - br label %voiderr18 - -voiderr18: ; preds = %after_check17, %loop.body11 - %46 = load i64, ptr %.anon8, align 8 - %add19 = add i64 %46, 1 - store i64 %add19, ptr %.anon8, align 8 - br label %loop.cond9 - -loop.exit20: ; preds = %loop.cond9 - ret void -} diff --git a/test/test_suite2/macros/macro_untyped_varargs_2.c3t b/test/test_suite2/macros/macro_untyped_varargs_2.c3t deleted file mode 100644 index 0caf223f7..000000000 --- a/test/test_suite2/macros/macro_untyped_varargs_2.c3t +++ /dev/null @@ -1,271 +0,0 @@ -// #target: macos-x64 - -module test; - -import std::io; - -macro @foo(...) -{ - int i = $vaarg(1) + $vaarg(1); - int j = $vaexpr(2) + $vaexpr(2); - $for (var $i = 0; $i < $vacount; $i++): - io::printfln("%d", $vaarg($i)); - $endfor; -} - -macro foo2(...) -{ - $for (var $i = 0; $i < $vacount; $i++): - { - $vatype($i) x; - } - io::printfln("%s", $vatype($i).nameof); - $endfor; -} - -macro foo3(...) -{ - var $x = 0; - $for (var $i = 0; $i < $vacount; $i++): - $x += $vaconst($i); - $endfor; - return $x; -} - -macro @foo4(...) -{ - $typeof($varef(0)) a = $varef(0); - $varef(0) = $varef(1); - $varef(1) = a; -} -fn int ping(int val) -{ - io::printfln("Ping[%d]", val); - return val; -} - -fn void main() -{ - @foo(ping(1), ping(-1), ping(3141), ping(999 + 1)); - foo2(int, double); - var $x = foo3(1, 4, 100); - io::printfln("%d", $x); - int x = 123; - int y = 33; - @foo4(x, y); - io::printfln("%d, %d", x, y); - @foo4(x, y); - io::printfln("%d, %d", x, y); -} - -/* #expect: test.ll - -define i32 @test_ping(i32 %0) #0 { -entry: - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %taddr = alloca i32, align 4 - store i32 %0, ptr %taddr, align 4 - %1 = insertvalue %variant undef, ptr %taddr, 0 - %2 = insertvalue %variant %1, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %3 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %2, ptr %3, align 16 - %4 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %4, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - ret i32 %0 -} - -define void @test_main() #0 { -entry: - %.anon = alloca i32, align 4 - %.anon1 = alloca i32, align 4 - %.anon2 = alloca i32, align 4 - %.anon3 = alloca i32, align 4 - %i = alloca i32, align 4 - %j = alloca i32, align 4 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %retparam5 = alloca i64, align 8 - %varargslots6 = alloca [1 x %variant], align 16 - %retparam10 = alloca i64, align 8 - %varargslots11 = alloca [1 x %variant], align 16 - %retparam15 = alloca i64, align 8 - %varargslots16 = alloca [1 x %variant], align 16 - %x = alloca i32, align 4 - %retparam20 = alloca i64, align 8 - %varargslots21 = alloca [1 x %variant], align 16 - %taddr = alloca ptr, align 8 - %x25 = alloca double, align 8 - %retparam26 = alloca i64, align 8 - %varargslots27 = alloca [1 x %variant], align 16 - %taddr28 = alloca ptr, align 8 - %retparam32 = alloca i64, align 8 - %varargslots33 = alloca [1 x %variant], align 16 - %taddr34 = alloca i32, align 4 - %x38 = alloca i32, align 4 - %y = alloca i32, align 4 - %a = alloca i32, align 4 - %retparam39 = alloca i64, align 8 - %varargslots40 = alloca [2 x %variant], align 16 - %a44 = alloca i32, align 4 - %retparam45 = alloca i64, align 8 - %varargslots46 = alloca [2 x %variant], align 16 - %0 = call i32 @test_ping(i32 -1) - store i32 %0, ptr %.anon, align 4 - %1 = call i32 @test_ping(i32 1) - store i32 %1, ptr %.anon1, align 4 - %2 = call i32 @test_ping(i32 3141) - store i32 %2, ptr %.anon2, align 4 - %3 = call i32 @test_ping(i32 1000) - store i32 %3, ptr %.anon3, align 4 - %4 = load i32, ptr %.anon, align 4 - %5 = load i32, ptr %.anon, align 4 - %add = add i32 %4, %5 - store i32 %add, ptr %i, align 4 - %6 = call i32 @test_ping(i32 3141) - %7 = call i32 @test_ping(i32 3141) - %add4 = add i32 %6, %7 - store i32 %add4, ptr %j, align 4 - %8 = insertvalue %variant undef, ptr %.anon1, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %10 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %9, ptr %10, align 16 - %11 = call i64 @std_io_printfln(ptr %retparam, ptr @.str.1, i64 2, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %11, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %12 = insertvalue %variant undef, ptr %.anon, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %14 = getelementptr inbounds [1 x %variant], ptr %varargslots6, i64 0, i64 0 - store %variant %13, ptr %14, align 16 - %15 = call i64 @std_io_printfln(ptr %retparam5, ptr @.str.2, i64 2, ptr %varargslots6, i64 1) - %not_err7 = icmp eq i64 %15, 0 - br i1 %not_err7, label %after_check8, label %voiderr9 - -after_check8: ; preds = %voiderr - br label %voiderr9 - -voiderr9: ; preds = %after_check8, %voiderr - %16 = insertvalue %variant undef, ptr %.anon2, 0 - %17 = insertvalue %variant %16, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %18 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 - store %variant %17, ptr %18, align 16 - %19 = call i64 @std_io_printfln(ptr %retparam10, ptr @.str.3, i64 2, ptr %varargslots11, i64 1) - %not_err12 = icmp eq i64 %19, 0 - br i1 %not_err12, label %after_check13, label %voiderr14 - -after_check13: ; preds = %voiderr9 - br label %voiderr14 - -voiderr14: ; preds = %after_check13, %voiderr9 - %20 = insertvalue %variant undef, ptr %.anon3, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %22 = getelementptr inbounds [1 x %variant], ptr %varargslots16, i64 0, i64 0 - store %variant %21, ptr %22, align 16 - %23 = call i64 @std_io_printfln(ptr %retparam15, ptr @.str.4, i64 2, ptr %varargslots16, i64 1) - %not_err17 = icmp eq i64 %23, 0 - br i1 %not_err17, label %after_check18, label %voiderr19 - -after_check18: ; preds = %voiderr14 - br label %voiderr19 - -voiderr19: ; preds = %after_check18, %voiderr14 - store i32 0, ptr %x, align 4 - store ptr @.str.6, ptr %taddr, align 8 - %24 = insertvalue %variant undef, ptr %taddr, 0 - %25 = insertvalue %variant %24, i64 ptrtoint (ptr @"ct$p$a3$char" to i64), 1 - %26 = getelementptr inbounds [1 x %variant], ptr %varargslots21, i64 0, i64 0 - store %variant %25, ptr %26, align 16 - %27 = call i64 @std_io_printfln(ptr %retparam20, ptr @.str.5, i64 2, ptr %varargslots21, i64 1) - %not_err22 = icmp eq i64 %27, 0 - br i1 %not_err22, label %after_check23, label %voiderr24 - -after_check23: ; preds = %voiderr19 - br label %voiderr24 - -voiderr24: ; preds = %after_check23, %voiderr19 - store double 0.000000e+00, ptr %x25, align 8 - store ptr @.str.8, ptr %taddr28, align 8 - %28 = insertvalue %variant undef, ptr %taddr28, 0 - %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$p$a6$char" to i64), 1 - %30 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0 - store %variant %29, ptr %30, align 16 - %31 = call i64 @std_io_printfln(ptr %retparam26, ptr @.str.7, i64 2, ptr %varargslots27, i64 1) - %not_err29 = icmp eq i64 %31, 0 - br i1 %not_err29, label %after_check30, label %voiderr31 - -after_check30: ; preds = %voiderr24 - br label %voiderr31 - -voiderr31: ; preds = %after_check30, %voiderr24 - store i32 105, ptr %taddr34, align 4 - %32 = insertvalue %variant undef, ptr %taddr34, 0 - %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %34 = getelementptr inbounds [1 x %variant], ptr %varargslots33, i64 0, i64 0 - store %variant %33, ptr %34, align 16 - %35 = call i64 @std_io_printfln(ptr %retparam32, ptr @.str.9, i64 2, ptr %varargslots33, i64 1) - %not_err35 = icmp eq i64 %35, 0 - br i1 %not_err35, label %after_check36, label %voiderr37 - -after_check36: ; preds = %voiderr31 - br label %voiderr37 - -voiderr37: ; preds = %after_check36, %voiderr31 - store i32 123, ptr %x38, align 4 - store i32 33, ptr %y, align 4 - %36 = load i32, ptr %x38, align 4 - store i32 %36, ptr %a, align 4 - %37 = load i32, ptr %y, align 4 - store i32 %37, ptr %x38, align 4 - %38 = load i32, ptr %a, align 4 - store i32 %38, ptr %y, align 4 - %39 = insertvalue %variant undef, ptr %x38, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %41 = getelementptr inbounds [2 x %variant], ptr %varargslots40, i64 0, i64 0 - store %variant %40, ptr %41, align 16 - %42 = insertvalue %variant undef, ptr %y, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %44 = getelementptr inbounds [2 x %variant], ptr %varargslots40, i64 0, i64 1 - store %variant %43, ptr %44, align 16 - %45 = call i64 @std_io_printfln(ptr %retparam39, ptr @.str.10, i64 6, ptr %varargslots40, i64 2) - %not_err41 = icmp eq i64 %45, 0 - br i1 %not_err41, label %after_check42, label %voiderr43 - -after_check42: ; preds = %voiderr37 - br label %voiderr43 - -voiderr43: ; preds = %after_check42, %voiderr37 - %46 = load i32, ptr %x38, align 4 - store i32 %46, ptr %a44, align 4 - %47 = load i32, ptr %y, align 4 - store i32 %47, ptr %x38, align 4 - %48 = load i32, ptr %a44, align 4 - store i32 %48, ptr %y, align 4 - %49 = insertvalue %variant undef, ptr %x38, 0 - %50 = insertvalue %variant %49, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %51 = getelementptr inbounds [2 x %variant], ptr %varargslots46, i64 0, i64 0 - store %variant %50, ptr %51, align 16 - %52 = insertvalue %variant undef, ptr %y, 0 - %53 = insertvalue %variant %52, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %54 = getelementptr inbounds [2 x %variant], ptr %varargslots46, i64 0, i64 1 - store %variant %53, ptr %54, align 16 - %55 = call i64 @std_io_printfln(ptr %retparam45, ptr @.str.11, i64 6, ptr %varargslots46, i64 2) - %not_err47 = icmp eq i64 %55, 0 - br i1 %not_err47, label %after_check48, label %voiderr49 - -after_check48: ; preds = %voiderr43 - br label %voiderr49 - -voiderr49: ; preds = %after_check48, %voiderr43 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/macros/macro_vasplat.c3t b/test/test_suite2/macros/macro_vasplat.c3t deleted file mode 100644 index 6dcb4eb79..000000000 --- a/test/test_suite2/macros/macro_vasplat.c3t +++ /dev/null @@ -1,596 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -macro @hello(...) -{ - int[*] a = { 1, $vasplat(), 3 }; - foreach (i, x : a) io::printfln("%d: %d", i, x); -} - -macro @hello1(...) -{ - int[*] a = { 1, $vasplat() }; - foreach (i, x : a) io::printfln("x:%d: %d", i, x); -} - -macro @hello2(...) -{ - int[*] a = { $vasplat(), 888 }; - foreach (i, x : a) io::printfln("x:%d: %d", i, x); -} - -macro @hello3(...) -{ - int[*] a = { $vasplat() }; - foreach (i, x : a) io::printfln("x:%d: %d", i, x); -} - -macro @hello4(...) -{ - int[*] a = { 5, $vasplat(2..4), 77 }; - foreach (i, x : a) io::printfln("y:%d: %d", i, x); -} - -macro @hello5(...) -{ - int[*] a = { 5, $vasplat(2..), 77 }; - foreach (i, x : a) io::printfln("y:%d: %d", i, x); - int[*] b = { 55, $vasplat(2..^2), 88 }; - foreach (i, x : b) io::printfln("z:%d: %d", i, x); - int[*] c = { 55, $vasplat(0:^2), 88 }; - foreach (i, x : c) io::printfln("zz:%d: %d", i, x); -} - -macro @hello6(...) -{ - @hello(66, $vasplat()); -} -fn void main() -{ - @hello1(223, 326); - @hello1(); - @hello(26, 36); - @hello(); - @hello2(2123, 3326); - @hello2(); - @hello3(2123, 3326); - @hello4(1, 2, 3, 4, 5, 6, 7, 8); - @hello5(1, 2, 3, 4, 5, 6, 7, 8); - @hello6(1, 2, 3); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %a = alloca [3 x i32], align 4 - %.anon = alloca i64, align 8 - %i = alloca i64, align 8 - %x = alloca i32, align 4 - %retparam = alloca i64, align 8 - %varargslots = alloca [2 x %variant], align 16 - %a1 = alloca [1 x i32], align 4 - %.anon2 = alloca i64, align 8 - %i6 = alloca i64, align 8 - %x7 = alloca i32, align 4 - %retparam8 = alloca i64, align 8 - %varargslots9 = alloca [2 x %variant], align 16 - %a15 = alloca [4 x i32], align 16 - %.anon16 = alloca i64, align 8 - %i20 = alloca i64, align 8 - %x21 = alloca i32, align 4 - %retparam22 = alloca i64, align 8 - %varargslots23 = alloca [2 x %variant], align 16 - %a29 = alloca [2 x i32], align 4 - %.anon30 = alloca i64, align 8 - %i34 = alloca i64, align 8 - %x35 = alloca i32, align 4 - %retparam36 = alloca i64, align 8 - %varargslots37 = alloca [2 x %variant], align 16 - %a43 = alloca [3 x i32], align 4 - %.anon44 = alloca i64, align 8 - %i48 = alloca i64, align 8 - %x49 = alloca i32, align 4 - %retparam50 = alloca i64, align 8 - %varargslots51 = alloca [2 x %variant], align 16 - %a57 = alloca [1 x i32], align 4 - %.anon58 = alloca i64, align 8 - %i62 = alloca i64, align 8 - %x63 = alloca i32, align 4 - %retparam64 = alloca i64, align 8 - %varargslots65 = alloca [2 x %variant], align 16 - %a71 = alloca [2 x i32], align 4 - %.anon72 = alloca i64, align 8 - %i76 = alloca i64, align 8 - %x77 = alloca i32, align 4 - %retparam78 = alloca i64, align 8 - %varargslots79 = alloca [2 x %variant], align 16 - %a85 = alloca [5 x i32], align 16 - %.anon86 = alloca i64, align 8 - %i90 = alloca i64, align 8 - %x91 = alloca i32, align 4 - %retparam92 = alloca i64, align 8 - %varargslots93 = alloca [2 x %variant], align 16 - %a99 = alloca [8 x i32], align 16 - %.anon100 = alloca i64, align 8 - %i104 = alloca i64, align 8 - %x105 = alloca i32, align 4 - %retparam106 = alloca i64, align 8 - %varargslots107 = alloca [2 x %variant], align 16 - %b = alloca [7 x i32], align 16 - %.anon113 = alloca i64, align 8 - %i117 = alloca i64, align 8 - %x118 = alloca i32, align 4 - %retparam119 = alloca i64, align 8 - %varargslots120 = alloca [2 x %variant], align 16 - %c = alloca [8 x i32], align 16 - %.anon126 = alloca i64, align 8 - %i130 = alloca i64, align 8 - %x131 = alloca i32, align 4 - %retparam132 = alloca i64, align 8 - %varargslots133 = alloca [2 x %variant], align 16 - %a139 = alloca [6 x i32], align 16 - %.anon140 = alloca i64, align 8 - %i144 = alloca i64, align 8 - %x145 = alloca i32, align 4 - %retparam146 = alloca i64, align 8 - %varargslots147 = alloca [2 x %variant], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 @.__const, i32 12, i1 false) - store i64 0, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %voiderr, %entry - %0 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 3, %0 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %1 = load i64, ptr %.anon, align 8 - store i64 %1, ptr %i, align 8 - %2 = load i64, ptr %.anon, align 8 - %3 = getelementptr inbounds [3 x i32], ptr %a, i64 0, i64 %2 - %4 = load i32, ptr %3, align 4 - store i32 %4, ptr %x, align 4 - %5 = insertvalue %variant undef, ptr %i, 0 - %6 = insertvalue %variant %5, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %7 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %6, ptr %7, align 16 - %8 = insertvalue %variant undef, ptr %x, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %10 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %9, ptr %10, align 16 - %11 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 8, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %11, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %loop.body - br label %voiderr - -voiderr: ; preds = %after_check, %loop.body - %12 = load i64, ptr %.anon, align 8 - %add = add i64 %12, 1 - store i64 %add, ptr %.anon, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a1, ptr align 4 @.__const.1, i32 4, i1 false) - store i64 0, ptr %.anon2, align 8 - br label %loop.cond3 - -loop.cond3: ; preds = %voiderr12, %loop.exit - %13 = load i64, ptr %.anon2, align 8 - %gt4 = icmp ugt i64 1, %13 - br i1 %gt4, label %loop.body5, label %loop.exit14 - -loop.body5: ; preds = %loop.cond3 - %14 = load i64, ptr %.anon2, align 8 - store i64 %14, ptr %i6, align 8 - %15 = load i64, ptr %.anon2, align 8 - %16 = getelementptr inbounds [1 x i32], ptr %a1, i64 0, i64 %15 - %17 = load i32, ptr %16, align 4 - store i32 %17, ptr %x7, align 4 - %18 = insertvalue %variant undef, ptr %i6, 0 - %19 = insertvalue %variant %18, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %20 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 0 - store %variant %19, ptr %20, align 16 - %21 = insertvalue %variant undef, ptr %x7, 0 - %22 = insertvalue %variant %21, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %23 = getelementptr inbounds [2 x %variant], ptr %varargslots9, i64 0, i64 1 - store %variant %22, ptr %23, align 16 - %24 = call i64 @std_io_printfln(ptr %retparam8, ptr @.str.2, i64 8, ptr %varargslots9, i64 2) - %not_err10 = icmp eq i64 %24, 0 - br i1 %not_err10, label %after_check11, label %voiderr12 - -after_check11: ; preds = %loop.body5 - br label %voiderr12 - -voiderr12: ; preds = %after_check11, %loop.body5 - %25 = load i64, ptr %.anon2, align 8 - %add13 = add i64 %25, 1 - store i64 %add13, ptr %.anon2, align 8 - br label %loop.cond3 - -loop.exit14: ; preds = %loop.cond3 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a15, ptr align 16 @.__const.3, i32 16, i1 false) - store i64 0, ptr %.anon16, align 8 - br label %loop.cond17 - -loop.cond17: ; preds = %voiderr26, %loop.exit14 - %26 = load i64, ptr %.anon16, align 8 - %gt18 = icmp ugt i64 4, %26 - br i1 %gt18, label %loop.body19, label %loop.exit28 - -loop.body19: ; preds = %loop.cond17 - %27 = load i64, ptr %.anon16, align 8 - store i64 %27, ptr %i20, align 8 - %28 = load i64, ptr %.anon16, align 8 - %29 = getelementptr inbounds [4 x i32], ptr %a15, i64 0, i64 %28 - %30 = load i32, ptr %29, align 4 - store i32 %30, ptr %x21, align 4 - %31 = insertvalue %variant undef, ptr %i20, 0 - %32 = insertvalue %variant %31, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %33 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 0 - store %variant %32, ptr %33, align 16 - %34 = insertvalue %variant undef, ptr %x21, 0 - %35 = insertvalue %variant %34, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %36 = getelementptr inbounds [2 x %variant], ptr %varargslots23, i64 0, i64 1 - store %variant %35, ptr %36, align 16 - %37 = call i64 @std_io_printfln(ptr %retparam22, ptr @.str.4, i64 6, ptr %varargslots23, i64 2) - %not_err24 = icmp eq i64 %37, 0 - br i1 %not_err24, label %after_check25, label %voiderr26 - -after_check25: ; preds = %loop.body19 - br label %voiderr26 - -voiderr26: ; preds = %after_check25, %loop.body19 - %38 = load i64, ptr %.anon16, align 8 - %add27 = add i64 %38, 1 - store i64 %add27, ptr %.anon16, align 8 - br label %loop.cond17 - -loop.exit28: ; preds = %loop.cond17 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a29, ptr align 4 @.__const.5, i32 8, i1 false) - store i64 0, ptr %.anon30, align 8 - br label %loop.cond31 - -loop.cond31: ; preds = %voiderr40, %loop.exit28 - %39 = load i64, ptr %.anon30, align 8 - %gt32 = icmp ugt i64 2, %39 - br i1 %gt32, label %loop.body33, label %loop.exit42 - -loop.body33: ; preds = %loop.cond31 - %40 = load i64, ptr %.anon30, align 8 - store i64 %40, ptr %i34, align 8 - %41 = load i64, ptr %.anon30, align 8 - %42 = getelementptr inbounds [2 x i32], ptr %a29, i64 0, i64 %41 - %43 = load i32, ptr %42, align 4 - store i32 %43, ptr %x35, align 4 - %44 = insertvalue %variant undef, ptr %i34, 0 - %45 = insertvalue %variant %44, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %46 = getelementptr inbounds [2 x %variant], ptr %varargslots37, i64 0, i64 0 - store %variant %45, ptr %46, align 16 - %47 = insertvalue %variant undef, ptr %x35, 0 - %48 = insertvalue %variant %47, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %49 = getelementptr inbounds [2 x %variant], ptr %varargslots37, i64 0, i64 1 - store %variant %48, ptr %49, align 16 - %50 = call i64 @std_io_printfln(ptr %retparam36, ptr @.str.6, i64 6, ptr %varargslots37, i64 2) - %not_err38 = icmp eq i64 %50, 0 - br i1 %not_err38, label %after_check39, label %voiderr40 - -after_check39: ; preds = %loop.body33 - br label %voiderr40 - -voiderr40: ; preds = %after_check39, %loop.body33 - %51 = load i64, ptr %.anon30, align 8 - %add41 = add i64 %51, 1 - store i64 %add41, ptr %.anon30, align 8 - br label %loop.cond31 - -loop.exit42: ; preds = %loop.cond31 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a43, ptr align 4 @.__const.7, i32 12, i1 false) - store i64 0, ptr %.anon44, align 8 - br label %loop.cond45 - -loop.cond45: ; preds = %voiderr54, %loop.exit42 - %52 = load i64, ptr %.anon44, align 8 - %gt46 = icmp ugt i64 3, %52 - br i1 %gt46, label %loop.body47, label %loop.exit56 - -loop.body47: ; preds = %loop.cond45 - %53 = load i64, ptr %.anon44, align 8 - store i64 %53, ptr %i48, align 8 - %54 = load i64, ptr %.anon44, align 8 - %55 = getelementptr inbounds [3 x i32], ptr %a43, i64 0, i64 %54 - %56 = load i32, ptr %55, align 4 - store i32 %56, ptr %x49, align 4 - %57 = insertvalue %variant undef, ptr %i48, 0 - %58 = insertvalue %variant %57, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %59 = getelementptr inbounds [2 x %variant], ptr %varargslots51, i64 0, i64 0 - store %variant %58, ptr %59, align 16 - %60 = insertvalue %variant undef, ptr %x49, 0 - %61 = insertvalue %variant %60, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %62 = getelementptr inbounds [2 x %variant], ptr %varargslots51, i64 0, i64 1 - store %variant %61, ptr %62, align 16 - %63 = call i64 @std_io_printfln(ptr %retparam50, ptr @.str.8, i64 8, ptr %varargslots51, i64 2) - %not_err52 = icmp eq i64 %63, 0 - br i1 %not_err52, label %after_check53, label %voiderr54 - -after_check53: ; preds = %loop.body47 - br label %voiderr54 - -voiderr54: ; preds = %after_check53, %loop.body47 - %64 = load i64, ptr %.anon44, align 8 - %add55 = add i64 %64, 1 - store i64 %add55, ptr %.anon44, align 8 - br label %loop.cond45 - -loop.exit56: ; preds = %loop.cond45 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a57, ptr align 4 @.__const.9, i32 4, i1 false) - store i64 0, ptr %.anon58, align 8 - br label %loop.cond59 - -loop.cond59: ; preds = %voiderr68, %loop.exit56 - %65 = load i64, ptr %.anon58, align 8 - %gt60 = icmp ugt i64 1, %65 - br i1 %gt60, label %loop.body61, label %loop.exit70 - -loop.body61: ; preds = %loop.cond59 - %66 = load i64, ptr %.anon58, align 8 - store i64 %66, ptr %i62, align 8 - %67 = load i64, ptr %.anon58, align 8 - %68 = getelementptr inbounds [1 x i32], ptr %a57, i64 0, i64 %67 - %69 = load i32, ptr %68, align 4 - store i32 %69, ptr %x63, align 4 - %70 = insertvalue %variant undef, ptr %i62, 0 - %71 = insertvalue %variant %70, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %72 = getelementptr inbounds [2 x %variant], ptr %varargslots65, i64 0, i64 0 - store %variant %71, ptr %72, align 16 - %73 = insertvalue %variant undef, ptr %x63, 0 - %74 = insertvalue %variant %73, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %75 = getelementptr inbounds [2 x %variant], ptr %varargslots65, i64 0, i64 1 - store %variant %74, ptr %75, align 16 - %76 = call i64 @std_io_printfln(ptr %retparam64, ptr @.str.10, i64 8, ptr %varargslots65, i64 2) - %not_err66 = icmp eq i64 %76, 0 - br i1 %not_err66, label %after_check67, label %voiderr68 - -after_check67: ; preds = %loop.body61 - br label %voiderr68 - -voiderr68: ; preds = %after_check67, %loop.body61 - %77 = load i64, ptr %.anon58, align 8 - %add69 = add i64 %77, 1 - store i64 %add69, ptr %.anon58, align 8 - br label %loop.cond59 - -loop.exit70: ; preds = %loop.cond59 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a71, ptr align 4 @.__const.11, i32 8, i1 false) - store i64 0, ptr %.anon72, align 8 - br label %loop.cond73 - -loop.cond73: ; preds = %voiderr82, %loop.exit70 - %78 = load i64, ptr %.anon72, align 8 - %gt74 = icmp ugt i64 2, %78 - br i1 %gt74, label %loop.body75, label %loop.exit84 - -loop.body75: ; preds = %loop.cond73 - %79 = load i64, ptr %.anon72, align 8 - store i64 %79, ptr %i76, align 8 - %80 = load i64, ptr %.anon72, align 8 - %81 = getelementptr inbounds [2 x i32], ptr %a71, i64 0, i64 %80 - %82 = load i32, ptr %81, align 4 - store i32 %82, ptr %x77, align 4 - %83 = insertvalue %variant undef, ptr %i76, 0 - %84 = insertvalue %variant %83, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %85 = getelementptr inbounds [2 x %variant], ptr %varargslots79, i64 0, i64 0 - store %variant %84, ptr %85, align 16 - %86 = insertvalue %variant undef, ptr %x77, 0 - %87 = insertvalue %variant %86, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %88 = getelementptr inbounds [2 x %variant], ptr %varargslots79, i64 0, i64 1 - store %variant %87, ptr %88, align 16 - %89 = call i64 @std_io_printfln(ptr %retparam78, ptr @.str.12, i64 8, ptr %varargslots79, i64 2) - %not_err80 = icmp eq i64 %89, 0 - br i1 %not_err80, label %after_check81, label %voiderr82 - -after_check81: ; preds = %loop.body75 - br label %voiderr82 - -voiderr82: ; preds = %after_check81, %loop.body75 - %90 = load i64, ptr %.anon72, align 8 - %add83 = add i64 %90, 1 - store i64 %add83, ptr %.anon72, align 8 - br label %loop.cond73 - -loop.exit84: ; preds = %loop.cond73 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a85, ptr align 16 @.__const.13, i32 20, i1 false) - store i64 0, ptr %.anon86, align 8 - br label %loop.cond87 - -loop.cond87: ; preds = %voiderr96, %loop.exit84 - %91 = load i64, ptr %.anon86, align 8 - %gt88 = icmp ugt i64 5, %91 - br i1 %gt88, label %loop.body89, label %loop.exit98 - -loop.body89: ; preds = %loop.cond87 - %92 = load i64, ptr %.anon86, align 8 - store i64 %92, ptr %i90, align 8 - %93 = load i64, ptr %.anon86, align 8 - %94 = getelementptr inbounds [5 x i32], ptr %a85, i64 0, i64 %93 - %95 = load i32, ptr %94, align 4 - store i32 %95, ptr %x91, align 4 - %96 = insertvalue %variant undef, ptr %i90, 0 - %97 = insertvalue %variant %96, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %98 = getelementptr inbounds [2 x %variant], ptr %varargslots93, i64 0, i64 0 - store %variant %97, ptr %98, align 16 - %99 = insertvalue %variant undef, ptr %x91, 0 - %100 = insertvalue %variant %99, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %101 = getelementptr inbounds [2 x %variant], ptr %varargslots93, i64 0, i64 1 - store %variant %100, ptr %101, align 16 - %102 = call i64 @std_io_printfln(ptr %retparam92, ptr @.str.14, i64 8, ptr %varargslots93, i64 2) - %not_err94 = icmp eq i64 %102, 0 - br i1 %not_err94, label %after_check95, label %voiderr96 - -after_check95: ; preds = %loop.body89 - br label %voiderr96 - -voiderr96: ; preds = %after_check95, %loop.body89 - %103 = load i64, ptr %.anon86, align 8 - %add97 = add i64 %103, 1 - store i64 %add97, ptr %.anon86, align 8 - br label %loop.cond87 - -loop.exit98: ; preds = %loop.cond87 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a99, ptr align 16 @.__const.15, i32 32, i1 false) - store i64 0, ptr %.anon100, align 8 - br label %loop.cond101 - -loop.cond101: ; preds = %voiderr110, %loop.exit98 - %104 = load i64, ptr %.anon100, align 8 - %gt102 = icmp ugt i64 8, %104 - br i1 %gt102, label %loop.body103, label %loop.exit112 - -loop.body103: ; preds = %loop.cond101 - %105 = load i64, ptr %.anon100, align 8 - store i64 %105, ptr %i104, align 8 - %106 = load i64, ptr %.anon100, align 8 - %107 = getelementptr inbounds [8 x i32], ptr %a99, i64 0, i64 %106 - %108 = load i32, ptr %107, align 4 - store i32 %108, ptr %x105, align 4 - %109 = insertvalue %variant undef, ptr %i104, 0 - %110 = insertvalue %variant %109, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %111 = getelementptr inbounds [2 x %variant], ptr %varargslots107, i64 0, i64 0 - store %variant %110, ptr %111, align 16 - %112 = insertvalue %variant undef, ptr %x105, 0 - %113 = insertvalue %variant %112, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %114 = getelementptr inbounds [2 x %variant], ptr %varargslots107, i64 0, i64 1 - store %variant %113, ptr %114, align 16 - %115 = call i64 @std_io_printfln(ptr %retparam106, ptr @.str.16, i64 8, ptr %varargslots107, i64 2) - %not_err108 = icmp eq i64 %115, 0 - br i1 %not_err108, label %after_check109, label %voiderr110 - -after_check109: ; preds = %loop.body103 - br label %voiderr110 - -voiderr110: ; preds = %after_check109, %loop.body103 - %116 = load i64, ptr %.anon100, align 8 - %add111 = add i64 %116, 1 - store i64 %add111, ptr %.anon100, align 8 - br label %loop.cond101 - -loop.exit112: ; preds = %loop.cond101 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %b, ptr align 16 @.__const.17, i32 28, i1 false) - store i64 0, ptr %.anon113, align 8 - br label %loop.cond114 - -loop.cond114: ; preds = %voiderr123, %loop.exit112 - %117 = load i64, ptr %.anon113, align 8 - %gt115 = icmp ugt i64 7, %117 - br i1 %gt115, label %loop.body116, label %loop.exit125 - -loop.body116: ; preds = %loop.cond114 - %118 = load i64, ptr %.anon113, align 8 - store i64 %118, ptr %i117, align 8 - %119 = load i64, ptr %.anon113, align 8 - %120 = getelementptr inbounds [7 x i32], ptr %b, i64 0, i64 %119 - %121 = load i32, ptr %120, align 4 - store i32 %121, ptr %x118, align 4 - %122 = insertvalue %variant undef, ptr %i117, 0 - %123 = insertvalue %variant %122, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %124 = getelementptr inbounds [2 x %variant], ptr %varargslots120, i64 0, i64 0 - store %variant %123, ptr %124, align 16 - %125 = insertvalue %variant undef, ptr %x118, 0 - %126 = insertvalue %variant %125, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %127 = getelementptr inbounds [2 x %variant], ptr %varargslots120, i64 0, i64 1 - store %variant %126, ptr %127, align 16 - %128 = call i64 @std_io_printfln(ptr %retparam119, ptr @.str.18, i64 8, ptr %varargslots120, i64 2) - %not_err121 = icmp eq i64 %128, 0 - br i1 %not_err121, label %after_check122, label %voiderr123 - -after_check122: ; preds = %loop.body116 - br label %voiderr123 - -voiderr123: ; preds = %after_check122, %loop.body116 - %129 = load i64, ptr %.anon113, align 8 - %add124 = add i64 %129, 1 - store i64 %add124, ptr %.anon113, align 8 - br label %loop.cond114 - -loop.exit125: ; preds = %loop.cond114 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %c, ptr align 16 @.__const.19, i32 32, i1 false) - store i64 0, ptr %.anon126, align 8 - br label %loop.cond127 - -loop.cond127: ; preds = %voiderr136, %loop.exit125 - %130 = load i64, ptr %.anon126, align 8 - %gt128 = icmp ugt i64 8, %130 - br i1 %gt128, label %loop.body129, label %loop.exit138 - -loop.body129: ; preds = %loop.cond127 - %131 = load i64, ptr %.anon126, align 8 - store i64 %131, ptr %i130, align 8 - %132 = load i64, ptr %.anon126, align 8 - %133 = getelementptr inbounds [8 x i32], ptr %c, i64 0, i64 %132 - %134 = load i32, ptr %133, align 4 - store i32 %134, ptr %x131, align 4 - %135 = insertvalue %variant undef, ptr %i130, 0 - %136 = insertvalue %variant %135, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %137 = getelementptr inbounds [2 x %variant], ptr %varargslots133, i64 0, i64 0 - store %variant %136, ptr %137, align 16 - %138 = insertvalue %variant undef, ptr %x131, 0 - %139 = insertvalue %variant %138, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %140 = getelementptr inbounds [2 x %variant], ptr %varargslots133, i64 0, i64 1 - store %variant %139, ptr %140, align 16 - %141 = call i64 @std_io_printfln(ptr %retparam132, ptr @.str.20, i64 9, ptr %varargslots133, i64 2) - %not_err134 = icmp eq i64 %141, 0 - br i1 %not_err134, label %after_check135, label %voiderr136 - -after_check135: ; preds = %loop.body129 - br label %voiderr136 - -voiderr136: ; preds = %after_check135, %loop.body129 - %142 = load i64, ptr %.anon126, align 8 - %add137 = add i64 %142, 1 - store i64 %add137, ptr %.anon126, align 8 - br label %loop.cond127 - -loop.exit138: ; preds = %loop.cond127 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %a139, ptr align 16 @.__const.21, i32 24, i1 false) - store i64 0, ptr %.anon140, align 8 - br label %loop.cond141 - -loop.cond141: ; preds = %voiderr150, %loop.exit138 - %143 = load i64, ptr %.anon140, align 8 - %gt142 = icmp ugt i64 6, %143 - br i1 %gt142, label %loop.body143, label %loop.exit152 - -loop.body143: ; preds = %loop.cond141 - %144 = load i64, ptr %.anon140, align 8 - store i64 %144, ptr %i144, align 8 - %145 = load i64, ptr %.anon140, align 8 - %146 = getelementptr inbounds [6 x i32], ptr %a139, i64 0, i64 %145 - %147 = load i32, ptr %146, align 4 - store i32 %147, ptr %x145, align 4 - %148 = insertvalue %variant undef, ptr %i144, 0 - %149 = insertvalue %variant %148, i64 ptrtoint (ptr @"ct$ulong" to i64), 1 - %150 = getelementptr inbounds [2 x %variant], ptr %varargslots147, i64 0, i64 0 - store %variant %149, ptr %150, align 16 - %151 = insertvalue %variant undef, ptr %x145, 0 - %152 = insertvalue %variant %151, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %153 = getelementptr inbounds [2 x %variant], ptr %varargslots147, i64 0, i64 1 - store %variant %152, ptr %153, align 16 - %154 = call i64 @std_io_printfln(ptr %retparam146, ptr @.str.22, i64 6, ptr %varargslots147, i64 2) - %not_err148 = icmp eq i64 %154, 0 - br i1 %not_err148, label %after_check149, label %voiderr150 - -after_check149: ; preds = %loop.body143 - br label %voiderr150 - -voiderr150: ; preds = %after_check149, %loop.body143 - %155 = load i64, ptr %.anon140, align 8 - %add151 = add i64 %155, 1 - store i64 %add151, ptr %.anon140, align 8 - br label %loop.cond141 - -loop.exit152: ; preds = %loop.cond141 - ret void -} diff --git a/test/test_suite2/macros/macro_with_body.c3t b/test/test_suite2/macros/macro_with_body.c3t deleted file mode 100644 index ba165e9da..000000000 --- a/test/test_suite2/macros/macro_with_body.c3t +++ /dev/null @@ -1,105 +0,0 @@ -module withbody; - - -extern fn int printf(char *, ...); - -struct Foo -{ - int x; -} - -fn int Foo.mutate(Foo *foo) -{ - printf("Mutating\n"); - return 10 * ++foo.x; -} - -macro @macro_with_body(foo, &x; @body(x, y)) -{ - x = foo.x; - @body(foo.mutate(), x); -} - -macro @repeat(int times; @body(x)) -{ - for (int i = 0; i < times; i++) - { - @body(i + 1); - } -} - -fn void main() -{ - Foo f = { 33 }; - int y; - @macro_with_body(f, y; int x, int dy) - { - printf("Got values %d, %d\n", x, dy); - }; - @repeat(10; int loop) - { - printf("Repeat %d\n", loop); - }; - -} - -/* #expect: withbody.ll - -define i32 @withbody_Foo_mutate(ptr %0) #0 { -entry: - %1 = call i32 (ptr, ...) @printf(ptr @.str.2) - %2 = getelementptr inbounds %Foo, ptr %0, i32 0, i32 0 - %3 = load i32, ptr %2, align 8 - %add = add i32 %3, 1 - store i32 %add, ptr %2, align 8 - %mul = mul i32 10, %add - ret i32 %mul -} - -define void @withbody_main() #0 { -entry: - %f = alloca %Foo, align 4 - %y = alloca i32, align 4 - %foo = alloca %Foo, align 4 - %x = alloca i32, align 4 - %dy = alloca i32, align 4 - %times = alloca i32, align 4 - %i = alloca i32, align 4 - %loop = alloca i32, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %f, ptr align 4 @.__const, i32 4, i1 false) - store i32 0, ptr %y, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 %f, i32 4, i1 false) - %0 = getelementptr inbounds %Foo, ptr %foo, i32 0, i32 0 - %1 = load i32, ptr %0, align 4 - store i32 %1, ptr %y, align 4 - %2 = call i32 @withbody_Foo_mutate(ptr %foo) - store i32 %2, ptr %x, align 4 - %3 = load i32, ptr %y, align 4 - store i32 %3, ptr %dy, align 4 - %4 = load i32, ptr %x, align 4 - %5 = load i32, ptr %dy, align 4 - %6 = call i32 (ptr, ...) @printf(ptr @.str, i32 %4, i32 %5) - store i32 10, ptr %times, align 4 - store i32 0, ptr %i, align 4 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %7 = load i32, ptr %i, align 4 - %8 = load i32, ptr %times, align 4 - %lt = icmp slt i32 %7, %8 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %9 = load i32, ptr %i, align 4 - %add = add i32 %9, 1 - store i32 %add, ptr %loop, align 4 - %10 = load i32, ptr %loop, align 4 - %11 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %10) - %12 = load i32, ptr %i, align 4 - %add1 = add i32 %12, 1 - store i32 %add1, ptr %i, align 4 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - ret void -} diff --git a/test/test_suite2/macros/userland_bitcast.c3t b/test/test_suite2/macros/userland_bitcast.c3t deleted file mode 100644 index bc1d944fe..000000000 --- a/test/test_suite2/macros/userland_bitcast.c3t +++ /dev/null @@ -1,330 +0,0 @@ -// #target: macos-x64 - -macro testbitcast(expr, $Type) -{ - $assert($sizeof(expr) == $Type.sizeof, "Cannot bitcast between types of different size."); - $Type x = void; - var $size = (usz)($sizeof(expr)); - - $if ($alignof(expr) >= 8 && $Type.alignof >= 8): - ulong *b = (ulong*)(&expr); - ulong *to = (ulong*)(&x); - for (usz i = 0; i < $size; i += 8) - { - to[i] = b[i]; - } - $elif ($alignof(expr) >= 4 && $Type.alignof >= 4): - uint* b = (uint*)(&expr); - uint* to = (uint*)(&x); - for (usz i = 0; i < $size; i += 4) - { - to[i] = b[i]; - } - $elif ($alignof(expr) >= 2 && $Type.alignof >= 2): - ushort* b = (ushort*)(&expr); - ushort* to = (ushort*)(&x); - for (usz i = 0; i < $size; i += 2) - { - to[i] = b[i]; - } - $else: - char* b = (char*)(&expr); - char* to = (char*)(&x); - for (usz i = 0; i < $size; i++) - { - to[i] = b[i]; - } - $endif; - return x; -} - -extern fn void printf(char*, ...); - -struct Foo -{ - short a; - char b; - char c; - short d; - short e; -} - -fn ulong testFoo(short x) -{ - Foo z; - z.a = x; - return testbitcast(z, ulong); -} - -fn char[4] test(float x) -{ - return testbitcast(x, char[4]); -} - -fn void main() -{ - float f = 12.353; - int i = testbitcast(f, int); - float f2 = testbitcast(i, float); - printf("%f => %d => %f\n", f, i, f2); - double d = 12.353e267; - ulong l = testbitcast(d, ulong); - double d2 = testbitcast(d, double); - printf("%e => %llu => %e\n", d, l, d2); - -} - -/* #expect: userland_bitcast.ll - -%Foo = type { i16, i8, i8, i16, i16 } - -@"ct$userland_bitcast_Foo" = linkonce constant %.introspect { i8 10, i64 8, i64 0, i64 5, [0 x i64] zeroinitializer }, align 8 -@.str = private unnamed_addr constant [16 x i8] c"%f => %d => %f\0A\00", align 1 -@.str.1 = private unnamed_addr constant [18 x i8] c"%e => %llu => %e\0A\00", align 1 - -define i64 @userland_bitcast_testFoo(i16 signext %0) #0 { -entry: - %z = alloca %Foo, align 2 - %expr = alloca %Foo, align 2 - %x = alloca i64, align 8 - %b = alloca ptr, align 8 - %to = alloca ptr, align 8 - %i = alloca i64, align 8 - %1 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 0 - store i16 0, ptr %1, align 2 - %2 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 1 - store i8 0, ptr %2, align 2 - %3 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 2 - store i8 0, ptr %3, align 1 - %4 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 3 - store i16 0, ptr %4, align 2 - %5 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 4 - store i16 0, ptr %5, align 2 - %6 = getelementptr inbounds %Foo, ptr %z, i32 0, i32 0 - store i16 %0, ptr %6, align 2 - call void @llvm.memcpy.p0.p0.i32(ptr align 2 %expr, ptr align 2 %z, i32 8, i1 false) - store ptr %expr, ptr %b, align 8 - store ptr %x, ptr %to, align 8 - store i64 0, ptr %i, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %7 = load i64, ptr %i, align 8 - %lt = icmp ult i64 %7, 8 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %8 = load ptr, ptr %to, align 8 - %9 = load i64, ptr %i, align 8 - %ptroffset = getelementptr inbounds i16, ptr %8, i64 %9 - %10 = load ptr, ptr %b, align 8 - %11 = load i64, ptr %i, align 8 - %ptroffset1 = getelementptr inbounds i16, ptr %10, i64 %11 - %12 = load i16, ptr %ptroffset1, align 2 - store i16 %12, ptr %ptroffset, align 2 - %13 = load i64, ptr %i, align 8 - %add = add i64 %13, 2 - store i64 %add, ptr %i, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %14 = load i64, ptr %x, align 8 - ret i64 %14 -} - -define i32 @userland_bitcast_test(float %0) #0 { -entry: - %expr = alloca float, align 4 - %x = alloca [4 x i8], align 1 - %b = alloca ptr, align 8 - %to = alloca ptr, align 8 - %i = alloca i64, align 8 - store float %0, ptr %expr, align 4 - store ptr %expr, ptr %b, align 8 - store ptr %x, ptr %to, align 8 - store i64 0, ptr %i, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %1 = load i64, ptr %i, align 8 - %lt = icmp ult i64 %1, 4 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %2 = load ptr, ptr %to, align 8 - %3 = load i64, ptr %i, align 8 - %ptroffset = getelementptr inbounds i8, ptr %2, i64 %3 - %4 = load ptr, ptr %b, align 8 - %5 = load i64, ptr %i, align 8 - %ptroffset1 = getelementptr inbounds i8, ptr %4, i64 %5 - %6 = load i8, ptr %ptroffset1, align 1 - store i8 %6, ptr %ptroffset, align 1 - %7 = load i64, ptr %i, align 8 - %add = add i64 %7, 1 - store i64 %add, ptr %i, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %8 = load i32, ptr %x, align 1 - ret i32 %8 -} - -define void @userland_bitcast_main() #0 { -entry: - %f = alloca float, align 4 - %i = alloca i32, align 4 - %expr = alloca float, align 4 - %x = alloca i32, align 4 - %b = alloca ptr, align 8 - %to = alloca ptr, align 8 - %i1 = alloca i64, align 8 - %f2 = alloca float, align 4 - %expr3 = alloca i32, align 4 - %x4 = alloca float, align 4 - %b5 = alloca ptr, align 8 - %to6 = alloca ptr, align 8 - %i7 = alloca i64, align 8 - %d = alloca double, align 8 - %l = alloca i64, align 8 - %expr16 = alloca double, align 8 - %x17 = alloca i64, align 8 - %b18 = alloca ptr, align 8 - %to19 = alloca ptr, align 8 - %i20 = alloca i64, align 8 - %d2 = alloca double, align 8 - %expr28 = alloca double, align 8 - %x29 = alloca double, align 8 - %b30 = alloca ptr, align 8 - %to31 = alloca ptr, align 8 - %i32 = alloca i64, align 8 - store float 0x4028B4BC60000000, ptr %f, align 4 - %0 = load float, ptr %f, align 4 - store float %0, ptr %expr, align 4 - store ptr %expr, ptr %b, align 8 - store ptr %x, ptr %to, align 8 - store i64 0, ptr %i1, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %1 = load i64, ptr %i1, align 8 - %lt = icmp ult i64 %1, 4 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %2 = load ptr, ptr %to, align 8 - %3 = load i64, ptr %i1, align 8 - %ptroffset = getelementptr inbounds i32, ptr %2, i64 %3 - %4 = load ptr, ptr %b, align 8 - %5 = load i64, ptr %i1, align 8 - %ptroffset2 = getelementptr inbounds i32, ptr %4, i64 %5 - %6 = load i32, ptr %ptroffset2, align 4 - store i32 %6, ptr %ptroffset, align 4 - %7 = load i64, ptr %i1, align 8 - %add = add i64 %7, 4 - store i64 %add, ptr %i1, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %8 = load i32, ptr %x, align 4 - store i32 %8, ptr %i, align 4 - %9 = load i32, ptr %i, align 4 - store i32 %9, ptr %expr3, align 4 - store ptr %expr3, ptr %b5, align 8 - store ptr %x4, ptr %to6, align 8 - store i64 0, ptr %i7, align 8 - br label %loop.cond8 - -loop.cond8: ; preds = %loop.body10, %loop.exit - %10 = load i64, ptr %i7, align 8 - %lt9 = icmp ult i64 %10, 4 - br i1 %lt9, label %loop.body10, label %loop.exit14 - -loop.body10: ; preds = %loop.cond8 - %11 = load ptr, ptr %to6, align 8 - %12 = load i64, ptr %i7, align 8 - %ptroffset11 = getelementptr inbounds i32, ptr %11, i64 %12 - %13 = load ptr, ptr %b5, align 8 - %14 = load i64, ptr %i7, align 8 - %ptroffset12 = getelementptr inbounds i32, ptr %13, i64 %14 - %15 = load i32, ptr %ptroffset12, align 4 - store i32 %15, ptr %ptroffset11, align 4 - %16 = load i64, ptr %i7, align 8 - %add13 = add i64 %16, 4 - store i64 %add13, ptr %i7, align 8 - br label %loop.cond8 - -loop.exit14: ; preds = %loop.cond8 - %17 = load float, ptr %x4, align 4 - store float %17, ptr %f2, align 4 - %18 = load float, ptr %f, align 4 - %fpfpext = fpext float %18 to double - %19 = load i32, ptr %i, align 4 - %20 = load float, ptr %f2, align 4 - %fpfpext15 = fpext float %20 to double - call void (ptr, ...) @printf(ptr @.str, double %fpfpext, i32 %19, double %fpfpext15) - store double 1.235300e+268, ptr %d, align 8 - %21 = load double, ptr %d, align 8 - store double %21, ptr %expr16, align 8 - store ptr %expr16, ptr %b18, align 8 - store ptr %x17, ptr %to19, align 8 - store i64 0, ptr %i20, align 8 - br label %loop.cond21 - -loop.cond21: ; preds = %loop.body23, %loop.exit14 - %22 = load i64, ptr %i20, align 8 - %lt22 = icmp ult i64 %22, 8 - br i1 %lt22, label %loop.body23, label %loop.exit27 - -loop.body23: ; preds = %loop.cond21 - %23 = load ptr, ptr %to19, align 8 - %24 = load i64, ptr %i20, align 8 - %ptroffset24 = getelementptr inbounds i64, ptr %23, i64 %24 - %25 = load ptr, ptr %b18, align 8 - %26 = load i64, ptr %i20, align 8 - %ptroffset25 = getelementptr inbounds i64, ptr %25, i64 %26 - %27 = load i64, ptr %ptroffset25, align 8 - store i64 %27, ptr %ptroffset24, align 8 - %28 = load i64, ptr %i20, align 8 - %add26 = add i64 %28, 8 - store i64 %add26, ptr %i20, align 8 - br label %loop.cond21 - -loop.exit27: ; preds = %loop.cond21 - %29 = load i64, ptr %x17, align 8 - store i64 %29, ptr %l, align 8 - %30 = load double, ptr %d, align 8 - store double %30, ptr %expr28, align 8 - store ptr %expr28, ptr %b30, align 8 - store ptr %x29, ptr %to31, align 8 - store i64 0, ptr %i32, align 8 - br label %loop.cond33 - -loop.cond33: ; preds = %loop.body35, %loop.exit27 - %31 = load i64, ptr %i32, align 8 - %lt34 = icmp ult i64 %31, 8 - br i1 %lt34, label %loop.body35, label %loop.exit39 - -loop.body35: ; preds = %loop.cond33 - %32 = load ptr, ptr %to31, align 8 - %33 = load i64, ptr %i32, align 8 - %ptroffset36 = getelementptr inbounds i64, ptr %32, i64 %33 - %34 = load ptr, ptr %b30, align 8 - %35 = load i64, ptr %i32, align 8 - %ptroffset37 = getelementptr inbounds i64, ptr %34, i64 %35 - %36 = load i64, ptr %ptroffset37, align 8 - store i64 %36, ptr %ptroffset36, align 8 - %37 = load i64, ptr %i32, align 8 - %add38 = add i64 %37, 8 - store i64 %add38, ptr %i32, align 8 - br label %loop.cond33 - -loop.exit39: ; preds = %loop.cond33 - %38 = load double, ptr %x29, align 8 - store double %38, ptr %d2, align 8 - %39 = load double, ptr %d, align 8 - %40 = load i64, ptr %l, align 8 - %41 = load double, ptr %d2, align 8 - call void (ptr, ...) @printf(ptr @.str.1, double %39, i64 %40, double %41) - ret void -} - diff --git a/test/test_suite2/overloading/set_overload.c3t b/test/test_suite2/overloading/set_overload.c3t deleted file mode 100644 index fa73fd475..000000000 --- a/test/test_suite2/overloading/set_overload.c3t +++ /dev/null @@ -1,24 +0,0 @@ -// #target: macos-x64 - -module test; -import std::map; - -define IntMap = HashMap; - -fn void main() -{ - IntMap map; - map.set("Hello", 4); - map["Bye"] = 5; -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %map = alloca %HashMap, align 8 - call void @llvm.memset.p0.i64(ptr align 8 %map, i8 0, i64 40, i1 false) - %0 = call i8 @"std_map$$sa$char.int_HashMap_set"(ptr %map, ptr @.str, i64 5, i32 4) - %1 = call i8 @"std_map$$sa$char.int_HashMap_set"(ptr %map, ptr @.str.1, i64 3, i32 5) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/pointers/array_pointer_decay.c3t b/test/test_suite2/pointers/array_pointer_decay.c3t deleted file mode 100644 index 2cf06ed23..000000000 --- a/test/test_suite2/pointers/array_pointer_decay.c3t +++ /dev/null @@ -1,78 +0,0 @@ -// #target: macos-x64 -module foo; -extern fn void printf(char*, ...); - -fn void main() -{ - int[3] x; - int[3]* y = &x; - int* z = y; - int[] sub = y; - int[3] y1 = y[1]; - int z1 = z[1]; - int* xx = &x + 1; - int[3]* yy = (int[3]*)(xx); - int* zz = yy - 1; - printf("%p = %p = %p, %p = %p\n", y, z, zz, &(*y)[1], xx); - x[1] = 123; - printf("%d = %d\n", x[1], z[1]); -} - - -/* #expect: foo.ll - -define void @foo_main() #0 { -entry: - %x = alloca [3 x i32], align 4 - %y = alloca ptr, align 8 - %z = alloca ptr, align 8 - %sub = alloca %"int[]", align 8 - %y1 = alloca [3 x i32], align 4 - %z1 = alloca i32, align 4 - %xx = alloca ptr, align 8 - %yy = alloca ptr, align 8 - %zz = alloca ptr, align 8 - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 - store i32 0, ptr %0, align 4 - %1 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - store i32 0, ptr %1, align 4 - %2 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 2 - store i32 0, ptr %2, align 4 - store ptr %x, ptr %y, align 8 - %3 = load ptr, ptr %y, align 8 - store ptr %3, ptr %z, align 8 - %4 = load ptr, ptr %y, align 8 - %5 = insertvalue %"int[]" undef, ptr %4, 0 - %6 = insertvalue %"int[]" %5, i64 3, 1 - store %"int[]" %6, ptr %sub, align 8 - %7 = load ptr, ptr %y, align 8 - %ptroffset = getelementptr inbounds [3 x i32], ptr %7, i64 1 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y1, ptr align 4 %ptroffset, i32 12, i1 false) - %8 = load ptr, ptr %z, align 8 - %ptroffset1 = getelementptr inbounds i32, ptr %8, i64 1 - %9 = load i32, ptr %ptroffset1, align 4 - store i32 %9, ptr %z1, align 4 - %ptroffset2 = getelementptr i32, ptr %x, i64 1 - store ptr %ptroffset2, ptr %xx, align 8 - %10 = load ptr, ptr %xx, align 8 - store ptr %10, ptr %yy, align 8 - %11 = load ptr, ptr %yy, align 8 - %ptroffset3 = getelementptr i32, ptr %11, i64 -1 - store ptr %ptroffset3, ptr %zz, align 8 - %12 = load ptr, ptr %y, align 8 - %13 = load ptr, ptr %z, align 8 - %14 = load ptr, ptr %zz, align 8 - %15 = load ptr, ptr %y, align 8 - %16 = getelementptr inbounds [3 x i32], ptr %15, i64 0, i64 1 - %17 = load ptr, ptr %xx, align 8 - call void (ptr, ...) @printf(ptr @.str, ptr %12, ptr %13, ptr %14, ptr %16, ptr %17) - %18 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - store i32 123, ptr %18, align 4 - %19 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - %20 = load i32, ptr %19, align 4 - %21 = load ptr, ptr %z, align 8 - %ptroffset4 = getelementptr inbounds i32, ptr %21, i64 1 - %22 = load i32, ptr %ptroffset4, align 4 - call void (ptr, ...) @printf(ptr @.str.1, i32 %20, i32 %22) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/pointers/pointer_index.c3t b/test/test_suite2/pointers/pointer_index.c3t deleted file mode 100644 index 53d8e973a..000000000 --- a/test/test_suite2/pointers/pointer_index.c3t +++ /dev/null @@ -1,78 +0,0 @@ -module pointer_index; - -fn void test1(int* x) -{ - int a = x[0]; - int b = *x; - int c = x[1]; - int d = x[-1]; -} - -fn void test2(char* x) -{ - char a = x[0]; - char b = *x; - char c = x[1]; -} - -fn void test3(long* x) -{ - long a = x[0]; - long b = *x; - long c = x[1]; -} - -// #expect: pointer_index.ll - -define void @pointer_index_test1(ptr %0) #0 { -entry: - %a = alloca i32, align 4 - %b = alloca i32, align 4 - %c = alloca i32, align 4 - %d = alloca i32, align 4 - %ptroffset = getelementptr inbounds i32, ptr %0, i64 0 - %1 = load i32, ptr %ptroffset, align 4 - store i32 %1, ptr %a, align 4 - %2 = load i32, ptr %0, align 8 - store i32 %2, ptr %b, align 4 - %ptroffset1 = getelementptr inbounds i32, ptr %0, i64 1 - %3 = load i32, ptr %ptroffset1, align 4 - store i32 %3, ptr %c, align 4 - %ptroffset2 = getelementptr inbounds i32, ptr %0, i64 -1 - %4 = load i32, ptr %ptroffset2, align 4 - store i32 %4, ptr %d, align 4 - ret void -} - -; Function Attrs: nounwind -define void @pointer_index_test2(ptr %0) #0 { -entry: - %a = alloca i8, align 1 - %b = alloca i8, align 1 - %c = alloca i8, align 1 - %ptroffset = getelementptr inbounds i8, ptr %0, i64 0 - %1 = load i8, ptr %ptroffset, align 1 - store i8 %1, ptr %a, align 1 - %2 = load i8, ptr %0, align 8 - store i8 %2, ptr %b, align 1 - %ptroffset1 = getelementptr inbounds i8, ptr %0, i64 1 - %3 = load i8, ptr %ptroffset1, align 1 - store i8 %3, ptr %c, align 1 - ret void -} - -define void @pointer_index_test3(ptr %0) #0 { -entry: - %a = alloca i64, align 8 - %b = alloca i64, align 8 - %c = alloca i64, align 8 - %ptroffset = getelementptr inbounds i64, ptr %0, i64 0 - %1 = load i64, ptr %ptroffset, align 8 - store i64 %1, ptr %a, align 8 - %2 = load i64, ptr %0, align 8 - store i64 %2, ptr %b, align 8 - %ptroffset1 = getelementptr inbounds i64, ptr %0, i64 1 - %3 = load i64, ptr %ptroffset1, align 8 - store i64 %3, ptr %c, align 8 - ret void -} diff --git a/test/test_suite2/pointers/subarray_variant_to_ptr.c3t b/test/test_suite2/pointers/subarray_variant_to_ptr.c3t deleted file mode 100644 index 198403bd9..000000000 --- a/test/test_suite2/pointers/subarray_variant_to_ptr.c3t +++ /dev/null @@ -1,88 +0,0 @@ -// #target: macos-x64 -module foo; - -extern fn void printf(char*, ...); - -fn void test1(variant z) -{ - int* w = z.ptr; - printf("%d\n", *w); -} - -fn void test2(int[] z) -{ - int* w = z.ptr; - printf("%d\n", *w); -} - -fn void main() -{ - int x = 123; - int y = 293483; - int[2] w = { 144, 772 }; - test1(&x); - test2(w[..]); -} - -/* #expect: foo.ll - -%variant = type { ptr, i64 } -%"int[]" = type { ptr, i64 } - -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - -define void @foo_test1(i64 %0, ptr %1) #0 { -entry: - %z = alloca %variant, align 8 - %w = alloca ptr, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 1 - store ptr %1, ptr %3, align 8 - %4 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - store ptr %5, ptr %w, align 8 - %6 = load ptr, ptr %w, align 8 - %7 = load i32, ptr %6, align 8 - call void (ptr, ...) @printf(ptr @.str, i32 %7) - ret void -} - -define void @foo_test2(ptr %0, i64 %1) #0 { -entry: - %z = alloca %"int[]", align 8 - %w = alloca ptr, align 8 - %2 = getelementptr inbounds { ptr, i64 }, ptr %z, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %z, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - %4 = getelementptr inbounds %"int[]", ptr %z, i32 0, i32 0 - %5 = load ptr, ptr %4, align 8 - store ptr %5, ptr %w, align 8 - %6 = load ptr, ptr %w, align 8 - %7 = load i32, ptr %6, align 8 - call void (ptr, ...) @printf(ptr @.str.1, i32 %7) - ret void -} - -define void @foo_main() #0 { -entry: - %x = alloca i32, align 4 - %y = alloca i32, align 4 - %w = alloca [2 x i32], align 4 - %taddr = alloca %variant, align 8 - store i32 123, ptr %x, align 4 - store i32 293483, ptr %y, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %w, ptr align 4 @.__const, i32 8, i1 false) - %0 = insertvalue %variant undef, ptr %x, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %1, ptr %taddr, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %taddr, i32 0, i32 0 - %lo = load i64, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %taddr, i32 0, i32 1 - %hi = load ptr, ptr %3, align 8 - call void @foo_test1(i64 %lo, ptr %hi) - %4 = getelementptr inbounds [2 x i32], ptr %w, i64 0, i64 0 - call void @foo_test2(ptr %4, i64 2) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/safe/deref.c3t b/test/test_suite2/safe/deref.c3t deleted file mode 100644 index 2760e9973..000000000 --- a/test/test_suite2/safe/deref.c3t +++ /dev/null @@ -1,32 +0,0 @@ -// #safe: yes -// #target: macos-x64 -module foo; - -fn void main() -{ - int* x; - int y = *x; -} - -/* #expect: foo.ll - -define void @foo_main() #0 { -entry: - %x = alloca ptr, align 8 - %y = alloca i32, align 4 - store ptr null, ptr %x, align 8 - %0 = load ptr, ptr %x, align 8 - %checknull = icmp eq ptr %0, null - br i1 %checknull, label %panic, label %checkok - -panic: ; preds = %entry - %1 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %1(ptr @.panic_msg, i64 27, ptr @.file, i64 8, ptr @.func, i64 4, i32 6) - br label %checkok - -checkok: ; preds = %panic, %entry - %2 = load i32, ptr %0, align 8 - store i32 %2, ptr %y, align 4 - ret void -} - diff --git a/test/test_suite2/slices/slice_assign.c3t b/test/test_suite2/slices/slice_assign.c3t deleted file mode 100644 index 13df9b6f6..000000000 --- a/test/test_suite2/slices/slice_assign.c3t +++ /dev/null @@ -1,89 +0,0 @@ -// #target: macos-x64 -module test; - -extern fn void printf(char*, ...); - -fn void main() -{ - int[8] x; - x[0..1] = 3; - x[1..2] = 5; - x[5..7] = 52; - foreach (i : x) - { - printf("%d\n", i); - } - x[0..7] = 123; -} - -/* #expect: test.ll - -@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 - -; Function Attrs: nounwind -declare void @printf(ptr, ...) #0 - -define void @test_main() #0 { -entry: - %x = alloca [8 x i32], align 16 - %.anon = alloca i64, align 8 - %i = alloca i32, align 4 - call void @llvm.memset.p0.i64(ptr align 16 %x, i8 0, i64 32, i1 false) - %0 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 0 - store i32 3, ptr %0, align 4 - %1 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 1 - store i32 3, ptr %1, align 4 - %2 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 1 - store i32 5, ptr %2, align 4 - %3 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 2 - store i32 5, ptr %3, align 4 - %4 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 5 - store i32 52, ptr %4, align 4 - %5 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 6 - store i32 52, ptr %5, align 4 - %6 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 7 - store i32 52, ptr %6, align 4 - store i64 0, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %7 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 8, %7 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %8 = load i64, ptr %.anon, align 8 - %9 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 %8 - %10 = load i32, ptr %9, align 4 - store i32 %10, ptr %i, align 4 - %11 = load i32, ptr %i, align 4 - call void (ptr, ...) @printf(ptr @.str, i32 %11) - %12 = load i64, ptr %.anon, align 8 - %add = add i64 %12, 1 - store i64 %add, ptr %.anon, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - br label %cond - -cond: ; preds = %assign, %loop.exit - %13 = phi i64 [ 0, %loop.exit ], [ %add1, %assign ] - %lt = icmp slt i64 %13, 8 - br i1 %lt, label %assign, label %exit - -assign: ; preds = %cond - %14 = getelementptr inbounds [8 x i32], ptr %x, i64 0, i64 %13 - store i32 123, ptr %14, align 4 - %add1 = add i64 %13, 1 - br label %cond - -exit: ; preds = %cond - ret void -} - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @test_main() - ret i32 0 -} diff --git a/test/test_suite2/slices/slice_to_slice_assign.c3t b/test/test_suite2/slices/slice_to_slice_assign.c3t deleted file mode 100644 index e293a4ae9..000000000 --- a/test/test_suite2/slices/slice_to_slice_assign.c3t +++ /dev/null @@ -1,185 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fn void main() -{ - int[*] z = { 1, 2, 3, 4, 5, 6, 7 }; - int[6] y; - y[1..3] = z[3..5]; - io::printfln("%s %s", y, z); - y[4..] = z[5..6]; - io::printfln("%s %s", y, z); - int[][] a = { int[] { 1 } }; - int[][] b = { int[] { 2 } }; - io::printfln("%s", a); - a[0..0] = b[0..0]; - io::printfln("%s", a); - a[0..0] = y[2..4]; - io::printfln("%s", a); -} -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %z = alloca [7 x i32], align 16 - %y = alloca [6 x i32], align 16 - %taddr = alloca %"int[]", align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [2 x %variant], align 16 - %taddr1 = alloca %"int[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [2 x %variant], align 16 - %a = alloca %"int[][]", align 8 - %literal = alloca [1 x %"int[]"], align 16 - %literal7 = alloca [1 x i32], align 4 - %b = alloca %"int[][]", align 8 - %literal8 = alloca [1 x %"int[]"], align 16 - %literal9 = alloca [1 x i32], align 4 - %retparam10 = alloca i64, align 8 - %varargslots11 = alloca [1 x %variant], align 16 - %taddr16 = alloca %"int[][]", align 8 - %retparam17 = alloca i64, align 8 - %varargslots18 = alloca [1 x %variant], align 16 - %retparam23 = alloca i64, align 8 - %varargslots24 = alloca [1 x %variant], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %z, ptr align 16 @.__const, i32 28, i1 false) - call void @llvm.memset.p0.i64(ptr align 16 %y, i8 0, i64 24, i1 false) - %0 = getelementptr inbounds [7 x i32], ptr %z, i64 0, i64 3 - %1 = insertvalue %"int[]" undef, ptr %0, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - %3 = getelementptr inbounds [6 x i32], ptr %y, i64 0, i64 1 - %4 = insertvalue %"int[]" undef, ptr %3, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - %6 = extractvalue %"int[]" %5, 0 - %7 = extractvalue %"int[]" %2, 0 - store %"int[]" %2, ptr %taddr, align 8 - %8 = getelementptr inbounds %"int[]", ptr %taddr, i32 0, i32 1 - %9 = load i64, ptr %8, align 8 - %10 = mul i64 %9, 4 - call void @llvm.memcpy.p0.p0.i64(ptr align 4 %6, ptr align 4 %7, i64 %10, i1 false) - %11 = insertvalue %variant undef, ptr %y, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$a6$int" to i64), 1 - %13 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %12, ptr %13, align 16 - %14 = insertvalue %variant undef, ptr %z, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$a7$int" to i64), 1 - %16 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %15, ptr %16, align 16 - %17 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 5, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %17, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %18 = getelementptr inbounds [7 x i32], ptr %z, i64 0, i64 5 - %19 = insertvalue %"int[]" undef, ptr %18, 0 - %20 = insertvalue %"int[]" %19, i64 2, 1 - %21 = getelementptr inbounds [6 x i32], ptr %y, i64 0, i64 4 - %22 = insertvalue %"int[]" undef, ptr %21, 0 - %23 = insertvalue %"int[]" %22, i64 2, 1 - %24 = extractvalue %"int[]" %23, 0 - %25 = extractvalue %"int[]" %20, 0 - store %"int[]" %20, ptr %taddr1, align 8 - %26 = getelementptr inbounds %"int[]", ptr %taddr1, i32 0, i32 1 - %27 = load i64, ptr %26, align 8 - %28 = mul i64 %27, 4 - call void @llvm.memcpy.p0.p0.i64(ptr align 4 %24, ptr align 4 %25, i64 %28, i1 false) - %29 = insertvalue %variant undef, ptr %y, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$a6$int" to i64), 1 - %31 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 0 - store %variant %30, ptr %31, align 16 - %32 = insertvalue %variant undef, ptr %z, 0 - %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$a7$int" to i64), 1 - %34 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 1 - store %variant %33, ptr %34, align 16 - %35 = call i64 @std_io_printfln(ptr %retparam2, ptr @.str.1, i64 5, ptr %varargslots3, i64 2) - %not_err4 = icmp eq i64 %35, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %voiderr - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %voiderr - %36 = getelementptr inbounds [1 x %"int[]"], ptr %literal, i64 0, i64 0 - %37 = getelementptr inbounds [1 x i32], ptr %literal7, i64 0, i64 0 - store i32 1, ptr %37, align 4 - %38 = insertvalue %"int[]" undef, ptr %literal7, 0 - %39 = insertvalue %"int[]" %38, i64 1, 1 - store %"int[]" %39, ptr %36, align 8 - %40 = insertvalue %"int[][]" undef, ptr %literal, 0 - %41 = insertvalue %"int[][]" %40, i64 1, 1 - store %"int[][]" %41, ptr %a, align 8 - %42 = getelementptr inbounds [1 x %"int[]"], ptr %literal8, i64 0, i64 0 - %43 = getelementptr inbounds [1 x i32], ptr %literal9, i64 0, i64 0 - store i32 2, ptr %43, align 4 - %44 = insertvalue %"int[]" undef, ptr %literal9, 0 - %45 = insertvalue %"int[]" %44, i64 1, 1 - store %"int[]" %45, ptr %42, align 8 - %46 = insertvalue %"int[][]" undef, ptr %literal8, 0 - %47 = insertvalue %"int[][]" %46, i64 1, 1 - store %"int[][]" %47, ptr %b, align 8 - %48 = insertvalue %variant undef, ptr %a, 0 - %49 = insertvalue %variant %48, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 - %50 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 - store %variant %49, ptr %50, align 16 - %51 = call i64 @std_io_printfln(ptr %retparam10, ptr @.str.2, i64 2, ptr %varargslots11, i64 1) - %not_err12 = icmp eq i64 %51, 0 - br i1 %not_err12, label %after_check13, label %voiderr14 - -after_check13: ; preds = %voiderr6 - br label %voiderr14 - -voiderr14: ; preds = %after_check13, %voiderr6 - %52 = load %"int[][]", ptr %b, align 8 - %53 = extractvalue %"int[][]" %52, 0 - %ptroffset = getelementptr inbounds %"int[]", ptr %53, i64 0 - %54 = insertvalue %"int[][]" undef, ptr %ptroffset, 0 - %55 = insertvalue %"int[][]" %54, i64 1, 1 - %56 = load %"int[][]", ptr %a, align 8 - %57 = extractvalue %"int[][]" %56, 0 - %ptroffset15 = getelementptr inbounds %"int[]", ptr %57, i64 0 - %58 = insertvalue %"int[][]" undef, ptr %ptroffset15, 0 - %59 = insertvalue %"int[][]" %58, i64 1, 1 - %60 = extractvalue %"int[][]" %59, 0 - %61 = extractvalue %"int[][]" %55, 0 - store %"int[][]" %55, ptr %taddr16, align 8 - %62 = getelementptr inbounds %"int[][]", ptr %taddr16, i32 0, i32 1 - %63 = load i64, ptr %62, align 8 - %64 = mul i64 %63, 16 - call void @llvm.memcpy.p0.p0.i64(ptr align 8 %60, ptr align 8 %61, i64 %64, i1 false) - %65 = insertvalue %variant undef, ptr %a, 0 - %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 - %67 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 - store %variant %66, ptr %67, align 16 - %68 = call i64 @std_io_printfln(ptr %retparam17, ptr @.str.3, i64 2, ptr %varargslots18, i64 1) - %not_err19 = icmp eq i64 %68, 0 - br i1 %not_err19, label %after_check20, label %voiderr21 - -after_check20: ; preds = %voiderr14 - br label %voiderr21 - -voiderr21: ; preds = %after_check20, %voiderr14 - %69 = getelementptr inbounds [6 x i32], ptr %y, i64 0, i64 2 - %70 = insertvalue %"int[]" undef, ptr %69, 0 - %71 = insertvalue %"int[]" %70, i64 3, 1 - %72 = load %"int[][]", ptr %a, align 8 - %73 = extractvalue %"int[][]" %72, 0 - %ptroffset22 = getelementptr inbounds %"int[]", ptr %73, i64 0 - store %"int[]" %71, ptr %ptroffset22, align 8 - %74 = insertvalue %variant undef, ptr %a, 0 - %75 = insertvalue %variant %74, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 - %76 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 - store %variant %75, ptr %76, align 16 - %77 = call i64 @std_io_printfln(ptr %retparam23, ptr @.str.4, i64 2, ptr %varargslots24, i64 1) - %not_err25 = icmp eq i64 %77, 0 - br i1 %not_err25, label %after_check26, label %voiderr27 - -after_check26: ; preds = %voiderr21 - br label %voiderr27 - -voiderr27: ; preds = %after_check26, %voiderr21 - ret void -} diff --git a/test/test_suite2/slices/slice_to_slice_vector_assign.c3t b/test/test_suite2/slices/slice_to_slice_vector_assign.c3t deleted file mode 100644 index f3ab3c36d..000000000 --- a/test/test_suite2/slices/slice_to_slice_vector_assign.c3t +++ /dev/null @@ -1,186 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; - -fn void main() -{ - int[<*>] z = { 1, 2, 3, 4, 5, 6, 7 }; - int[<6>] y; - y[1..3] = z[3..5]; - io::printfln("%s %s", y, z); - y[4..] = z[5..6]; - io::printfln("%s %s", y, z); - int[][] a = { int[] { 1 } }; - int[][] b = { int[] { 2 } }; - io::printfln("%s", a); - a[0..0] = b[0..0]; - io::printfln("%s", a); - a[0..0] = y[2..4]; - io::printfln("%s", a); -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %z = alloca <7 x i32>, align 32 - %y = alloca <6 x i32>, align 32 - %taddr = alloca %"int[]", align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [2 x %variant], align 16 - %taddr1 = alloca %"int[]", align 8 - %retparam2 = alloca i64, align 8 - %varargslots3 = alloca [2 x %variant], align 16 - %a = alloca %"int[][]", align 8 - %literal = alloca [1 x %"int[]"], align 16 - %literal7 = alloca [1 x i32], align 4 - %b = alloca %"int[][]", align 8 - %literal8 = alloca [1 x %"int[]"], align 16 - %literal9 = alloca [1 x i32], align 4 - %retparam10 = alloca i64, align 8 - %varargslots11 = alloca [1 x %variant], align 16 - %taddr16 = alloca %"int[][]", align 8 - %retparam17 = alloca i64, align 8 - %varargslots18 = alloca [1 x %variant], align 16 - %retparam23 = alloca i64, align 8 - %varargslots24 = alloca [1 x %variant], align 16 - store <7 x i32> , ptr %z, align 32 - store <6 x i32> zeroinitializer, ptr %y, align 32 - %0 = getelementptr inbounds <7 x i32>, ptr %z, i64 0, i64 3 - %1 = insertvalue %"int[]" undef, ptr %0, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - %3 = getelementptr inbounds <6 x i32>, ptr %y, i64 0, i64 1 - %4 = insertvalue %"int[]" undef, ptr %3, 0 - %5 = insertvalue %"int[]" %4, i64 3, 1 - %6 = extractvalue %"int[]" %5, 0 - %7 = extractvalue %"int[]" %2, 0 - store %"int[]" %2, ptr %taddr, align 8 - %8 = getelementptr inbounds %"int[]", ptr %taddr, i32 0, i32 1 - %9 = load i64, ptr %8, align 8 - %10 = mul i64 %9, 4 - call void @llvm.memcpy.p0.p0.i64(ptr align 4 %6, ptr align 4 %7, i64 %10, i1 false) - %11 = insertvalue %variant undef, ptr %y, 0 - %12 = insertvalue %variant %11, i64 ptrtoint (ptr @"ct$v6$int" to i64), 1 - %13 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %12, ptr %13, align 16 - %14 = insertvalue %variant undef, ptr %z, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$v7$int" to i64), 1 - %16 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %15, ptr %16, align 16 - %17 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 5, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %17, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %18 = getelementptr inbounds <7 x i32>, ptr %z, i64 0, i64 5 - %19 = insertvalue %"int[]" undef, ptr %18, 0 - %20 = insertvalue %"int[]" %19, i64 2, 1 - %21 = getelementptr inbounds <6 x i32>, ptr %y, i64 0, i64 4 - %22 = insertvalue %"int[]" undef, ptr %21, 0 - %23 = insertvalue %"int[]" %22, i64 2, 1 - %24 = extractvalue %"int[]" %23, 0 - %25 = extractvalue %"int[]" %20, 0 - store %"int[]" %20, ptr %taddr1, align 8 - %26 = getelementptr inbounds %"int[]", ptr %taddr1, i32 0, i32 1 - %27 = load i64, ptr %26, align 8 - %28 = mul i64 %27, 4 - call void @llvm.memcpy.p0.p0.i64(ptr align 4 %24, ptr align 4 %25, i64 %28, i1 false) - %29 = insertvalue %variant undef, ptr %y, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$v6$int" to i64), 1 - %31 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 0 - store %variant %30, ptr %31, align 16 - %32 = insertvalue %variant undef, ptr %z, 0 - %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$v7$int" to i64), 1 - %34 = getelementptr inbounds [2 x %variant], ptr %varargslots3, i64 0, i64 1 - store %variant %33, ptr %34, align 16 - %35 = call i64 @std_io_printfln(ptr %retparam2, ptr @.str.1, i64 5, ptr %varargslots3, i64 2) - %not_err4 = icmp eq i64 %35, 0 - br i1 %not_err4, label %after_check5, label %voiderr6 - -after_check5: ; preds = %voiderr - br label %voiderr6 - -voiderr6: ; preds = %after_check5, %voiderr - %36 = getelementptr inbounds [1 x %"int[]"], ptr %literal, i64 0, i64 0 - %37 = getelementptr inbounds [1 x i32], ptr %literal7, i64 0, i64 0 - store i32 1, ptr %37, align 4 - %38 = insertvalue %"int[]" undef, ptr %literal7, 0 - %39 = insertvalue %"int[]" %38, i64 1, 1 - store %"int[]" %39, ptr %36, align 8 - %40 = insertvalue %"int[][]" undef, ptr %literal, 0 - %41 = insertvalue %"int[][]" %40, i64 1, 1 - store %"int[][]" %41, ptr %a, align 8 - %42 = getelementptr inbounds [1 x %"int[]"], ptr %literal8, i64 0, i64 0 - %43 = getelementptr inbounds [1 x i32], ptr %literal9, i64 0, i64 0 - store i32 2, ptr %43, align 4 - %44 = insertvalue %"int[]" undef, ptr %literal9, 0 - %45 = insertvalue %"int[]" %44, i64 1, 1 - store %"int[]" %45, ptr %42, align 8 - %46 = insertvalue %"int[][]" undef, ptr %literal8, 0 - %47 = insertvalue %"int[][]" %46, i64 1, 1 - store %"int[][]" %47, ptr %b, align 8 - %48 = insertvalue %variant undef, ptr %a, 0 - %49 = insertvalue %variant %48, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 - %50 = getelementptr inbounds [1 x %variant], ptr %varargslots11, i64 0, i64 0 - store %variant %49, ptr %50, align 16 - %51 = call i64 @std_io_printfln(ptr %retparam10, ptr @.str.2, i64 2, ptr %varargslots11, i64 1) - %not_err12 = icmp eq i64 %51, 0 - br i1 %not_err12, label %after_check13, label %voiderr14 - -after_check13: ; preds = %voiderr6 - br label %voiderr14 - -voiderr14: ; preds = %after_check13, %voiderr6 - %52 = load %"int[][]", ptr %b, align 8 - %53 = extractvalue %"int[][]" %52, 0 - %ptroffset = getelementptr inbounds %"int[]", ptr %53, i64 0 - %54 = insertvalue %"int[][]" undef, ptr %ptroffset, 0 - %55 = insertvalue %"int[][]" %54, i64 1, 1 - %56 = load %"int[][]", ptr %a, align 8 - %57 = extractvalue %"int[][]" %56, 0 - %ptroffset15 = getelementptr inbounds %"int[]", ptr %57, i64 0 - %58 = insertvalue %"int[][]" undef, ptr %ptroffset15, 0 - %59 = insertvalue %"int[][]" %58, i64 1, 1 - %60 = extractvalue %"int[][]" %59, 0 - %61 = extractvalue %"int[][]" %55, 0 - store %"int[][]" %55, ptr %taddr16, align 8 - %62 = getelementptr inbounds %"int[][]", ptr %taddr16, i32 0, i32 1 - %63 = load i64, ptr %62, align 8 - %64 = mul i64 %63, 16 - call void @llvm.memcpy.p0.p0.i64(ptr align 8 %60, ptr align 8 %61, i64 %64, i1 false) - %65 = insertvalue %variant undef, ptr %a, 0 - %66 = insertvalue %variant %65, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 - %67 = getelementptr inbounds [1 x %variant], ptr %varargslots18, i64 0, i64 0 - store %variant %66, ptr %67, align 16 - %68 = call i64 @std_io_printfln(ptr %retparam17, ptr @.str.3, i64 2, ptr %varargslots18, i64 1) - %not_err19 = icmp eq i64 %68, 0 - br i1 %not_err19, label %after_check20, label %voiderr21 - -after_check20: ; preds = %voiderr14 - br label %voiderr21 - -voiderr21: ; preds = %after_check20, %voiderr14 - %69 = getelementptr inbounds <6 x i32>, ptr %y, i64 0, i64 2 - %70 = insertvalue %"int[]" undef, ptr %69, 0 - %71 = insertvalue %"int[]" %70, i64 3, 1 - %72 = load %"int[][]", ptr %a, align 8 - %73 = extractvalue %"int[][]" %72, 0 - %ptroffset22 = getelementptr inbounds %"int[]", ptr %73, i64 0 - store %"int[]" %71, ptr %ptroffset22, align 8 - %74 = insertvalue %variant undef, ptr %a, 0 - %75 = insertvalue %variant %74, i64 ptrtoint (ptr @"ct$sa$sa$int" to i64), 1 - %76 = getelementptr inbounds [1 x %variant], ptr %varargslots24, i64 0, i64 0 - store %variant %75, ptr %76, align 16 - %77 = call i64 @std_io_printfln(ptr %retparam23, ptr @.str.4, i64 2, ptr %varargslots24, i64 1) - %not_err25 = icmp eq i64 %77, 0 - br i1 %not_err25, label %after_check26, label %voiderr27 - -after_check26: ; preds = %voiderr21 - br label %voiderr27 - -voiderr27: ; preds = %after_check26, %voiderr21 - ret void -} diff --git a/test/test_suite2/statements/custom_foreach_with_ref.c3t b/test/test_suite2/statements/custom_foreach_with_ref.c3t deleted file mode 100644 index 965410748..000000000 --- a/test/test_suite2/statements/custom_foreach_with_ref.c3t +++ /dev/null @@ -1,477 +0,0 @@ -// #target: macos-x64 -module foo; - -struct Foo -{ - int[3] a; -} - -extern fn void printf(char*, ...); - -macro int* Foo.@operator_element_at_ref(Foo &f, int a) @operator(&[]) -{ - return &f.a[a]; -} - -macro int Foo.@operator_len(Foo &f) @operator(len) -{ - return 3; -} - -macro int Foo.@operator_element_at(Foo &f, int a) @operator([]) -{ - return f.a[a]; -} - -fn int[5] getFields() -{ - printf("getFields\n"); - return int[5] { 3, 5, 2, 10, 111}; -} -fn Foo *call(Foo *f) -{ - printf("Call made\n"); - return f; -} -fn void main() -{ - Foo x = { { 1, 5, 7} }; - printf("%d %d %d\n", x[0], x[1], x[2]); - foreach (i, int y : *call(&x)) - { - printf("Hello %d: %d\n", i, y); - } - foreach (i, int* &y : x) - { - *y += 1; - printf("Hello %d: %d\n", i, *y); - } - foreach (i, int y : x) - { - printf("After one %d: %d\n", i, y); - } - - foreach (i, int y : &x) - { - printf("By pointer %d: %d\n", i, y); - } - - foreach (i, int y : x) - { - printf("Adding %d: %d\n", i, y); - i++; - } - - foreach(i, y : int[5] { 1, 2, 10, 111, 123 } ) - { - printf("Adding %d: %d\n", i, y); - i++; - } - foreach(i, y : getFields() ) - { - printf("Pull value %d: %d\n", i, y); - } - foreach(i, y : &&getFields()) - { - printf("Pull value tempptr %d: %d\n", i, y); - } - printf("%d %d\n", x[0], x[1]); - int* y = &x[1]; - *y += 1; - printf("%d %d\n", x[0], x[1]); -} - -/* #expect: foo.ll - -%Foo = type { [3 x i32] } - -@"ct$foo_Foo" = linkonce constant %.introspect { i8 10, i64 12, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@.str = private unnamed_addr constant [11 x i8] c"getFields\0A\00", align 1 -@.str.1 = private unnamed_addr constant [11 x i8] c"Call made\0A\00", align 1 -@.__const = private unnamed_addr constant %Foo { [3 x i32] [i32 1, i32 5, i32 7] }, align 4 -@.str.2 = private unnamed_addr constant [10 x i8] c"%d %d %d\0A\00", align 1 -@.str.3 = private unnamed_addr constant [14 x i8] c"Hello %d: %d\0A\00", align 1 -@.str.4 = private unnamed_addr constant [14 x i8] c"Hello %d: %d\0A\00", align 1 -@.str.5 = private unnamed_addr constant [18 x i8] c"After one %d: %d\0A\00", align 1 -@.str.6 = private unnamed_addr constant [19 x i8] c"By pointer %d: %d\0A\00", align 1 -@.str.7 = private unnamed_addr constant [15 x i8] c"Adding %d: %d\0A\00", align 1 -@.__const.8 = private unnamed_addr constant [5 x i32] [i32 1, i32 2, i32 10, i32 111, i32 123], align 16 -@.str.9 = private unnamed_addr constant [15 x i8] c"Adding %d: %d\0A\00", align 1 -@.str.10 = private unnamed_addr constant [19 x i8] c"Pull value %d: %d\0A\00", align 1 -@.str.11 = private unnamed_addr constant [27 x i8] c"Pull value tempptr %d: %d\0A\00", align 1 -@.str.12 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 -@.str.13 = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1 - -define void @foo_getFields(ptr noalias sret([5 x i32]) align 4 %0) #0 { -entry: - %literal = alloca [5 x i32], align 16 - call void (ptr, ...) @printf(ptr @.str) - %1 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 0 - store i32 3, ptr %1, align 4 - %2 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 1 - store i32 5, ptr %2, align 4 - %3 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 2 - store i32 2, ptr %3, align 4 - %4 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 3 - store i32 10, ptr %4, align 4 - %5 = getelementptr inbounds [5 x i32], ptr %literal, i64 0, i64 4 - store i32 111, ptr %5, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %0, ptr align 4 %literal, i32 20, i1 false) - ret void -} - -define ptr @foo_call(ptr %0) #0 { -entry: - call void (ptr, ...) @printf(ptr @.str.1) - ret ptr %0 -} - -define void @foo_main() #0 { -entry: - %x = alloca %Foo, align 4 - %a = alloca i32, align 4 - %a1 = alloca i32, align 4 - %a3 = alloca i32, align 4 - %.anon = alloca ptr, align 8 - %.anon5 = alloca i32, align 4 - %.anon6 = alloca i32, align 4 - %i = alloca i32, align 4 - %y = alloca i32, align 4 - %a7 = alloca i32, align 4 - %.anon9 = alloca i32, align 4 - %.anon10 = alloca i32, align 4 - %i14 = alloca i32, align 4 - %y15 = alloca ptr, align 8 - %a16 = alloca i32, align 4 - %.anon21 = alloca i32, align 4 - %.anon22 = alloca i32, align 4 - %i26 = alloca i32, align 4 - %y27 = alloca i32, align 4 - %a28 = alloca i32, align 4 - %.anon32 = alloca i32, align 4 - %.anon33 = alloca i32, align 4 - %i37 = alloca i32, align 4 - %y38 = alloca i32, align 4 - %a39 = alloca i32, align 4 - %.anon43 = alloca i32, align 4 - %.anon44 = alloca i32, align 4 - %i48 = alloca i32, align 4 - %y49 = alloca i32, align 4 - %a50 = alloca i32, align 4 - %.anon55 = alloca [5 x i32], align 16 - %.anon56 = alloca i64, align 8 - %i59 = alloca i64, align 8 - %y60 = alloca i32, align 4 - %.anon64 = alloca [5 x i32], align 16 - %.anon65 = alloca i64, align 8 - %i69 = alloca i64, align 8 - %y70 = alloca i32, align 4 - %.anon73 = alloca ptr, align 8 - %sretparam = alloca [5 x i32], align 4 - %.anon74 = alloca i64, align 8 - %i78 = alloca i64, align 8 - %y79 = alloca i32, align 4 - %a82 = alloca i32, align 4 - %a84 = alloca i32, align 4 - %y86 = alloca ptr, align 8 - %a87 = alloca i32, align 4 - %a90 = alloca i32, align 4 - %a92 = alloca i32, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - store i32 0, ptr %a, align 4 - %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %1 = load i32, ptr %a, align 4 - %sisiext = sext i32 %1 to i64 - %2 = getelementptr inbounds [3 x i32], ptr %0, i64 0, i64 %sisiext - %3 = load i32, ptr %2, align 4 - store i32 1, ptr %a1, align 4 - %4 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %5 = load i32, ptr %a1, align 4 - %sisiext2 = sext i32 %5 to i64 - %6 = getelementptr inbounds [3 x i32], ptr %4, i64 0, i64 %sisiext2 - %7 = load i32, ptr %6, align 4 - store i32 2, ptr %a3, align 4 - %8 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %9 = load i32, ptr %a3, align 4 - %sisiext4 = sext i32 %9 to i64 - %10 = getelementptr inbounds [3 x i32], ptr %8, i64 0, i64 %sisiext4 - %11 = load i32, ptr %10, align 4 - call void (ptr, ...) @printf(ptr @.str.2, i32 %3, i32 %7, i32 %11) - %12 = call ptr @foo_call(ptr %x) - store ptr %12, ptr %.anon, align 8 - store i32 3, ptr %.anon5, align 4 - store i32 0, ptr %.anon6, align 4 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %13 = load i32, ptr %.anon6, align 4 - %14 = load i32, ptr %.anon5, align 4 - %lt = icmp slt i32 %13, %14 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %15 = load i32, ptr %.anon6, align 4 - store i32 %15, ptr %i, align 4 - %16 = load ptr, ptr %.anon, align 8 - %17 = load i32, ptr %.anon6, align 4 - store i32 %17, ptr %a7, align 4 - %18 = getelementptr inbounds %Foo, ptr %16, i32 0, i32 0 - %19 = load i32, ptr %a7, align 4 - %sisiext8 = sext i32 %19 to i64 - %20 = getelementptr inbounds [3 x i32], ptr %18, i64 0, i64 %sisiext8 - %21 = load i32, ptr %20, align 4 - store i32 %21, ptr %y, align 4 - %22 = load i32, ptr %i, align 4 - %23 = load i32, ptr %y, align 4 - call void (ptr, ...) @printf(ptr @.str.3, i32 %22, i32 %23) - %24 = load i32, ptr %.anon6, align 4 - %add = add i32 %24, 1 - store i32 %add, ptr %.anon6, align 4 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - store i32 3, ptr %.anon9, align 4 - store i32 0, ptr %.anon10, align 4 - br label %loop.cond11 - -loop.cond11: ; preds = %loop.body13, %loop.exit - %25 = load i32, ptr %.anon10, align 4 - %26 = load i32, ptr %.anon9, align 4 - %lt12 = icmp slt i32 %25, %26 - br i1 %lt12, label %loop.body13, label %loop.exit20 - -loop.body13: ; preds = %loop.cond11 - %27 = load i32, ptr %.anon10, align 4 - store i32 %27, ptr %i14, align 4 - %28 = load i32, ptr %.anon10, align 4 - store i32 %28, ptr %a16, align 4 - %29 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %30 = load i32, ptr %a16, align 4 - %sisiext17 = sext i32 %30 to i64 - %31 = getelementptr inbounds [3 x i32], ptr %29, i64 0, i64 %sisiext17 - store ptr %31, ptr %y15, align 8 - %32 = load ptr, ptr %y15, align 8 - %33 = load i32, ptr %32, align 8 - %add18 = add i32 %33, 1 - store i32 %add18, ptr %32, align 8 - %34 = load i32, ptr %i14, align 4 - %35 = load ptr, ptr %y15, align 8 - %36 = load i32, ptr %35, align 8 - call void (ptr, ...) @printf(ptr @.str.4, i32 %34, i32 %36) - %37 = load i32, ptr %.anon10, align 4 - %add19 = add i32 %37, 1 - store i32 %add19, ptr %.anon10, align 4 - br label %loop.cond11 - -loop.exit20: ; preds = %loop.cond11 - store i32 3, ptr %.anon21, align 4 - store i32 0, ptr %.anon22, align 4 - br label %loop.cond23 - -loop.cond23: ; preds = %loop.body25, %loop.exit20 - %38 = load i32, ptr %.anon22, align 4 - %39 = load i32, ptr %.anon21, align 4 - %lt24 = icmp slt i32 %38, %39 - br i1 %lt24, label %loop.body25, label %loop.exit31 - -loop.body25: ; preds = %loop.cond23 - %40 = load i32, ptr %.anon22, align 4 - store i32 %40, ptr %i26, align 4 - %41 = load i32, ptr %.anon22, align 4 - store i32 %41, ptr %a28, align 4 - %42 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %43 = load i32, ptr %a28, align 4 - %sisiext29 = sext i32 %43 to i64 - %44 = getelementptr inbounds [3 x i32], ptr %42, i64 0, i64 %sisiext29 - %45 = load i32, ptr %44, align 4 - store i32 %45, ptr %y27, align 4 - %46 = load i32, ptr %i26, align 4 - %47 = load i32, ptr %y27, align 4 - call void (ptr, ...) @printf(ptr @.str.5, i32 %46, i32 %47) - %48 = load i32, ptr %.anon22, align 4 - %add30 = add i32 %48, 1 - store i32 %add30, ptr %.anon22, align 4 - br label %loop.cond23 - -loop.exit31: ; preds = %loop.cond23 - store i32 3, ptr %.anon32, align 4 - store i32 0, ptr %.anon33, align 4 - br label %loop.cond34 - -loop.cond34: ; preds = %loop.body36, %loop.exit31 - %49 = load i32, ptr %.anon33, align 4 - %50 = load i32, ptr %.anon32, align 4 - %lt35 = icmp slt i32 %49, %50 - br i1 %lt35, label %loop.body36, label %loop.exit42 - -loop.body36: ; preds = %loop.cond34 - %51 = load i32, ptr %.anon33, align 4 - store i32 %51, ptr %i37, align 4 - %52 = load i32, ptr %.anon33, align 4 - store i32 %52, ptr %a39, align 4 - %53 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %54 = load i32, ptr %a39, align 4 - %sisiext40 = sext i32 %54 to i64 - %55 = getelementptr inbounds [3 x i32], ptr %53, i64 0, i64 %sisiext40 - %56 = load i32, ptr %55, align 4 - store i32 %56, ptr %y38, align 4 - %57 = load i32, ptr %i37, align 4 - %58 = load i32, ptr %y38, align 4 - call void (ptr, ...) @printf(ptr @.str.6, i32 %57, i32 %58) - %59 = load i32, ptr %.anon33, align 4 - %add41 = add i32 %59, 1 - store i32 %add41, ptr %.anon33, align 4 - br label %loop.cond34 - -loop.exit42: ; preds = %loop.cond34 - store i32 3, ptr %.anon43, align 4 - store i32 0, ptr %.anon44, align 4 - br label %loop.cond45 - -loop.cond45: ; preds = %loop.body47, %loop.exit42 - %60 = load i32, ptr %.anon44, align 4 - %61 = load i32, ptr %.anon43, align 4 - %lt46 = icmp slt i32 %60, %61 - br i1 %lt46, label %loop.body47, label %loop.exit54 - -loop.body47: ; preds = %loop.cond45 - %62 = load i32, ptr %.anon44, align 4 - store i32 %62, ptr %i48, align 4 - %63 = load i32, ptr %.anon44, align 4 - store i32 %63, ptr %a50, align 4 - %64 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %65 = load i32, ptr %a50, align 4 - %sisiext51 = sext i32 %65 to i64 - %66 = getelementptr inbounds [3 x i32], ptr %64, i64 0, i64 %sisiext51 - %67 = load i32, ptr %66, align 4 - store i32 %67, ptr %y49, align 4 - %68 = load i32, ptr %i48, align 4 - %69 = load i32, ptr %y49, align 4 - call void (ptr, ...) @printf(ptr @.str.7, i32 %68, i32 %69) - %70 = load i32, ptr %i48, align 4 - %add52 = add i32 %70, 1 - store i32 %add52, ptr %i48, align 4 - %71 = load i32, ptr %.anon44, align 4 - %add53 = add i32 %71, 1 - store i32 %add53, ptr %.anon44, align 4 - br label %loop.cond45 - -loop.exit54: ; preds = %loop.cond45 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %.anon55, ptr align 16 @.__const.8, i32 20, i1 false) - store i64 0, ptr %.anon56, align 8 - br label %loop.cond57 - -loop.cond57: ; preds = %loop.body58, %loop.exit54 - %72 = load i64, ptr %.anon56, align 8 - %gt = icmp ugt i64 5, %72 - br i1 %gt, label %loop.body58, label %loop.exit63 - -loop.body58: ; preds = %loop.cond57 - %73 = load i64, ptr %.anon56, align 8 - store i64 %73, ptr %i59, align 8 - %74 = load i64, ptr %.anon56, align 8 - %75 = getelementptr inbounds [5 x i32], ptr %.anon55, i64 0, i64 %74 - %76 = load i32, ptr %75, align 4 - store i32 %76, ptr %y60, align 4 - %77 = load i64, ptr %i59, align 8 - %78 = load i32, ptr %y60, align 4 - call void (ptr, ...) @printf(ptr @.str.9, i64 %77, i32 %78) - %79 = load i64, ptr %i59, align 8 - %add61 = add i64 %79, 1 - store i64 %add61, ptr %i59, align 8 - %80 = load i64, ptr %.anon56, align 8 - %add62 = add i64 %80, 1 - store i64 %add62, ptr %.anon56, align 8 - br label %loop.cond57 - -loop.exit63: ; preds = %loop.cond57 - call void @foo_getFields(ptr sret([5 x i32]) align 4 %.anon64) - store i64 0, ptr %.anon65, align 8 - br label %loop.cond66 - -loop.cond66: ; preds = %loop.body68, %loop.exit63 - %81 = load i64, ptr %.anon65, align 8 - %gt67 = icmp ugt i64 5, %81 - br i1 %gt67, label %loop.body68, label %loop.exit72 - -loop.body68: ; preds = %loop.cond66 - %82 = load i64, ptr %.anon65, align 8 - store i64 %82, ptr %i69, align 8 - %83 = load i64, ptr %.anon65, align 8 - %84 = getelementptr inbounds [5 x i32], ptr %.anon64, i64 0, i64 %83 - %85 = load i32, ptr %84, align 4 - store i32 %85, ptr %y70, align 4 - %86 = load i64, ptr %i69, align 8 - %87 = load i32, ptr %y70, align 4 - call void (ptr, ...) @printf(ptr @.str.10, i64 %86, i32 %87) - %88 = load i64, ptr %.anon65, align 8 - %add71 = add i64 %88, 1 - store i64 %add71, ptr %.anon65, align 8 - br label %loop.cond66 - -loop.exit72: ; preds = %loop.cond66 - call void @foo_getFields(ptr sret([5 x i32]) align 4 %sretparam) - store ptr %sretparam, ptr %.anon73, align 8 - store i64 0, ptr %.anon74, align 8 - br label %loop.cond75 - -loop.cond75: ; preds = %loop.body77, %loop.exit72 - %89 = load i64, ptr %.anon74, align 8 - %gt76 = icmp ugt i64 5, %89 - br i1 %gt76, label %loop.body77, label %loop.exit81 - -loop.body77: ; preds = %loop.cond75 - %90 = load i64, ptr %.anon74, align 8 - store i64 %90, ptr %i78, align 8 - %91 = load ptr, ptr %.anon73, align 8 - %92 = load i64, ptr %.anon74, align 8 - %93 = getelementptr inbounds [5 x i32], ptr %91, i64 0, i64 %92 - %94 = load i32, ptr %93, align 4 - store i32 %94, ptr %y79, align 4 - %95 = load i64, ptr %i78, align 8 - %96 = load i32, ptr %y79, align 4 - call void (ptr, ...) @printf(ptr @.str.11, i64 %95, i32 %96) - %97 = load i64, ptr %.anon74, align 8 - %add80 = add i64 %97, 1 - store i64 %add80, ptr %.anon74, align 8 - br label %loop.cond75 - -loop.exit81: ; preds = %loop.cond75 - store i32 0, ptr %a82, align 4 - %98 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %99 = load i32, ptr %a82, align 4 - %sisiext83 = sext i32 %99 to i64 - %100 = getelementptr inbounds [3 x i32], ptr %98, i64 0, i64 %sisiext83 - %101 = load i32, ptr %100, align 4 - store i32 1, ptr %a84, align 4 - %102 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %103 = load i32, ptr %a84, align 4 - %sisiext85 = sext i32 %103 to i64 - %104 = getelementptr inbounds [3 x i32], ptr %102, i64 0, i64 %sisiext85 - %105 = load i32, ptr %104, align 4 - call void (ptr, ...) @printf(ptr @.str.12, i32 %101, i32 %105) - store i32 1, ptr %a87, align 4 - %106 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %107 = load i32, ptr %a87, align 4 - %sisiext88 = sext i32 %107 to i64 - %108 = getelementptr inbounds [3 x i32], ptr %106, i64 0, i64 %sisiext88 - store ptr %108, ptr %y86, align 8 - %109 = load ptr, ptr %y86, align 8 - %110 = load i32, ptr %109, align 8 - %add89 = add i32 %110, 1 - store i32 %add89, ptr %109, align 8 - store i32 0, ptr %a90, align 4 - %111 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %112 = load i32, ptr %a90, align 4 - %sisiext91 = sext i32 %112 to i64 - %113 = getelementptr inbounds [3 x i32], ptr %111, i64 0, i64 %sisiext91 - %114 = load i32, ptr %113, align 4 - store i32 1, ptr %a92, align 4 - %115 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %116 = load i32, ptr %a92, align 4 - %sisiext93 = sext i32 %116 to i64 - %117 = getelementptr inbounds [3 x i32], ptr %115, i64 0, i64 %sisiext93 - %118 = load i32, ptr %117, align 4 - call void (ptr, ...) @printf(ptr @.str.13, i32 %114, i32 %118) - ret void -} diff --git a/test/test_suite2/statements/foreach_common.c3t b/test/test_suite2/statements/foreach_common.c3t deleted file mode 100644 index 8cdbb6fc0..000000000 --- a/test/test_suite2/statements/foreach_common.c3t +++ /dev/null @@ -1,374 +0,0 @@ -// #target: macos-x64 -module test; - -extern fn void printf(char*, ...); - -fn void main() -{ - float[3] foo = { 2, 4.5, 8 }; - float[<3>] foo2 = { 2, 4.5, 8 }; - foreach (a : foo) - { - printf("Value: %f\n", a); - } - foreach (float* &a : foo) - { - *a *= 2; - printf("Value: %f\n", *a); - } - foreach (void* &a : foo) - { - printf("Value: %f\n", *((float*)(a))); - } - foreach (i, a : foo) - { - printf("Value[%d]: %f\n", i, a); - } - foreach (char i, double a : foo) - { - printf("Value2[%d]: %f\n", i, a); - } - foreach (double a : foo) - { - printf("Value3: %f\n", a); - } - - foreach (a : foo2) - { - printf("Value: %f\n", a); - } - foreach (float* &a : foo2) - { - *a *= 2; - printf("Value: %f\n", *a); - } - foreach (i, a : foo2) - { - printf("Value[%d]: %f\n", i, a); - } - foreach (char i, double a : foo2) - { - printf("Value2[%d]: %f\n", i, a); - } - foreach (double a : foo2) - { - printf("Value3: %f\n", a); - } -} - -/* #expect: test.ll - -entry: - %foo = alloca [3 x float], align 4 - %foo2 = alloca <3 x float>, align 16 - %.anon = alloca i64, align 8 - %a = alloca float, align 4 - %.anon1 = alloca i64, align 8 - %a5 = alloca ptr, align 8 - %.anon9 = alloca i64, align 8 - %a13 = alloca ptr, align 8 - %.anon17 = alloca i64, align 8 - %i = alloca i64, align 8 - %a21 = alloca float, align 4 - %.anon25 = alloca i64, align 8 - %i29 = alloca i8, align 1 - %a30 = alloca double, align 8 - %.anon34 = alloca i64, align 8 - %a38 = alloca double, align 8 - %.anon42 = alloca i64, align 8 - %.anon43 = alloca i64, align 8 - %a46 = alloca float, align 4 - %.anon50 = alloca i64, align 8 - %.anon51 = alloca i64, align 8 - %a55 = alloca ptr, align 8 - %.anon60 = alloca i64, align 8 - %.anon61 = alloca i64, align 8 - %i65 = alloca i64, align 8 - %a66 = alloca float, align 4 - %.anon70 = alloca i64, align 8 - %.anon71 = alloca i64, align 8 - %i75 = alloca i8, align 1 - %a77 = alloca double, align 8 - %.anon82 = alloca i64, align 8 - %.anon83 = alloca i64, align 8 - %a87 = alloca double, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 12, i1 false) - store <3 x float> , ptr %foo2, align 16 - store i64 0, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %0 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 3, %0 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %1 = load i64, ptr %.anon, align 8 - %2 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %1 - %3 = load float, ptr %2, align 4 - store float %3, ptr %a, align 4 - %4 = load float, ptr %a, align 4 - %fpfpext = fpext float %4 to double - call void (ptr, ...) @printf(ptr @.str, double %fpfpext) - %5 = load i64, ptr %.anon, align 8 - %add = add i64 %5, 1 - store i64 %add, ptr %.anon, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - store i64 0, ptr %.anon1, align 8 - br label %loop.cond2 - -loop.cond2: ; preds = %loop.body4, %loop.exit - %6 = load i64, ptr %.anon1, align 8 - %gt3 = icmp ugt i64 3, %6 - br i1 %gt3, label %loop.body4, label %loop.exit8 - -loop.body4: ; preds = %loop.cond2 - %7 = load i64, ptr %.anon1, align 8 - %8 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %7 - store ptr %8, ptr %a5, align 8 - %9 = load ptr, ptr %a5, align 8 - %10 = load float, ptr %9, align 8 - %fmul = fmul float %10, 2.000000e+00 - store float %fmul, ptr %9, align 8 - %11 = load ptr, ptr %a5, align 8 - %12 = load float, ptr %11, align 8 - %fpfpext6 = fpext float %12 to double - call void (ptr, ...) @printf(ptr @.str.1, double %fpfpext6) - %13 = load i64, ptr %.anon1, align 8 - %add7 = add i64 %13, 1 - store i64 %add7, ptr %.anon1, align 8 - br label %loop.cond2 - -loop.exit8: ; preds = %loop.cond2 - store i64 0, ptr %.anon9, align 8 - br label %loop.cond10 - -loop.cond10: ; preds = %loop.body12, %loop.exit8 - %14 = load i64, ptr %.anon9, align 8 - %gt11 = icmp ugt i64 3, %14 - br i1 %gt11, label %loop.body12, label %loop.exit16 - -loop.body12: ; preds = %loop.cond10 - %15 = load i64, ptr %.anon9, align 8 - %16 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %15 - store ptr %16, ptr %a13, align 8 - %17 = load ptr, ptr %a13, align 8 - %18 = load float, ptr %17, align 8 - %fpfpext14 = fpext float %18 to double - call void (ptr, ...) @printf(ptr @.str.2, double %fpfpext14) - %19 = load i64, ptr %.anon9, align 8 - %add15 = add i64 %19, 1 - store i64 %add15, ptr %.anon9, align 8 - br label %loop.cond10 - -loop.exit16: ; preds = %loop.cond10 - store i64 0, ptr %.anon17, align 8 - br label %loop.cond18 - -loop.cond18: ; preds = %loop.body20, %loop.exit16 - %20 = load i64, ptr %.anon17, align 8 - %gt19 = icmp ugt i64 3, %20 - br i1 %gt19, label %loop.body20, label %loop.exit24 - -loop.body20: ; preds = %loop.cond18 - %21 = load i64, ptr %.anon17, align 8 - store i64 %21, ptr %i, align 8 - %22 = load i64, ptr %.anon17, align 8 - %23 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %22 - %24 = load float, ptr %23, align 4 - store float %24, ptr %a21, align 4 - %25 = load i64, ptr %i, align 8 - %26 = load float, ptr %a21, align 4 - %fpfpext22 = fpext float %26 to double - call void (ptr, ...) @printf(ptr @.str.3, i64 %25, double %fpfpext22) - %27 = load i64, ptr %.anon17, align 8 - %add23 = add i64 %27, 1 - store i64 %add23, ptr %.anon17, align 8 - br label %loop.cond18 - -loop.exit24: ; preds = %loop.cond18 - store i64 0, ptr %.anon25, align 8 - br label %loop.cond26 - -loop.cond26: ; preds = %loop.body28, %loop.exit24 - %28 = load i64, ptr %.anon25, align 8 - %gt27 = icmp ugt i64 3, %28 - br i1 %gt27, label %loop.body28, label %loop.exit33 - -loop.body28: ; preds = %loop.cond26 - %29 = load i64, ptr %.anon25, align 8 - %ztrunc = trunc i64 %29 to i8 - store i8 %ztrunc, ptr %i29, align 1 - %30 = load i64, ptr %.anon25, align 8 - %31 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %30 - %32 = load float, ptr %31, align 4 - %fpfpext31 = fpext float %32 to double - store double %fpfpext31, ptr %a30, align 8 - %33 = load i8, ptr %i29, align 1 - %uisiext = zext i8 %33 to i32 - %34 = load double, ptr %a30, align 8 - call void (ptr, ...) @printf(ptr @.str.4, i32 %uisiext, double %34) - %35 = load i64, ptr %.anon25, align 8 - %add32 = add i64 %35, 1 - store i64 %add32, ptr %.anon25, align 8 - br label %loop.cond26 - -loop.exit33: ; preds = %loop.cond26 - store i64 0, ptr %.anon34, align 8 - br label %loop.cond35 - -loop.cond35: ; preds = %loop.body37, %loop.exit33 - %36 = load i64, ptr %.anon34, align 8 - %gt36 = icmp ugt i64 3, %36 - br i1 %gt36, label %loop.body37, label %loop.exit41 - -loop.body37: ; preds = %loop.cond35 - %37 = load i64, ptr %.anon34, align 8 - %38 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %37 - %39 = load float, ptr %38, align 4 - %fpfpext39 = fpext float %39 to double - store double %fpfpext39, ptr %a38, align 8 - %40 = load double, ptr %a38, align 8 - call void (ptr, ...) @printf(ptr @.str.5, double %40) - %41 = load i64, ptr %.anon34, align 8 - %add40 = add i64 %41, 1 - store i64 %add40, ptr %.anon34, align 8 - br label %loop.cond35 - -loop.exit41: ; preds = %loop.cond35 - store i64 3, ptr %.anon42, align 8 - store i64 0, ptr %.anon43, align 8 - br label %loop.cond44 - -loop.cond44: ; preds = %loop.body45, %loop.exit41 - %42 = load i64, ptr %.anon43, align 8 - %43 = load i64, ptr %.anon42, align 8 - %lt = icmp ult i64 %42, %43 - br i1 %lt, label %loop.body45, label %loop.exit49 - -loop.body45: ; preds = %loop.cond44 - %44 = load <3 x float>, ptr %foo2, align 16 - %45 = load i64, ptr %.anon43, align 8 - %46 = extractelement <3 x float> %44, i64 %45 - store float %46, ptr %a46, align 4 - %47 = load float, ptr %a46, align 4 - %fpfpext47 = fpext float %47 to double - call void (ptr, ...) @printf(ptr @.str.6, double %fpfpext47) - %48 = load i64, ptr %.anon43, align 8 - %add48 = add i64 %48, 1 - store i64 %add48, ptr %.anon43, align 8 - br label %loop.cond44 - -loop.exit49: ; preds = %loop.cond44 - store i64 3, ptr %.anon50, align 8 - store i64 0, ptr %.anon51, align 8 - br label %loop.cond52 - -loop.cond52: ; preds = %loop.body54, %loop.exit49 - %49 = load i64, ptr %.anon51, align 8 - %50 = load i64, ptr %.anon50, align 8 - %lt53 = icmp ult i64 %49, %50 - br i1 %lt53, label %loop.body54, label %loop.exit59 - -loop.body54: ; preds = %loop.cond52 - %51 = load i64, ptr %.anon51, align 8 - %52 = getelementptr inbounds <3 x float>, ptr %foo2, i64 0, i64 %51 - store ptr %52, ptr %a55, align 8 - %53 = load ptr, ptr %a55, align 8 - %54 = load float, ptr %53, align 8 - %fmul56 = fmul float %54, 2.000000e+00 - store float %fmul56, ptr %53, align 8 - %55 = load ptr, ptr %a55, align 8 - %56 = load float, ptr %55, align 8 - %fpfpext57 = fpext float %56 to double - call void (ptr, ...) @printf(ptr @.str.7, double %fpfpext57) - %57 = load i64, ptr %.anon51, align 8 - %add58 = add i64 %57, 1 - store i64 %add58, ptr %.anon51, align 8 - br label %loop.cond52 - -loop.exit59: ; preds = %loop.cond52 - store i64 3, ptr %.anon60, align 8 - store i64 0, ptr %.anon61, align 8 - br label %loop.cond62 - -loop.cond62: ; preds = %loop.body64, %loop.exit59 - %58 = load i64, ptr %.anon61, align 8 - %59 = load i64, ptr %.anon60, align 8 - %lt63 = icmp ult i64 %58, %59 - br i1 %lt63, label %loop.body64, label %loop.exit69 - -loop.body64: ; preds = %loop.cond62 - %60 = load i64, ptr %.anon61, align 8 - store i64 %60, ptr %i65, align 8 - %61 = load <3 x float>, ptr %foo2, align 16 - %62 = load i64, ptr %.anon61, align 8 - %63 = extractelement <3 x float> %61, i64 %62 - store float %63, ptr %a66, align 4 - %64 = load i64, ptr %i65, align 8 - %65 = load float, ptr %a66, align 4 - %fpfpext67 = fpext float %65 to double - call void (ptr, ...) @printf(ptr @.str.8, i64 %64, double %fpfpext67) - %66 = load i64, ptr %.anon61, align 8 - %add68 = add i64 %66, 1 - store i64 %add68, ptr %.anon61, align 8 - br label %loop.cond62 - -loop.exit69: ; preds = %loop.cond62 - store i64 3, ptr %.anon70, align 8 - store i64 0, ptr %.anon71, align 8 - br label %loop.cond72 - -loop.cond72: ; preds = %loop.body74, %loop.exit69 - %67 = load i64, ptr %.anon71, align 8 - %68 = load i64, ptr %.anon70, align 8 - %lt73 = icmp ult i64 %67, %68 - br i1 %lt73, label %loop.body74, label %loop.exit81 - -loop.body74: ; preds = %loop.cond72 - %69 = load i64, ptr %.anon71, align 8 - %ztrunc76 = trunc i64 %69 to i8 - store i8 %ztrunc76, ptr %i75, align 1 - %70 = load <3 x float>, ptr %foo2, align 16 - %71 = load i64, ptr %.anon71, align 8 - %72 = extractelement <3 x float> %70, i64 %71 - %fpfpext78 = fpext float %72 to double - store double %fpfpext78, ptr %a77, align 8 - %73 = load i8, ptr %i75, align 1 - %uisiext79 = zext i8 %73 to i32 - %74 = load double, ptr %a77, align 8 - call void (ptr, ...) @printf(ptr @.str.9, i32 %uisiext79, double %74) - %75 = load i64, ptr %.anon71, align 8 - %add80 = add i64 %75, 1 - store i64 %add80, ptr %.anon71, align 8 - br label %loop.cond72 - -loop.exit81: ; preds = %loop.cond72 - store i64 3, ptr %.anon82, align 8 - store i64 0, ptr %.anon83, align 8 - br label %loop.cond84 - -loop.cond84: ; preds = %loop.body86, %loop.exit81 - %76 = load i64, ptr %.anon83, align 8 - %77 = load i64, ptr %.anon82, align 8 - %lt85 = icmp ult i64 %76, %77 - br i1 %lt85, label %loop.body86, label %loop.exit90 - -loop.body86: ; preds = %loop.cond84 - %78 = load <3 x float>, ptr %foo2, align 16 - %79 = load i64, ptr %.anon83, align 8 - %80 = extractelement <3 x float> %78, i64 %79 - %fpfpext88 = fpext float %80 to double - store double %fpfpext88, ptr %a87, align 8 - %81 = load double, ptr %a87, align 8 - call void (ptr, ...) @printf(ptr @.str.10, double %81) - %82 = load i64, ptr %.anon83, align 8 - %add89 = add i64 %82, 1 - store i64 %add89, ptr %.anon83, align 8 - br label %loop.cond84 - -loop.exit90: ; preds = %loop.cond84 - ret void -} diff --git a/test/test_suite2/statements/foreach_custom.c3t b/test/test_suite2/statements/foreach_custom.c3t deleted file mode 100644 index 2c76f8bfa..000000000 --- a/test/test_suite2/statements/foreach_custom.c3t +++ /dev/null @@ -1,92 +0,0 @@ -// #target: macos-x64 - -module test; -struct Foo -{ - int[] x; -} - -macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) -{ - return foo.x[index]; -} - -macro usz Foo.@operator_len(Foo &foo) @operator(len) -{ - return foo.x.len; -} - -fn void main() -{ - int[*] i = { 1, 3, 10 }; - Foo x = { &i }; - foreach FOO: (int f : x) { - printf("%d\n", f); - while (1) - { - break FOO; - } - } -} - -extern fn int printf(char *fmt, ...); - -/* #expect: test.ll - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %i = alloca [3 x i32], align 4 - %x = alloca %Foo, align 8 - %.anon = alloca i64, align 8 - %.anon1 = alloca i64, align 8 - %f = alloca i32, align 4 - %index = alloca i64, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %1 = insertvalue %"int[]" undef, ptr %i, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - store %"int[]" %2, ptr %0, align 8 - %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %entry - %6 = load i64, ptr %.anon1, align 8 - %7 = load i64, ptr %.anon, align 8 - %lt = icmp ult i64 %6, %7 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %8 = load i64, ptr %.anon1, align 8 - store i64 %8, ptr %index, align 8 - %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 - %11 = load ptr, ptr %10, align 8 - %12 = load i64, ptr %index, align 8 - %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 - %13 = load i32, ptr %ptroffset, align 4 - store i32 %13, ptr %f, align 4 - %14 = load i32, ptr %f, align 4 - %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) - br label %loop.body2 - -loop.body2: ; preds = %loop.body - br label %loop.exit - -loop.exit: ; preds = %loop.body2, %loop.cond - ret void -} - -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @test_main() - ret i32 0 -} diff --git a/test/test_suite2/statements/foreach_custom_macro.c3t b/test/test_suite2/statements/foreach_custom_macro.c3t deleted file mode 100644 index 47347644a..000000000 --- a/test/test_suite2/statements/foreach_custom_macro.c3t +++ /dev/null @@ -1,98 +0,0 @@ -// #target: macos-x64 -module foo; -struct Foo -{ - int[] x; -} - -macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) -{ - return foo.x[index]; -} - -macro usz Foo.@operator_len(Foo &foo) @operator(len) -{ - return foo.x.len; -} - -fn void main() -{ - int[*] i = { 1, 3, 10 }; - Foo x = { &i }; - foreach FOO: (int f : x) { - printf("%d\n", f); - while (1) - { - break FOO; - } - } -} - -extern fn int printf(char *fmt, ...); - -/* #expect: foo.ll - -%Foo = type { %"int[]" } -%"int[]" = type { ptr, i64 } - -@"ct$foo_Foo" = linkonce constant %.introspect { i8 10, i64 16, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8 -@.__const = private unnamed_addr constant [3 x i32] [i32 1, i32 3, i32 10], align 4 -@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 - -; Function Attrs: nounwind -define void @foo_main() #0 { -entry: - %i = alloca [3 x i32], align 4 - %x = alloca %Foo, align 8 - %.anon = alloca i64, align 8 - %.anon1 = alloca i64, align 8 - %f = alloca i32, align 4 - %index = alloca i64, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %1 = insertvalue %"int[]" undef, ptr %i, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - store %"int[]" %2, ptr %0, align 8 - %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %entry - %6 = load i64, ptr %.anon1, align 8 - %7 = load i64, ptr %.anon, align 8 - %lt = icmp ult i64 %6, %7 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %8 = load i64, ptr %.anon1, align 8 - store i64 %8, ptr %index, align 8 - %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 - %11 = load ptr, ptr %10, align 8 - %12 = load i64, ptr %index, align 8 - %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 - %13 = load i32, ptr %ptroffset, align 4 - store i32 %13, ptr %f, align 4 - %14 = load i32, ptr %f, align 4 - %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) - br label %loop.body2 - -loop.body2: ; preds = %loop.body - br label %loop.exit - -loop.exit: ; preds = %loop.body2, %loop.cond - ret void -} - -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @foo_main() - ret i32 0 -} \ No newline at end of file diff --git a/test/test_suite2/statements/foreach_more_implementations.c3t b/test/test_suite2/statements/foreach_more_implementations.c3t deleted file mode 100644 index fbff1e940..000000000 --- a/test/test_suite2/statements/foreach_more_implementations.c3t +++ /dev/null @@ -1,157 +0,0 @@ -// #target: macos-x64 -module test; - -import std::io; -struct Vector -{ - usz size; - int* elements; -} - -macro int Vector.get(Vector* vector, usz element) @operator([]) -{ - return vector.elements[element]; -} - -macro int* Vector.get_ref(Vector* vector, usz element) @operator(&[]) -{ - return &vector.elements[element]; -} - -macro usz Vector.size(Vector vector) @operator(len) { - return vector.size; -} - -fn void main() -{ - int[2] x = { 1, 2 }; - Vector v = { 2, &x }; - - foreach (int* &ref : v) - { - std::io::printf("%d\n", *ref); - *ref += 2; - } - foreach (int i : v) - { - std::io::printf("%d\n", i); - } -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %x = alloca [2 x i32], align 4 - %v = alloca %Vector, align 8 - %.anon = alloca i64, align 8 - %vector = alloca %Vector, align 8 - %.anon1 = alloca i64, align 8 - %ref = alloca ptr, align 8 - %vector2 = alloca ptr, align 8 - %element = alloca i64, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %.anon4 = alloca i64, align 8 - %vector5 = alloca %Vector, align 8 - %.anon6 = alloca i64, align 8 - %i = alloca i32, align 4 - %vector10 = alloca ptr, align 8 - %element11 = alloca i64, align 8 - %retparam13 = alloca i64, align 8 - %varargslots14 = alloca [1 x %variant], align 16 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 8, i1 false) - %0 = getelementptr inbounds %Vector, ptr %v, i32 0, i32 0 - store i64 2, ptr %0, align 8 - %1 = getelementptr inbounds %Vector, ptr %v, i32 0, i32 1 - store ptr %x, ptr %1, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %vector, ptr align 8 %v, i32 16, i1 false) - %2 = getelementptr inbounds %Vector, ptr %vector, i32 0, i32 0 - %3 = load i64, ptr %2, align 8 - store i64 %3, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %voiderr, %entry - %4 = load i64, ptr %.anon1, align 8 - %5 = load i64, ptr %.anon, align 8 - %lt = icmp ult i64 %4, %5 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - store ptr %v, ptr %vector2, align 8 - %6 = load i64, ptr %.anon1, align 8 - store i64 %6, ptr %element, align 8 - %7 = load ptr, ptr %vector2, align 8 - %8 = getelementptr inbounds %Vector, ptr %7, i32 0, i32 1 - %9 = load ptr, ptr %8, align 8 - %10 = load i64, ptr %element, align 8 - %ptroffset = getelementptr inbounds i32, ptr %9, i64 %10 - store ptr %ptroffset, ptr %ref, align 8 - %11 = load ptr, ptr %ref, align 8 - %12 = insertvalue %variant undef, ptr %11, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %14 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %13, ptr %14, align 16 - %15 = call i64 @std_io_printf(ptr %retparam, ptr @.str, i64 3, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %15, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %loop.body - br label %voiderr - -voiderr: ; preds = %after_check, %loop.body - %16 = load ptr, ptr %ref, align 8 - %17 = load i32, ptr %16, align 8 - %add = add i32 %17, 2 - store i32 %add, ptr %16, align 8 - %18 = load i64, ptr %.anon1, align 8 - %add3 = add i64 %18, 1 - store i64 %add3, ptr %.anon1, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %vector5, ptr align 8 %v, i32 16, i1 false) - %19 = getelementptr inbounds %Vector, ptr %vector5, i32 0, i32 0 - %20 = load i64, ptr %19, align 8 - store i64 %20, ptr %.anon4, align 8 - store i64 0, ptr %.anon6, align 8 - br label %loop.cond7 - -loop.cond7: ; preds = %voiderr17, %loop.exit - %21 = load i64, ptr %.anon6, align 8 - %22 = load i64, ptr %.anon4, align 8 - %lt8 = icmp ult i64 %21, %22 - br i1 %lt8, label %loop.body9, label %loop.exit19 - -loop.body9: ; preds = %loop.cond7 - store ptr %v, ptr %vector10, align 8 - %23 = load i64, ptr %.anon6, align 8 - store i64 %23, ptr %element11, align 8 - %24 = load ptr, ptr %vector10, align 8 - %25 = getelementptr inbounds %Vector, ptr %24, i32 0, i32 1 - %26 = load ptr, ptr %25, align 8 - %27 = load i64, ptr %element11, align 8 - %ptroffset12 = getelementptr inbounds i32, ptr %26, i64 %27 - %28 = load i32, ptr %ptroffset12, align 4 - store i32 %28, ptr %i, align 4 - %29 = insertvalue %variant undef, ptr %i, 0 - %30 = insertvalue %variant %29, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %31 = getelementptr inbounds [1 x %variant], ptr %varargslots14, i64 0, i64 0 - store %variant %30, ptr %31, align 16 - %32 = call i64 @std_io_printf(ptr %retparam13, ptr @.str.1, i64 3, ptr %varargslots14, i64 1) - %not_err15 = icmp eq i64 %32, 0 - br i1 %not_err15, label %after_check16, label %voiderr17 - -after_check16: ; preds = %loop.body9 - br label %voiderr17 - -voiderr17: ; preds = %after_check16, %loop.body9 - %33 = load i64, ptr %.anon6, align 8 - %add18 = add i64 %33, 1 - store i64 %add18, ptr %.anon6, align 8 - br label %loop.cond7 - -loop.exit19: ; preds = %loop.cond7 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/statements/foreach_r_common.c3t b/test/test_suite2/statements/foreach_r_common.c3t deleted file mode 100644 index c8d675458..000000000 --- a/test/test_suite2/statements/foreach_r_common.c3t +++ /dev/null @@ -1,359 +0,0 @@ -// #target: macos-x64 -module test; - -extern fn void printf(char*, ...); - -fn void main() -{ - float[3] foo = { 2, 4.5, 8 }; - float[<3>] foo2 = { 2, 4.5, 8 }; - foreach_r (a : foo) - { - printf("Value: %f\n", a); - } - foreach_r (float* &a : foo) - { - *a *= 2; - printf("Value: %f\n", *a); - } - foreach_r (void* &a : foo) - { - printf("Value: %f\n", *((float*)(a))); - } - foreach_r (i, a : foo) - { - printf("Value[%d]: %f\n", i, a); - } - foreach_r (char i, double a : foo) - { - printf("Value2[%d]: %f\n", i, a); - } - foreach_r (double a : foo) - { - printf("Value3: %f\n", a); - } - - foreach_r (a : foo2) - { - printf("Value: %f\n", a); - } - foreach_r (float* &a : foo2) - { - *a *= 2; - printf("Value: %f\n", *a); - } - foreach_r (i, a : foo2) - { - printf("Value[%d]: %f\n", i, a); - } - foreach_r (char i, double a : foo2) - { - printf("Value2[%d]: %f\n", i, a); - } - foreach_r (double a : foo2) - { - printf("Value3: %f\n", a); - } -} - -/* #expect: test.ll - -entry: - %foo = alloca [3 x float], align 4 - %foo2 = alloca <3 x float>, align 16 - %.anon = alloca i64, align 8 - %a = alloca float, align 4 - %.anon1 = alloca i64, align 8 - %a6 = alloca ptr, align 8 - %.anon9 = alloca i64, align 8 - %a14 = alloca ptr, align 8 - %.anon17 = alloca i64, align 8 - %i = alloca i64, align 8 - %a22 = alloca float, align 4 - %.anon25 = alloca i64, align 8 - %i30 = alloca i8, align 1 - %a31 = alloca double, align 8 - %.anon34 = alloca i64, align 8 - %a39 = alloca double, align 8 - %.anon42 = alloca i64, align 8 - %a47 = alloca float, align 4 - %.anon50 = alloca i64, align 8 - %a55 = alloca ptr, align 8 - %.anon59 = alloca i64, align 8 - %i64 = alloca i64, align 8 - %a65 = alloca float, align 4 - %.anon68 = alloca i64, align 8 - %i73 = alloca i8, align 1 - %a75 = alloca double, align 8 - %.anon79 = alloca i64, align 8 - %a84 = alloca double, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %foo, ptr align 4 @.__const, i32 12, i1 false) - store <3 x float> , ptr %foo2, align 16 - store i64 3, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %0 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 %0, 0 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %1 = load i64, ptr %.anon, align 8 - %sub = sub i64 %1, 1 - store i64 %sub, ptr %.anon, align 8 - %2 = load i64, ptr %.anon, align 8 - %3 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %2 - %4 = load float, ptr %3, align 4 - store float %4, ptr %a, align 4 - %5 = load float, ptr %a, align 4 - %fpfpext = fpext float %5 to double - call void (ptr, ...) @printf(ptr @.str, double %fpfpext) - br label %loop.cond - -loop.exit: ; preds = %loop.cond - store i64 3, ptr %.anon1, align 8 - br label %loop.cond2 - -loop.cond2: ; preds = %loop.body4, %loop.exit - %6 = load i64, ptr %.anon1, align 8 - %gt3 = icmp ugt i64 %6, 0 - br i1 %gt3, label %loop.body4, label %loop.exit8 - -loop.body4: ; preds = %loop.cond2 - %7 = load i64, ptr %.anon1, align 8 - %sub5 = sub i64 %7, 1 - store i64 %sub5, ptr %.anon1, align 8 - %8 = load i64, ptr %.anon1, align 8 - %9 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %8 - store ptr %9, ptr %a6, align 8 - %10 = load ptr, ptr %a6, align 8 - %11 = load float, ptr %10, align 8 - %fmul = fmul float %11, 2.000000e+00 - store float %fmul, ptr %10, align 8 - %12 = load ptr, ptr %a6, align 8 - %13 = load float, ptr %12, align 8 - %fpfpext7 = fpext float %13 to double - call void (ptr, ...) @printf(ptr @.str.1, double %fpfpext7) - br label %loop.cond2 - -loop.exit8: ; preds = %loop.cond2 - store i64 3, ptr %.anon9, align 8 - br label %loop.cond10 - -loop.cond10: ; preds = %loop.body12, %loop.exit8 - %14 = load i64, ptr %.anon9, align 8 - %gt11 = icmp ugt i64 %14, 0 - br i1 %gt11, label %loop.body12, label %loop.exit16 - -loop.body12: ; preds = %loop.cond10 - %15 = load i64, ptr %.anon9, align 8 - %sub13 = sub i64 %15, 1 - store i64 %sub13, ptr %.anon9, align 8 - %16 = load i64, ptr %.anon9, align 8 - %17 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %16 - store ptr %17, ptr %a14, align 8 - %18 = load ptr, ptr %a14, align 8 - %19 = load float, ptr %18, align 8 - %fpfpext15 = fpext float %19 to double - call void (ptr, ...) @printf(ptr @.str.2, double %fpfpext15) - br label %loop.cond10 - -loop.exit16: ; preds = %loop.cond10 - store i64 3, ptr %.anon17, align 8 - br label %loop.cond18 - -loop.cond18: ; preds = %loop.body20, %loop.exit16 - %20 = load i64, ptr %.anon17, align 8 - %gt19 = icmp ugt i64 %20, 0 - br i1 %gt19, label %loop.body20, label %loop.exit24 - -loop.body20: ; preds = %loop.cond18 - %21 = load i64, ptr %.anon17, align 8 - %sub21 = sub i64 %21, 1 - store i64 %sub21, ptr %.anon17, align 8 - %22 = load i64, ptr %.anon17, align 8 - store i64 %22, ptr %i, align 8 - %23 = load i64, ptr %.anon17, align 8 - %24 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %23 - %25 = load float, ptr %24, align 4 - store float %25, ptr %a22, align 4 - %26 = load i64, ptr %i, align 8 - %27 = load float, ptr %a22, align 4 - %fpfpext23 = fpext float %27 to double - call void (ptr, ...) @printf(ptr @.str.3, i64 %26, double %fpfpext23) - br label %loop.cond18 - -loop.exit24: ; preds = %loop.cond18 - store i64 3, ptr %.anon25, align 8 - br label %loop.cond26 - -loop.cond26: ; preds = %loop.body28, %loop.exit24 - %28 = load i64, ptr %.anon25, align 8 - %gt27 = icmp ugt i64 %28, 0 - br i1 %gt27, label %loop.body28, label %loop.exit33 - -loop.body28: ; preds = %loop.cond26 - %29 = load i64, ptr %.anon25, align 8 - %sub29 = sub i64 %29, 1 - store i64 %sub29, ptr %.anon25, align 8 - %30 = load i64, ptr %.anon25, align 8 - %ztrunc = trunc i64 %30 to i8 - store i8 %ztrunc, ptr %i30, align 1 - %31 = load i64, ptr %.anon25, align 8 - %32 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %31 - %33 = load float, ptr %32, align 4 - %fpfpext32 = fpext float %33 to double - store double %fpfpext32, ptr %a31, align 8 - %34 = load i8, ptr %i30, align 1 - %uisiext = zext i8 %34 to i32 - %35 = load double, ptr %a31, align 8 - call void (ptr, ...) @printf(ptr @.str.4, i32 %uisiext, double %35) - br label %loop.cond26 - -loop.exit33: ; preds = %loop.cond26 - store i64 3, ptr %.anon34, align 8 - br label %loop.cond35 - -loop.cond35: ; preds = %loop.body37, %loop.exit33 - %36 = load i64, ptr %.anon34, align 8 - %gt36 = icmp ugt i64 %36, 0 - br i1 %gt36, label %loop.body37, label %loop.exit41 - -loop.body37: ; preds = %loop.cond35 - %37 = load i64, ptr %.anon34, align 8 - %sub38 = sub i64 %37, 1 - store i64 %sub38, ptr %.anon34, align 8 - %38 = load i64, ptr %.anon34, align 8 - %39 = getelementptr inbounds [3 x float], ptr %foo, i64 0, i64 %38 - %40 = load float, ptr %39, align 4 - %fpfpext40 = fpext float %40 to double - store double %fpfpext40, ptr %a39, align 8 - %41 = load double, ptr %a39, align 8 - call void (ptr, ...) @printf(ptr @.str.5, double %41) - br label %loop.cond35 - -loop.exit41: ; preds = %loop.cond35 - store i64 3, ptr %.anon42, align 8 - br label %loop.cond43 - -loop.cond43: ; preds = %loop.body45, %loop.exit41 - %42 = load i64, ptr %.anon42, align 8 - %gt44 = icmp ugt i64 %42, 0 - br i1 %gt44, label %loop.body45, label %loop.exit49 - -loop.body45: ; preds = %loop.cond43 - %43 = load i64, ptr %.anon42, align 8 - %sub46 = sub i64 %43, 1 - store i64 %sub46, ptr %.anon42, align 8 - %44 = load <3 x float>, ptr %foo2, align 16 - %45 = load i64, ptr %.anon42, align 8 - %46 = extractelement <3 x float> %44, i64 %45 - store float %46, ptr %a47, align 4 - %47 = load float, ptr %a47, align 4 - %fpfpext48 = fpext float %47 to double - call void (ptr, ...) @printf(ptr @.str.6, double %fpfpext48) - br label %loop.cond43 - -loop.exit49: ; preds = %loop.cond43 - store i64 3, ptr %.anon50, align 8 - br label %loop.cond51 - -loop.cond51: ; preds = %loop.body53, %loop.exit49 - %48 = load i64, ptr %.anon50, align 8 - %gt52 = icmp ugt i64 %48, 0 - br i1 %gt52, label %loop.body53, label %loop.exit58 - -loop.body53: ; preds = %loop.cond51 - %49 = load i64, ptr %.anon50, align 8 - %sub54 = sub i64 %49, 1 - store i64 %sub54, ptr %.anon50, align 8 - %50 = load i64, ptr %.anon50, align 8 - %51 = getelementptr inbounds <3 x float>, ptr %foo2, i64 0, i64 %50 - store ptr %51, ptr %a55, align 8 - %52 = load ptr, ptr %a55, align 8 - %53 = load float, ptr %52, align 8 - %fmul56 = fmul float %53, 2.000000e+00 - store float %fmul56, ptr %52, align 8 - %54 = load ptr, ptr %a55, align 8 - %55 = load float, ptr %54, align 8 - %fpfpext57 = fpext float %55 to double - call void (ptr, ...) @printf(ptr @.str.7, double %fpfpext57) - br label %loop.cond51 - -loop.exit58: ; preds = %loop.cond51 - store i64 3, ptr %.anon59, align 8 - br label %loop.cond60 - -loop.cond60: ; preds = %loop.body62, %loop.exit58 - %56 = load i64, ptr %.anon59, align 8 - %gt61 = icmp ugt i64 %56, 0 - br i1 %gt61, label %loop.body62, label %loop.exit67 - -loop.body62: ; preds = %loop.cond60 - %57 = load i64, ptr %.anon59, align 8 - %sub63 = sub i64 %57, 1 - store i64 %sub63, ptr %.anon59, align 8 - %58 = load i64, ptr %.anon59, align 8 - store i64 %58, ptr %i64, align 8 - %59 = load <3 x float>, ptr %foo2, align 16 - %60 = load i64, ptr %.anon59, align 8 - %61 = extractelement <3 x float> %59, i64 %60 - store float %61, ptr %a65, align 4 - %62 = load i64, ptr %i64, align 8 - %63 = load float, ptr %a65, align 4 - %fpfpext66 = fpext float %63 to double - call void (ptr, ...) @printf(ptr @.str.8, i64 %62, double %fpfpext66) - br label %loop.cond60 - -loop.exit67: ; preds = %loop.cond60 - store i64 3, ptr %.anon68, align 8 - br label %loop.cond69 - -loop.cond69: ; preds = %loop.body71, %loop.exit67 - %64 = load i64, ptr %.anon68, align 8 - %gt70 = icmp ugt i64 %64, 0 - br i1 %gt70, label %loop.body71, label %loop.exit78 - -loop.body71: ; preds = %loop.cond69 - %65 = load i64, ptr %.anon68, align 8 - %sub72 = sub i64 %65, 1 - store i64 %sub72, ptr %.anon68, align 8 - %66 = load i64, ptr %.anon68, align 8 - %ztrunc74 = trunc i64 %66 to i8 - store i8 %ztrunc74, ptr %i73, align 1 - %67 = load <3 x float>, ptr %foo2, align 16 - %68 = load i64, ptr %.anon68, align 8 - %69 = extractelement <3 x float> %67, i64 %68 - %fpfpext76 = fpext float %69 to double - store double %fpfpext76, ptr %a75, align 8 - %70 = load i8, ptr %i73, align 1 - %uisiext77 = zext i8 %70 to i32 - %71 = load double, ptr %a75, align 8 - call void (ptr, ...) @printf(ptr @.str.9, i32 %uisiext77, double %71) - br label %loop.cond69 - -loop.exit78: ; preds = %loop.cond69 - store i64 3, ptr %.anon79, align 8 - br label %loop.cond80 - -loop.cond80: ; preds = %loop.body82, %loop.exit78 - %72 = load i64, ptr %.anon79, align 8 - %gt81 = icmp ugt i64 %72, 0 - br i1 %gt81, label %loop.body82, label %loop.exit86 - -loop.body82: ; preds = %loop.cond80 - %73 = load i64, ptr %.anon79, align 8 - %sub83 = sub i64 %73, 1 - store i64 %sub83, ptr %.anon79, align 8 - %74 = load <3 x float>, ptr %foo2, align 16 - %75 = load i64, ptr %.anon79, align 8 - %76 = extractelement <3 x float> %74, i64 %75 - %fpfpext85 = fpext float %76 to double - store double %fpfpext85, ptr %a84, align 8 - %77 = load double, ptr %a84, align 8 - call void (ptr, ...) @printf(ptr @.str.10, double %77) - br label %loop.cond80 - -loop.exit86: ; preds = %loop.cond80 - ret void -} diff --git a/test/test_suite2/statements/foreach_r_custom.c3t b/test/test_suite2/statements/foreach_r_custom.c3t deleted file mode 100644 index 9540756fa..000000000 --- a/test/test_suite2/statements/foreach_r_custom.c3t +++ /dev/null @@ -1,92 +0,0 @@ -// #target: macos-x64 - -module test; -struct Foo -{ - int[] x; -} - -macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) -{ - return foo.x[index]; -} - -macro usz Foo.@operator_len(Foo &foo) @operator(len) -{ - return foo.x.len; -} - -fn void main() -{ - int[*] i = { 1, 3, 10 }; - Foo x = { &i }; - foreach_r FOO: (int f : x) { - printf("%d\n", f); - while (1) - { - break FOO; - } - } -} - -extern fn int printf(char *fmt, ...); - -/* #expect: test.ll - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %i = alloca [3 x i32], align 4 - %x = alloca %Foo, align 8 - %.anon = alloca i64, align 8 - %f = alloca i32, align 4 - %index = alloca i64, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %1 = insertvalue %"int[]" undef, ptr %i, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - store %"int[]" %2, ptr %0, align 8 - %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %entry - %6 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 %6, 0 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %7 = load i64, ptr %.anon, align 8 - %sub = sub i64 %7, 1 - store i64 %sub, ptr %.anon, align 8 - %8 = load i64, ptr %.anon, align 8 - store i64 %8, ptr %index, align 8 - %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 - %11 = load ptr, ptr %10, align 8 - %12 = load i64, ptr %index, align 8 - %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 - %13 = load i32, ptr %ptroffset, align 4 - store i32 %13, ptr %f, align 4 - %14 = load i32, ptr %f, align 4 - %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) - br label %loop.body1 - -loop.body1: ; preds = %loop.body - br label %loop.exit - -loop.exit: ; preds = %loop.body1, %loop.cond - ret void -} - -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @test_main() - ret i32 0 -} diff --git a/test/test_suite2/statements/foreach_r_custom_macro.c3t b/test/test_suite2/statements/foreach_r_custom_macro.c3t deleted file mode 100644 index 7133b7456..000000000 --- a/test/test_suite2/statements/foreach_r_custom_macro.c3t +++ /dev/null @@ -1,91 +0,0 @@ -// #target: macos-x64 -module test; -struct Foo -{ - int[] x; -} - -macro int Foo.@operator_element_at(Foo &foo, usz index) @operator([]) -{ - return foo.x[index]; -} - -macro usz Foo.@operator_len(Foo &foo) @operator(len) -{ - return foo.x.len; -} - -fn void main() -{ - int[*] i = { 1, 3, 10 }; - Foo x = { &i }; - foreach_r FOO: (int f : x) { - printf("%d\n", f); - while (1) - { - break FOO; - } - } -} - -extern fn int printf(char *fmt, ...); - -/* #expect: test.ll - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %i = alloca [3 x i32], align 4 - %x = alloca %Foo, align 8 - %.anon = alloca i64, align 8 - %f = alloca i32, align 4 - %index = alloca i64, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %i, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %1 = insertvalue %"int[]" undef, ptr %i, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - store %"int[]" %2, ptr %0, align 8 - %3 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %4 = getelementptr inbounds %"int[]", ptr %3, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %entry - %6 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 %6, 0 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %7 = load i64, ptr %.anon, align 8 - %sub = sub i64 %7, 1 - store i64 %sub, ptr %.anon, align 8 - %8 = load i64, ptr %.anon, align 8 - store i64 %8, ptr %index, align 8 - %9 = getelementptr inbounds %Foo, ptr %x, i32 0, i32 0 - %10 = getelementptr inbounds %"int[]", ptr %9, i32 0, i32 0 - %11 = load ptr, ptr %10, align 8 - %12 = load i64, ptr %index, align 8 - %ptroffset = getelementptr inbounds i32, ptr %11, i64 %12 - %13 = load i32, ptr %ptroffset, align 4 - store i32 %13, ptr %f, align 4 - %14 = load i32, ptr %f, align 4 - %15 = call i32 (ptr, ...) @printf(ptr @.str, i32 %14) - br label %loop.body1 - -loop.body1: ; preds = %loop.body - br label %loop.exit - -loop.exit: ; preds = %loop.body1, %loop.cond - ret void -} - -; Function Attrs: nounwind -declare i32 @printf(ptr, ...) #0 - -; Function Attrs: nounwind -define i32 @main(i32 %0, ptr %1) #0 { -entry: - call void @test_main() - ret i32 0 -} diff --git a/test/test_suite2/stdlib/map.c3t b/test/test_suite2/stdlib/map.c3t deleted file mode 100644 index 5fc5af981..000000000 --- a/test/test_suite2/stdlib/map.c3t +++ /dev/null @@ -1,406 +0,0 @@ -// #target: macos-x64 - -module test; -import std::io; -import std::map; - -struct Foo { int x; void* bar; } - -define IntFooMap = std::map::HashMap; -define IntDoubleMap = std::map::HashMap; - -fn char[] Foo.to_string(Foo* foo, Allocator* allocator = mem::current_allocator()) -{ - VarString s = string::new_with_capacity(128, allocator); - s.printf("{%s, %p}", foo.x, foo.bar); - return s.str(); -} - -static initialize -{ - io::formatter_register_type(Foo); -} - -fn void main() -{ - IntFooMap map; - map.init(); - io::printfln("Map size: %d", map.count); - map.set(1, Foo { 1, null }); - io::printfln("Map size: %d", map.count); - map.set(1, Foo { 2, null }); - io::printfln("Map size: %d", map.count); - io::printfln("Val: %d", map.get(1).x); - io::printfln("Has 1: %s", map.has_key(1)); - io::printfln("Has 2: %s", map.has_key(2)); - map.set(7, Foo { 4, null }); - io::printfln("Values: %s", map.value_list()); - IntDoubleMap map2; - map2.init(); - map2.set(4, 1.3); - io::printfln("Map find: %s", map2.has_value(1.3)); - io::printfln("Map find: %s", map2.has_value(1.2)); - map2.set(100, 3.4); - io::printfln("%s", map2.key_list()); - io::printfln("%s", map2.value_list()); - @pool() - { - IntDoubleMap map3; - map3.init(); - map3.set(5, 3.2); - map3.set(7, 5.2); - io::printfln("%s", map3.key_list()); - }; -} - -/* #expect: test.ll - -@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @.static_initialize.0, ptr null }] - -define internal void @.static_initialize.0() { -entry: - %0 = load i64, ptr getelementptr inbounds (%"Entry*[]", ptr @std_io_tostring_functions, i32 0, i32 1), align 8 - %not = icmp eq i64 %0, 0 - br i1 %not, label %if.then, label %if.exit - -if.then: ; preds = %entry - %1 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - call void @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_init"(ptr @std_io_tostring_functions, i32 512, float 7.500000e-01, ptr %1) - br label %if.exit - -if.exit: ; preds = %if.then, %entry - %2 = call i8 @"std_map$$typeid.p$std_io$ToStringFunction_HashMap_set"(ptr @std_io_tostring_functions, i64 ptrtoint (ptr @"ct$test_Foo" to i64), ptr @test_Foo_to_string) - ret void -} - -define { ptr, i64 } @test_Foo_to_string(ptr %0, ptr %1) #0 { -entry: - %s = alloca ptr, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [2 x %variant], align 16 - %result = alloca %"char[]", align 8 - %2 = call ptr @std_core_string_new_with_capacity(i64 128, ptr %1) - store ptr %2, ptr %s, align 8 - %3 = getelementptr inbounds %Foo, ptr %0, i32 0, i32 0 - %4 = insertvalue %variant undef, ptr %3, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %6 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %5, ptr %6, align 16 - %7 = getelementptr inbounds %Foo, ptr %0, i32 0, i32 1 - %8 = insertvalue %variant undef, ptr %7, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$p$void" to i64), 1 - %10 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1 - store %variant %9, ptr %10, align 16 - %11 = call i64 @std_core_string_VarString_printf(ptr %retparam, ptr %s, ptr @.str.12, i64 8, ptr %varargslots, i64 2) - %not_err = icmp eq i64 %11, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %12 = load ptr, ptr %s, align 8 - %13 = call { ptr, i64 } @std_core_string_VarString_str(ptr %12) - store { ptr, i64 } %13, ptr %result, align 8 - %14 = load { ptr, i64 }, ptr %result, align 8 - ret { ptr, i64 } %14 -} - -; Function Attrs: nounwind -define void @test_main() #0 { -entry: - %map = alloca %HashMap.0, align 8 - %retparam = alloca i64, align 8 - %varargslots = alloca [1 x %variant], align 16 - %literal = alloca %Foo, align 8 - %retparam1 = alloca i64, align 8 - %varargslots2 = alloca [1 x %variant], align 16 - %literal6 = alloca %Foo, align 8 - %retparam9 = alloca i64, align 8 - %varargslots10 = alloca [1 x %variant], align 16 - %retparam14 = alloca i64, align 8 - %varargslots15 = alloca [1 x %variant], align 16 - %retparam16 = alloca %Foo, align 8 - %retparam22 = alloca i64, align 8 - %varargslots23 = alloca [1 x %variant], align 16 - %taddr = alloca i8, align 1 - %retparam27 = alloca i64, align 8 - %varargslots28 = alloca [1 x %variant], align 16 - %taddr29 = alloca i8, align 1 - %literal33 = alloca %Foo, align 8 - %retparam36 = alloca i64, align 8 - %varargslots37 = alloca [1 x %variant], align 16 - %result = alloca %"Foo[]", align 8 - %map2 = alloca %HashMap.3, align 8 - %retparam41 = alloca i64, align 8 - %varargslots42 = alloca [1 x %variant], align 16 - %taddr43 = alloca i8, align 1 - %retparam47 = alloca i64, align 8 - %varargslots48 = alloca [1 x %variant], align 16 - %taddr49 = alloca i8, align 1 - %retparam53 = alloca i64, align 8 - %varargslots54 = alloca [1 x %variant], align 16 - %result55 = alloca %"int[]", align 8 - %retparam59 = alloca i64, align 8 - %varargslots60 = alloca [1 x %variant], align 16 - %result61 = alloca %"double[]", align 8 - %temp = alloca ptr, align 8 - %error_var = alloca i64, align 8 - %retparam65 = alloca ptr, align 8 - %mark = alloca i64, align 8 - %map3 = alloca %HashMap.3, align 8 - %retparam68 = alloca i64, align 8 - %varargslots69 = alloca [1 x %variant], align 16 - %result70 = alloca %"int[]", align 8 - call void @llvm.memset.p0.i64(ptr align 8 %map, i8 0, i64 40, i1 false) - %0 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - call void @"std_map$$int.test_Foo_HashMap_init"(ptr %map, i32 16, float 7.500000e-01, ptr %0) - %1 = getelementptr inbounds %HashMap.0, ptr %map, i32 0, i32 2 - %2 = insertvalue %variant undef, ptr %1, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %4 = getelementptr inbounds [1 x %variant], ptr %varargslots, i64 0, i64 0 - store %variant %3, ptr %4, align 16 - %5 = call i64 @std_io_printfln(ptr %retparam, ptr @.str, i64 12, ptr %varargslots, i64 1) - %not_err = icmp eq i64 %5, 0 - br i1 %not_err, label %after_check, label %voiderr - -after_check: ; preds = %entry - br label %voiderr - -voiderr: ; preds = %after_check, %entry - %6 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 0 - store i32 1, ptr %6, align 8 - %7 = getelementptr inbounds %Foo, ptr %literal, i32 0, i32 1 - store ptr null, ptr %7, align 8 - %8 = getelementptr inbounds { i64, ptr }, ptr %literal, i32 0, i32 0 - %lo = load i64, ptr %8, align 8 - %9 = getelementptr inbounds { i64, ptr }, ptr %literal, i32 0, i32 1 - %hi = load ptr, ptr %9, align 8 - %10 = call i8 @"std_map$$int.test_Foo_HashMap_set"(ptr %map, i32 1, i64 %lo, ptr %hi) - %11 = getelementptr inbounds %HashMap.0, ptr %map, i32 0, i32 2 - %12 = insertvalue %variant undef, ptr %11, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %14 = getelementptr inbounds [1 x %variant], ptr %varargslots2, i64 0, i64 0 - store %variant %13, ptr %14, align 16 - %15 = call i64 @std_io_printfln(ptr %retparam1, ptr @.str.1, i64 12, ptr %varargslots2, i64 1) - %not_err3 = icmp eq i64 %15, 0 - br i1 %not_err3, label %after_check4, label %voiderr5 - -after_check4: ; preds = %voiderr - br label %voiderr5 - -voiderr5: ; preds = %after_check4, %voiderr - %16 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 0 - store i32 2, ptr %16, align 8 - %17 = getelementptr inbounds %Foo, ptr %literal6, i32 0, i32 1 - store ptr null, ptr %17, align 8 - %18 = getelementptr inbounds { i64, ptr }, ptr %literal6, i32 0, i32 0 - %lo7 = load i64, ptr %18, align 8 - %19 = getelementptr inbounds { i64, ptr }, ptr %literal6, i32 0, i32 1 - %hi8 = load ptr, ptr %19, align 8 - %20 = call i8 @"std_map$$int.test_Foo_HashMap_set"(ptr %map, i32 1, i64 %lo7, ptr %hi8) - %21 = getelementptr inbounds %HashMap.0, ptr %map, i32 0, i32 2 - %22 = insertvalue %variant undef, ptr %21, 0 - %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$uint" to i64), 1 - %24 = getelementptr inbounds [1 x %variant], ptr %varargslots10, i64 0, i64 0 - store %variant %23, ptr %24, align 16 - %25 = call i64 @std_io_printfln(ptr %retparam9, ptr @.str.2, i64 12, ptr %varargslots10, i64 1) - %not_err11 = icmp eq i64 %25, 0 - br i1 %not_err11, label %after_check12, label %voiderr13 - -after_check12: ; preds = %voiderr5 - br label %voiderr13 - -voiderr13: ; preds = %after_check12, %voiderr5 - %26 = call i64 @"std_map$$int.test_Foo_HashMap_get"(ptr %retparam16, ptr %map, i32 1) - %not_err17 = icmp eq i64 %26, 0 - br i1 %not_err17, label %after_check18, label %voiderr21 - -after_check18: ; preds = %voiderr13 - %27 = getelementptr inbounds %Foo, ptr %retparam16, i32 0, i32 0 - %28 = insertvalue %variant undef, ptr %27, 0 - %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$int" to i64), 1 - %30 = getelementptr inbounds [1 x %variant], ptr %varargslots15, i64 0, i64 0 - store %variant %29, ptr %30, align 16 - %31 = call i64 @std_io_printfln(ptr %retparam14, ptr @.str.3, i64 7, ptr %varargslots15, i64 1) - %not_err19 = icmp eq i64 %31, 0 - br i1 %not_err19, label %after_check20, label %voiderr21 - -after_check20: ; preds = %after_check18 - br label %voiderr21 - -voiderr21: ; preds = %after_check20, %after_check18, %voiderr13 - %32 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(ptr %map, i32 1) - store i8 %32, ptr %taddr, align 1 - %33 = insertvalue %variant undef, ptr %taddr, 0 - %34 = insertvalue %variant %33, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %35 = getelementptr inbounds [1 x %variant], ptr %varargslots23, i64 0, i64 0 - store %variant %34, ptr %35, align 16 - %36 = call i64 @std_io_printfln(ptr %retparam22, ptr @.str.4, i64 9, ptr %varargslots23, i64 1) - %not_err24 = icmp eq i64 %36, 0 - br i1 %not_err24, label %after_check25, label %voiderr26 - -after_check25: ; preds = %voiderr21 - br label %voiderr26 - -voiderr26: ; preds = %after_check25, %voiderr21 - %37 = call i8 @"std_map$$int.test_Foo_HashMap_has_key"(ptr %map, i32 2) - store i8 %37, ptr %taddr29, align 1 - %38 = insertvalue %variant undef, ptr %taddr29, 0 - %39 = insertvalue %variant %38, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %40 = getelementptr inbounds [1 x %variant], ptr %varargslots28, i64 0, i64 0 - store %variant %39, ptr %40, align 16 - %41 = call i64 @std_io_printfln(ptr %retparam27, ptr @.str.5, i64 9, ptr %varargslots28, i64 1) - %not_err30 = icmp eq i64 %41, 0 - br i1 %not_err30, label %after_check31, label %voiderr32 - -after_check31: ; preds = %voiderr26 - br label %voiderr32 - -voiderr32: ; preds = %after_check31, %voiderr26 - %42 = getelementptr inbounds %Foo, ptr %literal33, i32 0, i32 0 - store i32 4, ptr %42, align 8 - %43 = getelementptr inbounds %Foo, ptr %literal33, i32 0, i32 1 - store ptr null, ptr %43, align 8 - %44 = getelementptr inbounds { i64, ptr }, ptr %literal33, i32 0, i32 0 - %lo34 = load i64, ptr %44, align 8 - %45 = getelementptr inbounds { i64, ptr }, ptr %literal33, i32 0, i32 1 - %hi35 = load ptr, ptr %45, align 8 - %46 = call i8 @"std_map$$int.test_Foo_HashMap_set"(ptr %map, i32 7, i64 %lo34, ptr %hi35) - %47 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - %48 = call { ptr, i64 } @"std_map$$int.test_Foo_HashMap_value_list"(ptr %map, ptr %47) - store { ptr, i64 } %48, ptr %result, align 8 - %49 = insertvalue %variant undef, ptr %result, 0 - %50 = insertvalue %variant %49, i64 ptrtoint (ptr @"ct$sa$test_Foo" to i64), 1 - %51 = getelementptr inbounds [1 x %variant], ptr %varargslots37, i64 0, i64 0 - store %variant %50, ptr %51, align 16 - %52 = call i64 @std_io_printfln(ptr %retparam36, ptr @.str.6, i64 10, ptr %varargslots37, i64 1) - %not_err38 = icmp eq i64 %52, 0 - br i1 %not_err38, label %after_check39, label %voiderr40 - -after_check39: ; preds = %voiderr32 - br label %voiderr40 - -voiderr40: ; preds = %after_check39, %voiderr32 - call void @llvm.memset.p0.i64(ptr align 8 %map2, i8 0, i64 40, i1 false) - %53 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - call void @"std_map$$int.double_HashMap_init"(ptr %map2, i32 16, float 7.500000e-01, ptr %53) - %54 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map2, i32 4, double 1.300000e+00) - %55 = call i8 @"std_map$$int.double_HashMap_has_value"(ptr %map2, double 1.300000e+00) - store i8 %55, ptr %taddr43, align 1 - %56 = insertvalue %variant undef, ptr %taddr43, 0 - %57 = insertvalue %variant %56, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %58 = getelementptr inbounds [1 x %variant], ptr %varargslots42, i64 0, i64 0 - store %variant %57, ptr %58, align 16 - %59 = call i64 @std_io_printfln(ptr %retparam41, ptr @.str.7, i64 12, ptr %varargslots42, i64 1) - %not_err44 = icmp eq i64 %59, 0 - br i1 %not_err44, label %after_check45, label %voiderr46 - -after_check45: ; preds = %voiderr40 - br label %voiderr46 - -voiderr46: ; preds = %after_check45, %voiderr40 - %60 = call i8 @"std_map$$int.double_HashMap_has_value"(ptr %map2, double 1.200000e+00) - store i8 %60, ptr %taddr49, align 1 - %61 = insertvalue %variant undef, ptr %taddr49, 0 - %62 = insertvalue %variant %61, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - %63 = getelementptr inbounds [1 x %variant], ptr %varargslots48, i64 0, i64 0 - store %variant %62, ptr %63, align 16 - %64 = call i64 @std_io_printfln(ptr %retparam47, ptr @.str.8, i64 12, ptr %varargslots48, i64 1) - %not_err50 = icmp eq i64 %64, 0 - br i1 %not_err50, label %after_check51, label %voiderr52 - -after_check51: ; preds = %voiderr46 - br label %voiderr52 - -voiderr52: ; preds = %after_check51, %voiderr46 - %65 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map2, i32 100, double 3.400000e+00) - %66 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - %67 = call { ptr, i64 } @"std_map$$int.double_HashMap_key_list"(ptr %map2, ptr %66) - store { ptr, i64 } %67, ptr %result55, align 8 - %68 = insertvalue %variant undef, ptr %result55, 0 - %69 = insertvalue %variant %68, i64 ptrtoint (ptr @"ct$sa$int" to i64), 1 - %70 = getelementptr inbounds [1 x %variant], ptr %varargslots54, i64 0, i64 0 - store %variant %69, ptr %70, align 16 - %71 = call i64 @std_io_printfln(ptr %retparam53, ptr @.str.9, i64 2, ptr %varargslots54, i64 1) - %not_err56 = icmp eq i64 %71, 0 - br i1 %not_err56, label %after_check57, label %voiderr58 - -after_check57: ; preds = %voiderr52 - br label %voiderr58 - -voiderr58: ; preds = %after_check57, %voiderr52 - %72 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - %73 = call { ptr, i64 } @"std_map$$int.double_HashMap_value_list"(ptr %map2, ptr %72) - store { ptr, i64 } %73, ptr %result61, align 8 - %74 = insertvalue %variant undef, ptr %result61, 0 - %75 = insertvalue %variant %74, i64 ptrtoint (ptr @"ct$sa$double" to i64), 1 - %76 = getelementptr inbounds [1 x %variant], ptr %varargslots60, i64 0, i64 0 - store %variant %75, ptr %76, align 16 - %77 = call i64 @std_io_printfln(ptr %retparam59, ptr @.str.10, i64 2, ptr %varargslots60, i64 1) - %not_err62 = icmp eq i64 %77, 0 - br i1 %not_err62, label %after_check63, label %voiderr64 - -after_check63: ; preds = %voiderr58 - br label %voiderr64 - -voiderr64: ; preds = %after_check63, %voiderr58 - %78 = load ptr, ptr @std_core_mem_thread_temp_allocator, align 8 - %not = icmp eq ptr %78, null - br i1 %not, label %if.then, label %if.exit - -if.then: ; preds = %voiderr64 - %79 = call i64 @std_core_mem_allocator_new_temp(ptr %retparam65, i64 131072, ptr @std_core_mem_allocator__SYSTEM_ALLOCATOR) - %not_err66 = icmp eq i64 %79, 0 - br i1 %not_err66, label %after_check67, label %assign_optional - -assign_optional: ; preds = %if.then - store i64 %79, ptr %error_var, align 8 - br label %panic_block - -after_check67: ; preds = %if.then - %80 = load ptr, ptr %retparam65, align 8 - br label %noerr_block - -panic_block: ; preds = %assign_optional - %81 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %81(ptr @.panic_msg, i64 27, ptr @.file, i64 6, ptr @.func, i64 4, - unreachable - -noerr_block: ; preds = %after_check67 - store ptr %80, ptr @std_core_mem_thread_temp_allocator, align 8 - br label %if.exit - -if.exit: ; preds = %noerr_block, %voiderr64 - %82 = load ptr, ptr @std_core_mem_thread_temp_allocator, align 8 - store ptr %82, ptr %temp, align 8 - %83 = load ptr, ptr %temp, align 8 - %84 = getelementptr inbounds %TempAllocator, ptr %83, i32 0, i32 3 - %85 = load i64, ptr %84, align 8 - store i64 %85, ptr %mark, align 8 - call void @llvm.memset.p0.i64(ptr align 8 %map3, i8 0, i64 40, i1 false) - %86 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - call void @"std_map$$int.double_HashMap_init"(ptr %map3, i32 16, float 7.500000e-01, ptr %86) - %87 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map3, i32 5, double 3.200000e+00) - %88 = call i8 @"std_map$$int.double_HashMap_set"(ptr %map3, i32 7, double 5.200000e+00) - %89 = load ptr, ptr @std_core_mem_thread_allocator, align 8 - %90 = call { ptr, i64 } @"std_map$$int.double_HashMap_key_list"(ptr %map3, ptr %89) - store { ptr, i64 } %90, ptr %result70, align 8 - %91 = insertvalue %variant undef, ptr %result70, 0 - %92 = insertvalue %variant %91, i64 ptrtoint (ptr @"ct$sa$int" to i64), 1 - %93 = getelementptr inbounds [1 x %variant], ptr %varargslots69, i64 0, i64 0 - store %variant %92, ptr %93, align 16 - %94 = call i64 @std_io_printfln(ptr %retparam68, ptr @.str.11, i64 2, ptr %varargslots69, i64 1) - %not_err71 = icmp eq i64 %94, 0 - br i1 %not_err71, label %after_check72, label %voiderr73 - -after_check72: ; preds = %if.exit - br label %voiderr73 - -voiderr73: ; preds = %after_check72, %if.exit - %95 = load ptr, ptr %temp, align 8 - %96 = getelementptr inbounds %TempAllocator, ptr %95, i32 0, i32 0 - %97 = load i64, ptr %mark, align 8 - call void @std_core_mem_allocator_Allocator_reset(ptr %96, i64 %97) - ret void -} diff --git a/test/test_suite2/stdlib/memcomp.c3t b/test/test_suite2/stdlib/memcomp.c3t deleted file mode 100644 index 4a8cfb9a3..000000000 --- a/test/test_suite2/stdlib/memcomp.c3t +++ /dev/null @@ -1,16 +0,0 @@ -// #target: macos-x64 -module test; -import std::io; -import libc; - -fn void main() -{ - int[] ab = { 3, 5, 6, 10, 0x0b2399 }; - int[] cd = { 3, 5, 6, 10, 0x0b2399 }; - char[] x = "hello world!"; - char[] y = "hello world?"; - io::printfln("is matching: %s", mem::equals(ab, cd)); - io::printfln("is matching: %s", mem::equals(x, y)); - io::printfln("is matching: %s", mem::equals(x.ptr, y.ptr, x.len)); - io::printfln("is matching: %s", mem::equals(ab.ptr, cd.ptr, ab.len * 4, 4)); -} \ No newline at end of file diff --git a/test/test_suite2/stdlib/minmax.c3 b/test/test_suite2/stdlib/minmax.c3 deleted file mode 100644 index 517d76a24..000000000 --- a/test/test_suite2/stdlib/minmax.c3 +++ /dev/null @@ -1,9 +0,0 @@ -import std::io; - -fn void main() -{ - io::printfln("min(-1, 1) == %s", min(-1, 1)); - io::printfln("max(-1, 1) == %s", max(-1, 1)); - io::printfln("min(-1, 0, 1) == %s", min(-1, 0, 1)); - io::printfln("max(-1, 0, 1) == %s", max(-1, 0, 1)); -} diff --git a/test/test_suite2/stdlib/print_env_defines.c3 b/test/test_suite2/stdlib/print_env_defines.c3 deleted file mode 100644 index e9b704208..000000000 --- a/test/test_suite2/stdlib/print_env_defines.c3 +++ /dev/null @@ -1,15 +0,0 @@ -import std::io; - -fn void main() -{ - io::printfln("LLVM version: %s", env::LLVM_VERSION); - io::printfln("Optimization level: %s", env::COMPILER_OPT_LEVEL); - io::printfln("Safe mode: %s", env::COMPILER_SAFE_MODE); - io::printfln("OS type: %s", env::OS_TYPE); - io::printfln("Big endian: %s", env::BIG_ENDIAN); - io::printfln("i128 support: %s", env::I128_NATIVE_SUPPORT); - io::printfln("f16 support: %s", env::F16_SUPPORT); - io::printfln("f128 support: %s", env::F128_SUPPORT); - io::printfln("Benchmarking: %s", env::BENCHMARKING); - io::printfln("Testing: %s", env::TESTING); -} \ No newline at end of file diff --git a/test/test_suite2/struct/nested_struct_union_init.c3t b/test/test_suite2/struct/nested_struct_union_init.c3t deleted file mode 100644 index 74da5fe7c..000000000 --- a/test/test_suite2/struct/nested_struct_union_init.c3t +++ /dev/null @@ -1,109 +0,0 @@ -// #target: macos-x64 -module foob; -import libc; -struct Matrix2x2 -{ - union - { - float[4] m; - struct { - float m00, m01, m10, m11; - } - } -} - -struct Matrix2x2_b -{ - union - { - struct { - float m00, m01, m10, m11; - } - float[4] m; - } -} -struct Matrix4x4 { - union { - struct { - float m00, m01, m02, m03; - float m10, m11, m12, m13; - float m20, m21, m22, m23; - float m30, m31, m32, m33; - } - float[16] m; - } -} - - -struct Matrix3x3 { - union { - struct { - float m00, m01, m02, m10, m11, m12, m20, m21, m22; - } - float[9] m; - } -} -fn void main() -{ - Matrix3x3 x = { 1, 2, 3, 4, 5, 6, 7,8 ,9}; - Matrix2x2 m = { float[4] { 1, 2, 3, 4 } }; - Matrix2x2_b m2 = { 1, 2, 3, 4 }; - libc::printf("%f %f %f %f\n", x.m00, x.m[1], x.m10, x.m[3]); -} - -/* #expect: foob.ll - -%Matrix2x2 = type { %.anon.1 } -%.anon.1 = type { [4 x float] } -%Matrix2x2_b = type { %.anon.2 } -%.anon.2 = type { %.anon.3 } -%.anon.3 = type { float, float, float, float } -%Matrix3x3 = type { %.anon } -%.anon = type { %.anon.0 } -%.anon.0 = type { float, float, float, float, float, float, float, float, float } - -define void @foob_main() #0 { -entry: - %x = alloca %Matrix3x3, align 4 - %m = alloca %Matrix2x2, align 4 - %m2 = alloca %Matrix2x2_b, align 4 - %0 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 - %1 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 0 - store float 1.000000e+00, ptr %1, align 4 - %2 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 1 - store float 2.000000e+00, ptr %2, align 4 - %3 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 2 - store float 3.000000e+00, ptr %3, align 4 - %4 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 3 - store float 4.000000e+00, ptr %4, align 4 - %5 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 4 - store float 5.000000e+00, ptr %5, align 4 - %6 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 5 - store float 6.000000e+00, ptr %6, align 4 - %7 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 6 - store float 7.000000e+00, ptr %7, align 4 - %8 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 7 - store float 8.000000e+00, ptr %8, align 4 - %9 = getelementptr inbounds %.anon.0, ptr %0, i32 0, i32 8 - store float 9.000000e+00, ptr %9, align 4 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m, ptr align 4 @.__const, i32 16, i1 false) - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %m2, ptr align 4 @.__const.16, i32 16, i1 false) - %10 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 - %11 = getelementptr inbounds %.anon.0, ptr %10, i32 0, i32 0 - %12 = load float, ptr %11, align 4 - %fpfpext = fpext float %12 to double - %13 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 - %14 = getelementptr inbounds [9 x float], ptr %13, i64 0, i64 1 - %15 = load float, ptr %14, align 4 - %fpfpext1 = fpext float %15 to double - %16 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 - %17 = getelementptr inbounds %.anon.0, ptr %16, i32 0, i32 3 - %18 = load float, ptr %17, align 4 - %fpfpext2 = fpext float %18 to double - %19 = getelementptr inbounds %Matrix3x3, ptr %x, i32 0, i32 0 - %20 = getelementptr inbounds [9 x float], ptr %19, i64 0, i64 3 - %21 = load float, ptr %20, align 4 - %fpfpext3 = fpext float %21 to double - %22 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) - ret void -} diff --git a/test/test_suite2/struct/struct_codegen_empty.c3t b/test/test_suite2/struct/struct_codegen_empty.c3t deleted file mode 100644 index 71c59354a..000000000 --- a/test/test_suite2/struct/struct_codegen_empty.c3t +++ /dev/null @@ -1,39 +0,0 @@ -// #target: macos-x64 -struct StructA -{ - int a; -} - -struct StructB -{ - struct b - { - int a; - } -} - -fn void test() -{ - StructA a = {}; - StructA a2; - StructB b = {}; - StructB b2; - StructB b3 = { .b = { } }; -} - -/* #expect: struct_codegen_empty.ll - - define void @struct_codegen_empty_test() #0 { - entry: - %a = alloca %StructA, align 4 - %a2 = alloca %StructA, align 4 - %b = alloca %StructB, align 4 - %b2 = alloca %StructB, align 4 - %b3 = alloca %StructB, align 4 - store i32 0, ptr %a, align 4 - store i32 0, ptr %a2, align 4 - store i32 0, ptr %b, align 4 - store i32 0, ptr %b2, align 4 - store i32 0, ptr %b3, align 4 - ret void - } \ No newline at end of file diff --git a/test/test_suite2/subarrays/slice_offset.c3t b/test/test_suite2/subarrays/slice_offset.c3t deleted file mode 100644 index 5f5a740fd..000000000 --- a/test/test_suite2/subarrays/slice_offset.c3t +++ /dev/null @@ -1,19 +0,0 @@ -fn void test() -{ - int[3] x = { 1, 2, 3 }; - int[] y = x[1..2]; -} - -/* #expect: slice_offset.ll - -define void @slice_offset_test() #0 { -entry: - %x = alloca [3 x i32], align 4 - %y = alloca %"int[]", align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - %1 = insertvalue %"int[]" undef, ptr %0, 0 - %2 = insertvalue %"int[]" %1, i64 2, 1 - store %"int[]" %2, ptr %y, align 8 - ret void -} diff --git a/test/test_suite2/subarrays/slice_offset_neg_end.c3t b/test/test_suite2/subarrays/slice_offset_neg_end.c3t deleted file mode 100644 index a3f8657e1..000000000 --- a/test/test_suite2/subarrays/slice_offset_neg_end.c3t +++ /dev/null @@ -1,20 +0,0 @@ - -fn void test() -{ - int[3] x = { 1, 2, 3 }; - int[] y = x[1..^1]; -} - -/* #expect: slice_offset_neg_end.ll - -define void @slice_offset_neg_end_test() #0 { -entry: - %x = alloca [3 x i32], align 4 - %y = alloca %"int[]", align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - %1 = insertvalue %"int[]" undef, ptr %0, 0 - %2 = insertvalue %"int[]" %1, i64 2, 1 - store %"int[]" %2, ptr %y, align 8 - ret void -} diff --git a/test/test_suite2/subarrays/slice_offset_neg_start.c3t b/test/test_suite2/subarrays/slice_offset_neg_start.c3t deleted file mode 100644 index eb0a54489..000000000 --- a/test/test_suite2/subarrays/slice_offset_neg_start.c3t +++ /dev/null @@ -1,19 +0,0 @@ -fn void test() -{ - int[3] x = { 1, 2, 3 }; - int[] y = x[^2..1]; -} - -/* #expect: slice_offset_neg_start.ll - -define void @slice_offset_neg_start_test() #0 { -entry: - %x = alloca [3 x i32], align 4 - %y = alloca %"int[]", align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 1 - %1 = insertvalue %"int[]" undef, ptr %0, 0 - %2 = insertvalue %"int[]" %1, i64 1, 1 - store %"int[]" %2, ptr %y, align 8 - ret void -} diff --git a/test/test_suite2/subarrays/slice_start.c3t b/test/test_suite2/subarrays/slice_start.c3t deleted file mode 100644 index de9aa96a5..000000000 --- a/test/test_suite2/subarrays/slice_start.c3t +++ /dev/null @@ -1,19 +0,0 @@ -fn void test() -{ - int[3] x = { 1, 2, 3 }; - int[] y = x[..]; -} - -/* #expect: slice_start.ll - -define void @slice_start_test() #0 { -entry: - %x = alloca [3 x i32], align 4 - %y = alloca %"int[]", align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 12, i1 false) - %0 = getelementptr inbounds [3 x i32], ptr %x, i64 0, i64 0 - %1 = insertvalue %"int[]" undef, ptr %0, 0 - %2 = insertvalue %"int[]" %1, i64 3, 1 - store %"int[]" %2, ptr %y, align 8 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/union/union_codegen_empty.c3t b/test/test_suite2/union/union_codegen_empty.c3t deleted file mode 100644 index 7acc48b84..000000000 --- a/test/test_suite2/union/union_codegen_empty.c3t +++ /dev/null @@ -1,44 +0,0 @@ -union UnionA -{ - int a; -} - -union UnionB -{ - struct b - { - int a; - } - int c; - double d; -} - -fn void test() -{ - UnionA a = {}; - UnionA a2; - UnionB b = {}; - UnionB b2; - UnionB b3 = { .b = {} }; - UnionB b4 = { .b.a = 23, .c = 4, .d = 0.4, .b = {} }; -} - -/* #expect: union_codegen_empty.ll - -source_filena -define void @union_codegen_empty_test() #0 { -entry: - %a = alloca %UnionA, align 4 - %a2 = alloca %UnionA, align 4 - %b = alloca %UnionB, align 8 - %b2 = alloca %UnionB, align 8 - %b3 = alloca %UnionB, align 8 - %b4 = alloca %UnionB, align 8 - store i32 0, ptr %a, align 4 - store i32 0, ptr %a2, align 4 - call void @llvm.memset.p0.i64(ptr align 8 %b, i8 0, i64 8, i1 false) - call void @llvm.memset.p0.i64(ptr align 8 %b2, i8 0, i64 8, i1 false) - call void @llvm.memset.p0.i64(ptr align 8 %b3, i8 0, i64 8, i1 false) - call void @llvm.memset.p0.i64(ptr align 8 %b4, i8 0, i64 8, i1 false) - ret void -} \ No newline at end of file diff --git a/test/test_suite2/variant/variant_assign.c3t b/test/test_suite2/variant/variant_assign.c3t deleted file mode 100644 index 9c494ac70..000000000 --- a/test/test_suite2/variant/variant_assign.c3t +++ /dev/null @@ -1,335 +0,0 @@ -// #target: macos-x64 -module foo; - -extern fn void printf(char*, ...); - -fn void test(variant z) -{ - switch (z) - { - case int: - printf("int: %d\n", *z); - case double: - printf("double %f\n", *z); - default: - printf("Unknown type.\n"); - } -} -fn void test2(variant y) -{ - switch (z = y) - { - case int: - y = &&12; - printf("int: %d\n", *z); - case double: - printf("double %f\n", *z); - default: - printf("Unknown type.\n"); - } -} - -fn void test3(variant y) -{ - switch (z = *y) - { - case int: - printf("int: %d\n", z); - case double: - printf("double %f\n", z); - default: - printf("Unknown type.\n"); - } -} - -fn int main() -{ - test(&&123.0); - test(&&1); - test(&&true); - test2(&&123.5); - test2(&&1); - test2(&&true); - test3(&&124.0); - test3(&&2); - test3(&&true); - return 0; -} - -/* #expect: foo.ll - -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - -define void @foo_test(i64 %0, ptr %1) #0 { -entry: - %z = alloca %variant, align 8 - %switch = alloca i64, align 8 - %z1 = alloca ptr, align 8 - %z4 = alloca ptr, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 1 - store ptr %1, ptr %3, align 8 - %4 = getelementptr inbounds %variant, ptr %z, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %switch, align 8 - br label %switch.entry - -switch.entry: ; preds = %entry - %6 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 - br i1 %eq, label %switch.case, label %next_if - -switch.case: ; preds = %switch.entry - %7 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - store ptr %8, ptr %z1, align 8 - %9 = load ptr, ptr %z1, align 8 - %10 = load i32, ptr %9, align 8 - call void (ptr, ...) @printf(ptr @.str, i32 %10) - br label %switch.exit - -next_if: ; preds = %switch.entry - %eq2 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 - br i1 %eq2, label %switch.case3, label %next_if5 - -switch.case3: ; preds = %next_if - %11 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 - %12 = load ptr, ptr %11, align 8 - store ptr %12, ptr %z4, align 8 - %13 = load ptr, ptr %z4, align 8 - %14 = load double, ptr %13, align 8 - call void (ptr, ...) @printf(ptr @.str.1, double %14) - br label %switch.exit - -next_if5: ; preds = %next_if - br label %switch.default - -switch.default: ; preds = %next_if5 - call void (ptr, ...) @printf(ptr @.str.2) - br label %switch.exit - -switch.exit: ; preds = %switch.default, %switch.case3, %switch.case - ret void -} - -define void @foo_test2(i64 %0, ptr %1) #0 { -entry: - %y = alloca %variant, align 8 - %.anon = alloca %variant, align 8 - %switch = alloca i64, align 8 - %z = alloca ptr, align 8 - %taddr = alloca i32, align 4 - %z3 = alloca ptr, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 1 - store ptr %1, ptr %3, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %.anon, ptr align 8 %y, i32 16, i1 false) - %4 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %switch, align 8 - br label %switch.entry - -switch.entry: ; preds = %entry - %6 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 - br i1 %eq, label %switch.case, label %next_if - -switch.case: ; preds = %switch.entry - %7 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - store ptr %8, ptr %z, align 8 - store i32 12, ptr %taddr, align 4 - %9 = insertvalue %variant undef, ptr %taddr, 0 - %10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %10, ptr %y, align 8 - %11 = load ptr, ptr %z, align 8 - %12 = load i32, ptr %11, align 8 - call void (ptr, ...) @printf(ptr @.str.3, i32 %12) - br label %switch.exit - -next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 - br i1 %eq1, label %switch.case2, label %next_if4 - -switch.case2: ; preds = %next_if - %13 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 - %14 = load ptr, ptr %13, align 8 - store ptr %14, ptr %z3, align 8 - %15 = load ptr, ptr %z3, align 8 - %16 = load double, ptr %15, align 8 - call void (ptr, ...) @printf(ptr @.str.4, double %16) - br label %switch.exit - -next_if4: ; preds = %next_if - br label %switch.default - -switch.default: ; preds = %next_if4 - call void (ptr, ...) @printf(ptr @.str.5) - br label %switch.exit - -switch.exit: ; preds = %switch.default, %switch.case2, %switch.case - ret void -} - -define void @foo_test3(i64 %0, ptr %1) #0 { -entry: - %y = alloca %variant, align 8 - %.anon = alloca %variant, align 8 - %switch = alloca i64, align 8 - %z = alloca i32, align 4 - %z3 = alloca double, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %y, i32 0, i32 1 - store ptr %1, ptr %3, align 8 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %.anon, ptr align 8 %y, i32 16, i1 false) - %4 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %switch, align 8 - br label %switch.entry - -switch.entry: ; preds = %entry - %6 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 - br i1 %eq, label %switch.case, label %next_if - -switch.case: ; preds = %switch.entry - %7 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - %9 = load i32, ptr %8, align 8 - store i32 %9, ptr %z, align 4 - %10 = load i32, ptr %z, align 4 - call void (ptr, ...) @printf(ptr @.str.6, i32 %10) - br label %switch.exit - -next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 - br i1 %eq1, label %switch.case2, label %next_if4 - -switch.case2: ; preds = %next_if - %11 = getelementptr inbounds %variant, ptr %.anon, i32 0, i32 0 - %12 = load ptr, ptr %11, align 8 - %13 = load double, ptr %12, align 8 - store double %13, ptr %z3, align 8 - %14 = load double, ptr %z3, align 8 - call void (ptr, ...) @printf(ptr @.str.7, double %14) - br label %switch.exit - -next_if4: ; preds = %next_if - br label %switch.default - -switch.default: ; preds = %next_if4 - call void (ptr, ...) @printf(ptr @.str.8) - br label %switch.exit - -switch.exit: ; preds = %switch.default, %switch.case2, %switch.case - ret void -} - -define i32 @main() #0 { -entry: - %taddr = alloca double, align 8 - %taddr1 = alloca %variant, align 8 - %taddr2 = alloca i32, align 4 - %taddr3 = alloca %variant, align 8 - %taddr6 = alloca i8, align 1 - %taddr7 = alloca %variant, align 8 - %taddr10 = alloca double, align 8 - %taddr11 = alloca %variant, align 8 - %taddr14 = alloca i32, align 4 - %taddr15 = alloca %variant, align 8 - %taddr18 = alloca i8, align 1 - %taddr19 = alloca %variant, align 8 - %taddr22 = alloca double, align 8 - %taddr23 = alloca %variant, align 8 - %taddr26 = alloca i32, align 4 - %taddr27 = alloca %variant, align 8 - %taddr30 = alloca i8, align 1 - %taddr31 = alloca %variant, align 8 - store double 1.230000e+02, ptr %taddr, align 8 - %0 = insertvalue %variant undef, ptr %taddr, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$double" to i64), 1 - store %variant %1, ptr %taddr1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 0 - %lo = load i64, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 1 - %hi = load ptr, ptr %3, align 8 - call void @foo_test(i64 %lo, ptr %hi) - store i32 1, ptr %taddr2, align 4 - %4 = insertvalue %variant undef, ptr %taddr2, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %5, ptr %taddr3, align 8 - %6 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 0 - %lo4 = load i64, ptr %6, align 8 - %7 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 1 - %hi5 = load ptr, ptr %7, align 8 - call void @foo_test(i64 %lo4, ptr %hi5) - store i8 1, ptr %taddr6, align 1 - %8 = insertvalue %variant undef, ptr %taddr6, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - store %variant %9, ptr %taddr7, align 8 - %10 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 0 - %lo8 = load i64, ptr %10, align 8 - %11 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 1 - %hi9 = load ptr, ptr %11, align 8 - call void @foo_test(i64 %lo8, ptr %hi9) - store double 1.235000e+02, ptr %taddr10, align 8 - %12 = insertvalue %variant undef, ptr %taddr10, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$double" to i64), 1 - store %variant %13, ptr %taddr11, align 8 - %14 = getelementptr inbounds { i64, ptr }, ptr %taddr11, i32 0, i32 0 - %lo12 = load i64, ptr %14, align 8 - %15 = getelementptr inbounds { i64, ptr }, ptr %taddr11, i32 0, i32 1 - %hi13 = load ptr, ptr %15, align 8 - call void @foo_test2(i64 %lo12, ptr %hi13) - store i32 1, ptr %taddr14, align 4 - %16 = insertvalue %variant undef, ptr %taddr14, 0 - %17 = insertvalue %variant %16, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %17, ptr %taddr15, align 8 - %18 = getelementptr inbounds { i64, ptr }, ptr %taddr15, i32 0, i32 0 - %lo16 = load i64, ptr %18, align 8 - %19 = getelementptr inbounds { i64, ptr }, ptr %taddr15, i32 0, i32 1 - %hi17 = load ptr, ptr %19, align 8 - call void @foo_test2(i64 %lo16, ptr %hi17) - store i8 1, ptr %taddr18, align 1 - %20 = insertvalue %variant undef, ptr %taddr18, 0 - %21 = insertvalue %variant %20, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - store %variant %21, ptr %taddr19, align 8 - %22 = getelementptr inbounds { i64, ptr }, ptr %taddr19, i32 0, i32 0 - %lo20 = load i64, ptr %22, align 8 - %23 = getelementptr inbounds { i64, ptr }, ptr %taddr19, i32 0, i32 1 - %hi21 = load ptr, ptr %23, align 8 - call void @foo_test2(i64 %lo20, ptr %hi21) - store double 1.240000e+02, ptr %taddr22, align 8 - %24 = insertvalue %variant undef, ptr %taddr22, 0 - %25 = insertvalue %variant %24, i64 ptrtoint (ptr @"ct$double" to i64), 1 - store %variant %25, ptr %taddr23, align 8 - %26 = getelementptr inbounds { i64, ptr }, ptr %taddr23, i32 0, i32 0 - %lo24 = load i64, ptr %26, align 8 - %27 = getelementptr inbounds { i64, ptr }, ptr %taddr23, i32 0, i32 1 - %hi25 = load ptr, ptr %27, align 8 - call void @foo_test3(i64 %lo24, ptr %hi25) - store i32 2, ptr %taddr26, align 4 - %28 = insertvalue %variant undef, ptr %taddr26, 0 - %29 = insertvalue %variant %28, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %29, ptr %taddr27, align 8 - %30 = getelementptr inbounds { i64, ptr }, ptr %taddr27, i32 0, i32 0 - %lo28 = load i64, ptr %30, align 8 - %31 = getelementptr inbounds { i64, ptr }, ptr %taddr27, i32 0, i32 1 - %hi29 = load ptr, ptr %31, align 8 - call void @foo_test3(i64 %lo28, ptr %hi29) - store i8 1, ptr %taddr30, align 1 - %32 = insertvalue %variant undef, ptr %taddr30, 0 - %33 = insertvalue %variant %32, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - store %variant %33, ptr %taddr31, align 8 - %34 = getelementptr inbounds { i64, ptr }, ptr %taddr31, i32 0, i32 0 - %lo32 = load i64, ptr %34, align 8 - %35 = getelementptr inbounds { i64, ptr }, ptr %taddr31, i32 0, i32 1 - %hi33 = load ptr, ptr %35, align 8 - call void @foo_test3(i64 %lo32, ptr %hi33) - ret i32 0 -} diff --git a/test/test_suite2/variant/variant_switch.c3t b/test/test_suite2/variant/variant_switch.c3t deleted file mode 100644 index fdfd3c94c..000000000 --- a/test/test_suite2/variant/variant_switch.c3t +++ /dev/null @@ -1,142 +0,0 @@ -// #target: macos-x64 -module foo; - -extern fn void printf(char*, ...); - -fn void test(variant z) -{ - switch (z) - { - case int: - printf("int: %d\n", *z); - *z = 3; - case double: - printf("double %f\n", *z); - default: - printf("Unknown type.\n"); - } - if (z.type == int.typeid) - { - printf("int: %d\n", *(int*)(z)); - } -} -fn int main() -{ - test(&&123.0); - test(&&1); - test(&&true); - return 0; -} - -/* #expect: foo.ll - -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - -define void @foo_test(i64 %0, ptr %1) #0 { -entry: - %z = alloca %variant, align 8 - %switch = alloca i64, align 8 - %z1 = alloca ptr, align 8 - %z4 = alloca ptr, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %z, i32 0, i32 1 - store ptr %1, ptr %3, align 8 - %4 = getelementptr inbounds %variant, ptr %z, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %switch, align 8 - br label %switch.entry - -switch.entry: ; preds = %entry - %6 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 - br i1 %eq, label %switch.case, label %next_if - -switch.case: ; preds = %switch.entry - %7 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - store ptr %8, ptr %z1, align 8 - %9 = load ptr, ptr %z1, align 8 - %10 = load i32, ptr %9, align 8 - call void (ptr, ...) @printf(ptr @.str, i32 %10) - %11 = load ptr, ptr %z1, align 8 - store i32 3, ptr %11, align 8 - br label %switch.exit - -next_if: ; preds = %switch.entry - %eq2 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 - br i1 %eq2, label %switch.case3, label %next_if5 - -switch.case3: ; preds = %next_if - %12 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 - %13 = load ptr, ptr %12, align 8 - store ptr %13, ptr %z4, align 8 - %14 = load ptr, ptr %z4, align 8 - %15 = load double, ptr %14, align 8 - call void (ptr, ...) @printf(ptr @.str.1, double %15) - br label %switch.exit - -next_if5: ; preds = %next_if - br label %switch.default - -switch.default: ; preds = %next_if5 - call void (ptr, ...) @printf(ptr @.str.2) - br label %switch.exit - -switch.exit: ; preds = %switch.default, %switch.case3, %switch.case - %16 = getelementptr inbounds %variant, ptr %z, i32 0, i32 1 - %17 = load i64, ptr %16, align 8 - %eq6 = icmp eq i64 %17, ptrtoint (ptr @"ct$int" to i64) - br i1 %eq6, label %if.then, label %if.exit - -if.then: ; preds = %switch.exit - %18 = getelementptr inbounds %variant, ptr %z, i32 0, i32 0 - %19 = load ptr, ptr %18, align 8 - %20 = load i32, ptr %19, align 8 - call void (ptr, ...) @printf(ptr @.str.3, i32 %20) - br label %if.exit - -if.exit: ; preds = %if.then, %switch.exit - ret void -} - -; Function Attrs: nounwind -define i32 @main() #0 { -entry: - %taddr = alloca double, align 8 - %taddr1 = alloca %variant, align 8 - %taddr2 = alloca i32, align 4 - %taddr3 = alloca %variant, align 8 - %taddr6 = alloca i8, align 1 - %taddr7 = alloca %variant, align 8 - store double 1.230000e+02, ptr %taddr, align 8 - %0 = insertvalue %variant undef, ptr %taddr, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$double" to i64), 1 - store %variant %1, ptr %taddr1, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 0 - %lo = load i64, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %taddr1, i32 0, i32 1 - %hi = load ptr, ptr %3, align 8 - call void @foo_test(i64 %lo, ptr %hi) - store i32 1, ptr %taddr2, align 4 - %4 = insertvalue %variant undef, ptr %taddr2, 0 - %5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %5, ptr %taddr3, align 8 - %6 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 0 - %lo4 = load i64, ptr %6, align 8 - %7 = getelementptr inbounds { i64, ptr }, ptr %taddr3, i32 0, i32 1 - %hi5 = load ptr, ptr %7, align 8 - call void @foo_test(i64 %lo4, ptr %hi5) - store i8 1, ptr %taddr6, align 1 - %8 = insertvalue %variant undef, ptr %taddr6, 0 - %9 = insertvalue %variant %8, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - store %variant %9, ptr %taddr7, align 8 - %10 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 0 - %lo8 = load i64, ptr %10, align 8 - %11 = getelementptr inbounds { i64, ptr }, ptr %taddr7, i32 0, i32 1 - %hi9 = load ptr, ptr %11, align 8 - call void @foo_test(i64 %lo8, ptr %hi9) - ret i32 0 -} diff --git a/test/test_suite2/variant/variant_test.c3t b/test/test_suite2/variant/variant_test.c3t deleted file mode 100644 index dfdee6d08..000000000 --- a/test/test_suite2/variant/variant_test.c3t +++ /dev/null @@ -1,308 +0,0 @@ -// #target: macos-x64 -module foo; -extern fn void printf(char*, ...); - -fn void test(variant x) -{ - switch (x.type) - { - case int: - printf("Was int\n"); - case double: - printf("Was double\n"); - case variant: - printf("Was variant\n"); - case int*: - printf("Was int*\n"); - default: - printf("Unknown type\n"); - } -} - -fn void test_all(variant... y) -{ - foreach (element : y) - { - test(element); - } -} - -fn void main() -{ - variant x = &&1; - int z; - variant y = &z; - typeid g = y.type; - typeid h = x.type; - if (y.type == int.typeid) - { - printf("y int match\n"); - } - if (x.type == int.typeid) - { - printf("x int match\n"); - } - y = &&1.0; - x = &x; - if (y.type == int.typeid) - { - printf("y int match\n"); - } - if (x.type == int.typeid) - { - printf("x int match\n"); - } - test(x); - test(&&1.0); - test(&&1); - test(&&true); - printf("----\n"); - int* df = null; - test_all(x, x, &&1.0, &x, &df); -} - -/* #expect: foo.ll - -%variant = type { ptr, i64 } -%"variant[]" = type { ptr, i64 } - -@"ct$int" = linkonce constant %.introspect { i8 2, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$double" = linkonce constant %.introspect { i8 4, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$variant" = linkonce constant %.introspect { i8 7, i64 16, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$p$int" = linkonce constant %.introspect { i8 19, i64 8, i64 ptrtoint (ptr @"ct$int" to i64), i64 0, [0 x i64] zeroinitializer }, align 8 -@"ct$bool" = linkonce constant %.introspect { i8 1, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 - -define void @foo_test(i64 %0, ptr %1) #0 { -entry: - %x = alloca %variant, align 8 - %switch = alloca i64, align 8 - %2 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 0 - store i64 %0, ptr %2, align 8 - %3 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 1 - store ptr %1, ptr %3, align 8 - %4 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %switch, align 8 - br label %switch.entry - -switch.entry: ; preds = %entry - %6 = load i64, ptr %switch, align 8 - %eq = icmp eq i64 ptrtoint (ptr @"ct$int" to i64), %6 - br i1 %eq, label %switch.case, label %next_if - -switch.case: ; preds = %switch.entry - call void (ptr, ...) @printf(ptr @.str) - br label %switch.exit - -next_if: ; preds = %switch.entry - %eq1 = icmp eq i64 ptrtoint (ptr @"ct$double" to i64), %6 - br i1 %eq1, label %switch.case2, label %next_if3 - -switch.case2: ; preds = %next_if - call void (ptr, ...) @printf(ptr @.str.1) - br label %switch.exit - -next_if3: ; preds = %next_if - %eq4 = icmp eq i64 ptrtoint (ptr @"ct$variant" to i64), %6 - br i1 %eq4, label %switch.case5, label %next_if6 - -switch.case5: ; preds = %next_if3 - call void (ptr, ...) @printf(ptr @.str.2) - br label %switch.exit - -next_if6: ; preds = %next_if3 - %eq7 = icmp eq i64 ptrtoint (ptr @"ct$p$int" to i64), %6 - br i1 %eq7, label %switch.case8, label %next_if9 - -switch.case8: ; preds = %next_if6 - call void (ptr, ...) @printf(ptr @.str.3) - br label %switch.exit - -next_if9: ; preds = %next_if6 - br label %switch.default - -switch.default: ; preds = %next_if9 - call void (ptr, ...) @printf(ptr @.str.4) - br label %switch.exit - -switch.exit: ; preds = %switch.default, %switch.case8, %switch.case5, %switch.case2, %switch.case - ret void -} - -; Function Attrs: nounwind -define void @foo_test_all(ptr %0, i64 %1) #0 { -entry: - %y = alloca %"variant[]", align 8 - %.anon = alloca i64, align 8 - %.anon1 = alloca i64, align 8 - %element = alloca %variant, align 8 - %2 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 0 - store ptr %0, ptr %2, align 8 - %3 = getelementptr inbounds { ptr, i64 }, ptr %y, i32 0, i32 1 - store i64 %1, ptr %3, align 8 - %4 = getelementptr inbounds %"variant[]", ptr %y, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %.anon, align 8 - store i64 0, ptr %.anon1, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %6 = load i64, ptr %.anon1, align 8 - %7 = load i64, ptr %.anon, align 8 - %lt = icmp ult i64 %6, %7 - br i1 %lt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %8 = getelementptr inbounds %"variant[]", ptr %y, i32 0, i32 0 - %9 = load ptr, ptr %8, align 8 - %10 = load i64, ptr %.anon1, align 8 - %ptroffset = getelementptr inbounds %variant, ptr %9, i64 %10 - call void @llvm.memcpy.p0.p0.i32(ptr align 8 %element, ptr align 8 %ptroffset, i32 16, i1 false) - %11 = getelementptr inbounds { i64, ptr }, ptr %element, i32 0, i32 0 - %lo = load i64, ptr %11, align 8 - %12 = getelementptr inbounds { i64, ptr }, ptr %element, i32 0, i32 1 - %hi = load ptr, ptr %12, align 8 - call void @foo_test(i64 %lo, ptr %hi) - %13 = load i64, ptr %.anon1, align 8 - %add = add i64 %13, 1 - store i64 %add, ptr %.anon1, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - ret void -} - -; Function Attrs: nounwind -define void @foo_main() #0 { -entry: - %x = alloca %variant, align 8 - %taddr = alloca i32, align 4 - %z = alloca i32, align 4 - %y = alloca %variant, align 8 - %g = alloca i64, align 8 - %h = alloca i64, align 8 - %taddr4 = alloca double, align 8 - %taddr11 = alloca double, align 8 - %taddr12 = alloca %variant, align 8 - %taddr15 = alloca i32, align 4 - %taddr16 = alloca %variant, align 8 - %taddr19 = alloca i8, align 1 - %taddr20 = alloca %variant, align 8 - %df = alloca ptr, align 8 - %varargslots = alloca [5 x %variant], align 16 - %taddr23 = alloca double, align 8 - store i32 1, ptr %taddr, align 4 - %0 = insertvalue %variant undef, ptr %taddr, 0 - %1 = insertvalue %variant %0, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %1, ptr %x, align 8 - store i32 0, ptr %z, align 4 - %2 = insertvalue %variant undef, ptr %z, 0 - %3 = insertvalue %variant %2, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %3, ptr %y, align 8 - %4 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 - %5 = load i64, ptr %4, align 8 - store i64 %5, ptr %g, align 8 - %6 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 - %7 = load i64, ptr %6, align 8 - store i64 %7, ptr %h, align 8 - %8 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 - %9 = load i64, ptr %8, align 8 - %eq = icmp eq i64 %9, ptrtoint (ptr @"ct$int" to i64) - br i1 %eq, label %if.then, label %if.exit - -if.then: ; preds = %entry - call void (ptr, ...) @printf(ptr @.str.5) - br label %if.exit - -if.exit: ; preds = %if.then, %entry - %10 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 - %11 = load i64, ptr %10, align 8 - %eq1 = icmp eq i64 %11, ptrtoint (ptr @"ct$int" to i64) - br i1 %eq1, label %if.then2, label %if.exit3 - -if.then2: ; preds = %if.exit - call void (ptr, ...) @printf(ptr @.str.6) - br label %if.exit3 - -if.exit3: ; preds = %if.then2, %if.exit - store double 1.000000e+00, ptr %taddr4, align 8 - %12 = insertvalue %variant undef, ptr %taddr4, 0 - %13 = insertvalue %variant %12, i64 ptrtoint (ptr @"ct$double" to i64), 1 - store %variant %13, ptr %y, align 8 - %14 = insertvalue %variant undef, ptr %x, 0 - %15 = insertvalue %variant %14, i64 ptrtoint (ptr @"ct$variant" to i64), 1 - store %variant %15, ptr %x, align 8 - %16 = getelementptr inbounds %variant, ptr %y, i32 0, i32 1 - %17 = load i64, ptr %16, align 8 - %eq5 = icmp eq i64 %17, ptrtoint (ptr @"ct$int" to i64) - br i1 %eq5, label %if.then6, label %if.exit7 - -if.then6: ; preds = %if.exit3 - call void (ptr, ...) @printf(ptr @.str.7) - br label %if.exit7 - -if.exit7: ; preds = %if.then6, %if.exit3 - %18 = getelementptr inbounds %variant, ptr %x, i32 0, i32 1 - %19 = load i64, ptr %18, align 8 - %eq8 = icmp eq i64 %19, ptrtoint (ptr @"ct$int" to i64) - br i1 %eq8, label %if.then9, label %if.exit10 - -if.then9: ; preds = %if.exit7 - call void (ptr, ...) @printf(ptr @.str.8) - br label %if.exit10 - -if.exit10: ; preds = %if.then9, %if.exit7 - %20 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 0 - %lo = load i64, ptr %20, align 8 - %21 = getelementptr inbounds { i64, ptr }, ptr %x, i32 0, i32 1 - %hi = load ptr, ptr %21, align 8 - call void @foo_test(i64 %lo, ptr %hi) - store double 1.000000e+00, ptr %taddr11, align 8 - %22 = insertvalue %variant undef, ptr %taddr11, 0 - %23 = insertvalue %variant %22, i64 ptrtoint (ptr @"ct$double" to i64), 1 - store %variant %23, ptr %taddr12, align 8 - %24 = getelementptr inbounds { i64, ptr }, ptr %taddr12, i32 0, i32 0 - %lo13 = load i64, ptr %24, align 8 - %25 = getelementptr inbounds { i64, ptr }, ptr %taddr12, i32 0, i32 1 - %hi14 = load ptr, ptr %25, align 8 - call void @foo_test(i64 %lo13, ptr %hi14) - store i32 1, ptr %taddr15, align 4 - %26 = insertvalue %variant undef, ptr %taddr15, 0 - %27 = insertvalue %variant %26, i64 ptrtoint (ptr @"ct$int" to i64), 1 - store %variant %27, ptr %taddr16, align 8 - %28 = getelementptr inbounds { i64, ptr }, ptr %taddr16, i32 0, i32 0 - %lo17 = load i64, ptr %28, align 8 - %29 = getelementptr inbounds { i64, ptr }, ptr %taddr16, i32 0, i32 1 - %hi18 = load ptr, ptr %29, align 8 - call void @foo_test(i64 %lo17, ptr %hi18) - store i8 1, ptr %taddr19, align 1 - %30 = insertvalue %variant undef, ptr %taddr19, 0 - %31 = insertvalue %variant %30, i64 ptrtoint (ptr @"ct$bool" to i64), 1 - store %variant %31, ptr %taddr20, align 8 - %32 = getelementptr inbounds { i64, ptr }, ptr %taddr20, i32 0, i32 0 - %lo21 = load i64, ptr %32, align 8 - %33 = getelementptr inbounds { i64, ptr }, ptr %taddr20, i32 0, i32 1 - %hi22 = load ptr, ptr %33, align 8 - call void @foo_test(i64 %lo21, ptr %hi22) - call void (ptr, ...) @printf(ptr @.str.9) - store ptr null, ptr %df, align 8 - %34 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 0 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %34, ptr align 8 %x, i32 16, i1 false) - %35 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 1 - call void @llvm.memcpy.p0.p0.i32(ptr align 16 %35, ptr align 8 %x, i32 16, i1 false) - store double 1.000000e+00, ptr %taddr23, align 8 - %36 = insertvalue %variant undef, ptr %taddr23, 0 - %37 = insertvalue %variant %36, i64 ptrtoint (ptr @"ct$double" to i64), 1 - %38 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 2 - store %variant %37, ptr %38, align 16 - %39 = insertvalue %variant undef, ptr %x, 0 - %40 = insertvalue %variant %39, i64 ptrtoint (ptr @"ct$variant" to i64), 1 - %41 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 3 - store %variant %40, ptr %41, align 16 - %42 = insertvalue %variant undef, ptr %df, 0 - %43 = insertvalue %variant %42, i64 ptrtoint (ptr @"ct$p$int" to i64), 1 - %44 = getelementptr inbounds [5 x %variant], ptr %varargslots, i64 0, i64 4 - store %variant %43, ptr %44, align 16 - call void @foo_test_all(ptr %varargslots, i64 5) - ret void -} diff --git a/test/test_suite2/vector/vector_bit.c3t b/test/test_suite2/vector/vector_bit.c3t deleted file mode 100644 index 6727d6eda..000000000 --- a/test/test_suite2/vector/vector_bit.c3t +++ /dev/null @@ -1,154 +0,0 @@ -// #target: macos-x64 - -import libc; - -fn void testf() -{ - float[<4>] y = { 0, 2, 3, 0 }; - int[<4>] w = !y; - libc::printf("Notf %d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn void testi() -{ - int[<4>] y = { 1, 2, 3, 4 }; - int[<4>] z = { 2, 3, 13, -100 }; - int[<4>] w; - w = y & z; - libc::printf("And %d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = y | z; - libc::printf("Or %d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = y ^ z; - libc::printf("Xor %d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = ~y; - libc::printf("BitNeg %d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = -y; - libc::printf("Neg %d %d %d %d\n", w[0], w[1], w[2], w[3]); - w = !y; - w = { -1, 13, 0, 0 }; - w = !w; - libc::printf("Not %d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn void main() -{ - testf(); - testi(); -} - -/* #expect: vector_bit.ll - -define void @vector_bit_testf() #0 { -entry: - %y = alloca <4 x float>, align 16 - %w = alloca <4 x i32>, align 16 - store <4 x float> , ptr %y, align 16 - %0 = load <4 x float>, ptr %y, align 16 - %not = fcmp une <4 x float> %0, zeroinitializer - %1 = sext <4 x i1> %not to <4 x i32> - store <4 x i32> %1, ptr %w, align 16 - %2 = load <4 x i32>, ptr %w, align 16 - %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, ptr %w, align 16 - %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, ptr %w, align 16 - %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, ptr %w, align 16 - %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (ptr, ...) @printf(ptr @.str, i32 %3, i32 %5, i32 %7, i32 %9) - ret void -} - -; Function Attrs: nounwind -define void @vector_bit_testi() #0 { -entry: - %y = alloca <4 x i32>, align 16 - %z = alloca <4 x i32>, align 16 - %w = alloca <4 x i32>, align 16 - store <4 x i32> , ptr %y, align 16 - store <4 x i32> , ptr %z, align 16 - store <4 x i32> zeroinitializer, ptr %w, align 16 - %0 = load <4 x i32>, ptr %y, align 16 - %1 = load <4 x i32>, ptr %z, align 16 - %and = and <4 x i32> %0, %1 - store <4 x i32> %and, ptr %w, align 16 - %2 = load <4 x i32>, ptr %w, align 16 - %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, ptr %w, align 16 - %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, ptr %w, align 16 - %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, ptr %w, align 16 - %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (ptr, ...) @printf(ptr @.str.1, i32 %3, i32 %5, i32 %7, i32 %9) - %11 = load <4 x i32>, ptr %y, align 16 - %12 = load <4 x i32>, ptr %z, align 16 - %or = or <4 x i32> %11, %12 - store <4 x i32> %or, ptr %w, align 16 - %13 = load <4 x i32>, ptr %w, align 16 - %14 = extractelement <4 x i32> %13, i64 0 - %15 = load <4 x i32>, ptr %w, align 16 - %16 = extractelement <4 x i32> %15, i64 1 - %17 = load <4 x i32>, ptr %w, align 16 - %18 = extractelement <4 x i32> %17, i64 2 - %19 = load <4 x i32>, ptr %w, align 16 - %20 = extractelement <4 x i32> %19, i64 3 - %21 = call i32 (ptr, ...) @printf(ptr @.str.2, i32 %14, i32 %16, i32 %18, i32 %20) - %22 = load <4 x i32>, ptr %y, align 16 - %23 = load <4 x i32>, ptr %z, align 16 - %xor = xor <4 x i32> %22, %23 - store <4 x i32> %xor, ptr %w, align 16 - %24 = load <4 x i32>, ptr %w, align 16 - %25 = extractelement <4 x i32> %24, i64 0 - %26 = load <4 x i32>, ptr %w, align 16 - %27 = extractelement <4 x i32> %26, i64 1 - %28 = load <4 x i32>, ptr %w, align 16 - %29 = extractelement <4 x i32> %28, i64 2 - %30 = load <4 x i32>, ptr %w, align 16 - %31 = extractelement <4 x i32> %30, i64 3 - %32 = call i32 (ptr, ...) @printf(ptr @.str.3, i32 %25, i32 %27, i32 %29, i32 %31) - %33 = load <4 x i32>, ptr %y, align 16 - %bnot = xor <4 x i32> %33, - store <4 x i32> %bnot, ptr %w, align 16 - %34 = load <4 x i32>, ptr %w, align 16 - %35 = extractelement <4 x i32> %34, i64 0 - %36 = load <4 x i32>, ptr %w, align 16 - %37 = extractelement <4 x i32> %36, i64 1 - %38 = load <4 x i32>, ptr %w, align 16 - %39 = extractelement <4 x i32> %38, i64 2 - %40 = load <4 x i32>, ptr %w, align 16 - %41 = extractelement <4 x i32> %40, i64 3 - %42 = call i32 (ptr, ...) @printf(ptr @.str.4, i32 %35, i32 %37, i32 %39, i32 %41) - %43 = load <4 x i32>, ptr %y, align 16 - %44 = load <4 x i32>, ptr %y, align 16 - %neg = sub <4 x i32> zeroinitializer, %44 - store <4 x i32> %neg, ptr %w, align 16 - %45 = load <4 x i32>, ptr %w, align 16 - %46 = extractelement <4 x i32> %45, i64 0 - %47 = load <4 x i32>, ptr %w, align 16 - %48 = extractelement <4 x i32> %47, i64 1 - %49 = load <4 x i32>, ptr %w, align 16 - %50 = extractelement <4 x i32> %49, i64 2 - %51 = load <4 x i32>, ptr %w, align 16 - %52 = extractelement <4 x i32> %51, i64 3 - %53 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %46, i32 %48, i32 %50, i32 %52) - %54 = load <4 x i32>, ptr %y, align 16 - %not = icmp eq <4 x i32> %54, zeroinitializer - %55 = sext <4 x i1> %not to <4 x i32> - store <4 x i32> %55, ptr %w, align 16 - store <4 x i32> , ptr %w, align 16 - %56 = load <4 x i32>, ptr %w, align 16 - %not1 = icmp eq <4 x i32> %56, zeroinitializer - %57 = sext <4 x i1> %not1 to <4 x i32> - store <4 x i32> %57, ptr %w, align 16 - %58 = load <4 x i32>, ptr %w, align 16 - %59 = extractelement <4 x i32> %58, i64 0 - %60 = load <4 x i32>, ptr %w, align 16 - %61 = extractelement <4 x i32> %60, i64 1 - %62 = load <4 x i32>, ptr %w, align 16 - %63 = extractelement <4 x i32> %62, i64 2 - %64 = load <4 x i32>, ptr %w, align 16 - %65 = extractelement <4 x i32> %64, i64 3 - %66 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %59, i32 %61, i32 %63, i32 %65) - ret void -} diff --git a/test/test_suite2/vector/vector_incdec.c3t b/test/test_suite2/vector/vector_incdec.c3t deleted file mode 100644 index 0b083468c..000000000 --- a/test/test_suite2/vector/vector_incdec.c3t +++ /dev/null @@ -1,190 +0,0 @@ -// #target: macos-x64 -import libc; - -fn void testf() -{ - float[<4>] y = { 1, 2, 3, 4 }; - float[<4>] z = { 2, 2, 2, -100 }; - y += z; - libc::printf("Add %f %f %f %f\n", y[0], y[1], y[2], y[3]); - y++; - libc::printf("Inc %f %f %f %f\n", y[0], y[1], y[2], y[3]); - ++y; - libc::printf("Inc %f %f %f %f\n", y[0], y[1], y[2], y[3]); - y--; - libc::printf("Dec %f %f %f %f\n", y[0], y[1], y[2], y[3]); -} - -fn void testi() -{ - int[<4>] y = { 1, 2, 3, 4 }; - int[<4>] z = { 2, 2, 2, -100 }; - y += z; - libc::printf("Add %d %d %d %d\n", y[0], y[1], y[2], y[3]); - y++; - libc::printf("Inc %d %d %d %d\n", y[0], y[1], y[2], y[3]); - ++y; - libc::printf("Inc %d %d %d %d\n", y[0], y[1], y[2], y[3]); - int[<4>]w = y--; - libc::printf("Dec %d %d %d %d\n", y[0], y[1], y[2], y[3]); - libc::printf("Original %d %d %d %d\n", w[0], w[1], w[2], w[3]); -} - -fn void main() -{ - testf(); - testi(); -} - -/* #expect: vector_incdec.ll - -define void @vector_incdec_testf() #0 { -entry: - %y = alloca <4 x float>, align 16 - %z = alloca <4 x float>, align 16 - store <4 x float> , ptr %y, align 16 - store <4 x float> , ptr %z, align 16 - %0 = load <4 x float>, ptr %y, align 16 - %1 = load <4 x float>, ptr %z, align 16 - %fadd = fadd <4 x float> %0, %1 - store <4 x float> %fadd, ptr %y, align 16 - %2 = load <4 x float>, ptr %y, align 16 - %3 = extractelement <4 x float> %2, i64 0 - %fpfpext = fpext float %3 to double - %4 = load <4 x float>, ptr %y, align 16 - %5 = extractelement <4 x float> %4, i64 1 - %fpfpext1 = fpext float %5 to double - %6 = load <4 x float>, ptr %y, align 16 - %7 = extractelement <4 x float> %6, i64 2 - %fpfpext2 = fpext float %7 to double - %8 = load <4 x float>, ptr %y, align 16 - %9 = extractelement <4 x float> %8, i64 3 - %fpfpext3 = fpext float %9 to double - %10 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext, double %fpfpext1, double %fpfpext2, double %fpfpext3) - %11 = load <4 x float>, ptr %y, align 16 - %fincdec = fadd <4 x float> %11, - store <4 x float> %fincdec, ptr %y, align 16 - %12 = load <4 x float>, ptr %y, align 16 - %13 = extractelement <4 x float> %12, i64 0 - %fpfpext4 = fpext float %13 to double - %14 = load <4 x float>, ptr %y, align 16 - %15 = extractelement <4 x float> %14, i64 1 - %fpfpext5 = fpext float %15 to double - %16 = load <4 x float>, ptr %y, align 16 - %17 = extractelement <4 x float> %16, i64 2 - %fpfpext6 = fpext float %17 to double - %18 = load <4 x float>, ptr %y, align 16 - %19 = extractelement <4 x float> %18, i64 3 - %fpfpext7 = fpext float %19 to double - %20 = call i32 (ptr, ...) @printf(ptr @.str.1, double %fpfpext4, double %fpfpext5, double %fpfpext6, double %fpfpext7) - %21 = load <4 x float>, ptr %y, align 16 - %fincdec8 = fadd <4 x float> %21, - store <4 x float> %fincdec8, ptr %y, align 16 - %22 = load <4 x float>, ptr %y, align 16 - %23 = extractelement <4 x float> %22, i64 0 - %fpfpext9 = fpext float %23 to double - %24 = load <4 x float>, ptr %y, align 16 - %25 = extractelement <4 x float> %24, i64 1 - %fpfpext10 = fpext float %25 to double - %26 = load <4 x float>, ptr %y, align 16 - %27 = extractelement <4 x float> %26, i64 2 - %fpfpext11 = fpext float %27 to double - %28 = load <4 x float>, ptr %y, align 16 - %29 = extractelement <4 x float> %28, i64 3 - %fpfpext12 = fpext float %29 to double - %30 = call i32 (ptr, ...) @printf(ptr @.str.2, double %fpfpext9, double %fpfpext10, double %fpfpext11, double %fpfpext12) - %31 = load <4 x float>, ptr %y, align 16 - %fincdec13 = fadd <4 x float> %31, - store <4 x float> %fincdec13, ptr %y, align 16 - %32 = load <4 x float>, ptr %y, align 16 - %33 = extractelement <4 x float> %32, i64 0 - %fpfpext14 = fpext float %33 to double - %34 = load <4 x float>, ptr %y, align 16 - %35 = extractelement <4 x float> %34, i64 1 - %fpfpext15 = fpext float %35 to double - %36 = load <4 x float>, ptr %y, align 16 - %37 = extractelement <4 x float> %36, i64 2 - %fpfpext16 = fpext float %37 to double - %38 = load <4 x float>, ptr %y, align 16 - %39 = extractelement <4 x float> %38, i64 3 - %fpfpext17 = fpext float %39 to double - %40 = call i32 (ptr, ...) @printf(ptr @.str.3, double %fpfpext14, double %fpfpext15, double %fpfpext16, double %fpfpext17) - ret void -} - -; Function Attrs: nounwind -define void @vector_incdec_testi() #0 { -entry: - %y = alloca <4 x i32>, align 16 - %z = alloca <4 x i32>, align 16 - %w = alloca <4 x i32>, align 16 - store <4 x i32> , ptr %y, align 16 - store <4 x i32> , ptr %z, align 16 - %0 = load <4 x i32>, ptr %y, align 16 - %1 = load <4 x i32>, ptr %z, align 16 - %add = add <4 x i32> %0, %1 - store <4 x i32> %add, ptr %y, align 16 - %2 = load <4 x i32>, ptr %y, align 16 - %3 = extractelement <4 x i32> %2, i64 0 - %4 = load <4 x i32>, ptr %y, align 16 - %5 = extractelement <4 x i32> %4, i64 1 - %6 = load <4 x i32>, ptr %y, align 16 - %7 = extractelement <4 x i32> %6, i64 2 - %8 = load <4 x i32>, ptr %y, align 16 - %9 = extractelement <4 x i32> %8, i64 3 - %10 = call i32 (ptr, ...) @printf(ptr @.str.4, i32 %3, i32 %5, i32 %7, i32 %9) - %11 = load <4 x i32>, ptr %y, align 16 - %add1 = add <4 x i32> %11, - store <4 x i32> %add1, ptr %y, align 16 - %12 = load <4 x i32>, ptr %y, align 16 - %13 = extractelement <4 x i32> %12, i64 0 - %14 = load <4 x i32>, ptr %y, align 16 - %15 = extractelement <4 x i32> %14, i64 1 - %16 = load <4 x i32>, ptr %y, align 16 - %17 = extractelement <4 x i32> %16, i64 2 - %18 = load <4 x i32>, ptr %y, align 16 - %19 = extractelement <4 x i32> %18, i64 3 - %20 = call i32 (ptr, ...) @printf(ptr @.str.5, i32 %13, i32 %15, i32 %17, i32 %19) - %21 = load <4 x i32>, ptr %y, align 16 - %add2 = add <4 x i32> %21, - store <4 x i32> %add2, ptr %y, align 16 - %22 = load <4 x i32>, ptr %y, align 16 - %23 = extractelement <4 x i32> %22, i64 0 - %24 = load <4 x i32>, ptr %y, align 16 - %25 = extractelement <4 x i32> %24, i64 1 - %26 = load <4 x i32>, ptr %y, align 16 - %27 = extractelement <4 x i32> %26, i64 2 - %28 = load <4 x i32>, ptr %y, align 16 - %29 = extractelement <4 x i32> %28, i64 3 - %30 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %23, i32 %25, i32 %27, i32 %29) - %31 = load <4 x i32>, ptr %y, align 16 - %sub = sub <4 x i32> %31, - store <4 x i32> %sub, ptr %y, align 16 - store <4 x i32> %31, ptr %w, align 16 - %32 = load <4 x i32>, ptr %y, align 16 - %33 = extractelement <4 x i32> %32, i64 0 - %34 = load <4 x i32>, ptr %y, align 16 - %35 = extractelement <4 x i32> %34, i64 1 - %36 = load <4 x i32>, ptr %y, align 16 - %37 = extractelement <4 x i32> %36, i64 2 - %38 = load <4 x i32>, ptr %y, align 16 - %39 = extractelement <4 x i32> %38, i64 3 - %40 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %33, i32 %35, i32 %37, i32 %39) - %41 = load <4 x i32>, ptr %w, align 16 - %42 = extractelement <4 x i32> %41, i64 0 - %43 = load <4 x i32>, ptr %w, align 16 - %44 = extractelement <4 x i32> %43, i64 1 - %45 = load <4 x i32>, ptr %w, align 16 - %46 = extractelement <4 x i32> %45, i64 2 - %47 = load <4 x i32>, ptr %w, align 16 - %48 = extractelement <4 x i32> %47, i64 3 - %49 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %42, i32 %44, i32 %46, i32 %48) - ret void -} - -define void @vector_incdec_main() #0 { -entry: - call void @vector_incdec_testf() - call void @vector_incdec_testi() - ret void -} diff --git a/test/test_suite2/vector/vector_init_regression.c3t b/test/test_suite2/vector/vector_init_regression.c3t deleted file mode 100644 index fa2b0dff5..000000000 --- a/test/test_suite2/vector/vector_init_regression.c3t +++ /dev/null @@ -1,415 +0,0 @@ -// #target: macos-x64 -module test; -extern fn int printf(char* format, ...); - -fn void main() { - float radians = 3.1415 / 4; - float[<3>] axis = {0.0, 0.0, 1.0}; - - float cosr = (float) $$cos(radians); - float sinr = (float) $$sin(radians); - float x = axis[0]; - float y = axis[1]; - float z = axis[2]; - - float[<4>][4] a = {}; - a[0] = { - cosr + (x * x) * (float) (1.0 - cosr), - (x * y) * (float) (1.0 - cosr) - (z * sinr), - (x * z) * (float) (1.0 - cosr) + (y * sinr), - 0.0 - }; - - a[1] = { - (y * x) * (float) (1.0 - cosr) + (z * sinr), - cosr + (y * y) * (float) (1.0 - cosr), - (y * z) * (float) (1.0 - cosr) - (x * sinr), - 0.0 - }; - - a[2] = { - (z * x) * (float) (1.0 - cosr) - (y * sinr), - (z * y) * (float) (1.0 - cosr) + (x * sinr), - cosr + (z * z) * (float) (1.0 - cosr), - 0.0 - }; - - a[3] = { - 0.0, - 0.0, - 0.0, - 1.0 - }; - - float[<4>][4] b = { - { - cosr + (x * x) * (float) (1.0 - cosr), - (x * y) * (float) (1.0 - cosr) - (z * sinr), - (x * z) * (float) (1.0 - cosr) + (y * sinr), - 0.0 - }, - { - (y * x) * (float) (1.0 - cosr) + (z * sinr), - cosr + (y * y) * (float) (1.0 - cosr), - (y * z) * (float) (1.0 - cosr) - (x * sinr), - 0.0 - }, - { - (z * x) * (float) (1.0 - cosr) - (y * sinr), - (z * y) * (float) (1.0 - cosr) + (x * sinr), - cosr + (z * z) * (float) (1.0 - cosr), - 0.0 - }, - { - 0.0, - 0.0, - 0.0, - 1.0 - } - }; - - foreach(v : a) { - printf("A: %f %f %f %f\n", v[0], v[1], v[2], v[3]); - } - - printf("\n"); - - foreach(v : b) { - printf("B: %f %f %f %f\n", v[0], v[1], v[2], v[3]); - } -} - -/* #expect: test.ll - -define void @test_main() #0 { -entry: - %radians = alloca float, align 4 - %axis = alloca <3 x float>, align 16 - %cosr = alloca float, align 4 - %sinr = alloca float, align 4 - %x = alloca float, align 4 - %y = alloca float, align 4 - %z = alloca float, align 4 - %a = alloca [4 x <4 x float>], align 16 - %b = alloca [4 x <4 x float>], align 16 - %.anon = alloca i64, align 8 - %v = alloca <4 x float>, align 16 - %.anon85 = alloca i64, align 8 - %v89 = alloca <4 x float>, align 16 - store float 0x3FE921CAC0000000, ptr %radians, align 4 - store <3 x float> , ptr %axis, align 16 - %0 = load float, ptr %radians, align 4 - %1 = call float @llvm.cos.f32(float %0) - store float %1, ptr %cosr, align 4 - %2 = load float, ptr %radians, align 4 - %3 = call float @llvm.sin.f32(float %2) - store float %3, ptr %sinr, align 4 - %4 = load <3 x float>, ptr %axis, align 16 - %5 = extractelement <3 x float> %4, i64 0 - store float %5, ptr %x, align 4 - %6 = load <3 x float>, ptr %axis, align 16 - %7 = extractelement <3 x float> %6, i64 1 - store float %7, ptr %y, align 4 - %8 = load <3 x float>, ptr %axis, align 16 - %9 = extractelement <3 x float> %8, i64 2 - store float %9, ptr %z, align 4 - call void @llvm.memset.p0.i64(ptr align 16 %a, i8 0, i64 64, i1 false) - %10 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 0 - %11 = load float, ptr %cosr, align 4 - %12 = load float, ptr %x, align 4 - %13 = load float, ptr %x, align 4 - %fmul = fmul float %12, %13 - %14 = load float, ptr %cosr, align 4 - %fpfpext = fpext float %14 to double - %fsub = fsub double 1.000000e+00, %fpfpext - %fpfptrunc = fptrunc double %fsub to float - %15 = call float @llvm.fmuladd.f32(float %fmul, float %fpfptrunc, float %11) - %16 = insertelement <4 x float> undef, float %15, i64 0 - %17 = load float, ptr %x, align 4 - %18 = load float, ptr %y, align 4 - %fmul1 = fmul float %17, %18 - %19 = load float, ptr %cosr, align 4 - %fpfpext2 = fpext float %19 to double - %fsub3 = fsub double 1.000000e+00, %fpfpext2 - %fpfptrunc4 = fptrunc double %fsub3 to float - %20 = load float, ptr %z, align 4 - %21 = load float, ptr %sinr, align 4 - %fmul5 = fmul float %20, %21 - %22 = fneg float %fmul5 - %23 = call float @llvm.fmuladd.f32(float %fmul1, float %fpfptrunc4, float %22) - %24 = insertelement <4 x float> %16, float %23, i64 1 - %25 = load float, ptr %x, align 4 - %26 = load float, ptr %z, align 4 - %fmul6 = fmul float %25, %26 - %27 = load float, ptr %cosr, align 4 - %fpfpext7 = fpext float %27 to double - %fsub8 = fsub double 1.000000e+00, %fpfpext7 - %fpfptrunc9 = fptrunc double %fsub8 to float - %28 = load float, ptr %y, align 4 - %29 = load float, ptr %sinr, align 4 - %fmul10 = fmul float %28, %29 - %30 = call float @llvm.fmuladd.f32(float %fmul6, float %fpfptrunc9, float %fmul10) - %31 = insertelement <4 x float> %24, float %30, i64 2 - %32 = insertelement <4 x float> %31, float 0.000000e+00, i64 3 - store <4 x float> %32, ptr %10, align 16 - %33 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 1 - %34 = load float, ptr %y, align 4 - %35 = load float, ptr %x, align 4 - %fmul11 = fmul float %34, %35 - %36 = load float, ptr %cosr, align 4 - %fpfpext12 = fpext float %36 to double - %fsub13 = fsub double 1.000000e+00, %fpfpext12 - %fpfptrunc14 = fptrunc double %fsub13 to float - %37 = load float, ptr %z, align 4 - %38 = load float, ptr %sinr, align 4 - %fmul15 = fmul float %37, %38 - %39 = call float @llvm.fmuladd.f32(float %fmul11, float %fpfptrunc14, float %fmul15) - %40 = insertelement <4 x float> undef, float %39, i64 0 - %41 = load float, ptr %cosr, align 4 - %42 = load float, ptr %y, align 4 - %43 = load float, ptr %y, align 4 - %fmul16 = fmul float %42, %43 - %44 = load float, ptr %cosr, align 4 - %fpfpext17 = fpext float %44 to double - %fsub18 = fsub double 1.000000e+00, %fpfpext17 - %fpfptrunc19 = fptrunc double %fsub18 to float - %45 = call float @llvm.fmuladd.f32(float %fmul16, float %fpfptrunc19, float %41) - %46 = insertelement <4 x float> %40, float %45, i64 1 - %47 = load float, ptr %y, align 4 - %48 = load float, ptr %z, align 4 - %fmul20 = fmul float %47, %48 - %49 = load float, ptr %cosr, align 4 - %fpfpext21 = fpext float %49 to double - %fsub22 = fsub double 1.000000e+00, %fpfpext21 - %fpfptrunc23 = fptrunc double %fsub22 to float - %50 = load float, ptr %x, align 4 - %51 = load float, ptr %sinr, align 4 - %fmul24 = fmul float %50, %51 - %52 = fneg float %fmul24 - %53 = call float @llvm.fmuladd.f32(float %fmul20, float %fpfptrunc23, float %52) - %54 = insertelement <4 x float> %46, float %53, i64 2 - %55 = insertelement <4 x float> %54, float 0.000000e+00, i64 3 - store <4 x float> %55, ptr %33, align 16 - %56 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 2 - %57 = load float, ptr %z, align 4 - %58 = load float, ptr %x, align 4 - %fmul25 = fmul float %57, %58 - %59 = load float, ptr %cosr, align 4 - %fpfpext26 = fpext float %59 to double - %fsub27 = fsub double 1.000000e+00, %fpfpext26 - %fpfptrunc28 = fptrunc double %fsub27 to float - %60 = load float, ptr %y, align 4 - %61 = load float, ptr %sinr, align 4 - %fmul29 = fmul float %60, %61 - %62 = fneg float %fmul29 - %63 = call float @llvm.fmuladd.f32(float %fmul25, float %fpfptrunc28, float %62) - %64 = insertelement <4 x float> undef, float %63, i64 0 - %65 = load float, ptr %z, align 4 - %66 = load float, ptr %y, align 4 - %fmul30 = fmul float %65, %66 - %67 = load float, ptr %cosr, align 4 - %fpfpext31 = fpext float %67 to double - %fsub32 = fsub double 1.000000e+00, %fpfpext31 - %fpfptrunc33 = fptrunc double %fsub32 to float - %68 = load float, ptr %x, align 4 - %69 = load float, ptr %sinr, align 4 - %fmul34 = fmul float %68, %69 - %70 = call float @llvm.fmuladd.f32(float %fmul30, float %fpfptrunc33, float %fmul34) - %71 = insertelement <4 x float> %64, float %70, i64 1 - %72 = load float, ptr %cosr, align 4 - %73 = load float, ptr %z, align 4 - %74 = load float, ptr %z, align 4 - %fmul35 = fmul float %73, %74 - %75 = load float, ptr %cosr, align 4 - %fpfpext36 = fpext float %75 to double - %fsub37 = fsub double 1.000000e+00, %fpfpext36 - %fpfptrunc38 = fptrunc double %fsub37 to float - %76 = call float @llvm.fmuladd.f32(float %fmul35, float %fpfptrunc38, float %72) - %77 = insertelement <4 x float> %71, float %76, i64 2 - %78 = insertelement <4 x float> %77, float 0.000000e+00, i64 3 - store <4 x float> %78, ptr %56, align 16 - %79 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 3 - store <4 x float> , ptr %79, align 16 - %80 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 0 - %81 = load float, ptr %cosr, align 4 - %82 = load float, ptr %x, align 4 - %83 = load float, ptr %x, align 4 - %fmul39 = fmul float %82, %83 - %84 = load float, ptr %cosr, align 4 - %fpfpext40 = fpext float %84 to double - %fsub41 = fsub double 1.000000e+00, %fpfpext40 - %fpfptrunc42 = fptrunc double %fsub41 to float - %85 = call float @llvm.fmuladd.f32(float %fmul39, float %fpfptrunc42, float %81) - %86 = insertelement <4 x float> undef, float %85, i64 0 - %87 = load float, ptr %x, align 4 - %88 = load float, ptr %y, align 4 - %fmul43 = fmul float %87, %88 - %89 = load float, ptr %cosr, align 4 - %fpfpext44 = fpext float %89 to double - %fsub45 = fsub double 1.000000e+00, %fpfpext44 - %fpfptrunc46 = fptrunc double %fsub45 to float - %90 = load float, ptr %z, align 4 - %91 = load float, ptr %sinr, align 4 - %fmul47 = fmul float %90, %91 - %92 = fneg float %fmul47 - %93 = call float @llvm.fmuladd.f32(float %fmul43, float %fpfptrunc46, float %92) - %94 = insertelement <4 x float> %86, float %93, i64 1 - %95 = load float, ptr %x, align 4 - %96 = load float, ptr %z, align 4 - %fmul48 = fmul float %95, %96 - %97 = load float, ptr %cosr, align 4 - %fpfpext49 = fpext float %97 to double - %fsub50 = fsub double 1.000000e+00, %fpfpext49 - %fpfptrunc51 = fptrunc double %fsub50 to float - %98 = load float, ptr %y, align 4 - %99 = load float, ptr %sinr, align 4 - %fmul52 = fmul float %98, %99 - %100 = call float @llvm.fmuladd.f32(float %fmul48, float %fpfptrunc51, float %fmul52) - %101 = insertelement <4 x float> %94, float %100, i64 2 - %102 = insertelement <4 x float> %101, float 0.000000e+00, i64 3 - store <4 x float> %102, ptr %80, align 16 - %103 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 1 - %104 = load float, ptr %y, align 4 - %105 = load float, ptr %x, align 4 - %fmul53 = fmul float %104, %105 - %106 = load float, ptr %cosr, align 4 - %fpfpext54 = fpext float %106 to double - %fsub55 = fsub double 1.000000e+00, %fpfpext54 - %fpfptrunc56 = fptrunc double %fsub55 to float - %107 = load float, ptr %z, align 4 - %108 = load float, ptr %sinr, align 4 - %fmul57 = fmul float %107, %108 - %109 = call float @llvm.fmuladd.f32(float %fmul53, float %fpfptrunc56, float %fmul57) - %110 = insertelement <4 x float> undef, float %109, i64 0 - %111 = load float, ptr %cosr, align 4 - %112 = load float, ptr %y, align 4 - %113 = load float, ptr %y, align 4 - %fmul58 = fmul float %112, %113 - %114 = load float, ptr %cosr, align 4 - %fpfpext59 = fpext float %114 to double - %fsub60 = fsub double 1.000000e+00, %fpfpext59 - %fpfptrunc61 = fptrunc double %fsub60 to float - %115 = call float @llvm.fmuladd.f32(float %fmul58, float %fpfptrunc61, float %111) - %116 = insertelement <4 x float> %110, float %115, i64 1 - %117 = load float, ptr %y, align 4 - %118 = load float, ptr %z, align 4 - %fmul62 = fmul float %117, %118 - %119 = load float, ptr %cosr, align 4 - %fpfpext63 = fpext float %119 to double - %fsub64 = fsub double 1.000000e+00, %fpfpext63 - %fpfptrunc65 = fptrunc double %fsub64 to float - %120 = load float, ptr %x, align 4 - %121 = load float, ptr %sinr, align 4 - %fmul66 = fmul float %120, %121 - %122 = fneg float %fmul66 - %123 = call float @llvm.fmuladd.f32(float %fmul62, float %fpfptrunc65, float %122) - %124 = insertelement <4 x float> %116, float %123, i64 2 - %125 = insertelement <4 x float> %124, float 0.000000e+00, i64 3 - store <4 x float> %125, ptr %103, align 16 - %126 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 2 - %127 = load float, ptr %z, align 4 - %128 = load float, ptr %x, align 4 - %fmul67 = fmul float %127, %128 - %129 = load float, ptr %cosr, align 4 - %fpfpext68 = fpext float %129 to double - %fsub69 = fsub double 1.000000e+00, %fpfpext68 - %fpfptrunc70 = fptrunc double %fsub69 to float - %130 = load float, ptr %y, align 4 - %131 = load float, ptr %sinr, align 4 - %fmul71 = fmul float %130, %131 - %132 = fneg float %fmul71 - %133 = call float @llvm.fmuladd.f32(float %fmul67, float %fpfptrunc70, float %132) - %134 = insertelement <4 x float> undef, float %133, i64 0 - %135 = load float, ptr %z, align 4 - %136 = load float, ptr %y, align 4 - %fmul72 = fmul float %135, %136 - %137 = load float, ptr %cosr, align 4 - %fpfpext73 = fpext float %137 to double - %fsub74 = fsub double 1.000000e+00, %fpfpext73 - %fpfptrunc75 = fptrunc double %fsub74 to float - %138 = load float, ptr %x, align 4 - %139 = load float, ptr %sinr, align 4 - %fmul76 = fmul float %138, %139 - %140 = call float @llvm.fmuladd.f32(float %fmul72, float %fpfptrunc75, float %fmul76) - %141 = insertelement <4 x float> %134, float %140, i64 1 - %142 = load float, ptr %cosr, align 4 - %143 = load float, ptr %z, align 4 - %144 = load float, ptr %z, align 4 - %fmul77 = fmul float %143, %144 - %145 = load float, ptr %cosr, align 4 - %fpfpext78 = fpext float %145 to double - %fsub79 = fsub double 1.000000e+00, %fpfpext78 - %fpfptrunc80 = fptrunc double %fsub79 to float - %146 = call float @llvm.fmuladd.f32(float %fmul77, float %fpfptrunc80, float %142) - %147 = insertelement <4 x float> %141, float %146, i64 2 - %148 = insertelement <4 x float> %147, float 0.000000e+00, i64 3 - store <4 x float> %148, ptr %126, align 16 - %149 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 3 - store <4 x float> , ptr %149, align 16 - store i64 0, ptr %.anon, align 8 - br label %loop.cond - -loop.cond: ; preds = %loop.body, %entry - %150 = load i64, ptr %.anon, align 8 - %gt = icmp ugt i64 4, %150 - br i1 %gt, label %loop.body, label %loop.exit - -loop.body: ; preds = %loop.cond - %151 = load i64, ptr %.anon, align 8 - %152 = getelementptr inbounds [4 x <4 x float>], ptr %a, i64 0, i64 %151 - %153 = load <4 x float>, ptr %152, align 16 - store <4 x float> %153, ptr %v, align 16 - %154 = load <4 x float>, ptr %v, align 16 - %155 = extractelement <4 x float> %154, i64 0 - %fpfpext81 = fpext float %155 to double - %156 = load <4 x float>, ptr %v, align 16 - %157 = extractelement <4 x float> %156, i64 1 - %fpfpext82 = fpext float %157 to double - %158 = load <4 x float>, ptr %v, align 16 - %159 = extractelement <4 x float> %158, i64 2 - %fpfpext83 = fpext float %159 to double - %160 = load <4 x float>, ptr %v, align 16 - %161 = extractelement <4 x float> %160, i64 3 - %fpfpext84 = fpext float %161 to double - %162 = call i32 (ptr, ...) @printf(ptr @.str, double %fpfpext81, double %fpfpext82, double %fpfpext83, double %fpfpext84) - %163 = load i64, ptr %.anon, align 8 - %add = add i64 %163, 1 - store i64 %add, ptr %.anon, align 8 - br label %loop.cond - -loop.exit: ; preds = %loop.cond - %164 = call i32 (ptr, ...) @printf(ptr @.str.1) - store i64 0, ptr %.anon85, align 8 - br label %loop.cond86 - -loop.cond86: ; preds = %loop.body88, %loop.exit - %165 = load i64, ptr %.anon85, align 8 - %gt87 = icmp ugt i64 4, %165 - br i1 %gt87, label %loop.body88, label %loop.exit95 - -loop.body88: ; preds = %loop.cond86 - %166 = load i64, ptr %.anon85, align 8 - %167 = getelementptr inbounds [4 x <4 x float>], ptr %b, i64 0, i64 %166 - %168 = load <4 x float>, ptr %167, align 16 - store <4 x float> %168, ptr %v89, align 16 - %169 = load <4 x float>, ptr %v89, align 16 - %170 = extractelement <4 x float> %169, i64 0 - %fpfpext90 = fpext float %170 to double - %171 = load <4 x float>, ptr %v89, align 16 - %172 = extractelement <4 x float> %171, i64 1 - %fpfpext91 = fpext float %172 to double - %173 = load <4 x float>, ptr %v89, align 16 - %174 = extractelement <4 x float> %173, i64 2 - %fpfpext92 = fpext float %174 to double - %175 = load <4 x float>, ptr %v89, align 16 - %176 = extractelement <4 x float> %175, i64 3 - %fpfpext93 = fpext float %176 to double - %177 = call i32 (ptr, ...) @printf(ptr @.str.2, double %fpfpext90, double %fpfpext91, double %fpfpext92, double %fpfpext93) - %178 = load i64, ptr %.anon85, align 8 - %add94 = add i64 %178, 1 - store i64 %add94, ptr %.anon85, align 8 - br label %loop.cond86 - -loop.exit95: ; preds = %loop.cond86 - ret void -} \ No newline at end of file diff --git a/test/test_suite2/vector/vector_ops2.c3t b/test/test_suite2/vector/vector_ops2.c3t deleted file mode 100644 index e0fef8f84..000000000 --- a/test/test_suite2/vector/vector_ops2.c3t +++ /dev/null @@ -1,54 +0,0 @@ -// #target: macos-x64 -// #safe: yes -module test; -import libc; - -fn void testf() -{ - float[<4>] y = { 1, 2, 3, 4 }; - float[<4>] z = { 2, 2, 2, -100 }; - float[<4>] w = y + z; - w = y / z; -} - - -fn void testi() -{ - int[<4>] y = { 1, 2, 3, 4 }; - int[<4>] z = { 2, 2, 2, -100 }; - int[<4>] w = y / z; - w = z >> y; - w = z << y; -} - -/* #expect: test.ll - -; Function Attrs: nounwind -define void @test_testf() #0 { -entry: - %y = alloca <4 x float>, align 16 - %z = alloca <4 x float>, align 16 - %w = alloca <4 x float>, align 16 - store <4 x float> , ptr %y, align 16 - store <4 x float> , ptr %z, align 16 - %0 = load <4 x float>, ptr %y, align 16 - %1 = load <4 x float>, ptr %z, align 16 - %fadd = fadd <4 x float> %0, %1 - store <4 x float> %fadd, ptr %w, align 16 - %2 = load <4 x float>, ptr %y, align 16 - %3 = load <4 x float>, ptr %z, align 16 - %4 = call <4 x float> @llvm.fabs.v4f32(<4 x float> %3) - %5 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %4) - %zero = fcmp ueq float %5, 0.000000e+00 - br i1 %zero, label %panic, label %checkok - -panic: ; preds = %entry - %6 = load ptr, ptr @std_core_builtin_panic, align 8 - call void %6(ptr @.panic_msg, i64 17, ptr @.file, i64 14, ptr @.func, i64 5, i32 9) - br label %checkok - -checkok: ; preds = %panic, %entry - %fdiv = fdiv <4 x float> %2, %3 - store <4 x float> %fdiv, ptr %w, align 16 - ret void -}