diff options
author | Richard Biener <rguenther@suse.de> | 2015-03-12 13:02:42 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-03-12 13:02:42 +0000 |
commit | 6899585abf17b4e39856cfad454b8cb21424838f (patch) | |
tree | 9ceb774564833f61a19b23ec390e9101e1131c61 /gcc/fold-const.c | |
parent | f8af0e30507397f8ad7895d788b432b6695a4a66 (diff) | |
download | gcc-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.c | 22 |
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: |