aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-03-20 22:58:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-03-20 22:58:57 +0100
commita29b099d7aa8f3819b5791f69b1d5e346e2a1018 (patch)
tree84f08d2e1bd0d8c13fac88df8d41b14815ccd937
parent048b1c951bd2510e004535964f001e7d6ddcf459 (diff)
downloadgcc-a29b099d7aa8f3819b5791f69b1d5e346e2a1018.zip
gcc-a29b099d7aa8f3819b5791f69b1d5e346e2a1018.tar.gz
gcc-a29b099d7aa8f3819b5791f69b1d5e346e2a1018.tar.bz2
re PR bootstrap/4192 (fr30-elf does not build - memory exhausted building crtbegin.o)
PR bootstrap/4192 * config/fr30/fr30.md (jump): Comment out clobber of fixed register. * genemit.c (output_added_clobbers_hard_reg_p): Only output return stmt if some case has been output. * gcc.c-torture/compile/20020320-1.c: New test. From-SVN: r51088
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/fr30/fr30.md7
-rw-r--r--gcc/genemit.c11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020320-1.c24
5 files changed, 49 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1e3bb43..131cd9e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2002-03-20 Jakub Jelinek <jakub@redhat.com>
+ PR bootstrap/4192
+ * config/fr30/fr30.md (jump): Comment out clobber of fixed register.
+
+ * genemit.c (output_added_clobbers_hard_reg_p): Only output return
+ stmt if some case has been output.
+
+2002-03-20 Jakub Jelinek <jakub@redhat.com>
+
PR c/5972
* config/i386/i386.md (movdicc_c_rex64, movsicc_noc, movhicc_noc,
movsfcc_1, movdfcc_1): Add %O2.
diff --git a/gcc/config/fr30/fr30.md b/gcc/config/fr30/fr30.md
index 6bdfa48..1177c68 100644
--- a/gcc/config/fr30/fr30.md
+++ b/gcc/config/fr30/fr30.md
@@ -1303,9 +1303,12 @@
;; Normal unconditional jump.
;; For a description of the computation of the length
;; attribute see the branch patterns above.
+;;
+;; Although this instruction really clobbers r0, flow
+;; relies on jump being simplejump_p in several places
+;; and as r0 is fixed, this doesn't change anything
(define_insn "jump"
- [(set (pc) (label_ref (match_operand 0 "" "")))
- (clobber (reg:SI 0))]
+ [(set (pc) (label_ref (match_operand 0 "" "")))]
""
"*
{
diff --git a/gcc/genemit.c b/gcc/genemit.c
index 2d11d2b..5a7f32a 100644
--- a/gcc/genemit.c
+++ b/gcc/genemit.c
@@ -722,7 +722,7 @@ output_added_clobbers_hard_reg_p ()
{
struct clobber_pat *clobber;
struct clobber_ent *ent;
- int clobber_p;
+ int clobber_p, used;
printf ("\n\nint\nadded_clobbers_hard_reg_p (insn_code_number)\n");
printf (" int insn_code_number;\n");
@@ -732,12 +732,17 @@ output_added_clobbers_hard_reg_p ()
for (clobber_p = 0; clobber_p <= 1; clobber_p++)
{
+ used = 0;
for (clobber = clobber_list; clobber; clobber = clobber->next)
if (clobber->has_hard_reg == clobber_p)
for (ent = clobber->insns; ent; ent = ent->next)
- printf (" case %d:\n", ent->code_number);
+ {
+ printf (" case %d:\n", ent->code_number);
+ used++;
+ }
- printf (" return %d;\n\n", clobber_p);
+ if (used)
+ printf (" return %d;\n\n", clobber_p);
}
printf (" default:\n");
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9fd78e0..ca6d0b2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-03-20 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c-torture/compile/20020320-1.c: New test.
+
2002-03-19 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20020318-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020320-1.c b/gcc/testsuite/gcc.c-torture/compile/20020320-1.c
new file mode 100644
index 0000000..385c061
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020320-1.c
@@ -0,0 +1,24 @@
+/* PR bootstrap/4192
+ This testcase caused infinite loop in flow (several places),
+ because flow assumes gen_jump generates simple_jump_p. */
+
+typedef void (*T) (void);
+extern T x[];
+
+void
+foo (void)
+{
+ static T *p = x;
+ static _Bool a;
+ T f;
+
+ if (__builtin_expect (a, 0))
+ return;
+
+ while ((f = *p))
+ {
+ p++;
+ f ();
+ }
+ a = 1;
+}