@@ -88,7 +88,7 @@ class FragmentationRecorder {
8888
8989 void releasePageRangeToOS (uptr From, uptr To) {
9090 DCHECK_EQ ((To - From) % getPageSizeCached (), 0U );
91- ReleasedPagesCount += (To - From) / getPageSizeCached ();
91+ ReleasedPagesCount += (To - From) >> getPageSizeLogCached ();
9292 }
9393
9494private:
@@ -348,7 +348,7 @@ class RegionPageMap {
348348template <class ReleaseRecorderT > class FreePagesRangeTracker {
349349public:
350350 explicit FreePagesRangeTracker (ReleaseRecorderT &Recorder)
351- : Recorder(Recorder), PageSizeLog(getLog2(getPageSizeCached())) {}
351+ : Recorder(Recorder) {}
352352
353353 void processNextPage (bool Released) {
354354 if (Released) {
@@ -372,14 +372,14 @@ template <class ReleaseRecorderT> class FreePagesRangeTracker {
372372private:
373373 void closeOpenedRange () {
374374 if (InRange) {
375+ const uptr PageSizeLog = getPageSizeLogCached ();
375376 Recorder.releasePageRangeToOS ((CurrentRangeStatePage << PageSizeLog),
376377 (CurrentPage << PageSizeLog));
377378 InRange = false ;
378379 }
379380 }
380381
381382 ReleaseRecorderT &Recorder;
382- const uptr PageSizeLog;
383383 bool InRange = false ;
384384 uptr CurrentPage = 0 ;
385385 uptr CurrentRangeStatePage = 0 ;
@@ -389,7 +389,7 @@ struct PageReleaseContext {
389389 PageReleaseContext (uptr BlockSize, uptr NumberOfRegions, uptr ReleaseSize,
390390 uptr ReleaseOffset = 0 )
391391 : BlockSize(BlockSize), NumberOfRegions(NumberOfRegions) {
392- PageSize = getPageSizeCached ();
392+ const uptr PageSize = getPageSizeCached ();
393393 if (BlockSize <= PageSize) {
394394 if (PageSize % BlockSize == 0 ) {
395395 // Same number of chunks per page, no cross overs.
@@ -408,7 +408,7 @@ struct PageReleaseContext {
408408 SameBlockCountPerPage = false ;
409409 }
410410 } else {
411- if (BlockSize % PageSize == 0 ) {
411+ if (( BlockSize & ( PageSize - 1 )) == 0 ) {
412412 // One chunk covers multiple pages, no cross overs.
413413 FullPagesBlockCountMax = 1 ;
414414 SameBlockCountPerPage = true ;
@@ -427,8 +427,8 @@ struct PageReleaseContext {
427427 if (NumberOfRegions != 1 )
428428 DCHECK_EQ (ReleaseOffset, 0U );
429429
430- PagesCount = roundUp (ReleaseSize, PageSize) / PageSize ;
431- PageSizeLog = getLog2 ( PageSize);
430+ const uptr PageSizeLog = getPageSizeLogCached () ;
431+ PagesCount = roundUp (ReleaseSize, PageSize) >> PageSizeLog ;
432432 ReleasePageOffset = ReleaseOffset >> PageSizeLog;
433433 }
434434
@@ -451,6 +451,7 @@ struct PageReleaseContext {
451451 // RegionSize, it's not necessary to be aligned with page size.
452452 bool markRangeAsAllCounted (uptr From, uptr To, uptr Base,
453453 const uptr RegionIndex, const uptr RegionSize) {
454+ const uptr PageSize = getPageSizeCached ();
454455 DCHECK_LT (From, To);
455456 DCHECK_LE (To, Base + RegionSize);
456457 DCHECK_EQ (From % PageSize, 0U );
@@ -544,6 +545,7 @@ struct PageReleaseContext {
544545 if (!ensurePageMapAllocated ())
545546 return false ;
546547
548+ const uptr PageSize = getPageSizeCached ();
547549 if (MayContainLastBlockInRegion) {
548550 const uptr LastBlockInRegion =
549551 ((RegionSize / BlockSize) - 1U ) * BlockSize;
@@ -605,17 +607,19 @@ struct PageReleaseContext {
605607 return true ;
606608 }
607609
608- uptr getPageIndex (uptr P) { return (P >> PageSizeLog) - ReleasePageOffset; }
609- uptr getReleaseOffset () { return ReleasePageOffset << PageSizeLog; }
610+ uptr getPageIndex (uptr P) {
611+ return (P >> getPageSizeLogCached ()) - ReleasePageOffset;
612+ }
613+ uptr getReleaseOffset () {
614+ return ReleasePageOffset << getPageSizeLogCached ();
615+ }
610616
611617 uptr BlockSize;
612618 uptr NumberOfRegions;
613619 // For partial region marking, some pages in front are not needed to be
614620 // counted.
615621 uptr ReleasePageOffset;
616- uptr PageSize;
617622 uptr PagesCount;
618- uptr PageSizeLog;
619623 uptr FullPagesBlockCountMax;
620624 bool SameBlockCountPerPage;
621625 RegionPageMap PageMap;
@@ -628,7 +632,7 @@ template <class ReleaseRecorderT, typename SkipRegionT>
628632NOINLINE void
629633releaseFreeMemoryToOS (PageReleaseContext &Context,
630634 ReleaseRecorderT &Recorder, SkipRegionT SkipRegion) {
631- const uptr PageSize = Context. PageSize ;
635+ const uptr PageSize = getPageSizeCached () ;
632636 const uptr BlockSize = Context.BlockSize ;
633637 const uptr PagesCount = Context.PagesCount ;
634638 const uptr NumberOfRegions = Context.NumberOfRegions ;
@@ -671,7 +675,7 @@ releaseFreeMemoryToOS(PageReleaseContext &Context,
671675 uptr PrevPageBoundary = 0 ;
672676 uptr CurrentBoundary = 0 ;
673677 if (ReleasePageOffset > 0 ) {
674- PrevPageBoundary = ReleasePageOffset * PageSize ;
678+ PrevPageBoundary = ReleasePageOffset << getPageSizeLogCached () ;
675679 CurrentBoundary = roundUpSlow (PrevPageBoundary, BlockSize);
676680 }
677681 for (uptr J = 0 ; J < PagesCount; J++) {
0 commit comments