diff options
| author | Baitinq <[email protected]> | 2025-07-16 12:06:04 +0200 |
|---|---|---|
| committer | Baitinq <[email protected]> | 2025-07-16 12:06:04 +0200 |
| commit | cc9dcb4df11c92bd049b927347cbaa8a8d743783 (patch) | |
| tree | cf86e69ba00a23c87bcbbabffb7a959c8fcb0fbe | |
| parent | Tokenizer: Add bounds checking for consume_until_condition (diff) | |
| download | pry-lang-cc9dcb4df11c92bd049b927347cbaa8a8d743783.tar.gz pry-lang-cc9dcb4df11c92bd049b927347cbaa8a8d743783.tar.bz2 pry-lang-cc9dcb4df11c92bd049b927347cbaa8a8d743783.zip | |
Codegen: Cleanup asserts
| -rw-r--r-- | bootstrap/output.ll | 320 | ||||
| -rw-r--r-- | src/codegen.pry | 9 |
2 files changed, 172 insertions, 157 deletions
diff --git a/bootstrap/output.ll b/bootstrap/output.ll index 411a9c9..b4f1a4e 100644 --- a/bootstrap/output.ll +++ b/bootstrap/output.ll @@ -10143,33 +10143,45 @@ entrypoint: %5 = load i64, ptr %type, align 4 %6 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4 %7 = icmp sge i64 %5, %6 - call void @assert(i1 %7) + br i1 %7, label %and_rhs, label %and_merge + +and_rhs: ; preds = %entrypoint %8 = load ptr, ptr %a, align 8 %type1 = getelementptr %Node, ptr %8, i32 0, i32 0 %9 = load i64, ptr %type1, align 4 %10 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4 %11 = icmp sle i64 %9, %10 - call void @assert(i1 %11) + br label %and_merge + +and_merge: ; preds = %and_rhs, %entrypoint + %and_result = phi i1 [ false, %entrypoint ], [ %11, %and_rhs ] + call void @assert(i1 %and_result) %12 = load ptr, ptr %b, align 8 - %type2 = getelementptr %Node, ptr %12, i32 0, i32 0 - %13 = load i64, ptr %type2, align 4 + %type4 = getelementptr %Node, ptr %12, i32 0, i32 0 + %13 = load i64, ptr %type4, align 4 %14 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4 %15 = icmp sge i64 %13, %14 - call void @assert(i1 %15) + br i1 %15, label %and_rhs2, label %and_merge3 + +and_rhs2: ; preds = %and_merge %16 = load ptr, ptr %b, align 8 - %type3 = getelementptr %Node, ptr %16, i32 0, i32 0 - %17 = load i64, ptr %type3, align 4 + %type5 = getelementptr %Node, ptr %16, i32 0, i32 0 + %17 = load i64, ptr %type5, align 4 %18 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4 %19 = icmp sle i64 %17, %18 - call void @assert(i1 %19) + br label %and_merge3 + +and_merge3: ; preds = %and_rhs2, %and_merge + %and_result6 = phi i1 [ false, %and_merge ], [ %19, %and_rhs2 ] + call void @assert(i1 %and_result6) %20 = load ptr, ptr %a, align 8 - %type4 = getelementptr %Node, ptr %20, i32 0, i32 0 - %21 = load i64, ptr %type4, align 4 + %type7 = getelementptr %Node, ptr %20, i32 0, i32 0 + %21 = load i64, ptr %type7, align 4 %22 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4 %23 = icmp eq i64 %21, %22 - br i1 %23, label %then_block, label %merge_block6 + br i1 %23, label %then_block, label %merge_block9 -then_block: ; preds = %entrypoint +then_block: ; preds = %and_merge3 %24 = load ptr, ptr %a, align 8 %data = getelementptr %Node, ptr %24, i32 0, i32 1 %25 = load ptr, ptr %data, align 8 @@ -10179,169 +10191,169 @@ then_block: ; preds = %entrypoint %name = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a, i32 0, i32 0 %27 = load ptr, ptr %name, align 8 %28 = call i1 @strcmp(ptr %27, ptr @178) - br i1 %28, label %then_block5, label %merge_block + br i1 %28, label %then_block8, label %merge_block -then_block5: ; preds = %then_block +then_block8: ; preds = %then_block ret i1 true merge_block: ; preds = %then_block - br label %merge_block6 + br label %merge_block9 -merge_block6: ; preds = %entrypoint, %merge_block +merge_block9: ; preds = %and_merge3, %merge_block %29 = load i1, ptr %is_dereference, align 1 - br i1 %29, label %then_block7, label %merge_block11 + br i1 %29, label %then_block10, label %merge_block14 -then_block7: ; preds = %merge_block6 +then_block10: ; preds = %merge_block9 %30 = load ptr, ptr %a, align 8 - %type8 = getelementptr %Node, ptr %30, i32 0, i32 0 - %31 = load i64, ptr %type8, align 4 + %type11 = getelementptr %Node, ptr %30, i32 0, i32 0 + %31 = load i64, ptr %type11, align 4 %32 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4 %33 = icmp eq i64 %31, %32 call void @assert(i1 %33) %34 = load ptr, ptr %a, align 8 - %data9 = getelementptr %Node, ptr %34, i32 0, i32 1 - %35 = load ptr, ptr %data9, align 8 + %data12 = getelementptr %Node, ptr %34, i32 0, i32 1 + %35 = load ptr, ptr %data12, align 8 %36 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %35, align 8 %pointer_type_a = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8 store %NODE_TYPE_POINTER_TYPE_DATA %36, ptr %pointer_type_a, align 8 - %type10 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_a, i32 0, i32 0 - %37 = load ptr, ptr %type10, align 8 + %type13 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_a, i32 0, i32 0 + %37 = load ptr, ptr %type13, align 8 store ptr %37, ptr %a, align 8 - br label %merge_block11 + br label %merge_block14 -merge_block11: ; preds = %merge_block6, %then_block7 +merge_block14: ; preds = %merge_block9, %then_block10 %38 = load ptr, ptr %a, align 8 - %type12 = getelementptr %Node, ptr %38, i32 0, i32 0 - %39 = load i64, ptr %type12, align 4 + %type15 = getelementptr %Node, ptr %38, i32 0, i32 0 + %39 = load i64, ptr %type15, align 4 %40 = load ptr, ptr %b, align 8 - %type13 = getelementptr %Node, ptr %40, i32 0, i32 0 - %41 = load i64, ptr %type13, align 4 + %type16 = getelementptr %Node, ptr %40, i32 0, i32 0 + %41 = load i64, ptr %type16, align 4 %42 = icmp ne i64 %39, %41 - br i1 %42, label %then_block14, label %merge_block17 + br i1 %42, label %then_block17, label %merge_block20 -then_block14: ; preds = %merge_block11 +then_block17: ; preds = %merge_block14 %43 = load ptr, ptr %a, align 8 - %type15 = getelementptr %Node, ptr %43, i32 0, i32 0 - %44 = load i64, ptr %type15, align 4 + %type18 = getelementptr %Node, ptr %43, i32 0, i32 0 + %44 = load i64, ptr %type18, align 4 call void (ptr, ...) @printf(ptr @179, i64 %44) %45 = load ptr, ptr %b, align 8 - %type16 = getelementptr %Node, ptr %45, i32 0, i32 0 - %46 = load i64, ptr %type16, align 4 + %type19 = getelementptr %Node, ptr %45, i32 0, i32 0 + %46 = load i64, ptr %type19, align 4 call void (ptr, ...) @printf(ptr @180, i64 %46) ret i1 false -merge_block17: ; preds = %merge_block11 +merge_block20: ; preds = %merge_block14 %47 = load ptr, ptr %a, align 8 - %type18 = getelementptr %Node, ptr %47, i32 0, i32 0 - %48 = load i64, ptr %type18, align 4 + %type21 = getelementptr %Node, ptr %47, i32 0, i32 0 + %48 = load i64, ptr %type21, align 4 %49 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4 %50 = icmp eq i64 %48, %49 - br i1 %50, label %then_block19, label %merge_block30 + br i1 %50, label %then_block22, label %merge_block33 -then_block19: ; preds = %merge_block17 +then_block22: ; preds = %merge_block20 %51 = load ptr, ptr %b, align 8 - %type20 = getelementptr %Node, ptr %51, i32 0, i32 0 - %52 = load i64, ptr %type20, align 4 + %type23 = getelementptr %Node, ptr %51, i32 0, i32 0 + %52 = load i64, ptr %type23, align 4 %53 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4 %54 = icmp eq i64 %52, %53 call void @assert(i1 %54) %55 = load ptr, ptr %a, align 8 - %data21 = getelementptr %Node, ptr %55, i32 0, i32 1 - %56 = load ptr, ptr %data21, align 8 + %data24 = getelementptr %Node, ptr %55, i32 0, i32 1 + %56 = load ptr, ptr %data24, align 8 %57 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %56, align 8 - %simple_type_a22 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8 - store %NODE_TYPE_SIMPLE_TYPE_DATA %57, ptr %simple_type_a22, align 8 + %simple_type_a25 = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8 + store %NODE_TYPE_SIMPLE_TYPE_DATA %57, ptr %simple_type_a25, align 8 %58 = load ptr, ptr %b, align 8 - %data23 = getelementptr %Node, ptr %58, i32 0, i32 1 - %59 = load ptr, ptr %data23, align 8 + %data26 = getelementptr %Node, ptr %58, i32 0, i32 1 + %59 = load ptr, ptr %data26, align 8 %60 = load %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %59, align 8 %simple_type_b = alloca %NODE_TYPE_SIMPLE_TYPE_DATA, align 8 store %NODE_TYPE_SIMPLE_TYPE_DATA %60, ptr %simple_type_b, align 8 - %name24 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a22, i32 0, i32 0 - %61 = load ptr, ptr %name24, align 8 - %name25 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_b, i32 0, i32 0 - %62 = load ptr, ptr %name25, align 8 + %name27 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a25, i32 0, i32 0 + %61 = load ptr, ptr %name27, align 8 + %name28 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_b, i32 0, i32 0 + %62 = load ptr, ptr %name28, align 8 %63 = call i1 @strcmp(ptr %61, ptr %62) %eql = alloca i1, align 1 store i1 %63, ptr %eql, align 1 %64 = load i1, ptr %eql, align 1 %65 = icmp eq i1 %64, false - br i1 %65, label %then_block26, label %merge_block29 + br i1 %65, label %then_block29, label %merge_block32 -then_block26: ; preds = %then_block19 - %name27 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a22, i32 0, i32 0 - %66 = load ptr, ptr %name27, align 8 +then_block29: ; preds = %then_block22 + %name30 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_a25, i32 0, i32 0 + %66 = load ptr, ptr %name30, align 8 call void (ptr, ...) @printf(ptr @181, ptr %66) - %name28 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_b, i32 0, i32 0 - %67 = load ptr, ptr %name28, align 8 + %name31 = getelementptr %NODE_TYPE_SIMPLE_TYPE_DATA, ptr %simple_type_b, i32 0, i32 0 + %67 = load ptr, ptr %name31, align 8 call void (ptr, ...) @printf(ptr @182, ptr %67) - br label %merge_block29 + br label %merge_block32 -merge_block29: ; preds = %then_block19, %then_block26 +merge_block32: ; preds = %then_block22, %then_block29 %68 = load i1, ptr %eql, align 1 ret i1 %68 -merge_block30: ; preds = %merge_block17 +merge_block33: ; preds = %merge_block20 %69 = load ptr, ptr %a, align 8 - %type31 = getelementptr %Node, ptr %69, i32 0, i32 0 - %70 = load i64, ptr %type31, align 4 + %type34 = getelementptr %Node, ptr %69, i32 0, i32 0 + %70 = load i64, ptr %type34, align 4 %71 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4 %72 = icmp eq i64 %70, %71 - br i1 %72, label %then_block32, label %merge_block46 + br i1 %72, label %then_block35, label %merge_block49 -then_block32: ; preds = %merge_block30 +then_block35: ; preds = %merge_block33 %73 = load ptr, ptr %b, align 8 - %type33 = getelementptr %Node, ptr %73, i32 0, i32 0 - %74 = load i64, ptr %type33, align 4 + %type36 = getelementptr %Node, ptr %73, i32 0, i32 0 + %74 = load i64, ptr %type36, align 4 %75 = load i64, ptr @NODE_TYPE_FUNCTION_TYPE, align 4 %76 = icmp eq i64 %74, %75 call void @assert(i1 %76) %77 = load ptr, ptr %a, align 8 - %data34 = getelementptr %Node, ptr %77, i32 0, i32 1 - %78 = load ptr, ptr %data34, align 8 + %data37 = getelementptr %Node, ptr %77, i32 0, i32 1 + %78 = load ptr, ptr %data37, align 8 %79 = load %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %78, align 8 %function_type_a = alloca %NODE_TYPE_FUNCTION_TYPE_DATA, align 8 store %NODE_TYPE_FUNCTION_TYPE_DATA %79, ptr %function_type_a, align 8 %80 = load ptr, ptr %b, align 8 - %data35 = getelementptr %Node, ptr %80, i32 0, i32 1 - %81 = load ptr, ptr %data35, align 8 + %data38 = getelementptr %Node, ptr %80, i32 0, i32 1 + %81 = load ptr, ptr %data38, align 8 %82 = load %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %81, align 8 %function_type_b = alloca %NODE_TYPE_FUNCTION_TYPE_DATA, align 8 store %NODE_TYPE_FUNCTION_TYPE_DATA %82, ptr %function_type_b, align 8 %83 = load ptr, ptr %c, align 8 %retur_type = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 2 %84 = load ptr, ptr %retur_type, align 8 - %retur_type36 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 2 - %85 = load ptr, ptr %retur_type36, align 8 + %retur_type39 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 2 + %85 = load ptr, ptr %retur_type39, align 8 %86 = call i1 @compare_types(ptr %83, ptr %84, ptr %85, i1 false) %87 = icmp eq i1 %86, false - br i1 %87, label %then_block37, label %merge_block38 + br i1 %87, label %then_block40, label %merge_block41 -then_block37: ; preds = %then_block32 +then_block40: ; preds = %then_block35 call void (ptr, ...) @printf(ptr @183) ret i1 false -merge_block38: ; preds = %then_block32 +merge_block41: ; preds = %then_block35 %parameters_len = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 1 %88 = load i64, ptr %parameters_len, align 4 - %parameters_len39 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 1 - %89 = load i64, ptr %parameters_len39, align 4 + %parameters_len42 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 1 + %89 = load i64, ptr %parameters_len42, align 4 %90 = icmp ne i64 %88, %89 - br i1 %90, label %then_block40, label %merge_block41 + br i1 %90, label %then_block43, label %merge_block44 -then_block40: ; preds = %merge_block38 +then_block43: ; preds = %merge_block41 call void (ptr, ...) @printf(ptr @184) ret i1 false -merge_block41: ; preds = %merge_block38 +merge_block44: ; preds = %merge_block41 %i = alloca i64, align 8 store i64 0, ptr %i, align 4 br label %while_block -while_block: ; preds = %merge_block45, %merge_block41 +while_block: ; preds = %merge_block48, %merge_block44 %91 = load i64, ptr %i, align 4 - %parameters_len42 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 1 - %92 = load i64, ptr %parameters_len42, align 4 + %parameters_len45 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_a, i32 0, i32 1 + %92 = load i64, ptr %parameters_len45, align 4 %93 = icmp slt i64 %91, %92 br i1 %93, label %inner_block, label %outer_block @@ -10353,8 +10365,8 @@ inner_block: ; preds = %while_block %97 = load ptr, ptr %96, align 8 %param_a = alloca ptr, align 8 store ptr %97, ptr %param_a, align 8 - %parameters43 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 0 - %98 = load ptr, ptr %parameters43, align 8 + %parameters46 = getelementptr %NODE_TYPE_FUNCTION_TYPE_DATA, ptr %function_type_b, i32 0, i32 0 + %98 = load ptr, ptr %parameters46, align 8 %99 = load i64, ptr %i, align 4 %100 = getelementptr ptr, ptr %98, i64 %99 %101 = load ptr, ptr %100, align 8 @@ -10365,125 +10377,125 @@ inner_block: ; preds = %while_block %104 = load ptr, ptr %param_b, align 8 %105 = call i1 @compare_types(ptr %102, ptr %103, ptr %104, i1 false) %106 = icmp eq i1 %105, false - br i1 %106, label %then_block44, label %merge_block45 + br i1 %106, label %then_block47, label %merge_block48 outer_block: ; preds = %while_block ret i1 true -then_block44: ; preds = %inner_block +then_block47: ; preds = %inner_block call void (ptr, ...) @printf(ptr @185) ret i1 false -merge_block45: ; preds = %inner_block +merge_block48: ; preds = %inner_block %107 = load i64, ptr %i, align 4 %108 = add i64 %107, 1 store i64 %108, ptr %i, align 4 br label %while_block -merge_block46: ; preds = %merge_block30 +merge_block49: ; preds = %merge_block33 %109 = load ptr, ptr %a, align 8 - %type47 = getelementptr %Node, ptr %109, i32 0, i32 0 - %110 = load i64, ptr %type47, align 4 + %type50 = getelementptr %Node, ptr %109, i32 0, i32 0 + %110 = load i64, ptr %type50, align 4 %111 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4 %112 = icmp eq i64 %110, %111 - br i1 %112, label %then_block48, label %merge_block57 + br i1 %112, label %then_block51, label %merge_block60 -then_block48: ; preds = %merge_block46 +then_block51: ; preds = %merge_block49 %113 = load ptr, ptr %b, align 8 - %type49 = getelementptr %Node, ptr %113, i32 0, i32 0 - %114 = load i64, ptr %type49, align 4 + %type52 = getelementptr %Node, ptr %113, i32 0, i32 0 + %114 = load i64, ptr %type52, align 4 %115 = load i64, ptr @NODE_TYPE_POINTER_TYPE, align 4 %116 = icmp eq i64 %114, %115 call void @assert(i1 %116) %117 = load ptr, ptr %a, align 8 - %data50 = getelementptr %Node, ptr %117, i32 0, i32 1 - %118 = load ptr, ptr %data50, align 8 + %data53 = getelementptr %Node, ptr %117, i32 0, i32 1 + %118 = load ptr, ptr %data53, align 8 %119 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %118, align 8 - %pointer_type_a51 = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8 - store %NODE_TYPE_POINTER_TYPE_DATA %119, ptr %pointer_type_a51, align 8 + %pointer_type_a54 = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8 + store %NODE_TYPE_POINTER_TYPE_DATA %119, ptr %pointer_type_a54, align 8 %120 = load ptr, ptr %b, align 8 - %data52 = getelementptr %Node, ptr %120, i32 0, i32 1 - %121 = load ptr, ptr %data52, align 8 + %data55 = getelementptr %Node, ptr %120, i32 0, i32 1 + %121 = load ptr, ptr %data55, align 8 %122 = load %NODE_TYPE_POINTER_TYPE_DATA, ptr %121, align 8 %pointer_type_b = alloca %NODE_TYPE_POINTER_TYPE_DATA, align 8 store %NODE_TYPE_POINTER_TYPE_DATA %122, ptr %pointer_type_b, align 8 %123 = load ptr, ptr %c, align 8 - %type53 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_a51, i32 0, i32 0 - %124 = load ptr, ptr %type53, align 8 - %type54 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_b, i32 0, i32 0 - %125 = load ptr, ptr %type54, align 8 + %type56 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_a54, i32 0, i32 0 + %124 = load ptr, ptr %type56, align 8 + %type57 = getelementptr %NODE_TYPE_POINTER_TYPE_DATA, ptr %pointer_type_b, i32 0, i32 0 + %125 = load ptr, ptr %type57, align 8 %126 = call i1 @compare_types(ptr %123, ptr %124, ptr %125, i1 false) %127 = icmp eq i1 %126, false - br i1 %127, label %then_block55, label %merge_block56 + br i1 %127, label %then_block58, label %merge_block59 -then_block55: ; preds = %then_block48 +then_block58: ; preds = %then_block51 call void (ptr, ...) @printf(ptr @186) ret i1 false -merge_block56: ; preds = %then_block48 +merge_block59: ; preds = %then_block51 ret i1 true -merge_block57: ; preds = %merge_block46 +merge_block60: ; preds = %merge_block49 %128 = load ptr, ptr %a, align 8 - %type58 = getelementptr %Node, ptr %128, i32 0, i32 0 - %129 = load i64, ptr %type58, align 4 + %type61 = getelementptr %Node, ptr %128, i32 0, i32 0 + %129 = load i64, ptr %type61, align 4 %130 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4 %131 = icmp eq i64 %129, %130 - br i1 %131, label %then_block59, label %merge_block74 + br i1 %131, label %then_block62, label %merge_block77 -then_block59: ; preds = %merge_block57 +then_block62: ; preds = %merge_block60 %132 = load ptr, ptr %b, align 8 - %type60 = getelementptr %Node, ptr %132, i32 0, i32 0 - %133 = load i64, ptr %type60, align 4 + %type63 = getelementptr %Node, ptr %132, i32 0, i32 0 + %133 = load i64, ptr %type63, align 4 %134 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4 %135 = icmp eq i64 %133, %134 call void @assert(i1 %135) %136 = load ptr, ptr %a, align 8 - %data61 = getelementptr %Node, ptr %136, i32 0, i32 1 - %137 = load ptr, ptr %data61, align 8 + %data64 = getelementptr %Node, ptr %136, i32 0, i32 1 + %137 = load ptr, ptr %data64, align 8 %138 = load %NODE_TYPE_STRUCT_TYPE_DATA, ptr %137, align 8 %struc_type_a = alloca %NODE_TYPE_STRUCT_TYPE_DATA, align 8 store %NODE_TYPE_STRUCT_TYPE_DATA %138, ptr %struc_type_a, align 8 %139 = load ptr, ptr %b, align 8 - %data62 = getelementptr %Node, ptr %139, i32 0, i32 1 - %140 = load ptr, ptr %data62, align 8 + %data65 = getelementptr %Node, ptr %139, i32 0, i32 1 + %140 = load ptr, ptr %data65, align 8 %141 = load %NODE_TYPE_STRUCT_TYPE_DATA, ptr %140, align 8 %struc_type_b = alloca %NODE_TYPE_STRUCT_TYPE_DATA, align 8 store %NODE_TYPE_STRUCT_TYPE_DATA %141, ptr %struc_type_b, align 8 %fields_len = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 1 %142 = load i64, ptr %fields_len, align 4 - %fields_len63 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_b, i32 0, i32 1 - %143 = load i64, ptr %fields_len63, align 4 + %fields_len66 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_b, i32 0, i32 1 + %143 = load i64, ptr %fields_len66, align 4 %144 = icmp ne i64 %142, %143 - br i1 %144, label %then_block64, label %merge_block65 + br i1 %144, label %then_block67, label %merge_block68 -then_block64: ; preds = %then_block59 +then_block67: ; preds = %then_block62 call void (ptr, ...) @printf(ptr @187) ret i1 false -merge_block65: ; preds = %then_block59 - %i66 = alloca i64, align 8 - store i64 0, ptr %i66, align 4 - br label %while_block67 +merge_block68: ; preds = %then_block62 + %i69 = alloca i64, align 8 + store i64 0, ptr %i69, align 4 + br label %while_block70 -while_block67: ; preds = %merge_block73, %merge_block65 - %145 = load i64, ptr %i66, align 4 - %fields_len68 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 1 - %146 = load i64, ptr %fields_len68, align 4 +while_block70: ; preds = %merge_block76, %merge_block68 + %145 = load i64, ptr %i69, align 4 + %fields_len71 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 1 + %146 = load i64, ptr %fields_len71, align 4 %147 = icmp slt i64 %145, %146 - br i1 %147, label %inner_block69, label %outer_block70 + br i1 %147, label %inner_block72, label %outer_block73 -inner_block69: ; preds = %while_block67 +inner_block72: ; preds = %while_block70 %fields = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_a, i32 0, i32 0 %148 = load ptr, ptr %fields, align 8 - %149 = load i64, ptr %i66, align 4 + %149 = load i64, ptr %i69, align 4 %150 = getelementptr ptr, ptr %148, i64 %149 %151 = load ptr, ptr %150, align 8 %field_a = alloca ptr, align 8 store ptr %151, ptr %field_a, align 8 - %fields71 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_b, i32 0, i32 0 - %152 = load ptr, ptr %fields71, align 8 - %153 = load i64, ptr %i66, align 4 + %fields74 = getelementptr %NODE_TYPE_STRUCT_TYPE_DATA, ptr %struc_type_b, i32 0, i32 0 + %152 = load ptr, ptr %fields74, align 8 + %153 = load i64, ptr %i69, align 4 %154 = getelementptr ptr, ptr %152, i64 %153 %155 = load ptr, ptr %154, align 8 %field_b = alloca ptr, align 8 @@ -10493,22 +10505,22 @@ inner_block69: ; preds = %while_block67 %158 = load ptr, ptr %field_b, align 8 %159 = call i1 @compare_types(ptr %156, ptr %157, ptr %158, i1 false) %160 = icmp eq i1 %159, false - br i1 %160, label %then_block72, label %merge_block73 + br i1 %160, label %then_block75, label %merge_block76 -outer_block70: ; preds = %while_block67 +outer_block73: ; preds = %while_block70 ret i1 true -then_block72: ; preds = %inner_block69 +then_block75: ; preds = %inner_block72 call void (ptr, ...) @printf(ptr @188) ret i1 false -merge_block73: ; preds = %inner_block69 - %161 = load i64, ptr %i66, align 4 +merge_block76: ; preds = %inner_block72 + %161 = load i64, ptr %i69, align 4 %162 = add i64 %161, 1 - store i64 %162, ptr %i66, align 4 - br label %while_block67 + store i64 %162, ptr %i69, align 4 + br label %while_block70 -merge_block74: ; preds = %merge_block57 +merge_block77: ; preds = %merge_block60 ret i1 false } @@ -10523,13 +10535,19 @@ entrypoint: %3 = load i64, ptr %type, align 4 %4 = load i64, ptr @NODE_TYPE_SIMPLE_TYPE, align 4 %5 = icmp sge i64 %3, %4 - call void @assert(i1 %5) + br i1 %5, label %and_rhs, label %and_merge + +and_rhs: ; preds = %entrypoint %6 = load ptr, ptr %node, align 8 %type1 = getelementptr %Node, ptr %6, i32 0, i32 0 %7 = load i64, ptr %type1, align 4 %8 = load i64, ptr @NODE_TYPE_STRUCT_TYPE, align 4 %9 = icmp sle i64 %7, %8 - call void @assert(i1 %9) + br label %and_merge + +and_merge: ; preds = %and_rhs, %entrypoint + %and_result = phi i1 [ false, %entrypoint ], [ %9, %and_rhs ] + call void @assert(i1 %and_result) %10 = load ptr, ptr %node, align 8 %type2 = getelementptr %Node, ptr %10, i32 0, i32 0 %11 = load i64, ptr %type2, align 4 @@ -10537,7 +10555,7 @@ entrypoint: %13 = icmp eq i64 %11, %12 br i1 %13, label %then_block, label %merge_block32 -then_block: ; preds = %entrypoint +then_block: ; preds = %and_merge %14 = load ptr, ptr %node, align 8 %data = getelementptr %Node, ptr %14, i32 0, i32 1 %15 = load ptr, ptr %data, align 8 @@ -10679,7 +10697,7 @@ merge_block30: ; preds = %merge_block23 call void @assert(i1 false) br label %merge_block32 -merge_block32: ; preds = %entrypoint, %merge_block30 +merge_block32: ; preds = %and_merge, %merge_block30 %75 = load ptr, ptr %node, align 8 %type33 = getelementptr %Node, ptr %75, i32 0, i32 0 %76 = load i64, ptr %type33, align 4 diff --git a/src/codegen.pry b/src/codegen.pry index ab40c27..b2632c2 100644 --- a/src/codegen.pry +++ b/src/codegen.pry @@ -133,10 +133,8 @@ let codegen_create_variable = (c: *codegen, variable: Variable) => *Variable { }; let compare_types = (c: *codegen, a: *Node, b: *Node, is_dereference: bool) => bool { - assert((*a).type >= NODE_TYPE_SIMPLE_TYPE); - assert((*a).type <= NODE_TYPE_STRUCT_TYPE); - assert((*b).type >= NODE_TYPE_SIMPLE_TYPE); - assert((*b).type <= NODE_TYPE_STRUCT_TYPE); + assert((*a).type >= NODE_TYPE_SIMPLE_TYPE and (*a).type <= NODE_TYPE_STRUCT_TYPE); + assert((*b).type >= NODE_TYPE_SIMPLE_TYPE and (*b).type <= NODE_TYPE_STRUCT_TYPE); if (*a).type == NODE_TYPE_SIMPLE_TYPE { let simple_type_a = *cast(*NODE_TYPE_SIMPLE_TYPE_DATA, (*a).data); @@ -238,8 +236,7 @@ let compare_types = (c: *codegen, a: *Node, b: *Node, is_dereference: bool) => b }; let codegen_get_llvm_type = (c: *codegen, node: *Node) => *LLVMTypeRef { - assert((*node).type >= NODE_TYPE_SIMPLE_TYPE); - assert((*node).type <= NODE_TYPE_STRUCT_TYPE); + assert((*node).type >= NODE_TYPE_SIMPLE_TYPE and (*node).type <= NODE_TYPE_STRUCT_TYPE); if (*node).type == NODE_TYPE_SIMPLE_TYPE { let simple_type = *cast(*NODE_TYPE_SIMPLE_TYPE_DATA, (*node).data); |