diff mbox series

combine: Don't split insns if half is unused (PR82621)

Message ID 51d4f4f94d6c64ab8ffb9e29d684adefb4ce22b0.1510921447.git.segher@kernel.crashing.org
State New
Headers show
Series combine: Don't split insns if half is unused (PR82621) | expand

Commit Message

Segher Boessenkool Nov. 17, 2017, 2:43 p.m. UTC
If we have a PARALLEL of two SETs, and one half is unused, we currently
happily split that into two instructions (albeit the unused one is
useless).  Worse, as PR82621 shows, combine will happily merge this
insn into I3 even if some intervening insn sets the same register
again, which is wrong.

This fixes it by not splitting PARALLELs with REG_UNUSED notes.  It
all is handled fine by combine in that case; just the "single set
that is unused" case isn't handled properly.

This also results in better code: combine will now actually throw
away the unused SET.  (It still won't do that in an I3).

Tested on powerpc64-linux {-m32,-m64}, committing to trunk, and I'll
do backports next week.


Segher


2017-11-17  Segher Boessenkool  <segher@kernel.crashing.org>

	PR rtl-optimization/82621
	* combine.c (try_combine): Do not split PARALLELs of two SETs if the
	dest of one of those SETs is unused.

---
 gcc/combine.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/gcc/combine.c b/gcc/combine.c
index 910d4b0..99df84e 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -3036,7 +3036,8 @@  try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
       && is_parallel_of_n_reg_sets (PATTERN (i2), 2)
       && can_split_parallel_of_n_reg_sets (i2, 2)
       && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
-      && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3))
+      && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3)
+      && !find_reg_note (i2, REG_UNUSED, 0))
     {
       /* If there is no I1, there is no I0 either.  */
       i0 = i1;