http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54742
jgreenhalgh at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jgreenhalgh at gcc dot gnu.org --- Comment #27 from jgreenhalgh at gcc dot gnu.org --- Created attachment 31308 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=31308&action=edit Dumps for less reduced testcase in comment 27 As of revision 205398, I'm not seeing this optimisation trigger when compiling the benchmark in question. I've attached the dumps from a less agressively reduced version of the testcase given in the intial report, which we don't currently thread. This testcase is more representative of the control structure in the benchmark code. In particular, we have the problematic scenario of two 'joiner' blocks in the thread path. Looking at the dumps for this testcase I think that we would need to spot threads like: (17, 23) incoming edge; (23, 4) joiner; (4, 5) joiner; (5, 8) back-edge; (8, 15) switch-statement; The testcase I am using is: --- int sum0, sum1, sum2, sum3; int foo(char * s, char** ret) { int state=0; char c; for (; *s && state != 4; s++) { c = *s; if (c == '*') { s++; break; } switch (state) { case 0: if (c == '+') state = 1; else if (c != '-') sum0+=c; break; case 1: if (c == '+') state = 2; else if (c == '-') state = 0; else sum1+=c; break; case 2: if (c == '+') state = 3; else if (c == '-') state = 1; else sum2+=c; break; case 3: if (c == '-') state = 2; else if (c == 'x') state = 4; break; default: break; } } *ret = s; return state; }