From ed6ff3a8348e5f7a91956bb65bc1558dceacdeab Mon Sep 17 00:00:00 2001 From: alex-s168 <63254202+alex-s168@users.noreply.github.com> Date: Tue, 28 May 2024 21:51:08 +0200 Subject: [PATCH] remove if with empty body --- ir/ir.h | 5 +++++ ir/opt/reduce_if.c | 21 +++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ir/ir.h b/ir/ir.h index 7089451..123604c 100644 --- a/ir/ir.h +++ b/ir/ir.h @@ -199,6 +199,11 @@ void vx_IrBlock_swap_out_at(vx_IrBlock *block, size_t a, size_t b); void vx_IrBlock_remove_out_at(vx_IrBlock *block, size_t id); size_t vx_IrBlock_insert_label_op(vx_IrBlock *block); +static bool vx_IrBlock_empty(vx_IrBlock *block) { + if (!block) + return true; + return block->ops_len == 0; +} bool vx_IrBlock_var_used(const vx_IrBlock *block, vx_IrVar var); bool vx_IrOp_var_used(const vx_IrOp *op, vx_IrVar var); diff --git a/ir/opt/reduce_if.c b/ir/opt/reduce_if.c index ec0d2a3..1d5a30d 100644 --- a/ir/opt/reduce_if.c +++ b/ir/opt/reduce_if.c @@ -11,12 +11,19 @@ void vx_opt_reduce_if(vx_IrView view, vx_IrBlock *cond = vx_IrOp_param(op, VX_IR_NAME_COND)->block; const vx_IrVar condVar = cond->outs[0]; - // TODO: remove if empty - vx_IrValue *pthen = vx_IrOp_param(op, VX_IR_NAME_COND_THEN); - if (pthen) { - vx_IrBlock *then = pthen->block; + vx_IrBlock *then = pthen ? pthen->block : NULL; + + vx_IrValue *pelse = vx_IrOp_param(op, VX_IR_NAME_COND_ELSE); + vx_IrBlock *els = pelse ? pelse->block : NULL; + if (vx_IrBlock_empty(then) && vx_IrBlock_empty(els)) { + vx_IrOp_destroy(op); + vx_IrOp_init(op, VX_IR_OP_NOP, block); + goto cont; + } + + if (then) { // if it will never be 0 (not might be 0), it is always true => only execute then block if (!vx_Irblock_mightbe_var(cond, condVar, (vx_IrValue) { .type = VX_IR_VAL_IMM_INT, .imm_int = 0 })) { for (size_t i = 0; i < op->outs_len; i ++) { @@ -30,10 +37,7 @@ void vx_opt_reduce_if(vx_IrView view, } } - vx_IrValue *pelse = vx_IrOp_param(op, VX_IR_NAME_COND_ELSE); - if (pelse) { - vx_IrBlock *els = pelse->block; - + if (els) { // if it will always we 0, only the else block will ever be executed if (vx_Irblock_alwaysis_var(cond, condVar, (vx_IrValue) { .type = VX_IR_VAL_IMM_INT, .imm_int = 0 })) { for (size_t i = 0; i < op->outs_len; i ++) { @@ -58,6 +62,7 @@ void vx_opt_reduce_if(vx_IrView view, } } + cont: view = vx_IrView_drop(view, 1); } }