<div dir="ltr"><div><div><div><div><div><div>Before I wrote here, I tried both ways you decsribed, but none of them has worked out for me.<br></div>With yours sugesstions I was able to move a bit further with the first approach (when we don't create regclass and just hard-code it in .td)<br>
<br></div>But I still receive strange errors. I received DAG which I happy with (DAG here: <a href="http://goo.gl/62tpkk">http://goo.gl/62tpkk</a>), but everything goes broken on scheduling.<br><br></div>I had to chain mine nodes, because otherwise nodes xmac and srxacc got removed on first combine. But since they are chained, they have MVT::Other return type, and that causes strange crash inside func GetCostFor in ScheduleDAGRRList.cpp:<br>
<br>Def RegClass = TLI->getRepRegClassFor(VT)->getID();<br></div>When VT is MVT::Other it returns 0x0, what results crash.<br><br></div>It got me confused, because reading documentation on CodeGen gave me an idea, that chain edges are control flow edges, not data edges. So I don't understand why scheduler tries to assign some register to it.<br>
<br></div>I'm struggling with this problem way to long for now, and I very appreciate yours help, Sam.<br><div><div><div><div><div><div><br></div></div></div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
2014-09-01 1:50 GMT+04:00 Sam Parker <span dir="ltr"><<a href="mailto:S.Parker3@lboro.ac.uk" target="_blank">S.Parker3@lboro.ac.uk</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
Yes, that's what I would do. If you want LLVM and the register allocator to also know that the instruction explicitly defines the register, I would designate the register into it's own register class and have your instruction write to that class (and there will be only a single option for RA).<br>

<br>
cheers,<br>
<div class="">Sam<br>
<br>
Sam Parker<br>
Research Student<br>
Electronic Systems Design Group<br>
</div>Loughborough University<br>
UK<br>
<br>
________________________________________<br>
From: Dmitri Kovalenko [<a href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a>]<br>
Sent: 31 August 2014 21:53<br>
To: Sam Parker<br>
Cc: <a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><br>
Subject: Re: [LLVMdev] understanding DAG: node creation<br>
<div class=""><br>
Sam, thanks for your answer.<br>
That's a great suggestion.<br>
<br>
And excuse me for maybe dilettante question:<br>
To hard-code use of the global register means to hard-code it in the 'asm string' argument of the instruction definition in the .td file?<br>
<br>
<br>
</div>2014-09-01 0:44 GMT+04:00 Sam Parker <<a href="mailto:S.Parker3@lboro.ac.uk">S.Parker3@lboro.ac.uk</a><mailto:<a href="mailto:S.Parker3@lboro.ac.uk">S.Parker3@lboro.ac.uk</a>>>:<br>
<div class="im HOEnZb">Hi Dmitri,<br>
<br>
If you have such a simple intrinsic which operates on a single register,  just lower the intrinsic to a target specific node which is only implemented by a single instruction. Like you were doing before and by using a chain operand. Hard code the instruction to use and define the global register and only pass the instruction the actual variable argument.<br>

<br>
Hope that helps,<br>
Sam<br>
<br>
Sam Parker<br>
Research Student<br>
Electronic Systems Design Group<br>
School of Electronic, Electrical and Systems Engineering<br>
Loughborough University<br>
<br>
----- Reply message -----<br>
</div><div class="HOEnZb"><div class="h5">From: "Dmitri Kovalenko" <<a href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a><mailto:<a href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a>>><br>

To: <<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><mailto:<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>>><br>
Subject: [LLVMdev] understanding DAG: node creation<br>
Date: Sat, Aug 30, 2014 22:18<br>
<br>
<br>
I have an intrinsic and it must be lowered to instruction, which works with fixed register.<br>
So, it takes contents of this register and another argument as input. After execution, the result of the instruction is placed into that same fixed register.<br>
<br>
What should I do in SelectionDAGBuilder::visitIntrinicCall to describe such behaviour for a SDNode?<br>
<br>
Thank you for the ideas and insights.<br>
<br>
--<br>
Sincerely,<br>
Dmitri Kovalenko<br>
<br>
<br>
<br>
--<br>
Sincerely,<br>
Dmitri Kovalenko</div></div></blockquote></div><br><br clear="all"><br>-- <br><div>Sincerely,</div><div>Dmitri Kovalenko</div>
</div>