Commit 33d13fac by Kazu Hirata Committed by Kazu Hirata

fold-const.c (negate_expr): Move the handling of constants ...

	* fold-const.c (negate_expr): Move the handling of constants
	...
	(fold_negate_const): ... here.

From-SVN: r79693
parent 165c9b04
2004-03-19 Kazu Hirata <kazu@cs.umass.edu>
* fold-const.c (negate_expr): Move the handling of constants
...
(fold_negate_const): ... here.
2004-03-19 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> 2004-03-19 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* langhooks-def.h (LANG_HOOKS_HASH_TYPES): New macro and hook. * langhooks-def.h (LANG_HOOKS_HASH_TYPES): New macro and hook.
......
...@@ -113,6 +113,8 @@ static tree fold_inf_compare (enum tree_code, tree, tree, tree); ...@@ -113,6 +113,8 @@ static tree fold_inf_compare (enum tree_code, tree, tree, tree);
static bool reorder_operands_p (tree, tree); static bool reorder_operands_p (tree, tree);
static bool tree_swap_operands_p (tree, tree, bool); static bool tree_swap_operands_p (tree, tree, bool);
static tree fold_negate_const (tree, tree);
/* The following constants represent a bit based encoding of GCC's /* The following constants represent a bit based encoding of GCC's
comparison operators. This encoding simplifies transformations comparison operators. This encoding simplifies transformations
on relational comparison operators, such as AND and OR. */ on relational comparison operators, such as AND and OR. */
...@@ -956,20 +958,7 @@ negate_expr (tree t) ...@@ -956,20 +958,7 @@ negate_expr (tree t)
switch (TREE_CODE (t)) switch (TREE_CODE (t))
{ {
case INTEGER_CST: case INTEGER_CST:
{ tem = fold_negate_const (t, type);
unsigned HOST_WIDE_INT low;
HOST_WIDE_INT high;
int overflow = neg_double (TREE_INT_CST_LOW (t),
TREE_INT_CST_HIGH (t),
&low, &high);
tem = build_int_2 (low, high);
TREE_TYPE (tem) = type;
TREE_OVERFLOW (tem)
= (TREE_OVERFLOW (t)
| force_fit_type (tem, overflow && !TREE_UNSIGNED (type)));
TREE_CONSTANT_OVERFLOW (tem)
= TREE_OVERFLOW (tem) | TREE_CONSTANT_OVERFLOW (t);
}
if (! TREE_OVERFLOW (tem) if (! TREE_OVERFLOW (tem)
|| TREE_UNSIGNED (type) || TREE_UNSIGNED (type)
|| ! flag_trapv) || ! flag_trapv)
...@@ -977,7 +966,7 @@ negate_expr (tree t) ...@@ -977,7 +966,7 @@ negate_expr (tree t)
break; break;
case REAL_CST: case REAL_CST:
tem = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (t))); tem = fold_negate_const (t, type);
/* Two's complement FP formats, such as c4x, may overflow. */ /* Two's complement FP formats, such as c4x, may overflow. */
if (! TREE_OVERFLOW (tem) || ! flag_trapping_math) if (! TREE_OVERFLOW (tem) || ! flag_trapping_math)
return fold_convert (type, tem); return fold_convert (type, tem);
...@@ -9049,4 +9038,39 @@ rtl_expr_nonnegative_p (rtx r) ...@@ -9049,4 +9038,39 @@ rtl_expr_nonnegative_p (rtx r)
} }
} }
/* Return the tree for neg (ARG0) when ARG0 is known to be either
an integer constant or real constant.
TYPE is the type of the result. */
static tree
fold_negate_const (tree arg0, tree type)
{
tree t = NULL_TREE;
if (TREE_CODE (arg0) == INTEGER_CST)
{
unsigned HOST_WIDE_INT low;
HOST_WIDE_INT high;
int overflow = neg_double (TREE_INT_CST_LOW (arg0),
TREE_INT_CST_HIGH (arg0),
&low, &high);
t = build_int_2 (low, high);
TREE_TYPE (t) = type;
TREE_OVERFLOW (t)
= (TREE_OVERFLOW (arg0)
| force_fit_type (t, overflow && !TREE_UNSIGNED (type)));
TREE_CONSTANT_OVERFLOW (t)
= TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg0);
}
else if (TREE_CODE (arg0) == REAL_CST)
t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0)));
#ifdef ENABLE_CHECKING
else
abort ();
#endif
return t;
}
#include "gt-fold-const.h" #include "gt-fold-const.h"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment