[llvm-dev] creating Intrinsic DAG Node

Ryan Taylor via llvm-dev llvm-dev at lists.llvm.org
Mon Jul 11 11:03:33 PDT 2016


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>


More information about the llvm-dev mailing list