From caa9f63022d28cc38bfb85a11a84a6704f6aaa74 Mon Sep 17 00:00:00 2001 From: Han-Kuan Chen Date: Tue, 8 Nov 2022 01:43:11 -0800 Subject: [PATCH] [CodeGen] Refactor visitSCALAR_TO_VECTOR. NFC. Differential Revision: https://reviews.llvm.org/D137688 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 40 ++++++++++----------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 8989ea3..cae40db 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -23536,36 +23536,26 @@ SDValue DAGCombiner::visitSCALAR_TO_VECTOR(SDNode *N) { DAG.isSafeToSpeculativelyExecute(Opcode) && hasOperation(Opcode, VT)) { // Match an extract element and get a shuffle mask equivalent. SmallVector ShufMask(VT.getVectorNumElements(), -1); - auto getShuffleMaskForExtElt = [&](SDValue EE) { - if (EE.getOpcode() == ISD::EXTRACT_VECTOR_ELT && + + for (int i : {0, 1}) { + // s2v (bo (extelt V, Idx), C) --> shuffle (bo V, C'), {Idx, -1, -1...} + // s2v (bo C, (extelt V, Idx)) --> shuffle (bo C', V), {Idx, -1, -1...} + SDValue EE = Scalar.getOperand(i); + auto *C = dyn_cast(Scalar.getOperand(i ? 0 : 1)); + if (C && EE.getOpcode() == ISD::EXTRACT_VECTOR_ELT && EE.getOperand(0).getValueType() == VT && isa(EE.getOperand(1))) { // Mask = {ExtractIndex, undef, undef....} ShufMask[0] = EE.getConstantOperandVal(1); // Make sure the shuffle is legal if we are crossing lanes. - return TLI.isShuffleMaskLegal(ShufMask, VT); - } - return false; - }; - - // s2v (bo (extelt V, Idx), C) --> shuffle (bo V, C'), {Idx, -1, -1...} - if (auto *C = dyn_cast(Scalar.getOperand(1))) { - if (getShuffleMaskForExtElt(Scalar.getOperand(0))) { - SDLoc DL(N); - SDValue V = Scalar.getOperand(0).getOperand(0); - SDValue VecC = DAG.getConstant(C->getAPIntValue(), DL, VT); - SDValue VecBO = DAG.getNode(Opcode, DL, VT, V, VecC); - return DAG.getVectorShuffle(VT, DL, VecBO, DAG.getUNDEF(VT), ShufMask); - } - } - // s2v (bo C, (extelt V, Idx)) --> shuffle (bo C', V), {Idx, -1, -1...} - if (auto *C = dyn_cast(Scalar.getOperand(0))) { - if (getShuffleMaskForExtElt(Scalar.getOperand(1))) { - SDLoc DL(N); - SDValue V = Scalar.getOperand(1).getOperand(0); - SDValue VecC = DAG.getConstant(C->getAPIntValue(), DL, VT); - SDValue VecBO = DAG.getNode(Opcode, DL, VT, VecC, V); - return DAG.getVectorShuffle(VT, DL, VecBO, DAG.getUNDEF(VT), ShufMask); + if (TLI.isShuffleMaskLegal(ShufMask, VT)) { + SDLoc DL(N); + SDValue V[] = {EE.getOperand(0), + DAG.getConstant(C->getAPIntValue(), DL, VT)}; + SDValue VecBO = DAG.getNode(Opcode, DL, VT, V[i], V[1 - i]); + return DAG.getVectorShuffle(VT, DL, VecBO, DAG.getUNDEF(VT), + ShufMask); + } } } } -- 2.7.4