Bug type: crash
Component: SLPVectorizer
Bug location: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp: BoUpSLP::isGatherShuffledSingleRegisterEntry
Issue title: Instruction does not dominate all uses! LLVM ERROR: Broken module found, compilation aborted!
Labels: llvm:SLPVectorizer
crash
Reported by: TatyanaDoubts

To reproduce run opt with the test below using -passes=slp-vectorizer -slp-threshold=-99999:
```
; ModuleID = './reduced.ll'
source_filename = "./reduced.ll"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

define void @wombat() #0 gc "statepoint-example" {
bb:
  br i1 false, label %bb1, label %bb5

bb1:                                              ; preds = %bb1, %bb
  %phi = phi i32 [ %or4, %bb1 ], [ 0, %bb ]
  %phi2 = phi i32 [ %add, %bb1 ], [ 0, %bb ]
  %add = add i32 1, 0
  %or = or i32 0, %phi2
  %or3 = or i32 %or, 0
  %mul = mul i32 0, 0
  %or4 = or i32 %phi, %mul
  br i1 false, label %bb1, label %bb5

bb5:                                              ; preds = %bb1, %bb
  %phi6 = phi i32 [ 0, %bb ], [ %or4, %bb1 ]
  %phi7 = phi i32 [ 0, %bb ], [ %or, %bb1 ]
  ret void
}

attributes #0 = { "target-features"="+prfchw,-cldemote,+avx,+aes,+sahf,+pclmul,-xop,+crc32,-amx-fp8,+xsaves,-avx512fp16,-usermsr,-sm4,-egpr,+sse4.1,-avx512ifma,+xsave,+sse4.2,-tsxldtrk,-sm3,-ptwrite,-widekl,-movrs,+invpcid,+64bit,+xsavec,-avx10.1-512,-avx512vpopcntdq,+cmov,-avx512vp2intersect,+avx512cd,+movbe,-avxvnniint8,-ccmp,-amx-int8,-kl,-avx10.1-256,+evex512,-avxvnni,+rtm,+adx,+avx2,-hreset,-movdiri,-serialize,-sha512,-vpclmulqdq,+avx512vl,-uintr,-cf,+clflushopt,-raoint,-cmpccxadd,+bmi,-amx-tile,+sse,-avx10.2-256,-gfni,-avxvnniint16,-amx-fp16,-zu,-ndd,+xsaveopt,+rdrnd,+avx512f,-amx-bf16,-avx512bf16,-avx512vnni,-push2pop2,+cx8,+avx512bw,+sse3,+pku,-nf,-amx-tf32,-amx-avx512,+fsgsbase,-clzero,-mwaitx,-lwp,+lzcnt,-sha,-movdir64b,-ppx,-wbnoinvd,-enqcmd,-amx-transpose,-avx10.2-512,-avxneconvert,-tbm,-pconfig,-amx-complex,+ssse3,+cx16,+bmi2,+fma,+popcnt,-avxifma,+f16c,-avx512bitalg,-rdpru,+clwb,+mmx,+sse2,+rdseed,-avx512vbmi2,-prefetchi,-amx-movrs,-rdpid,-fma4,-avx512vbmi,-shstk,-vaes,-waitpkg,-sgx,+fxsr,+avx512dq,-sse4a,-avx512f" }
```
Reproducer: https://godbolt.org/z/YbPKn761h
Stack dump:
```
0.	Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/opt -o /app/output.s -S -passes=slp-vectorizer -slp-threshold=-99999 <source>
1.	Running pass "verify" on module "<source>"
 #0 0x00000000055242e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x55242e8)
 #1 0x0000000005521c74 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #2 0x000073e542242520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #3 0x000073e5422969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #4 0x000073e542242476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #5 0x000073e5422287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #6 0x000000000080a091 llvm::json::operator==(llvm::json::Value const&, llvm::json::Value const&) (.cold) JSON.cpp:0:0
 #7 0x00000000054600e8 (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x54600e8)
 #8 0x000000000535c8d8 (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x535c8d8)
 #9 0x000000000093ee6e llvm::detail::PassModel<llvm::Module, llvm::VerifierPass, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x93ee6e)
#10 0x000000000531b5a0 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x531b5a0)
#11 0x00000000009492ba llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x9492ba)
#12 0x000000000093ca8c optMain (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x93ca8c)
#13 0x000073e542229d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#14 0x000073e542229e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#15 0x00000000009346c5 _start (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x9346c5)
Program terminated with signal: SIGSEGV
Compiler returned: 139
```



Fix patch:
commit 3aecbbcbf675bc4472dafff18d29f21457323f28
Author: Alexey Bataev <a.bataev@outlook.com>
Date:   Tue May 6 06:40:54 2025 -0700

    [SLP]Do not match nodes if schedulability of parent nodes is different
    
    If one user node is non-schedulable and another one is schedulable, such
    nodes should be considered matched. The selection of the actual insert
    point in this case differs and the insert points may match, which may
    cause a compiler crash because of the broken def-use chain.
    
    Fixes #137797

diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 4d183bb42f0e..a6ae26f2f0e1 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -15245,6 +15245,11 @@ BoUpSLP::isGatherShuffledSingleRegisterEntry(
           continue;
       }
 
+      if (!TEUseEI.UserTE->isGather() && !UserPHI &&
+          doesNotNeedToSchedule(TEUseEI.UserTE->Scalars) !=
+              doesNotNeedToSchedule(UseEI.UserTE->Scalars) &&
+          is_contained(UseEI.UserTE->Scalars, TEInsertPt))
+        continue;
       // Check if the user node of the TE comes after user node of TEPtr,
       // otherwise TEPtr depends on TE.
       if ((TEInsertBlock != InsertPt->getParent() ||


Regression tests:
file: llvm/test/Transforms/SLPVectorizer/X86/matched-bv-schedulable.ll
commands: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s -slp-threshold=-99999
tests: test_name: <module>
test_body: 
define void @test() {
;
bb:
  br i1 false, label %bb1, label %bb5

bb1:
  %phi = phi i32 [ %or4, %bb1 ], [ 0, %bb ]
  %phi2 = phi i32 [ %add, %bb1 ], [ 0, %bb ]
  %add = add i32 1, 0
  %or = or i32 0, %phi2
  %or3 = or i32 %or, 0
  %mul = mul i32 0, 0
  %or4 = or i32 %phi, %mul
  br i1 false, label %bb1, label %bb5

bb5:
  %phi6 = phi i32 [ 0, %bb ], [ %or4, %bb1 ]
  %phi7 = phi i32 [ 0, %bb ], [ %or, %bb1 ]
  ret void
}