aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-08 08:03:54 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-08 08:03:54 +0000
commited053eb8240556e7953ff865c428b784b6546717 (patch)
treefef6fa3dc72e0b5fddeac5364f9e7a495ebeb207 /gcc
parent06658c6d05b360dfb85b173d67975603d5e960f3 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr78224.C51
-rw-r--r--gcc/tree-call-cdce.c13
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. */