diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2014-03-24 17:38:09 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2014-03-24 17:38:09 +0000 |
commit | 72a4ddf2b5f8167dd49a483888f14d34c3da582f (patch) | |
tree | aeae7ffed74971f9fea144af390f17c819a9157c /gcc/lra.c | |
parent | 2b2384e8c11ac54f8add062584ada9480079a25b (diff) | |
download | gcc-72a4ddf2b5f8167dd49a483888f14d34c3da582f.zip gcc-72a4ddf2b5f8167dd49a483888f14d34c3da582f.tar.gz gcc-72a4ddf2b5f8167dd49a483888f14d34c3da582f.tar.bz2 |
re PR rtl-optimization/60501 (LRA emits add patterns which might clobber cc)
2014-03-24 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
PR rtl-optimization/60501
* optabs.def (addptr3_optab): New optab.
* optabs.c (gen_addptr3_insn, have_addptr3_insn): New function.
* doc/md.texi ("addptrm3"): Document new RTL standard expander.
* expr.h (gen_addptr3_insn, have_addptr3_insn): Add prototypes.
* lra.c (emit_add3_insn): Use the addptr pattern if available.
* config/s390/s390.md ("addptrdi3", "addptrsi3"): New expanders.
From-SVN: r208796
Diffstat (limited to 'gcc/lra.c')
-rw-r--r-- | gcc/lra.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -254,6 +254,19 @@ emit_add3_insn (rtx x, rtx y, rtx z) rtx insn, last; last = get_last_insn (); + + if (have_addptr3_insn (x, y, z)) + { + insn = gen_addptr3_insn (x, y, z); + + /* If the target provides an "addptr" pattern it hopefully does + for a reason. So falling back to the normal add would be + a bug. */ + lra_assert (insn != NULL_RTX); + emit_insn (insn); + return insn; + } + insn = emit_insn (gen_rtx_SET (VOIDmode, x, gen_rtx_PLUS (GET_MODE (y), y, z))); if (recog_memoized (insn) < 0) |