I have internal compiler error for the following c code: int a; void* p; void foo (void) { switch (a) { a0: case 0: p = &&a1; a1: case 1: p = &&a2; a2: default: p = &&a1; } goto *p; } Command line: gcc -c -O2 1.c Output: 1.c: In function 'foo': 1.c:5: error: dominator of 1 should be 2, not 0 1.c:5: internal compiler error: in verify_dominators, at dominance.c:875 ...
Confirmed, a regression from 4.0.0.
Subject: Re: [4.1 Regression] Dominance error after aggressive dead code elimination (cd_dce) DCE in aggressive mode sometimes is able to remove control structures and thus edge from the CFG. Sometimes removal of edges from the CFG changes the dominator tree, but we make no attempt to actually keep the dominators up-to-date. In this testcase failure to keep the dominators up-to-date leads to a checking failure. This is trivially addressed by arranging for the dominators to be recomputed if we remove edges from the CFG. An enterprising individual might be able to incrementally update the dominators, but for now this is safe and given that removal of control structures by DCE is rare, the compile-time cost is minimal. Bootstrapped and regression tested on i686-pc-linux-gnu. Jeff
Created attachment 9213 [details] PPP
Fixed.
Subject: Re: [4.1 Regression] Dominance error after aggressive dead code elimination (cd_dce) On Tue, 2005-07-05 at 23:29 -0600, Jeffrey A Law wrote: > DCE in aggressive mode sometimes is able to remove control structures > and thus edge from the CFG. Sometimes removal of edges from the CFG > changes the dominator tree, but we make no attempt to actually keep > the dominators up-to-date. > > In this testcase failure to keep the dominators up-to-date leads to > a checking failure. This is trivially addressed by arranging for the > dominators to be recomputed if we remove edges from the CFG. An > enterprising individual might be able to incrementally update the > dominators, Uh, we have code to incrementally update the dominators. Just use iterate_fix_dominators
Subject: Re: [4.1 Regression] Dominance error after aggressive dead code elimination (cd_dce) Hello, > On Tue, 2005-07-05 at 23:29 -0600, Jeffrey A Law wrote: > > DCE in aggressive mode sometimes is able to remove control structures > > and thus edge from the CFG. Sometimes removal of edges from the CFG > > changes the dominator tree, but we make no attempt to actually keep > > the dominators up-to-date. > > > > In this testcase failure to keep the dominators up-to-date leads to > > a checking failure. This is trivially addressed by arranging for the > > dominators to be recomputed if we remove edges from the CFG. An > > enterprising individual might be able to incrementally update the > > dominators, > > Uh, we have code to incrementally update the dominators. > Just use iterate_fix_dominators note however that to use it you must precisely know the set of basic blocks whose dominators may change (which may or may not be the case with CDDCE, I haven't thought about it), and the set should rather be small -- iterate_fix_dominators is O(n^3) in the size of the set. All in all, if the changes to cfg are indeed rare (which they should be, given that the problem remained unnoticed so far), just having the dominators to be recomputed is much easier and safer. Zdenek
The patch for this PR causes bootstrap failures after enabling the new points-to solver. I will try to find another solution for this problem.
Subject: Bug 21356 CVSROOT: /cvs/gcc Module name: gcc Changes by: dnovillo@gcc.gnu.org 2005-07-09 17:35:05 Modified files: gcc : ChangeLog passes.c Log message: PR 21356 PR 22332 * passes.c (execute_todo): Cleanup the CFG before updating SSA. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.9394&r2=2.9395 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/passes.c.diff?cvsroot=gcc&r1=2.98&r2=2.99
Fixed. http://gcc.gnu.org/ml/gcc-patches/2005-07/msg00651.html.