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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |jakub at gcc dot gnu.org

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Untested fix:
--- gcc/gimple-ssa-store-merging.c.jj   2021-04-01 10:50:56.238629197 +0200
+++ gcc/gimple-ssa-store-merging.c      2021-04-02 16:52:38.763803716 +0200
@@ -985,10 +985,19 @@ public:
 static tree
 bswap_view_convert (gimple_stmt_iterator *gsi, tree type, tree val)
 {
-  gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (val)));
+  gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (val))
+             || POINTER_TYPE_P (TREE_TYPE (val)));
   if (TYPE_SIZE (type) != TYPE_SIZE (TREE_TYPE (val)))
     {
       HOST_WIDE_INT prec = TREE_INT_CST_LOW (TYPE_SIZE (type));
+      if (POINTER_TYPE_P (TREE_TYPE (val)))
+       {
+         gimple *g
+           = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
+                                  NOP_EXPR, val);
+         gsi_insert_before (gsi, g, GSI_SAME_STMT);
+         val = gimple_assign_lhs (g);
+       }
       tree itype = build_nonstandard_integer_type (prec, 1);
       gimple *g = gimple_build_assign (make_ssa_name (itype), NOP_EXPR, val);
       gsi_insert_before (gsi, g, GSI_SAME_STMT);

Slightly cleaned up testcase:
void
foo (char *p, void *q)
{
  __INTPTR_TYPE__ i = (__INTPTR_TYPE__) q;
  p[2] = i;
  i >>= 8;
  p[3] = i;
  i >>= 8;
  p[4] = i;
  i >>= 8;
  p[5] = i;
  i >>= 8;
  p[6] = i;
  i >>= 8;
  p[7] = i;
  i >>= 8;
  p[8] = i;
  i >>= 8;
  p[9] = i;
}

void
bar (char *p, void *q)
{
  __INTPTR_TYPE__ i = (__INTPTR_TYPE__) q;
  p[2] = i;
  i >>= 8;
  p[3] = i;
  i >>= 8;
  p[4] = i;
  i >>= 8;
  p[5] = i;
}

Reply via email to