[llvm] [X86][AVX] Fix handling of out-of-bounds shift amounts in AVX2 vector shift nodes (PR #84426)
    Simon Pilgrim via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Fri Mar  8 05:32:12 PST 2024
    
    
  
================
@@ -47291,6 +47291,16 @@ static SDValue combineShiftRightArithmetic(SDNode *N, SelectionDAG &DAG,
   if (SDValue V = combineShiftToPMULH(N, DAG, Subtarget))
     return V;
 
+  APInt ShiftAmt;
+  SDNode *UMinNode = N1.getNode();
+  if (UMinNode->getOpcode() == ISD::UMIN &&
+      ISD::isConstantSplatVector(UMinNode->getOperand(1).getNode(), ShiftAmt) &&
+      ShiftAmt == VT.getScalarSizeInBits() - 1) {
+    SDValue ShrAmtVal = UMinNode->getOperand(0);
+    SDLoc DL(N);
+    return DAG.getNode(N->getOpcode(), DL, N->getVTList(), N0, ShrAmtVal);
----------------
RKSimon wrote:
The N->getOpcode() is just the regular ISD::SRA opcode - we need to use the X86ISD::VSRAV equivalent, but only if its safe to do so - we can check that with supportedVectorShiftWithImm
https://github.com/llvm/llvm-project/pull/84426
    
    
More information about the llvm-commits
mailing list