------- Additional Comments From jakub at gcc dot gnu dot org 2005-02-16 16:58 ------- Actually, I do see problems in the tree dumps already. Particularly the trees look ok before LIM and are broken afterwards. loopinit->lim pseudo diff:
<L97>:; D.16409_250 = &this_125->D.11755._M_impl._M_start; __i_251 = D.16409_250; D.16417_252 = *__i_251; *D.16417_252 = 1; this_109 = this_125; D.16452_108 = this_109->D.11755._M_impl._M_finish; SR.568_107 = D.16452_108; D.16460_97 = this_109->D.11755._M_impl._M_start; SR.571_93 = D.16460_97; if (SR.571_93 == SR.568_107) goto <L142>; else goto <L143>; <L143>:; -<L110>:; D.16491_352 = &this_125->D.11755._M_impl._M_finish; __i_353 = D.16491_352; SR.574_354 = *__i_353; D.16499_365 = SR.574_354 - 4B; D.16061_377 = *D.16499_365; +<L110>:; if (D.16061_377 != 0) goto <L144>; else goto <L117>; <L144>:; goto <bb 27> (<L136>); <L117>:; D.16432_339 = this_125->D.11755._M_impl._M_finish; D.16433_340 = D.16432_339 - 4B; this_125->D.11755._M_impl._M_finish = D.16433_340; this_599 = this_125; D.16452_598 = this_599->D.11755._M_impl._M_finish; SR.568_596 = D.16452_598; D.16460_588 = this_599->D.11755._M_impl._M_start; SR.571_587 = D.16460_588; if (SR.571_587 == SR.568_596) goto <L145>; else goto <L146>; <L146>:; goto <bb 20> (<L110>); <L145>:; goto <bb 27> (<L136>); ... <L142>:; <L136>:; return <retval>; *(*&this->D.11755._M_impl._M_finish - 4B) is hoisted before the loop as invariant, although it is not (each iteration of the loop decreases this->D.11755._M_impl._M_finish by 4 bytes). -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19786