aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-08-16 10:57:29 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2013-08-16 10:57:29 +0200
commit7a46059462cd49f3304fe42437b94697a50e9bed (patch)
tree7f31af965b645ebdcb9d744c3b6c16a68d013604
parenta23d240db06c29b02b1ad1668a36f455cdbb7902 (diff)
downloadgcc-7a46059462cd49f3304fe42437b94697a50e9bed.zip
gcc-7a46059462cd49f3304fe42437b94697a50e9bed.tar.gz
gcc-7a46059462cd49f3304fe42437b94697a50e9bed.tar.bz2
re PR regression/58165 (internal compiler error: verify_flow_info)
PR tree-optimization/58165 * tree-call-cdce.c (shrink_wrap_one_built_in_call): If bi_call must be the last stmt in a bb, don't split_block, instead use fallthru edge from it and give up if there is none. Release conds vector when returning early. * g++.dg/opt/pr58165.C: New test. From-SVN: r201780
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr58165.C14
-rw-r--r--gcc/tree-call-cdce.c23
4 files changed, 45 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a5975f5..810b8a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2013-08-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/58165
+ * tree-call-cdce.c (shrink_wrap_one_built_in_call): If
+ bi_call must be the last stmt in a bb, don't split_block, instead
+ use fallthru edge from it and give up if there is none.
+ Release conds vector when returning early.
+
2013-08-14 Xinliang David Li <davidxl@google.com>
* config/i386/i386.c (ix86_option_override_internal):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9b115a4..84679bb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-08-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/58165
+ * g++.dg/opt/pr58165.C: New test.
+
2013-08-14 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51912
diff --git a/gcc/testsuite/g++.dg/opt/pr58165.C b/gcc/testsuite/g++.dg/opt/pr58165.C
new file mode 100644
index 0000000..d758e37
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr58165.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/58165
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "C" float sqrtf (float);
+
+struct A { A (); ~A (); };
+
+void
+foo (double d)
+{
+ A a;
+ sqrtf (d);
+}
diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c
index 8edcad9..1396388 100644
--- a/gcc/tree-call-cdce.c
+++ b/gcc/tree-call-cdce.c
@@ -726,15 +726,28 @@ shrink_wrap_one_built_in_call (gimple bi_call)
return false and do not do any transformation for
the call. */
if (nconds == 0)
- return false;
+ {
+ conds.release ();
+ return false;
+ }
bi_call_bb = gimple_bb (bi_call);
- /* Now find the join target bb -- split
- bi_call_bb if needed. */
- bi_call_bsi = gsi_for_stmt (bi_call);
+ /* Now find the join target bb -- split bi_call_bb if needed. */
+ if (stmt_ends_bb_p (bi_call))
+ {
+ /* If the call must be the last in the bb, don't split the block,
+ it could e.g. have EH edges. */
+ join_tgt_in_edge_from_call = find_fallthru_edge (bi_call_bb->succs);
+ if (join_tgt_in_edge_from_call == NULL)
+ {
+ conds.release ();
+ return false;
+ }
+ }
+ 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);
bi_call_bsi = gsi_for_stmt (bi_call);
join_tgt_bb = join_tgt_in_edge_from_call->dest;