gcc does not reduce the function call to the result if called function is not static when using -O2, only with -O3, clang and msvc do the optimization also with -O2

Dennis Luehring dl.soluz@gmx.net
Sat Dec 5 11:50:35 GMT 2020


gcc does not reduce to call result if called function is not static in
-O2 (will do with -O2)
clang and msvc does it also in -O2 regardless of the function beeing
static or not

can someone explain to me why the -O2 optimizer is not able(allowed) to
reduce this small sample the same way as clang/msvc?

x86-64 gcc 10.2 and trunk -O2: https://godbolt.org/z/r3GM57
x86-64 clang trunk and 11.0.0 -O2: https://godbolt.org/z/8hqbz5
x64 msvc v19.27 -O2: https://godbolt.org/z/nv3rWq

code to reproduce

---------------------------
#include <cstdint>

// part of run length encoding...

static void v32(uint32_t v_, uint8_t* b_, int& s_)
{
   if (v_ <= 0x0000007FU)
   {
     s_ = 1;
     b_[0] = (uint8_t)v_;
     return;
   }
   if (v_ <= 0x00003FFFU)
   {
     s_ = 2;
     b_[1] = (uint8_t)(v_ & 0x7F);
     b_[0] = (uint8_t)((v_ >> 7) | 0x80);
     return;
   }

   s_ = 3;
   b_[2] = (uint8_t)(v_ & 0x7F);
   b_[1] = (uint8_t)((v_ >> 7) | 0x80);
   b_[0] = (uint8_t)((v_ >> 14) | 0x80);
   return;
}

int test(uint32_t v_)
{
   uint8_t b[3]{};
   int s=0;
   v32(v_, b, s);
   return s+b[0]+b[1]+b[2];
}

int main(int argc, char** argv)
{
   return test(1337); // results in 197

   // clang reduces the call down to 197    regardless of test beeing
static or not
   //main:                                   # @main
   //  mov eax, 197
   //  ret

   // gcc reduces the call only if test is static
   //main:
   //  mov edi, 1337
   //  jmp test(unsigned int)
}
------------------------------------



More information about the Gcc mailing list