re PR rtl-optimization/20583 (ICE in output_operand: invalid expression as operand)

gcc/
	PR middle-end/20583
	* cse.c (cse_insn): Reject invalid forms of CONST earlier.

gcc/testsuite/
	PR middle-end/20583
	* gcc.c-torture/compile/pr20583.c: New.

From-SVN: r107278
This commit is contained in:
Kazu Hirata 2005-11-21 04:41:38 +00:00 committed by Kazu Hirata
parent 67dc1785a5
commit 1ef6855c51
4 changed files with 56 additions and 11 deletions

View File

@ -1,3 +1,8 @@
2005-11-21 Kazu Hirata <kazu@codesourcery.com>
PR middle-end/20583
* cse.c (cse_insn): Reject invalid forms of CONST earlier.
2005-11-20 Joseph S. Myers <joseph@codesourcery.com>
* combine.c (try_combine): Do not run subst on i1src and i2src in

View File

@ -5506,6 +5506,22 @@ cse_insn (rtx insn, rtx libcall_insn)
break;
}
/* Reject certain invalid forms of CONST that we create. */
else if (CONSTANT_P (trial)
&& GET_CODE (trial) == CONST
/* Reject cases that will cause decode_rtx_const to
die. On the alpha when simplifying a switch, we
get (const (truncate (minus (label_ref)
(label_ref)))). */
&& (GET_CODE (XEXP (trial, 0)) == TRUNCATE
/* Likewise on IA-64, except without the
truncate. */
|| (GET_CODE (XEXP (trial, 0)) == MINUS
&& GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
&& GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)))
/* Do nothing for this case. */
;
/* Look for a substitution that makes a valid insn. */
else if (validate_change (insn, &SET_SRC (sets[i].rtl), trial, 0))
{
@ -5541,17 +5557,6 @@ cse_insn (rtx insn, rtx libcall_insn)
else if (constant_pool_entries_cost
&& CONSTANT_P (trial)
/* Reject cases that will cause decode_rtx_const to
die. On the alpha when simplifying a switch, we
get (const (truncate (minus (label_ref)
(label_ref)))). */
&& ! (GET_CODE (trial) == CONST
&& GET_CODE (XEXP (trial, 0)) == TRUNCATE)
/* Likewise on IA-64, except without the truncate. */
&& ! (GET_CODE (trial) == CONST
&& GET_CODE (XEXP (trial, 0)) == MINUS
&& GET_CODE (XEXP (XEXP (trial, 0), 0)) == LABEL_REF
&& GET_CODE (XEXP (XEXP (trial, 0), 1)) == LABEL_REF)
&& (src_folded == 0
|| (!MEM_P (src_folded)
&& ! src_folded_force_flag))

View File

@ -1,3 +1,8 @@
2005-11-21 Kazu Hirata <kazu@codesourcery.com>
PR middle-end/20583
* gcc.c-torture/compile/pr20583.c: New.
2005-11-20 Bernd Schmidt <bernd.schmidt@analog.com>
* gcc.c-torture/execute/usmul.c: New test.

View File

@ -0,0 +1,30 @@
/* PR target/20583
On m68k-none-elf, CSE used to generate
(set (reg:HI ...)
(const:HI (truncate:HI (minus:SI (label_ref ...)
(label_ref ...)))))
which output functions do not know how to handle. Make sure that
such a constant will be rejected. */
void bar (unsigned int);
void
foo (void)
{
char buf[1] = { 3 };
const char *p = buf;
const char **q = &p;
unsigned int ch;
switch (**q)
{
case 1: ch = 5; break;
case 2: ch = 4; break;
case 3: ch = 3; break;
case 4: ch = 2; break;
case 5: ch = 1; break;
default: ch = 0; break;
}
bar (ch);
}