diff options
author | pfg <pfg@FreeBSD.org> | 2014-01-03 15:54:12 +0000 |
---|---|---|
committer | pfg <pfg@FreeBSD.org> | 2014-01-03 15:54:12 +0000 |
commit | 9a82e509569ff74c1002158301932901028fffe7 (patch) | |
tree | f3fe0b8fc5cd98aad0a7b8c3b6635aaf6b625b86 /contrib/gcc/reload1.c | |
parent | b1d31e28109c70d3cf066cc72e027163f211add7 (diff) | |
download | FreeBSD-src-9a82e509569ff74c1002158301932901028fffe7.zip FreeBSD-src-9a82e509569ff74c1002158301932901028fffe7.tar.gz |
MFC r259655 (partial), r259944:
gcc: merge small upstream changes.
Fix for PR c++/29928
Backport from mainline:
2007-04-24 Hui-May Chang <hm.chang@apple.com>
* reload1.c (merge_assigned_reloads) : Do not merge a RELOAD_OTHER
instruction with a RELOAD_FOR_OPERAND_ADDRESS instruction.
Obtained from: gcc 4.3 (rev. r124115, 124724: GPLv2)
Diffstat (limited to 'contrib/gcc/reload1.c')
-rw-r--r-- | contrib/gcc/reload1.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/contrib/gcc/reload1.c b/contrib/gcc/reload1.c index 30ea7f3..0cc2e7f 100644 --- a/contrib/gcc/reload1.c +++ b/contrib/gcc/reload1.c @@ -6238,15 +6238,23 @@ merge_assigned_reloads (rtx insn) transfer_replacements (i, j); } - /* If this is now RELOAD_OTHER, look for any reloads that load - parts of this operand and set them to RELOAD_FOR_OTHER_ADDRESS - if they were for inputs, RELOAD_OTHER for outputs. Note that - this test is equivalent to looking for reloads for this operand - number. */ - /* We must take special care with RELOAD_FOR_OUTPUT_ADDRESS; it may - share registers with a RELOAD_FOR_INPUT, so we can not change it - to RELOAD_FOR_OTHER_ADDRESS. We should never need to, since we - do not modify RELOAD_FOR_OUTPUT. */ + /* If this is now RELOAD_OTHER, look for any reloads that + load parts of this operand and set them to + RELOAD_FOR_OTHER_ADDRESS if they were for inputs, + RELOAD_OTHER for outputs. Note that this test is + equivalent to looking for reloads for this operand + number. + + We must take special care with RELOAD_FOR_OUTPUT_ADDRESS; + it may share registers with a RELOAD_FOR_INPUT, so we can + not change it to RELOAD_FOR_OTHER_ADDRESS. We should + never need to, since we do not modify RELOAD_FOR_OUTPUT. + + It is possible that the RELOAD_FOR_OPERAND_ADDRESS + instruction is assigned the same register as the earlier + RELOAD_FOR_OTHER_ADDRESS instruction. Merging these two + instructions will cause the RELOAD_FOR_OTHER_ADDRESS + instruction to be deleted later on. */ if (rld[i].when_needed == RELOAD_OTHER) for (j = 0; j < n_reloads; j++) @@ -6254,6 +6262,7 @@ merge_assigned_reloads (rtx insn) && rld[j].when_needed != RELOAD_OTHER && rld[j].when_needed != RELOAD_FOR_OTHER_ADDRESS && rld[j].when_needed != RELOAD_FOR_OUTPUT_ADDRESS + && rld[j].when_needed != RELOAD_FOR_OPERAND_ADDRESS && (! conflicting_input || rld[j].when_needed == RELOAD_FOR_INPUT_ADDRESS || rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS) |