> On 6 Oct 2026, at 13:59, Richard Biener <[email protected]> wrote:
> 
> On Tue, 6 Oct 2026, [email protected] wrote:
> 
>> From: Kyrylo Tkachov <[email protected]>
>> 
>> lower_for replicates each pattern once per operator of each for-level,
>> substituting the operator into the match and result.  When a pattern
>> does not reference any of the for-level iterators in either its match
>> or result, every substituted copy is structurally identical, producing
>> dead leaves in the decision tree.
>> 
>> Since f6eb8291e1c (PR119196, 2025-07-09), match.pd:6638 has a
>> (for lop ...) pattern nested inside a (for op ...) whose 34-operator
>> list it does not use.  lower_for therefore emits 34 identical copies of
>> each of the three lop alternatives per GIMPLE and GENERIC IL.
>> 
>> Before proceeding through the operator substitution loop, check whether
>> any id in the current for-level appears in the pattern's match or
>> result.  If none do, a single copy with j=0 operator values suffices
>> and the remaining max_n_opers-1 iterations are skipped.
>> 
>> Bootstrapped and tested on aarch64-none-linux-gnu.
>> Ok for trunk?
> 
> Might there be any valid uses of such case?  It looks like the pattern
> in question should be simply moved out of the enclosing (for ...).
> 
> That said, this should emit an unconditional diagnostic from genmatch.
> 
> Can you re-post with such a change (and move the pattern)?
> 

Yeah, that works.
Does this version look ok?
Thanks,
Kyrill


> Thanks,
> Richard.
> 
>> Thanks,
>> Kyrill
>> 
>> gcc/ChangeLog:
>> 
>> * genmatch.cc (lower_for): Skip replicated substitutions when no
>> for-level iterator appears in the pattern.
>> 
>> Signed-off-by: Kyrylo Tkachov <[email protected]>
>> ---
>> gcc/genmatch.cc | 8 +++++++-
>> 1 file changed, 7 insertions(+), 1 deletion(-)
>> 
>> diff --git a/gcc/genmatch.cc b/gcc/genmatch.cc
>> index 9bb7cbbb427..1d53283e094 100644
>> --- a/gcc/genmatch.cc
>> +++ b/gcc/genmatch.cc
>> @@ -2433,7 +2433,13 @@ lower_for (simplify *sin, vec<simplify *>& 
>> simplifiers)
>>       for (unsigned si = worklist_start; si < worklist_end; ++si)
>> {
>>   simplify *s = worklist[si];
>> -   for (unsigned j = 0; j < max_n_opers; ++j)
>> +   /* If none of the for-level ids appear in this pattern's match or
>> +      result, all operator substitutions are no-ops.  Emit one copy.  */
>> +   bool any_id_used = false;
>> +   for (unsigned i = 0; i < n_ids && !any_id_used; ++i)
>> +     any_id_used = (contains_id (s->match, ids[i])
>> +    || (s->result && contains_id (s->result, ids[i])));
>> +   for (unsigned j = 0; j < (any_id_used ? max_n_opers : 1u); ++j)
>>     {
>>       operand *match_op = s->match;
>>       operand *result_op = s->result;
>> 
> 
> -- 
> Richard Biener <[email protected]>
> SUSE Software Solutions Germany GmbH,
> Frankenstrasse 146, 90461 Nuernberg, Germany;
> GF: Stefan Gaiser, Jochen Jaser, Abhinav Puri; (HRB 36809, AG Nuernberg)


Attachment: 0001-genmatch-Avoid-replicating-patterns-over-unused-for-.patch
Description: 0001-genmatch-Avoid-replicating-patterns-over-unused-for-.patch

Reply via email to