re PR c/37924 (ice in smallest_mode_for_size, at stor-layout.c:219)
PR c/37924 * combine.c (make_compound_operation): Don't call make_extraction with non-positive length. (simplify_shift_const_1): Canonicalize count even if complement_p. * gcc.c-torture/execute/pr37924.c: New test. From-SVN: r141413
This commit is contained in:
parent
e18f73cdd3
commit
261639a226
4 changed files with 70 additions and 6 deletions
|
@ -1,3 +1,10 @@
|
|||
2008-10-28 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/37924
|
||||
* combine.c (make_compound_operation): Don't call make_extraction with
|
||||
non-positive length.
|
||||
(simplify_shift_const_1): Canonicalize count even if complement_p.
|
||||
|
||||
2008-10-28 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* convert.c (strip_float_extensions): Do not remove or introduce
|
||||
|
|
|
@ -6996,7 +6996,8 @@ make_compound_operation (rtx x, enum rtx_code in_code)
|
|||
if (GET_CODE (rhs) == CONST_INT
|
||||
&& GET_CODE (lhs) == ASHIFT
|
||||
&& GET_CODE (XEXP (lhs, 1)) == CONST_INT
|
||||
&& INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
|
||||
&& INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
|
||||
&& INTVAL (rhs) < mode_width)
|
||||
{
|
||||
new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
|
||||
new_rtx = make_extraction (mode, new_rtx,
|
||||
|
@ -7016,6 +7017,7 @@ make_compound_operation (rtx x, enum rtx_code in_code)
|
|||
&& (OBJECT_P (SUBREG_REG (lhs))))
|
||||
&& GET_CODE (rhs) == CONST_INT
|
||||
&& INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
|
||||
&& INTVAL (rhs) < mode_width
|
||||
&& (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
|
||||
new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
|
||||
0, NULL_RTX, mode_width - INTVAL (rhs),
|
||||
|
@ -9003,11 +9005,6 @@ simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
|
|||
if (GET_CODE (varop) == CLOBBER)
|
||||
return NULL_RTX;
|
||||
|
||||
/* If we discovered we had to complement VAROP, leave. Making a NOT
|
||||
here would cause an infinite loop. */
|
||||
if (complement_p)
|
||||
break;
|
||||
|
||||
/* Convert ROTATERT to ROTATE. */
|
||||
if (code == ROTATERT)
|
||||
{
|
||||
|
@ -9053,6 +9050,11 @@ simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
|
|||
}
|
||||
}
|
||||
|
||||
/* If we discovered we had to complement VAROP, leave. Making a NOT
|
||||
here would cause an infinite loop. */
|
||||
if (complement_p)
|
||||
break;
|
||||
|
||||
/* An arithmetic right shift of a quantity known to be -1 or 0
|
||||
is a no-op. */
|
||||
if (code == ASHIFTRT
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2008-10-28 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/37924
|
||||
* gcc.c-torture/execute/pr37924.c: New test.
|
||||
|
||||
2008-10-28 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/dfp/convert-bfp-12.c: New test.
|
||||
|
|
50
gcc/testsuite/gcc.c-torture/execute/pr37924.c
Normal file
50
gcc/testsuite/gcc.c-torture/execute/pr37924.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* PR c/37924 */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
signed char a;
|
||||
unsigned char b;
|
||||
|
||||
int
|
||||
test1 (void)
|
||||
{
|
||||
int c = -1;
|
||||
return ((unsigned int) (a ^ c)) >> 9;
|
||||
}
|
||||
|
||||
int
|
||||
test2 (void)
|
||||
{
|
||||
int c = -1;
|
||||
return ((unsigned int) (b ^ c)) >> 9;
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
a = 0;
|
||||
if (test1 () != (-1U >> 9))
|
||||
abort ();
|
||||
a = 0x40;
|
||||
if (test1 () != (-1U >> 9))
|
||||
abort ();
|
||||
a = 0x80;
|
||||
if (test1 () != (a < 0) ? 0 : (-1U >> 9))
|
||||
abort ();
|
||||
a = 0xff;
|
||||
if (test1 () != (a < 0) ? 0 : (-1U >> 9))
|
||||
abort ();
|
||||
b = 0;
|
||||
if (test2 () != (-1U >> 9))
|
||||
abort ();
|
||||
b = 0x40;
|
||||
if (test2 () != (-1U >> 9))
|
||||
abort ();
|
||||
b = 0x80;
|
||||
if (test2 () != (-1U >> 9))
|
||||
abort ();
|
||||
b = 0xff;
|
||||
if (test2 () != (-1U >> 9))
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue