diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-07 11:33:03 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-07 11:33:03 +0000 |
commit | f5faab844106d746903455717a480387ae1f0083 (patch) | |
tree | f52c4c351d6548f9f04017536c937c708d92d3ed /gcc/tree-ssa-ccp.c | |
parent | fb60e6351aef88dc33fa5feef1287143be21d996 (diff) | |
download | gcc-f5faab844106d746903455717a480387ae1f0083.tar.gz |
2013-11-07 Richard Biener <rguenther@suse.de>
* tree-ssa-ccp.c (canonicalize_float_value): Rename to ...
(canonicalize_value): ... this. Also handle stripping of
TREE_OVERFLOW.
(get_value, set_lattice_value, get_value_for_expr): Adjust.
* gimple-fold.c (canonicalize_constructor_val): Strip
TREE_OVERFLOW.
* tree-ssa-threadedge.c (set_ssa_name_value): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204506 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-ccp.c')
-rw-r--r-- | gcc/tree-ssa-ccp.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 5b6c0dbea28..b4dfd4928cd 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -168,7 +168,7 @@ typedef struct prop_value_d prop_value_t; static prop_value_t *const_val; static unsigned n_const_val; -static void canonicalize_float_value (prop_value_t *); +static void canonicalize_value (prop_value_t *); static bool ccp_fold_stmt (gimple_stmt_iterator *); /* Dump constant propagation value VAL to file OUTF prefixed by PREFIX. */ @@ -326,7 +326,7 @@ get_value (tree var) if (val->lattice_val == UNINITIALIZED) *val = get_default_value (var); - canonicalize_float_value (val); + canonicalize_value (val); return val; } @@ -378,17 +378,24 @@ set_value_varying (tree var) that HONOR_NANS is false, and we try to change the value of x to 0, causing an ICE. With HONOR_NANS being false, the real appearance of NaN would cause undefined behavior, though, so claiming that y (and x) - are UNDEFINED initially is correct. */ + are UNDEFINED initially is correct. + + For other constants, make sure to drop TREE_OVERFLOW. */ static void -canonicalize_float_value (prop_value_t *val) +canonicalize_value (prop_value_t *val) { enum machine_mode mode; tree type; REAL_VALUE_TYPE d; - if (val->lattice_val != CONSTANT - || TREE_CODE (val->value) != REAL_CST) + if (val->lattice_val != CONSTANT) + return; + + if (TREE_OVERFLOW_P (val->value)) + val->value = drop_tree_overflow (val->value); + + if (TREE_CODE (val->value) != REAL_CST) return; d = TREE_REAL_CST (val->value); @@ -454,7 +461,7 @@ set_lattice_value (tree var, prop_value_t new_val) /* We can deal with old UNINITIALIZED values just fine here. */ prop_value_t *old_val = &const_val[SSA_NAME_VERSION (var)]; - canonicalize_float_value (&new_val); + canonicalize_value (&new_val); /* We have to be careful to not go up the bitwise lattice represented by the mask. @@ -569,7 +576,7 @@ get_value_for_expr (tree expr, bool for_bits_p) val.lattice_val = CONSTANT; val.value = expr; val.mask = double_int_zero; - canonicalize_float_value (&val); + canonicalize_value (&val); } else if (TREE_CODE (expr) == ADDR_EXPR) val = get_value_from_alignment (expr); |