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: