Skip to contentSkip to conversation

fsm-listen-daarwin: combine bit operations

PATCH New Rose via GitGitGadget 3 participants 5 messages Jan 17, 2023 – Jan 20, 2023

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fsm-listen-daarwin: combine bit operations

From: Seija Kijin <[email protected]>

---
fsm-listen-daarwin: combine bit operations

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1437%2FAtariDreams%2Fdarwin-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1437/AtariDreams/darwin-v1
Pull-Request: https://github.com/git/git/pull/1437

 compat/fsmonitor/fsm-listen-darwin.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
compat/fsmonitor/fsm-listen-darwin.c +3 -3
index 97a55a6f0a4..fccdd21d858 100644
@@ -129,9 +129,9 @@ static int ef_is_root_renamed(const FSEventStreamEventFlags ef)
 
 static int ef_is_dropped(const FSEventStreamEventFlags ef)
 {
-	return (ef & kFSEventStreamEventFlagMustScanSubDirs ||
-		ef & kFSEventStreamEventFlagKernelDropped ||
-		ef & kFSEventStreamEventFlagUserDropped);
+	return (ef & (kFSEventStreamEventFlagMustScanSubDirs |
+		      kFSEventStreamEventFlagKernelDropped |
+		      kFSEventStreamEventFlagUserDropped));
 }
 
 /*

base-commit: a7caae2729742fc80147bca1c02ae848cb55921a

Signature · 1 line
gitgitgadget
#1 lore raw

PATCH v2 1/1 fsm-listen-darwin: combine bit operations

From: Seija Kijin <[email protected]>

---
fsm-listen-darwin: combine bit operations

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1437%2FAtariDreams%2Fdarwin-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1437/AtariDreams/darwin-v2
Pull-Request: https://github.com/git/git/pull/1437

Range-diff vs v1:

1: a98654c7507 ! 1: 9943d52654f fsm-listen-daarwin: combine bit operations
@@ Metadata
Author: Seija Kijin <[email protected]>

## Commit message ##
- fsm-listen-daarwin: combine bit operations
+ fsm-listen-darwin: combine bit operations

 compat/fsmonitor/fsm-listen-darwin.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
compat/fsmonitor/fsm-listen-darwin.c +3 -3
index 97a55a6f0a4..fccdd21d858 100644
@@ -129,9 +129,9 @@ static int ef_is_root_renamed(const FSEventStreamEventFlags ef)
 
 static int ef_is_dropped(const FSEventStreamEventFlags ef)
 {
-	return (ef & kFSEventStreamEventFlagMustScanSubDirs ||
-		ef & kFSEventStreamEventFlagKernelDropped ||
-		ef & kFSEventStreamEventFlagUserDropped);
+	return (ef & (kFSEventStreamEventFlagMustScanSubDirs |
+		      kFSEventStreamEventFlagKernelDropped |
+		      kFSEventStreamEventFlagUserDropped));
 }
 
 /*

base-commit: a7caae2729742fc80147bca1c02ae848cb55921a

Signature · 1 line
gitgitgadget
#2 lore raw

Re: [PATCH v2] fsm-listen-darwin: combine bit operations

Quoted 34 lines · Rose via GitGitGadget

From: Seija Kijin <[email protected]>

---
fsm-listen-darwin: combine bit operations

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1437%2FAtariDreams%2Fdarwin-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1437/AtariDreams/darwin-v2
Pull-Request: https://github.com/git/git/pull/1437

Range-diff vs v1:

1: a98654c7507 ! 1: 9943d52654f fsm-listen-daarwin: combine bit operations
@@ Metadata
Author: Seija Kijin <[email protected]>

## Commit message ##
- fsm-listen-daarwin: combine bit operations
+ fsm-listen-darwin: combine bit operations

  compat/fsmonitor/fsm-listen-darwin.c | 6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)
compat/fsmonitor/fsm-listen-darwin.c +0 -0
index 97a55a6f0a4..fccdd21d858 100644

compat/fsmonitor/fsm-listen-darwin.c static int ef_is_root_renamed(const FSEventStreamEventFlags ef) · line 135

Quoted 10 lines
compat/fsmonitor/fsm-listen-darwin.c +3 -3
@@ -129,9 +129,9 @@ static int ef_is_root_renamed(const FSEventStreamEventFlags ef)
 
  static int ef_is_dropped(const FSEventStreamEventFlags ef)
  {
-	return (ef & kFSEventStreamEventFlagMustScanSubDirs ||
-		ef & kFSEventStreamEventFlagKernelDropped ||
-		ef & kFSEventStreamEventFlagUserDropped);
+	return (ef & (kFSEventStreamEventFlagMustScanSubDirs |
+		      kFSEventStreamEventFlagKernelDropped |
+		      kFSEventStreamEventFlagUserDropped));
  }

Technically, the returned value is slightly different, but the only caller is just checking for non-zero, so it doesn't matter.

So this is fine.

Thanks,
Jeff

#3 lore raw

Re: [PATCH v2] fsm-listen-darwin: combine bit operations

Quoted 14 lines · Jeff Hostetler

compat/fsmonitor/fsm-listen-darwin.c static int ef_is_root_renamed(const FSEventStreamEventFlags ef) · line 135

Quoted 9 lines

static int ef_is_dropped(const FSEventStreamEventFlags ef)
{

compat/fsmonitor/fsm-listen-darwin.c +3 -3
-	return (ef & kFSEventStreamEventFlagMustScanSubDirs ||
-		ef & kFSEventStreamEventFlagKernelDropped ||
-		ef & kFSEventStreamEventFlagUserDropped);
+	return (ef & (kFSEventStreamEventFlagMustScanSubDirs |
+		      kFSEventStreamEventFlagKernelDropped |
+		      kFSEventStreamEventFlagUserDropped));
  }

Technically, the returned value is slightly different, but the only caller is just checking for non-zero, so it doesn't matter.

Quoted 1 line

So this is fine.

But is it worth the code churn and reviewer bandwidth? Don't we have better things to spend our time on?

I would not be surprised if a smart enough compiler used the same transformartion as this patch does manually as an optimization.

Then it matters more which one of the two is more readable by our developers. And the original matches how we humans would think, I would imagine. ef might have MustScanSubdirs bit, KernelDropped bit, or UserDropped bit and in these cases we want to say that ef is dropped. Arguably, the original is more readble, and it would be a good change to adopt if there is an upside, like the updated code resulting in markedly more efficient binary.

So, this might be technically fine, but I am not enthused to see these kind of code churning patches with dubious upside. An optimization patch should be able to demonstrate its benefit with a solid benchmark, or at least a clear difference in generated code.

In fact.

Compiler explorer godbolt.org tells me that gcc 12 with -O2 compiles the following two functions into identical assembly. The !! prefix used in the second example is different from the postimage of what Seija posted, but this being a file-scope static function, I would expect the compiler to notice that the actual value would not matter to the callers, only the truth value, does.

* Input *

int one(unsigned int num) {
    return ((num & 01) ||
            (num & 02) || (num & 04));
}
int two(unsigned int num) {
    return !!((num) & (01|02|04));
}

* Assembly *
one(unsigned int):

        xor     eax, eax
        and     edi, 7
        setne   al
        ret
two(unsigned int):
        xor     eax, eax
        and     edi, 7
        setne   al

ret

#4 lore raw

Re: [PATCH v2] fsm-listen-darwin: combine bit operations

Quoted 67 lines · Junio C Hamano
Quoted 14 lines · Jeff Hostetler

compat/fsmonitor/fsm-listen-darwin.c static int ef_is_root_renamed(const FSEventStreamEventFlags ef) · line 135

Quoted 9 lines

static int ef_is_dropped(const FSEventStreamEventFlags ef)
{

compat/fsmonitor/fsm-listen-darwin.c +3 -3
-	return (ef & kFSEventStreamEventFlagMustScanSubDirs ||
-		ef & kFSEventStreamEventFlagKernelDropped ||
-		ef & kFSEventStreamEventFlagUserDropped);
+	return (ef & (kFSEventStreamEventFlagMustScanSubDirs |
+		      kFSEventStreamEventFlagKernelDropped |
+		      kFSEventStreamEventFlagUserDropped));
   }

Technically, the returned value is slightly different, but the only caller is just checking for non-zero, so it doesn't matter.

Quoted 1 line

So this is fine.

But is it worth the code churn and reviewer bandwidth? Don't we have better things to spend our time on?

I would not be surprised if a smart enough compiler used the same transformartion as this patch does manually as an optimization.

Then it matters more which one of the two is more readable by our developers. And the original matches how we humans would think, I would imagine. ef might have MustScanSubdirs bit, KernelDropped bit, or UserDropped bit and in these cases we want to say that ef is dropped. Arguably, the original is more readble, and it would be a good change to adopt if there is an upside, like the updated code resulting in markedly more efficient binary.

So, this might be technically fine, but I am not enthused to see these kind of code churning patches with dubious upside. An optimization patch should be able to demonstrate its benefit with a solid benchmark, or at least a clear difference in generated code.

In fact.

Compiler explorer godbolt.org tells me that gcc 12 with -O2 compiles the following two functions into identical assembly. The !! prefix used in the second example is different from the postimage of what Seija posted, but this being a file-scope static function, I would expect the compiler to notice that the actual value would not matter to the callers, only the truth value, does.

* Input *

int one(unsigned int num) {
     return ((num & 01) ||
             (num & 02) || (num & 04));
}
int two(unsigned int num) {
     return !!((num) & (01|02|04));
}

* Assembly *
one(unsigned int):

         xor     eax, eax
         and     edi, 7
         setne   al
         ret
two(unsigned int):
         xor     eax, eax
         and     edi, 7
         setne   al
Quoted 1 line

ret

agreed. i didn't think the change was really worth the bother and churn. personally, i prefer the conceptual clarity of the code the way I wrote it.

and i was wondering if the compiler would generate the same result, but didn't take the time (read: was too lazy) to actually verify that.

all i was intending to say was that it wasn't a wrong change.

jeff