mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
341 lines
13 KiB
C
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
|
|
}
|