]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c/70307
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Apr 2016 08:11:46 +0000 (08:11 +0000)
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 4 Apr 2016 08:11:46 +0000 (08:11 +0000)
* c-fold.c (c_fully_fold_internal): Handle VEC_COND_EXPR.

* gcc.dg/torture/pr70307.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234706 138bc75d-0d04-0410-961f-82ee72b054a4

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

index b52b414478fd845be3ee9a2e7a73c655e28cd10a..56e0b4d8863b6c172906db5213148f154a3b29db 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-04  Marek Polacek  <polacek@redhat.com>
+
+       PR c/70307
+       * c-fold.c (c_fully_fold_internal): Handle VEC_COND_EXPR.
+
 2016-03-31  Marek Polacek  <polacek@redhat.com>
 
        PR c/70297
index f07917f17e788a2dbf185a639695eeb8aa4be293..6c82f242bf142c050ebcff8210126c5a930d94b5 100644 (file)
@@ -528,6 +528,26 @@ c_fully_fold_internal (tree expr, bool in_init, bool *maybe_const_operands,
        *maybe_const_itself &= op2_const_self;
       goto out;
 
+    case VEC_COND_EXPR:
+      orig_op0 = op0 = TREE_OPERAND (expr, 0);
+      orig_op1 = op1 = TREE_OPERAND (expr, 1);
+      orig_op2 = op2 = TREE_OPERAND (expr, 2);
+      op0 = c_fully_fold_internal (op0, in_init, maybe_const_operands,
+                                  maybe_const_itself, for_int_const);
+      STRIP_TYPE_NOPS (op0);
+      op1 = c_fully_fold_internal (op1, in_init, maybe_const_operands,
+                                  maybe_const_itself, for_int_const);
+      STRIP_TYPE_NOPS (op1);
+      op2 = c_fully_fold_internal (op2, in_init, maybe_const_operands,
+                                  maybe_const_itself, for_int_const);
+      STRIP_TYPE_NOPS (op2);
+
+      if (op0 != orig_op0 || op1 != orig_op1 || op2 != orig_op2)
+       ret = fold_build3_loc (loc, code, TREE_TYPE (expr), op0, op1, op2);
+      else
+       ret = fold (expr);
+      goto out;
+
     case EXCESS_PRECISION_EXPR:
       /* Each case where an operand with excess precision may be
         encountered must remove the EXCESS_PRECISION_EXPR around
index ffee4f7fa25458d714f37d3f4a501d759e56a3c5..a8bd7110827845abe8de06121e1ed67bf559b501 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-04  Marek Polacek  <polacek@redhat.com>
+
+       PR c/70307
+       * gcc.dg/torture/pr70307.c: New test.
+
 2016-04-03  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/70416
diff --git a/gcc/testsuite/gcc.dg/torture/pr70307.c b/gcc/testsuite/gcc.dg/torture/pr70307.c
new file mode 100644 (file)
index 0000000..d47c4b6
--- /dev/null
@@ -0,0 +1,62 @@
+/* PR c/70307 */
+/* { dg-do compile } */
+
+typedef int v4si __attribute__ ((vector_size (16)));
+
+v4si foo (v4si);
+
+v4si
+fn1 (int i)
+{
+  return i <= (v4si){(0, 0)};
+}
+
+v4si
+fn2 (int i)
+{
+  v4si r;
+  r = i <= (v4si){(0, 0)};
+  return r;
+}
+
+v4si
+fn3 (int i)
+{
+  return foo (i <= (v4si){(0, 0)});
+}
+
+v4si
+fn4 (int i)
+{
+  struct S { v4si v; };
+  struct S s = { .v = i <= (v4si){(0, 0)} };
+  return s.v;
+}
+
+v4si
+fn5 (int i)
+{
+  return (v4si){(1, i++)} == (v4si){(0, 0)};
+}
+
+v4si
+fn6 (int i)
+{
+  v4si r;
+  r = (v4si){(1, i++)} == (v4si){(0, 0)};
+  return r;
+}
+
+v4si
+fn7 (int i)
+{
+  return foo ((v4si){(1, i++)} == (v4si){(0, 0)});
+}
+
+v4si
+fn8 (int i)
+{
+  struct S { v4si v; };
+  struct S s = { .v = (v4si){(1, i++)} == (v4si){(0, 0)} };
+  return s.v;
+}