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
        {
            /*