https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79173
--- Comment #31 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Vincent Lefèvre from comment #30) > (In reply to Jakub Jelinek from comment #29) > > (In reply to Vincent Lefèvre from comment #28) > > > What do you mean by "the first additions will be less optimized"? (If you > > > don't know anything about the initial carryin and the arguments, you can't > > > optimize at all, AFAIK.) > > > > I mean that if the compiler can't see it is in [0, 1], it will need to use 2 > > additions and or the 2 carry bits together. But, because the ored carry > > bits are in [0, 1] range, all the higher limbs could be done using addc. > > If the compiler can't see that carryin is in [0, 1], then it must not "or" > the carry bits; it needs to add them, as carryout may be 2. That is not how the clang builtin works, which is why I've implemented the | and documented it that way, as it is a compatibility builtin.