On Wed, Jul 20, 2011 at 2:54 PM, H.J. Lu <hjl.to...@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). >> >> I agree that we still need to check naked registers. However, for >> 64bit targets it is OK to pass both, SImode and DImode registers. We >> are sure that SImode values in DImode regs have top 32bits equal to 0 >> in address calculations. This is not true for QImode regs (assignment >> to lowpart only). We also have to prevent non-integer registers. >> >> Attached is my final version of the patch. >> > > It works fine. Can you check it in? Tested on x86_64-pc-linux-gnu {,-m32} and committed to mainline SVN with following ChangeLog: 2011-07-20 Uros Bizjak <ubiz...@gmail.com> PR target/49780 * config/i386/predicates.md (no_seg_addres_operand): No more special. * config/i386/i386.c (ix86_decompose_address): Allow only subregs of DImode hard registers in base. (ix86_legitimate_address_p): Allow SImode and DImode base and index registers. Uros.