diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/ValueTracking.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Analysis/ValueTracking.cpp | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/Analysis/ValueTracking.cpp b/contrib/llvm-project/llvm/lib/Analysis/ValueTracking.cpp index 16d78c1ded6d..940ae9eb7ee2 100644 --- a/contrib/llvm-project/llvm/lib/Analysis/ValueTracking.cpp +++ b/contrib/llvm-project/llvm/lib/Analysis/ValueTracking.cpp @@ -485,7 +485,8 @@ bool llvm::isAssumeLikeIntrinsic(const Instruction *I) {  bool llvm::isValidAssumeForContext(const Instruction *Inv,                                     const Instruction *CxtI, -                                   const DominatorTree *DT) { +                                   const DominatorTree *DT, +                                   bool AllowEphemerals) {    // There are two restrictions on the use of an assume:    //  1. The assume must dominate the context (or the control flow must    //     reach the assume whenever it reaches the context). @@ -503,7 +504,7 @@ bool llvm::isValidAssumeForContext(const Instruction *Inv,      // Don't let an assume affect itself - this would cause the problems      // `isEphemeralValueOf` is trying to prevent, and it would also make      // the loop below go out of bounds. -    if (Inv == CxtI) +    if (!AllowEphemerals && Inv == CxtI)        return false;      // The context comes first, but they're both in the same block. @@ -516,7 +517,7 @@ bool llvm::isValidAssumeForContext(const Instruction *Inv,      if (!isGuaranteedToTransferExecutionToSuccessor(Range, 15))        return false; -    return !isEphemeralValueOf(Inv, CxtI); +    return AllowEphemerals || !isEphemeralValueOf(Inv, CxtI);    }    // Inv and CxtI are in different blocks. @@ -1196,7 +1197,7 @@ static void computeKnownBitsFromOperator(const Operator *I,        unsigned IndexBitWidth = Index->getType()->getScalarSizeInBits();        KnownBits IndexBits(IndexBitWidth);        computeKnownBits(Index, IndexBits, Depth + 1, Q); -      TypeSize IndexTypeSize = Q.DL.getTypeAllocSize(IndexedTy); +      TypeSize IndexTypeSize = GTI.getSequentialElementStride(Q.DL);        uint64_t TypeSizeInBytes = IndexTypeSize.getKnownMinValue();        KnownBits ScalingFactor(IndexBitWidth);        // Multiply by current sizeof type. @@ -2128,7 +2129,7 @@ static bool isGEPKnownNonNull(const GEPOperator *GEP, unsigned Depth,      }      // If we have a zero-sized type, the index doesn't matter. Keep looping. -    if (Q.DL.getTypeAllocSize(GTI.getIndexedType()).isZero()) +    if (GTI.getSequentialElementStride(Q.DL).isZero())        continue;      // Fast path the constant operand case both for efficiency and so we don't  | 
