http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54457
--- Comment #1 from Uros Bizjak <ubizjak at gmail dot com> 2012-09-24 18:38:46 UTC --- (In reply to comment #0) > combine fails on: > > Trying 6 -> 8: > Failed to match this instruction: > (set (reg:QI 66) > (mem/j:QI (plus:SI (subreg:SI (plus:DI (reg/v:DI 62 [ position ]) > (const_int 1 [0x1])) 0) > (symbol_ref:SI ("array") [flags 0x40] <var_decl 0x7ffff19ad260 > arra > y>)) [0 array S1 A8])) > > This should be a valid address. In principle yes, but the RTX is not accepted in ix86_decompose_address since we have two displacements here. Combine should simplify this RTX to: (set (reg:QI 68) (mem/j:QI (plus:SI (subreg:SI (reg/v:DI 62 [ position ]) 0) (const:SI (plus:SI (symbol_ref:SI ("array") [flags 0x40] <var_decl 0x7f8d1bc41390 array>) (const_int 1 [0x1])))) [0 array S1 A8])) as is the case with -m32 (but rejected in ix86_address_subreg_operand): /* Don't allow SUBREGs that span more than a word. It can lead to spill failures when the register is one word out of a two word structure. */ if (GET_MODE_SIZE (mode) > UNITS_PER_WORD) return false;