[llvm] 4930f69 - [X86] canonicalizeShuffleWithOp - add initial shuffle(sint_to_fp(x)) -> sint_to_fp(shuffle(x)) handling
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 2 04:03:21 PST 2024
Author: Simon Pilgrim
Date: 2024-12-02T12:03:04Z
New Revision: 4930f69b78e215c60eb53e25596599c2f98b6564
URL: https://github.com/llvm/llvm-project/commit/4930f69b78e215c60eb53e25596599c2f98b6564
DIFF: https://github.com/llvm/llvm-project/commit/4930f69b78e215c60eb53e25596599c2f98b6564.diff
LOG: [X86] canonicalizeShuffleWithOp - add initial shuffle(sint_to_fp(x)) -> sint_to_fp(shuffle(x)) handling
Another tentative step towards folding shuffles through conversion ops - initially limited to cases where the src/dst types are matching width.
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/pr50609.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 2f88fa8ae6cca4..2d3bb2ece621e0 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -41404,6 +41404,7 @@ static SDValue canonicalizeShuffleWithOp(SDValue N, SelectionDAG &DAG,
N->isOnlyUserOf(N.getOperand(0).getNode())) {
SDValue N0 = peekThroughOneUseBitcasts(N.getOperand(0));
unsigned SrcOpcode = N0.getOpcode();
+ EVT OpVT = N0.getValueType();
if (TLI.isBinOp(SrcOpcode) && IsSafeToMoveShuffle(N0, SrcOpcode)) {
SDValue Op00 = peekThroughOneUseBitcasts(N0.getOperand(0));
SDValue Op01 = peekThroughOneUseBitcasts(N0.getOperand(1));
@@ -41421,13 +41422,23 @@ static SDValue canonicalizeShuffleWithOp(SDValue N, SelectionDAG &DAG,
LHS = DAG.getNode(Opc, DL, ShuffleVT, Op00);
RHS = DAG.getNode(Opc, DL, ShuffleVT, Op01);
}
- EVT OpVT = N0.getValueType();
return DAG.getBitcast(ShuffleVT,
DAG.getNode(SrcOpcode, DL, OpVT,
DAG.getBitcast(OpVT, LHS),
DAG.getBitcast(OpVT, RHS)));
}
}
+ if (SrcOpcode == ISD::SINT_TO_FP && IsSafeToMoveShuffle(N0, SrcOpcode) &&
+ OpVT.getScalarSizeInBits() ==
+ N0.getOperand(0).getScalarValueSizeInBits()) {
+ SDValue Op00 = DAG.getBitcast(ShuffleVT, N0.getOperand(0));
+ SDValue Res =
+ N.getNumOperands() == 2
+ ? DAG.getNode(Opc, DL, ShuffleVT, Op00, N.getOperand(1))
+ : DAG.getNode(Opc, DL, ShuffleVT, Op00);
+ Res = DAG.getBitcast(N0.getOperand(0).getValueType(), Res);
+ return DAG.getBitcast(ShuffleVT, DAG.getNode(SrcOpcode, DL, OpVT, Res));
+ }
}
break;
}
diff --git a/llvm/test/CodeGen/X86/pr50609.ll b/llvm/test/CodeGen/X86/pr50609.ll
index 3e39c567d79e6d..e9c0f101944259 100644
--- a/llvm/test/CodeGen/X86/pr50609.ll
+++ b/llvm/test/CodeGen/X86/pr50609.ll
@@ -11,9 +11,9 @@ define void @PR50609(ptr noalias nocapture %RET, ptr noalias %aFOO, <16 x i32> %
; CHECK-NEXT: vpsrad $31, %xmm2, %xmm3
; CHECK-NEXT: vpsrld $30, %xmm3, %xmm3
; CHECK-NEXT: vpaddd %xmm3, %xmm2, %xmm2
+; CHECK-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
; CHECK-NEXT: vpsrad $2, %xmm2, %xmm2
; CHECK-NEXT: vcvtdq2ps %xmm2, %xmm2
-; CHECK-NEXT: vshufps {{.*#+}} xmm2 = xmm2[0,0,0,0]
; CHECK-NEXT: vinsertf128 $1, %xmm2, %ymm2, %ymm2
; CHECK-NEXT: vmaskmovps %ymm2, %ymm0, (%rdi)
; CHECK-NEXT: vmaskmovps %ymm2, %ymm1, 32(%rdi)
More information about the llvm-commits
mailing list