It turns out that sys/hash.h also uses Chris Toreks hash algorithm
in the same 1:1 way that was present in Berkeley DB a decade ago.
So maybe "i prefer leaving optimization up to the compiler" should
be applied here, too.  The patch does this.

And - you know, i never made it into that gcc(1) code jungle, but
maybe someone with experience simply needs to toggle a switch for
better behaviour - the following seems strange to me:

    #include <stdio.h>
    int main(void) {
            int i = 3;
            printf("i = %d\n", i);
    #ifdef T1
            for (int x = 1; x < i; ++x)
    #else
            int x = 1;
    #endif
                    printf("x = %d\n", x);
            return 0;
    }

    ?0%1[steffen@obsd tmp]$ /usr/bin/gcc -W -Wall -pedantic -o t -c t.c  
    t.c: In function 'main':
    t.c:9: warning: ISO C90 forbids mixed declarations and code
    ?0%1[steffen@obsd tmp]$ /usr/bin/gcc -DT1 -W -Wall -pedantic -o t -c t.c 
    t.c: In function 'main':
    t.c:7: error: 'for' loop initial declaration used outside C99 mode
    ?1%1[steffen@obsd tmp]$

E.g., clang(1) does this (also for -std=c90):

    ?0%0[steffen@sherwood tmp]$ clang -DT1 -W -Wall -pedantic -ansi -o t -c t.c
    t.c:7:14: warning: variable declaration in for loop is a C99-specific 
feature [-pedantic]
            for (int x = 1; x < i; ++x)
                 ^
    1 warning generated.
    ?0%0[steffen@sherwood tmp]$ clang  -W -Wall -pedantic -ansi -o t -c t.c
    t.c:9:13: warning: ISO C90 forbids mixing declarations and code 
[-Wdeclaration-after-statement]
            int x = 1;
                ^
    1 warning generated.
    ?0%0[steffen@sherwood tmp]$

--steffen

Index: sys/sys/hash.h
===================================================================
RCS file: /Users/steffen/arena/code.openbsd/src/sys/sys/hash.h,v
retrieving revision 1.5
diff -a -p -u -r1.5 hash.h
--- sys/sys/hash.h      24 Sep 2010 13:24:53 -0000      1.5
+++ sys/sys/hash.h      14 Feb 2012 17:05:43 -0000
@@ -40,7 +40,7 @@
 /* Convenience */
 #ifndef        HASHINIT
 #define        HASHINIT        5381
-#define        HASHSTEP(x,c)   (((x << 5) + x) + (c))
+#define        HASHSTEP(x,c)   ((x)*33 + (c))
 #endif
 
 /*

Reply via email to