diff --git a/llvm/lib/Target/PowerPC/PPCLoopInstrFormPrep.cpp b/llvm/lib/Target/PowerPC/PPCLoopInstrFormPrep.cpp --- a/llvm/lib/Target/PowerPC/PPCLoopInstrFormPrep.cpp +++ b/llvm/lib/Target/PowerPC/PPCLoopInstrFormPrep.cpp @@ -174,6 +174,7 @@ LoopInfo *LI; ScalarEvolution *SE; bool PreserveLCSSA; + bool HasCandidateForPrepare; /// Successful preparation number for Update/DS/DQ form in all inner most /// loops. One successful preparation will put one common base out of loop, @@ -570,6 +571,9 @@ if (!LARSCEV || LARSCEV->getLoop() != L) continue; + // Mark that we have candidates for preparing. + HasCandidateForPrepare = true; + if (isValidCandidate(&J, PtrValue, PointerElementType)) addOneCandidate(&J, LSCEV, Buckets, MaxCandidateNum); } @@ -1046,6 +1050,8 @@ return ST && ST->hasP9Vector() && (PointerElementType->isVectorTy()); }; + HasCandidateForPrepare = false; + // Collect buckets of comparable addresses used by loads and stores for update // form. SmallVector UpdateFormBuckets = @@ -1054,6 +1060,9 @@ // Prepare for update form. if (!UpdateFormBuckets.empty()) MadeChange |= updateFormPrep(L, UpdateFormBuckets); + else if (!HasCandidateForPrepare) + // If no candidate for preparing, return early. + return MadeChange; // Collect buckets of comparable addresses used by loads and stores for DS // form.