llvm / llvm/llvm-project

[AVX-512] Consider folding vector compare results `a | b | c | d` into `~(!a & !b & !c & !d)`

Open
#187,652 5 comments 0 reactions 1 assignee Claimed by @VachanVY View on GitHub
backend:X86 missed-optimization
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

[Zig Godbolt](https://zig.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXAGx8BBAKoBnTAAUAHpwAMvAFYTStJg1AAvPMFJL6yAngGVG6AMKpaAVxYM9DgDJ4GmADl3ACNMYhAAZgAmUgAHVAVCWwZnNw89eMSbAV9/IJZQ8OiLTCtshiECJmICVPdPLhKy5MrqglzAkLDImIUqmrr0xr62jvzCnoBKC1RXYmR2DjQGPoBqPvRVgFIIgBFVgAE8FniaiC2oqI2LqMmdgCEtjQBBJ%2BfMVVOCVaoGH9RUOcXqsQasmCBDgA1TDWEgQSQAFlIq1cAA5pm9QatghCDtDYcR4UiUejSJjQchcfiiITEci0RjgaD0FSYTSifTSeSQewoWy4XSSXcXpMUYjtgB2R5MkEAN2qq3CfIJHOxANoop2%2BwOCliBgIEAIxFcmDuEWlzyxxG2UUkWrBqzAYHtwQe3MVNrtewdTvtyDdMo9Fy9%2ByYjud3vQActoOtwftYd93sw0atmAIcz%2BAD8DkwFBBXIKDsFCI48wbiJMzRathLdm83h8vj8/sFqkCYyDwcr2YKGWTAziewLif33ZTh7TR1zAyzJ6qx4HeXj%2BVPOcLnqLCwjJRasfLrUqVyrBcF1ZrvTq9UwDVQxEpq%2B64xLHAntnsXanY5LX96w1q/S/EFn1/UN33rSMgKDF83wA5MoOIdNM0OPMCyLEtanLCBK0fF5a3rF4OGmWhOAAVl4TwOC0UhUE4AAtMx1lmeZMBtCIeFIAhNCI6YAGsQARUiADoEVRDQImiKJSMuLgNAlUj9E4BFeBYCQNA0UhKOo2iOF4BQQA0riqKI0g4FgJA0BOOgwnIShLNiazwmMI1XAYXi%2BDoAgwn0iAcWM0gS2YYgAE9OA4wLqmCgB5YJtDZMLeEsthBCihhaFC/ysGCVxgDLWhaH07heCwFhDGAcRMrwRDrDwWVMEK6iPhhVwvIS8hBFKbj9DwYJiEi5wsC6o1jjauriDPJRdkwUqjFoPxQGM6YqAMYAFEhPBMAAdyi2JGDa/hBBEMR2CiDSDvkJQ1C63QYgMIwQFMcw5uCfTIGmVBYnKQqAFootWAAlUpMDzTAADFy1Wb7%2BmAdNVlUVFJAAfURb65oYVxVEhlhkFiVwtWMBgxtIyH%2BBYQhvqoPq2G%2B%2BI/C84heFQMbiDwLBXogaZLDZZJ7AYJwXHqLw%2BbGLpwkaTIkgEQYGjiBJJYYEWCm6YYgZqgRWgGAWhiabn1f6do/E6JWxYsfXpb0EYakViYuE55iFgkYiyIorqdNWR7VhctzVggXBCBINjbd4IytCrUgEGBrBwg50h%2BNIhEhNIrgAE5JEkCUJQRDPUWTqTFI4ZTSFU2SNK0xnOD0gzOO4sOSI4KIVLU0vXYr6vFumMbEjsBEgA)
[LLVM Godbolt](https://llvm.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1C1aANxakl9ZATwDKjdAGFUtAK4sGexwBk8DTAA5DwAjTGIQACYAdlIAB1QFQjsGF3dPPQSk2wE/AOCWMIiYy0xrHIYhAiZiAjSPLy5S8pSqmoI8oNDwqNiFatr6jKb%2B9s6Cot6ASktUN2Jkdg4sGgCAanQFVAB9WlRRWjW8ADZJNYABflQIAFIAZidTtdUjgA577DWbyIBWDVIvg8ni88O87p9vj8moDHmcQWCIb9IgD7rDnm8Pl9fncUUC4RjwVifpIpms9gdtm4GMw2Ohtkx0OhiF9ogAhG4aACC2EExAAniAOZy1kSfoCACJHZAsOJrdao4EExF/FG/LhCkWQ44SqUyuWYGGK0GYyH/ImRDVE6I6wzoQ34vDqwmQn6qn7HS2Q146vDS2XyvHo43O35myF3T2/ACcNoYdoVDqdytiRPeXM1ao0Pr9%2BvtQYRRLDv0kkahXFj8cDIKTRKjbq4GlLXEiOpChFE/Tz1ZNavLRCOpybdx1qhIA7OkObAIAtOr02tiJgCOOiVwI1ybtFxUKhSt/AbNjtyWIV%2BcQjVblWlYXcWj4T2obejQXIciu9fw0%2BHS/i6Tj7RKWpVhMDpBkmRZdkuR5Ah%2BUFecXWzPVMAAR3fYNlSLKFS21e5JV9JDUITfMH0wi14N%2Ba1cLWMciO7EMfldIkPXIn5vSo/DZRQtCfxVIl12FWsdRoq9HQfFMvSbLN2JzLjaI/UM3RLFiuHLKjhLvI4a0hOtV0bZSWyotsCA7Zc5NE%2BiVLWfsTiUgTF2XGzVzIzlN23LkOBmWhOB%2BXgvA4LRSFQTgfB8AA1ABZNYAEkACU1i2eZFixO4eFIAhNA8mYAGsQEkaIADoow0KNomJPKipK4l9E4SRfIywLOF4BQQH%2BdL/I80g4FgJA0BlOhwnISherifqIhMGxiCpLK%2BDoAhwmaiAQnqttmFg7heBWmo%2BQAeRCbRMBsThUt6thBG2hhaAFdrSCwEI3GAJwxFoZr1puzAWEMYBxGu/BFxsPBTEwF6AswVQDrcOajt4fw5q867aDwEJiC2lwsHqmC8BYKHSEB4gQkSTBxXez6EaMDKZioAxgAUUK8EwAB3ba4kYbH%2BEEEQxHYKQZEERQVHUa7dCaAwyZMcx9ER5rIBmVA4gqF7p224dpxYZA4jcXCAC8GFxnzAtx4g8CwKWIBmKwDoqBw4yGRpSF8fcJh6JosmSAQbcyRJXYYcZugiEYygt1oBjqVwGj0c3/oENpah9woncsYP3ZGYPY8mLgzbmBYuc87y6uuoKODJWhkDWCAYKm0kIFwQgaMiFKpl4NqtCmbKQB%2BSJ8uKjRIkkBjIi7nvjmqjhatILGG3%2BPyAoLpqWrS8mc44SI8%2Bnxr5/alucfmlJcqAA)

```llvm
define dso_local i64 @bar(<64 x i8> %0, <64 x i8> %1, <64 x i8> %2, <64 x i8> %3, <64 x i8> %4) local_unnamed_addr {
Entry:
%5 = icmp eq <64 x i8> %0, %1
%6 = icmp eq <64 x i8> %0, %2
%7 = or <64 x i1> %5, %6
%8 = icmp eq <64 x i8> %0, %3
%9 = or <64 x i1> %7, %8
%10 = icmp eq <64 x i8> %0, %4
%11 = or <64 x i1> %9, %10
%12 = bitcast <64 x i1> %11 to i64
ret i64 %12
}
```

Compiles to:

```asm
vpcmpeqb k0, zmm0, zmm1
vpcmpeqb k1, zmm0, zmm2
vpcmpeqb k2, zmm0, zmm4
korq k0, k0, k1
vpcmpeqb k1, zmm0, zmm3
korq k1, k1, k2
korq k0, k0, k1
kmovq rax, k0
```

I think it could be:

```asm
vpcmpneqb k1, zmm0, zmm1
vpcmpneqb k1 {k1}, zmm0, zmm2
vpcmpneqb k1 {k1}, zmm0, zmm3
vpcmpneqb k0 {k1}, zmm0, zmm4
knotq k0, k0
kmovq rax, k0
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.