https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103565
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The difference is just argument and return register differences (and maybe a register allocation issue). That is the extra instructions are: for add_carry_pattern_test: movzx edi, dil mov r8, rcx xor ecx, ecx for add_carry_x86_intrinsics: movzx edi, dil