OSDN Git Service

PR target/6542
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 May 2002 14:20:04 +0000 (14:20 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 May 2002 14:20:04 +0000 (14:20 +0000)
* config/sparc/sparc.h (leaf_reg_remap): Remove const.
(CONDITIONAL_REGISTER_USAGE): For TARGET_FLAT make
fill leaf_reg_remap with identity.
* config/sparc/sparc.c (leaf_reg_remap): Remove const.

* gcc.dg/20020503-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53095 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20020503-1.c [new file with mode: 0644]

index a3dd64f..132164c 100644 (file)
@@ -1,3 +1,11 @@
+2002-05-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/6542
+       * config/sparc/sparc.h (leaf_reg_remap): Remove const.
+       (CONDITIONAL_REGISTER_USAGE): For TARGET_FLAT make
+       fill leaf_reg_remap with identity.
+       * config/sparc/sparc.c (leaf_reg_remap): Remove const.
+
 2002-05-03  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/h8300/crti.asm: Remove trailing spaces.
index 0bac7c9..30b6e89 100644 (file)
@@ -85,7 +85,7 @@ bool sparc_emitting_epilogue;
 /* Vector to say how input registers are mapped to output registers.
    HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
    eliminate it.  You must use -fomit-frame-pointer to get that.  */
-const char leaf_reg_remap[] =
+char leaf_reg_remap[] =
 { 0, 1, 2, 3, 4, 5, 6, 7,
   -1, -1, -1, -1, -1, -1, 14, -1,
   -1, -1, -1, -1, -1, -1, -1, -1,
index d70f542..f582b6a 100644 (file)
@@ -1014,12 +1014,16 @@ do                                                              \
       fixed_regs[4] = 0;                                       \
     if (TARGET_FLAT)                                           \
       {                                                                \
+       int regno;                                              \
        /* Let the compiler believe the frame pointer is still  \
           %fp, but output it as %i7.  */                       \
        fixed_regs[31] = 1;                                     \
        reg_names[HARD_FRAME_POINTER_REGNUM] = "%i7";           \
        /* Disable leaf functions */                            \
        memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER);     \
+       /* Make LEAF_REG_REMAP a noop.  */                      \
+       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
+         leaf_reg_remap [regno] = regno;                       \
       }                                                                \
   }                                                            \
 while (0)
@@ -1316,7 +1320,7 @@ extern enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
 extern char sparc_leaf_regs[];
 #define LEAF_REGISTERS sparc_leaf_regs
 
-extern const char leaf_reg_remap[];
+extern char leaf_reg_remap[];
 #define LEAF_REG_REMAP(REGNO) (leaf_reg_remap[REGNO])
 
 /* The class value for index registers, and the one for base regs.  */
index 3c7df3a..1a533f3 100644 (file)
@@ -1,3 +1,7 @@
+2002-05-03  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/20020503-1.c: New test.
+
 2002-05-02  Mark Mitchell  <mark@codesourcery.com>
 
        * g++.dg/init/dtor1.C: Make it tougher.
diff --git a/gcc/testsuite/gcc.dg/20020503-1.c b/gcc/testsuite/gcc.dg/20020503-1.c
new file mode 100644 (file)
index 0000000..5f9168e
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR target/6542
+   This testcase caused ICE on SPARC because the function uses no registers
+   after optimizing, so even if -mflat make all registers not permitted
+   for leaf functions, the function was still leaf, but LEAF_REG_REMAP
+   returned -1 for some registers (like %o0).  */
+/* { dg-do compile } */
+/* { do-options "-O2 -g" } */
+/* { do-options "-O2 -g -mflat" { target sparc*-*-* } } */
+
+void foo (char *a, char *b, char *c, char *d)
+{
+}