[llvm] r306695 - ScalarEvolution: Add URem support

Robinson, Paul via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 29 11:35:57 PDT 2017


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


More information about the llvm-commits mailing list