https://gcc.gnu.org/bugzilla/show_bug.cgi?id=45256
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- With IVOPTs we get: # ivtmp.13_97 = PHI <ivtmp.13_96(12), 1(7)> _34 = MEM[(const __be32 *)_28 + -4B + ivtmp.13_97 * 4]; _36 = MEM[(const __be32 *)_27 + -4B + ivtmp.13_97 * 4]; if (_34 != _36) goto <bb 9>; [5.50%] else goto <bb 12>; [94.50%] <bb 9> [local count: 217424209]: _22 = (int) ivtmp.13_97; _40 = _22 * 32; xb_37 = _34 ^ _36; iftmp.1_53 = __fswab32 (xb_37); __asm__("clz %0, %1" : "=r" ret_54 : "r" iftmp.1_53 : "cc"); ret_56 = 32 - ret_54; _57 = _40 - ret_56; MEM[(struct ipv6_saddr_score *)&scores + 32B].matchlen = _57; if (_57 != 0) goto <bb 13>; [0.00%] else goto <bb 10>; [100.00%] So there is no extra add one any more. BUT with -fno-ivopts I still see the add one.