[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 48/48] tcg/optimize: Propagate sign info for shifting
From: |
Richard Henderson |
Subject: |
[PATCH v2 48/48] tcg/optimize: Propagate sign info for shifting |
Date: |
Thu, 7 Oct 2021 12:54:56 -0700 |
For constant shifts, we can simply shift the s_mask.
For variable shifts, we know that sar does not reduce
the s_mask, which helps for sequences like
ext32s_i64 t, in
sar_i64 t, t, v
ext32s_i64 out, t
allowing the final extend to be eliminated.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tcg/optimize.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 47 insertions(+), 3 deletions(-)
diff --git a/tcg/optimize.c b/tcg/optimize.c
index 678e7c1983..92cfb644bf 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -84,6 +84,18 @@ static uint64_t smask_from_zmask(uint64_t zmask)
return ~(~0ull >> rep);
}
+/*
+ * Recreate a properly left-aligned smask after manipulation.
+ * Some bit-shuffling, particularly shifts and rotates, may
+ * retain sign bits on the left, but may scatter disconnected
+ * sign bits on the right. Retain only what remains to the left.
+ */
+static uint64_t smask_from_smask(int64_t smask)
+{
+ /* Only the 1 bits are significant for smask */
+ return smask_from_zmask(~smask);
+}
+
static inline TempOptInfo *ts_info(TCGTemp *ts)
{
return ts->state_ptr;
@@ -1803,18 +1815,50 @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
static bool fold_shift(OptContext *ctx, TCGOp *op)
{
+ uint64_t s_mask, z_mask, sign;
+
if (fold_const2(ctx, op) ||
fold_ix_to_i(ctx, op, 0) ||
fold_xi_to_x(ctx, op, 0)) {
return true;
}
+ s_mask = arg_info(op->args[1])->s_mask;
+ z_mask = arg_info(op->args[1])->z_mask;
+
if (arg_is_const(op->args[2])) {
- ctx->z_mask = do_constant_folding(op->opc, ctx->type,
- arg_info(op->args[1])->z_mask,
- arg_info(op->args[2])->val);
+ int sh = arg_info(op->args[2])->val;
+
+ ctx->z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
+
+ s_mask = do_constant_folding(op->opc, ctx->type, s_mask, sh);
+ ctx->s_mask = smask_from_smask(s_mask);
+
return fold_masks(ctx, op);
}
+
+ switch (op->opc) {
+ CASE_OP_32_64(sar):
+ /*
+ * Arithmetic right shift will not reduce the number of
+ * input sign repetitions.
+ */
+ ctx->s_mask = s_mask;
+ break;
+ CASE_OP_32_64(shr):
+ /*
+ * If the sign bit is known zero, then logical right shift
+ * will not reduced the number of input sign repetitions.
+ */
+ sign = (s_mask & -s_mask) >> 1;
+ if (!(z_mask & sign)) {
+ ctx->s_mask = s_mask;
+ }
+ break;
+ default:
+ break;
+ }
+
return false;
}
--
2.25.1
- [PATCH v2 42/48] tcg/optimize: Add more simplifications for orc, (continued)
- [PATCH v2 42/48] tcg/optimize: Add more simplifications for orc, Richard Henderson, 2021/10/07
- [PATCH v2 43/48] tcg/optimize: Stop forcing z_mask to "garbage" for 32-bit values, Richard Henderson, 2021/10/07
- [PATCH v2 40/48] tcg/optimize: Expand fold_addsub2_i32 to 64-bit ops, Richard Henderson, 2021/10/07
- [PATCH v2 41/48] tcg/optimize: Sink commutative operand swapping into fold functions, Richard Henderson, 2021/10/07
- [PATCH v2 45/48] tcg/optimize: Propagate sign info for logical operations, Richard Henderson, 2021/10/07
- [PATCH v2 44/48] tcg/optimize: Optimize sign extensions, Richard Henderson, 2021/10/07
- [PATCH v2 46/48] tcg/optimize: Propagate sign info for setcond, Richard Henderson, 2021/10/07
- [PATCH v2 47/48] tcg/optimize: Propagate sign info for bit counting, Richard Henderson, 2021/10/07
- [PATCH v2 48/48] tcg/optimize: Propagate sign info for shifting,
Richard Henderson <=
- Re: [PATCH v2 00/48] tcg: optimize redundant sign extensions, Richard Henderson, 2021/10/15
- Re: [PATCH v2 00/48] tcg: optimize redundant sign extensions, Alex Bennée, 2021/10/20