re PR target/91204 (ICE in expand_expr_real_2, at expr.c:9215 with -O3)
authorJakub Jelinek <jakub@redhat.com>
Sat, 20 Jul 2019 17:13:00 +0000 (19:13 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 20 Jul 2019 17:13:00 +0000 (19:13 +0200)
PR target/91204
* optabs.c (expand_unop): As fallback, expand ~op0 as op0 ^ -1.

* gcc.c-torture/compile/pr91204.c: New test.

From-SVN: r273629

gcc/ChangeLog
gcc/optabs.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr91204.c [new file with mode: 0644]

index 8adea2d7b3548f3656ada5028b83219923b2c4c6..535636bb830da74c2cbfb3dea89c9723264d823d 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/91204
+       * optabs.c (expand_unop): As fallback, expand ~op0 as op0 ^ -1.
+
 2019-07-20  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.h (hppa_profile_hook): Delete declaration.
index 4b39ff61193ccb256f76883b4e73d33040514c80..06bcaab1f550f0d6a8c67a106d66b23bd21897f7 100644 (file)
@@ -2972,6 +2972,17 @@ expand_unop (machine_mode mode, optab unoptab, rtx op0, rtx target,
       return target;
     }
 
+  /* Emit ~op0 as op0 ^ -1.  */
+  if (unoptab == one_cmpl_optab
+      && (SCALAR_INT_MODE_P (mode) || GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
+      && optab_handler (xor_optab, mode) != CODE_FOR_nothing)
+    {
+      temp = expand_binop (mode, xor_optab, op0, CONSTM1_RTX (mode),
+                          target, unsignedp, OPTAB_DIRECT);
+      if (temp)
+       return temp;
+    }
+
   if (optab_to_code (unoptab) == NEG)
     {
       /* Try negating floating point values by flipping the sign bit.  */
index adefdb937ab605f7659468ed9093bd0d66568f69..cd553db4b39e3dc92da15db9f64730dae37c48b2 100644 (file)
@@ -1,5 +1,8 @@
 2019-07-20  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/91204
+       * gcc.c-torture/compile/pr91204.c: New test.
+
        * c-c++-common/gomp/cancel-1.c: Adjust expected diagnostic wording.
        * c-c++-common/gomp/clauses-1.c (foo, baz, bar): Add order(concurrent)
        clause where allowed.  Add combined constructs with loop with all
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr91204.c b/gcc/testsuite/gcc.c-torture/compile/pr91204.c
new file mode 100644 (file)
index 0000000..dc26732
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR target/91204 */
+
+int a, b, c[64];
+
+void
+foo (void)
+{
+  int i;
+  for (i = 2; i < 64; i++)
+    c[i] &= b ^ c[i] ^ c[i - 2];
+}