diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-08 08:03:54 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-08 08:03:54 +0000 |
commit | ed053eb8240556e7953ff865c428b784b6546717 (patch) | |
tree | fef6fa3dc72e0b5fddeac5364f9e7a495ebeb207 | |
parent | 06658c6d05b360dfb85b173d67975603d5e960f3 (diff) | |
download | gcc-ed053eb8240556e7953ff865c428b784b6546717.zip gcc-ed053eb8240556e7953ff865c428b784b6546717.tar.gz gcc-ed053eb8240556e7953ff865c428b784b6546717.tar.bz2 |
re PR tree-optimization/78224 (g++ ICE at -O2(-O1 on gcc6) and above in verify_loop_structure, at cfgloop.c:1646)
2016-11-08 Richard Biener <rguenther@suse.de>
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: r241955
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr78224.C | 51 | ||||
-rw-r--r-- | gcc/tree-call-cdce.c | 13 |
4 files changed, 72 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff8e061..64b0b93 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-08 Richard Biener <rguenther@suse.de> + + 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. + 2016-11-07 Jakub Jelinek <jakub@redhat.com> PR target/78229 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ba30991..45a09a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-08 Richard Biener <rguenther@suse.de> + + PR tree-optimization/78224 + * g++.dg/torture/pr78224.C: New testcase. + 2016-11-08 Senthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com> * gcc.dg/store_merging_1.c: Require store_merge. diff --git a/gcc/testsuite/g++.dg/torture/pr78224.C b/gcc/testsuite/g++.dg/torture/pr78224.C new file mode 100644 index 0000000..bb85339 --- /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<int>(sqrtf(static_cast<float>(f))); +} + +template <class T> +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<int> 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<float>(dx, dy).getLength(); + } + } +} diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c index 8df9b08..861834d 100644 --- a/gcc/tree-call-cdce.c +++ b/gcc/tree-call-cdce.c @@ -807,15 +807,20 @@ shrink_wrap_one_built_in_call_with_conds (gcall *bi_call, vec <gimple *> conds, can_guard_call_p. */ join_tgt_in_edge_from_call = find_fallthru_edge (bi_call_bb->succs); gcc_assert (join_tgt_in_edge_from_call); - free_dominance_info (CDI_DOMINATORS); + /* 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; } 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. */ |