diff options
author | Segher Boessenkool <segher@kernel.crashing.org> | 2014-12-03 07:00:54 +0100 |
---|---|---|
committer | Segher Boessenkool <segher@gcc.gnu.org> | 2014-12-03 07:00:54 +0100 |
commit | 17adbcebf01689d2f2c5386845398d9aedbe4cb3 (patch) | |
tree | 6c118249d04560eb3de252c4a8e608732b96a03b /gcc/combine.c | |
parent | 51be49774041c9d2b588bb2fd139b5de7454c4f2 (diff) | |
download | gcc-17adbcebf01689d2f2c5386845398d9aedbe4cb3.zip gcc-17adbcebf01689d2f2c5386845398d9aedbe4cb3.tar.gz gcc-17adbcebf01689d2f2c5386845398d9aedbe4cb3.tar.bz2 |
re PR rtl-optimization/52714 (ICE in fixup_reorder_chain, at cfglayout.c:880)
PR rtl-optimization/52714
* combine.c (try_combine): Allow combining two insns into two
new insns if at least one of those is a noop.
gcc/testsuite/
* gcc.target/m68k/pr52714.c: New testcase.
From-SVN: r218302
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 63c1e4f..e6deb41 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -3812,15 +3812,20 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, /* Similarly, check for a case where we have a PARALLEL of two independent SETs but we started with three insns. In this case, we can do the sets as two separate insns. This case occurs when some SET allows two - other insns to combine, but the destination of that SET is still live. */ + other insns to combine, but the destination of that SET is still live. - else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0 + Also do this if we started with two insns and (at least) one of the + resulting sets is a noop; this noop will be deleted later. */ + + else if (insn_code_number < 0 && asm_noperands (newpat) < 0 && GET_CODE (newpat) == PARALLEL && XVECLEN (newpat, 0) == 2 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET + && GET_CODE (XVECEXP (newpat, 0, 1)) == SET + && (i1 || set_noop_p (XVECEXP (newpat, 0, 0)) + || set_noop_p (XVECEXP (newpat, 0, 1))) && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART - && 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 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)), |