------- Additional Comments From law at redhat dot com 2004-12-13 21:01 ------- (In reply to comment #15) > Confirmed, this looks like a jump threading bug. > Before we have: > goto <bb 9> (<L10>); > > <L8>:; > D.7815_42 = pathp_2->node; > tag_43 = tag_27; > idx_44 = idx_6; > D.7819_45 = D.7815_42->tags[tag_43][idx_44]; > if (D.7819_45 != 0) goto out; else goto <L9>; > > <L9>:; > idx_46 = idx_6 + 1; > > # idx_6 = PHI <idx_39(6), idx_46(8)>; > <L10>:; > if (idx_6 == 0) goto <L8>; else goto <L11>; > > > But after: > goto <bb 8> (<L10>); > > <L9>:; > idx_46 = 1; > goto <bb 10> (<L15>); > > # idx_57 = PHI <0(6)>; > <L10>:; > D.7815_42 = pathp_2->node; > tag_43 = tag_27; > idx_44 = 0; <---- this is just plainly wrong. > D.7819_45 = D.7815_42->tags[tag_27][0]; > if (D.7819_45 != 0) goto out; else goto <L9>;
Huh? idx_44 must be zero, I don't see how any other value can be correct here. THe only way to get to L8 (block #7) is when idx_6 == 0 and idx_44 is set unconditionally from idx_6. So what about that assignment do you think is wrong? Note that we also know that idx_46 must have the value 1 because it's only reachable from block #7 where we know that idx_6 == 0 and thus idx_46 must have the value 1. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18241