[llvm] [SLP]Do extra analysis int minbitwidth if some checks return false. (PR #84363)

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 20 05:53:37 PDT 2024


alexey-bataev wrote:

> I found two new cases that trigger failed asserts, based on the new relanded commit, in openh264 and libschroedinger. Those cases are:
> 
> ```c
> typedef int a;
> short *b;
> short c;
> void d() {
>   a e, f;
>   e = 0;
>   for (; e < 16; e += 4) {
>     b[e] = (f ^ (f ^ b[e] - f) * c >> 16) - f;
>     f = b[e + 1] >> 1;
>     b[e + 1] = f ^ ((f ^ b[e + 1] - f) * c >> 16) - f;
>     b[e + 2] = f ^ ((f ^ b[e + 2] - f) * c >> 16) - f;
>     b[e + 3] = f ^ ((f ^ b[e + 3] - f) * c >> 16) - f;
>   }
> }
> ```
> 
> ```c
> typedef struct {
>   short a
> } b;
> int c, d;
> b *e;
> b f, g;
> short h, i, j;
> void k() {
>   short l;
>   d = 0;
>   for (; d < 8; d++) {
>     f = e[d];
>     l = f.a < -1 ? -1 : f.a > 1 ? 1 : f.a;
>     h = f.a < 0 ? 0 : f.a;
>     i = h * c;
>     j = i >> 2;
>     g.a = j * l;
>     e[d] = g;
>   }
> }
> ```
> 
> Both can be triggered with the following command - but they appear to trigger failed asserts on a couple different source lines:
> 
> ```
> $ clang -target x86_64-linux-gnu -c repro.c -O2
> clang: ../lib/Transforms/Vectorize/SLPVectorizer.cpp:12545: llvm::Value* llvm::slpvectorizer::BoUpSLP::vectorizeTree(llvm::slpvectorizer::BoUpSLP::TreeEntry*, bool): Assertion `(getOperandEntry(E, 0)->State == TreeEntry::NeedToGather || getOperandEntry(E, 1)->State == TreeEntry::NeedToGather || MinBWs.contains(getOperandEntry(E, 0)) || MinBWs.contains(getOperandEntry(E, 1))) && "Expected item in MinBWs."' failed.
> ```
> 
> ```
> $ clang -target x86_64-linux-gnu -c repro.c -O2
> clang: ../lib/Transforms/Vectorize/SLPVectorizer.cpp:12299: llvm::Value* llvm::slpvectorizer::BoUpSLP::vectorizeTree(llvm::slpvectorizer::BoUpSLP::TreeEntry*, bool): Assertion `(getOperandEntry(E, 0)->State == TreeEntry::NeedToGather || getOperandEntry(E, 1)->State == TreeEntry::NeedToGather || MinBWs.contains(getOperandEntry(E, 0)) || MinBWs.contains(getOperandEntry(E, 1))) && "Expected item in MinBWs."' failed.
> ```

Fixed in 81d9ed605b126d163f2f1cc226c639f1dfdc5224

https://github.com/llvm/llvm-project/pull/84363


More information about the llvm-commits mailing list