[IRA] Fix PR91052 by skipping multiple_sets insn in combine_and_move_insns
authorKewen Lin <linkw@linux.ibm.com>
Wed, 12 Feb 2020 05:22:02 +0000 (23:22 -0600)
committerKewen Lin <linkw@linux.ibm.com>
Wed, 12 Feb 2020 05:22:02 +0000 (23:22 -0600)
As PR91052's comments show, commit r272731 exposed one issue in function
combine_and_move_insns.  Function combine_and_move_insns perform the
unexpected movement which alter live interval of some register, leading
incorrect value to be used.  See PR91052 for details.

2020-02-12  Kewen Lin  <linkw@gcc.gnu.org>
    PR target/91052
    * ira.c (combine_and_move_insns): Skip multiple_sets def_insn.

gcc/ChangeLog
gcc/ira.c

index 3ff66205a9904133bb50bc89453baf022577f153..e0d6c7f27871260e2b73c98b7a3512d08a20ac89 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-12  Kewen Lin  <linkw@gcc.gnu.org>
+
+       PR target/91052
+       * ira.c (combine_and_move_insns): Skip multiple_sets def_insn.
+
 2020-02-12  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.c (rs6000_debug_print_mode): Don't use sizeof
index c8b5f869da121506f0414901271eae9810689316..a655ae12eb2d501bee6423acdb02e8944a54945e 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3784,6 +3784,11 @@ combine_and_move_insns (void)
       if (can_throw_internal (def_insn))
        continue;
 
+      /* Instructions with multiple sets can only be moved if DF analysis is
+        performed for all of the registers set.  See PR91052.  */
+      if (multiple_sets (def_insn))
+       continue;
+
       basic_block use_bb = BLOCK_FOR_INSN (use_insn);
       basic_block def_bb = BLOCK_FOR_INSN (def_insn);
       if (bb_loop_depth (use_bb) > bb_loop_depth (def_bb))