[llvm] [SelectionDAG][RISCV] Fix break of vnsrl pattern in issue #94265 (PR #95563)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 12 01:41:02 PDT 2024


================
@@ -1884,6 +1884,19 @@ bool RISCVTargetLowering::isTruncateFree(EVT SrcVT, EVT DstVT) const {
   return (SrcBits == 64 && DestBits == 32);
 }
 
+bool RISCVTargetLowering::isTruncateFree(SDValue Val, EVT VT2) const {
+  EVT SrcVT = Val.getValueType();
+  // free truncate from vnsrl and vnsra
+  if (Subtarget.hasStdExtV() &&
+      (Val.getOpcode() == ISD::SRL || Val.getOpcode() == ISD::SRA) &&
+      SrcVT.isVector() && VT2.isVector()) {
+    unsigned SrcBits = SrcVT.getVectorElementType().getSizeInBits();
+    unsigned DestBits = VT2.getVectorElementType().getSizeInBits();
+    return (SrcBits == DestBits * 2);
----------------
RKSimon wrote:

Are there any circumstances we'd want to drop down to TargetLowering::isTruncateFree(Val, VT2) if this is false?

https://github.com/llvm/llvm-project/pull/95563


More information about the llvm-commits mailing list