summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-10-15 06:56:28 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-10-15 06:56:28 +0000
commit4747a74cc703a6d3c2b209857c779098c3784280 (patch)
treeb7a113db2ece162dd4d84c92362f8413eba01a45 /gcc
parentd45b8d1b557d2818270650e2d40326d3b152db81 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/genrecog.c79
-rw-r--r--gcc/rtl.c2
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;