On 3/1/23 23:37, Taylor Simpson wrote:
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);
Can't we just insert a while loop here to move op_prev back across labels?
while (op_next->opc == INDEX_op_set_label) {
op_prev = QTAILQ_PREV(op, op_prev);
}
- if (op_prev->opc == INDEX_op_br &&
- label == arg_label(op_prev->args[0])) {
Ah I see, you're thinking something like
dead = false;
remove = false;
if (label->refs == 1) {
TCGOp *op_prev = NULL;
do {
op_prev = QTAILQ_PREV(op_prev, link);
} while (op_prev->opc == INDEX_op_set_label);
if (op_prev->opc == INDEX_op_br &&
label == arg_label(op_prev->args[0])) {
tcg_op_remove(s, op_prev);
remove = true;
}
}
to handle
br
set_label
...
set_label
I do like being able to combine both branches, and we're no longer
relying on
the next iteration of the loop to clean up the final set_label. Since we
won't
ever encounter more than one intermediate set_label this might be overkill,
but either way I think it's an improvement.
Thanks for the feedback, I'll resubmit with this change! :)
--
Anton Johansson,
rev.ng Labs Srl.