summaryrefslogtreecommitdiff
path: root/gcc/ree.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-02 07:13:49 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-05-02 07:13:49 +0000
commit559f753b89b09661db0428811fcc914ca150616a (patch)
treeded425eea0d88fb780f3a7aa47e92d5c227063ad /gcc/ree.c
parent00d491c0d562a76b1909e33865f0e8c35247decc (diff)
downloadgcc-559f753b89b09661db0428811fcc914ca150616a.tar.gz
PR rtl-optimization/53160
* ree.c (combine_reaching_defs): Handle the case where cand->insn has been modified by ree pass already. * gcc.c-torture/execute/pr53160.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187035 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ree.c')
-rw-r--r--gcc/ree.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/ree.c b/gcc/ree.c
index 86fd900213a..25ee7e263db 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -667,6 +667,24 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
if (!outcome)
return false;
+ /* If cand->insn has been already modified, update cand->mode to a wider
+ mode if possible, or punt. */
+ if (state->modified[INSN_UID (cand->insn)].kind != EXT_MODIFIED_NONE)
+ {
+ enum machine_mode mode;
+ rtx set;
+
+ if (state->modified[INSN_UID (cand->insn)].kind
+ != (cand->code == ZERO_EXTEND
+ ? EXT_MODIFIED_ZEXT : EXT_MODIFIED_SEXT)
+ || state->modified[INSN_UID (cand->insn)].mode != cand->mode
+ || (set = single_set (cand->insn)) == NULL_RTX)
+ return false;
+ mode = GET_MODE (SET_DEST (set));
+ gcc_assert (GET_MODE_SIZE (mode) >= GET_MODE_SIZE (cand->mode));
+ cand->mode = mode;
+ }
+
merge_successful = true;
/* Go through the defs vector and try to merge all the definitions