Fix debug parameter definition. Array foreach GEP.

This commit is contained in:
Christoffer Lerno
2021-11-22 21:03:00 +01:00
parent 7595f2e17b
commit 1ba03f75c2
6 changed files with 172 additions and 162 deletions

View File

@@ -169,7 +169,7 @@ void llvm_emit_debug_parameter(GenContext *c, Decl *parameter, unsigned index)
c->debug.function,
name,
strlen(name),
index,
index + 1,
c->debug.file,
loc->line,
llvm_get_debug_type(c, parameter->type),

View File

@@ -540,7 +540,17 @@ static void llvm_emit_foreach_stmt(GenContext *c, Ast *ast)
assert(llvm_value_is_addr(&enum_value));
LLVMValueRef ref_to_element = llvm_emit_pointer_inbounds_gep_raw(c, actual_type_llvm, enum_value.value, index_value.value);
LLVMValueRef ref_to_element;
AlignSize align;
if (enum_value.type->type_kind == TYPE_ARRAY || enum_value.type->type_kind == TYPE_VECTOR)
{
ref_to_element = llvm_emit_array_gep_raw_index(c, enum_value.value,
llvm_get_type(c, enum_value.type), index_value.value, index_value.alignment, &align);
}
else
{
ref_to_element = llvm_emit_pointer_inbounds_gep_raw(c, actual_type_llvm, enum_value.value, index_value.value);
}
BEValue result;
if (ast->foreach_stmt.value_by_ref)
{

View File

@@ -52,17 +52,17 @@ foreach.cond: ; preds = %foreach.inc, %entry
br i1 %lt, label %foreach.body, label %foreach.exit
foreach.body: ; preds = %foreach.cond
%ptroffset = getelementptr inbounds i32, [10 x i32]* %y, i64 %10
%11 = load i32, i32* %ptroffset, align 4
store i32 %11, i32* %v, align 4
%12 = 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 %12)
%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)
br label %foreach.inc
foreach.inc: ; preds = %foreach.body
%13 = load i64, i64* %idx, align 8
%14 = add i64 %13, 1
store i64 %14, i64* %idx, align 8
%14 = load i64, i64* %idx, align 8
%15 = add i64 %14, 1
store i64 %15, i64* %idx, align 8
br label %foreach.cond
foreach.exit: ; preds = %foreach.cond

View File

@@ -52,27 +52,27 @@ foreach.cond: ; preds = %foreach.inc, %entry
%lt = icmp ult i64 %8, 8
br i1 %lt, label %foreach.body, label %foreach.exit
foreach.body: ; preds = %foreach.cond
%ptroffset = getelementptr inbounds i32, [8 x i32]* %x, i64 %8
%9 = load i32, i32* %ptroffset, align 4
store i32 %9, i32* %i, align 4
%10 = 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 %10)
%9 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %8
%10 = load i32, i32* %9, align 4
store i32 %10, i32* %i, align 4
%11 = 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 %11)
br label %foreach.inc
foreach.inc: ; preds = %foreach.body
%11 = load i64, i64* %idx, align 8
%12 = add i64 %11, 1
store i64 %12, i64* %idx, align 8
%12 = load i64, i64* %idx, align 8
%13 = add i64 %12, 1
store i64 %13, i64* %idx, align 8
br label %foreach.cond
foreach.exit: ; preds = %foreach.cond
br label %cond
cond: ; preds = %assign, %foreach.exit
%13 = phi i64 [ 0, %foreach.exit ], [ %add, %assign ]
%le = icmp sle i64 %13, 7
%14 = phi i64 [ 0, %foreach.exit ], [ %add, %assign ]
%le = icmp sle i64 %14, 7
br i1 %le, label %assign, label %exit
assign: ; preds = %cond
%14 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %13
store i32 123, i32* %14, align 4
%add = add i64 %13, 1
%15 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %14
store i32 123, i32* %15, align 4
%add = add i64 %14, 1
br label %cond
exit: ; preds = %cond
ret void

View File

@@ -13,7 +13,7 @@ fn void test()
}
}
// #expect: test.ll
/* #expect: test.ll
define void @test.test() #0 {
entry:
@@ -37,35 +37,35 @@ foreach.cond: ; preds = %foreach.inc, %entry
br i1 %lt, label %foreach.body, label %foreach.exit
foreach.body: ; preds = %foreach.cond
%ptroffset = getelementptr inbounds i32, [3 x i32]* %x, i64 %3
%4 = load i32, i32* %ptroffset, align 4
store i32 %4, i32* %z, align 4
%5 = load i32, i32* %z, align 4
%gt = icmp sgt i32 %5, 0
%4 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 %3
%5 = load i32, i32* %4, align 4
store i32 %5, i32* %z, align 4
%6 = load i32, i32* %z, align 4
%gt = icmp sgt i32 %6, 0
br i1 %gt, label %if.then, label %if.exit
if.then: ; preds = %foreach.body
br label %foreach.exit
if.exit: ; preds = %foreach.body
%6 = load i32, i32* %z, align 4
%eq = icmp eq i32 %6, 1
%7 = load i32, i32* %z, align 4
%eq = icmp eq i32 %7, 1
br i1 %eq, label %if.then1, label %if.exit2
if.then1: ; preds = %if.exit
br label %foreach.inc
if.exit2: ; preds = %if.exit
%7 = load i32, i32* %g, align 4
%8 = load i32, i32* %z, align 4
%add = add i32 %7, %8
%8 = load i32, i32* %g, align 4
%9 = load i32, i32* %z, align 4
%add = add i32 %8, %9
store i32 %add, i32* %g, align 4
br label %foreach.inc
foreach.inc: ; preds = %if.exit2, %if.then1
%9 = load i64, i64* %idx, align 8
%10 = add i64 %9, 1
store i64 %10, i64* %idx, align 8
%10 = load i64, i64* %idx, align 8
%11 = add i64 %10, 1
store i64 %11, i64* %idx, align 8
br label %foreach.cond
foreach.exit: ; preds = %if.then, %foreach.cond

View File

@@ -32,7 +32,7 @@ fn void main()
}
}
// #expect: test.ll
/* #expect: test.ll
entry:
%foo = alloca [3 x float], align 4
@@ -40,15 +40,15 @@ entry:
%a = alloca float, align 4
%idx1 = alloca i64, align 8
%a2 = alloca float*, align 8
%idx10 = alloca i64, align 8
%a11 = alloca i8*, align 8
%idx9 = alloca i64, align 8
%a10 = alloca i8*, align 8
%i = alloca i64, align 8
%a20 = alloca float, align 4
%i28 = alloca i8, align 1
%idx29 = alloca i64, align 8
%a30 = alloca double, align 8
%idx38 = alloca i64, align 8
%a39 = alloca double, 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]* @.__const to i8*), i32 12, i1 false)
store i64 0, i64* %idx, align 8
@@ -60,152 +60,152 @@ foreach.cond: ; preds = %foreach.inc, %entry
br i1 %lt, label %foreach.body, label %foreach.exit
foreach.body: ; preds = %foreach.cond
%ptroffset = getelementptr inbounds float, [3 x float]* %foo, i64 %1
%2 = load float, float* %ptroffset, align 4
store float %2, float* %a, align 4
%3 = load float, float* %a, align 4
%fpfpext = fpext float %3 to double
%2 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, 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]* @.str, i32 0, i32 0), double %fpfpext)
br label %foreach.inc
foreach.inc: ; preds = %foreach.body
%4 = load i64, i64* %idx, align 8
%5 = add i64 %4, 1
store i64 %5, i64* %idx, align 8
%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: ; preds = %foreach.cond
store i64 0, i64* %idx1, align 8
br label %foreach.cond3
foreach.cond3: ; preds = %foreach.inc8, %foreach.exit
%6 = load i64, i64* %idx1, align 8
%lt4 = icmp ult i64 %6, 3
br i1 %lt4, label %foreach.body5, label %foreach.exit9
foreach.cond3: ; preds = %foreach.inc7, %foreach.exit
%7 = load i64, i64* %idx1, align 8
%lt4 = icmp ult i64 %7, 3
br i1 %lt4, label %foreach.body5, label %foreach.exit8
foreach.body5: ; preds = %foreach.cond3
%ptroffset6 = getelementptr inbounds float, [3 x float]* %foo, i64 %6
store float* %ptroffset6, float** %a2, align 8
%7 = load float*, float** %a2, align 8
%8 = load float, float* %7, align 8
%fmul = fmul float %8, 2.000000e+00
store float %fmul, float* %7, align 8
%8 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %7
store float* %8, float** %a2, align 8
%9 = load float*, float** %a2, align 8
%10 = load float, float* %9, align 8
%fpfpext7 = fpext float %10 to double
call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %fpfpext7)
br label %foreach.inc8
%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]* @.str.1, i32 0, i32 0), double %fpfpext6)
br label %foreach.inc7
foreach.inc8: ; preds = %foreach.body5
%11 = load i64, i64* %idx1, align 8
%12 = add i64 %11, 1
store i64 %12, i64* %idx1, align 8
foreach.inc7: ; preds = %foreach.body5
%13 = load i64, i64* %idx1, align 8
%14 = add i64 %13, 1
store i64 %14, i64* %idx1, align 8
br label %foreach.cond3
foreach.exit9: ; preds = %foreach.cond3
store i64 0, i64* %idx10, align 8
br label %foreach.cond12
foreach.exit8: ; preds = %foreach.cond3
store i64 0, i64* %idx9, align 8
br label %foreach.cond11
foreach.cond12: ; preds = %foreach.inc18, %foreach.exit9
%13 = load i64, i64* %idx10, align 8
%lt13 = icmp ult i64 %13, 3
br i1 %lt13, label %foreach.body14, label %foreach.exit19
foreach.cond11: ; preds = %foreach.inc16, %foreach.exit8
%15 = load i64, i64* %idx9, align 8
%lt12 = icmp ult i64 %15, 3
br i1 %lt12, label %foreach.body13, label %foreach.exit17
foreach.body14: ; preds = %foreach.cond12
%ptroffset15 = getelementptr inbounds float, [3 x float]* %foo, i64 %13
%ptrptr = bitcast float* %ptroffset15 to i8*
store i8* %ptrptr, i8** %a11, align 8
%14 = load i8*, i8** %a11, align 8
%ptrptr16 = bitcast i8* %14 to float*
%15 = load float, float* %ptrptr16, align 8
%fpfpext17 = fpext float %15 to double
call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), double %fpfpext17)
br label %foreach.inc18
foreach.body13: ; preds = %foreach.cond11
%16 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, 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]* @.str.2, i32 0, i32 0), double %fpfpext15)
br label %foreach.inc16
foreach.inc18: ; preds = %foreach.body14
%16 = load i64, i64* %idx10, align 8
%17 = add i64 %16, 1
store i64 %17, i64* %idx10, align 8
br label %foreach.cond12
foreach.inc16: ; preds = %foreach.body13
%19 = load i64, i64* %idx9, align 8
%20 = add i64 %19, 1
store i64 %20, i64* %idx9, align 8
br label %foreach.cond11
foreach.exit19: ; preds = %foreach.cond12
foreach.exit17: ; preds = %foreach.cond11
store i64 0, i64* %i, align 8
br label %foreach.cond21
br label %foreach.cond19
foreach.cond21: ; preds = %foreach.inc26, %foreach.exit19
%18 = load i64, i64* %i, align 8
%lt22 = icmp ult i64 %18, 3
br i1 %lt22, label %foreach.body23, label %foreach.exit27
foreach.cond19: ; preds = %foreach.inc23, %foreach.exit17
%21 = load i64, i64* %i, align 8
%lt20 = icmp ult i64 %21, 3
br i1 %lt20, label %foreach.body21, label %foreach.exit24
foreach.body23: ; preds = %foreach.cond21
%ptroffset24 = getelementptr inbounds float, [3 x float]* %foo, i64 %18
%19 = load float, float* %ptroffset24, align 4
store float %19, float* %a20, align 4
%20 = load i64, i64* %i, align 8
%21 = load float, float* %a20, align 4
%fpfpext25 = fpext float %21 to double
call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 %20, double %fpfpext25)
br label %foreach.inc26
foreach.body21: ; preds = %foreach.cond19
%22 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, 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]* @.str.3, i32 0, i32 0), i64 %24, double %fpfpext22)
br label %foreach.inc23
foreach.inc26: ; preds = %foreach.body23
%22 = load i64, i64* %i, align 8
%23 = add i64 %22, 1
store i64 %23, i64* %i, align 8
br label %foreach.cond21
foreach.inc23: ; preds = %foreach.body21
%26 = load i64, i64* %i, align 8
%27 = add i64 %26, 1
store i64 %27, i64* %i, align 8
br label %foreach.cond19
foreach.exit27: ; preds = %foreach.cond21
store i8 0, i8* %i28, align 1
store i64 0, i64* %idx29, align 8
br label %foreach.cond31
foreach.exit24: ; preds = %foreach.cond19
store i8 0, i8* %i25, align 1
store i64 0, i64* %idx26, align 8
br label %foreach.cond28
foreach.cond31: ; preds = %foreach.inc36, %foreach.exit27
%24 = load i64, i64* %idx29, align 8
%lt32 = icmp ult i64 %24, 3
br i1 %lt32, label %foreach.body33, label %foreach.exit37
foreach.cond28: ; preds = %foreach.inc32, %foreach.exit24
%28 = load i64, i64* %idx26, align 8
%lt29 = icmp ult i64 %28, 3
br i1 %lt29, label %foreach.body30, label %foreach.exit33
foreach.body33: ; preds = %foreach.cond31
%25 = trunc i64 %24 to i8
store i8 %25, i8* %i28, align 1
%ptroffset34 = getelementptr inbounds float, [3 x float]* %foo, i64 %24
%26 = load float, float* %ptroffset34, align 4
%fpfpext35 = fpext float %26 to double
store double %fpfpext35, double* %a30, align 8
%27 = load i8, i8* %i28, align 1
%uisiext = zext i8 %27 to i32
%28 = load double, double* %a30, align 8
call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i32 0, i32 0), i32 %uisiext, double %28)
br label %foreach.inc36
foreach.body30: ; preds = %foreach.cond28
%29 = trunc i64 %28 to i8
store i8 %29, i8* %i25, align 1
%30 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, 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]* @.str.4, i32 0, i32 0), i32 %uisiext, double %33)
br label %foreach.inc32
foreach.inc36: ; preds = %foreach.body33
%29 = load i64, i64* %idx29, align 8
%30 = add i64 %29, 1
store i64 %30, i64* %idx29, align 8
br label %foreach.cond31
foreach.exit37: ; preds = %foreach.cond31
store i64 0, i64* %idx38, align 8
br label %foreach.cond40
foreach.cond40: ; preds = %foreach.inc45, %foreach.exit37
%31 = load i64, i64* %idx38, align 8
%lt41 = icmp ult i64 %31, 3
br i1 %lt41, label %foreach.body42, label %foreach.exit46
foreach.body42: ; preds = %foreach.cond40
%ptroffset43 = getelementptr inbounds float, [3 x float]* %foo, i64 %31
%32 = load float, float* %ptroffset43, align 4
%fpfpext44 = fpext float %32 to double
store double %fpfpext44, double* %a39, align 8
%33 = 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 %33)
br label %foreach.inc45
foreach.inc45: ; preds = %foreach.body42
%34 = load i64, i64* %idx38, align 8
foreach.inc32: ; preds = %foreach.body30
%34 = load i64, i64* %idx26, align 8
%35 = add i64 %34, 1
store i64 %35, i64* %idx38, align 8
br label %foreach.cond40
store i64 %35, i64* %idx26, align 8
br label %foreach.cond28
foreach.exit46: ; preds = %foreach.cond40
foreach.exit33: ; preds = %foreach.cond28
store i64 0, i64* %idx34, align 8
br label %foreach.cond36
foreach.cond36: ; preds = %foreach.inc40, %foreach.exit33
%36 = load i64, i64* %idx34, align 8
%lt37 = icmp ult i64 %36, 3
br i1 %lt37, label %foreach.body38, label %foreach.exit41
foreach.body38: ; preds = %foreach.cond36
%37 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, 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]* @.str.5, i32 0, i32 0), double %39)
br label %foreach.inc40
foreach.inc40: ; preds = %foreach.body38
%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: ; preds = %foreach.cond36
ret void
}