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.