[llvm-dev] creating Intrinsic DAG Node
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Fri Jun 24 13:56:15 PDT 2016
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
More information about the llvm-dev
mailing list