On 2021-12-02 09:00, Jakub Jelinek wrote:
On Thu, Dec 02, 2021 at 08:53:31AM -0500, Vladimir Makarov via Gcc-patches
wrote:
The following patch fixes
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103437
The patch was successfully bootstrapped and tested on x86-64. There is no
test as the bug occurs on GCC built with sanitizing for an existing go test.
I'm afraid we can't use __builtin_smul_overflow, not all system compilers
will have that.
But, as it is done in int and we kind of rely on int being 32-bit on host
and rely on long long being 64-bit, I think you can do something like:
long long priorityll = (long long) mult * diff;
priority = priorityll;
if (priorityll != priority
...
My 1st version of the patch was based on long long but the standard does
not guarantee that int size is smaller than long long size. Although it
is true for all targets supported by GCC.
Another solution would be to switching to int32_t instead of int for
costs but it will require a lot of changes in RA code.
I see your point for usage system compiler different from GCC and LLVM.
I guess I could change it to
#if __GNUC__ >= 5
current code
#else
long long code
#endif
What do you think?