On Wed, Nov 07, 2012 at 08:08:08AM +0100, Uros Bizjak wrote: > >> 2012-11-06 Jakub Jelinek <ja...@redhat.com> > >> > >> * config/i386/i386.c (ix86_avx_u128_mode_after): Don't > >> look for reg in CALL operand. > > > > OK. > > You can also break the loop after reg is found.
I have committed the patch as is to fix the bootstrap, as anything else needs another bootstrap/regtest. I don't think breaking out of the loop would be correct, then say for *{,sib}call_value_pop patterns reg would be stack pointer rather than the return value of the call. Due to that pattern we can't use single_set, but I wonder if we just can't use XVECEXP (pat, 0, 0) unconditionally for the return value, or perhaps check the condition inside of the loop (REG_P (reg) && VALID_AVX256_REG_OR_OI_MODE (GET_MODE (reg))), return AVX_U128_DIRTY if true (and that way break out of the loop), and return AVX_U128_CLEAN after the loop. Or I wonder why is call handled specially at all, doesn't /* Check if a 256bit AVX register is referenced in stores. */ state = unused; note_stores (pat, check_avx256_stores, &state); if (state == used) return AVX_U128_DIRTY; handle it? Then it would just need to be if (CALL_P (insn)) return AVX_U128_CLEAN. BTW, the formatting is wrong in some spots, e.g. check_avx256_stores (rtx dest, const_rtx set, void *data) { if (((REG_P (dest) || MEM_P(dest)) I'd prefer to leave this to the original submitter. Jakub