diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-10-15 06:56:28 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-10-15 06:56:28 +0000 |
commit | 4747a74cc703a6d3c2b209857c779098c3784280 (patch) | |
tree | b7a113db2ece162dd4d84c92362f8413eba01a45 /gcc | |
parent | d45b8d1b557d2818270650e2d40326d3b152db81 (diff) | |
download | gcc-4747a74cc703a6d3c2b209857c779098c3784280.tar.gz |
* genrecog.c (message_with_line): Prototype.
(validate_pattern): Pass along the set for the dest, not a flag.
Fix non-lvalue message. Don't warn for VOIDmode SET_DEST of CALL.
Check for PC/CC0 as sources.
(nodes_identical): Check for children position match before
allowing the combination.
* rtl.c (read_rtx): Track line number across \\\n.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30010 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/genrecog.c | 79 | ||||
-rw-r--r-- | gcc/rtl.c | 2 |
3 files changed, 62 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 18cdd162207..c227608c4d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Thu Oct 14 23:51:56 1999 Richard Henderson <rth@cygnus.com> + + * genrecog.c (message_with_line): Prototype. + (validate_pattern): Pass along the set for the dest, not a flag. + Fix non-lvalue message. Don't warn for VOIDmode SET_DEST of CALL. + Check for PC/CC0 as sources. + (nodes_identical): Check for children position match before + allowing the combination. + + * rtl.c (read_rtx): Track line number across \\\n. + Thu Oct 14 23:50:25 1999 Richard Henderson <rth@cygnus.com> * mips.h (SPECIAL_MODE_PREDICATES): New. diff --git a/gcc/genrecog.c b/gcc/genrecog.c index d12d7c6ff70..664ef50f557 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -227,6 +227,9 @@ static const char * special_mode_pred_table[] = { #define NUM_SPECIAL_MODE_PREDS \ (sizeof (special_mode_pred_table) / sizeof (special_mode_pred_table[0])) +static void message_with_line + PVPROTO ((int, const char *, ...)) ATTRIBUTE_PRINTF_2; + static struct decision *new_decision PROTO((const char *, struct decision_head *)); static struct decision_test *new_decision_test @@ -234,7 +237,7 @@ static struct decision_test *new_decision_test static rtx find_operand PROTO((rtx, int)); static void validate_pattern - PROTO((rtx, rtx, int)); + PROTO((rtx, rtx, rtx)); static struct decision *add_to_sequence PROTO((rtx, struct decision_head *, const char *, enum routine_type, int)); @@ -418,13 +421,14 @@ find_operand (pattern, n) return NULL; } -/* Check for various errors in patterns. */ +/* Check for various errors in patterns. SET is nonnull for a destination, + and is the complete set pattern. */ static void -validate_pattern (pattern, insn, set_dest) +validate_pattern (pattern, insn, set) rtx pattern; rtx insn; - int set_dest; + rtx set; { const char *fmt; RTX_CODE code; @@ -502,15 +506,28 @@ validate_pattern (pattern, insn, set_dest) } } + /* A MATCH_OPERAND that is a SET should have an output reload. */ + if (set + && code == MATCH_OPERAND + && XSTR (pattern, 2)[0] != '\0' + && XSTR (pattern, 2)[0] != '=' + && XSTR (pattern, 2)[0] != '+') + { + message_with_line (pattern_lineno, + "operand %d missing output reload", + XINT (pattern, 0)); + error_count++; + } + /* Allowing non-lvalues in destinations -- particularly CONST_INT -- while not likely to occur at runtime, results in less efficient code from insn-recog.c. */ - if (set_dest + if (set && pred_name[0] != '\0' && allows_non_lvalue) { message_with_line (pattern_lineno, - "warning: destination operand 0 allows non-lvalue", + "warning: destination operand %d allows non-lvalue", XINT (pattern, 0)); } @@ -519,7 +536,8 @@ validate_pattern (pattern, insn, set_dest) it is a mistake. Only DEFINE_INSN is eligible, since SPLIT and PEEP2 can FAIL within the output pattern. Exclude address_operand, since its mode is related to the mode of - the memory not the operand. */ + the memory not the operand. Exclude the SET_DEST of a call + instruction, as that is a common idiom. */ if (GET_MODE (pattern) == VOIDmode && code == MATCH_OPERAND @@ -528,26 +546,15 @@ validate_pattern (pattern, insn, set_dest) && ! special_mode_pred && pred_name[0] != '\0' && strcmp (pred_name, "address_operand") != 0 - && strstr (c_test, "operands") == NULL) + && strstr (c_test, "operands") == NULL + && ! (set + && GET_CODE (set) == SET + && GET_CODE (SET_SRC (set)) == CALL)) { message_with_line (pattern_lineno, "warning: operand %d missing mode?", XINT (pattern, 0)); } - - /* A MATCH_OPERAND that is a SET should have an output reload. */ - if (set_dest - && code == MATCH_OPERAND - && XSTR (pattern, 2)[0] != '\0' - && XSTR (pattern, 2)[0] != '=' - && XSTR (pattern, 2)[0] != '+') - { - message_with_line (pattern_lineno, - "operand %d missing output reload", - XINT (pattern, 0)); - error_count++; - } - return; } @@ -600,6 +607,8 @@ validate_pattern (pattern, insn, set_dest) else if (dmode != smode && GET_CODE (dest) != PC && GET_CODE (dest) != CC0 + && GET_CODE (src) != PC + && GET_CODE (src) != CC0 && GET_CODE (src) != CONST_INT) { const char *which; @@ -609,14 +618,14 @@ validate_pattern (pattern, insn, set_dest) } if (dest != SET_DEST (pattern)) - validate_pattern (dest, insn, 1); - validate_pattern (SET_DEST (pattern), insn, 1); - validate_pattern (SET_SRC (pattern), insn, 0); + validate_pattern (dest, insn, pattern); + validate_pattern (SET_DEST (pattern), insn, pattern); + validate_pattern (SET_SRC (pattern), insn, NULL_RTX); return; } case CLOBBER: - validate_pattern (SET_DEST (pattern), insn, 1); + validate_pattern (SET_DEST (pattern), insn, pattern); return; case LABEL_REF: @@ -640,12 +649,12 @@ validate_pattern (pattern, insn, set_dest) switch (fmt[i]) { case 'e': case 'u': - validate_pattern (XEXP (pattern, i), insn, 0); + validate_pattern (XEXP (pattern, i), insn, NULL_RTX); break; case 'E': for (j = 0; j < XVECLEN (pattern, i); j++) - validate_pattern (XVECEXP (pattern, i, j), insn, 0); + validate_pattern (XVECEXP (pattern, i, j), insn, NULL_RTX); break; case 'i': case 'w': case '0': case 's': @@ -1219,7 +1228,17 @@ nodes_identical (d1, d2) } /* For success, they should now both be null. */ - return t1 == t2; + if (t1 != t2) + return 0; + + /* Check that their subnodes are at the same position, as any one set + of sibling decisions must be at the same position. */ + if (d1->success.first + && d2->success.first + && strcmp (d1->success.first->position, d2->success.first->position)) + return 0; + + return 1; } /* A subroutine of merge_trees; given two nodes that have been declared @@ -2313,7 +2332,7 @@ make_insn_sequence (insn, type) PUT_MODE (x, VOIDmode); } - validate_pattern (x, insn, 0); + validate_pattern (x, insn, NULL_RTX); memset(&head, 0, sizeof(head)); last = add_to_sequence (x, &head, "", type, 1); diff --git a/gcc/rtl.c b/gcc/rtl.c index 55687c81963..282b4a7901f 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -954,6 +954,8 @@ read_rtx (infile) obstack_grow (rtl_obstack, "\\n\\t", 4); continue; } + if (c == '\n') + read_rtx_lineno++; } else if (c == '"') break; |