Skip to content

Commit

Permalink
fix some bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-s168 committed Feb 17, 2025
1 parent 6382e2d commit a4cf7fe
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 35 deletions.
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ fi

AUTO_CFLAGS="-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-comment -Wno-format -Wno-sign-compare -Wno-char-subscripts -Wno-implicit-fallthrough -Wno-missing-braces -Werror"

if [ -z $CFLAGS ]; then
if [ -z "$CFLAGS" ]; then
ANALYZER_FLAGS="$AUTO_CFLAGS"
else
ANALYZER_FLAGS="$CFLAGS"
Expand Down
71 changes: 40 additions & 31 deletions ir/ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,8 @@ int vx_CU_compile(vx_CU * cu,
FILE* optionalOptimizedSsaIr,
FILE* optionalOptimizedLlIr,
FILE* optionalAsm,
vx_BinFormat optionalBinFormat, FILE* optionalBinOut)
vx_BinFormat optionalBinFormat, FILE* optionalBinOut,
vx_CU_compile_Mode mode)
{

#define FOR_BLOCK(code) \
Expand All @@ -396,46 +397,54 @@ int vx_CU_compile(vx_CU * cu,
fprintf(stderr, "only root blocks allowed in CU\n");
exit(1);
}
});

vx_CIrBlock_fix(cu, block); // TODO: why...
vx_CIrBlock_normalize(cu, block);
vx_CIrBlock_mksa_states(cu, block);
vx_CIrBlock_mksa_final(cu, block);
vx_CIrBlock_fix(cu, block); // TODO: why...
if (mode >= VX_CU_COMPILE_MODE_FROM_CIR) {
FOR_BLOCK({
vx_CIrBlock_fix(cu, block); // TODO: why...
vx_CIrBlock_normalize(cu, block);
vx_CIrBlock_mksa_states(cu, block);
vx_CIrBlock_mksa_final(cu, block);
vx_CIrBlock_fix(cu, block); // TODO: why...

if (vx_ir_verify(cu, block) != 0)
return 1;
});
if (vx_ir_verify(cu, block) != 0)
return 1;
});
}

FOR_BLOCK({
vx_opt(cu, block);
if (mode >= VX_CU_COMPILE_MODE_FROM_IR) {
FOR_BLOCK({
vx_opt(cu, block);

if (optionalOptimizedSsaIr != NULL)
vx_IrBlock_dump(block, optionalOptimizedSsaIr, 0);
if (optionalOptimizedSsaIr != NULL)
vx_IrBlock_dump(block, optionalOptimizedSsaIr, 0);

if (vx_ir_verify(cu, block) != 0)
return 1;
});
if (vx_ir_verify(cu, block) != 0)
return 1;
});

FOR_BLOCK({
vx_IrBlock_root_varsHeat(block);
FOR_BLOCK({
vx_IrBlock_root_varsHeat(block);

vx_IrBlock_llir_preLower_loops(cu, block);
vx_IrBlock_llir_preLower_ifs(cu, block);
vx_opt_preLower(cu, block);
vx_IrBlock_llir_lower(cu, block);
vx_IrBlock_llir_fix_decl(cu, block);
});
vx_IrBlock_llir_preLower_loops(cu, block);
vx_IrBlock_llir_preLower_ifs(cu, block);
vx_opt_preLower(cu, block);
vx_IrBlock_llir_lower(cu, block);
vx_IrBlock_llir_fix_decl(cu, block);
});
}

FOR_BLOCK({
vx_opt_ll(cu, block);
if (mode >= VX_CU_COMPILE_MODE_FROM_LLIR) {
FOR_BLOCK({
vx_opt_ll(cu, block);

if (optionalOptimizedLlIr != NULL)
vx_IrBlock_dump(block, optionalOptimizedLlIr, 0);
if (optionalOptimizedLlIr != NULL)
vx_IrBlock_dump(block, optionalOptimizedLlIr, 0);

vx_llir_prep_lower(cu, block);
vx_IrBlock_llir_varsHeat(block);
});
vx_llir_prep_lower(cu, block);
vx_IrBlock_llir_varsHeat(block);
});
}

if (optionalAsm) {
for (size_t i = 0; i < cu->blocks_len; i ++) {
Expand Down
9 changes: 8 additions & 1 deletion ir/ir.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,12 +252,19 @@ static void vx_CU_addType(vx_CU* cu, vx_IrType* type) {
vx_IrType* vx_CU_typeByName(vx_CU* cu, char const* name);
vx_IrBlock* vx_CU_blockByName(vx_CU* cu, char const* name);

typedef enum {
VX_CU_COMPILE_MODE_FROM_LLIR = 0,
VX_CU_COMPILE_MODE_FROM_IR,
VX_CU_COMPILE_MODE_FROM_CIR,
} vx_CU_compile_Mode;

/** 0 if ok */
int vx_CU_compile(vx_CU * cu,
FILE* optionalOptimizedSsaIr,
FILE* optionalOptimizedLlIr,
FILE* optionalAsm,
vx_BinFormat optionalBinFormat, FILE* optionalBinOut);
vx_BinFormat optionalBinFormat, FILE* optionalBinOut,
vx_CU_compile_Mode mode);

vx_IrBlock *vx_IrBlock_root(vx_IrBlock *block);

Expand Down
2 changes: 2 additions & 0 deletions ir/opt/ll_jumps.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "../passes.h"
#include <assert.h>

// we go trough all ops between the jump and the label
// if all of them have no effect (labels, nops), we can remove the jump instruction
Expand All @@ -13,6 +14,7 @@ static void part1(vx_IrBlock *block)
size_t label_id = vx_IrOp_param(op, VX_IR_NAME_ID)->id;

vx_IrOp *decl = root->as_root.labels[label_id].decl;
assert (decl);
assert (decl->parent == op->parent);

if (vx_IrOp_after(decl, op)) // can't optimize if label decl before this decl
Expand Down
6 changes: 5 additions & 1 deletion ir/transform/cmov_expand.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ void vx_IrBlock_ll_cmov_expand(vx_CU* cu, vx_IrBlock *block)
continue;

vx_IrTypedVar out = op->outs[0];
vx_IrValue velse = *vx_IrOp_param(op, VX_IR_NAME_COND_ELSE);
vx_IrValue* velsep = vx_IrOp_param(op, VX_IR_NAME_COND_ELSE);
if (!velsep)
continue;

vx_IrValue velse = *velsep;

vx_IrOp* pred = vx_IrOp_predecessor(op);

Expand Down
2 changes: 1 addition & 1 deletion targets/x86/llir_conditionals.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void vx_llir_x86_conditionals(vx_CU* cu, vx_IrBlock* block)
}

vx_IrOp* test = vx_IrBlock_insertOpCreateAfter(block, vx_IrOp_predecessor(op), VX_IR_OP_X86_CMP);
vx_IrOp_stealParam(test, op, VX_IR_NAME_COND);
vx_IrOp_addParam_s(test, VX_IR_NAME_OPERAND_A, *vx_IrOp_param(op, VX_IR_NAME_COND));
vx_IrOp_addParam_s(test, VX_IR_NAME_OPERAND_B, VX_IR_VALUE_IMM_INT(0));

vx_IrOp_addParam_s(op, VX_IR_NAME_COND, VX_IR_VALUE_X86_CC("ne"));
Expand Down

0 comments on commit a4cf7fe

Please sign in to comment.