Thank you for replying to my email.<br><br>I am not sure if I understand your point, but are you suggesting this is done during instruction selection? It seems that this transformation takes place inside ARMPreAllocLoadStoreOpt:::RescheduleOps (after line 1501).<br>
<a href="http://llvm.org/doxygen/ARMLoadStoreOptimizer_8cpp_source.html">http://llvm.org/doxygen/ARMLoadStoreOptimizer_8cpp_source.html</a>.<br><br><pre class="fragment">01504           Ops.<a class="code" href="http://llvm.org/doxygen/classllvm_1_1SmallVectorImpl.html#aad4bda81394ccf6cb87db6d2ae881a11">pop_back</a>();<br>
<a name="l01505"></a>01505           Ops.<a class="code" href="http://llvm.org/doxygen/classllvm_1_1SmallVectorImpl.html#aad4bda81394ccf6cb87db6d2ae881a11">pop_back</a>();<br><a name="l01506"></a>01506 <br><a name="l01507"></a>01507           <span class="comment">// Form the pair instruction.</span><br>
01508           <span class="keywordflow">if</span> (isLd) {<br><a name="l01509"></a>01509             <a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html">MachineInstrBuilder</a> MIB = <a class="code" href="http://llvm.org/doxygen/namespacellvm.html#a7145156f8301eacb56ec8307c140542a">BuildMI</a>(*MBB, InsertPos,<br>
<a name="l01510"></a>01510                                               dl, TII->get(NewOpc))<br><a name="l01511"></a>01511               .addReg(EvenReg, <a class="code" href="http://llvm.org/doxygen/namespacellvm_1_1RegState.html#aee618dbf47179807cf5c50c1f795be51a72c17e2ff2d5af62a30e56ac152aa8d5">RegState::Define</a>)<br>
<a name="l01512"></a>01512               .<a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html#a5125cce72b214df09ca8f93dcbbf4c3a">addReg</a>(OddReg, <a class="code" href="http://llvm.org/doxygen/namespacellvm_1_1RegState.html#aee618dbf47179807cf5c50c1f795be51a72c17e2ff2d5af62a30e56ac152aa8d5">RegState::Define</a>)<br>
<a name="l01513"></a>01513               .<a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html#a5125cce72b214df09ca8f93dcbbf4c3a">addReg</a>(BaseReg);<br><a name="l01514"></a>01514             <span class="keywordflow">if</span> (!isT2)<br>
<a name="l01515"></a>01515               MIB.<a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html#a5125cce72b214df09ca8f93dcbbf4c3a">addReg</a>(OffReg);<br><a name="l01516"></a>01516             MIB.<a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html#a9f1fae6a5dbb6e378ca85df1fded8515">addImm</a>(Offset).<a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html#a9f1fae6a5dbb6e378ca85df1fded8515">addImm</a>(Pred).<a class="code" href="http://llvm.org/doxygen/classllvm_1_1MachineInstrBuilder.html#a5125cce72b214df09ca8f93dcbbf4c3a">addReg</a>(PredReg);<br>
<a name="l01517"></a>01517             ++NumLDRDFormed;<br></pre><br>I just wanted to know whether or not the MachineMemOperands were intentionally left out and if it is okay to add the MachineMemOperands to the newly created instruction (would it break anything?). <br>
<br>Thank you.<br><br><div class="gmail_quote">On Tue, Sep 7, 2010 at 1:31 PM, Bill Wendling <span dir="ltr"><<a href="mailto:wendling@apple.com">wendling@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">On Sep 7, 2010, at 10:48 AM, Akira Hatanaka wrote:<br>
<br>
> I have two questions regarding MachineMemOperands and dependence information.<br>
><br>
> Q1) I noticed that MachineMemOperands are lost when two LDRs are combined and a LDRD is generated in ARMPreAllocLoadStoreOpt:::RescheduleOps.<br>
><br>
> (before optimization)<br>
> %reg1033<def> = LDR %reg1030, %reg0, 4100, pred:14, pred:%reg0; mem:LD4[%uglygep10]<br>
> %reg1054<def> = LDR %reg1030, %reg0, 4104, pred:14, pred:%reg0; mem:LD4[%uglygep2021]<br>
><br>
> (after optimization)<br>
> %reg1054<def>, %reg1033<def> = LDRD %reg1030, %reg0, 264, pred:14, pred:%reg0<br>
><br>
> Are there any reasons they need to be removed?<br>
> Would it break something if both MachineMemOperands were added to the newly generated instruction?<br>
><br>
> (after optimization)<br>
> %reg1054<def>, %reg1033<def> = LDRD %reg1030, %reg0, 264, pred:14, pred:%reg0; mem:LD4[%uglygep10], mem:LD4[%uglygep2021]<br>
<br>
</div>If I had to guess, I would think it's because of how LDR is defined:<br>
<br>
def addrmodepc : Operand<i32>,<br>
                 ComplexPattern<i32, 2, "SelectAddrModePC", []> {<br>
  let PrintMethod = "printAddrModePCOperand";<br>
  let MIOperandInfo = (ops GPR, i32imm);<br>
}<br>
def LDR  : AI2ldw<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm, IIC_iLoadr,<br>
               "ldr", "\t$dst, $addr",<br>
               [(set GPR:$dst, (load addrmode2:$addr))]>;<br>
<br>
It's using addrmodepc, which is a ComplexPattern. The TableGen code cannot handle resetting the memoperands if it's dealing with a ComplexPattern. There's a similar bug in the X86 target.<br>
<font color="#888888"><br>
-bw<br>
<br>
</font></blockquote></div><br>