From 7cfcc8043b47ac8dae3b40925ccadcf11c981742 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 26 Jan 2017 13:08:43 +0000 Subject: [PATCH] backport: [multiple changes] 2017-01-26 Richard Biener Backport from mainline 2016-01-10 Richard Biener PR tree-optimization/79034 * tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds): Propagate out degenerate PHIs in the joiner. * g++.dg/torture/pr79034.C: New testcase. 2016-11-07 Richard Biener PR tree-optimization/78224 * tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds): Split the fallthru edge in case its successor may have PHIs. Do not free dominance info. * g++.dg/torture/pr78224.C: New testcase. From-SVN: r244930 --- gcc/ChangeLog | 16 ++++++++ gcc/testsuite/ChangeLog | 13 +++++++ gcc/testsuite/g++.dg/torture/pr78224.C | 51 +++++++++++++++++++++++++ gcc/testsuite/g++.dg/torture/pr79034.C | 52 ++++++++++++++++++++++++++ gcc/tree-call-cdce.c | 24 ++++++++++-- 5 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr78224.C create mode 100644 gcc/testsuite/g++.dg/torture/pr79034.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 84f84e528bcc..8126dfb5cf48 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2017-01-26 Richard Biener + + Backport from mainline + 2016-01-10 Richard Biener + + PR tree-optimization/79034 + * tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds): + Propagate out degenerate PHIs in the joiner. + + 2016-11-07 Richard Biener + + PR tree-optimization/78224 + * tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds): + Split the fallthru edge in case its successor may have PHIs. + Do not free dominance info. + 2017-01-26 Richard Biener Backport from mainline diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9c135a08778..99dd282d6c63 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2017-01-26 Richard Biener + + Backport from mainline + 2016-01-10 Richard Biener + + PR tree-optimization/79034 + * g++.dg/torture/pr79034.C: New testcase. + + 2016-11-07 Richard Biener + + PR tree-optimization/78224 + * g++.dg/torture/pr78224.C: New testcase. + 2017-01-26 Richard Biener Backport from mainline diff --git a/gcc/testsuite/g++.dg/torture/pr78224.C b/gcc/testsuite/g++.dg/torture/pr78224.C new file mode 100644 index 000000000000..bb85339e8f89 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr78224.C @@ -0,0 +1,51 @@ +// { dg-do compile } + +extern "C"{ + float sqrtf(float); +} + +inline float squareroot(const float f) +{ + return sqrtf(f); +} + +inline int squareroot(const int f) +{ + return static_cast(sqrtf(static_cast(f))); +} + +template +class vector2d +{ +public: + vector2d(T nx, T ny) : X(nx), Y(ny) {} + T getLength() const { return squareroot( X*X + Y*Y ); } + T X; + T Y; +}; + +vector2d getMousePos(); + +class Client +{ +public: + Client(); + ~Client(); +}; + +void the_game(float turn_amount) +{ + Client client; + bool first = true; + + while (1) { + if (first) { + first = false; + } else { + int dx = getMousePos().X; + int dy = getMousePos().Y; + + turn_amount = vector2d(dx, dy).getLength(); + } + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr79034.C b/gcc/testsuite/g++.dg/torture/pr79034.C new file mode 100644 index 000000000000..802c0aa5584a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr79034.C @@ -0,0 +1,52 @@ +/* { dg-do compile } */ + +extern "C" { + float sqrtf(float); +} + +class T { +public: + float floats[1]; + + inline float length() const { + return sqrtf(floats[0]); + } +}; + +void destruct(void *); + +class Container { + + T Ts[1]; + +public: + ~Container() { + destruct((void *)Ts); + } + + T& operator[](int n) { + return Ts[0]; + } +}; + +void fill(Container&); + +void doit() +{ + Container data; + float max = 10; + + int i, j, k; + + for (i = 0; i < 10; i++) { + for (j = 1; j < 10; j++) { + if (max < 5) + break; + fill( data); + max = data[0].length(); + for (k = 1; k < j; k++) { + max = 5; + } + } + } +} diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c index f0b3ce77c87e..cef9a2a0750f 100644 --- a/gcc/tree-call-cdce.c +++ b/gcc/tree-call-cdce.c @@ -56,6 +56,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-into-ssa.h" #include "tree-pass.h" #include "flags.h" +#include "tree-phinodes.h" /* Conditional dead call elimination @@ -766,14 +767,31 @@ shrink_wrap_one_built_in_call (gcall *bi_call) join_tgt_in_edge_from_call = find_fallthru_edge (bi_call_bb->succs); if (join_tgt_in_edge_from_call == NULL) return false; + /* We don't want to handle PHIs. */ + if (EDGE_COUNT (join_tgt_in_edge_from_call->dest->preds) > 1) + join_tgt_bb = split_edge (join_tgt_in_edge_from_call); + else + { + join_tgt_bb = join_tgt_in_edge_from_call->dest; + /* We may have degenerate PHIs in the destination. Propagate + those out. */ + for (gphi_iterator i = gsi_start_phis (join_tgt_bb); !gsi_end_p (i);) + { + gphi *phi = i.phi (); + replace_uses_by (gimple_phi_result (phi), + gimple_phi_arg_def (phi, 0)); + remove_phi_node (&i, true); + } + } } else - join_tgt_in_edge_from_call = split_block (bi_call_bb, bi_call); + { + join_tgt_in_edge_from_call = split_block (bi_call_bb, bi_call); + join_tgt_bb = join_tgt_in_edge_from_call->dest; + } bi_call_bsi = gsi_for_stmt (bi_call); - join_tgt_bb = join_tgt_in_edge_from_call->dest; - /* Now it is time to insert the first conditional expression into bi_call_bb and split this bb so that bi_call is shrink-wrapped. */ -- 2.47.2