This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Regression with "Re: [vtab (and trunk?)] fix fallout from SSA-coalescing user variables"
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: Hans-Peter Nilsson <hans-peter dot nilsson at axis dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 08 Oct 2007 17:16:16 -0300
- Subject: Re: Regression with "Re: [vtab (and trunk?)] fix fallout from SSA-coalescing user variables"
- References: <200710061941.l96JfQA6029941@ignucius.se.axis.com>
On Oct 6, 2007, Hans-Peter Nilsson <hans-peter.nilsson@axis.com> wrote:
> Running /tmp/hpautotest-gcc1/gcc/libstdc++-v3/testsuite/libstdc++-dg/conformance.exp ...
> ...
> FAIL: ext/pb_ds/regression/hash_no_data_map_rand.cc (test for excess errors)
> /tmp/hpautotest-gcc1/gcc/libstdc++-v3/testsuite/util/regression/rand/assoc/detail/constructor_destructor_fn_imps.hpp:215: internal compiler error: in update_ssa_across_abnormal_edges, at tree-inline.c:1058
AFAICT, this error is a result of unnecessary abnormal edges being
conservatively inserted and then removed before the end of the pass.
This patch fixes the too-conservative assertion I'd added. If we ever
run into a case in which the edge is not removed before the end of the
pass, the verification code I've added in the previous patch will
catch it.
Ok to install? Build-tested on x86_64-linux-gnu, no regressions are
possible since all it does is to relax an assertion that had never hit
before and that would have caused an instant ICE.
for gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
PR tree-optimization/33572
* tree-inline.c (update_ssa_across_abnormal_edges): Tolerate
the absence of a corresponding edge from the exit block.
Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c.orig 2007-10-08 15:41:47.000000000 -0300
+++ gcc/tree-inline.c 2007-10-08 15:42:42.000000000 -0300
@@ -1055,7 +1055,8 @@ update_ssa_across_abnormal_edges (basic_
}
re = find_edge (ret_bb, e->dest);
- gcc_assert (re);
+ if (!re)
+ continue;
gcc_assert ((re->flags & (EDGE_EH | EDGE_ABNORMAL))
== (e->flags & (EDGE_EH | EDGE_ABNORMAL)));
--
Alexandre Oliva http://www.lsd.ic.unicamp.br/~oliva/
FSF Latin America Board Member http://www.fsfla.org/
Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org}