[PATCH] D81189: [Reassociate] Teach ConvertShiftToMul to preserve nsw flag if the shift amount is not bitwidth - 1.

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 4 13:16:25 PDT 2020


lebedev.ri added reviewers: nlopes, sanjoy.
lebedev.ri added a comment.

Grepping a bit, there's this:

  const SCEV *ScalarEvolution::createSCEV(Value *V) {
  <...>
  
      case Instruction::Shl:
        // Turn shift left of a constant amount into a multiply.
        if (ConstantInt *SA = dyn_cast<ConstantInt>(BO->RHS)) {
          uint32_t BitWidth = cast<IntegerType>(SA->getType())->getBitWidth();
  
          // If the shift count is not less than the bitwidth, the result of
          // the shift is undefined. Don't try to analyze it, because the
          // resolution chosen here may differ from the resolution chosen in
          // other parts of the compiler.
          if (SA->getValue().uge(BitWidth))
            break;
  
          // It is currently not resolved how to interpret NSW for left
          // shift by BitWidth - 1, so we avoid applying flags in that
          // case. Remove this check (or this comment) once the situation
          // is resolved. See
          // http://lists.llvm.org/pipermail/llvm-dev/2015-April/084195.html
          // and http://reviews.llvm.org/D8890 .
          auto Flags = SCEV::FlagAnyWrap;
          if (BO->Op && SA->getValue().ult(BitWidth - 1))
            Flags = getNoWrapFlagsFromUB(BO->Op);
  
          Constant *X = ConstantInt::get(
              getContext(), APInt::getOneBitSet(BitWidth, SA->getZExtValue()));
          return getMulExpr(getSCEV(BO->LHS), getSCEV(X), Flags);
        }
        break;

But apparently langref was fixed in rL286785 <https://reviews.llvm.org/rL286785>, so we're good and i'll post SCEV patch.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D81189/new/

https://reviews.llvm.org/D81189





More information about the llvm-commits mailing list