[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 <linkw@gcc.gnu.org> PR target/91052 * ira.c (combine_and_move_insns): Skip multiple_sets def_insn.
This commit is contained in:
parent
91f993b7e3
commit
4d2248bec5
@ -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
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user