This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix recent OEP_ADDRESS_OF change
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 12 Mar 2015 13:57:42 +0100 (CET)
- Subject: [PATCH] Fix recent OEP_ADDRESS_OF change
- Authentication-results: sourceware.org; auth=none
This fixes sth noticed by Honza - I was resetting OEP_ADDRESS_OF
before actually testing for it in MEM_REF/TARGET_MEM_REF handling.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
2015-03-12 Richard Biener <rguenther@suse.de>
PR middle-end/65270
* fold-const.c (operand_equal_p): Fix ordering of resetting
OEP_ADDRESS_OF and checking for it in the [TARGET_]MEM_REF case.
Index: gcc/fold-const.c
===================================================================
*** gcc/fold-const.c (revision 221324)
--- gcc/fold-const.c (working copy)
*************** operand_equal_p (const_tree arg0, const_
*** 2934,2954 ****
return OP_SAME (0);
case TARGET_MEM_REF:
- flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_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)
- || !OP_SAME_WITH_NULL (3)
- || !OP_SAME_WITH_NULL (4))
- return 0;
- /* Fallthru. */
case MEM_REF:
- flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_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 frontend
though. Also verify the types are compatible. */
! return ((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1))
|| (TYPE_SIZE (TREE_TYPE (arg0))
&& TYPE_SIZE (TREE_TYPE (arg1))
&& operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)),
--- 2934,2945 ----
return OP_SAME (0);
case TARGET_MEM_REF:
case MEM_REF:
/* Require equal access sizes, and similar pointer types.
We can have incomplete types for array references of
variable-sized arrays from the Fortran frontend
though. Also verify the types are compatible. */
! if (!((TYPE_SIZE (TREE_TYPE (arg0)) == TYPE_SIZE (TREE_TYPE (arg1))
|| (TYPE_SIZE (TREE_TYPE (arg0))
&& TYPE_SIZE (TREE_TYPE (arg1))
&& operand_equal_p (TYPE_SIZE (TREE_TYPE (arg0)),
*************** operand_equal_p (const_tree arg0, const_
*** 2963,2970 ****
&& (MR_DEPENDENCE_BASE (arg0)
== MR_DEPENDENCE_BASE (arg1))
&& (TYPE_ALIGN (TREE_TYPE (arg0))
! == TYPE_ALIGN (TREE_TYPE (arg1)))))
! && OP_SAME (0) && OP_SAME (1));
case ARRAY_REF:
case ARRAY_RANGE_REF:
--- 2954,2968 ----
&& (MR_DEPENDENCE_BASE (arg0)
== MR_DEPENDENCE_BASE (arg1))
&& (TYPE_ALIGN (TREE_TYPE (arg0))
! == TYPE_ALIGN (TREE_TYPE (arg1)))))))
! return 0;
! flags &= ~(OEP_CONSTANT_ADDRESS_OF|OEP_ADDRESS_OF);
! return (OP_SAME (0) && OP_SAME (1)
! /* TARGET_MEM_REF require equal extra operands. */
! && (TREE_CODE (arg0) != TARGET_MEM_REF
! || (OP_SAME_WITH_NULL (2)
! && OP_SAME_WITH_NULL (3)
! && OP_SAME_WITH_NULL (4))));
case ARRAY_REF:
case ARRAY_RANGE_REF: