https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106865
Bug ID: 106865
Summary: addcarry pattern
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: unlvsur at live dot com
Target Milestone: ---
clang provides builtins like __builtin_addcll to deal with addcarry in a
generic way. However, i believe we can provide pattern matching in GCC so
existing programs may get benefit from the code, instead of adding new
builtins.
https://godbolt.org/z/3j18bPq8b
Take riscv as example:
https://godbolt.org/z/KWxfPWGz4
https://godbolt.org/z/b4r63oGqj
This proves GCC and clang can generate identical code EVEN without using adc
builtins.
I suggest to add pattern matching for code like this in GCC:
template<typename T>
inline constexpr T add_carry_no_carry_in(T a,T b,T& carryout) noexcept
{
T res{a+b};
carryout=res<a;
return res;
}
template<typename T>
inline constexpr T add_carry(T a,T b,T carryin,T& carryout) noexcept
{
if(carryin>1)
{
__builtin_unreachable();
}
a=add_carry_no_carry_in(carryin,a,carryout);
a=add_carry_no_carry_in(a,b,carryin);
carryout+=carryin;
return a;
}
This should correctly identify carries for GCC without adding new builtins
while it keeps the same interface as clang's builtins.