diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-04-27 12:34:13 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-04-27 10:34:13 +0000 |
commit | 07ab2b1b27330b441efdf35bf31f1b2c99dc4ebc (patch) | |
tree | b703e1bca4342e3b953ea7bf89353df6f93a550f /gcc/tree-ssa-forwprop.c | |
parent | ae9331288f1d89671a60000b28e04e182378eb14 (diff) | |
download | gcc-07ab2b1b27330b441efdf35bf31f1b2c99dc4ebc.zip gcc-07ab2b1b27330b441efdf35bf31f1b2c99dc4ebc.tar.gz gcc-07ab2b1b27330b441efdf35bf31f1b2c99dc4ebc.tar.bz2 |
re PR middle-end/27139 (Optimize double INT->FP->INT conversions with -ffast-math)
2012-04-27 Marc Glisse <marc.glisse@inria.fr>
PR middle-end/27139
* tree-ssa-forwprop.c (combine_conversions): Handle INT->FP->INT.
* gcc.dg/tree-ssa/forwprop-18.c: New test.
From-SVN: r186898
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 3f00b1d..4739de1 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -2405,6 +2405,7 @@ combine_conversions (gimple_stmt_iterator *gsi) gimple def_stmt; tree op0, lhs; enum tree_code code = gimple_assign_rhs_code (stmt); + enum tree_code code2; gcc_checking_assert (CONVERT_EXPR_CODE_P (code) || code == FLOAT_EXPR @@ -2425,7 +2426,9 @@ combine_conversions (gimple_stmt_iterator *gsi) if (!is_gimple_assign (def_stmt)) return 0; - if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))) + code2 = gimple_assign_rhs_code (def_stmt); + + if (CONVERT_EXPR_CODE_P (code2) || code2 == FLOAT_EXPR) { tree defop0 = gimple_assign_rhs1 (def_stmt); tree type = TREE_TYPE (lhs); @@ -2553,6 +2556,29 @@ combine_conversions (gimple_stmt_iterator *gsi) update_stmt (gsi_stmt (*gsi)); return 1; } + + /* If we are converting an integer to a floating-point that can + represent it exactly and back to an integer, we can skip the + floating-point conversion. */ + if (inside_int && inter_float && final_int && + (unsigned) significand_size (TYPE_MODE (inter_type)) + >= inside_prec - !inside_unsignedp) + { + if (useless_type_conversion_p (type, inside_type)) + { + gimple_assign_set_rhs1 (stmt, unshare_expr (defop0)); + gimple_assign_set_rhs_code (stmt, TREE_CODE (defop0)); + update_stmt (stmt); + return remove_prop_source_from_use (op0) ? 2 : 1; + } + else + { + gimple_assign_set_rhs1 (stmt, defop0); + gimple_assign_set_rhs_code (stmt, CONVERT_EXPR); + update_stmt (stmt); + return remove_prop_source_from_use (op0) ? 2 : 1; + } + } } return 0; |