Jakub Jelinek wrote: > On Thu, Feb 05, 2015 at 08:21:46AM +0100, Richard Biener wrote: > > On February 4, 2015 10:20:06 PM CET, Sebastian Pop <seb...@gmail.com> wrote: > > >The attached patch stops the recursion in the detection of FSM > > >jump-threads at > > >loop phi nodes after having visited a loop phi node. This avoids > > >jump-threading > > >two iterations forward that were possible due to a flip-flop operation > > >that > > >exchange the value of the switch control variable as illustrated in the > > >testcase: > > > > > >do { > > > c = read_from_memory; > > > switch (a) { > > > case 0: > > > if (c == ' ') > > > [...] > > > else > > > a = b; // flip-flop > > > break; > > > case 1: > > > a = 0; > > > b = 15; // this will jump-thread to 15 > > > break; > > > > > > case 15: > > > [...] > > > } > > >} while (...); > > > > > >The patch has passed bootstrap and regression testing on x86_64-linux. > > >Ok to commit? > > > > But is sounds like a useful optimization? > > Only if we could do it reliably. If it isn't fixable in a different way for > GCC 5.0, then I think it is better to live with a possibly > missed-optimization than wrong-code.
The alternative to correct the code generation for this jump-thread is to add code to detect control dependences ("a = b" is dependent on all the conditions around it, "c != ' ' && c != '/'") and to copy the control dependences over in the duplicated jump-thread path. I'm more confortable with the 3 line fix that I submitted to disable the functionality than adding 100 lines to support copy of control dependences. From a perf point of view, the patch only disables one jump-thread in the testcase that was failing, all the other jump-threads are still enabled, and we do not regress on coremark. Does it make sense to also add a check on how many jumps are threaded for the testcase that I'm adding with this patch? Thanks, Sebastian