[llvm] r306695 - ScalarEvolution: Add URem support

Alexandre Isoard via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 29 11:56:01 PDT 2017


I am extremely sorry about the noise.

I reverted my commit to investigate this test case.
I think that is because the expected output get slightly changed, but I
prefer to be cautious and revert my commit for now.

Do you know where to find information about PR30742 (name of the failing
function).
It is full of undef and I can't make sense of it. Probably a bugpoint
generated case.

On Thu, Jun 29, 2017 at 7:35 PM, Robinson, Paul <paul.robinson at sony.com>
wrote:

> This is causing multiple bots to fail, can you revert or fix please?
> Failing Tests (1):
>     LLVM :: Transforms/LoopVectorize/iv_outside_user.ll
>
> Thanks,
> --paulr
>
> > -----Original Message-----
> > From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
> Behalf
> > Of Alexandre Isoard via llvm-commits
> > Sent: Thursday, June 29, 2017 12:29 PM
> > To: llvm-commits at lists.llvm.org
> > Subject: [llvm] r306695 - ScalarEvolution: Add URem support
> >
> > Author: aisoard
> > Date: Thu Jun 29 09:29:04 2017
> > New Revision: 306695
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=306695&view=rev
> > Log:
> > ScalarEvolution: Add URem support
> >
> > In LLVM IR the following code:
> >
> >     %r = urem <ty> %t, %b
> >
> > is equivalent to:
> >
> >     %q = udiv <ty> %t, %b
> >     %s = mul <ty> nuw %q, %b
> >     %r = sub <ty> nuw %t, %q ; (t / b) * b + (t % b) = t
> >
> > As UDiv, Mul and Sub are already supported by SCEV, URem can be
> > implemented with minimal effort this way.
> >
> > Note: While SRem and SDiv are also related this way, SCEV does not
> > provides SDiv yet.
> >
> >
> > Added:
> >     llvm/trunk/test/Analysis/ScalarEvolution/flattened.ll
> >     llvm/trunk/test/Analysis/ScalarEvolution/urem-0.ll
> > Modified:
> >     llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
> >     llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> >
> > Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
> > URL: http://llvm.org/viewvc/llvm-
> > project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.
> h?rev=306695&r1=3
> > 06694&r2=306695&view=diff
> > ============================================================
> ==============
> > ====
> > --- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)
> > +++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Thu Jun 29
> 09:29:04
> > 2017
> > @@ -1244,6 +1244,7 @@ public:
> >    }
> >    const SCEV *getUDivExpr(const SCEV *LHS, const SCEV *RHS);
> >    const SCEV *getUDivExactExpr(const SCEV *LHS, const SCEV *RHS);
> > +  const SCEV *getURemExpr(const SCEV *LHS, const SCEV *RHS);
> >    const SCEV *getAddRecExpr(const SCEV *Start, const SCEV *Step, const
> > Loop *L,
> >                              SCEV::NoWrapFlags Flags);
> >    const SCEV *getAddRecExpr(SmallVectorImpl<const SCEV *> &Operands,
> >
> > Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> > URL: http://llvm.org/viewvc/llvm-
> > project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?
> rev=306695&r1=306694&r
> > 2=306695&view=diff
> > ============================================================
> ==============
> > ====
> > --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> > +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Thu Jun 29 09:29:04 2017
> > @@ -2935,6 +2935,29 @@ const SCEV *ScalarEvolution::getMulExpr(
> >    return getOrCreateMulExpr(Ops, Flags);
> >  }
> >
> > +/// Represents an unsigned remainder expression based on unsigned
> > division.
> > +const SCEV *ScalarEvolution::getURemExpr(const SCEV *LHS,
> > +                                         const SCEV *RHS) {
> > +  assert(getEffectiveSCEVType(LHS->getType()) ==
> > +         getEffectiveSCEVType(RHS->getType()) &&
> > +         "SCEVURemExpr operand types don't match!");
> > +
> > +  // TODO:
> > +  //  - short circuit '%a = %x urem %x --> 0' (why is it not done for
> > udiv?)
> > +  //  - short circuit '%a = %x urem 0 --> %a' (same as for udiv)
> > +  //  - update upper-bound and lower-bound cache for the final result
> > +  //    (or improve how subtraction is estimated)
> > +
> > +  // Short-circuit easy cases
> > +  if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS))
> > +    if (RHSC->getValue()->equalsInt(1))
> > +      return getZero(LHS->getType()); // X urem 1 --> 0
> > +
> > +  const SCEV *UDiv = getUDivExpr(LHS, RHS);
> > +  const SCEV *Mult = getMulExpr(UDiv, RHS, SCEV::FlagNUW);
> > +  return getMinusSCEV(LHS, Mult, SCEV::FlagNUW);
> > +}
> > +
> >  /// Get a canonical unsigned division expression, or something simpler
> if
> >  /// possible.
> >  const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
> > @@ -4095,6 +4118,7 @@ static Optional<BinaryOp> MatchBinaryOp(
> >    case Instruction::Sub:
> >    case Instruction::Mul:
> >    case Instruction::UDiv:
> > +  case Instruction::URem:
> >    case Instruction::And:
> >    case Instruction::Or:
> >    case Instruction::AShr:
> > @@ -5416,6 +5440,8 @@ const SCEV *ScalarEvolution::createSCEV(
> >      }
> >      case Instruction::UDiv:
> >        return getUDivExpr(getSCEV(BO->LHS), getSCEV(BO->RHS));
> > +    case Instruction::URem:
> > +      return getURemExpr(getSCEV(BO->LHS), getSCEV(BO->RHS));
> >      case Instruction::Sub: {
> >        SCEV::NoWrapFlags Flags = SCEV::FlagAnyWrap;
> >        if (BO->Op)
> >
> > Added: llvm/trunk/test/Analysis/ScalarEvolution/flattened.ll
> > URL: http://llvm.org/viewvc/llvm-
> > project/llvm/trunk/test/Analysis/ScalarEvolution/
> flattened.ll?rev=306695&v
> > iew=auto
> > ============================================================
> ==============
> > ====
> > --- llvm/trunk/test/Analysis/ScalarEvolution/flattened.ll (added)
> > +++ llvm/trunk/test/Analysis/ScalarEvolution/flattened.ll Thu Jun 29
> > 09:29:04 2017
> > @@ -0,0 +1,22 @@
> > +; RUN: opt < %s -scalar-evolution -analyze | FileCheck %s
> > +
> > +
> > +define void @foo([7 x i8]* %a) {
> > +entry:
> > +     br label %bb
> > +
> > +bb:
> > +     %idx = phi i64 [ 0, %entry ], [ %idx.incr, %bb ]
> > +     %i = udiv i64 %idx, 7
> > +     %j = urem i64 %idx, 7
> > +     %a.ptr = getelementptr [7 x i8], [7 x i8]* %a, i64 %i, i64 %j
> > +; CHECK: %a.ptr
> > +; CHECK-NEXT: -->  {%a,+,1}<nw><%bb>
> > +     %val = load i8, i8* %a.ptr
> > +     %idx.incr = add i64 %idx, 1
> > +     %test = icmp ne i64 %idx.incr, 35
> > +     br i1 %test, label %bb, label %exit
> > +
> > +exit:
> > +     ret void
> > +}
> >
> > Added: llvm/trunk/test/Analysis/ScalarEvolution/urem-0.ll
> > URL: http://llvm.org/viewvc/llvm-
> > project/llvm/trunk/test/Analysis/ScalarEvolution/urem-
> > 0.ll?rev=306695&view=auto
> > ============================================================
> ==============
> > ====
> > --- llvm/trunk/test/Analysis/ScalarEvolution/urem-0.ll (added)
> > +++ llvm/trunk/test/Analysis/ScalarEvolution/urem-0.ll Thu Jun 29
> 09:29:04
> > 2017
> > @@ -0,0 +1,15 @@
> > +; RUN: opt < %s -scalar-evolution -analyze | FileCheck %s
> > +
> > +define i8 @foo(i8 %a) {
> > +        %t0 = urem i8 %a, 27
> > +; CHECK: %t0
> > +; CHECK-NEXT: -->  ((-27 * (%a /u 27)) + %a)
> > +        ret i8 %t0
> > +}
> > +
> > +define i8 @bar(i8 %a) {
> > +        %t1 = urem i8 %a, 1
> > +; CHECK: %t1
> > +; CHECK-NEXT: -->  0
> > +        ret i8 %t1
> > +}
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
*Alexandre Isoard*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170629/b411513d/attachment.html>


More information about the llvm-commits mailing list