[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 03/84] tcg: Merge two sequential labels
From: |
Richard Henderson |
Subject: |
[PULL 03/84] tcg: Merge two sequential labels |
Date: |
Sun, 5 Mar 2023 16:38:33 -0800 |
Remove the first label and redirect all uses to the second.
Tested-by: Taylor Simpson <tsimpson@quicinc.com>
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/tcg.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 0b93359d3c..cd8f356adb 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -2628,6 +2628,31 @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
return new_op;
}
+static void move_label_uses(TCGLabel *to, TCGLabel *from)
+{
+ TCGLabelUse *u;
+
+ QSIMPLEQ_FOREACH(u, &from->branches, next) {
+ TCGOp *op = u->op;
+ switch (op->opc) {
+ case INDEX_op_br:
+ op->args[0] = label_arg(to);
+ break;
+ case INDEX_op_brcond_i32:
+ case INDEX_op_brcond_i64:
+ op->args[3] = label_arg(to);
+ break;
+ case INDEX_op_brcond2_i32:
+ op->args[5] = label_arg(to);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ }
+
+ QSIMPLEQ_CONCAT(&to->branches, &from->branches);
+}
+
/* Reachable analysis : remove unreachable code. */
static void __attribute__((noinline))
reachable_code_pass(TCGContext *s)
@@ -2643,6 +2668,24 @@ reachable_code_pass(TCGContext *s)
case INDEX_op_set_label:
label = arg_label(op->args[0]);
+ /*
+ * Note that the first op in the TB is always a load,
+ * so there is always something before a label.
+ */
+ op_prev = QTAILQ_PREV(op, link);
+
+ /*
+ * If we find two sequential labels, move all branches to
+ * reference the second label and remove the first label.
+ * Do this before branch to next optimization, so that the
+ * middle label is out of the way.
+ */
+ if (op_prev->opc == INDEX_op_set_label) {
+ move_label_uses(label, arg_label(op_prev->args[0]));
+ tcg_op_remove(s, op_prev);
+ op_prev = QTAILQ_PREV(op, link);
+ }
+
/*
* Optimization can fold conditional branches to unconditional.
* If we find a label which is preceded by an unconditional
@@ -2650,7 +2693,6 @@ reachable_code_pass(TCGContext *s)
* processing the branch because any dead code between the branch
* and label had not yet been removed.
*/
- op_prev = QTAILQ_PREV(op, link);
if (op_prev->opc == INDEX_op_br &&
label == arg_label(op_prev->args[0])) {
tcg_op_remove(s, op_prev);
--
2.34.1
- [PULL 00/84] tcg patch queue, Richard Henderson, 2023/03/05
- [PULL 01/84] tcg: Include "qemu/timer.h" for profile_getclock, Richard Henderson, 2023/03/05
- [PULL 02/84] tcg: Link branches to the labels, Richard Henderson, 2023/03/05
- [PULL 05/84] accel/tcg: Retain prot flags from tlb_fill, Richard Henderson, 2023/03/05
- [PULL 03/84] tcg: Merge two sequential labels,
Richard Henderson <=
- [PULL 06/84] accel/tcg: Honor TLB_DISCARD_WRITE in atomic_mmu_lookup, Richard Henderson, 2023/03/05
- [PULL 08/84] accel/tcg: Trigger watchpoints from atomic_mmu_lookup, Richard Henderson, 2023/03/05
- [PULL 18/84] target/arm: Drop DisasContext.tmp_a64, Richard Henderson, 2023/03/05
- [PULL 17/84] target/arm: Drop tcg_temp_free from translator.c, Richard Henderson, 2023/03/05
- [PULL 09/84] include/qemu/cpuid: Introduce xgetbv_low, Richard Henderson, 2023/03/05
- [PULL 16/84] target/arm: Remove value_global from DisasCompare, Richard Henderson, 2023/03/05
- [PULL 30/84] target/avr: Drop R from trans_COM, Richard Henderson, 2023/03/05
- [PULL 13/84] accel/tcg: Remove translator_loop_temp_check, Richard Henderson, 2023/03/05
- [PULL 04/84] target/sparc: Use tlb_set_page_full, Richard Henderson, 2023/03/05
- [PULL 07/84] softmmu: Check watchpoints for read+write at once, Richard Henderson, 2023/03/05