Is there a way to determine what CPU resource is used by which instruction?

I’m trying to figure out if there is a way to figure out what processor resource is used by which instruction during scheduling. This is purely for debugging purposes. Since I’m somewhat new to LLVM it is a bit difficult for me to figure this out.

Initial idea was to insert comments in the generated assembly which would tell me what what resource is used. MachineInstr has a uint8_t AsmPrinterFlags, which I want to use to pass information from the scheduler to AsmPrinter about which resource is used. I’ve asked on the IRC channel how to do it but nobody seems to know. A scheduling debug log was also mentioned (supposedly it should provide me with the same information) but I don’t know how to generate one.

I’d appreciate any help on the issue.

Dear Rail,

Can you clarify what you mean by "processor resource?" Are you talking about architecture-visible state (like registers) or micro-architecture state (like ALUs) that are typically not visible at the ISA-level?

Regards,

John Criswell

John,

Thanks for the reply. I'm talking about micro-architecture state, i.e.
number of ALUs currently available (i.e. that are not preforming any
computation at the moment), number of Load and Store units, number of
floating point multiply and divide units etc.

I would greatly appreciate any help on this.

Thanks

Okay. To further clarify, are you asking whether the code generator has information on micro-architecture and how to query that information, or are you asking how to output that information in the AsmPrinter? I don’t spend a lot of time in the LLVM code generator, so I don’t know the answer to either question (I just wanted you to clarify your question so that someone more knowledgeable can answer). That said, I’d be surprised if the code generator is aware of the micro-architecture details to the precision that you’re describing. If you can find that information in the TableGen files, then it probably is there, but otherwise, I would expect the code generator to be using some sort of cost approximation to determine instruction order. Anyone more knowledgeable have a more definitive answer? Regards, John Criswell

Look for a #define like this in the llvm CodeGen files:
#define DEBUG_TYPE “misched"

This allows you to use
llc -debug-only=misched
or
clang -mllvm -ldebug-only=misched

to enable the debugging output for that file/topic. You may use the flag multiple times to enable multiple debugging outputs.

- Matthias

Look for a #define like this in the llvm CodeGen files:
#define DEBUG_TYPE “misched"

This allows you to use
llc -debug-only=misched
or
clang -mllvm -ldebug-only=misched

to enable the debugging output for that file/topic. You may use the flag
multiple times to enable multiple debugging outputs.

- Matthias

Mathias,

Thanks. I think this is what I was looking for.