<div dir="ltr">I think this might fix the problem. We aren't counting the flag usage of the ADC in check foldable chain node when seeing if the users of the load only have a single use.<div><br></div><div>







<p class="gmail-p1"><span class="gmail-s1"><b>--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp</b></span></p>
<p class="gmail-p1"><span class="gmail-s1"><b>+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp</b></span></p>
<p class="gmail-p1"><span class="gmail-s2">@@ -3345,7 +3345,7 @@</span><span class="gmail-s1"> void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,</span></p>
<p class="gmail-p1"><span class="gmail-s1">       // a single use.</span></p>
<p class="gmail-p1"><span class="gmail-s1">       bool HasMultipleUses = false;</span></p>
<p class="gmail-p1"><span class="gmail-s1">       for (unsigned i = 1, e = NodeStack.size()-1; i != e; ++i)</span></p>
<p class="gmail-p2"><span class="gmail-s1">-        if (!NodeStack[i].hasOneUse()) {</span></p>
<p class="gmail-p3"><span class="gmail-s1">+        if (!NodeStack[i].getNode()->hasOneUse()) {</span></p>
<p class="gmail-p1"><span class="gmail-s1">           HasMultipleUses = true;</span></p>
<p class="gmail-p1"><span class="gmail-s1">           break;</span></p>
<p class="gmail-p1"><span class="gmail-s1">         }</span></p></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Mon, Feb 27, 2017 at 10:05 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">For this code the isel ends up creating adc with memory load and store, and then a separate adc with the same load, but no store. This means isel is now replicating loads which seems wrong. I suspect something is going wrong in merging input chains?<div><br></div><div><div>  t0: ch = EntryToken</div><div>  t2: i64,ch = CopyFromReg t0, Register:i64 %vreg0</div><div>  t4: i64,ch = CopyFromReg t0, Register:i64 %vreg1</div><div>  t71: i64 = add t2, Constant:i64<24></div><div>  t25: i64 = add t2, Constant:i64<8></div><div>  t24: i64,ch = load<LD8[%p]> t0, t2, undef:i64</div><div>  t16: i64 = add t2, Constant:i64<16></div><div>  t38: i64,ch = load<LD8[%q]> t0, t4, undef:i64</div><div>  t22: i64,ch = load<LD8[%p+24]> t0, t71, undef:i64</div><div>  t26: i64,ch = load<LD8[%p+8]> t0, t25, undef:i64</div><div>  t19: i64,ch = load<LD8[%p+16]> t0, t16, undef:i64</div><div>    t69: i64 = add t4, Constant:i64<24></div><div>  t36: i64,ch = load<LD8[%q+24]> t0, t69, undef:i64</div><div>    t39: i64 = add t4, Constant:i64<8></div><div>  t40: i64,ch = load<LD8[%q+8]> t0, t39, undef:i64</div><div>    t29: i64 = add t4, Constant:i64<16></div><div>  t34: i64,ch = load<LD8[%q+16]> t0, t29, undef:i64</div><div>  t79: i64,i32 = X86ISD::ADC t19, t34, t80:1</div><div>  t80: i64,i32 = X86ISD::ADC t26, t40, t81:1</div><div>  t81: i64,i32 = X86ISD::ADD t24, t38</div><div>        t72: ch = TokenFactor t22:1, t38:1, t40:1, t34:1, t36:1</div><div>        t78: i64,i32 = X86ISD::ADC t22, t36, t79:1</div><div>      t73: ch = store<ST8[%p+24]> t72, t78, t71, undef:i64</div><div>        t82: ch = TokenFactor t19:1, t38:1, t40:1, t34:1, t36:1</div><div>      t83: ch = store<ST8[%p+16]> t82, t79, t16, undef:i64</div><div>        t87: ch = TokenFactor t26:1, t38:1, t40:1, t34:1, t36:1</div><div>      t88: ch = store<ST8[%p+8]> t87, t80, t25, undef:i64</div><div>        t92: ch = TokenFactor t24:1, t38:1, t40:1, t34:1, t36:1</div><div>      t93: ch = store<ST8[%p]> t92, t81, t2, undef:i64</div><div>    t96: ch = TokenFactor t73, t83, t88, t93</div><div>  t13: ch = X86ISD::RET_FLAG t96, TargetConstant:i32<0></div></div></div><div class="gmail_extra"><span class="HOEnZb"><font color="#888888"><br clear="all"><div><div class="m_2036099464945917301gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></font></span><div><div class="h5">
<br><div class="gmail_quote">On Mon, Feb 27, 2017 at 9:19 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Another problem seems to be that despite the fact we are making store instructions that produce flags, we aren't transfering that flag production to the instructions that need the flags. So we replicate all of the add operations.</div><div class="gmail_extra"><span class="m_2036099464945917301HOEnZb"><font color="#888888"><br clear="all"><div><div class="m_2036099464945917301m_719445174007776713gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></font></span><div><div class="m_2036099464945917301h5">
<br><div class="gmail_quote">On Mon, Feb 27, 2017 at 9:02 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I see we're missing an isel pattern for add producing carry and doing a memory RMW. I'm going to see if adding that helps anything.</div><div class="gmail_extra"><span class="m_2036099464945917301m_719445174007776713HOEnZb"><font color="#888888"><br clear="all"><div><div class="m_2036099464945917301m_719445174007776713m_1516056259224572136gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br></font></span><div class="gmail_quote"><div><div class="m_2036099464945917301m_719445174007776713h5">On Mon, Feb 27, 2017 at 8:47 PM, Nirav Davé via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_2036099464945917301m_719445174007776713h5"><div dir="ltr">Yes. I'm seeing that as well. Not clear what's going on. <div><br></div><div>In any case it looks to be unrelated to the alias analysis so barring concerns, I'm going to recommit the patch in the morning and let others take a look at this. </div><div><br></div><div>-Nirav</div></div>
<br></div></div><span>______________________________<wbr>_________________<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="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></span></blockquote></div><br></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>