Files
c3c/test/test_suite/statements/foreach_common.c3t
2022-08-13 03:04:09 +02:00

341 lines
13 KiB
C

// #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 (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
%i56 = alloca i64, align 8
%a57 = alloca float, align 4
%.anon61 = alloca i64, align 8
%.anon62 = alloca i64, align 8
%i66 = alloca i8, align 1
%a68 = alloca double, align 8
%.anon73 = alloca i64, align 8
%.anon74 = alloca i64, align 8
%a78 = 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> <float 2.000000e+00, float 4.500000e+00, float 8.000000e+00>, <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
store i64 %52, i64* %i56, align 8
%53 = load <3 x float>, <3 x float>* %foo2, align 16
%54 = load i64, i64* %.anon52, align 8
%55 = extractelement <3 x float> %53, i64 %54
store float %55, float* %a57, align 4
%56 = load i64, i64* %i56, align 8
%57 = load float, float* %a57, align 4
%fpfpext58 = fpext float %57 to double
call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.7, i32 0, i32 0), i64 %56, 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.exit72
loop.body65: ; preds = %loop.cond63
%61 = load i64, i64* %.anon62, align 8
%ztrunc67 = trunc i64 %61 to i8
store i8 %ztrunc67, i8* %i66, align 1
%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
%fpfpext69 = fpext float %64 to double
store double %fpfpext69, double* %a68, align 8
%65 = load i8, i8* %i66, align 1
%uisiext70 = zext i8 %65 to i32
%66 = load double, double* %a68, align 8
call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.8, i32 0, i32 0), i32 %uisiext70, double %66)
%67 = load i64, i64* %.anon62, align 8
%add71 = add i64 %67, 1
store i64 %add71, i64* %.anon62, align 8
br label %loop.cond63
loop.exit72: ; preds = %loop.cond63
store i64 3, i64* %.anon73, align 8
store i64 0, i64* %.anon74, align 8
br label %loop.cond75
loop.cond75: ; preds = %loop.body77, %loop.exit72
%68 = load i64, i64* %.anon74, align 8
%69 = load i64, i64* %.anon73, align 8
%lt76 = icmp ult i64 %68, %69
br i1 %lt76, label %loop.body77, label %loop.exit81
loop.body77: ; preds = %loop.cond75
%70 = load <3 x float>, <3 x float>* %foo2, align 16
%71 = load i64, i64* %.anon74, align 8
%72 = extractelement <3 x float> %70, i64 %71
%fpfpext79 = fpext float %72 to double
store double %fpfpext79, double* %a78, align 8
%73 = load double, double* %a78, align 8
call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.9, i32 0, i32 0), double %73)
%74 = load i64, i64* %.anon74, align 8
%add80 = add i64 %74, 1
store i64 %add80, i64* %.anon74, align 8
br label %loop.cond75
loop.exit81: ; preds = %loop.cond75
ret void
}