From: Jakub Jelinek Date: Tue, 22 Jan 2019 09:11:35 +0000 (+0100) Subject: re PR target/88905 (ICE: in decompose, at rtl.h:2253 with -mabm and __builtin_popcountll) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c875d46fefac13675853f58ec7dea8f402779af0;p=gcc.git re PR target/88905 (ICE: in decompose, at rtl.h:2253 with -mabm and __builtin_popcountll) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e122c653996..0b0402aa7ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2019-01-22 Jakub Jelinek + 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 diff --git a/gcc/optabs.c b/gcc/optabs.c index f8dabbfc50d..ecda620c161 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -55,7 +55,7 @@ void debug_optab_libfuncs (void); /* 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 56e8174c8ff..807c7188ff2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-01-22 Jakub Jelinek + 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 index 00000000000..89792f4abdb --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr88905.c @@ -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); +}