[PATCH] gcc/genrecog.c: Check matching constraint in MATCH_OPERAND.
Chen Gang S
gang.chen@sunrus.com.cn
Thu Feb 26 12:26:00 GMT 2015
On 02/26/2015 04:04 PM, Chen Gang S wrote:
> If check fails, genrecog needs to stop and report error, so can let the
> issue be found in time. The implementation is referenced from "gcc/doc/
> md.log":
>
> [...]
>
> whitespace
> Whitespace characters are ignored and can be inserted at any
> position except the first. This enables each alternative for
> different operands to be visually aligned in the machine
> description even if they have different number of constraints and
> modifiers.
>
> [...]
>
> '0', '1', '2', ... '9'
> [...]
> If a digit is used together with letters within the same
> alternative, the digit should come last.
>
Oh, I guess, I misunderstood the contents above. e.g. "Up3" which
defined in aarch64 is not "matching constraint", I should skip it.
> This number is allowed to be more than a single digit. If multiple
> digits are encountered consecutively, they are interpreted as a
> single decimal integer. [...]
>
> [...]
>
> [...] Moreover, the digit must be a
> smaller number than the number of the operand that uses it in the
> constraint.
>
> [...]
>
> The overall constraint for an operand is made from the letters for this
> operand from the first alternative, a comma, the letters for this
> operand from the second alternative, a comma, and so on until the last
> alternative.
>
> [...]
>
> The patch passes test:
>
> - genrecog can report the related issue when cross compiling xtensa.
> And after the related xtensa issue is fixed, genrecog will not report
> error, either.
>
> - For x86_64-unknown-linux-gnu building all-gcc, it is OK, too.
>
>
> 2015-02-26 Chen Gang <gang.chen.5i5j@gmail.com>
>
> * genrecog.c (validate_pattern): Check matching constraint in
> MATCH_OPERAND and use 'opnu' for all 'XINT (pattern, 0)'.
> ---
> gcc/genrecog.c | 39 +++++++++++++++++++++++++++++++++++----
> 1 file changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/genrecog.c b/gcc/genrecog.c
> index 81a0e79..4b508e8 100644
> --- a/gcc/genrecog.c
> +++ b/gcc/genrecog.c
> @@ -503,7 +503,9 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int set_code)
>
> if (code == MATCH_OPERAND)
> {
> - const char constraints0 = XSTR (pattern, 2)[0];
> + int opnu = XINT (pattern, 0);
> + const char *constraints = XSTR (pattern, 2);
> + const char constraints0 = constraints[0];
>
> if (!constraints_supported_in_insn_p (insn))
> {
> @@ -525,17 +527,46 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int set_code)
> /* If we've only got an output reload for this operand,
> we'd better have a matching input operand. */
> else if (constraints0 == '='
> - && find_matching_operand (insn, XINT (pattern, 0)))
> + && find_matching_operand (insn, opnu))
> ;
> else
> error_with_line (pattern_lineno,
> "operand %d missing in-out reload",
> - XINT (pattern, 0));
> + opnu);
> }
> else if (constraints0 != '=' && constraints0 != '+')
> error_with_line (pattern_lineno,
> "operand %d missing output reload",
> - XINT (pattern, 0));
> + opnu);
> + }
> +
> + /* For matching constraint in MATCH_OPERAND, the digit must be a
> + smaller number than the number of the operand that uses it in the
> + constraint. */
> + while (1)
> + {
> + int val;
> +
> + while (constraints[0]
> + && (constraints[0] < '0' || constraints[0] > '9'))
> + constraints++;
> + if (!constraints[0])
> + break;
> +
> + sscanf (constraints, "%d", &val);
> + while ((constraints[0] >= '0' && constraints[0] <= '9'))
> + constraints++;
> +
> + while (constraints[0] == ' ')
> + constraints++;
> + if (constraints[0] && constraints[0] != ',')
> + continue;
> +
> + if (val >= opnu)
> + error_with_line (pattern_lineno,
> + "constraint digit %d is not smaller than"
> + " operand %d",
> + val, opnu);
> }
> }
>
>
--
Open, share, and attitude like air, water, and life which God blessed.
More information about the Gcc-patches
mailing list