[llvm-dev] TwoAddressInstructionPass::isProfitableToConv3Addr()

Jonas Paulsson via llvm-dev llvm-dev at lists.llvm.org
Tue Sep 29 02:00:51 PDT 2015


I have cases of instruction pairs, where one is cheaper 2-address, and 
the other 3-address. I would like to select the 2-addr instruction 
during isel, but use the 3-addr instruction to avoid a copy if possible. 
I find that TwoAddressInstructionPass::isProfitableToConv3Addr() is only 
for the case of a physreg copy, and so leaves the majority of cases as 
they are (2-address).

I would like to say "If 3-addr version would avoid a copy, use it!". 
Does anyone else have a similar situation?

To do this, one would need to check the kill-flag on the tied use 
operand. If it is not killed, one can assume that the use and dst 
registers overlap, and therefore the copy is needed for the two-address 
form. The kill flags would however need to be recomputed by TwoAddr 
pass, since
LiveVariables clear them.

An alternative approach might be to have something like 
TII->handleMachineFunctionPostCoalescer() at the end of 
RegisterCoalescer.cpp::runOnMachineFunction(). There, one could look for 
instructions and query live intervals for overlap. This hook might also 
be useful for other things, since this is the point just before 
mi-sched/regalloc, where one could do things like estimate register 

Any comments on this anyone?

/Jonas Paulsson

More information about the llvm-dev mailing list