expr.c (expand_expr): Force overflows into registers.
* expr.c (expand_expr) [INTEGER_CST]: Force overflows into registers. * gcc.c-torture/compile/20020409-1.c: New. From-SVN: r52104
This commit is contained in:
parent
6a58eee93d
commit
d8a50944dc
3 changed files with 25 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
|||
2002-04-09 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR c/5078
|
||||
* expr.c (expand_expr) [INTEGER_CST]: Force overflows into registers.
|
||||
|
||||
2002-04-09 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* basic-block.h (flow_delete_block_noexpunge): Declare.
|
||||
|
|
12
gcc/expr.c
12
gcc/expr.c
|
@ -6318,9 +6318,19 @@ expand_expr (exp, target, tmode, modifier)
|
|||
return DECL_RTL (exp);
|
||||
|
||||
case INTEGER_CST:
|
||||
return immed_double_const (TREE_INT_CST_LOW (exp),
|
||||
temp = immed_double_const (TREE_INT_CST_LOW (exp),
|
||||
TREE_INT_CST_HIGH (exp), mode);
|
||||
|
||||
/* ??? If overflow is set, fold will have done an incomplete job,
|
||||
which can result in (plus xx (const_int 0)), which can get
|
||||
simplified by validate_replace_rtx during virtual register
|
||||
instantiation, which can result in unrecognizable insns.
|
||||
Avoid this by forcing all overflows into registers. */
|
||||
if (TREE_CONSTANT_OVERFLOW (exp))
|
||||
temp = force_reg (mode, temp);
|
||||
|
||||
return temp;
|
||||
|
||||
case CONST_DECL:
|
||||
return expand_expr (DECL_INITIAL (exp), target, VOIDmode, 0);
|
||||
|
||||
|
|
9
gcc/testsuite/gcc.c-torture/compile/20020409-1.c
Normal file
9
gcc/testsuite/gcc.c-torture/compile/20020409-1.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* PR c/5078 */
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
int f(int i)
|
||||
{
|
||||
i -= 2 * (INT_MAX + 1);
|
||||
return i;
|
||||
}
|
Loading…
Add table
Reference in a new issue