[llvm] Query the target from an opt pass?

I’m working on the #pragma STDC FENV_ACCESS ON support, specifically
the support for a strict version of the FP to unsigned int conversion.

I’ve got a pass that runs and converts a new intrinsic into code that
uses the FP to signed int conversion code similar to how SelectionDAG
handles this now. Except that SelectionDAG will let the target handle
it if the target says it will.

How do I, from an “optimization” pass, query the target to see if it
already has a better way of handling exactly this case? I grepped around
and I didn’t see anything in a pass that looked like what I need.

Oh, and the reason I did this as a pass is because I need to add branches,
which means splitting basic blocks. I don’t think I can do this in

TargetTransformInfo is probably what you’re looking for. -Eli

Hmmm, a quick look at the documentation for TargetTransformInfo doesn’t look

like it.

In LegalizeDAG.cpp it uses TLI.getOperationAction() to find out if an SDNode

should be expanded by the legalizer or passed down to the target. That’s what

I need to know, but I need it in a pass pre-legalization.

This seems like weird layering, though. Having an “optimization” pass be

looking into specific types of SDNode doesn’t seem ideal. But I need to

introduce branches, and I don’t think I can do that in the SelectionDAG.

Branches in the middle of a basic block seems … incorrect. Is there a

good way to get ahold of the correct TargetLoweringBase from a pass? But

there’s still the layering issue, no?

Oh, and sorry for the top posting. This is the email client I’m stuck with.

From a pass running on LLVM IR (as opposed to CodeGen)? There isn't.

What you could do is that you could generate a pseudo-instruction and expand it later in a CodeGen pass.


I think you want to start from TargetMachine and then find an appropriate place to add a new interface function from there. You’ll want to pass a pointer to the target machine to your pass’ constructor via the create function. You probably want to create your pass from TargetPassConfig::addISelPrepare(). If you look at that function you’ll find some other passes that use a TargetMachine argument.


Right; you probably need to add a TTI hook (which can call into TLI). The ScalarizeMaskedMemIntrin pass is a good example to follow. -Eli