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  <rguent...@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:

Reply via email to