Message ID | 1420976424.2473.177.camel@yam-132-YW-E178-FTW |
---|---|
State | New |
Headers | show |
On 01/11/15 04:40, Oleg Endo wrote: >> >> Any particular reason why the SEQUENCE handling isn't done first, then >> the REG_INC and CALL insn handling? I'd probably explicitly return >> false if we had a sequence and none of its elements returned true. >> There's no need to check anything on the toplevel SEQUENCE to the best >> of my knowledge. > > No meaningful reason. Attached is an updated patch that applies on 4.8 > and trunk. Bootstrapped on trunk i686-pc-linux-gnu. Tested with make > -k check RUNTESTFLAGS="--target_board=sh-sim > \{-m2/-ml,-m2/-mb,-m2a/-mb,-m4/-ml,-m4/-mb,-m4a/-ml,-m4a/-mb}" on trunk > sh-elf. In the PR it has been reported, that the patch fixes the > problems when building a native SH GCC. > > Although the related SH problem occurs only on 4.8, I'd like to install > this on trunk and 4.9, too, to avoid future surprises. OK? > > Cheers, > Oleg > > gcc/ChangeLog: > PR target/64479 > * rtlanal.c (set_reg_p): Handle SEQUENCE constructs. OK. Jeff
Index: gcc/rtlanal.c =================================================================== --- gcc/rtlanal.c (revision 218544) +++ gcc/rtlanal.c (working copy) @@ -873,6 +873,17 @@ int reg_set_p (const_rtx reg, const_rtx insn) { + /* After delay slot handling, call and branch insns might be in a + sequence. Check all the elements there. */ + if (INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE) + { + for (int i = 0; i < XVECLEN (PATTERN (insn), 0); ++i) + if (reg_set_p (reg, XVECEXP (PATTERN (insn), 0, i))) + return true; + + return false; + } + /* We can be passed an insn or part of one. If we are passed an insn, check if a side-effect of the insn clobbers REG. */ if (INSN_P (insn) @@ -884,7 +895,7 @@ GET_MODE (reg), REGNO (reg))) || MEM_P (reg) || find_reg_fusage (insn, CLOBBER, reg))))) - return 1; + return true; return set_of (reg, insn) != NULL_RTX; }