diff options
author | Pat Haugen <pthaugen@us.ibm.com> | 2017-09-13 18:02:22 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2017-09-13 18:02:22 +0000 |
commit | 6c5a009b8968cb2d0f401b115232069c0dcace8f (patch) | |
tree | 6d10e0554229821863d81222199323e4edb151a3 | |
parent | 20e6635a43a97b1a62899ced81dd1ef51d1721e0 (diff) |
* config/rs6000/rs6000.c (rs6000_emit_prologue_move_from_cr): Rename fromrange-gen2
rs6000_emit_move_from_cr and call renamed function.
(rs6000_emit_prologue): Call renamed functions.
* config/rs6000/rs6000.md (prologue_movesi_from_cr): Rename from
movesi_from_cr, remove volatile CRs.
* gcc.target/powerpc/cr_shrink-wrap.c: New.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/range-gen2@252722 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 16 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/cr_shrink-wrap.c | 11 |
5 files changed, 40 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c2856633a8..2b5c50406bc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-08-30 Pat Haugen <pthaugen@us.ibm.com> + + * config/rs6000/rs6000.c (rs6000_emit_prologue_move_from_cr): Rename from + rs6000_emit_move_from_cr and call renamed function. + (rs6000_emit_prologue): Call renamed functions. + * config/rs6000/rs6000.md (prologue_movesi_from_cr): Rename from + movesi_from_cr, remove volatile CRs. + 2017-08-30 Jon Beniston <jon@beniston.com> Richard Biener <rguenther@suse.de> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 9df7705a42a..cf744d8bf62 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -26097,10 +26097,14 @@ rs6000_emit_savres_rtx (rs6000_stack_t *info, return insn; } -/* Emit code to store CR fields that need to be saved into REG. */ +/* Emit prologue code to store CR fields that need to be saved into REG. This + function should only be called when moving the non-volatile CRs to REG, it + is not a general purpose routine to move the entire set of CRs to REG. + Specifically, gen_prologue_movesi_from_cr() does not contain uses of the + volatile CRs. */ static void -rs6000_emit_move_from_cr (rtx reg) +rs6000_emit_prologue_move_from_cr (rtx reg) { /* Only the ELFv2 ABI allows storing only selected fields. */ if (DEFAULT_ABI == ABI_ELFv2 && TARGET_MFCRF) @@ -26131,7 +26135,7 @@ rs6000_emit_move_from_cr (rtx reg) as well, using logical operations to combine the values. */ } - emit_insn (gen_movesi_from_cr (reg)); + emit_insn (gen_prologue_movesi_from_cr (reg)); } /* Return whether the split-stack arg pointer (r12) is used. */ @@ -26871,7 +26875,7 @@ rs6000_emit_prologue (void) { cr_save_rtx = gen_rtx_REG (SImode, cr_save_regno); START_USE (cr_save_regno); - rs6000_emit_move_from_cr (cr_save_rtx); + rs6000_emit_prologue_move_from_cr (cr_save_rtx); } /* Do any required saving of fpr's. If only one or two to save, do @@ -27109,7 +27113,7 @@ rs6000_emit_prologue (void) { START_USE (0); cr_save_rtx = gen_rtx_REG (SImode, 0); - rs6000_emit_move_from_cr (cr_save_rtx); + rs6000_emit_prologue_move_from_cr (cr_save_rtx); } /* Saving CR requires a two-instruction sequence: one instruction @@ -27196,7 +27200,7 @@ rs6000_emit_prologue (void) /* ??? We might get better performance by using multiple mfocrf instructions. */ crsave = gen_rtx_REG (SImode, 0); - emit_insn (gen_movesi_from_cr (crsave)); + emit_insn (gen_prologue_movesi_from_cr (crsave)); for (i = 0; i < 8; i++) if (!call_used_regs[CR0_REGNO + i]) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index c0c392ce596..f67e949a3a3 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -13032,12 +13032,14 @@ }" [(set_attr "type" "mfcrf")]) -(define_insn "movesi_from_cr" +;; Don't include the volatile CRs since their values are not used wrt CR save +;; in the prologue and doing so prevents shrink-wrapping because we can't move the +;; prologue past an insn (early exit test) that defines a register used in the +;; prologue. +(define_insn "prologue_movesi_from_cr" [(set (match_operand:SI 0 "gpc_reg_operand" "=r") - (unspec:SI [(reg:CC CR0_REGNO) (reg:CC CR1_REGNO) - (reg:CC CR2_REGNO) (reg:CC CR3_REGNO) - (reg:CC CR4_REGNO) (reg:CC CR5_REGNO) - (reg:CC CR6_REGNO) (reg:CC CR7_REGNO)] + (unspec:SI [(reg:CC CR2_REGNO) (reg:CC CR3_REGNO) + (reg:CC CR4_REGNO)] UNSPEC_MOVESI_FROM_CR))] "" "mfcr %0" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0a5d125bae7..331b6dd29f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-08-30 Pat Haugen <pthaugen@us.ibm.com> + + * gcc.target/powerpc/cr_shrink-wrap.c: New. + 2017-08-30 Michael Meissner <meissner@linux.vnet.ibm.com> PR target/82015 diff --git a/gcc/testsuite/gcc.target/powerpc/cr_shrink-wrap.c b/gcc/testsuite/gcc.target/powerpc/cr_shrink-wrap.c new file mode 100644 index 00000000000..d16b3fdf23b --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/cr_shrink-wrap.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-rtl-pro_and_epilogue" } */ + +void foo(int i) +{ + if (i > 0) + /* Non-volatile CR kill on true path should not prevent shrink-wrap. */ + asm ("" : : : "cr2", "cr3"); +} + +/* { dg-final { scan-rtl-dump-times "Performing shrink-wrapping" 1 "pro_and_epilogue" } } */ |