aboutsummaryrefslogtreecommitdiff
path: root/gcc/genrecog.c
diff options
context:
space:
mode:
authorZack Weinberg <zack@codesourcery.com>2002-07-29 18:02:47 +0000
committerZack Weinberg <zack@codesourcery.com>2002-07-29 18:02:47 +0000
commit3d15814d02b824dd5bc9c2b7a27313ebb7a9be28 (patch)
tree8880ef10951d3d1fbca761d1c3b95b762f0409e5 /gcc/genrecog.c
parentec6efa538cb8d6c5c72f23df89863d04dac41aa2 (diff)
* 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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@55839 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r--gcc/genrecog.c12
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;