[polly] r288516 - Do not allow multiple possibly aliasing ptrs in an expression

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 6 05:56:39 PST 2016


Hi Johannes,

do you have a test case for this?

Michael

2016-12-02 18:49 GMT+01:00 Johannes Doerfert via llvm-commits
<llvm-commits at lists.llvm.org>:
> Author: jdoerfert
> Date: Fri Dec  2 11:49:52 2016
> New Revision: 288516
>
> URL: http://llvm.org/viewvc/llvm-project?rev=288516&view=rev
> Log:
> Do not allow multiple possibly aliasing ptrs in an expression
>
>   Relational comparisons should not involve multiple potentially
>   aliasing pointers. Similarly this should hold for switch conditions
>   and the two conditions involved in equality comparisons (separately!).
>   This is a heuristic based on the C semantics that does only allow such
>   operations when the base pointers do point into the same object.
>   Since this makes aliasing likely we will bail out early instead of
>   producing a probably failing runtime check.
>
> Modified:
>     polly/trunk/include/polly/ScopDetection.h
>     polly/trunk/lib/Analysis/ScopDetection.cpp
>
> Modified: polly/trunk/include/polly/ScopDetection.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetection.h?rev=288516&r1=288515&r2=288516&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/ScopDetection.h (original)
> +++ polly/trunk/include/polly/ScopDetection.h Fri Dec  2 11:49:52 2016
> @@ -219,6 +219,16 @@ private:
>    /// Remove cached results for the children of @p R recursively.
>    void removeCachedResultsRecursively(const Region &R);
>
> +  /// Check if @p S0 and @p S1 do contain multiple possibly aliasing pointers.
> +  ///
> +  /// @param S0    A expression to check.
> +  /// @param S1    Another expression to check or nullptr.
> +  /// @param Scope The loop/scope the expressions are checked in.
> +  ///
> +  /// @returns True, if multiple possibly aliasing pointers are used in @p S0
> +  ///          (and @p S1 if given).
> +  bool involvesMultiplePtrs(const SCEV *S0, const SCEV *S1, Loop *Scope) const;
> +
>    /// Add the region @p AR as over approximated sub-region in @p Context.
>    ///
>    /// @param AR      The non-affine subregion.
>
> Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=288516&r1=288515&r2=288516&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopDetection.cpp Fri Dec  2 11:49:52 2016
> @@ -346,6 +346,40 @@ bool ScopDetection::onlyValidRequiredInv
>    return true;
>  }
>
> +bool ScopDetection::involvesMultiplePtrs(const SCEV *S0, const SCEV *S1,
> +                                         Loop *Scope) const {
> +  SetVector<Value *> Values;
> +  findValues(S0, *SE, Values);
> +  if (S1)
> +    findValues(S1, *SE, Values);
> +
> +  SmallPtrSet<Value *, 8> PtrVals;
> +  for (auto *V : Values) {
> +    if (auto *P2I = dyn_cast<PtrToIntInst>(V))
> +      V = P2I->getOperand(0);
> +
> +    if (!V->getType()->isPointerTy())
> +      continue;
> +
> +    auto *PtrSCEV = SE->getSCEVAtScope(V, Scope);
> +    if (isa<SCEVConstant>(PtrSCEV))
> +      continue;
> +
> +    auto *BasePtr = dyn_cast<SCEVUnknown>(SE->getPointerBase(PtrSCEV));
> +    if (!BasePtr)
> +      return true;
> +
> +    auto *BasePtrVal = BasePtr->getValue();
> +    if (PtrVals.insert(BasePtrVal).second) {
> +      for (auto *PtrVal : PtrVals)
> +        if (PtrVal != BasePtrVal && !AA->isNoAlias(PtrVal, BasePtrVal))
> +          return true;
> +    }
> +  }
> +
> +  return false;
> +}
> +
>  bool ScopDetection::isAffine(const SCEV *S, Loop *Scope,
>                               DetectionContext &Context) const {
>
> @@ -368,6 +402,10 @@ bool ScopDetection::isValidSwitch(BasicB
>    if (IsLoopBranch && L->isLoopLatch(&BB))
>      return false;
>
> +  // Check for invalid usage of different pointers in one expression.
> +  if (involvesMultiplePtrs(ConditionSCEV, nullptr, L))
> +    return false;
> +
>    if (isAffine(ConditionSCEV, L, Context))
>      return true;
>
> @@ -416,6 +454,15 @@ bool ScopDetection::isValidBranch(BasicB
>    const SCEV *LHS = SE->getSCEVAtScope(ICmp->getOperand(0), L);
>    const SCEV *RHS = SE->getSCEVAtScope(ICmp->getOperand(1), L);
>
> +  // Check for invalid usage of different pointers in one expression.
> +  if (ICmp->isEquality() && involvesMultiplePtrs(LHS, nullptr, L) &&
> +      involvesMultiplePtrs(RHS, nullptr, L))
> +    return false;
> +
> +  // Check for invalid usage of different pointers in a relational comparison.
> +  if (ICmp->isRelational() && involvesMultiplePtrs(LHS, RHS, L))
> +    return false;
> +
>    if (isAffine(LHS, L, Context) && isAffine(RHS, L, Context))
>      return true;
>
>
>
> _______________________________________________
> 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