aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPat Haugen <pthaugen@us.ibm.com>2017-09-13 18:02:22 +0000
committerAldy Hernandez <aldyh@redhat.com>2017-09-13 18:02:22 +0000
commit6c5a009b8968cb2d0f401b115232069c0dcace8f (patch)
tree6d10e0554229821863d81222199323e4edb151a3
parent20e6635a43a97b1a62899ced81dd1ef51d1721e0 (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/ChangeLog8
-rw-r--r--gcc/config/rs6000/rs6000.c16
-rw-r--r--gcc/config/rs6000/rs6000.md12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/powerpc/cr_shrink-wrap.c11
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" } } */