Files
c3c/test/test_suite/functions/raw_splat.c3t
2024-09-07 05:26:43 +02:00

151 lines
5.2 KiB
C

// #target: macos-x64
module rawsplat;
int x;
macro void foo(...)
{
$for (var $i = 0; $i < $vacount; $i++)
x += $vaarg[$i] * $i;
$endfor
}
fn void main()
{
int[3] y = { 33, 44, 55 };
foo(...y);
foo(1, ...y);
int[] z = &y;
foo(...z[1..2]);
foo(1, ...z[1..2], 5);
}
/* #expect: rawsplat.ll
define void @rawsplat.main() #0 {
entry:
%y = alloca [3 x i32], align 4
%.anon = alloca [3 x i32], align 4
%.anon1 = alloca i32, align 4
%.anon2 = alloca i32, align 4
%.anon4 = alloca i32, align 4
%.anon9 = alloca [3 x i32], align 4
%.anon10 = alloca i32, align 4
%.anon12 = alloca i32, align 4
%.anon14 = alloca i32, align 4
%z = alloca %"int[]", align 8
%.anon22 = alloca %"int[]", align 8
%.anon24 = alloca i32, align 4
%.anon26 = alloca i32, align 4
%.anon31 = alloca %"int[]", align 8
%.anon33 = alloca i32, align 4
%.anon35 = alloca i32, align 4
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %y, ptr align 4 @.__const, i32 12, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %.anon, ptr align 4 %y, i32 12, i1 false)
%0 = load i32, ptr %.anon, align 4
store i32 %0, ptr %.anon1, align 4
%ptradd = getelementptr inbounds i8, ptr %.anon, i64 4
%1 = load i32, ptr %ptradd, align 4
store i32 %1, ptr %.anon2, align 4
%ptradd3 = getelementptr inbounds i8, ptr %.anon, i64 8
%2 = load i32, ptr %ptradd3, align 4
store i32 %2, ptr %.anon4, align 4
%3 = load i32, ptr @rawsplat.x, align 4
%4 = load i32, ptr %.anon1, align 4
%mul = mul i32 %4, 0
%add = add i32 %3, %mul
store i32 %add, ptr @rawsplat.x, align 4
%5 = load i32, ptr @rawsplat.x, align 4
%6 = load i32, ptr %.anon2, align 4
%mul5 = mul i32 %6, 1
%add6 = add i32 %5, %mul5
store i32 %add6, ptr @rawsplat.x, align 4
%7 = load i32, ptr @rawsplat.x, align 4
%8 = load i32, ptr %.anon4, align 4
%mul7 = mul i32 %8, 2
%add8 = add i32 %7, %mul7
store i32 %add8, ptr @rawsplat.x, align 4
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %.anon9, ptr align 4 %y, i32 12, i1 false)
%9 = load i32, ptr %.anon9, align 4
store i32 %9, ptr %.anon10, align 4
%ptradd11 = getelementptr inbounds i8, ptr %.anon9, i64 4
%10 = load i32, ptr %ptradd11, align 4
store i32 %10, ptr %.anon12, align 4
%ptradd13 = getelementptr inbounds i8, ptr %.anon9, i64 8
%11 = load i32, ptr %ptradd13, align 4
store i32 %11, ptr %.anon14, align 4
%12 = load i32, ptr @rawsplat.x, align 4
%add15 = add i32 %12, 0
store i32 %add15, ptr @rawsplat.x, align 4
%13 = load i32, ptr @rawsplat.x, align 4
%14 = load i32, ptr %.anon10, align 4
%mul16 = mul i32 %14, 1
%add17 = add i32 %13, %mul16
store i32 %add17, ptr @rawsplat.x, align 4
%15 = load i32, ptr @rawsplat.x, align 4
%16 = load i32, ptr %.anon12, align 4
%mul18 = mul i32 %16, 2
%add19 = add i32 %15, %mul18
store i32 %add19, ptr @rawsplat.x, align 4
%17 = load i32, ptr @rawsplat.x, align 4
%18 = load i32, ptr %.anon14, align 4
%mul20 = mul i32 %18, 3
%add21 = add i32 %17, %mul20
store i32 %add21, ptr @rawsplat.x, align 4
%19 = insertvalue %"int[]" undef, ptr %y, 0
%20 = insertvalue %"int[]" %19, i64 3, 1
store %"int[]" %20, ptr %z, align 8
%21 = load %"int[]", ptr %z, align 8
%22 = extractvalue %"int[]" %21, 0
%ptradd23 = getelementptr inbounds i8, ptr %22, i64 4
%23 = insertvalue %"int[]" undef, ptr %ptradd23, 0
%24 = insertvalue %"int[]" %23, i64 2, 1
store %"int[]" %24, ptr %.anon22, align 8
%25 = load ptr, ptr %.anon22, align 8
%26 = load i32, ptr %25, align 4
store i32 %26, ptr %.anon24, align 4
%27 = load ptr, ptr %.anon22, align 8
%ptradd25 = getelementptr inbounds i8, ptr %27, i64 4
%28 = load i32, ptr %ptradd25, align 4
store i32 %28, ptr %.anon26, align 4
%29 = load i32, ptr @rawsplat.x, align 4
%30 = load i32, ptr %.anon24, align 4
%mul27 = mul i32 %30, 0
%add28 = add i32 %29, %mul27
store i32 %add28, ptr @rawsplat.x, align 4
%31 = load i32, ptr @rawsplat.x, align 4
%32 = load i32, ptr %.anon26, align 4
%mul29 = mul i32 %32, 1
%add30 = add i32 %31, %mul29
store i32 %add30, ptr @rawsplat.x, align 4
%33 = load %"int[]", ptr %z, align 8
%34 = extractvalue %"int[]" %33, 0
%ptradd32 = getelementptr inbounds i8, ptr %34, i64 4
%35 = insertvalue %"int[]" undef, ptr %ptradd32, 0
%36 = insertvalue %"int[]" %35, i64 2, 1
store %"int[]" %36, ptr %.anon31, align 8
%37 = load ptr, ptr %.anon31, align 8
%38 = load i32, ptr %37, align 4
store i32 %38, ptr %.anon33, align 4
%39 = load ptr, ptr %.anon31, align 8
%ptradd34 = getelementptr inbounds i8, ptr %39, i64 4
%40 = load i32, ptr %ptradd34, align 4
store i32 %40, ptr %.anon35, align 4
%41 = load i32, ptr @rawsplat.x, align 4
%add36 = add i32 %41, 0
store i32 %add36, ptr @rawsplat.x, align 4
%42 = load i32, ptr @rawsplat.x, align 4
%43 = load i32, ptr %.anon33, align 4
%mul37 = mul i32 %43, 1
%add38 = add i32 %42, %mul37
store i32 %add38, ptr @rawsplat.x, align 4
%44 = load i32, ptr @rawsplat.x, align 4
%45 = load i32, ptr %.anon35, align 4
%mul39 = mul i32 %45, 2
%add40 = add i32 %44, %mul39
store i32 %add40, ptr @rawsplat.x, align 4
%46 = load i32, ptr @rawsplat.x, align 4
%add41 = add i32 %46, 15
store i32 %add41, ptr @rawsplat.x, align 4
ret void
}