[LLVMdev] Registers and isel type inference

Jakob Stoklund Olesen stoklund at 2pi.dk
Fri Sep 23 16:22:49 PDT 2011


On Sep 23, 2011, at 1:38 PM, David A. Greene wrote:

> Jakob Stoklund Olesen <stoklund at 2pi.dk> writes:
> 
>> It appears that tablegen is inferring the 'type' of an individual
>> register by enumerating all the register classes it appears in.  Some
>> things, like using implicit defs in SDNodes, only works for registers
>> with a unique type.  My WIDE32 class caused GR32 registers to no
>> longer have a unique type, breaking the world.
> 
> I can't remeber the specific situation, but I remember running into
> this kind of problem before.
> 
>> This seems too fragile to me. 
> 
> Yes, it is.  :(
> 
>> - Disable type inference for individual registers entirely, or
>> 
>> - Add a ValueType field to the Register tablegen class, so types are
>>  not inferred by enumerating register classes.
> 
> I tend to think the second would be preferable, but how would we handle
> registers than can hold different types of values?

AFAIK, the type inference is only a convenience, you can always use explicit casts to get at the other types.

It's the use of HasOneImplicitDefWithKnownVT() that scares me, I don't think there is any workaround for that.

/jakob


/// HasOneImplicitDefWithKnownVT - If the instruction has at least one
/// implicit def and it has a known VT, return the VT, otherwise return
/// MVT::Other.
MVT::SimpleValueType CodeGenInstruction::
HasOneImplicitDefWithKnownVT(const CodeGenTarget &TargetInfo) const {
  if (ImplicitDefs.empty()) return MVT::Other;

  // Check to see if the first implicit def has a resolvable type.
  Record *FirstImplicitDef = ImplicitDefs[0];
  assert(FirstImplicitDef->isSubClassOf("Register"));
  const std::vector<MVT::SimpleValueType> &RegVTs =
    TargetInfo.getRegisterVTs(FirstImplicitDef);
  if (RegVTs.size() == 1)
    return RegVTs[0];
  return MVT::Other;
}





More information about the llvm-dev mailing list