Message ID | Pine.LNX.4.64.1204101653130.17575@jbgna.fhfr.qr |
---|---|
State | New |
Headers | show |
On Tue, Apr 10, 2012 at 4:56 PM, Richard Guenther <rguenther@suse.de> wrote: > I'm sure more RTL optimiziation fallout will pop up - and I wonder > if we should simply avoid modifying the CFG all over the place and > instead do that in cleanup_cfg. Thus, in the if-conversion case, > simply do the speculation and leave the empty forwarder blocks > to be cleaned up by cleanup_cfg (or for CSE to leave unconditional > jumps conditional, as if (0/1), for example). The problem with that could be that if(0|1) is not a valid instruction for every machine. You may need to set a register (pseudo, or hard reg) that may not be available (e.g. if it is live). Ciao! Steven
On Tue, 10 Apr 2012, Steven Bosscher wrote: > On Tue, Apr 10, 2012 at 4:56 PM, Richard Guenther <rguenther@suse.de> wrote: > > I'm sure more RTL optimiziation fallout will pop up - and I wonder > > if we should simply avoid modifying the CFG all over the place and > > instead do that in cleanup_cfg. Thus, in the if-conversion case, > > simply do the speculation and leave the empty forwarder blocks > > to be cleaned up by cleanup_cfg (or for CSE to leave unconditional > > jumps conditional, as if (0/1), for example). > > The problem with that could be that if(0|1) is not a valid instruction > for every machine. You may need to set a register (pseudo, or hard > reg) that may not be available (e.g. if it is live). Hmm. But we'd have such if(0|1) only in the short period between the pass changing it to that and the next cleanup_cfg run, which would ideally be right after that pass. Alternatively passes could leave the CFG not updated (thus, keep dead edges) but update the conditional jump instructions only. That said, currently I'm following the idea of fixing up all places that pop up ... Richard.
Index: gcc/testsuite/gcc.dg/torture/pr52913.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr52913.c (revision 0) +++ gcc/testsuite/gcc.dg/torture/pr52913.c (revision 0) @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +int a, b, c, d, e; +void +fn1 () +{ +lbl_101: + e = 0; +lbl_274: + for (c = 0; c < 1; c = a) + if (d) + if (b) + goto lbl_101; + else + break; + d = 1; + goto lbl_274; +}