On Wed, Sep 05, 2018 at 10:34:48AM +0200, Ilya Leoshkevich wrote: > S/390 epilogue ends with (parallel [(return) (use %r14)]) instead of > the more usual (return) or (simple_return). This sequence is not > recognized by the conditional return logic in try_optimize_cfg ().
Why does it need this? Other targets with a link register make EPILOGUE_USES handle this. If you really need a parallel, can you make ANY_RETURN_P recognise it? > +/* Create a copy of PARALLEL with side-effect OSIDE replaced by NSIDE. */ > +static rtx > +copy_update_parallel (rtx par, rtx *oside, rtx nside) > +{ > + rtx npar; > + int i; > + > + npar = gen_rtx_PARALLEL (GET_MODE (par), rtvec_alloc (XVECLEN (par, 0))); > + for (i = XVECLEN (par, 0) - 1; i >= 0; i--) > + { > + rtx *side_effect = &XVECEXP (par, 0, i); > + > + if (side_effect == oside) > + XVECEXP (npar, 0, i) = nside; > + else > + XVECEXP (npar, 0, i) = copy_rtx (*side_effect); > + } > + return npar; > +} This doesn't work if nside is used anywhere else. But the only caller uses the previous instruction pattern; maybe make a function specialised to that only? You could give it a better name, too ;-) (It is especially surprising because the function is called copy_* but it does _not_ copy its argument!) Segher