re PR rtl-optimization/6822 (GCC 3.1.1 - Internal compiler error in extract_insn, at recog.c:2132)

PR optimization/6822
        * config/i386/i386.c (ix86_expand_int_movcc): Don't cast INTVAL
        to unsigned int for op1 comparisons.  Use gen_int_mode.

	* gcc.c-torture/compile/20020530-1.c: New.

Co-Authored-By: Eric Botcazou <ebotcazou@multimania.com>

From-SVN: r54076
This commit is contained in:
Richard Henderson 2002-05-30 16:08:27 -07:00 committed by Richard Henderson
parent ce60bf25b2
commit 261376e723
3 changed files with 29 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2002-05-30 Richard Henderson <rth@redhat.com>
Eric Botcazou <ebotcazou@multimania.com>
PR optimization/6822
* config/i386/i386.c (ix86_expand_int_movcc): Don't cast INTVAL
to unsigned int for op1 comparisons. Use gen_int_mode.
2002-05-30 Eric Botcazou <ebotcazou@multimania.com>
* expmed.c (const_mult_add_overflow_p): New.

View File

@ -8677,11 +8677,12 @@ ix86_expand_int_movcc (operands)
if ((code == LEU || code == GTU)
&& GET_CODE (ix86_compare_op1) == CONST_INT
&& mode != HImode
&& (unsigned int) INTVAL (ix86_compare_op1) != 0xffffffff
/* The operand still must be representable as sign extended value. */
&& INTVAL (ix86_compare_op1) != -1
/* For x86-64, the immediate field in the instruction is 32-bit
signed, so we can't increment a DImode value above 0x7fffffff. */
&& (!TARGET_64BIT
|| GET_MODE (ix86_compare_op0) != DImode
|| (unsigned int) INTVAL (ix86_compare_op1) != 0x7fffffff)
|| INTVAL (ix86_compare_op1) != 0x7fffffff)
&& GET_CODE (operands[2]) == CONST_INT
&& GET_CODE (operands[3]) == CONST_INT)
{
@ -8689,9 +8690,8 @@ ix86_expand_int_movcc (operands)
code = LTU;
else
code = GEU;
ix86_compare_op1
= gen_int_mode (INTVAL (ix86_compare_op1) + 1,
GET_MODE (ix86_compare_op0));
ix86_compare_op1 = gen_int_mode (INTVAL (ix86_compare_op1) + 1,
GET_MODE (ix86_compare_op0));
}
start_sequence ();

View File

@ -0,0 +1,16 @@
/* PR optimization/6822 */
extern unsigned char foo1 (void);
extern unsigned short foo2 (void);
int bar1 (void)
{
unsigned char q = foo1 ();
return (q < 0x80) ? 64 : 0;
}
int bar2 (void)
{
unsigned short h = foo2 ();
return (h < 0x8000) ? 64 : 0;
}