[llvm] [SelectionDAG][Darwin] Convert insert 0 to AND with bitmask (PR #142428)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 2 10:02:13 PDT 2025
================
@@ -26057,11 +26057,67 @@ static SDValue removeRedundantInsertVectorElt(SDNode *N) {
return ExtractVec;
}
+// On Darwin, instead of explictly inserting 0 into a vector, which results in
+// a costly move from an integer to a vector register, use a bitmask to zero
+// out the corresponding lane.
+static SDValue convertInsertVectorEltToAnd(SDNode *N, SelectionDAG &DAG,
+ const AArch64Subtarget *Subtarget) {
+ assert(N->getOpcode() == ISD::INSERT_VECTOR_ELT && "Unexpected node!");
+
+ if (!Subtarget->isTargetDarwin())
+ return SDValue();
+
+ SDValue InsertVec = N->getOperand(0);
+ SDValue InsertVal = N->getOperand(1);
+ SDValue InsertIdx = N->getOperand(2);
+
+ ConstantSDNode *ConstIdx = dyn_cast<ConstantSDNode>(InsertIdx);
+
+ // Only handle constant 0 insertion into a known index.
+ if (!(isNullConstant(InsertVal) || isNullFPConstant(InsertVal)))
+ return SDValue();
+ if (!ConstIdx)
+ return SDValue();
+
+ unsigned Lane = ConstIdx->getZExtValue();
----------------
fhahn wrote:
Needs tests with different indices?
https://github.com/llvm/llvm-project/pull/142428
More information about the llvm-commits
mailing list