diff options
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 30dab43..537d0c4 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1038,7 +1038,7 @@ AliasResult BasicAAResult::aliasGEP( // Subtract the GEP2 pointer from the GEP1 pointer to find out their // symbolic difference. - subtractDecomposedGEPs(DecompGEP1, DecompGEP2); + subtractDecomposedGEPs(DecompGEP1, DecompGEP2, AAQI); // If an inbounds GEP would have to start from an out of bounds address // for the two to alias, then we can assume noalias. @@ -1222,7 +1222,7 @@ AliasResult BasicAAResult::aliasGEP( const VariableGEPIndex &Var0 = DecompGEP1.VarIndices[0]; const VariableGEPIndex &Var1 = DecompGEP1.VarIndices[1]; if (Var0.Scale == -Var1.Scale && Var0.Val.TruncBits == 0 && - Var0.Val.hasSameCastsAs(Var1.Val) && !MayBeCrossIteration && + Var0.Val.hasSameCastsAs(Var1.Val) && !AAQI.MayBeCrossIteration && isKnownNonEqual(Var0.Val.V, Var1.Val.V, DL, &AC, /* CxtI */ nullptr, DT)) MinAbsVarIndex = Var0.Scale.abs(); @@ -1238,7 +1238,7 @@ AliasResult BasicAAResult::aliasGEP( return AliasResult::NoAlias; } - if (constantOffsetHeuristic(DecompGEP1, V1Size, V2Size, &AC, DT)) + if (constantOffsetHeuristic(DecompGEP1, V1Size, V2Size, &AC, DT, AAQI)) return AliasResult::NoAlias; // Statically, we can see that the base objects are the same, but the @@ -1268,8 +1268,8 @@ BasicAAResult::aliasSelect(const SelectInst *SI, LocationSize SISize, // If the values are Selects with the same condition, we can do a more precise // check: just check for aliases between the values on corresponding arms. if (const SelectInst *SI2 = dyn_cast<SelectInst>(V2)) - if (isValueEqualInPotentialCycles(SI->getCondition(), - SI2->getCondition())) { + if (isValueEqualInPotentialCycles(SI->getCondition(), SI2->getCondition(), + AAQI)) { AliasResult Alias = AAQI.AAR.alias(MemoryLocation(SI->getTrueValue(), SISize), MemoryLocation(SI2->getTrueValue(), V2Size), AAQI); @@ -1398,7 +1398,7 @@ AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize, // In the recursive alias queries below, we may compare values from two // different loop iterations. - SaveAndRestore<bool> SavedMayBeCrossIteration(MayBeCrossIteration, true); + SaveAndRestore<bool> SavedMayBeCrossIteration(AAQI.MayBeCrossIteration, true); AliasResult Alias = AAQI.AAR.alias(MemoryLocation(V1Srcs[0], PNSize), MemoryLocation(V2, V2Size), AAQI); @@ -1452,7 +1452,7 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, // case. The function isValueEqualInPotentialCycles ensures that this cannot // happen by looking at the visited phi nodes and making sure they cannot // reach the value. - if (isValueEqualInPotentialCycles(V1, V2)) + if (isValueEqualInPotentialCycles(V1, V2, AAQI)) return AliasResult::MustAlias; if (!V1->getType()->isPointerTy() || !V2->getType()->isPointerTy()) @@ -1538,8 +1538,8 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, // otherwise infinitely recursive queries. Include MayBeCrossIteration in the // cache key, because some cases where MayBeCrossIteration==false returns // MustAlias or NoAlias may become MayAlias under MayBeCrossIteration==true. - AAQueryInfo::LocPair Locs({V1, V1Size, MayBeCrossIteration}, - {V2, V2Size, MayBeCrossIteration}); + AAQueryInfo::LocPair Locs({V1, V1Size, AAQI.MayBeCrossIteration}, + {V2, V2Size, AAQI.MayBeCrossIteration}); const bool Swapped = V1 > V2; if (Swapped) std::swap(Locs.first, Locs.second); @@ -1652,11 +1652,12 @@ AliasResult BasicAAResult::aliasCheckRecursive( /// are looking through phi nodes, that is we say /// noalias(V, phi(VA, VB)) if noalias(V, VA) and noalias(V, VB). bool BasicAAResult::isValueEqualInPotentialCycles(const Value *V, - const Value *V2) { + const Value *V2, + const AAQueryInfo &AAQI) { if (V != V2) return false; - if (!MayBeCrossIteration) + if (!AAQI.MayBeCrossIteration) return true; // Non-instructions and instructions in the entry block cannot be part of @@ -1674,7 +1675,8 @@ bool BasicAAResult::isValueEqualInPotentialCycles(const Value *V, /// Computes the symbolic difference between two de-composed GEPs. void BasicAAResult::subtractDecomposedGEPs(DecomposedGEP &DestGEP, - const DecomposedGEP &SrcGEP) { + const DecomposedGEP &SrcGEP, + const AAQueryInfo &AAQI) { DestGEP.Offset -= SrcGEP.Offset; for (const VariableGEPIndex &Src : SrcGEP.VarIndices) { // Find V in Dest. This is N^2, but pointer indices almost never have more @@ -1682,7 +1684,7 @@ void BasicAAResult::subtractDecomposedGEPs(DecomposedGEP &DestGEP, bool Found = false; for (auto I : enumerate(DestGEP.VarIndices)) { VariableGEPIndex &Dest = I.value(); - if (!isValueEqualInPotentialCycles(Dest.Val.V, Src.Val.V) || + if (!isValueEqualInPotentialCycles(Dest.Val.V, Src.Val.V, AAQI) || !Dest.Val.hasSameCastsAs(Src.Val)) continue; @@ -1706,9 +1708,12 @@ void BasicAAResult::subtractDecomposedGEPs(DecomposedGEP &DestGEP, } } -bool BasicAAResult::constantOffsetHeuristic( - const DecomposedGEP &GEP, LocationSize MaybeV1Size, - LocationSize MaybeV2Size, AssumptionCache *AC, DominatorTree *DT) { +bool BasicAAResult::constantOffsetHeuristic(const DecomposedGEP &GEP, + LocationSize MaybeV1Size, + LocationSize MaybeV2Size, + AssumptionCache *AC, + DominatorTree *DT, + const AAQueryInfo &AAQI) { if (GEP.VarIndices.size() != 2 || !MaybeV1Size.hasValue() || !MaybeV2Size.hasValue()) return false; @@ -1732,7 +1737,7 @@ bool BasicAAResult::constantOffsetHeuristic( LinearExpression E1 = GetLinearExpression(CastedValue(Var1.Val.V), DL, 0, AC, DT); if (E0.Scale != E1.Scale || !E0.Val.hasSameCastsAs(E1.Val) || - !isValueEqualInPotentialCycles(E0.Val.V, E1.Val.V)) + !isValueEqualInPotentialCycles(E0.Val.V, E1.Val.V, AAQI)) return false; // We have a hit - Var0 and Var1 only differ by a constant offset! |