Index: lib/Transforms/Scalar/GVNHoist.cpp =================================================================== --- lib/Transforms/Scalar/GVNHoist.cpp +++ lib/Transforms/Scalar/GVNHoist.cpp @@ -391,6 +391,10 @@ continue; } + // Stop walk once the limit is reached. + if (NBBsOnAllPaths == 0) + return true; + // Impossible to hoist with exceptions on the path. if (hasEH(*I)) return true; @@ -399,10 +403,6 @@ if (hasMemoryUse(NewPt, Def, *I)) return true; - // Stop walk once the limit is reached. - if (NBBsOnAllPaths == 0) - return true; - // -1 is unlimited number of blocks on all paths. if (NBBsOnAllPaths != -1) --NBBsOnAllPaths; @@ -433,14 +433,14 @@ continue; } - // Impossible to hoist with exceptions on the path. - if (hasEH(*I)) - return true; - // Stop walk once the limit is reached. if (NBBsOnAllPaths == 0) return true; + // Impossible to hoist with exceptions on the path. + if (hasEH(*I)) + return true; + // -1 is unlimited number of blocks on all paths. if (NBBsOnAllPaths != -1) --NBBsOnAllPaths; @@ -500,10 +500,13 @@ bool safeToHoistScalar(const BasicBlock *HoistBB, SmallPtrSetImpl &WL, int &NBBsOnAllPaths) { - // Check that the hoisted expression is needed on all paths. Enable scalar - // hoisting at -Oz as it is safe to hoist scalars to a place where they are - // partially needed. - if (!OptForMinSize && !hoistingFromAllPaths(HoistBB, WL)) + // Enable scalar hoisting at -Oz as it is safe to hoist scalars to a place + // where they are partially needed. + if (OptForMinSize) + return true; + + // Check that the hoisted expression is needed on all paths. + if (!hoistingFromAllPaths(HoistBB, WL)) return false; for (const BasicBlock *BB : WL) @@ -530,7 +533,7 @@ std::sort(InstructionsToHoist.begin(), InstructionsToHoist.end(), Pred); } - int NBBsOnAllPaths = MaxNumberOfBBSInPath; + int NumBBsOnAllPaths = MaxNumberOfBBSInPath; SmallVecImplInsn::iterator II = InstructionsToHoist.begin(); SmallVecImplInsn::iterator Start = II; @@ -546,10 +549,12 @@ BasicBlock *NewHoistBB; Instruction *NewHoistPt; - if (BB == HoistBB) { + if (BB == HoistBB) { // Both are in the same Basic Block. NewHoistBB = HoistBB; NewHoistPt = firstInBB(Insn, HoistPt) ? Insn : HoistPt; } else { + // If the hoisting point contains one of the instructions, + // then hoist there, otherwise hoist before the terminator. NewHoistBB = DT->findNearestCommonDominator(HoistBB, BB); if (NewHoistBB == BB) NewHoistPt = Insn; @@ -564,7 +569,7 @@ WL.insert(BB); if (K == InsKind::Scalar) { - if (safeToHoistScalar(NewHoistBB, WL, NBBsOnAllPaths)) { + if (safeToHoistScalar(NewHoistBB, WL, NumBBsOnAllPaths)) { // Extend HoistPt to NewHoistPt. HoistPt = NewHoistPt; HoistBB = NewHoistBB; @@ -581,9 +586,9 @@ hoistingFromAllPaths(NewHoistBB, WL)) && // Also check that it is safe to move the load or store from HoistPt // to NewHoistPt, and from Insn to NewHoistPt. - safeToHoistLdSt(NewHoistPt, HoistPt, UD, K, NBBsOnAllPaths) && + safeToHoistLdSt(NewHoistPt, HoistPt, UD, K, NumBBsOnAllPaths) && safeToHoistLdSt(NewHoistPt, Insn, MSSA->getMemoryAccess(Insn), - K, NBBsOnAllPaths)) { + K, NumBBsOnAllPaths)) { // Extend HoistPt to NewHoistPt. HoistPt = NewHoistPt; HoistBB = NewHoistBB; @@ -602,7 +607,7 @@ UD = MSSA->getMemoryAccess(*Start); HoistPt = Insn; HoistBB = BB; - NBBsOnAllPaths = MaxNumberOfBBSInPath; + NumBBsOnAllPaths = MaxNumberOfBBSInPath; } // Save the last partition.