mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
211 lines
6.0 KiB
Plaintext
211 lines
6.0 KiB
Plaintext
module test;
|
|
|
|
extern func void printf(char*, ...);
|
|
|
|
func void main()
|
|
{
|
|
float[3] foo = { 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", *(cast(a as float*)));
|
|
}
|
|
foreach (i, a : foo)
|
|
{
|
|
printf("Value[%d]: %f\n", i, a);
|
|
}
|
|
foreach (byte i, double a : foo)
|
|
{
|
|
printf("Value2[%d]: %f\n", i, a);
|
|
}
|
|
foreach (double a : foo)
|
|
{
|
|
printf("Value3: %f\n", a);
|
|
}
|
|
}
|
|
|
|
// #expect: foreach_common.ll
|
|
|
|
entry:
|
|
%foo = alloca [3 x float], align 4
|
|
%idx = alloca i64, align 8
|
|
%a = alloca float, align 4
|
|
%idx1 = alloca i64, align 8
|
|
%a2 = alloca float*, align 8
|
|
%idx9 = alloca i64, align 8
|
|
%a10 = alloca i8*, align 8
|
|
%i = alloca i64, align 8
|
|
%a18 = alloca float, align 4
|
|
%i25 = alloca i8, align 1
|
|
%idx26 = alloca i64, align 8
|
|
%a27 = alloca double, align 8
|
|
%idx34 = alloca i64, align 8
|
|
%a35 = 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]* @0 to i8*), i32 12, i1 false)
|
|
store i64 0, i64* %idx, align 8
|
|
br label %foreach.cond
|
|
|
|
foreach.cond:
|
|
%1 = load i64, i64* %idx, align 8
|
|
%lt = icmp ult i64 %1, 3
|
|
br i1 %lt, label %foreach.body, label %foreach.exit
|
|
|
|
foreach.body:
|
|
%2 = getelementptr inbounds float, [3 x float]* %foo, i64 %1
|
|
%3 = load float, float* %2, align 4
|
|
store float %3, float* %a, align 4
|
|
%4 = load float, float* %a, align 4
|
|
%fpfpext = fpext float %4 to double
|
|
call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @1, i32 0, i32 0), double %fpfpext)
|
|
br label %foreach.inc
|
|
|
|
foreach.inc:
|
|
%5 = load i64, i64* %idx, align 8
|
|
%6 = add i64 %5, 1
|
|
store i64 %6, i64* %idx, align 8
|
|
br label %foreach.cond
|
|
|
|
foreach.exit:
|
|
store i64 0, i64* %idx1, align 8
|
|
br label %foreach.cond3
|
|
|
|
foreach.cond3:
|
|
%7 = load i64, i64* %idx1, align 8
|
|
%lt4 = icmp ult i64 %7, 3
|
|
br i1 %lt4, label %foreach.body5, label %foreach.exit8
|
|
|
|
foreach.body5:
|
|
%8 = getelementptr inbounds float, [3 x float]* %foo, i64 %7
|
|
store float* %8, float** %a2, align 8
|
|
%9 = load float*, float** %a2, align 8
|
|
%10 = load float, float* %9, align 8
|
|
%fmul = fmul float %10, 2.000000e+00
|
|
store float %fmul, float* %9, align 8
|
|
%11 = load float*, float** %a2, align 8
|
|
%12 = load float, float* %11, align 8
|
|
%fpfpext6 = fpext float %12 to double
|
|
call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @2, i32 0, i32 0), double %fpfpext6)
|
|
br label %foreach.inc7
|
|
|
|
foreach.inc7:
|
|
%13 = load i64, i64* %idx1, align 8
|
|
%14 = add i64 %13, 1
|
|
store i64 %14, i64* %idx1, align 8
|
|
br label %foreach.cond3
|
|
|
|
foreach.exit8:
|
|
store i64 0, i64* %idx9, align 8
|
|
br label %foreach.cond11
|
|
|
|
foreach.cond11:
|
|
%15 = load i64, i64* %idx9, align 8
|
|
%lt12 = icmp ult i64 %15, 3
|
|
br i1 %lt12, label %foreach.body13, label %foreach.exit17
|
|
|
|
foreach.body13:
|
|
%16 = getelementptr inbounds float, [3 x float]* %foo, i64 %15
|
|
%ptrptr = bitcast float* %16 to i8*
|
|
store i8* %ptrptr, i8** %a10, align 8
|
|
%17 = load i8*, i8** %a10, align 8
|
|
%ptrptr14 = bitcast i8* %17 to float*
|
|
%18 = load float, float* %ptrptr14, align 8
|
|
%fpfpext15 = fpext float %18 to double
|
|
call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @3, i32 0, i32 0), double %fpfpext15)
|
|
br label %foreach.inc16
|
|
|
|
foreach.inc16:
|
|
%19 = load i64, i64* %idx9, align 8
|
|
%20 = add i64 %19, 1
|
|
store i64 %20, i64* %idx9, align 8
|
|
br label %foreach.cond11
|
|
|
|
foreach.exit17:
|
|
store i64 0, i64* %i, align 8
|
|
br label %foreach.cond19
|
|
|
|
foreach.cond19:
|
|
%21 = load i64, i64* %i, align 8
|
|
%lt20 = icmp ult i64 %21, 3
|
|
br i1 %lt20, label %foreach.body21, label %foreach.exit24
|
|
|
|
foreach.body21:
|
|
%22 = getelementptr inbounds float, [3 x float]* %foo, i64 %21
|
|
%23 = load float, float* %22, align 4
|
|
store float %23, float* %a18, align 4
|
|
%24 = load i64, i64* %i, align 8
|
|
%25 = load float, float* %a18, align 4
|
|
%fpfpext22 = fpext float %25 to double
|
|
call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @4, i32 0, i32 0), i64 %24, double %fpfpext22)
|
|
br label %foreach.inc23
|
|
|
|
foreach.inc23:
|
|
%26 = load i64, i64* %i, align 8
|
|
%27 = add i64 %26, 1
|
|
store i64 %27, i64* %i, align 8
|
|
br label %foreach.cond19
|
|
|
|
foreach.exit24:
|
|
store i8 0, i8* %i25, align 1
|
|
store i64 0, i64* %idx26, align 8
|
|
br label %foreach.cond28
|
|
|
|
foreach.cond28:
|
|
%28 = load i64, i64* %idx26, align 8
|
|
%lt29 = icmp ult i64 %28, 3
|
|
br i1 %lt29, label %foreach.body30, label %foreach.exit33
|
|
|
|
foreach.body30:
|
|
%29 = trunc i64 %28 to i8
|
|
store i8 %29, i8* %i25, align 1
|
|
%30 = getelementptr inbounds float, [3 x float]* %foo, i64 %28
|
|
%31 = load float, float* %30, align 4
|
|
%fpfpext31 = fpext float %31 to double
|
|
store double %fpfpext31, double* %a27, align 8
|
|
%32 = load i8, i8* %i25, align 1
|
|
%uisiext = zext i8 %32 to i32
|
|
%33 = load double, double* %a27, align 8
|
|
call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @5, i32 0, i32 0), i32 %uisiext, double %33)
|
|
br label %foreach.inc32
|
|
|
|
foreach.inc32:
|
|
%34 = load i64, i64* %idx26, align 8
|
|
%35 = add i64 %34, 1
|
|
store i64 %35, i64* %idx26, align 8
|
|
br label %foreach.cond28
|
|
|
|
foreach.exit33:
|
|
store i64 0, i64* %idx34, align 8
|
|
br label %foreach.cond36
|
|
|
|
foreach.cond36:
|
|
%36 = load i64, i64* %idx34, align 8
|
|
%lt37 = icmp ult i64 %36, 3
|
|
br i1 %lt37, label %foreach.body38, label %foreach.exit41
|
|
|
|
foreach.body38:
|
|
%37 = getelementptr inbounds float, [3 x float]* %foo, i64 %36
|
|
%38 = load float, float* %37, align 4
|
|
%fpfpext39 = fpext float %38 to double
|
|
store double %fpfpext39, double* %a35, align 8
|
|
%39 = load double, double* %a35, align 8
|
|
call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @6, i32 0, i32 0), double %39)
|
|
br label %foreach.inc40
|
|
|
|
foreach.inc40:
|
|
%40 = load i64, i64* %idx34, align 8
|
|
%41 = add i64 %40, 1
|
|
store i64 %41, i64* %idx34, align 8
|
|
br label %foreach.cond36
|
|
|
|
foreach.exit41:
|
|
ret void
|