I've tried all the types (both for result and Intrinsic ID), can't seem to find what cast is causing the issue here. On Fri, Jun 24, 2016 at 11:47 AM, Ryan Taylor <ryta1203 at gmail.com> wrote:> That's what I thought but I got the same error with: > > DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, > DAG.getTargetConstant(Intrinsic::my_intrinsic, DL, MVT::i16), LHS); > > Thanks. > > What should this call look like? > > > On Fri, Jun 24, 2016 at 10:53 AM, <escha at apple.com> wrote: > >> The intrinsic ID is an int, not a float. >> >> —escha >> >> On Jun 24, 2016, at 7:49 AM, Ryan Taylor via llvm-dev < >> llvm-dev at lists.llvm.org> wrote: >> >> given the following C code: >> >> float b=16, a=0; >> int main() { >> float a = sqrt(b); >> return0; >> } >> >> I'm trying to lower FSQRT down, but getting a casting issue, my code is: >> >> SDValue XXXLowering::LowerFSQRT(SDValue Op, SelectionDAG &DAG) const { >> SDLoc DL(Op); >> EVT VT = Op.getValueType(); >> SDValue LHS = Op.getOperand(0); >> >> SDValue newNode = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, >> DAG.getTargetConstantFP(Intrinsic::my_intrinsic, DL, VT), LHS); >> return newNode; >> } >> >> The error I'm getting is: Assertion 'isa<X>(Val) && "cast<Ty>() argument >> of incompatible type!" >> >> Is this the correct way to add intrinsic dag node? >> >> Thanks. >> >> >> On Tue, Feb 2, 2016 at 5:10 PM, Ryan Taylor <ryta1203 at gmail.com> wrote: >> >>> Matt, >>> >>> The added intrinsic in DAG looks like: >>> >>> 0xbedb698: i32 = llvm.MyIntrinsic 0xbedb200, 0xbedac18 [ORD=4] >>> >>> The builtin in DAG looks like: >>> >>> 0xbedb2a8: i32,ch = llvm 0xbedb158:1, 0xbedb200, 0xbedb158 [ORD=7] >>> [ID=16] >>> >>> The only difference I'm seeing is the extra operand, which is a 'ch' >>> from a load. >>> >>> On Tue, Feb 2, 2016 at 3:55 PM, Matt Arsenault <arsenm2 at gmail.com> >>> wrote: >>> >>>> >>>> > On Feb 2, 2016, at 12:43, Ryan Taylor <ryta1203 at gmail.com> wrote: >>>> > >>>> > Matt, >>>> > >>>> > This seems to generate llvm.my_intrinsic just fine in the DAG, so >>>> no DAG errors; however, it won't match. For example, if I call the >>>> intrinsic from C, the DAG node looks to be named the same in dotty file but >>>> it won't match... am I missing something? >>>> > >>>> > I've done it exactly the way it was done above. The DAG looks great >>>> but it won't match. Did I miss something? >>>> > >>>> > Thanks. >>>> > >>>> >>>> Are you using the right intrinsic type? Does it have a chain or result? >>>> >>>> How are you calling it from C? Are you declaring the intrinsic? This >>>> can fail if you mismatched the readnone or readonly to the actual intrinsic >>>> definition >>>> >>>> >>> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160624/f770d927/attachment.html>
Krzysztof Parzyszek via llvm-dev
2016-Jun-24 20:56 UTC
[llvm-dev] creating Intrinsic DAG Node
By looking at the SelectionDAGBuilder code, it seems that the type of the intrinsic code is the same as the pointer type. In your code it's MVT::i16, maybe you can try MVT::i32 or i64? I'm looking at this, around line 4057: DAG.getTargetConstant(Intrinsic, getCurSDLoc(), TLI.getPointerTy(DAG.getDataLayout())) This may not even be the place where the problem happens though. Do you have a full call trace from the crash? -Krzysztof On 6/24/2016 3:50 PM, Ryan Taylor via llvm-dev wrote:> I've tried all the types (both for result and Intrinsic ID), can't seem > to find what cast is causing the issue here. > > On Fri, Jun 24, 2016 at 11:47 AM, Ryan Taylor <ryta1203 at gmail.com > <mailto:ryta1203 at gmail.com>> wrote: > > That's what I thought but I got the same error with: > > DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, > DAG.getTargetConstant(Intrinsic::my_intrinsic, DL, MVT::i16), LHS); > > Thanks. > > What should this call look like? > > > On Fri, Jun 24, 2016 at 10:53 AM, <escha at apple.com > <mailto:escha at apple.com>> wrote: > > The intrinsic ID is an int, not a float. > > —escha > >> On Jun 24, 2016, at 7:49 AM, Ryan Taylor via llvm-dev >> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote: >> >> given the following C code: >> >> float b=16, a=0; >> int main() { >> float a = sqrt(b); >> return0; >> } >> >> I'm trying to lower FSQRT down, but getting a casting issue, >> my code is: >> >> SDValue XXXLowering::LowerFSQRT(SDValue Op, SelectionDAG &DAG) >> const { >> SDLoc DL(Op); >> EVT VT = Op.getValueType(); >> SDValue LHS = Op.getOperand(0); >> >> SDValue newNode = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, >> VT, DAG.getTargetConstantFP(Intrinsic::my_intrinsic, DL, VT), >> LHS); >> return newNode; >> } >> >> The error I'm getting is: Assertion 'isa<X>(Val) && >> "cast<Ty>() argument of incompatible type!" >> >> Is this the correct way to add intrinsic dag node? >> >> Thanks. >> >> >> On Tue, Feb 2, 2016 at 5:10 PM, Ryan Taylor >> <ryta1203 at gmail.com <mailto:ryta1203 at gmail.com>> wrote: >> >> Matt, >> >> The added intrinsic in DAG looks like: >> >> 0xbedb698: i32 = llvm.MyIntrinsic 0xbedb200, 0xbedac18 [ORD=4] >> >> The builtin in DAG looks like: >> >> 0xbedb2a8: i32,ch = llvm 0xbedb158:1, 0xbedb200, 0xbedb158 >> [ORD=7] [ID=16] >> >> The only difference I'm seeing is the extra operand, >> which is a 'ch' from a load. >> >> On Tue, Feb 2, 2016 at 3:55 PM, Matt Arsenault >> <arsenm2 at gmail.com <mailto:arsenm2 at gmail.com>> wrote: >> >> >> > On Feb 2, 2016, at 12:43, Ryan Taylor <ryta1203 at gmail.com <mailto:ryta1203 at gmail.com>> wrote: >> > >> > Matt, >> > >> > This seems to generate llvm.my_intrinsic just fine in the DAG, so no DAG errors; however, it won't match. For example, if I call the intrinsic from C, the DAG node looks to be named the same in dotty file but it won't match... am I missing something? >> > >> > I've done it exactly the way it was done above. The DAG looks great but it won't match. Did I miss something? >> > >> > Thanks. >> > >> >> Are you using the right intrinsic type? Does it have a >> chain or result? >> >> How are you calling it from C? Are you declaring the >> intrinsic? This can fail if you mismatched the >> readnone or readonly to the actual intrinsic definition >> >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > > > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
When using DAG.getNode with INTRINSIC_WO_CHAIN, what should the first SDValue be? How do I get the chain here? Thanks. On Fri, Jun 24, 2016 at 4:50 PM, Ryan Taylor <ryta1203 at gmail.com> wrote:> I've tried all the types (both for result and Intrinsic ID), can't seem to > find what cast is causing the issue here. > > On Fri, Jun 24, 2016 at 11:47 AM, Ryan Taylor <ryta1203 at gmail.com> wrote: > >> That's what I thought but I got the same error with: >> >> DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, >> DAG.getTargetConstant(Intrinsic::my_intrinsic, DL, MVT::i16), LHS); >> >> Thanks. >> >> What should this call look like? >> >> >> On Fri, Jun 24, 2016 at 10:53 AM, <escha at apple.com> wrote: >> >>> The intrinsic ID is an int, not a float. >>> >>> —escha >>> >>> On Jun 24, 2016, at 7:49 AM, Ryan Taylor via llvm-dev < >>> llvm-dev at lists.llvm.org> wrote: >>> >>> given the following C code: >>> >>> float b=16, a=0; >>> int main() { >>> float a = sqrt(b); >>> return0; >>> } >>> >>> I'm trying to lower FSQRT down, but getting a casting issue, my code is: >>> >>> SDValue XXXLowering::LowerFSQRT(SDValue Op, SelectionDAG &DAG) const { >>> SDLoc DL(Op); >>> EVT VT = Op.getValueType(); >>> SDValue LHS = Op.getOperand(0); >>> >>> SDValue newNode = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, >>> DAG.getTargetConstantFP(Intrinsic::my_intrinsic, DL, VT), LHS); >>> return newNode; >>> } >>> >>> The error I'm getting is: Assertion 'isa<X>(Val) && "cast<Ty>() argument >>> of incompatible type!" >>> >>> Is this the correct way to add intrinsic dag node? >>> >>> Thanks. >>> >>> >>> On Tue, Feb 2, 2016 at 5:10 PM, Ryan Taylor <ryta1203 at gmail.com> wrote: >>> >>>> Matt, >>>> >>>> The added intrinsic in DAG looks like: >>>> >>>> 0xbedb698: i32 = llvm.MyIntrinsic 0xbedb200, 0xbedac18 [ORD=4] >>>> >>>> The builtin in DAG looks like: >>>> >>>> 0xbedb2a8: i32,ch = llvm 0xbedb158:1, 0xbedb200, 0xbedb158 [ORD=7] >>>> [ID=16] >>>> >>>> The only difference I'm seeing is the extra operand, which is a 'ch' >>>> from a load. >>>> >>>> On Tue, Feb 2, 2016 at 3:55 PM, Matt Arsenault <arsenm2 at gmail.com> >>>> wrote: >>>> >>>>> >>>>> > On Feb 2, 2016, at 12:43, Ryan Taylor <ryta1203 at gmail.com> wrote: >>>>> > >>>>> > Matt, >>>>> > >>>>> > This seems to generate llvm.my_intrinsic just fine in the DAG, so >>>>> no DAG errors; however, it won't match. For example, if I call the >>>>> intrinsic from C, the DAG node looks to be named the same in dotty file but >>>>> it won't match... am I missing something? >>>>> > >>>>> > I've done it exactly the way it was done above. The DAG looks >>>>> great but it won't match. Did I miss something? >>>>> > >>>>> > Thanks. >>>>> > >>>>> >>>>> Are you using the right intrinsic type? Does it have a chain or result? >>>>> >>>>> How are you calling it from C? Are you declaring the intrinsic? This >>>>> can fail if you mismatched the readnone or readonly to the actual intrinsic >>>>> definition >>>>> >>>>> >>>> >>> _______________________________________________ >>> LLVM Developers mailing list >>> llvm-dev at lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>> >>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160706/4aaca017/attachment.html>
So I'm trying to lower ISD::FSQRT and in that lowering I'm trying to call an intrinsic (as the first node), the intrinsic has chain but the ISD::FSQRT does not. If I lower WO_CHAIN the intrinsic doesn't match in table gen, when I try to lower W_CHAIN I can't seem to get the Chain to put in the DAG.getNode call. When I call this intrinsic outright in C code using "__builtin_XXX" the DAG shows a chain and it matches in table gen just fine. (I've included the intrinsic in all the appropriate .td and clang files, etc...). Any suggestions? Thank you. On Wed, Jul 6, 2016 at 10:46 AM, Ryan Taylor <ryta1203 at gmail.com> wrote:> When using DAG.getNode with INTRINSIC_WO_CHAIN, what should the first > SDValue be? How do I get the chain here? > > Thanks. > > On Fri, Jun 24, 2016 at 4:50 PM, Ryan Taylor <ryta1203 at gmail.com> wrote: > >> I've tried all the types (both for result and Intrinsic ID), can't seem >> to find what cast is causing the issue here. >> >> On Fri, Jun 24, 2016 at 11:47 AM, Ryan Taylor <ryta1203 at gmail.com> wrote: >> >>> That's what I thought but I got the same error with: >>> >>> DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, >>> DAG.getTargetConstant(Intrinsic::my_intrinsic, DL, MVT::i16), LHS); >>> >>> Thanks. >>> >>> What should this call look like? >>> >>> >>> On Fri, Jun 24, 2016 at 10:53 AM, <escha at apple.com> wrote: >>> >>>> The intrinsic ID is an int, not a float. >>>> >>>> —escha >>>> >>>> On Jun 24, 2016, at 7:49 AM, Ryan Taylor via llvm-dev < >>>> llvm-dev at lists.llvm.org> wrote: >>>> >>>> given the following C code: >>>> >>>> float b=16, a=0; >>>> int main() { >>>> float a = sqrt(b); >>>> return0; >>>> } >>>> >>>> I'm trying to lower FSQRT down, but getting a casting issue, my code is: >>>> >>>> SDValue XXXLowering::LowerFSQRT(SDValue Op, SelectionDAG &DAG) const { >>>> SDLoc DL(Op); >>>> EVT VT = Op.getValueType(); >>>> SDValue LHS = Op.getOperand(0); >>>> >>>> SDValue newNode = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, VT, >>>> DAG.getTargetConstantFP(Intrinsic::my_intrinsic, DL, VT), LHS); >>>> return newNode; >>>> } >>>> >>>> The error I'm getting is: Assertion 'isa<X>(Val) && "cast<Ty>() >>>> argument of incompatible type!" >>>> >>>> Is this the correct way to add intrinsic dag node? >>>> >>>> Thanks. >>>> >>>> >>>> On Tue, Feb 2, 2016 at 5:10 PM, Ryan Taylor <ryta1203 at gmail.com> wrote: >>>> >>>>> Matt, >>>>> >>>>> The added intrinsic in DAG looks like: >>>>> >>>>> 0xbedb698: i32 = llvm.MyIntrinsic 0xbedb200, 0xbedac18 [ORD=4] >>>>> >>>>> The builtin in DAG looks like: >>>>> >>>>> 0xbedb2a8: i32,ch = llvm 0xbedb158:1, 0xbedb200, 0xbedb158 [ORD=7] >>>>> [ID=16] >>>>> >>>>> The only difference I'm seeing is the extra operand, which is a >>>>> 'ch' from a load. >>>>> >>>>> On Tue, Feb 2, 2016 at 3:55 PM, Matt Arsenault <arsenm2 at gmail.com> >>>>> wrote: >>>>> >>>>>> >>>>>> > On Feb 2, 2016, at 12:43, Ryan Taylor <ryta1203 at gmail.com> wrote: >>>>>> > >>>>>> > Matt, >>>>>> > >>>>>> > This seems to generate llvm.my_intrinsic just fine in the DAG, so >>>>>> no DAG errors; however, it won't match. For example, if I call the >>>>>> intrinsic from C, the DAG node looks to be named the same in dotty file but >>>>>> it won't match... am I missing something? >>>>>> > >>>>>> > I've done it exactly the way it was done above. The DAG looks >>>>>> great but it won't match. Did I miss something? >>>>>> > >>>>>> > Thanks. >>>>>> > >>>>>> >>>>>> Are you using the right intrinsic type? Does it have a chain or >>>>>> result? >>>>>> >>>>>> How are you calling it from C? Are you declaring the intrinsic? This >>>>>> can fail if you mismatched the readnone or readonly to the actual intrinsic >>>>>> definition >>>>>> >>>>>> >>>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>> >>>> >>>> >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160711/a584a666/attachment.html>