On Friday, 20 November 2020 at 09:26:57 UTC christoph...@gmail.com wrote:

> The use case I have to test if an integer is in a quite small constant set 
> of integers. With bool <-> int conversion, we can use binary operation like 
> this for instance which would be valid in C
>
> r := int(bool(v^v1))&int(bool(v^v2))&int(bool(v^v3))
>
>
FWIW, here's some complete C:

#include <stdio.h>
#include <stdbool.h>

int Test0(int v, int v1, int v2, int v3)
{
     return v == v1 || v == v2 || v == v3;
}

int Test1(int v, int v1, int v2, int v3)
{
    int r = (int)((bool)(v^v1)) & (int)((bool)(v^v2)) & (int)((bool)(v^v3));
    return !r;
}

int Test2(int v, int v1, int v2, int v3)
{
    int r = !!(v^v1) & !!(v^v2) & !!(v^v3);
    return !r;
}

int main(void)
{
    printf("%d\n", Test0(5, 1, 2, 4));
    printf("%d\n", Test0(5, 1, 2, 5));
    printf("%d\n", Test1(5, 1, 2, 4));
    printf("%d\n", Test1(5, 1, 2, 5));
    printf("%d\n", Test2(5, 1, 2, 4));
    printf("%d\n", Test2(5, 1, 2, 5));
    return 0;
}


Test environment:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr 
--with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Using gcc -s, I see that Test1 and Test2 do indeed compile without branches 
(using setne) whilst Test0 has branches. However with flag -O3, all three 
functions compile to identical highly-compact code without branches.

I think the moral is: don't waste your time trying to outsmart the compiler.

It's true that Go's compiler doesn't currently optimise this case, but new 
optimisations are being added over time.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/5b4473f4-aab5-478d-91e7-3e0268671d2en%40googlegroups.com.

Reply via email to