mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
shallow.c: bit manipulation tweaks
First of all, 1 << 31 is technically undefined behaviour, so let's just use an unsigned literal. If i is 'signed int' and gcc doesn't know that i is positive, gcc generates code to compute the C99-mandated values of "i / 32" and "i % 32", which is a lot more complicated than simple a simple shifts/mask. The only caller of paint_down actually passes an "unsigned int" value, but the prototype of paint_down causes (completely well-defined) conversion to signed int, and gcc has no way of knowing that the converted value is non-negative. Just make the id parameter unsigned. In update_refstatus, the change in generated code is much smaller, presumably because gcc is smart enough to see that i starts as 0 and is only incremented, so it is allowed (per the UD of signed overflow) to assume that i is always non-negative. But let's just help less smart compilers generate good code anyway. Signed-off-by: Rasmus Villemoes <rv@rasmusvillemoes.dk> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Reviewed-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
381aa8e730
commit
1127b3ced5
|
@ -389,7 +389,7 @@ static uint32_t *paint_alloc(struct paint_info *info)
|
||||||
* all walked commits.
|
* all walked commits.
|
||||||
*/
|
*/
|
||||||
static void paint_down(struct paint_info *info, const unsigned char *sha1,
|
static void paint_down(struct paint_info *info, const unsigned char *sha1,
|
||||||
int id)
|
unsigned int id)
|
||||||
{
|
{
|
||||||
unsigned int i, nr;
|
unsigned int i, nr;
|
||||||
struct commit_list *head = NULL;
|
struct commit_list *head = NULL;
|
||||||
|
@ -401,7 +401,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
|
||||||
if (!c)
|
if (!c)
|
||||||
return;
|
return;
|
||||||
memset(bitmap, 0, bitmap_size);
|
memset(bitmap, 0, bitmap_size);
|
||||||
bitmap[id / 32] |= (1 << (id % 32));
|
bitmap[id / 32] |= (1U << (id % 32));
|
||||||
commit_list_insert(c, &head);
|
commit_list_insert(c, &head);
|
||||||
while (head) {
|
while (head) {
|
||||||
struct commit_list *p;
|
struct commit_list *p;
|
||||||
|
@ -575,11 +575,11 @@ static int add_ref(const char *refname, const struct object_id *oid,
|
||||||
|
|
||||||
static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap)
|
static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
if (!ref_status)
|
if (!ref_status)
|
||||||
return;
|
return;
|
||||||
for (i = 0; i < nr; i++)
|
for (i = 0; i < nr; i++)
|
||||||
if (bitmap[i / 32] & (1 << (i % 32)))
|
if (bitmap[i / 32] & (1U << (i % 32)))
|
||||||
ref_status[i]++;
|
ref_status[i]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue