<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 24, 2019 at 4:08 PM Tim Northover <<a href="mailto:t.p.northover@gmail.com">t.p.northover@gmail.com</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">On Mon, 24 Jun 2019 at 12:16, Gleb Popov via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> 1. Where does it come from? Can I do anything to make it not appear?<br>
<br>
It comes from something like:<br>
<br>
    %ptr = alloca i8<br>
   %var = alloca i8*<br>
   store i8* %ptr, i8** %var<br>
<br>
and in general it's not possible to eliminate the combination.<br></blockquote><div><br></div><div>Aha, thanks.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> 2. If not, how do I change it so that the operand being stored would be first loaded into a register, and that register would be used instead?<br>
<br>
While the store is being selected LLVM will just treat the value being<br>
stored as a generic pointer-width integer unless you have written a<br>
specific pattern for storing a FrameIndex somewhere. </blockquote><div><br></div><div>Actually, this is exactly my case. I have a pattern that looks like</div><div><br></div><div>(store_stack IntRegs:$reg, FIOperand:$i)</div><div><br></div><div>It worked for me when first operand was a register and now I stumbled upon two FrameIndicies.<br></div><div><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">That's probably<br>
what you want so no need to change anything.<br>
<br>
After that, LLVM will try to select the FrameIndex itself (which<br>
you'll need to support anyway so that you can pass a pointer to a<br>
local variable between functions).<br>
<br>
Generally this seems to be handled by XYZISelDAGToDAG.cpp, which<br>
converts an ISD::FrameIndex into an appropriate arithmetic instruction<br>
that can offset from SP. That gets lowered to actual known offsets<br>
later on, in exactly the same way loads and stores are.<br>
<br>
It's probably done in C++ rather than TableGen because the operands of<br>
these resulting instructions often look pretty weird (for example a<br>
TargetFrameIndex instead of a register). That's mostly speculation<br>
though, I haven't tried to write a bare frameindex pattern.<br>
<br>
Cheers.<br>
<br>
Tim.<br></blockquote><div><br></div><div><br></div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 24, 2019 at 4:14 PM Krzysztof Parzyszek <<a href="mailto:kparzysz@quicinc.com">kparzysz@quicinc.com</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">





<div lang="EN-US">
<div class="gmail-m_8551765429804317528WordSection1">
<p class="MsoNormal">FrameIndex values come from objects that are still 
allocated on the stack at the time of the SDAG construction.  In your 
case it seems that the address and the value to store are both on the 
stack.  You don’t need to do anything in particular
 with it.  If you have a selection pattern of form “(store 
RegClassA:$Addr, RegClassB:$Val), (STORE $Addr, $Val)”, then it will 
force loading both, Addr and Val into registers. </p></div></div></blockquote><div><br></div><div>You mean, LLVM will automagically generate loads? This isn't happening for me.</div><div><br></div><div>And what's "STORE"? Is it somehow different from "store"?<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div class="gmail-m_8551765429804317528WordSection1"><p class="MsoNormal"> I think someone has 
added a pattern to match frame index in patterns as well (it
 didn’t use to be possible and you had to use ComplexPattern), so your 
pattern can handle that directly too.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span style="font-size:9pt;font-family:Consolas">-- </span>
<span style="font-size:9pt;font-family:Consolas"></span></p>
<p class="MsoNormal"><span style="font-size:8pt;font-family:Consolas">Krzysztof Parzyszek 
<a href="mailto:kparzysz@quicinc.com" target="_blank"><span style="color:rgb(5,99,193)">kparzysz@quicinc.com</span></a>   LLVM compiler development</span></p>
<p class="MsoNormal"> </p></div></div></blockquote></div> </div></div></div>