Can I differentiate an imm with an imm used in memory offset in MI pass?

So I’d like to be able to tell the difference between an imm and an imm used in mem offset in MachineInstr.

Or, it would be nice to tell the difference between src and dst operands.

I must be missing something trivial?

For example,

int *b, a;

b[10] = a + 2; // is there any marker/flag between 2 and 10 to tell the difference?

Thanks.

The generic code in lib/CodeGen has no knowledge of these semantic differences. This knowledge is only available on a per-target basis.
Typical query functions would be X86InstrInfo::getMemOpBaseRegImmOfs(...) or AArch64::getMemOpInfo(...).

Doing this in a common way accross targets requires callbacks in TargetInstrInfo, there seem to be some in that direction but they appear to be rarely used so depending on what you want to do you may need to implement more of them.

- Matthias

Seems like this information would be readily available in the DAG, at least in as far as outs and ins?

I just need to check if the inputs are all registers or not. I was looking at many different ways to do this but basically that’s all I need.