aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2006-06-23 01:19:57 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2006-06-23 01:19:57 +0000
commit8c3390831f47bc38a327ab9ae3abc16494cfcc98 (patch)
tree84cbd07ec7782287ae980befff4689504563d3bd /gcc
parent70259b264e0a06ddddea4b8b7680e72a82e528dc (diff)
downloadgcc-8c3390831f47bc38a327ab9ae3abc16494cfcc98.zip
gcc-8c3390831f47bc38a327ab9ae3abc16494cfcc98.tar.gz
gcc-8c3390831f47bc38a327ab9ae3abc16494cfcc98.tar.bz2
re PR target/27531 (sparc: undefined reference to .LL226 with -O2)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/reload1.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr27531-1.c114
4 files changed, 131 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1a12f5d..1d64969 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index f426e1d..210b007 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8731952..f0a68e5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..08e3f5e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr27531-1.c
@@ -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;
+}
+