<div>Can you leave an assert for the Chain being equal?</div><div><br><div class="gmail_quote"><div>On Mon, Apr 10, 2017 at 5:52 PM Easwaran Raman via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">eraman updated this revision to Diff 94762.<br class="gmail_msg">
eraman added a comment.<br class="gmail_msg">
<br class="gmail_msg">
Used getOperand(X86::AddrBaseReg) etc instead of getOperand(0). Also removed if the chain operands match. This check shouldn't be in areLoadsFromSameBasePtr and the caller already passes two loads that are uses of the same chain node.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D31833" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D31833</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  lib/Target/X86/X86InstrInfo.cpp<br class="gmail_msg">
  test/CodeGen/X86/load-slice.ll<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Index: test/CodeGen/X86/load-slice.ll<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- test/CodeGen/X86/load-slice.ll<br class="gmail_msg">
+++ test/CodeGen/X86/load-slice.ll<br class="gmail_msg">
@@ -19,10 +19,10 @@<br class="gmail_msg">
 ; STRESS-LABEL: t1:<br class="gmail_msg">
 ; Load out[out_start + 8].real, this is base + 8 * 8 + 0.<br class="gmail_msg">
 ; STRESS: vmovss 64([[BASE:[^(]+]]), [[OUT_Real:%xmm[0-9]+]]<br class="gmail_msg">
-; Add low slice: out[out_start].real, this is base + 0.<br class="gmail_msg">
-; STRESS-NEXT: vaddss ([[BASE]]), [[OUT_Real]], [[RES_Real:%xmm[0-9]+]]<br class="gmail_msg">
 ; Load out[out_start + 8].imm, this is base + 8 * 8 + 4.<br class="gmail_msg">
 ; STRESS-NEXT: vmovss 68([[BASE]]), [[OUT_Imm:%xmm[0-9]+]]<br class="gmail_msg">
+; Add low slice: out[out_start].real, this is base + 0.<br class="gmail_msg">
+; STRESS-NEXT: vaddss ([[BASE]]), [[OUT_Real]], [[RES_Real:%xmm[0-9]+]]<br class="gmail_msg">
 ; Add high slice: out[out_start].imm, this is base + 4.<br class="gmail_msg">
 ; STRESS-NEXT: vaddss 4([[BASE]]), [[OUT_Imm]], [[RES_Imm:%xmm[0-9]+]]<br class="gmail_msg">
 ; Swap Imm and Real.<br class="gmail_msg">
@@ -34,10 +34,10 @@<br class="gmail_msg">
 ; REGULAR-LABEL: t1:<br class="gmail_msg">
 ; Load out[out_start + 8].real, this is base + 8 * 8 + 0.<br class="gmail_msg">
 ; REGULAR: vmovss 64([[BASE:[^)]+]]), [[OUT_Real:%xmm[0-9]+]]<br class="gmail_msg">
-; Add low slice: out[out_start].real, this is base + 0.<br class="gmail_msg">
-; REGULAR-NEXT: vaddss ([[BASE]]), [[OUT_Real]], [[RES_Real:%xmm[0-9]+]]<br class="gmail_msg">
 ; Load out[out_start + 8].imm, this is base + 8 * 8 + 4.<br class="gmail_msg">
 ; REGULAR-NEXT: vmovss 68([[BASE]]), [[OUT_Imm:%xmm[0-9]+]]<br class="gmail_msg">
+; Add low slice: out[out_start].real, this is base + 0.<br class="gmail_msg">
+; REGULAR-NEXT: vaddss ([[BASE]]), [[OUT_Real]], [[RES_Real:%xmm[0-9]+]]<br class="gmail_msg">
 ; Add high slice: out[out_start].imm, this is base + 4.<br class="gmail_msg">
 ; REGULAR-NEXT: vaddss 4([[BASE]]), [[OUT_Imm]], [[RES_Imm:%xmm[0-9]+]]<br class="gmail_msg">
 ; Swap Imm and Real.<br class="gmail_msg">
Index: lib/Target/X86/X86InstrInfo.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- lib/Target/X86/X86InstrInfo.cpp<br class="gmail_msg">
+++ lib/Target/X86/X86InstrInfo.cpp<br class="gmail_msg">
@@ -8980,28 +8980,25 @@<br class="gmail_msg">
     break;<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
-  // Check if chain operands and base addresses match.<br class="gmail_msg">
-  if (Load1->getOperand(0) != Load2->getOperand(0) ||<br class="gmail_msg">
-      Load1->getOperand(5) != Load2->getOperand(5))<br class="gmail_msg">
+  // Lambda to check if both the loads have the same value for an operand index.<br class="gmail_msg">
+  auto HasSameOp = [&](int I) {<br class="gmail_msg">
+    return Load1->getOperand(I) == Load2->getOperand(I);<br class="gmail_msg">
+  };<br class="gmail_msg">
+<br class="gmail_msg">
+  // All operands except the displacement should match.<br class="gmail_msg">
+  if (!HasSameOp(X86::AddrBaseReg) || !HasSameOp(X86::AddrScaleAmt) ||<br class="gmail_msg">
+      !HasSameOp(X86::AddrIndexReg) || !HasSameOp(X86::AddrSegmentReg))<br class="gmail_msg">
     return false;<br class="gmail_msg">
-  // Segment operands should match as well.<br class="gmail_msg">
-  if (Load1->getOperand(4) != Load2->getOperand(4))<br class="gmail_msg">
+<br class="gmail_msg">
+  // Now let's examine if the displacements are constants.<br class="gmail_msg">
+  auto Disp1 = dyn_cast<ConstantSDNode>(Load1->getOperand(X86::AddrDisp));<br class="gmail_msg">
+  auto Disp2 = dyn_cast<ConstantSDNode>(Load2->getOperand(X86::AddrDisp));<br class="gmail_msg">
+  if (!Disp1 || !Disp2)<br class="gmail_msg">
     return false;<br class="gmail_msg">
-  // Scale should be 1, Index should be Reg0.<br class="gmail_msg">
-  if (Load1->getOperand(1) == Load2->getOperand(1) &&<br class="gmail_msg">
-      Load1->getOperand(2) == Load2->getOperand(2)) {<br class="gmail_msg">
-    if (cast<ConstantSDNode>(Load1->getOperand(1))->getZExtValue() != 1)<br class="gmail_msg">
-      return false;<br class="gmail_msg">
<br class="gmail_msg">
-    // Now let's examine the displacements.<br class="gmail_msg">
-    if (isa<ConstantSDNode>(Load1->getOperand(3)) &&<br class="gmail_msg">
-        isa<ConstantSDNode>(Load2->getOperand(3))) {<br class="gmail_msg">
-      Offset1 = cast<ConstantSDNode>(Load1->getOperand(3))->getSExtValue();<br class="gmail_msg">
-      Offset2 = cast<ConstantSDNode>(Load2->getOperand(3))->getSExtValue();<br class="gmail_msg">
-      return true;<br class="gmail_msg">
-    }<br class="gmail_msg">
-  }<br class="gmail_msg">
-  return false;<br class="gmail_msg">
+  Offset1 = Disp1->getSExtValue();<br class="gmail_msg">
+  Offset2 = Disp2->getSExtValue();<br class="gmail_msg">
+  return true;<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
 bool X86InstrInfo::shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature">~Craig</div>