[LLVMdev] Creating tablegen patterns for intrinsics with no return value.
Villmow, Micah
Micah.Villmow at amd.com
Mon Nov 8 13:58:26 PST 2010
I think I found the problem. Instead of passing just MVT::i32 as the type, I created a SDVTList of MVT::i32 and MVT::Other and now the i32,ch shows up in the DAG output.
Micah
> -----Original Message-----
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu]
> On Behalf Of Villmow, Micah
> Sent: Monday, November 08, 2010 10:59 AM
> To: LLVM Developers Mailing List
> Subject: Re: [LLVMdev] Creating tablegen patterns for intrinsics with
> no return value.
>
>
>
>
> > -----Original Message-----
> > From: Jim Grosbach [mailto:grosbach at apple.com]
> > Sent: Monday, November 08, 2010 10:41 AM
> > To: Villmow, Micah
> > Cc: LLVM Developers Mailing List
> > Subject: Re: [LLVMdev] Creating tablegen patterns for intrinsics with
> > no return value.
> >
> >
> > On Nov 8, 2010, at 10:32 AM, Villmow, Micah wrote:
> >
> > > I have intrinsic with no return value and I need to match them to
> > machine instructions. If the instruction has a return value I am able
> > to correctly match it, but if I try to create some tablegen code that
> > has no return value, the instruction gets deleted.
> >
> > Hi Micah,
> >
> > From your description it sounds like machine dead code elimination is
> > the most likely what's deleting your instruction. If that's the case,
> > adding "let hasSideEffects = 1" to your instruction pattern should
> > suffice to tell the compiler that there's more going on than it can
> > detect just by looking at the inputs and outputs, and so it won't
> > delete the instruction. Something like the following should do the
> > trick:
> > let hasSideEffects = 1 in
> > def ATOM_G_ADD_NORET : BinAtomNoRet<IL_OP_UAV_ADD,
> > "_id($id)", atom_g_add_noret>;
> >
> > For an existing example, have a look at the memory barrier
> instruction
> > definitions for the ARM target (DMB and DMB_MCR in ARMInstrInfo.td).
> >
> > Regards,
> > Jim
> [Villmow, Micah] Jim, Thanks for the hint, but I tried that and the
> instructions still get deleted. I also set let mayStore = 1 and the
> same issue shows up. I believe the issue is with the ch not being
> propogated correctly.
> I've attached a before and after instruction creation of DAG.dump().
>
> This is the instruction I'm trying to match:
> 0x8502b88: i32,ch = llvm.AMDIL.atomic.add.gi32.noret 0x8502a78,
> 0x8502b00, 0x8502280, 0x8502eb8 [ORD=6] [ID=19]
>
> And I generate this instruction:
> 0x8503160: i32 = AMDILISD::ATOM_G_ADD_NORET 0x8502a78, 0x8502280,
> 0x8502eb8, 0x8502f40
> 0x8502a78: <multiple use>
> 0x8503608: i32,ch = merge_values 0x8503160, 0x8502a78
>
> What I'm trying to figure out is how I can generate this without the
> merge_values:
> 0x8503160: i32,ch = AMDILISD::ATOM_G_ADD_NORET 0x8502a78, 0x8502280,
> 0x8502eb8, 0x8502f40
>
> I probably have other issues, but solving this should help me solve
> other issues.
> Thanks again,
> Micah
>
>
> >
> > >
> > > Here is my profile/node/pattern.
> > > Profile:
> > > def SDTIL_BinAtomNoRet : SDTypeProfile<0, 3, [
> > > SDTCisPtrTy<0>, SDTCisVT<1, i32>, SDTCisVT<2, i32>
> > > ]>;
> > > Node:
> > > def atom_g_add_noret : SDNode<"AMDILISD::ATOM_G_ADD_NORET",
> > SDTIL_BinAtomNoRet, [SDNPHasChain]>;
> > >
> > > Pattern:
> > > def ATOM_G_ADD_NORET : BinAtomNoRet<IL_OP_UAV_ADD,
> > > "_id($id)", atom_g_add_noret>;
> > >
> > >
> > > I am Lowering INTRINSIC_W_CHAIN to lower from
> > @llvm.amdil.atomic.add.gi32.noret to the correct instruction with the
> > following code sequence.
> > >
> > > LowerINTRINSIC_W_CHAIN(...)
> > > {
> > > ...
> > > case AMDILIntrinsic::AMDIL_atomic_add_gu32_noret:
> > > IntNo = AMDILISD::ATOM_G_ADD_NORET; break; ...
> > > SDValue Ops[6];
> > > SDValue chain = Op.getOperand(0);
> > > unsigned numNodes = 0;
> > > if (inChain) {
> > > Ops[numNodes++] = chain;
> > > }
> > > SDValue Chain = Op.getOperand(0);
> > > Ops[numNodes++] = Op.getOperand((inChain) ? 2 : 1);
> > > Ops[numNodes++] = DAG.getConstant(1, MVT::i32);
> > > Ops[numNodes++] = DAG.getTargetConstant(0, MVT::i32);
> > > Op = DAG.getNode(IntNo, dl, EVT::EVT(MVT::i32), Ops, numNodes);
> > > if (outChain) {
> > > SDValue mv[2] = {Op, chain};
> > > Op = DAG.getMergeValues(mv, 2, dl);
> > > }
> > > return Op;
> > > }
> > >
> > > I'm guessing I am not handling the chain correctly, but I'm not
> sure
> > what I am doing wrong. Can someone point me to an example of matching
> > an intrinsic to a machine instruction with no return value?
> > >
> > > Thanks,
> > > Micah
> > > _______________________________________________
> > > LLVM Developers mailing list
> > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
More information about the llvm-dev
mailing list