http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52041
--- Comment #13 from Iain Sandoe <iains at gcc dot gnu.org> 2012-01-30 20:31:11 UTC --- OK. I've been using the command lines from my build log, with modification to the path to account for the stage2/stage3 ... so like in stage2-gcc/ ../stage1-gcc/g++ .... in stage3-gcc/ ../stage3-gcc/g++ .... ==== The problem is that there are so many differences between the files, that even with diff or side-by-side file displays it's hard to see which differences are significant. When I look at the 149t.optimized tree dump, and assuming that changes in D.xxxx and # DEBUG are not significant, I don't really see anything that looks problematical - so either the problem is rtl side or I need to narrow down what I'm looking for, ==== back to the asm to try and narrow things down: there seem to be two mis-matched cases: 1. where a var is being used in a sequence of compare & jump (I'd assume a switch), I the case of stage2 the asm has movzbl al, %eax cmp $xxx, %eax jxxxx in the case of stage3 , the movzbl is missing. 2. an indexed lookup from gss_for_code: in the case of stage2 there is: ..set up rdx cltq movslq (%rda, %rax,4), %rdx the (cltq) extension of reg A is missing for stage 3. both look like sign extension-ish issues. I think maybe will have to look at some rtl :(