[X86] Enable ISD::TRUNCATE support from v2i64 and v4i64 nodes
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 22 Jul 2023 15:03:50 +0000 (16:03 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sat, 22 Jul 2023 15:04:00 +0000 (16:04 +0100)
Addresses the last comment from D154592 - ensure we only truncate with PACKSS/PACKUS when it can be cheaply done (and use shuffles otherwise).

llvm/lib/Target/X86/X86ISelLowering.cpp

index d5cbaed..71366db 100644 (file)
@@ -1240,9 +1240,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
     setOperationAction(ISD::TRUNCATE,    MVT::v2i8,  Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v2i16, Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v2i32, Custom);
+    setOperationAction(ISD::TRUNCATE,    MVT::v2i64, Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v4i8,  Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v4i16, Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v4i32, Custom);
+    setOperationAction(ISD::TRUNCATE,    MVT::v4i64, Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v8i8,  Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v8i16, Custom);
     setOperationAction(ISD::TRUNCATE,    MVT::v8i32, Custom);
@@ -22959,6 +22961,13 @@ static SDValue LowerTruncateVecPackWithSignBits(MVT DstVT, SDValue In,
       SrcSVT.getSizeInBits() > (DstSVT.getSizeInBits() * 2))
     return SDValue();
 
+  // Prefer to lower v4i64 -> v4i32 as a shuffle unless we can cheaply
+  // split this for packing.
+  if (SrcVT == MVT::v4i64 && DstVT == MVT::v4i32 &&
+      !isFreeToSplitVector(In.getNode(), DAG) &&
+      (!Subtarget.hasInt256() || DAG.ComputeNumSignBits(In) != 64))
+    return SDValue();
+
   // If the upper half of the source is undef, then attempt to split and
   // only truncate the lower half.
   if (DstVT.getSizeInBits() >= 128) {