diff options
Diffstat (limited to 'llvm/lib/Target/RISCV/RISCVISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 165 | 
1 files changed, 76 insertions, 89 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index c6a8b84..c56ce3f 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -16495,6 +16495,35 @@ static SDValue expandMulToAddOrSubOfShl(SDNode *N, SelectionDAG &DAG,    return DAG.getNode(Op, DL, VT, Shift1, Shift2);  } +static SDValue getShlAddShlAdd(SDNode *N, SelectionDAG &DAG, unsigned ShX, +                               unsigned ShY) { +  SDLoc DL(N); +  EVT VT = N->getValueType(0); +  SDValue X = N->getOperand(0); +  SDValue Mul359 = DAG.getNode(RISCVISD::SHL_ADD, DL, VT, X, +                               DAG.getConstant(ShY, DL, VT), X); +  return DAG.getNode(RISCVISD::SHL_ADD, DL, VT, Mul359, +                     DAG.getConstant(ShX, DL, VT), Mul359); +} + +static SDValue expandMulToShlAddShlAdd(SDNode *N, SelectionDAG &DAG, +                                       uint64_t MulAmt) { +  switch (MulAmt) { +  case 5 * 3: +    return getShlAddShlAdd(N, DAG, 2, 1); +  case 9 * 3: +    return getShlAddShlAdd(N, DAG, 3, 1); +  case 5 * 5: +    return getShlAddShlAdd(N, DAG, 2, 2); +  case 9 * 5: +    return getShlAddShlAdd(N, DAG, 3, 2); +  case 9 * 9: +    return getShlAddShlAdd(N, DAG, 3, 3); +  default: +    return SDValue(); +  } +} +  // Try to expand a scalar multiply to a faster sequence.  static SDValue expandMul(SDNode *N, SelectionDAG &DAG,                           TargetLowering::DAGCombinerInfo &DCI, @@ -16524,18 +16553,17 @@ static SDValue expandMul(SDNode *N, SelectionDAG &DAG,    if (Subtarget.hasVendorXqciac() && isInt<12>(CNode->getSExtValue()))      return SDValue(); -  // WARNING: The code below is knowingly incorrect with regards to undef semantics. -  // We're adding additional uses of X here, and in principle, we should be freezing -  // X before doing so.  However, adding freeze here causes real regressions, and no -  // other target properly freezes X in these cases either. -  SDValue X = N->getOperand(0); - +  // WARNING: The code below is knowingly incorrect with regards to undef +  // semantics.  We're adding additional uses of X here, and in principle, we +  // should be freezing X before doing so.  However, adding freeze here causes +  // real regressions, and no other target properly freezes X in these cases +  // either.    if (Subtarget.hasShlAdd(3)) { +    SDValue X = N->getOperand(0);      int Shift;      if (int ShXAmount = isShifted359(MulAmt, Shift)) {        // 3/5/9 * 2^N -> shl (shXadd X, X), N        SDLoc DL(N); -      SDValue X = N->getOperand(0);        // Put the shift first if we can fold a zext into the shift forming        // a slli.uw.        if (X.getOpcode() == ISD::AND && isa<ConstantSDNode>(X.getOperand(1)) && @@ -16554,38 +16582,8 @@ static SDValue expandMul(SDNode *N, SelectionDAG &DAG,      }      // 3/5/9 * 3/5/9 -> shXadd (shYadd X, X), (shYadd X, X) -    int ShX; -    int ShY; -    switch (MulAmt) { -    case 3 * 5: -      ShY = 1; -      ShX = 2; -      break; -    case 3 * 9: -      ShY = 1; -      ShX = 3; -      break; -    case 5 * 5: -      ShX = ShY = 2; -      break; -    case 5 * 9: -      ShY = 2; -      ShX = 3; -      break; -    case 9 * 9: -      ShX = ShY = 3; -      break; -    default: -      ShX = ShY = 0; -      break; -    } -    if (ShX) { -      SDLoc DL(N); -      SDValue Mul359 = DAG.getNode(RISCVISD::SHL_ADD, DL, VT, X, -                                   DAG.getConstant(ShY, DL, VT), X); -      return DAG.getNode(RISCVISD::SHL_ADD, DL, VT, Mul359, -                         DAG.getConstant(ShX, DL, VT), Mul359); -    } +    if (SDValue V = expandMulToShlAddShlAdd(N, DAG, MulAmt)) +      return V;      // If this is a power 2 + 2/4/8, we can use a shift followed by a single      // shXadd. First check if this a sum of two power of 2s because that's @@ -16648,23 +16646,12 @@ static SDValue expandMul(SDNode *N, SelectionDAG &DAG,        }      } -    for (uint64_t Divisor : {3, 5, 9}) { -      if (MulAmt % Divisor != 0) -        continue; -      uint64_t MulAmt2 = MulAmt / Divisor; -      // 3/5/9 * 3/5/9 * 2^N - In particular, this covers multiples -      // of 25 which happen to be quite common. -      if (int ShBAmount = isShifted359(MulAmt2, Shift)) { -        SDLoc DL(N); -        SDValue Mul359A = -            DAG.getNode(RISCVISD::SHL_ADD, DL, VT, X, -                        DAG.getConstant(Log2_64(Divisor - 1), DL, VT), X); -        SDValue Mul359B = -            DAG.getNode(RISCVISD::SHL_ADD, DL, VT, Mul359A, -                        DAG.getConstant(ShBAmount, DL, VT), Mul359A); -        return DAG.getNode(ISD::SHL, DL, VT, Mul359B, -                           DAG.getConstant(Shift, DL, VT)); -      } +    // 3/5/9 * 3/5/9 * 2^N - In particular, this covers multiples +    // of 25 which happen to be quite common. +    Shift = llvm::countr_zero(MulAmt); +    if (SDValue V = expandMulToShlAddShlAdd(N, DAG, MulAmt >> Shift)) { +      SDLoc DL(N); +      return DAG.getNode(ISD::SHL, DL, VT, V, DAG.getConstant(Shift, DL, VT));      }    } @@ -23946,7 +23933,7 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,                                 .Case("{t0}", RISCV::X5)                                 .Case("{t1}", RISCV::X6)                                 .Case("{t2}", RISCV::X7) -                               .Cases("{s0}", "{fp}", RISCV::X8) +                               .Cases({"{s0}", "{fp}"}, RISCV::X8)                                 .Case("{s1}", RISCV::X9)                                 .Case("{a0}", RISCV::X10)                                 .Case("{a1}", RISCV::X11) @@ -23983,38 +23970,38 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,    // use the ABI names in register constraint lists.    if (Subtarget.hasStdExtF()) {      unsigned FReg = StringSwitch<unsigned>(Constraint.lower()) -                        .Cases("{f0}", "{ft0}", RISCV::F0_F) -                        .Cases("{f1}", "{ft1}", RISCV::F1_F) -                        .Cases("{f2}", "{ft2}", RISCV::F2_F) -                        .Cases("{f3}", "{ft3}", RISCV::F3_F) -                        .Cases("{f4}", "{ft4}", RISCV::F4_F) -                        .Cases("{f5}", "{ft5}", RISCV::F5_F) -                        .Cases("{f6}", "{ft6}", RISCV::F6_F) -                        .Cases("{f7}", "{ft7}", RISCV::F7_F) -                        .Cases("{f8}", "{fs0}", RISCV::F8_F) -                        .Cases("{f9}", "{fs1}", RISCV::F9_F) -                        .Cases("{f10}", "{fa0}", RISCV::F10_F) -                        .Cases("{f11}", "{fa1}", RISCV::F11_F) -                        .Cases("{f12}", "{fa2}", RISCV::F12_F) -                        .Cases("{f13}", "{fa3}", RISCV::F13_F) -                        .Cases("{f14}", "{fa4}", RISCV::F14_F) -                        .Cases("{f15}", "{fa5}", RISCV::F15_F) -                        .Cases("{f16}", "{fa6}", RISCV::F16_F) -                        .Cases("{f17}", "{fa7}", RISCV::F17_F) -                        .Cases("{f18}", "{fs2}", RISCV::F18_F) -                        .Cases("{f19}", "{fs3}", RISCV::F19_F) -                        .Cases("{f20}", "{fs4}", RISCV::F20_F) -                        .Cases("{f21}", "{fs5}", RISCV::F21_F) -                        .Cases("{f22}", "{fs6}", RISCV::F22_F) -                        .Cases("{f23}", "{fs7}", RISCV::F23_F) -                        .Cases("{f24}", "{fs8}", RISCV::F24_F) -                        .Cases("{f25}", "{fs9}", RISCV::F25_F) -                        .Cases("{f26}", "{fs10}", RISCV::F26_F) -                        .Cases("{f27}", "{fs11}", RISCV::F27_F) -                        .Cases("{f28}", "{ft8}", RISCV::F28_F) -                        .Cases("{f29}", "{ft9}", RISCV::F29_F) -                        .Cases("{f30}", "{ft10}", RISCV::F30_F) -                        .Cases("{f31}", "{ft11}", RISCV::F31_F) +                        .Cases({"{f0}", "{ft0}"}, RISCV::F0_F) +                        .Cases({"{f1}", "{ft1}"}, RISCV::F1_F) +                        .Cases({"{f2}", "{ft2}"}, RISCV::F2_F) +                        .Cases({"{f3}", "{ft3}"}, RISCV::F3_F) +                        .Cases({"{f4}", "{ft4}"}, RISCV::F4_F) +                        .Cases({"{f5}", "{ft5}"}, RISCV::F5_F) +                        .Cases({"{f6}", "{ft6}"}, RISCV::F6_F) +                        .Cases({"{f7}", "{ft7}"}, RISCV::F7_F) +                        .Cases({"{f8}", "{fs0}"}, RISCV::F8_F) +                        .Cases({"{f9}", "{fs1}"}, RISCV::F9_F) +                        .Cases({"{f10}", "{fa0}"}, RISCV::F10_F) +                        .Cases({"{f11}", "{fa1}"}, RISCV::F11_F) +                        .Cases({"{f12}", "{fa2}"}, RISCV::F12_F) +                        .Cases({"{f13}", "{fa3}"}, RISCV::F13_F) +                        .Cases({"{f14}", "{fa4}"}, RISCV::F14_F) +                        .Cases({"{f15}", "{fa5}"}, RISCV::F15_F) +                        .Cases({"{f16}", "{fa6}"}, RISCV::F16_F) +                        .Cases({"{f17}", "{fa7}"}, RISCV::F17_F) +                        .Cases({"{f18}", "{fs2}"}, RISCV::F18_F) +                        .Cases({"{f19}", "{fs3}"}, RISCV::F19_F) +                        .Cases({"{f20}", "{fs4}"}, RISCV::F20_F) +                        .Cases({"{f21}", "{fs5}"}, RISCV::F21_F) +                        .Cases({"{f22}", "{fs6}"}, RISCV::F22_F) +                        .Cases({"{f23}", "{fs7}"}, RISCV::F23_F) +                        .Cases({"{f24}", "{fs8}"}, RISCV::F24_F) +                        .Cases({"{f25}", "{fs9}"}, RISCV::F25_F) +                        .Cases({"{f26}", "{fs10}"}, RISCV::F26_F) +                        .Cases({"{f27}", "{fs11}"}, RISCV::F27_F) +                        .Cases({"{f28}", "{ft8}"}, RISCV::F28_F) +                        .Cases({"{f29}", "{ft9}"}, RISCV::F29_F) +                        .Cases({"{f30}", "{ft10}"}, RISCV::F30_F) +                        .Cases({"{f31}", "{ft11}"}, RISCV::F31_F)                          .Default(RISCV::NoRegister);      if (FReg != RISCV::NoRegister) {        assert(RISCV::F0_F <= FReg && FReg <= RISCV::F31_F && "Unknown fp-reg");  | 
