diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-12-10 17:40:51 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-12-10 17:40:51 +0100 |
commit | 638cd7aa8d843d59334eac614f6a147438ea16d2 (patch) | |
tree | e5ca82aa3aba1e90db5500f99d8634be51361dd6 /gcc/regmove.c | |
parent | c962817c04bff076bb2e8696275bde5fc76fa233 (diff) | |
download | gcc-638cd7aa8d843d59334eac614f6a147438ea16d2.zip gcc-638cd7aa8d843d59334eac614f6a147438ea16d2.tar.gz gcc-638cd7aa8d843d59334eac614f6a147438ea16d2.tar.bz2 |
re PR rtl-optimization/46804 (gfortran.dg/char_cshift_2.f90 FAILs with -fregmove)
PR rtl-optimization/46804
* regmove.c (optimize_reg_copy_3): Look for REG_EQUAL note
on the setter of src_reg rather than on insn. If it is
equal to the setter's original SET_SRC, replace it with its
zero or sign extension instead of dropping it.
* gfortran.dg/pr46804.f90: New test.
From-SVN: r167695
Diffstat (limited to 'gcc/regmove.c')
-rw-r--r-- | gcc/regmove.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/regmove.c b/gcc/regmove.c index d3c733e..48a583f 100644 --- a/gcc/regmove.c +++ b/gcc/regmove.c @@ -514,7 +514,7 @@ optimize_reg_copy_3 (rtx insn, rtx dest, rtx src) rtx src_reg = XEXP (src, 0); int src_no = REGNO (src_reg); int dst_no = REGNO (dest); - rtx p, set; + rtx p, set, set_insn; enum machine_mode old_mode; basic_block bb = BLOCK_FOR_INSN (insn); @@ -552,6 +552,7 @@ optimize_reg_copy_3 (rtx insn, rtx dest, rtx src) GET_MODE_BITSIZE (GET_MODE (src_reg)))) return; + set_insn = p; old_mode = GET_MODE (src_reg); PUT_MODE (src_reg, GET_MODE (src)); XEXP (src, 0) = SET_SRC (set); @@ -584,9 +585,19 @@ optimize_reg_copy_3 (rtx insn, rtx dest, rtx src) } else { - rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX); + rtx note = find_reg_note (set_insn, REG_EQUAL, NULL_RTX); if (note) - remove_note (p, note); + { + if (rtx_equal_p (XEXP (note, 0), XEXP (src, 0))) + { + XEXP (note, 0) + = gen_rtx_fmt_e (GET_CODE (src), GET_MODE (src), + XEXP (note, 0)); + df_notes_rescan (set_insn); + } + else + remove_note (set_insn, note); + } } } |