On Tue, Jul 19, 2011 at 7:33 PM, Uros Bizjak <ubiz...@gmail.com> wrote: >>>> Sometimes, the compiler is really creative in inventing instructions: >>>> >>>> (insn 47 46 49 7 (set (reg:SI 68 [ D.1686 ]) >>>> (subreg:SI (plus:SF (reg:SF 159 [ D.1685 ]) >>>> (reg:SF 159 [ D.1685 ])) 0)) omp_atomic1.f90:17 247 >>>> {*lea_2} >>>> (expr_list:REG_DEAD (reg:SF 159 [ D.1685 ]) >>>> (nil))) >>>> >>>> Really funny. >>> >>> That's the job of combiner to try all kinds of stuff and it is the >>> responsibility of the backend to reject those. I think it would be better >>> to get back to testing Pmode in the legitimate address hook, perhaps >>> allowing ptr_mode too in addition to Pmode (which for -m32/-m64 won't mean >>> any change, just for -mx32). >> >> Actually, there is a bypass in ix86_decompose_address, and this RTX >> squeezed through. IMO constructs like this should be rejected in >> i_d_a, which effectively only moves Pmode/ptr_mode check here. >> >> I'm looking into it. > > The problem was in fact the declaration of no_seg_address_operand > predicate that was defined as special predicate and this way ignoring > the mode of the operand.
This change should be backported to 4.6 and 4.5. Uros.