------- Comment #5 from dje at gcc dot gnu dot org 2008-10-21 14:53 ------- The test in rs6000_legitimate_offset_address_p is for something completely different. This should be tested in rs6000_legitimate_address:
if (GET_CODE (x) == PRE_MODIFY && mode != TImode && mode != TFmode && mode != TDmode && ((TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_DOUBLE_FLOAT) || TARGET_POWERPC64 || ((mode != DFmode && mode != DDmode) || TARGET_E500_DOUBLE)) && (TARGET_POWERPC64 || mode != DImode) && !ALTIVEC_VECTOR_MODE (mode) && !SPE_VECTOR_MODE (mode) /* Restrict addressing for DI because of our SUBREG hackery. */ && !(TARGET_E500_DOUBLE && (mode == DFmode || mode == DDmode || mode == DImode)) && TARGET_UPDATE && legitimate_indirect_address_p (XEXP (x, 0), reg_ok_strict) && (rs6000_legitimate_offset_address_p (mode, XEXP (x, 1), reg_ok_strict) || legitimate_indexed_address_p (XEXP (x, 1), reg_ok_strict)) && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0))) return 1; -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37878