Re: Remove dependence on integer wrapping
От | Nathan Bossart |
---|---|
Тема | Re: Remove dependence on integer wrapping |
Дата | |
Msg-id | Zr-gxcOehrmppDGk@nathan обсуждение исходный текст |
Ответ на | Re: Remove dependence on integer wrapping (Nathan Bossart <nathandbossart@gmail.com>) |
Список | pgsql-hackers |
On Fri, Aug 16, 2024 at 01:35:01PM -0500, Nathan Bossart wrote: > On Fri, Aug 16, 2024 at 09:00:00PM +0300, Alexander Lakhin wrote: >> #6 0x00005576cf627c68 in bms_singleton_member (a=0x5576d09f7fb0) at bitmapset.c:691 >> 691 if (result >= 0 || HAS_MULTIPLE_ONES(w)) > > At a glance, this appears to be caused by the RIGHTMOST_ONE macro: > > #define RIGHTMOST_ONE(x) ((signedbitmapword) (x) & -((signedbitmapword) (x))) I believe hand-rolling the two's complement calculation should be sufficient to avoid depending on -fwrapv here. godbolt.org indicates that it produces roughly the same code, too. diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c index cd05c642b0..d37a997c0e 100644 --- a/src/backend/nodes/bitmapset.c +++ b/src/backend/nodes/bitmapset.c @@ -67,7 +67,7 @@ * we get zero. *---------- */ -#define RIGHTMOST_ONE(x) ((signedbitmapword) (x) & -((signedbitmapword) (x))) +#define RIGHTMOST_ONE(x) ((bitmapword) (x) & (~((bitmapword) (x)) + 1)) #define HAS_MULTIPLE_ONES(x) ((bitmapword) RIGHTMOST_ONE(x) != (x)) -- nathan
В списке pgsql-hackers по дате отправления: