[llvm] 19cdd45 - [X86] X86DAGToDAGISel::matchIndexRecursively - add SIGN_EXTEND(ADD_NSW(X,C)) handling

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 02:42:23 PDT 2023


Author: Simon Pilgrim
Date: 2023-08-24T10:19:37+01:00
New Revision: 19cdd45b083ca815245ed46b9be7ef907b2def50

URL: https://github.com/llvm/llvm-project/commit/19cdd45b083ca815245ed46b9be7ef907b2def50
DIFF: https://github.com/llvm/llvm-project/commit/19cdd45b083ca815245ed46b9be7ef907b2def50.diff

LOG: [X86] X86DAGToDAGISel::matchIndexRecursively - add SIGN_EXTEND(ADD_NSW(X,C)) handling

Split an index register from IndexReg = SIGN_EXTEND(ADD_NSW(X,C)) to IndexReg = SIGN_EXTEND(X), Offset = SIGN_EXTEND(C)

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
    llvm/test/CodeGen/X86/addr-mode-matcher-2.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index 9f057839e7dbf6..f1eb1f4e85fb5b 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -2244,6 +2244,32 @@ SDValue X86DAGToDAGISel::matchIndexRecursively(SDValue N,
     }
   }
 
+  // index: sext(add_nsw(x,c)) -> index: sext(x), disp + sext(c)
+  // TODO: call matchIndexRecursively(AddSrc) if we won't corrupt sext?
+  if (N.getOpcode() == ISD::SIGN_EXTEND) {
+    SDValue Src = N.getOperand(0);
+    if (Src.getOpcode() == ISD::ADD && Src->getFlags().hasNoSignedWrap()) {
+      if (CurDAG->isBaseWithConstantOffset(Src)) {
+        SDValue AddSrc = Src.getOperand(0);
+        auto *AddVal = cast<ConstantSDNode>(Src.getOperand(1));
+        uint64_t Offset = (uint64_t)AddVal->getSExtValue() * AM.Scale;
+        if (!foldOffsetIntoAddress(Offset, AM)) {
+          SDLoc DL(N);
+          EVT VT = N.getValueType();
+          SDValue ExtSrc = CurDAG->getNode(ISD::SIGN_EXTEND, DL, VT, AddSrc);
+          SDValue ExtVal = CurDAG->getConstant(AddVal->getSExtValue(), DL, VT);
+          SDValue ExtAdd = CurDAG->getNode(ISD::ADD, DL, VT, ExtSrc, ExtVal);
+          insertDAGNode(*CurDAG, N, ExtSrc);
+          insertDAGNode(*CurDAG, N, ExtVal);
+          insertDAGNode(*CurDAG, N, ExtAdd);
+          CurDAG->ReplaceAllUsesWith(N, ExtAdd);
+          CurDAG->RemoveDeadNode(N.getNode());
+          return ExtSrc;
+        }
+      }
+    }
+  }
+
   // TODO: Handle extensions, shifted masks etc.
   return N;
 }

diff  --git a/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll b/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
index 6b20c2da62719c..21f76ad4a6698e 100644
--- a/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
+++ b/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll
@@ -51,9 +51,8 @@ define void @foo(i1 zeroext, i32) nounwind {
 ; X64-NEXT:    movl %esi, %eax
 ; X64-NEXT:    .p2align 4, 0x90
 ; X64-NEXT:  .LBB0_2: # =>This Inner Loop Header: Depth=1
-; X64-NEXT:    incl %eax
 ; X64-NEXT:    cltq
-; X64-NEXT:    shlq $2, %rax
+; X64-NEXT:    leaq 4(,%rax,4), %rax
 ; X64-NEXT:    leaq (%rax,%rax,4), %rdi
 ; X64-NEXT:    callq bar at PLT
 ; X64-NEXT:    jmp .LBB0_2


        


More information about the llvm-commits mailing list