Pattern doesn't match error

I made a small change to my target and them tried to recompile it. The following error showed up:

error: Pattern doesn’t match mayLoad = 0

A little bit of searched revealed that it came from here:

Unfortunately I can’t understand what it means. Can someone help me out?

This happens when the mayLoad field inferred from the instruction pattern is different from the mayLoad field that is explicitly set in the instruction definition.

TableGen will try to infer certain properties from the pattern used to match an instruction. If, at the same time, the property is specified explicitly, it must match what TableGen inferred. If there is a conflict between the two, this kind of an error shows up.

Not sure if this helps.


I'm not sure I understand it. Here is the change that I made for my target

class InstEscala<dag outs, dag ins, string asmstr, list<dag> pattern>
  : Instruction {
  let mayLoad = 0;

All I have done is set mayLoad to 0. Would you mind using your explanation
in the context of my change? I think once there is a specific case it is
easier to understand what is the problem.


If the pattern that you use to define a particular instruction of this class contains an SDNode that has a "may load" property, it will infer that the pattern has a "mayLoad" property. That property must be the same as the "mayLoad" that is explicitly specified in the instruction definition.

Look in utils/TableGen/CodeGenDAGPatterns.cpp:

void AnalyzeNode(const TreePatternNode *N) {
     // Notice properties of the node.
     if (N->NodeHasProperty(SDNPMayStore, CDP)) mayStore = true;
     if (N->NodeHasProperty(SDNPMayLoad, CDP)) mayLoad = true;
     if (N->NodeHasProperty(SDNPSideEffect, CDP)) hasSideEffects = true;
     if (N->NodeHasProperty(SDNPVariadic, CDP)) isVariadic = true;

If your pattern contains a "load", this will directly conflict with the explicit "mayLoad = 0".