# DP: Proposed fix for PR rtl-optimization/52714: # DP: Revert gcc 4.8 to gcc the 4.5 version of the PR rtl-optimization/45695 fix: --- a/src/gcc/combine.c +++ b/src/gcc/combine.c @@ -3690,41 +3690,42 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx && GET_CODE (XVECEXP (newpat, 0, 1)) == SET && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART + && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)), + DF_INSN_LUID (i2)) && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)), XVECEXP (newpat, 0, 0)) && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)), XVECEXP (newpat, 0, 1)) && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0))) - && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1))))) + && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))) +#ifdef HAVE_cc0 + /* We cannot split the parallel into two sets if both sets + reference cc0. */ + && ! (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)) + && reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1))) +#endif + ) { /* Normally, it doesn't matter which of the two is done first, - but the one that references cc0 can't be the second, and - one which uses any regs/memory set in between i2 and i3 can't + but it does if one references cc0. In that case, it has to be first. */ - if (!use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)), - DF_INSN_LUID (i2)) -#ifdef HAVE_cc0 - && !reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)) -#endif - ) - { - newi2pat = XVECEXP (newpat, 0, 1); - newpat = XVECEXP (newpat, 0, 0); - } - else if (!use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 0)), - DF_INSN_LUID (i2)) #ifdef HAVE_cc0 - && !reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1)) -#endif - ) + if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0))) { + if (use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 0)), + DF_INSN_LUID (i2))) + { + undo_all (); + return 0; + } newi2pat = XVECEXP (newpat, 0, 0); newpat = XVECEXP (newpat, 0, 1); } else +#endif { - undo_all (); - return 0; + newi2pat = XVECEXP (newpat, 0, 1); + newpat = XVECEXP (newpat, 0, 0); } i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);