[llvm] [RISCV] Add lowerVECTOR_SHUFFLEAsCONCAT_VECTORS. (PR #109948)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 25 06:52:54 PDT 2024
================
@@ -5130,6 +5130,40 @@ static SDValue lowerVECTOR_SHUFFLEAsRotate(ShuffleVectorSDNode *SVN,
return DAG.getBitcast(VT, Rotate);
}
+// e.g.,
+// t10 = insert_subvector undef:v16i32, t4, Constant:i64<0>
+// vector_shuffle<0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3> t10, undef:v16i32
+// ->
+// concat_vectors t4, t4, t4, t4
+static SDValue
+lowerVECTOR_SHUFFLEAsCONCAT_VECTORS(ShuffleVectorSDNode *SVN, SelectionDAG &DAG,
+ const RISCVSubtarget &Subtarget) {
+ assert(SVN->getOperand(1).isUndef());
+ SDValue V1 = SVN->getOperand(0);
+ if (V1.getOpcode() != ISD::INSERT_SUBVECTOR)
+ return SDValue();
+ if (!V1.getOperand(0).isUndef())
+ return SDValue();
+ SDValue InsertValue = V1.getOperand(1);
+ MVT SubVecVT = InsertValue.getSimpleValueType();
+ unsigned SubVecNumElements = SubVecVT.getVectorNumElements();
+ uint64_t InsertIndex = cast<ConstantSDNode>(V1.getOperand(2))->getZExtValue();
----------------
lukel97 wrote:
You could simplify the zero check and maybe move it beside the undef check
```c++
if (!V1.getOperand(0).isUndef() || V1.getConstantOperandVal(2) != 0)
return SDValue();
```
https://github.com/llvm/llvm-project/pull/109948
More information about the llvm-commits
mailing list