<div dir="ltr">Can you just have the pseudo instruction produce two values with one not connected to anything outside. I would think the register allocator should pick a register for it. Then you can just use the register when you expand it.<br clear="all"><div><div dir="ltr" data-smartmail="gmail_signature">~Craig</div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Dec 11, 2019 at 11:06 AM Aaron Smith via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">You could hardcode a register for the pseudo instruction to use in the td file.<br>
The register allocator will make sure not to clobber it.<br>
<br>
let uses = [ R1 ], defs = [ R1 ] in {<br>
def MYINST : Pseudo<><br>
}<br>
<br>
On Wed, Dec 11, 2019 at 10:25 AM Przemyslaw Ossowski via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> I have one more question regarding expanding pseudo instruction.<br>
><br>
> These two Machine Instructions, which I mentioned earlier, have to be one after another, but also have to 'communicate' using any General Purpose Register<br>
><br>
> For example:<br>
> gpr4 INST_IN<br>
> r2 INST_OUT gpr4, r1<br>
><br>
> Is there any possibility to indicate that pseudo instruction, which is representing these two instruction,<br>
> will define and use 'internally' one additional register from 'gpr' pool (except those which are ins and outs).<br>
> Aa 'internal' register there might be use any of the register from 'gpr' pool. I wouldn't like to indicate particular one.<br>
><br>
> Expanding will occur after register allocation, so the only solution I see is involving register scavenger during expanding pass.<br>
> Is usage register scavenger in such case is proper or maybe there is also any simpler approach?<br>
><br>
> Thanks,<br>
> Przemek<br>
><br>
><br>
><br>
><br>
><br>
><br>
><br>
> On Tue, Dec 10, 2019 at 6:01 PM Przemyslaw Ossowski <<a href="mailto:przemyslaw.ossowski@googlemail.com" target="_blank">przemyslaw.ossowski@googlemail.com</a>> wrote:<br>
>><br>
>> Thank you Krzysztof,<br>
>> I used pseudo-instruction earlier, but thought there might be easier solution by implementing support for that simply in TableGen files by marking somehow the instructions:)<br>
>><br>
>> Thanks for confirmation, that I have to do this in a such way,<br>
>> Przemek<br>
>><br>
>><br>
>><br>
>> On Tue, Dec 10, 2019 at 5:51 PM Krzysztof Parzyszek <<a href="mailto:kparzysz@quicinc.com" target="_blank">kparzysz@quicinc.com</a>> wrote:<br>
>>><br>
>>> Create a pseudo-instruction that represents these two, and expand it into the actual instructions late, after optimizations.<br>
>>><br>
>>><br>
>>><br>
>>> --<br>
>>><br>
>>> Krzysztof Parzyszek  <a href="mailto:kparzysz@quicinc.com" target="_blank">kparzysz@quicinc.com</a>  Â AI tools development<br>
>>><br>
>>><br>
>>><br>
>>> From: llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>> On Behalf Of Przemyslaw Ossowski via llvm-dev<br>
>>> Sent: Tuesday, December 10, 2019 10:42 AM<br>
>>> To: llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
>>> Subject: [EXT] [llvm-dev] Glue two instructions together<br>
>>><br>
>>><br>
>>><br>
>>> Hi,<br>
>>><br>
>>><br>
>>><br>
>>> for DAG-to-DAG instruction selection I’ve implemented a pattern, which creates from one SDNode two instructions, something like:<br>
>>><br>
>>><br>
>>><br>
>>> def: Pat<(NEW_SDNODE REG:$r1),<br>
>>><br>
>>>  Â  Â  Â  Â  (INST_OUT (INST_IN), REG:$r1)>;<br>
>>><br>
>>><br>
>>><br>
>>> where INST_IN doesn't  accepts any inputs and INST_OUT accepts two inputs - one returned by INST_IN and REG;$r1.<br>
>>><br>
>>><br>
>>><br>
>>> Is there any possibility to â€˜Glue’ two instruction created in a such way? Maybe something similar to creation SDNodes with SDNPOutGlue, SDNPInGlue) ?<br>
>>><br>
>>><br>
>>><br>
>>> These two instructions INST_IN and INST_OUT have to be one after another without any other inserted between them.<br>
>>><br>
>>><br>
>>><br>
>>> Thanks,<br>
>>><br>
>>> Przemek<br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>