[llvm] [SLP]Analyze widened reduction leaves in the narrow type (PR #216062)

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 22 08:51:19 PDT 2026


mstorsjo wrote:

This change causes failed asserts for me:
```c++
typedef long long a;
enum { b, d, e = 32, f };
struct n {
  a h;
  n(a q) : h(q) {}
  static n j(short q, short z, short aa) { return q | z << d | a(aa) << f; }
  static n l(unsigned char q, unsigned char z, unsigned aa) {
    n m = j(q, z, aa);
    return m;
  }
};
struct ab {
  enum o { p };
};
struct af;
typedef const unsigned *(*r)(unsigned *, const unsigned *, int, const af *,
                             const unsigned *);
typedef const n *(*s)(n *, const unsigned *, int, const af *, const unsigned *);
enum t {};
struct af {
  char u;
  char v;
  char w;
  char x;
  char y;
  char c;
  char b;
  char d;
  bool e;
  t ac;
  r ad;
  r ae;
  r f;
  s ag;
};
template <ab::o> t ah();
template <ab::o>
const unsigned *ai(unsigned *, const unsigned *, int, const af *,
                   const unsigned *);
template <int>
const n *aj(n *q, const unsigned *z, int, const af *, const unsigned *) {
  int a, b, c = b = 6;
  char d = 8 - b;
  for (int i;; ++i) {
    a = 1;
    int k(z[i] >> a);
    int e(z[i] >> 5);
    int f = z[i] & c;
    e = e << d | e >> 2;
    f = f << 5 | f >> 2;
    q[i] = n::l(k, e, f);
  }
}
template <ab::o>
const unsigned *ak(unsigned *, const unsigned *, int, const af *,
                   const unsigned *);
template <ab::o>
const unsigned *al(unsigned *, const unsigned *, int, const af *,
                   const unsigned *);
template <ab::o o> af am() {
  return {char(), char(), char(),  char(), char(), char(), 0,
          0,      false,  ah<o>(), ai<o>,  ak<o>,  al<o>,  aj<o>};
}
af g{am<ab::p>()};
```
```console
$ clang -target aarch64-linux-gnu -c -O2 repro.cpp
clang: ../lib/Transforms/Vectorize/SLPVectorizer.cpp:2511: void llvm::slpvectorizer::BoUpSLP::removeInstructionsAndOperands(llvm::ArrayRef<BlockT*>, llvm::ArrayRef<std::tuple<llvm::WeakTrackingVH, unsigned int, bool, bool> >) [with T = llvm::Instruction]: Assertion `(I->use_empty() || all_of(I->uses(), [&](Use &U) { return isDeleted( cast<Instruction>(U.getUser())); })) && "trying to erase instruction with users."' failed.
```

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


More information about the llvm-commits mailing list