On Tue, Jul 23, 2024 at 10:07:08AM +0200, Jakub Jelinek wrote:
> Anyway, yet another option because non_rewritable_mem_ref_base has
> the VECTOR/COMPLEX types cases together would be to have them together
> in maybe_rewrite_mem_ref_base too, so do:

In patch form that would be:

2024-07-23  Jakub Jelinek  <ja...@redhat.com>
            Andrew Pinski  <quic_apin...@quicinc.com>

        PR tree-optimization/116034
        * tree-ssa.cc (maybe_rewrite_mem_ref_base): Merge the VECTOR and COMPLEX
        type checks.

        * gcc.dg/pr116034.c: New test.

--- gcc/tree-ssa.cc.jj  2024-03-11 11:00:46.768915988 +0100
+++ gcc/tree-ssa.cc     2024-07-23 10:24:54.564568968 +0200
@@ -1492,25 +1492,23 @@ maybe_rewrite_mem_ref_base (tree *tp, bi
       && is_gimple_reg_type (TREE_TYPE (*tp))
       && ! VOID_TYPE_P (TREE_TYPE (*tp)))
     {
-      if (VECTOR_TYPE_P (TREE_TYPE (sym))
+      if ((VECTOR_TYPE_P (TREE_TYPE (sym))
+          || TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE)
          && useless_type_conversion_p (TREE_TYPE (*tp),
                                        TREE_TYPE (TREE_TYPE (sym)))
          && multiple_p (mem_ref_offset (*tp),
                         wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp)))))
        {
-         *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym, 
-                       TYPE_SIZE (TREE_TYPE (*tp)),
-                       int_const_binop (MULT_EXPR,
-                                        bitsize_int (BITS_PER_UNIT),
-                                        TREE_OPERAND (*tp, 1)));
-       }
-      else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
-              && useless_type_conversion_p (TREE_TYPE (*tp),
-                                            TREE_TYPE (TREE_TYPE (sym))))
-       {
-         *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
-                       ? REALPART_EXPR : IMAGPART_EXPR,
-                       TREE_TYPE (*tp), sym);
+         if (VECTOR_TYPE_P (TREE_TYPE (sym)))
+           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym, 
+                         TYPE_SIZE (TREE_TYPE (*tp)),
+                         int_const_binop (MULT_EXPR,
+                                          bitsize_int (BITS_PER_UNIT),
+                                          TREE_OPERAND (*tp, 1)));
+         else
+           *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
+                         ? REALPART_EXPR : IMAGPART_EXPR,
+                         TREE_TYPE (*tp), sym);
        }
       else if (integer_zerop (TREE_OPERAND (*tp, 1))
               && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
--- gcc/testsuite/gcc.dg/pr116034.c.jj  2024-07-22 21:39:50.050994243 +0200
+++ gcc/testsuite/gcc.dg/pr116034.c     2024-07-23 10:26:29.940340508 +0200
@@ -0,0 +1,22 @@
+/* PR tree-optimization/116034 */
+/* { dg-do run } */
+/* { dg-options "-O1 -fno-strict-aliasing" } */
+
+int g;
+
+static inline int
+foo (_Complex unsigned short c)
+{
+  __builtin_memmove (&g, 1 + (char *) &c, 2);
+  return g;
+}
+
+int
+main ()
+{
+  if (__SIZEOF_SHORT__ == 2
+      && __CHAR_BIT__ == 8
+      && (foo (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ ? 0x100 : 1)
+         != (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ ? 1 : 0x100)))
+    __builtin_abort ();
+}


        Jakub

Reply via email to