re PR target/88905 (ICE: in decompose, at rtl.h:2253 with -mabm and __builtin_popcountll)
authorJakub Jelinek <jakub@redhat.com>
Tue, 22 Jan 2019 09:11:35 +0000 (10:11 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 22 Jan 2019 09:11:35 +0000 (10:11 +0100)
PR target/88905
* optabs.c (add_equal_note): Add op0_mode argument, use it instead of
GET_MODE (op0).
(expand_binop_directly, expand_doubleword_clz,
expand_doubleword_popcount, expand_ctz, expand_ffs,
expand_unop_direct, maybe_emit_unop_insn): Adjust callers.

* gcc.dg/pr88905.c: New test.

From-SVN: r268139

gcc/ChangeLog
gcc/optabs.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr88905.c [new file with mode: 0644]

index e122c6539960e154db23fcced793cc6118e70fde..0b0402aa7ef2c9afadd11c901da7b94cc405b5ff 100644 (file)
@@ -1,5 +1,12 @@
 2019-01-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/88905
+       * optabs.c (add_equal_note): Add op0_mode argument, use it instead of
+       GET_MODE (op0).
+       (expand_binop_directly, expand_doubleword_clz,
+       expand_doubleword_popcount, expand_ctz, expand_ffs,
+       expand_unop_direct, maybe_emit_unop_insn): Adjust callers.
+
        PR rtl-optimization/49429
        PR target/49454
        PR rtl-optimization/86334
index f8dabbfc50df7f42703af17bc6e0d14ec3ba7c2b..ecda620c16118313f2889fea58b4b3785a94e860 100644 (file)
@@ -55,7 +55,7 @@ void debug_optab_libfuncs (void);
 \f
 /* Add a REG_EQUAL note to the last insn in INSNS.  TARGET is being set to
    the result of operation CODE applied to OP0 (and OP1 if it is a binary
-   operation).
+   operation).  OP0_MODE is OP0's mode.
 
    If the last insn does not set TARGET, don't do anything, but return 1.
 
@@ -64,7 +64,8 @@ void debug_optab_libfuncs (void);
    try again, ensuring that TARGET is not one of the operands.  */
 
 static int
-add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op1)
+add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0,
+               rtx op1, machine_mode op0_mode)
 {
   rtx_insn *last_insn;
   rtx set;
@@ -136,16 +137,16 @@ add_equal_note (rtx_insn *insns, rtx target, enum rtx_code code, rtx op0, rtx op
       case POPCOUNT:
       case PARITY:
       case BSWAP:
-       if (GET_MODE (op0) != VOIDmode && GET_MODE (target) != GET_MODE (op0))
+       if (op0_mode != VOIDmode && GET_MODE (target) != op0_mode)
          {
-           note = gen_rtx_fmt_e (code, GET_MODE (op0), copy_rtx (op0));
-           if (GET_MODE_UNIT_SIZE (GET_MODE (op0))
+           note = gen_rtx_fmt_e (code, op0_mode, copy_rtx (op0));
+           if (GET_MODE_UNIT_SIZE (op0_mode)
                > GET_MODE_UNIT_SIZE (GET_MODE (target)))
              note = simplify_gen_unary (TRUNCATE, GET_MODE (target),
-                                        note, GET_MODE (op0));
+                                        note, op0_mode);
            else
              note = simplify_gen_unary (ZERO_EXTEND, GET_MODE (target),
-                                        note, GET_MODE (op0));
+                                        note, op0_mode);
            break;
          }
        /* FALLTHRU */
@@ -1127,7 +1128,7 @@ expand_binop_directly (enum insn_code icode, machine_mode mode, optab binoptab,
       if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX
          && ! add_equal_note (pat, ops[0].value,
                               optab_to_code (binoptab),
-                              ops[1].value, ops[2].value))
+                              ops[1].value, ops[2].value, mode0))
        {
          delete_insns_since (last);
          return expand_binop (mode, binoptab, op0, op1, NULL_RTX,
@@ -2298,7 +2299,7 @@ expand_doubleword_clz (scalar_int_mode mode, rtx op0, rtx target)
   seq = get_insns ();
   end_sequence ();
 
-  add_equal_note (seq, target, CLZ, xop0, 0);
+  add_equal_note (seq, target, CLZ, xop0, NULL_RTX, mode);
   emit_insn (seq);
   return target;
 
@@ -2340,7 +2341,7 @@ expand_doubleword_popcount (scalar_int_mode mode, rtx op0, rtx target)
   seq = get_insns ();
   end_sequence ();
 
-  add_equal_note (seq, t, POPCOUNT, op0, 0);
+  add_equal_note (seq, t, POPCOUNT, op0, NULL_RTX, mode);
   emit_insn (seq);
   return t;
 }
@@ -2511,7 +2512,7 @@ expand_ctz (scalar_int_mode mode, rtx op0, rtx target)
   seq = get_insns ();
   end_sequence ();
 
-  add_equal_note (seq, temp, CTZ, op0, 0);
+  add_equal_note (seq, temp, CTZ, op0, NULL_RTX, mode);
   emit_insn (seq);
   return temp;
 }
@@ -2589,7 +2590,7 @@ expand_ffs (scalar_int_mode mode, rtx op0, rtx target)
   seq = get_insns ();
   end_sequence ();
 
-  add_equal_note (seq, temp, FFS, op0, 0);
+  add_equal_note (seq, temp, FFS, op0, NULL_RTX, mode);
   emit_insn (seq);
   return temp;
 
@@ -2736,7 +2737,7 @@ expand_unop_direct (machine_mode mode, optab unoptab, rtx op0, rtx target,
          if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX
              && ! add_equal_note (pat, ops[0].value,
                                   optab_to_code (unoptab),
-                                  ops[1].value, NULL_RTX))
+                                  ops[1].value, NULL_RTX, mode))
            {
              delete_insns_since (last);
              return expand_unop (mode, unoptab, op0, NULL_RTX, unsignedp);
@@ -3588,7 +3589,8 @@ maybe_emit_unop_insn (enum insn_code icode, rtx target, rtx op0,
 
   if (INSN_P (pat) && NEXT_INSN (pat) != NULL_RTX
       && code != UNKNOWN)
-    add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX);
+    add_equal_note (pat, ops[0].value, code, ops[1].value, NULL_RTX,
+                   GET_MODE (op0));
 
   emit_insn (pat);
 
index 56e8174c8ff93557ebd132d7ba5a97afce18579c..807c7188ff2016acaf86d6718befcdc457449490 100644 (file)
@@ -1,5 +1,8 @@
 2019-01-22  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/88905
+       * gcc.dg/pr88905.c: New test.
+
        PR rtl-optimization/49429
        PR target/49454
        PR rtl-optimization/86334
diff --git a/gcc/testsuite/gcc.dg/pr88905.c b/gcc/testsuite/gcc.dg/pr88905.c
new file mode 100644 (file)
index 0000000..89792f4
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR target/88905 */
+/* { dg-do compile } */
+/* { dg-options "-Og -fno-tree-ccp" } */
+/* { dg-additional-options "-mabm" { target { i?86-*-* x86_64-*-* } } } */
+
+int a, b, c;
+extern void baz (int);
+
+static inline int
+bar (unsigned u)
+{
+  int i = __builtin_popcountll (-(unsigned long long) u);
+  baz (i & c);
+  return a + b + c;
+}
+
+void
+foo (void)
+{
+  bar (2376498292ULL);
+}