------- Comment #1 from bonzini at gnu dot org 2006-09-14 12:07 ------- The sole difference in the IR is
;; if ((int) node->x == a) goto <L0>; else (void) 0; (insn 19 18 20 (set (reg:HI 125) (mem/s/j:HI (reg/v/f:SI 123 [ node ]) [2 <variable>.x+0 S2 A32])) -1 (nil) ;; if ((int) MEM[base: (short unsigned int *) node] == a) goto <L0>; else (void) 0; (insn 20 19 21 (set (reg:HI 125) (mem/s:HI (reg/v/f:SI 123 [ node ]) [3 <variable>.x+0 S2 A8])) -1 (nil) (nil)) (COMPONENT_REF vs. TARGET_MEM_REF, the first produces A32 and the second A8) ---- It's actually flow's fault, because it fails to recognize a PRE_MODIFY address, and things go downhill from there: life1 dump is 16 r121:SI=r121:SI+0x1 | 17 r122:SI=r122:SI+0x1 18 r123:SI=r123:SI-0x4 | 20 r126:HI=[--r124:SI] 19 r125:HI=[r123:SI] | REG_INC: r124:SI 20 r124:SI=zero_extend(r125:HI) | 21 r125:SI=zero_extend(r126:HI) REG_DEAD: r125:HI | REG_DEAD: r126:HI 21 r126:CC=cmp(r124:SI,r121:SI) | 22 r127:CC=cmp(r125:SI,r122:SI) REG_DEAD: r124:SI | REG_DEAD: r125:SI 22 pc={(r126:CC==0x0)?L13:pc} | 23 pc={(r127:CC==0x0)?L14:pc} REG_DEAD: r126:CC | REG_DEAD: r127:CC REG_BR_PROB: 0x22c4 REG_BR_PROB: 0x22c4 24 NOTE_INSN_BASIC_BLOCK | 25 NOTE_INSN_BASIC_BLOCK 28 NOTE_INSN_FUNCTION_END | 29 NOTE_INSN_FUNCTION_END 31 r3:SI=r121:SI | 32 r3:SI=r122:SI REG_DEAD: r121:SI | REG_DEAD: r122:SI 37 use r3:SI | 38 use r3:SI while combine dump is 14 NOTE_INSN_BASIC_BLOCK | 15 NOTE_INSN_BASIC_BLOCK 16 r121:SI=r121:SI+0x1 | 17 r122:SI=r122:SI+0x1 18 NOTE_INSN_DELETED | 20 NOTE_INSN_DELETED 19 {r125:HI=[r123:SI-0x4];r123:SI= | 21 r125:SI=zero_extend([--r124:SI] 20 r124:SI=zero_extend(r125:HI) | REG_INC: r124:SI REG_DEAD: r125:HI | 22 r127:CC=cmp(r125:SI,r122:SI) 21 r126:CC=cmp(r124:SI,r121:SI) | REG_DEAD: r125:SI REG_DEAD: r124:SI where it has synthesized a movsi_movhi_update1, but then failed to implement the merged. Could this be fixed on dataflow-branch? -- bonzini at gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |zadeck at gcc dot gnu dot | |org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29083