diff options
author | Jakub Jelinek <jakub@redhat.com> | 2024-07-23 10:50:29 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2024-07-23 10:51:32 +0200 |
commit | b9cefd67a2a464a3c9413e6b3f28e7dc7a9ef162 (patch) | |
tree | 20cca0ca8543affa89b479e18e04b96ecc8d9f13 /gcc | |
parent | 58756c9f5507e5db0eaddcbaaa2de7f39c34b5d0 (diff) | |
download | gcc-b9cefd67a2a464a3c9413e6b3f28e7dc7a9ef162.zip gcc-b9cefd67a2a464a3c9413e6b3f28e7dc7a9ef162.tar.gz gcc-b9cefd67a2a464a3c9413e6b3f28e7dc7a9ef162.tar.bz2 |
ssa: Fix up maybe_rewrite_mem_ref_base complex type handling [PR116034]
The folding into REALPART_EXPR is correct, used only when the mem_offset
is zero, but for IMAGPART_EXPR it didn't check the exact offset value (just
that it is not 0).
The following patch fixes that by using IMAGPART_EXPR only if the offset
is right and using BITFIELD_REF or whatever else otherwise.
2024-07-23 Jakub Jelinek <jakub@redhat.com>
Andrew Pinski <quic_apinski@quicinc.com>
PR tree-optimization/116034
* tree-ssa.cc (maybe_rewrite_mem_ref_base): Only use IMAGPART_EXPR
if MEM_REF offset is equal to element type size.
* gcc.dg/pr116034.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr116034.c | 22 | ||||
-rw-r--r-- | gcc/tree-ssa.cc | 5 |
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr116034.c b/gcc/testsuite/gcc.dg/pr116034.c new file mode 100644 index 0000000..9a31de0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr116034.c @@ -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 (); +} diff --git a/gcc/tree-ssa.cc b/gcc/tree-ssa.cc index 27ab9cf..f4fa4e9 100644 --- a/gcc/tree-ssa.cc +++ b/gcc/tree-ssa.cc @@ -1506,7 +1506,10 @@ maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming) } else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE && useless_type_conversion_p (TREE_TYPE (*tp), - TREE_TYPE (TREE_TYPE (sym)))) + TREE_TYPE (TREE_TYPE (sym))) + && (integer_zerop (TREE_OPERAND (*tp, 1)) + || tree_int_cst_equal (TREE_OPERAND (*tp, 1), + TYPE_SIZE_UNIT (TREE_TYPE (*tp))))) { *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1)) ? REALPART_EXPR : IMAGPART_EXPR, |