[llvm] 9e3b7e8 - [X86] getTargetVShiftByConstNode - use SelectionDAG::FoldConstantArithmetic to perform constant folding. NFCI.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 28 09:10:56 PDT 2022
Author: Simon Pilgrim
Date: 2022-04-28T17:10:20+01:00
New Revision: 9e3b7e8e656bdcf5aeafbac7b345a7b29272434c
URL: https://github.com/llvm/llvm-project/commit/9e3b7e8e656bdcf5aeafbac7b345a7b29272434c
DIFF: https://github.com/llvm/llvm-project/commit/9e3b7e8e656bdcf5aeafbac7b345a7b29272434c.diff
LOG: [X86] getTargetVShiftByConstNode - use SelectionDAG::FoldConstantArithmetic to perform constant folding. NFCI.
Remove some unnecessary code duplication.
Added:
Modified:
llvm/lib/Target/X86/X86ISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index c23c832cb2eb1..1faee7c833582 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -25797,53 +25797,23 @@ static SDValue getTargetVShiftByConstNode(unsigned Opc, const SDLoc &dl, MVT VT,
// Fold this packed vector shift into a build vector if SrcOp is a
// vector of Constants or UNDEFs.
if (ISD::isBuildVectorOfConstantSDNodes(SrcOp.getNode())) {
- SmallVector<SDValue, 8> Elts;
- unsigned NumElts = SrcOp->getNumOperands();
-
+ unsigned ShiftOpc;
switch (Opc) {
default: llvm_unreachable("Unknown opcode!");
case X86ISD::VSHLI:
- for (unsigned i = 0; i != NumElts; ++i) {
- SDValue CurrentOp = SrcOp->getOperand(i);
- if (CurrentOp->isUndef()) {
- // Must produce 0s in the correct bits.
- Elts.push_back(DAG.getConstant(0, dl, ElementType));
- continue;
- }
- auto *ND = cast<ConstantSDNode>(CurrentOp);
- const APInt &C = ND->getAPIntValue();
- Elts.push_back(DAG.getConstant(C.shl(ShiftAmt), dl, ElementType));
- }
+ ShiftOpc = ISD::SHL;
break;
case X86ISD::VSRLI:
- for (unsigned i = 0; i != NumElts; ++i) {
- SDValue CurrentOp = SrcOp->getOperand(i);
- if (CurrentOp->isUndef()) {
- // Must produce 0s in the correct bits.
- Elts.push_back(DAG.getConstant(0, dl, ElementType));
- continue;
- }
- auto *ND = cast<ConstantSDNode>(CurrentOp);
- const APInt &C = ND->getAPIntValue();
- Elts.push_back(DAG.getConstant(C.lshr(ShiftAmt), dl, ElementType));
- }
+ ShiftOpc = ISD::SRL;
break;
case X86ISD::VSRAI:
- for (unsigned i = 0; i != NumElts; ++i) {
- SDValue CurrentOp = SrcOp->getOperand(i);
- if (CurrentOp->isUndef()) {
- // All shifted in bits must be the same so use 0.
- Elts.push_back(DAG.getConstant(0, dl, ElementType));
- continue;
- }
- auto *ND = cast<ConstantSDNode>(CurrentOp);
- const APInt &C = ND->getAPIntValue();
- Elts.push_back(DAG.getConstant(C.ashr(ShiftAmt), dl, ElementType));
- }
+ ShiftOpc = ISD::SRA;
break;
}
- return DAG.getBuildVector(VT, dl, Elts);
+ SDValue Amt = DAG.getConstant(ShiftAmt, dl, VT);
+ if (SDValue C = DAG.FoldConstantArithmetic(ShiftOpc, dl, VT, {SrcOp, Amt}))
+ return C;
}
return DAG.getNode(Opc, dl, VT, SrcOp,
More information about the llvm-commits
mailing list