[llvm] [RISCV] Use vrsub for select of add and sub of the same operands (PR #123400)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 17 19:45:34 PST 2025
================
@@ -17077,20 +17124,48 @@ static SDValue performCONCAT_VECTORSCombine(SDNode *N, SelectionDAG &DAG,
return DAG.getBitcast(VT.getSimpleVT(), StridedLoad);
}
-/// Custom legalize <N x i128> or <N x i256> to <M x ELEN>. This runs
-/// during the combine phase before type legalization, and relies on
-/// DAGCombine not undoing the transform if isShuffleMaskLegal returns false
-/// for the source mask.
static SDValue performVECTOR_SHUFFLECombine(SDNode *N, SelectionDAG &DAG,
const RISCVSubtarget &Subtarget,
const RISCVTargetLowering &TLI) {
SDLoc DL(N);
EVT VT = N->getValueType(0);
const unsigned ElementSize = VT.getScalarSizeInBits();
+ const unsigned NumElts = VT.getVectorNumElements();
SDValue V1 = N->getOperand(0);
SDValue V2 = N->getOperand(1);
ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(N)->getMask();
+ MVT XLenVT = Subtarget.getXLenVT();
+
+ // Recognized a disguised select of add/sub.
+ bool SwapCC;
+ if (ShuffleVectorInst::isSelectMask(Mask, NumElts) &&
+ matchSelectAddSub(V1, V2, SwapCC)) {
+ SDValue Sub = SwapCC ? V1 : V2;
+ SDValue A = Sub.getOperand(0);
+ SDValue B = Sub.getOperand(1);
+
+ SmallVector<SDValue> MaskVals;
+ for (int MaskIndex : Mask) {
+ bool SelectMaskVal = (MaskIndex < (int)NumElts);
+ MaskVals.push_back(DAG.getConstant(SelectMaskVal, DL, XLenVT));
+ }
+ assert(MaskVals.size() == NumElts && "Unexpected select-like shuffle");
+ MVT MaskVT = MVT::getVectorVT(MVT::i1, NumElts);
----------------
preames wrote:
I changed this to EVT, but oddly, my attempt at writing a test case failed. I tried a number of illegal types, and couldn't get the crash to trigger.
https://github.com/llvm/llvm-project/pull/123400
More information about the llvm-commits
mailing list