https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77937
Bill Schmidt <wschmidt at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target| |x86_64-pc-linux-gnu
--- Comment #5 from Bill Schmidt <wschmidt at gcc dot gnu.org> ---
OK, thanks. While I get a cross built, could you please try the following
patch?
Index: gcc/gimple-ssa-strength-reduction.c
===================================================================
--- gcc/gimple-ssa-strength-reduction.c (revision 240946)
+++ gcc/gimple-ssa-strength-reduction.c (working copy)
@@ -3367,7 +3367,7 @@ replace_one_candidate (slsr_cand_t c, unsigned i,
{
tree stride_type = TREE_TYPE (c->stride);
tree orig_type = TREE_TYPE (orig_rhs2);
- gcc_assert (repl_code != POINTER_PLUS_EXPR);
+ tree basis_type = TREE_TYPE (basis_name);
if (types_compatible_p (orig_type, stride_type))
rhs2 = c->stride;
@@ -3374,7 +3374,16 @@ replace_one_candidate (slsr_cand_t c, unsigned i,
else
rhs2 = introduce_cast_before_cand (c, orig_type, c->stride);
- if (orig_code != MINUS_EXPR
+ if (POINTER_TYPE_P (basis_type))
+ {
+ tree neg_stride = fold_unary (NEGATE_EXPR, sizetype, rhs2);
+ gimple_stmt_iterator gsi = gsi_for_stmt (c->cand_stmt);
+ gimple_assign_set_rhs_with_ops (&gsi, POINTER_PLUS_EXPR,
+ basis_name, neg_stride);
+ update_stmt (gsi_stmt (gsi));
+ c->cand_stmt = gsi_stmt (gsi);
+ }
+ else if (orig_code != MINUS_EXPR
|| !operand_equal_p (basis_name, orig_rhs1, 0)
|| !operand_equal_p (rhs2, orig_rhs2, 0))
{