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:
Richard Henderson 2002-04-09 19:22:20 -07:00 committed by Richard Henderson
parent 6a58eee93d
commit d8a50944dc
3 changed files with 25 additions and 1 deletions

View File

@ -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.

View File

@ -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);

View File

@ -0,0 +1,9 @@
/* PR c/5078 */
#include <limits.h>
int f(int i)
{
i -= 2 * (INT_MAX + 1);
return i;
}