aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-03-18 14:01:49 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-03-18 14:01:49 +0100
commit38c56a5b2121ab8f12e153e02cea4da777689ce4 (patch)
treeedd39377c62a36f1b67537647bc63e14c31e0e78 /gcc
parenta6178a256dcec7f9ad2475ef5192dd3c05e2633f (diff)
downloadgcc-38c56a5b2121ab8f12e153e02cea4da777689ce4.zip
gcc-38c56a5b2121ab8f12e153e02cea4da777689ce4.tar.gz
gcc-38c56a5b2121ab8f12e153e02cea4da777689ce4.tar.bz2
re PR tree-optimization/56635 (internal compiler error: in find_lattice_value, at tree-complex.c:15)
PR tree-optimization/56635 * fold-const.c (operand_equal_p): For MEM_REF and TARGET_MEM_REF, require types_compatible_p types. * g++.dg/torture/pr56635.C: New test. From-SVN: r196781
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr56635.C17
4 files changed, 31 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0bae8e6..de91c80 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/56635
+ * fold-const.c (operand_equal_p): For MEM_REF and TARGET_MEM_REF,
+ require types_compatible_p types.
+
2013-03-18 Nick Clifton <nickc@redhat.com>
* config/stormy16/stormy16.c (xstormy16_expand_prologue): Remove
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 26cfc0e..de7117e 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -2572,13 +2572,14 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
flags &= ~OEP_CONSTANT_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 frontent
- though. */
+ 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)),
TYPE_SIZE (TREE_TYPE (arg1)), flags)))
+ && types_compatible_p (TREE_TYPE (arg0), TREE_TYPE (arg1))
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg0, 1)))
== TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg1, 1))))
&& OP_SAME (0) && OP_SAME (1));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 20b206a..4240674 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/56635
+ * g++.dg/torture/pr56635.C: New test.
+
2013-03-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/3713
diff --git a/gcc/testsuite/g++.dg/torture/pr56635.C b/gcc/testsuite/g++.dg/torture/pr56635.C
new file mode 100644
index 0000000..53d6bb9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr56635.C
@@ -0,0 +1,17 @@
+// PR tree-optimization/56635
+// { dg-do compile }
+
+struct A { _Complex double a; };
+
+void
+foo (A **x, A **y)
+{
+ A r;
+ if (__real__ x[0]->a)
+ {
+ r.a = y[0]->a / x[0]->a;
+ **x = r;
+ }
+ else
+ **x = **y;
+}