Fixes an ICE found when using odd options.  Bootstrapped and
regression tested both powerpc64-linux and powerpc64le-linux.  OK to
apply?

gcc/
        PR target/70866
        * config/rs6000/rs6000.c (rs6000_stack_info): Don't set cr_save_p
        when cr2,3,4 are all fixed regs.
gcc/testsuite/
        * gcc.target/powerpc/pr70866.c: New.

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 812d3bc..e94aa66 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -23702,9 +23702,9 @@ rs6000_stack_info (void)
   info->calls_p = (!crtl->is_leaf || cfun->machine->ra_needs_full_frame);
 
   /* Determine if we need to save the condition code registers.  */
-  if (df_regs_ever_live_p (CR2_REGNO)
-      || df_regs_ever_live_p (CR3_REGNO)
-      || df_regs_ever_live_p (CR4_REGNO))
+  if (save_reg_p (CR2_REGNO)
+      || save_reg_p (CR3_REGNO)
+      || save_reg_p (CR4_REGNO))
     {
       info->cr_save_p = 1;
       if (DEFAULT_ABI == ABI_V4)
diff --git a/gcc/testsuite/gcc.target/powerpc/pr70866.c 
b/gcc/testsuite/gcc.target/powerpc/pr70866.c
new file mode 100644
index 0000000..25fd05a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr70866.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-ffixed-cr2 -ffixed-cr3 -ffixed-cr4" } */
+
+#define SET_CR(R,V) __asm__ __volatile__ ("mtcrf %0,%1" : : "n" (1<<(7-R)), 
"r" (V<<(4*(7-R))) : "cr" #R)
+
+void foo (void)
+{
+  SET_CR (2, 7);
+  SET_CR (3, 8);
+  SET_CR (4, 9);
+}

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to