re PR target/27531 (sparc: undefined reference to .LL226 with -O2)
authorRoger Sayle <roger@eyesopen.com>
Fri, 23 Jun 2006 01:19:57 +0000 (01:19 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Fri, 23 Jun 2006 01:19:57 +0000 (01:19 +0000)
2006-06-22  Roger Sayle  <roger@eyesopen.com>
    Steven Bosscher  <stevenb.gcc@gmail.com>

PR target/27531
* reload1.c (gen_reload): Call mark_jump_label on the new insns
generated by gen_move_insn to add REG_LABEL notes if necessary.

* gcc.dg/pr27531-1.c: New test case.

Co-Authored-By: Steven Bosscher <stevenb.gcc@gmail.com>
From-SVN: r114921

gcc/ChangeLog
gcc/reload1.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr27531-1.c [new file with mode: 0644]

index 1a12f5dbe68b11645db7fe3d12984a5cd5eb392a..1d64969bc432dbbcdc618e6ee64d296789639de1 100644 (file)
@@ -1,3 +1,10 @@
+2006-06-22  Roger Sayle  <roger@eyesopen.com>
+           Steven Bosscher  <stevenb.gcc@gmail.com>
+
+       PR target/27531
+       * reload1.c (gen_reload): Call mark_jump_label on the new insns
+       generated by gen_move_insn to add REG_LABEL notes if necessary.
+
 2006-06-22  Bob Wilson  <bob.wilson@acm.org>
 
        * config/xtensa/lib1funcs.asm (MIN_ESA): Delete.
index f426e1dbe1ddbfbb2710b5be959c57e45fd7b659..210b007af9e9159ec11ebf273e1f09edacc22358 100644 (file)
@@ -7757,7 +7757,11 @@ gen_reload (rtx out, rtx in, int opnum, enum reload_type type)
     }
   /* If IN is a simple operand, use gen_move_insn.  */
   else if (OBJECT_P (in) || GET_CODE (in) == SUBREG)
-    emit_insn (gen_move_insn (out, in));
+    {
+      tem = emit_insn (gen_move_insn (out, in));
+      /* IN may contain a LABEL_REF, if so add a REG_LABEL note.  */
+      mark_jump_label (in, tem, 0);
+    }
 
 #ifdef HAVE_reload_load_address
   else if (HAVE_reload_load_address)
index 87319529d336b5c583496539d48fc9c024c20868..f0a68e5c5e3d156de1708066312f670ce909ca6a 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-22  Roger Sayle  <roger@eyesopen.com>
+
+       PR target/27531
+       * gcc.dg/pr27531-1.c: New test case.
+
 2006-06-22  Asher Langton  <langton2@llnl.gov>
 
        PR fortran/24748
diff --git a/gcc/testsuite/gcc.dg/pr27531-1.c b/gcc/testsuite/gcc.dg/pr27531-1.c
new file mode 100644 (file)
index 0000000..08e3f5e
--- /dev/null
@@ -0,0 +1,114 @@
+/* PR target/27531 */
+/* This test case stressed the register allocator into reloading a LABEL_REF
+   on sparc, but didn't add a REG_LABEL note, ultimately causing the assembly
+   output to reference a label that had been eliminated.  */
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+typedef struct _IO_FILE FILE;
+char const *RCSname;
+void *Locks;
+void * Head;
+struct Revpairs{
+    struct Revpairs * rnext;
+};
+extern char *strchr(const char *s, int c);
+extern int fprintf(FILE *, const char *format, ...);
+static void getrevpairs (char*);
+static int branchflag;
+static struct Revpairs *revlist, *Revlst;
+
+extern int warn(const char *msg, char *argv);
+extern int error(const char *msg, int c, char *argv);
+extern int recentdate(void *foo, void *bar);
+
+char *t;
+int main (int argc, char **argv)
+{
+    FILE *out;
+    char *a, **newargv;
+    void *currdate;
+    int descflag, selectflag;
+    int onlylockflag;
+    int onlyRCSflag;
+    int shownames;
+    descflag = selectflag = shownames = 1;
+    onlylockflag = onlyRCSflag = 0;
+    while (a = *++argv, 0<--argc)
+    {
+        switch (*a++)
+        {
+            case 'L':
+                onlylockflag = 1;
+            case 'N':
+                shownames = 0;
+            case 'R':
+                t = a;
+            case 'b':
+                branchflag = 1;
+            case 'r':
+                getrevpairs(a);
+        }
+        if (onlylockflag && !Locks)
+            fprintf(out, "%s\n", RCSname);
+        if (shownames) 
+            while( currdate)
+                recentdate(Head, currdate);
+    }
+}
+void getrevpairs(char *argv)
+{
+    char c;
+    struct Revpairs * nextrevpair;
+    int separator;
+    if (strchr(argv,':'))
+        separator = ':';
+    else
+    {
+        if (strchr(argv,'-') )
+            warn("`-' is obsolete in `-r%s'; use `:' instead", argv);
+        separator = '-';
+    }
+    for (;;)
+    {
+        nextrevpair->rnext = revlist;
+        for (;; c = *++argv)
+        {
+            switch (c)
+            {
+                default:
+                    continue;
+                case ' ':
+                case '\t':
+                case '\n':
+                    break;
+                case ':':
+                case '-':
+                    if (c == separator)
+                        continue;
+            }
+            break;
+        }
+        if (!c)
+            break;
+        error("missing `,' near `%c%s'", c, argv+1);
+    }
+}
+
+int warn(const char *msg, char *argv)
+{
+  t = 0;  /* this function needs side-effects.  */
+  return 0;
+}
+
+int error(const char *msg, int c, char *argv)
+{
+  t = 0; /* this function needs side-effects.  */
+  return 0;
+}
+
+int recentdate(void *foo, void *bar)
+{
+  t = 0; /* this function needs side-effects.  */
+  return 0;
+}
+