Alex Susu via llvm-dev
2021-Feb-27 15:03 UTC
[llvm-dev] Can't call setTypeAction() on ValueTypeActions in a derived class from the TargetLoweringBase class
Hello. I would like to ask about what seems to be an API error in LLVM in the include/llvm/CodeGen/TargetLowering.h source file, in the class TargetLoweringBase. We have the public method getValueTypeActions() that returns a constant of type const ValueTypeActionImpl. But the class ValueTypeActionImpl has the setter method setTypeAction(), which I need to use to make my Instruction Selection pass succeed. More exactly I need to give in my ISelLowering back end pass (otherwise I get error "Do not know how to promote this operator's operand!"): getValueTypeActions().setTypeAction(MVT::f16, TypeLegal)); Note that in the last almost 2 years in include/llvm/CodeGen/TargetLowering.h, in the class TargetLoweringBase the access specifier of the data member: ValueTypeActionImpl ValueTypeActions; was changed from protected to private, and the private specifier disallows me to use the setTypeAction() method in my back end class derived from the class TargetLowering, which is itself derived from class TargetLoweringBase. Therefore, I propose to define method getValueTypeActions() without const specifiers like this: ValueTypeActionImpl &getValueTypeActions() { return ValueTypeActions; } Am I correct to propose this? Or is there another way to use the method setTypeAction()? Thank you very much, Alex
Jessica Clarke via llvm-dev
2021-Feb-28 19:04 UTC
[llvm-dev] Can't call setTypeAction() on ValueTypeActions in a derived class from the TargetLoweringBase class
On 27 Feb 2021, at 15:03, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote:> > Hello. > > I would like to ask about what seems to be an API error in LLVM in the include/llvm/CodeGen/TargetLowering.h source file, in the class TargetLoweringBase. > We have the public method getValueTypeActions() that returns a constant of type const ValueTypeActionImpl. But the class ValueTypeActionImpl has the setter method setTypeAction(), which I need to use to make my Instruction Selection pass succeed. More exactly I need to give in my ISelLowering back end pass (otherwise I get error "Do not know how to promote this operator's operand!"): > getValueTypeActions().setTypeAction(MVT::f16, TypeLegal)); > > Note that in the last almost 2 years in include/llvm/CodeGen/TargetLowering.h, in the class TargetLoweringBase the access specifier of the data member: > ValueTypeActionImpl ValueTypeActions; > was changed from protected to private, and the private specifier disallows me to use the setTypeAction() method in my back end class derived from the class TargetLowering, which is itself derived from class TargetLoweringBase. > > Therefore, I propose to define method getValueTypeActions() without const specifiers like this: > ValueTypeActionImpl &getValueTypeActions() { > return ValueTypeActions; > } > Am I correct to propose this? Or is there another way to use the method setTypeAction()?The definition of whether a type is legal is whether the target has a register class for it; if you want the type to be legal you need to define one, then TargetLoweringBase::computeRegisterProperties won't define the type as illegal. Jess
Alex Susu via llvm-dev
2021-Mar-07 17:21 UTC
[llvm-dev] Can't call setTypeAction() on ValueTypeActions in a derived class from the TargetLoweringBase class
Hello. I don't have a register class for my target for the f16 type (neither for the i32 type). What I do is actually emulate the LLVM IR operations for the f16 type in my back end class that inherits the SelectionDAGISel class. However, for everything to work OK I have to give: getValueTypeActions().setTypeAction(MVT::f16, TypeLegal)); Now maybe I can give a different LegalizeTypeAction like TypePromoteFloat instead of TypeLegal. But then I need to have as I said in the previous email the possibility to call: getValueTypeActions().setTypeAction(MVT::f16, TypeLegal)); But this call is no longer possible in the latest LLVM. And this issue seems wrong to me. Thank you, Alex On 2/28/2021 9:04 PM, Jessica Clarke wrote:> On 27 Feb 2021, at 15:03, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> >> Hello. >> >> I would like to ask about what seems to be an API error in LLVM in the include/llvm/CodeGen/TargetLowering.h source file, in the class TargetLoweringBase. >> We have the public method getValueTypeActions() that returns a constant of type const ValueTypeActionImpl. But the class ValueTypeActionImpl has the setter method setTypeAction(), which I need to use to make my Instruction Selection pass succeed. More exactly I need to give in my ISelLowering back end pass (otherwise I get error "Do not know how to promote this operator's operand!"): >> getValueTypeActions().setTypeAction(MVT::f16, TypeLegal)); >> >> Note that in the last almost 2 years in include/llvm/CodeGen/TargetLowering.h, in the class TargetLoweringBase the access specifier of the data member: >> ValueTypeActionImpl ValueTypeActions; >> was changed from protected to private, and the private specifier disallows me to use the setTypeAction() method in my back end class derived from the class TargetLowering, which is itself derived from class TargetLoweringBase. >> >> Therefore, I propose to define method getValueTypeActions() without const specifiers like this: >> ValueTypeActionImpl &getValueTypeActions() { >> return ValueTypeActions; >> } >> Am I correct to propose this? Or is there another way to use the method setTypeAction()? > > The definition of whether a type is legal is whether the target has a > register class for it; if you want the type to be legal you need to > define one, then TargetLoweringBase::computeRegisterProperties won't > define the type as illegal. > > Jess >