https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69186

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, here we have

t.c:8:3: note: Detected single element interleaving a[b.0_14][2] step 8
t.c:8:3: note: not consecutive access a[b.0_14][2] = _6;
t.c:8:3: note: using strided accesses

thus strided store vs. interleaving.

But

  int dr_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr))));
  int dr_peel_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr_peel))));
...
  if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
    dr_size *= GROUP_SIZE (vinfo_for_stmt (GROUP_FIRST_ELEMENT (stmt_info)));
  if (STMT_VINFO_GROUPED_ACCESS (peel_stmt_info))
    dr_peel_size *= GROUP_SIZE (peel_stmt_info);
...
      gcc_assert (DR_MISALIGNMENT (dr) / dr_size ==
                  DR_MISALIGNMENT (dr_peel) / dr_peel_size);

doesn't make much sense to me anyway.

Note that by construction SAME_ALIGN_REFS evolve in lock-step (dependence
distance zero or a multiple of the vectorization factor).

In fact

  if (known_alignment_for_access_p (dr)
      && known_alignment_for_access_p (dr_peel))
    {
      bool negative = tree_int_cst_compare (DR_STEP (dr), size_zero_node) < 0;
      int misal = DR_MISALIGNMENT (dr);
      tree vectype = STMT_VINFO_VECTYPE (stmt_info);
      misal += negative ? -npeel * dr_size : npeel * dr_size;
      misal &= (TYPE_ALIGN (vectype) / BITS_PER_UNIT) - 1;
      SET_DR_MISALIGNMENT (dr, misal);
      return;
    }

looks bogus to me.  It should use npeel * dr_step (not dr_size and
the odd way it is computed - usually "correctly" of course).

Well.  I'll just guard the call appropriately.

Reply via email to