diff options
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 32 | ||||
| -rw-r--r-- | llvm/lib/Analysis/TargetTransformInfo.cpp | 1 | 
2 files changed, 29 insertions, 4 deletions
| diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 24e4bf5894b..d7f4ebe3b9b 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -471,10 +471,7 @@ namespace {                                 const Location &Loc) override;      ModRefResult getModRefInfo(ImmutableCallSite CS1, -                               ImmutableCallSite CS2) override { -      // The AliasAnalysis base class has some smarts, lets use them. -      return AliasAnalysis::getModRefInfo(CS1, CS2); -    } +                               ImmutableCallSite CS2) override;      /// pointsToConstantMemory - Chase pointers until we find a (constant      /// global) or not. @@ -788,6 +785,14 @@ BasicAliasAnalysis::getArgLocation(ImmutableCallSite CS, unsigned ArgIdx,    return Loc;  } +static bool isAssumeIntrinsic(ImmutableCallSite CS) { +  const IntrinsicInst *II = dyn_cast<IntrinsicInst>(CS.getInstruction()); +  if (II && II->getIntrinsicID() == Intrinsic::assume) +    return true; + +  return false; +} +  /// getModRefInfo - Check to see if the specified callsite can clobber the  /// specified memory object.  Since we only look at local properties of this  /// function, we really can't say much about this query.  We do, however, use @@ -840,10 +845,29 @@ BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS,        return NoModRef;    } +  // While the assume intrinsic is marked as arbitrarily writing so that +  // proper control dependencies will be maintained, it never aliases any +  // particular memory location. +  if (isAssumeIntrinsic(CS)) +    return NoModRef; +    // The AliasAnalysis base class has some smarts, lets use them.    return AliasAnalysis::getModRefInfo(CS, Loc);  } +AliasAnalysis::ModRefResult +BasicAliasAnalysis::getModRefInfo(ImmutableCallSite CS1, +                                  ImmutableCallSite CS2) { +  // While the assume intrinsic is marked as arbitrarily writing so that +  // proper control dependencies will be maintained, it never aliases any +  // particular memory location. +  if (isAssumeIntrinsic(CS1) || isAssumeIntrinsic(CS2)) +    return NoModRef; + +  // The AliasAnalysis base class has some smarts, lets use them. +  return AliasAnalysis::getModRefInfo(CS1, CS2); +} +  /// aliasGEP - Provide a bunch of ad-hoc rules to disambiguate a GEP instruction  /// against another pointer.  We know that V1 is a GEP, but we don't know  /// anything about V2.  UnderlyingV1 is GetUnderlyingObject(GEP1, DL), diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp index cdb0b79fd7e..888b5cef2f8 100644 --- a/llvm/lib/Analysis/TargetTransformInfo.cpp +++ b/llvm/lib/Analysis/TargetTransformInfo.cpp @@ -385,6 +385,7 @@ struct NoTTI final : ImmutablePass, TargetTransformInfo {        // FIXME: This is wrong for libc intrinsics.        return TCC_Basic; +    case Intrinsic::assume:      case Intrinsic::dbg_declare:      case Intrinsic::dbg_value:      case Intrinsic::invariant_start: | 

