[PATCH] D158853: [SDAG] Add SimplifyDemandedBits support for ISD::SPLAT_VECTOR_PARTS

Philip Reames via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 29 11:47:42 PDT 2023


reames added inline comments.


================
Comment at: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1168
+  case ISD::SPLAT_VECTOR_PARTS: {
+    unsigned NumSclBits = Op.getOperand(0).getScalarValueSizeInBits();
+    assert(NumSclBits * Op.getNumOperands() == BitWidth &&
----------------
I think Scl is short for Scalar?  If so, just write it.  Scl isn't a common abbreviation.  


================
Comment at: llvm/test/CodeGen/RISCV/rvv/vnsrl-sdnode.ll:644
   %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
   %vb = trunc <vscale x 1 x i64> %splat to <vscale x 1 x i32>
   %x = lshr <vscale x 1 x i32> %va, %vb
----------------
craig.topper wrote:
> luke wrote:
> > craig.topper wrote:
> > > craig.topper wrote:
> > > > This looks like what we really have is a missing combine on trunc of splat_vector.
> > > Not objecting to this patch just that it might not show the proper motivation.
> > Is the combine you're referring to something like:
> > 
> > ```
> >               t4: i32,ch = CopyFromReg t0, Register:i32 %1
> >               t6: i32,ch = CopyFromReg t0, Register:i32 %2
> >             t8: i64 = build_pair t4, t6
> >           t11: nxv1i64 = splat_vector t8
> >         t13: nxv1i32 = truncate t11
> > ```
> > 
> > to
> > 
> > ```
> >               t4: i32,ch = CopyFromReg t0, Register:i32 %1
> >         t13: nxv1i32 = splat_vector t4
> > ```
> > 
> > And not on splat_vector_parts after legalisation?
> Do we already have a combine for truncate of build_pair?
> 
> From a quick glance, I see that we do convert (truncate (build_vector X, Y, Z)) to (build_vector (trunc X), (trunc Y), (trunc Z)). here.
> 
> ```
>   // Attempt to pre-truncate BUILD_VECTOR sources.                               
>   if (N0.getOpcode() == ISD::BUILD_VECTOR && !LegalOperations &&                 
>       TLI.isTruncateFree(SrcVT.getScalarType(), VT.getScalarType()) &&           
>       // Avoid creating illegal types if running after type legalizer.           
>       (!LegalTypes || TLI.isTypeLegal(VT.getScalarType()))) {                    
>     SDLoc DL(N);                                                                 
>     EVT SVT = VT.getScalarType();                                                
>     SmallVector<SDValue, 8> TruncOps;                                            
>     for (const SDValue &Op : N0->op_values()) {                                  
>       SDValue TruncOp = DAG.getNode(ISD::TRUNCATE, DL, SVT, Op);                 
>       TruncOps.push_back(TruncOp);                                               
>     }                                                                            
>     return DAG.getBuildVector(VT, DL, TruncOps);                                 
>   }
> ```
> 
> Maybe we should do the same for splat_vector?
I agree with Craig here. We definitely should have a trunc(splat) to splat(trunc) transform.  If we don't already, we should fix that.  

To be clear, this patch can be landed.  You need to add a bit more test coverage for cases which *aren't* truncates so that once the other patch lands we still have test coverage for this code, but that's about the only thing missing.

Or said differently, Craig and I are suggesting *additional* work, not *alternative* work.  


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D158853/new/

https://reviews.llvm.org/D158853



More information about the llvm-commits mailing list