From: Kewen Lin Date: Wed, 12 Feb 2020 05:22:02 +0000 (-0600) Subject: [IRA] Fix PR91052 by skipping multiple_sets insn in combine_and_move_insns X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4d2248bec5d22061ab252724bd59d45c8a47e009;p=gcc.git [IRA] Fix PR91052 by skipping multiple_sets insn in combine_and_move_insns 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 PR target/91052 * ira.c (combine_and_move_insns): Skip multiple_sets def_insn. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3ff66205a99..e0d6c7f2787 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2020-02-12 Kewen Lin + + PR target/91052 + * ira.c (combine_and_move_insns): Skip multiple_sets def_insn. + 2020-02-12 Segher Boessenkool * config/rs6000/rs6000.c (rs6000_debug_print_mode): Don't use sizeof diff --git a/gcc/ira.c b/gcc/ira.c index c8b5f869da1..a655ae12eb2 100644 --- 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))