From 4c80086d7207494cfc1ba26521c83045c3a8b75e Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 25 Aug 2010 10:47:50 +0000 Subject: [PATCH] 2010-08-25 Richard Guenther PR tree-optimization/45393 * tree-ssa-math-opts.c (execute_cse_sincos_1): Properly transfer and clean EH info. Avoid SSA update. (execute_cse_sincos): Cleanup the CFG if it has changed. * g++.dg/torture/pr45393.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163541 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr45393.C | 38 ++++++++++++++++++++++++++++++++++ gcc/tree-ssa-math-opts.c | 22 +++++++++++++------- 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr45393.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f9a6082..9f85999 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2010-08-25 Richard Guenther + PR tree-optimization/45393 + * tree-ssa-math-opts.c (execute_cse_sincos_1): Properly transfer + and clean EH info. Avoid SSA update. + (execute_cse_sincos): Cleanup the CFG if it has changed. + +2010-08-25 Richard Guenther + PR middle-end/45379 * emit-rtl.c (set_mem_attributes_minus_bitpos): Handle TARGET_MEM_REF in alignment computation. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db3ae97..c8871f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-25 Richard Guenther + + PR tree-optimization/45393 + * g++.dg/torture/pr45393.C: New testcase. + 2010-08-25 Jakub Jelinek PR tree-optimization/45059 diff --git a/gcc/testsuite/g++.dg/torture/pr45393.C b/gcc/testsuite/g++.dg/torture/pr45393.C new file mode 100644 index 0000000..5bf16b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45393.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +class FloatPoint; +class Path { +public: + ~Path(); + void moveTo(const FloatPoint&); + static void createEllipse(const FloatPoint& center, float rx, float ry); +}; +extern "C" { + extern float cosf (float); + extern float sinf (float); +} +const float piFloat = static_cast(3.14159265358979323846); +class FloatPoint { +public: + FloatPoint(float x, float y) : m_x(x), m_y(y) { } + float x() const; + float y() const; + float m_x, m_y; +}; +void Path::createEllipse(const FloatPoint& center, float rx, float ry) +{ + float cx = center.x(); + float cy = center.y(); + Path path; + float x = cx; + float y = cy; + unsigned step = 0, num = 100; + while (1) { + float angle = static_cast(step) / num * 2.0f * piFloat; + x = cx + cosf(angle) * rx; + y = cy + sinf(angle) * ry; + step++; + if (step == 1) + path.moveTo(FloatPoint(x, y)); + } +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index bf37b77..a814f6f 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -641,7 +641,7 @@ maybe_record_sincos (VEC(gimple, heap) **stmts, result of the cexpi call we insert before the use statement that dominates all other candidates. */ -static void +static bool execute_cse_sincos_1 (tree name) { gimple_stmt_iterator gsi; @@ -652,6 +652,7 @@ execute_cse_sincos_1 (tree name) VEC(gimple, heap) *stmts = NULL; basic_block top_bb = NULL; int i; + bool cfg_changed = false; type = TREE_TYPE (name); FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, name) @@ -683,16 +684,17 @@ execute_cse_sincos_1 (tree name) if (seen_cos + seen_sin + seen_cexpi <= 1) { VEC_free(gimple, heap, stmts); - return; + return false; } /* Simply insert cexpi at the beginning of top_bb but not earlier than the name def statement. */ fndecl = mathfn_built_in (type, BUILT_IN_CEXPI); if (!fndecl) - return; - res = make_rename_temp (TREE_TYPE (TREE_TYPE (fndecl)), "sincostmp"); + return false; + res = create_tmp_reg (TREE_TYPE (TREE_TYPE (fndecl)), "sincostmp"); stmt = gimple_build_call (fndecl, 1, name); + res = make_ssa_name (res, stmt); gimple_call_set_lhs (stmt, res); def_stmt = SSA_NAME_DEF_STMT (name); @@ -738,11 +740,14 @@ execute_cse_sincos_1 (tree name) stmt = gimple_build_assign (gimple_call_lhs (use_stmt), rhs); gsi = gsi_for_stmt (use_stmt); - gsi_insert_after (&gsi, stmt, GSI_SAME_STMT); - gsi_remove (&gsi, true); + gsi_replace (&gsi, stmt, true); + if (gimple_purge_dead_eh_edges (gimple_bb (stmt))) + cfg_changed = true; } VEC_free(gimple, heap, stmts); + + return cfg_changed; } /* Go through all calls to sin, cos and cexpi and call execute_cse_sincos_1 @@ -752,6 +757,7 @@ static unsigned int execute_cse_sincos (void) { basic_block bb; + bool cfg_changed = false; calculate_dominance_info (CDI_DOMINATORS); @@ -778,7 +784,7 @@ execute_cse_sincos (void) CASE_FLT_FN (BUILT_IN_CEXPI): arg = gimple_call_arg (stmt, 0); if (TREE_CODE (arg) == SSA_NAME) - execute_cse_sincos_1 (arg); + cfg_changed |= execute_cse_sincos_1 (arg); break; default:; @@ -788,7 +794,7 @@ execute_cse_sincos (void) } free_dominance_info (CDI_DOMINATORS); - return 0; + return cfg_changed ? TODO_cleanup_cfg : 0; } static bool -- 2.7.4