diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Scalar/SROA.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Scalar/SROA.cpp | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Scalar/SROA.cpp b/contrib/llvm-project/llvm/lib/Transforms/Scalar/SROA.cpp index 143a035749c7..644c5c82e58e 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Scalar/SROA.cpp @@ -1210,8 +1210,7 @@ static bool isSafePHIToSpeculate(PHINode &PN) {    BasicBlock *BB = PN.getParent();    Align MaxAlign;    uint64_t APWidth = DL.getIndexTypeSizeInBits(PN.getType()); -  APInt MaxSize(APWidth, 0); -  bool HaveLoad = false; +  Type *LoadType = nullptr;    for (User *U : PN.users()) {      LoadInst *LI = dyn_cast<LoadInst>(U);      if (!LI || !LI->isSimple()) @@ -1223,21 +1222,27 @@ static bool isSafePHIToSpeculate(PHINode &PN) {      if (LI->getParent() != BB)        return false; +    if (LoadType) { +      if (LoadType != LI->getType()) +        return false; +    } else { +      LoadType = LI->getType(); +    } +      // Ensure that there are no instructions between the PHI and the load that      // could store.      for (BasicBlock::iterator BBI(PN); &*BBI != LI; ++BBI)        if (BBI->mayWriteToMemory())          return false; -    uint64_t Size = DL.getTypeStoreSize(LI->getType()).getFixedSize();      MaxAlign = std::max(MaxAlign, LI->getAlign()); -    MaxSize = MaxSize.ult(Size) ? APInt(APWidth, Size) : MaxSize; -    HaveLoad = true;    } -  if (!HaveLoad) +  if (!LoadType)      return false; +  APInt LoadSize = APInt(APWidth, DL.getTypeStoreSize(LoadType).getFixedSize()); +    // We can only transform this if it is safe to push the loads into the    // predecessor blocks. The only thing to watch out for is that we can't put    // a possibly trapping load in the predecessor if it is a critical edge. @@ -1259,7 +1264,7 @@ static bool isSafePHIToSpeculate(PHINode &PN) {      // If this pointer is always safe to load, or if we can prove that there      // is already a load in the block, then we can move the load to the pred      // block. -    if (isSafeToLoadUnconditionally(InVal, MaxAlign, MaxSize, DL, TI)) +    if (isSafeToLoadUnconditionally(InVal, MaxAlign, LoadSize, DL, TI))        continue;      return false;  | 
