summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Maydell2020-11-05 17:14:50 +0100
committerPeter Maydell2020-11-05 17:14:50 +0100
commitfbd9cc20ad26708a6e854460f8a173ea9f958165 (patch)
treea4b278559d427bc984f4b405c4c6fcf310e81cd9
parentMerge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging (diff)
parenttcg: Revert "tcg/optimize: Flush data at labels not TCG_OPF_BB_END" (diff)
downloadqemu-fbd9cc20ad26708a6e854460f8a173ea9f958165.tar.gz
qemu-fbd9cc20ad26708a6e854460f8a173ea9f958165.tar.xz
qemu-fbd9cc20ad26708a6e854460f8a173ea9f958165.zip
Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20201104' into staging
Fix assert in set_jmp_reset_offset Revert cross-branch optimization in tcg/optimize.c. # gpg: Signature made Thu 05 Nov 2020 00:28:07 GMT # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * remotes/rth/tags/pull-tcg-20201104: tcg: Revert "tcg/optimize: Flush data at labels not TCG_OPF_BB_END" tcg: Remove assert from set_jmp_reset_offset Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--tcg/optimize.c35
-rw-r--r--tcg/tcg.c9
2 files changed, 22 insertions, 22 deletions
diff --git a/tcg/optimize.c b/tcg/optimize.c
index 9952c28bdc..220f4601d5 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -1484,30 +1484,29 @@ void tcg_optimize(TCGContext *s)
}
}
}
- /* fall through */
+ goto do_reset_output;
default:
do_default:
- /*
- * Default case: we know nothing about operation (or were unable
- * to compute the operation result) so no propagation is done.
- */
- for (i = 0; i < nb_oargs; i++) {
- reset_temp(op->args[i]);
- /*
- * Save the corresponding known-zero bits mask for the
- * first output argument (only one supported so far).
- */
- if (i == 0) {
- arg_info(op->args[i])->mask = mask;
+ /* Default case: we know nothing about operation (or were unable
+ to compute the operation result) so no propagation is done.
+ We trash everything if the operation is the end of a basic
+ block, otherwise we only trash the output args. "mask" is
+ the non-zero bits mask for the first output arg. */
+ if (def->flags & TCG_OPF_BB_END) {
+ bitmap_zero(temps_used.l, nb_temps);
+ } else {
+ do_reset_output:
+ for (i = 0; i < nb_oargs; i++) {
+ reset_temp(op->args[i]);
+ /* Save the corresponding known-zero bits mask for the
+ first output argument (only one supported so far). */
+ if (i == 0) {
+ arg_info(op->args[i])->mask = mask;
+ }
}
}
break;
-
- case INDEX_op_set_label:
- /* Trash everything at the start of a new extended bb. */
- bitmap_zero(temps_used.l, nb_temps);
- break;
}
/* Eliminate duplicate and redundant fence instructions. */
diff --git a/tcg/tcg.c b/tcg/tcg.c
index f49f1a7f35..43c6cf8f52 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -335,10 +335,11 @@ static bool tcg_resolve_relocs(TCGContext *s)
static void set_jmp_reset_offset(TCGContext *s, int which)
{
- size_t off = tcg_current_code_size(s);
- s->tb_jmp_reset_offset[which] = off;
- /* Make sure that we didn't overflow the stored offset. */
- assert(s->tb_jmp_reset_offset[which] == off);
+ /*
+ * We will check for overflow at the end of the opcode loop in
+ * tcg_gen_code, where we bound tcg_current_code_size to UINT16_MAX.
+ */
+ s->tb_jmp_reset_offset[which] = tcg_current_code_size(s);
}
#include "tcg-target.c.inc"