]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/69801 (gcc ICE on valid code on x86_64-linux-gnu in "operand...
authorRichard Biener <rguenther@suse.de>
Tue, 16 Feb 2016 08:39:22 +0000 (08:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 16 Feb 2016 08:39:22 +0000 (08:39 +0000)
2016-02-16  Richard Biener  <rguenther@suse.de>

PR middle-end/69801
* fold-const.c (operand_equal_p): For COND_EXPR zero operand
mask OEP_ADDRESS_OF.

* gcc.dg/pr69801.c: New testcase.

From-SVN: r233444

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr69801.c [new file with mode: 0644]

index bb8d543a0b011ac79c05c215ed61f9eb63f2065f..bb58d51c2e3e42fed22eb951b02c910022a307d8 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-16  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/69801
+       * fold-const.c (operand_equal_p): For COND_EXPR zero operand
+       mask OEP_ADDRESS_OF.
+
 2016-02-16  Alan Modra  <amodra@gmail.com>
 
        PR target/68973
index e34bc81eae8f1458730e9c68d465d9180dbc9285..4992f4bdfb88126bc7e9ce8a65bb783fb9a45f20 100644 (file)
@@ -3118,6 +3118,11 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
                                      TREE_OPERAND (arg1, 0), flags));
 
        case COND_EXPR:
+         if (! OP_SAME (1) || ! OP_SAME (2))
+           return 0;
+         flags &= ~OEP_ADDRESS_OF;
+         return OP_SAME (0);
+
        case VEC_COND_EXPR:
        case DOT_PROD_EXPR:
          return OP_SAME (0) && OP_SAME (1) && OP_SAME (2);
index 020ab2b4a03525e6b6b808ba1a7b53a6ceed54e3..9ce6eb83836f70a0751f400f7965bddacb43b418 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-16  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/69801
+       * gcc.dg/pr69801.c: New testcase.
+
 2016-02-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/69651
diff --git a/gcc/testsuite/gcc.dg/pr69801.c b/gcc/testsuite/gcc.dg/pr69801.c
new file mode 100644 (file)
index 0000000..474cf83
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+struct {
+    char c[1];
+} b, c;
+int d, e;
+void fn1() { e ? (d ? b : c).c : (d ? b : c).c; }