Previous: Define Subst Pattern Matching, Up: Define Subst


16.21.3 Generation of output template in define_subst

If all necessary checks for define_subst application pass, a new RTL-pattern, based on the output-template, is created to replace the old template. Like in input-patterns, meanings of some RTL expressions are changed when they are used in output-patterns of a define_subst. Thus, match_dup is used for copying the whole expression from the original pattern, which matched corresponding match_operand from the input pattern.

match_dup N is used in the output template to be replaced with the expression from the original pattern, which matched match_operand N from the input pattern. As a consequence, match_dup cannot be used to point to match_operands from the output pattern, it should always refer to a match_operand from the input pattern.

In the output template one can refer to the expressions from the original pattern and create new ones. For instance, some operands could be added by means of standard match_operand.

After replacing match_dup with some RTL-subtree from the original pattern, it could happen that several match_operands in the output pattern have the same indexes. It is unknown, how many and what indexes would be used in the expression which would replace match_dup, so such conflicts in indexes are inevitable. To overcome this issue, match_operands and match_operators, which were introduced into the output pattern, are renumerated when all match_dups are replaced.

Number of alternatives in match_operands introduced into the output template M could differ from the number of alternatives in the original pattern N, so in the resultant pattern there would be N*M alternatives. Thus, constraints from the original pattern would be duplicated N times, constraints from the output pattern would be duplicated M times, producing all possible combinations.