From 497d383424c5d3c54d15d7fe6f3c4a2a1db128b4 Mon Sep 17 00:00:00 2001
From: Michael Meissner <meissner@linux.vnet.ibm.com>
Date: Fri, 20 Nov 2009 21:40:39 +0000
Subject: [PATCH] Undo part of 2009-10-23 change

From-SVN: r154380
---
 gcc/ChangeLog                                 |  9 +++
 gcc/config/rs6000/rs6000.c                    | 77 ++-----------------
 gcc/testsuite/ChangeLog                       |  5 ++
 gcc/testsuite/gcc.target/powerpc/vsx-vrsave.c | 20 -----
 4 files changed, 19 insertions(+), 92 deletions(-)
 delete mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vrsave.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b8b7bd766b8..0375dbe23e35 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2009-11-20  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+	PR target/41787
+	* config/rs6000/rs6000.c (struct machine_function): Revert
+	2009-10-23 change to set VRSAVE to non-0 if we use VSX.
+	(rs6000_expand_to_rtl_hook): Ditto.
+	(rs6000_check_vector_mode): Ditto.
+	(compute_vrsave_mask): Ditto.
+
 2009-11-20  Paul Brook  <paul@codesourcery.com>
 
 	* doc/invoke.texi: Document ARM -mcpu=cortex-a5.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 88649ea07353..9b03a9bfe68b 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -130,8 +130,6 @@ typedef struct GTY(()) machine_function
      64-bits wide and is allocated early enough so that the offset
      does not overflow the 16-bit load/store offset field.  */
   rtx sdmode_stack_slot;
-  /* True if any VSX or ALTIVEC vector type was used.  */
-  bool vsx_or_altivec_used_p;
 } machine_function;
 
 /* Target cpu type */
@@ -915,7 +913,7 @@ static void rs6000_elf_encode_section_info (tree, rtx, int)
      ATTRIBUTE_UNUSED;
 #endif
 static bool rs6000_use_blocks_for_constant_p (enum machine_mode, const_rtx);
-static void rs6000_expand_to_rtl_hook (void);
+static void rs6000_alloc_sdmode_stack_slot (void);
 static void rs6000_instantiate_decls (void);
 #if TARGET_XCOFF
 static void rs6000_xcoff_asm_output_anchor (rtx);
@@ -1507,7 +1505,7 @@ static const struct attribute_spec rs6000_attribute_table[] =
 #define TARGET_BUILTIN_RECIPROCAL rs6000_builtin_reciprocal
 
 #undef TARGET_EXPAND_TO_RTL_HOOK
-#define TARGET_EXPAND_TO_RTL_HOOK rs6000_expand_to_rtl_hook
+#define TARGET_EXPAND_TO_RTL_HOOK rs6000_alloc_sdmode_stack_slot
 
 #undef TARGET_INSTANTIATE_DECLS
 #define TARGET_INSTANTIATE_DECLS rs6000_instantiate_decls
@@ -13192,38 +13190,6 @@ rs6000_check_sdmode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
   return NULL_TREE;
 }
 
-static tree
-rs6000_check_vector_mode (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
-{
-  /* Don't walk into types.  */
-  if (*tp == NULL_TREE || *tp == error_mark_node || TYPE_P (*tp))
-    {
-      *walk_subtrees = 0;
-      return NULL_TREE;
-    }
-
-  switch (TREE_CODE (*tp))
-    {
-    case VAR_DECL:
-    case PARM_DECL:
-    case FIELD_DECL:
-    case RESULT_DECL:
-    case SSA_NAME:
-    case REAL_CST:
-    case INDIRECT_REF:
-    case ALIGN_INDIRECT_REF:
-    case MISALIGNED_INDIRECT_REF:
-    case VIEW_CONVERT_EXPR:
-      if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (*tp))))
-	return *tp;
-      break;
-    default:
-      break;
-    }
-
-  return NULL_TREE;
-}
-
 enum reload_reg_type {
   GPR_REGISTER_TYPE,
   VECTOR_REGISTER_TYPE,
@@ -13664,17 +13630,11 @@ rs6000_ira_cover_classes (void)
   return (TARGET_VSX) ? cover_vsx : cover_pre_vsx;
 }
 
-/* Scan the trees looking for certain types.
-
-   Allocate a 64-bit stack slot to be used for copying SDmode values through if
-   this function has any SDmode references.
-
-   If VSX, note whether any vector operation was done so we can set VRSAVE to
-   non-zero, even if we just use the floating point registers to tell the
-   kernel to save the vector registers.  */
+/* Allocate a 64-bit stack slot to be used for copying SDmode
+   values through if this function has any SDmode references.  */
 
 static void
-rs6000_expand_to_rtl_hook (void)
+rs6000_alloc_sdmode_stack_slot (void)
 {
   tree t;
   basic_block bb;
@@ -13682,24 +13642,6 @@ rs6000_expand_to_rtl_hook (void)
 
   gcc_assert (cfun->machine->sdmode_stack_slot == NULL_RTX);
 
-  /* Check for vectors.  */
-  if (TARGET_VSX)
-    {
-      FOR_EACH_BB (bb)
-	for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
-	  {
-	    if (walk_gimple_op (gsi_stmt (gsi), rs6000_check_vector_mode,
-				NULL))
-	      {
-		cfun->machine->vsx_or_altivec_used_p = true;
-		goto found_vector;
-	      }
-	  }
-    found_vector:
-      ;
-    }
-
-  /* Check for SDmode being used.  */
   FOR_EACH_BB (bb)
     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
       {
@@ -16841,15 +16783,6 @@ compute_vrsave_mask (void)
     if (df_regs_ever_live_p (i))
       mask |= ALTIVEC_REG_BIT (i);
 
-  /* If VSX is used, we might have used a traditional floating point register
-     in a vector mode without using any altivec registers.  However the VRSAVE
-     register does not have room to indicate the floating point registers.
-     Modern kernels only look to see if the value is non-zero to determine if
-     they need to save the vector registers, so we just set an arbitrary
-     value if any vector type was used.  */
-  if (mask == 0 && TARGET_VSX && cfun->machine->vsx_or_altivec_used_p)
-    mask = 0xFFF;
-
   if (mask == 0)
     return mask;
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 51d1d328067d..1af8b0ff2417 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-20  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+	* gcc/testsuite/gcc.target/powerpc/vsx-vrsave.c: Delete,
+	2009-10-23 change to set VRSAVE if VSX has been reverted.
+
 2009-11-20  Simon Martin  <simartin@users.sourceforge.net>
 
 	PR c++/38646
diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vrsave.c b/gcc/testsuite/gcc.target/powerpc/vsx-vrsave.c
deleted file mode 100644
index 83125f67fcc6..000000000000
--- a/gcc/testsuite/gcc.target/powerpc/vsx-vrsave.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* { dg-do compile { target { powerpc*-*-* } } } */
-/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
-/* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O2 -mcpu=power7" } */
-/* { dg-final { scan-assembler-times "mtvrsave" 2 } } */
-
-/* Check whether VRSAVE is set to non-zero if VSX vector operations were
-   used, but it should not be set if there are no vector operations.  */
-
-void
-generates_vrsave (vector double *a, vector double *b, vector double *c)
-{
-  *a = *b + *c;
-}
-
-void
-no_vrsave (double *a, double *b, double *c)
-{
-  *a = *b + *c;
-}
-- 
GitLab