]> granicus.if.org Git - postgresql/commitdiff
Tweak the tree descent loop in fsm_search_avail to not look at the
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 10 Dec 2008 17:11:18 +0000 (17:11 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 10 Dec 2008 17:11:18 +0000 (17:11 +0000)
right child if it doesn't need to.  This saves some miniscule number
of cycles, but the ulterior motive is to avoid an optimization bug
known to exist in SCO's C compiler (and perhaps others?)

src/backend/storage/freespace/fsmpage.c

index 3a25c959299bf574f8c3900f4cbee8cb6a5ff7ae..a4479e88c075dce8bbcaad03ea08a5859750966d 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/freespace/fsmpage.c,v 1.2 2008/10/07 21:10:11 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/freespace/fsmpage.c,v 1.3 2008/12/10 17:11:18 tgl Exp $
  *
  * NOTES:
  *
@@ -243,17 +243,20 @@ fsm_search_avail(Buffer buf, uint8 minvalue, bool advancenext,
         */
        while (nodeno < NonLeafNodesPerPage)
        {
-               int leftnodeno = leftchild(nodeno);
-               int rightnodeno = leftnodeno + 1;
-               bool leftok = (leftnodeno < NodesPerPage) &&
-                       (fsmpage->fp_nodes[leftnodeno] >= minvalue);
-               bool rightok = (rightnodeno < NodesPerPage) &&
-                       (fsmpage->fp_nodes[rightnodeno] >= minvalue);
-
-               if (leftok)
-                       nodeno = leftnodeno;
-               else if (rightok)
-                       nodeno = rightnodeno;
+               int childnodeno = leftchild(nodeno);
+
+               if (childnodeno < NodesPerPage &&
+                       fsmpage->fp_nodes[childnodeno] >= minvalue)
+               {
+                       nodeno = childnodeno;
+                       continue;
+               }
+               childnodeno++;                  /* point to right child */
+               if (childnodeno < NodesPerPage &&
+                       fsmpage->fp_nodes[childnodeno] >= minvalue)
+               {
+                       nodeno = childnodeno;
+               }
                else
                {
                        /*