gcc complex constant folding

前端 未结 4 1816
失恋的感觉
失恋的感觉 2021-01-12 03:10

It seems that gcc has some limitation on complex constant folding. Here is an example:

static inline unsigned int DJBHash(const char *str)
{
   int i;
   uns         


        
4条回答
  •  终归单人心
    2021-01-12 03:57

    Not an answer, just another data point.

    The following implementation is even worse. GCC 4.7.3 properly applies TCO to turn this implementation into a loop, but it only evaluates up to "0" at compile time!

    static inline unsigned int DJBHash2(const char *str, unsigned int hash) {
       return *str ? DJBHash2(str + 1, 33 * hash + *str) : hash; }
    

    On the plus side, the recursive version is 7 bytes shorter.

    Someone else mentioned clang, so here are results for clang 3.1 -O3. It generates different code for the two versions of DJBHash, but they are the same number of bytes. Interestingly, it converts the shift and add from the original version into a multiply. It optimizes both versions down to constants for strings up to 100 characters. And finally, the clang code is 5 bytes shorter than the shortest GCC code.

提交回复
热议问题