genrecog.c (match_pattern_1): Expect the pattern to be a SEQUENCE for define_peephole2s.

gcc/
	* genrecog.c (match_pattern_1): Expect the pattern to be a SEQUENCE
	for define_peephole2s.
	(get_peephole2_pattern): New function.
	(main): Use it.  Call validate_pattern.

From-SVN: r223015
This commit is contained in:
Richard Sandiford 2015-05-11 19:54:42 +00:00 committed by Richard Sandiford
parent 91c6b410ad
commit 182b8b6956
2 changed files with 49 additions and 19 deletions

View File

@ -1,3 +1,10 @@
2015-05-11 Richard Sandiford <richard.sandiford@arm.com>
* genrecog.c (match_pattern_1): Expect the pattern to be a SEQUENCE
for define_peephole2s.
(get_peephole2_pattern): New function.
(main): Use it. Call validate_pattern.
2015-05-11 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* config/avr/avr.c (avr_hard_regno_call_part_clobbered): Use

View File

@ -4080,14 +4080,14 @@ match_pattern_2 (state *s, rtx top_pattern, position *pos, rtx pattern)
(2) the rtx matches TOP_PATTERN and
(3) C_TEST is true.
For peephole2, TOP_PATTERN is the DEFINE_PEEPHOLE2 itself, otherwise
it is the rtx pattern to match (PARALLEL, SET, etc.). */
For peephole2, TOP_PATTERN is a SEQUENCE of the instruction patterns
to match, otherwise it is a single instruction pattern. */
static void
match_pattern_1 (state *s, rtx top_pattern, const char *c_test,
acceptance_type acceptance)
{
if (GET_CODE (top_pattern) == DEFINE_PEEPHOLE2)
if (acceptance.type == PEEPHOLE2)
{
/* Match each individual instruction. */
position **subpos_ptr = &peep2_insn_pos_list;
@ -4095,18 +4095,14 @@ match_pattern_1 (state *s, rtx top_pattern, const char *c_test,
for (int i = 0; i < XVECLEN (top_pattern, 0); ++i)
{
rtx x = XVECEXP (top_pattern, 0, i);
/* Ignore scratch register requirements. */
if (GET_CODE (x) != MATCH_SCRATCH && GET_CODE (x) != MATCH_DUP)
{
position *subpos = next_position (subpos_ptr, &root_pos,
POS_PEEP2_INSN, count);
if (count > 0)
s = add_decision (s, rtx_test::peep2_count (count + 1),
true, false);
s = match_pattern_2 (s, top_pattern, subpos, x);
subpos_ptr = &subpos->next;
count += 1;
}
position *subpos = next_position (subpos_ptr, &root_pos,
POS_PEEP2_INSN, count);
if (count > 0)
s = add_decision (s, rtx_test::peep2_count (count + 1),
true, false);
s = match_pattern_2 (s, top_pattern, subpos, x);
subpos_ptr = &subpos->next;
count += 1;
}
acceptance.u.full.u.match_len = count - 1;
}
@ -5165,6 +5161,30 @@ add_implicit_parallel (rtvec vec)
}
}
/* Return the rtx pattern for the list of rtxes in a define_peephole2. */
static rtx
get_peephole2_pattern (rtvec vec)
{
int i, j;
rtx pattern = rtx_alloc (SEQUENCE);
XVEC (pattern, 0) = rtvec_alloc (GET_NUM_ELEM (vec));
for (i = j = 0; i < GET_NUM_ELEM (vec); i++)
{
rtx x = RTVEC_ELT (vec, i);
/* Ignore scratch register requirements. */
if (GET_CODE (x) != MATCH_SCRATCH && GET_CODE (x) != MATCH_DUP)
{
XVECEXP (pattern, 0, j) = x;
j++;
}
}
XVECLEN (pattern, 0) = j;
if (j == 0)
error_with_line (pattern_lineno, "empty define_peephole2");
return pattern;
}
/* Return true if *PATTERN_PTR is a PARALLEL in which at least one trailing
rtx can be added automatically by add_clobbers. If so, update
*ACCEPTANCE_PTR so that its num_clobbers field contains the number
@ -5231,20 +5251,20 @@ main (int argc, char **argv)
if (desc == NULL)
break;
rtx pattern;
acceptance_type acceptance;
acceptance.partial_p = false;
acceptance.u.full.code = next_insn_code;
rtx pattern;
switch (GET_CODE (desc))
{
case DEFINE_INSN:
{
/* Match the instruction in the original .md form. */
pattern = add_implicit_parallel (XVEC (desc, 1));
acceptance.type = RECOG;
acceptance.u.full.u.num_clobbers = 0;
pattern = add_implicit_parallel (XVEC (desc, 1));
validate_pattern (pattern, desc, NULL_RTX, 0);
match_pattern (&insn_root, pattern, XSTR (desc, 2), acceptance);
/* If the pattern is a PARALLEL with trailing CLOBBERs,
@ -5258,6 +5278,7 @@ main (int argc, char **argv)
case DEFINE_SPLIT:
acceptance.type = SPLIT;
pattern = add_implicit_parallel (XVEC (desc, 0));
validate_pattern (pattern, desc, NULL_RTX, 0);
match_pattern (&split_root, pattern, XSTR (desc, 1), acceptance);
/* Declare the gen_split routine that we'll call if the
@ -5268,7 +5289,9 @@ main (int argc, char **argv)
case DEFINE_PEEPHOLE2:
acceptance.type = PEEPHOLE2;
match_pattern (&peephole2_root, desc, XSTR (desc, 1), acceptance);
pattern = get_peephole2_pattern (XVEC (desc, 0));
validate_pattern (pattern, desc, NULL_RTX, 0);
match_pattern (&peephole2_root, pattern, XSTR (desc, 1), acceptance);
/* Declare the gen_peephole2 routine that we'll call if the
pattern matches. The definition comes from insn-emit.c. */