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