diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1992-01-15 16:29:48 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1992-01-15 16:29:48 -0500 |
commit | de6a431bee95a409f848f3f2276bf026c4e7272a (patch) | |
tree | 3ed3cdad3c795d6a6fc766e82e799ebc659f6001 /gcc/genrecog.c | |
parent | e1c8bbf44b25e3a811a415a9294ea11bd4a4c3f6 (diff) | |
download | gcc-de6a431bee95a409f848f3f2276bf026c4e7272a.zip gcc-de6a431bee95a409f848f3f2276bf026c4e7272a.tar.gz gcc-de6a431bee95a409f848f3f2276bf026c4e7272a.tar.bz2 |
*** empty log message ***
From-SVN: r189
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r-- | gcc/genrecog.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c index a3f9184c..a8b0372 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -1,5 +1,5 @@ /* Generate code from machine description to recognize rtl as insns. - Copyright (C) 1987-1991 Free Software Foundation, Inc. + Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc. This file is part of GNU CC. @@ -81,7 +81,7 @@ struct decision int test_elt_zero_int; /* Nonzero if should test XINT (rtl, 0) */ int elt_zero_int; /* Required value for XINT (rtl, 0) */ int test_elt_one_int; /* Nonzero if should test XINT (rtl, 1) */ - int elt_one_int; /* Required value for XINT (rtl, 2) */ + int elt_one_int; /* Required value for XINT (rtl, 1) */ char *tests; /* If nonzero predicate to call */ int pred; /* `preds' index of predicate or -1 */ char *c_test; /* Additional test to perform */ @@ -824,11 +824,30 @@ merge_trees (oldh, addh) } } - old->success = merge_trees (old->success, add->success); if (old->insn_code_number >= 0 && add->insn_code_number >= 0) - fatal ("Two actions at one point in tree"); + { + /* If one node is for a normal insn and the second is + for the base insn with clobbers stripped off, the + second node should be ignored. */ + + if (old->num_clobbers_to_add == 0 + && add->num_clobbers_to_add > 0) + /* Nothing to do here. */ + ; + else if (old->num_clobbers_to_add > 0 + && add->num_clobbers_to_add == 0) + { + /* In this case, replace OLD with ADD. */ + old->insn_code_number = add->insn_code_number; + old->num_clobbers_to_add = 0; + } + else + fatal ("Two actions at one point in tree"); + } + if (old->insn_code_number == -1) old->insn_code_number = add->insn_code_number; + old->success = merge_trees (old->success, add->success); add = 0; break; } @@ -1609,7 +1628,7 @@ fatal (s, a1, a2) fprintf (stderr, "genrecog: "); fprintf (stderr, s, a1, a2); fprintf (stderr, "\n"); - fprintf (stderr, "after %d instruction definitions\n", next_index); + fprintf (stderr, "after %d definitions\n", next_index); exit (FATAL_EXIT_CODE); } |