<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix">Hi,<br>
I'm not sure. But in your lowered DAG the chain nodes are the
first operands for you custom nodes, however for the other nodes
the chain is the last operand. I seem to remember that during
targetlowering the chain is the first operand and then it seems to
switch over after ISelDAG, this confused me and may have something
to do with the issue that you are seeing. I really don't know much
about scheduling, do you want to post your instruction definitions
again to see if someone else has some ideas,.<br>
<br>
cheers,<br>
sam<br>
<pre class="moz-signature" cols="72">Sam Parker
Research Student
Electronic System Design Group
School of Electronic, Electrical and Systems Engineering
Loughborough University
UK
</pre>
On 01/09/14 14:35, Dmitri Kovalenko wrote:<br>
</div>
<blockquote
cite="mid:CAF+j+H_0DUku_QeuYBiBWM4=ZprM2xucX-v3FvGXaOep8UciuA@mail.gmail.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<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 moz-do-not-send="true"
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
moz-do-not-send="true" 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 moz-do-not-send="true"
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 moz-do-not-send="true"
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
moz-do-not-send="true" href="mailto:S.Parker3@lboro.ac.uk">S.Parker3@lboro.ac.uk</a><mailto:<a
moz-do-not-send="true" 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
moz-do-not-send="true"
href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a><mailto:<a
moz-do-not-send="true"
href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a>>><br>
To: <<a moz-do-not-send="true"
href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><mailto:<a
moz-do-not-send="true"
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>
</blockquote>
<br>
</body>
</html>