This patch extends reachable_code_pass() to also deal with empty else-branches of the form
br $L0 set_label $L1 set_label $L0 converting them to set_label $L1 when $L0 is only referenced by the br op. This type of empty-else branch will be emitted by idef-parser in the Hexagon frontend once CANCEL statements have been ignored. Signed-off-by: Anton Johansson <a...@rev.ng> --- tcg/tcg.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/tcg/tcg.c b/tcg/tcg.c index a4a3da6804..531bc74231 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -2664,21 +2664,40 @@ static void reachable_code_pass(TCGContext *s) dead = false; remove = false; - /* - * Optimization can fold conditional branches to unconditional. - * If we find a label with one reference which is preceded by - * an unconditional branch to it, remove both. This needed to - * wait until the dead code in between them was removed. - */ - if (label->refs == 1) { - TCGOp *op_prev = QTAILQ_PREV(op, link); - if (op_prev->opc == INDEX_op_br && - label == arg_label(op_prev->args[0])) { + TCGOp *op_prev = QTAILQ_PREV(op, link); + if (label->refs == 1 && + op_prev->opc == INDEX_op_br && + label == arg_label(op_prev->args[0])) { + /* + * Optimization can fold conditional branches to + * unconditional. If we find a label with one reference + * which is preceded by an unconditional branch to it, + * remove both. This needed to wait until the dead code + * in between them was removed. + */ + tcg_op_remove(s, op_prev); + remove = true; + } else if (op_next->opc == INDEX_op_set_label) { + /* + * The Hexagon frontend can generate empty else-branches for + * certain instructions. If we encounter + * + * br $L0 + * set_label $L1 + * set_label $L0 + * + * where $L0 only has a single reference, remove the branch + * to $L0 and the corresonding label. + */ + TCGLabel *next_label = arg_label(op_next->args[0]); + if (next_label->refs == 1 && + op_prev->opc == INDEX_op_br && + next_label == arg_label(op_prev->args[0])) { tcg_op_remove(s, op_prev); - remove = true; } } } + break; case INDEX_op_br: -- 2.39.1