diff options
author | Selim Belbachir <selim.belbachir@fr.thalesgroup.com> | 2015-04-20 17:47:10 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2015-04-20 11:47:10 -0600 |
commit | 87e0ceb78c9797754f599dda0344a4165da93338 (patch) | |
tree | b3f45b4c4042b00885566f173c05553cc18fe5ef /gcc | |
parent | 6581c1cffb859a2d8808f39f4bf1c94d5a638e0b (diff) | |
download | gcc-87e0ceb78c9797754f599dda0344a4165da93338.zip gcc-87e0ceb78c9797754f599dda0344a4165da93338.tar.gz gcc-87e0ceb78c9797754f599dda0344a4165da93338.tar.bz2 |
reorg.c (try_merge_delay_insns): Improve correctness checking for targets with multiple delay slots.
* reorg.c (try_merge_delay_insns): Improve correctness checking
for targets with multiple delay slots.
From-SVN: r222245
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/reorg.c | 20 |
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9d8c2bc..a46036f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-04-20 Selim Belbachir <selim.belbachir@fr.thalesgroup.com> + + * reorg.c (try_merge_delay_insns): Improve correctness checking + for targets with multiple delay slots. + 2015-04-20 Jeff Law <law@redhat.com> PR tree-optimization/65658 diff --git a/gcc/reorg.c b/gcc/reorg.c index 2387910..c734a78 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -1338,9 +1338,9 @@ try_merge_delay_insns (rtx insn, rtx_insn *thread) int slot_number = 1; int num_slots = XVECLEN (PATTERN (insn), 0); rtx next_to_match = XVECEXP (PATTERN (insn), 0, slot_number); - struct resources set, needed; + struct resources set, needed, modified; rtx_insn_list *merged_insns = 0; - int i; + int i, j; int flags; flags = get_jump_flags (delay_insn, JUMP_LABEL (delay_insn)); @@ -1432,6 +1432,17 @@ try_merge_delay_insns (rtx insn, rtx_insn *thread) { rtx_insn *dtrial = pat->insn (i); + CLEAR_RESOURCE (&modified); + /* Account for resources set by the the insn following NEXT_TO_MATCH + inside INSN's delay list. */ + for (j = 1; slot_number + j < num_slots; j++) + mark_set_resources (XVECEXP (PATTERN (insn), 0, slot_number + j), + &modified, 0, MARK_SRC_DEST_CALL); + /* Account for resources set by the the insn before DTRIAL and inside + TRIAL's delay list. */ + for (j = 1; j < i; j++) + mark_set_resources (XVECEXP (pat, 0, j), + &modified, 0, MARK_SRC_DEST_CALL); if (! insn_references_resource_p (dtrial, &set, true) && ! insn_sets_resource_p (dtrial, &set, true) && ! insn_sets_resource_p (dtrial, &needed, true) @@ -1439,6 +1450,11 @@ try_merge_delay_insns (rtx insn, rtx_insn *thread) && ! sets_cc0_p (PATTERN (dtrial)) #endif && rtx_equal_p (PATTERN (next_to_match), PATTERN (dtrial)) + /* Check that DTRIAL and NEXT_TO_MATCH does not reference a + resource modified between them (only dtrial is checked because + next_to_match and dtrial shall to be equal in order to hit + this line) */ + && ! insn_references_resource_p (dtrial, &modified, true) && eligible_for_delay (delay_insn, slot_number - 1, dtrial, flags)) { if (! annul_p) |