PageRepairFragmentation(page);
 
+   /*
+    * Now that we have removed the dead tuples from the page, once again
+    * check if the page has become all-visible.
+    */
+   if (heap_page_is_all_visible(onerel, buffer, &visibility_cutoff_xid))
+       PageSetAllVisible(page);
+
    /*
     * Mark buffer dirty before we write WAL.
     */
    }
 
    /*
-    * Now that we have removed the dead tuples from the page, once again
-    * check if the page has become all-visible.
+    * All the changes to the heap page have been done. If the all-visible
+    * flag is now set, also set the VM bit.
     */
-   if (!visibilitymap_test(onerel, blkno, vmbuffer) &&
-       heap_page_is_all_visible(onerel, buffer, &visibility_cutoff_xid))
+   if (PageIsAllVisible(page) &&
+       !visibilitymap_test(onerel, blkno, vmbuffer))
    {
        Assert(BufferIsValid(*vmbuffer));
-       PageSetAllVisible(page);
        visibilitymap_set(onerel, blkno, buffer, InvalidXLogRecPtr, *vmbuffer,
                          visibility_cutoff_xid);
    }