How to calculate the address in TableGen?

Hello everyone,

I would like to ask a question about the address calculation in TableGen.
I replace a definition in
def : Pat<(i32 (extloadi16_a addr:$src)), (LHu addr:$src)>;
def : Pat<(i32 (extloadi16_a addr:$src)), (OR (LBu addr:$src), (SLL (LBu addr:($src+1)), 8))>;

However, it failed to compiled. It seems that ($src+1) is a wrong representation in TableGen.
I find the definition of adds:
def addr : ComplexPattern<iPTR, 2, "SelectAddr", [frameindex], [SDNPWantParent]>;

How to calculate a new address in TableGen?


Hi Yang,


def : Pat<(i32 (extloadi16_a addr:$src)), (OR (LBu addr:$src), (SLL (LBu addr:($src+1)), 8))>;

How to calculate a new address in TableGen?

Unfortunately you can't do arithmetic like that directly in TableGen.

You might be able to apply an SDNodeXForm to the right-hand side to
calculate the "addr+1", giving something like "(OR (LBu addr:$src),
(SLL (LBU (AddOne addr:$src)), 8))". But I seem to remember trying the
same thing for a very similar issue I was having and running into
problems; I can't remember the details but I think either TableGen
ignored the XForm or didn't like the double-use of the addr on the
right-hand side.

You've also got the complication that an instruction sequence which
calculates $src may not be trivially adaptable to one that calculates
$src+1, which means even more problems for this approach since the
selection of the instruction sequence will only ever happen once, on
the left-hand side of the pattern. This could complicate the required
XForm significantly, even if the approach works.

What I ended up doing for my situation was creating a special Wrapper
during ISelLowering that, instead of having just one address operand,
had two: one evaluating to just $src, and the other to $src+1, so you
might select it with something like:

def : Pat<(i32 (extload16_a_bytewrapper addr:$src, addr:$srcplus1)),
(OR (LBu addr:$src), (SLL (LBu addr:$srcplus1), 8))>;

Hope this helps.