Hello Maintainers: Please help check this patch when you have time.
I have to leave Sunrus, the mail address (gang.c...@sunrus.com.cn) will be closed soon (Sunrus will be closed soon because of money, I guess). I change my new email address (xili_gchen_5...@hotmail.com) to continue communicating. gang.chen.5...@gmail.com is still have effect, but it is not stable (gmail in China is not stable). I apologize for inconvenience. Thanks. On 2/27/15 08:37, Chen Gang S wrote: > On 02/26/2015 08:13 PM, Chen Gang S wrote: >> 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. >> > > If I really misunderstood, for me, the related patch should be: > > diff --git a/gcc/genrecog.c b/gcc/genrecog.c > index 81a0e79..9367d74 100644 > --- a/gcc/genrecog.c > +++ b/gcc/genrecog.c > @@ -503,7 +503,8 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int > set_code) > > if (code == MATCH_OPERAND) > { > - const char constraints0 = XSTR (pattern, 2)[0]; > + const char *constraints = XSTR (pattern, 2); > + const char constraints0 = constraints[0]; > > if (!constraints_supported_in_insn_p (insn)) > { > @@ -537,6 +538,33 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int > set_code) > "operand %d missing output reload", > XINT (pattern, 0)); > } > + > + /* 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) > + { > + while (constraints[0] > + && (constraints[0] == ' ' || constraints[0] == ',')) > + constraints++; > + if (!constraints[0]) > + break; > + > + if (constraints[0] >= '0' && constraints[0] <= '9') > + { > + int val; > + > + sscanf (constraints, "%d", &val); > + if (val >= XINT (pattern, 0)) > + error_with_line (pattern_lineno, > + "constraint digit %d is not smaller than" > + " operand %d", > + val, XINT (pattern, 0)); > + } > + > + while (constraints[0] && constraints[0] != ',') > + constraints++; > + } > } > > /* Allowing non-lvalues in destinations -- particularly CONST_INT -- > > > If necessary (I guess, it is), I shall send patch v2 for it. > > Thanks. > >>> 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.5...@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); >>> } >>> } >>> >>> >> >> > > -- Chen Gang Open, share, and attitude like air, water, and life which God blessed -- Chen Gang Open, share, and attitude like air, water, and life which God blessed