From: Richard Biener Date: Tue, 8 Nov 2016 08:03:54 +0000 (+0000) Subject: re PR tree-optimization/78224 (g++ ICE at -O2(-O1 on gcc6) and above in verify_loop_s... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ed053eb8240556e7953ff865c428b784b6546717;p=gcc.git 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 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff8e061b1e6..64b0b93ef47 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-08 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. + 2016-11-07 Jakub Jelinek PR target/78229 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ba30991faff..45a09a5e257 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-08 Richard Biener + + PR tree-optimization/78224 + * g++.dg/torture/pr78224.C: New testcase. + 2016-11-08 Senthil Kumar Selvaraj * 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 00000000000..bb85339e8f8 --- /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/tree-call-cdce.c b/gcc/tree-call-cdce.c index 8df9b08010f..861834d3663 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 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. */