Commit 5499c862 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/93110 (grub-2.04/grub-core/lib/division.c:28:1: internal compiler…

re PR target/93110 (grub-2.04/grub-core/lib/division.c:28:1: internal compiler error: in extract_insn, at recog.c:2294)

	PR target/93110
	* config/i386/i386.md (abs<mode>2): Use expand_simple_binop instead of
	emitting ASHIFTRT, XOR and MINUS by hand.  Use gen_int_mode with QImode
	instead of gen_int_shift_amount + convert_modes.

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

From-SVN: r279855
parent 5a6e28b5
2020-01-03 Jakub Jelinek <jakub@redhat.com> 2020-01-03 Jakub Jelinek <jakub@redhat.com>
PR target/93110
* config/i386/i386.md (abs<mode>2): Use expand_simple_binop instead of
emitting ASHIFTRT, XOR and MINUS by hand. Use gen_int_mode with QImode
instead of gen_int_shift_amount + convert_modes.
PR rtl-optimization/93088 PR rtl-optimization/93088
* loop-iv.c (find_single_def_src): Punt after looking through * loop-iv.c (find_single_def_src): Punt after looking through
128 reg copies for regs with single definitions. Move definitions 128 reg copies for regs with single definitions. Move definitions
......
...@@ -9711,30 +9711,16 @@ ...@@ -9711,30 +9711,16 @@
/* Generate rtx abs using abs (x) = (((signed) x >> (W-1)) ^ x) - /* Generate rtx abs using abs (x) = (((signed) x >> (W-1)) ^ x) -
((signed) x >> (W-1)) */ ((signed) x >> (W-1)) */
rtx shift_amount = gen_int_shift_amount (mode, rtx shift_amount = gen_int_mode (GET_MODE_PRECISION (mode) - 1, QImode);
GET_MODE_PRECISION (mode) rtx shift_dst = expand_simple_binop (mode, ASHIFTRT, operands[1],
- 1); shift_amount, NULL_RTX,
shift_amount = convert_modes (E_QImode, GET_MODE (shift_amount), 0, OPTAB_DIRECT);
shift_amount, 1); rtx xor_dst = expand_simple_binop (mode, XOR, shift_dst, operands[1],
rtx shift_dst = gen_reg_rtx (mode); operands[0], 0, OPTAB_DIRECT);
rtx shift_op = gen_rtx_SET (shift_dst, rtx minus_dst = expand_simple_binop (mode, MINUS, xor_dst, shift_dst,
gen_rtx_fmt_ee (ASHIFTRT, mode, operands[0], 0, OPTAB_DIRECT);
operands[1], shift_amount)); if (!rtx_equal_p (minus_dst, operands[0]))
rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, emit_move_insn (operands[0], minus_dst);
FLAGS_REG));
emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, shift_op,
clobber)));
rtx xor_op = gen_rtx_SET (operands[0],
gen_rtx_fmt_ee (XOR, mode, shift_dst,
operands[1]));
emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, xor_op, clobber)));
rtx minus_op = gen_rtx_SET (operands[0],
gen_rtx_fmt_ee (MINUS, mode,
operands[0], shift_dst));
emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, minus_op,
clobber)));
DONE; DONE;
}) })
......
2020-01-03 Jakub Jelinek <jakub@redhat.com> 2020-01-03 Jakub Jelinek <jakub@redhat.com>
PR target/93110
* gcc.dg/torture/pr93110.c: New test.
PR rtl-optimization/93088 PR rtl-optimization/93088
* gcc.target/i386/pr93088.c: New test. * gcc.target/i386/pr93088.c: New test.
......
/* PR target/93110 */
/* { dg-do compile } */
/* { dg-additional-options "-mtune=core2 -mno-stv" { target { i?86-*-* x86_64-*-* } } } */
long long
foo (long long a)
{
return a > 0 ? a : -a;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment