aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-03-12 13:02:42 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-03-12 13:02:42 +0000
commit6899585abf17b4e39856cfad454b8cb21424838f (patch)
tree9ceb774564833f61a19b23ec390e9101e1131c61 /gcc/fold-const.c
parentf8af0e30507397f8ad7895d788b432b6695a4a66 (diff)
downloadgcc-6899585abf17b4e39856cfad454b8cb21424838f.zip
gcc-6899585abf17b4e39856cfad454b8cb21424838f.tar.gz
gcc-6899585abf17b4e39856cfad454b8cb21424838f.tar.bz2
re PR ipa/65270 (issues with merging memory accesses from different code paths)
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. From-SVN: r221386
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 915d639..6d085b1 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -2934,21 +2934,12 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
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))
+ 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)),
@@ -2963,8 +2954,15 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
&& (MR_DEPENDENCE_BASE (arg0)
== MR_DEPENDENCE_BASE (arg1))
&& (TYPE_ALIGN (TREE_TYPE (arg0))
- == TYPE_ALIGN (TREE_TYPE (arg1)))))
- && OP_SAME (0) && OP_SAME (1));
+ == 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: