diff --git a/gcc11-pr116034.patch b/gcc11-pr116034.patch index d282f3a..3026157 100644 --- a/gcc11-pr116034.patch +++ b/gcc11-pr116034.patch @@ -1,29 +1,32 @@ -2024-07-22 Jakub Jelinek - Andrew Pinski +commit 084768c865cd50a6f7ff177db2dbdbb7aadaeee0 +Author: Jakub Jelinek +Date: Tue Jul 23 10:50:29 2024 +0200 - PR tree-optimization/116034 - * tree-sra.c (maybe_rewrite_mem_ref_base): Only use IMAGPART_EXPR - if MEM_REF offset is equal to element type size. + 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 + Andrew Pinski + + 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. + + (cherry picked from commit b9cefd67a2a464a3c9413e6b3f28e7dc7a9ef162) - * gcc.dg/pr116034.c: New test. - ---- gcc/tree-ssa.c.jj 2024-03-11 11:00:46.768915988 +0100 -+++ gcc/tree-ssa.c 2024-07-22 21:27:02.115530861 +0200 -@@ -1506,7 +1506,10 @@ maybe_rewrite_mem_ref_base (tree *tp, bi - } - 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, ---- gcc/testsuite/gcc.dg/pr116034.c.jj 2024-07-22 21:39:50.050994243 +0200 -+++ gcc/testsuite/gcc.dg/pr116034.c 2024-07-22 21:39:32.432213042 +0200 -@@ -0,0 +1,21 @@ +diff --git a/gcc/testsuite/gcc.dg/pr116034.c b/gcc/testsuite/gcc.dg/pr116034.c +new file mode 100644 +index 00000000000..9a31de03424 +--- /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" } */ @@ -42,6 +45,23 @@ +{ + if (__SIZEOF_SHORT__ == 2 + && __CHAR_BIT__ == 8 -+ && foo (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ ? 0x0100 : 1) != 1) ++ && (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 27ab9cfac82..f4fa4e98c5d 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,