[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