From: Jakub Jelinek Date: Tue, 26 Feb 2013 10:00:31 +0000 (+0100) Subject: re PR tree-optimization/56448 (cc1 hangs on volatile array with -O or above) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cecbe5d9c327af05a0fb36c7b05de39d26c067cf;p=gcc.git re PR tree-optimization/56448 (cc1 hangs on volatile array with -O or above) PR tree-optimization/56448 * fold-const.c (operand_equal_p) : Don't look at TREE_SIDE_EFFECTS if flags contain OEP_CONSTANT_ADDRESS_OF. Clear OEP_CONSTANT_ADDRESS_OF from flags before recursing on second or later operands of the references, or even first operand for INDIRECT_REF, TARGET_MEM_REF or MEM_REF. * gcc.c-torture/compile/pr56448.c: New test. From-SVN: r196278 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0fc1478c3de..7b9b547b57a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2013-02-26 Jakub Jelinek + PR tree-optimization/56448 + * fold-const.c (operand_equal_p) : Don't look at + TREE_SIDE_EFFECTS if flags contain OEP_CONSTANT_ADDRESS_OF. + Clear OEP_CONSTANT_ADDRESS_OF from flags before recursing on second or + later operands of the references, or even first operand for + INDIRECT_REF, TARGET_MEM_REF or MEM_REF. + PR tree-optimization/56443 * tree-vect-stmts.c (get_vectype_for_scalar_type_and_size): For overaligned types, pass TYPE_UNSIGNED (scalar_type) as second argument diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 5acb4ad0059..26cfc0e83e4 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2542,19 +2542,25 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) case tcc_reference: /* If either of the pointer (or reference) expressions we are - dereferencing contain a side effect, these cannot be equal. */ - if (TREE_SIDE_EFFECTS (arg0) - || TREE_SIDE_EFFECTS (arg1)) + dereferencing contain a side effect, these cannot be equal, + but their addresses can be. */ + if ((flags & OEP_CONSTANT_ADDRESS_OF) == 0 + && (TREE_SIDE_EFFECTS (arg0) + || TREE_SIDE_EFFECTS (arg1))) return 0; switch (TREE_CODE (arg0)) { case INDIRECT_REF: + flags &= ~OEP_CONSTANT_ADDRESS_OF; + return OP_SAME (0); + case REALPART_EXPR: case IMAGPART_EXPR: return OP_SAME (0); case TARGET_MEM_REF: + flags &= ~OEP_CONSTANT_ADDRESS_OF; /* Require equal extra operands and then fall through to MEM_REF handling of the two common operands. */ if (!OP_SAME_WITH_NULL (2) @@ -2563,6 +2569,7 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) return 0; /* Fallthru. */ case MEM_REF: + flags &= ~OEP_CONSTANT_ADDRESS_OF; /* Require equal access sizes, and similar pointer types. We can have incomplete types for array references of variable-sized arrays from the Fortran frontent @@ -2581,22 +2588,28 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) /* Operands 2 and 3 may be null. Compare the array index by value if it is constant first as we may have different types but same value here. */ - return (OP_SAME (0) - && (tree_int_cst_equal (TREE_OPERAND (arg0, 1), - TREE_OPERAND (arg1, 1)) - || OP_SAME (1)) + if (!OP_SAME (0)) + return 0; + flags &= ~OEP_CONSTANT_ADDRESS_OF; + return ((tree_int_cst_equal (TREE_OPERAND (arg0, 1), + TREE_OPERAND (arg1, 1)) + || OP_SAME (1)) && OP_SAME_WITH_NULL (2) && OP_SAME_WITH_NULL (3)); case COMPONENT_REF: /* Handle operand 2 the same as for ARRAY_REF. Operand 0 may be NULL when we're called to compare MEM_EXPRs. */ - return OP_SAME_WITH_NULL (0) - && OP_SAME (1) - && OP_SAME_WITH_NULL (2); + if (!OP_SAME_WITH_NULL (0)) + return 0; + flags &= ~OEP_CONSTANT_ADDRESS_OF; + return OP_SAME (1) && OP_SAME_WITH_NULL (2); case BIT_FIELD_REF: - return OP_SAME (0) && OP_SAME (1) && OP_SAME (2); + if (!OP_SAME (0)) + return 0; + flags &= ~OEP_CONSTANT_ADDRESS_OF; + return OP_SAME (1) && OP_SAME (2); default: return 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8356fa46502..1da7b6fe03a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2013-02-26 Jakub Jelinek + PR tree-optimization/56448 + * gcc.c-torture/compile/pr56448.c: New test. + PR tree-optimization/56443 * gcc.dg/torture/pr56443.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr56448.c b/gcc/testsuite/gcc.c-torture/compile/pr56448.c new file mode 100644 index 00000000000..f10da6ce752 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr56448.c @@ -0,0 +1,14 @@ +/* PR tree-optimization/56448 */ + +volatile int a[1]; +int b; + +void +foo () +{ + for (;;) + { + int *c[3][6] = { 0, 0, 0, &b, 0, 0, 0, 0, &b, 0, 0, 0, 0, 0, 0, 0, &b, (int *) &a[0] }; + b = *c[2][5]; + } +}