[llvm-dev] Canonical way to handle zero registers?
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Fri Dec 29 08:34:25 PST 2017
On 12/28/2017 8:02 PM, Sean Silva via llvm-dev wrote:
> One thing I've been curious about is how immediates interact with
> register classes. Could we use ordinary immediate MachineOperand's (of
> the appropriate bit width) and just print the immediate MO's of this
> register class as the corresponding hardwired register? Does MIR have
> any constraints on using an immediate MO instead of a register?
You can construct an instruction that has an immediate operand in place
of a register, but that won't work well. For one, the MachineVerifier
will complain about having an invalid operand, plus any code that tries
to use operand information for that instruction may end up "surprised"
to see an immediate where a register was expected.
There is an assumption in MIR that physical registers should not be used
as explicit operands before RA, except in COPY instructions, so the most
"canonical" way of having it in MIR is something like
%vreg2 = COPY %PHYSICAL_ZERO
... = %vreg2
If using these special registers is the only way to put an immediate in
a register of that class, then that suggests that immediates are
generally not "legal" for that register class (except for the special
cases). It means that after legalization, the selection DAG should not
contain immediates of the type associated with that register class
except for the values that are explicitly allowed. You could then
simply write a custom selection code for ISD::Constant, and turn it into
"CopyFromReg".
-Krzysztof
More information about the llvm-dev
mailing list