diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2002-07-29 18:02:47 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2002-07-29 18:02:47 +0000 |
commit | 2199e5fade2d41cbdb19bb730e494613b9b7e262 (patch) | |
tree | 8880ef10951d3d1fbca761d1c3b95b762f0409e5 /gcc/genrecog.c | |
parent | 6ab185d6a53a5d77b86144d26414b5167778384a (diff) | |
download | gcc-2199e5fade2d41cbdb19bb730e494613b9b7e262.tar.gz |
gensupport.c: Include hashtab.h.
* gensupport.c: Include hashtab.h.
(insn_elision, condition_table, hash_c_test, cmp_c_test,
maybe_eval_c_test): New routines and data structures to
support insn elision.
(init_md_reader): Read and initialize the condition_table.
(read_md_rtx): Discard insn patterns whose C test is provably
always false.
* gensupport.h: Declare new functions and data structures.
* genconditions.c, dummy-conditions.c: New files.
* Makefile.in: Build genconditions; run it to construct
insn-conditions.c; build that and link it into most gen*
programs.
(HOST_SUPPORT, HOST_EARLY_SUPPORT): New variables.
(GEN): Delete, unused.
(STAGESTUFF): Update.
* gencodes.c: (gen_insn): #define CODE_FOR_xxx equal to
CODE_FOR_nothing for all elided patterns.
(main): Tweaked to support this.
* genflags.c (gen_proto): Emit a static inline generator
function here for all elided patterns, which simply returns
NULL_RTX.
(gen_insn): Do not define HAVE_xxx for elided patterns.
(main): Tweaked to support this. No need to forward-declare
struct rtx_def.
* genrecog.c: Do not bother emitting the C test if it's known
to be true at compile time.
From-SVN: r55839
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r-- | gcc/genrecog.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 5492fa0807e..7709eb8b6a6 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -2452,11 +2452,16 @@ make_insn_sequence (insn, type) { rtx x; const char *c_test = XSTR (insn, type == RECOG ? 2 : 1); + int truth = maybe_eval_c_test (c_test); struct decision *last; struct decision_test *test, **place; struct decision_head head; char c_test_pos[2]; + /* We should never see an insn whose C test is false at compile time. */ + if (truth == 0) + abort (); + record_insn_name (next_insn_code, (type == RECOG ? XSTR (insn, 0) : NULL)); c_test_pos[0] = '\0'; @@ -2504,7 +2509,8 @@ make_insn_sequence (insn, type) continue; place = &test->next; - if (c_test[0]) + /* Skip the C test if it's known to be true at compile time. */ + if (truth == -1) { /* Need a new node if we have another test to add. */ if (test->type == DT_accept_op) @@ -2577,7 +2583,9 @@ make_insn_sequence (insn, type) place = &last->tests; } - if (c_test[0]) + /* Skip the C test if it's known to be true at compile + time. */ + if (truth == -1) { test = new_decision_test (DT_c_test, &place); test->u.c_test = c_test; |