[LLVMdev] LLVM Backend DAGToDAGISel INTRINSIC
Ambuj Agrawal
ambujbwt at gmail.com
Mon Mar 9 10:37:04 PDT 2015
Thanks for your reply.
I was able to fix the problem by having a return type for result.
Something like:
SDNode *Result = CurDAG->getMachineNode(Mips::INSTR, SDLoc(Node),
ReturnValueVT, MVT::Other, Ops);
On Mon, Mar 9, 2015 at 5:05 PM, Daniel Sanders <Daniel.Sanders at imgtec.com>
wrote:
> Hi,
>
>
>
> Have you found the mips_cfcmsa intrinsic? It's the only example of a
> INTRINSIC_W_CHAIN with a result and an argument that I can think of.
>
>
>
> This is just a guess but does the BWT_DROP_RESULT instruction have an
> output? If not, I'd guess that the problem is that ReplaceUses() is trying
> to use the first output of Result (which has no outputs and therefore
> asserts when it this is attempted) as a replacement for the first output of
> Node.
>
>
>
> *From:* llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] *On
> Behalf Of *Ambuj Agrawal
> *Sent:* 09 March 2015 11:07
> *To:* llvmdev at cs.uiuc.edu
> *Subject:* [LLVMdev] LLVM Backend DAGToDAGISel INTRINSIC
>
>
>
> I am currently working on DAGToDAGISel class for MIPS and am trying to
> figure out a way to use INTRINSIC_W_CHAIN for an intrinsic which can return
> a value.
>
> My intrinsic is defined as:
>
> Intrinsic<[llvm_i32_ty],[llvm_i32_ty,llvm_i32_ty,llvm_i32_ty,llvm_i32_ty],[IntrReadWriteArgMem]>;
>
> i.e. it has four arguments and one return value
>
>
>
> In DAGToDAGISel when I try to pass it with four arguments and a return
> register it fails the assertion `ResNo < NumValues && "Illegal result
> number!"'.
>
> More specifically I am doing something like:
> EVT ReturnValueVT = Node->getValueType(0) ;
> SDValue ChainIn = Node->getOperand(0);
> SDValue Zero = CurDAG->getCopyFromReg(ChainIn, DL,
>
> Mips::ZERO, MVT::i32);
> SDValue op0 = Node->getOperand(2);
> SDValue op1 = Node->getOperand(3);
> SDValue op2= Node->getOperand(4);
> SDValue op3 = Node->getOperand(5);
> SDValue Ops[]= { op0, op1, op2, op3, Zero, ChainIn };
> SDNode *Result =
> CurDAG->getMachineNode(Mips::BWT_DROP_RESULT, SDLoc(Node),
> ReturnValueVT, Ops);
> ReplaceUses(Node, Result);
> return std::make_pair(true, Result);
>
> Any clues on how INTRINSIC_W_CHAIN differs from INTRINSIC_VOID?
>
> Thanks,
>
> Ambuj Agrawal
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150309/b15a07b2/attachment.html>
More information about the llvm-dev
mailing list