Pat operands matching example in ppc

Hi,

How do “Pat” operands get matched? I am trying to follow the example given in http://llvm.org/docs/CodeGenerator.html#selectiondag-process

In the latest trunk of ppcintrinfo.td following pattern is defined:

def : Pat<(pre_store i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
(STWU $rS, iaddroff:$ptroff, $ptrreg)>;

I understand that input operand list i.e. ins of stwu should get matched with the given pre_store. But I am confused as to how “ptroff” and “ptrreg” get matched with “memri” used in STWU?

For reference[1] memri is defined as:

def memri :Operand {
let PrintMethod = “printMemRegImm”;

let MIOperandInfo = (ops dispRI:$imm, ptr_rc_nor0:$reg);

let EncoderMethod = “getMemRIEncoding”;
}

[1] https://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td?view=markup

Hi Anitha,

memri is just describing that the address contains two components, an immediate and a register, and how to handle them in the instruction printer. The STWU expects a memri operand, and that is what is passed from the Pat.

Hope that helps,
Sam

Hi Anitha,

memri is just describing that the address contains two components, an
immediate and a register, and how to handle them in the instruction printer.
The STWU expects a memri operand, and that is what is passed from the Pat.

My confusion is how operands of STWU from "Pat pre_store" get matched
with those of memri. It is defined with operand types as:

let MIOperandInfo = (ops dispRI:$imm, ptr_rc_nor0:$reg);

while Pat is defined as:

def : Pat<(pre_store i32:$rS, iPTR:$ptrreg, iaddroff:$ptroff),
              (STWU $rS, iaddroff:$ptroff, $ptrreg)>;

So now how iPTR:$ptrreg and iaddroff:$ptroff get matched with
ptr_rc_nor0:$reg and dispRI:$imm respectively? I mean the types are
not exactly matching. Probably something is amiss in my understanding.

-Anitha

Hi Anitha,

def dispRI : Operand;
def iaddroff : ComplexPattern<iPTR, 1, “SelectAddrImmOffs”, [], []>;
def ptr_rc_nor0 : PointerLikeRegClass<1>;

iaddroff is defined as a ComplexPattern that results in an iPTR, and dispRI is also an operand of type iPTR, so $ptroff and $imm are of the the same type. The function “SelectAddrImmOffs” will show how the pattern matching is actually performed.

I’m not familiar with the ppc backend, but I’m assuming that PointerLikeRegClass also holds an iPTR value, and that is why ptrreg can be passed as well.

Regards,
Sam