[llvm] [MachinePipeliner] Add validation for missed loop-carried memory deps (PR #145878)

Nathan Chancellor via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 17 07:58:28 PDT 2025


nathanchance wrote:

I am seeing an assertion failure when building the Linux kernel for Hexagon after this change. `cvise` spits out

```c
enum { falsetrue } typedef bool;
struct tcp_sack_block {
  int start_seq;
  int end_seq;
} *tcp_send_dupack_sp;
char num_sacks;
bool tcp_sack_extend();
void tcp_send_dupack() {
  int cur_sacks = num_sacks, this_sack;
  if (cur_sacks)
    goto new_sack;
  this_sack = 0;
  for (;; this_sack++)
    if (tcp_sack_extend())
      for (; this_sack; this_sack--, tcp_send_dupack_sp--) {
        typeof(*tcp_send_dupack_sp) __tmp = *tcp_send_dupack_sp;
        *(tcp_send_dupack_sp - 1) = __tmp;
      }
new_sack:;
}
```

```
$ clang --target=hexagon -O2 -ftrivial-auto-var-init=pattern tcp_input.i
clang-21: /mnt/nvme/tmp/cvise.XkpzFC6AWA/src/llvm/lib/CodeGen/ScheduleDAG.cpp:522: void llvm::ScheduleDAGTopologicalSort::InitDAGTopologicalSorting(): Assertion `Node2Index[SU.NodeNum] > Node2Index[PD.getSUnit()->NodeNum] && "Wrong topological sorting"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: /mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21 -cc1 -triple hexagon -O2 -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -main-file-name tcp_input.i -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -fno-use-init-array -target-cpu hexagonv68 -target-feature -long-calls -mqdsp6-compat -Wreturn-type -fshort-enums -mllvm -machine-sink-split=0 -debugger-tuning=gdb -fdebug-compilation-dir=/mnt/nvme/tmp/cvise.XkpzFC6AWA/cvise -fcoverage-compilation-dir=/mnt/nvme/tmp/cvise.XkpzFC6AWA/cvise -resource-dir /mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/lib/clang/21 -ferror-limit 19 -fmessage-length=215 -ftrivial-auto-var-init=pattern -fshort-enums -fno-signed-char -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -vectorize-loops -vectorize-slp -faddrsig -o /tmp/tcp_input-4338ba.o -x cpp-output tcp_input.i
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'tcp_input.i'.
4.      Running pass 'Modulo Software Pipelining' on function '@tcp_send_dupack'
 #0 0x0000564ff3087098 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x5c19098)
 #1 0x0000564ff30847d5 llvm::sys::RunSignalHandlers() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x5c167d5)
 #2 0x0000564ff3087e41 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x00007fa06744def0 (/usr/lib/libc.so.6+0x3def0)
 #4 0x00007fa0674a774c (/usr/lib/libc.so.6+0x9774c)
 #5 0x00007fa06744ddc0 raise (/usr/lib/libc.so.6+0x3ddc0)
 #6 0x00007fa06743557a abort (/usr/lib/libc.so.6+0x2557a)
 #7 0x00007fa0674354e3 __assert_perror_fail (/usr/lib/libc.so.6+0x254e3)
 #8 0x0000564ff286cd06 llvm::ScheduleDAGTopologicalSort::InitDAGTopologicalSorting() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x53fed06)
 #9 0x0000564ff2652941 llvm::SwingSchedulerDAG::schedule() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x51e4941)
#10 0x0000564ff26519cf llvm::MachinePipeliner::swingModuloScheduler(llvm::MachineLoop&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x51e39cf)
#11 0x0000564ff264fc52 llvm::MachinePipeliner::scheduleLoop(llvm::MachineLoop&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x51e1c52)
#12 0x0000564ff264faeb llvm::MachinePipeliner::scheduleLoop(llvm::MachineLoop&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x51e1aeb)
#13 0x0000564ff264fa2b llvm::MachinePipeliner::runOnMachineFunction(llvm::MachineFunction&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x51e1a2b)
#14 0x0000564ff25fc173 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x518e173)
#15 0x0000564ff2b7c035 llvm::FPPassManager::runOnFunction(llvm::Function&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x570e035)
#16 0x0000564ff2b84062 llvm::FPPassManager::runOnModule(llvm::Module&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x5716062)
#17 0x0000564ff2b7c9fb llvm::legacy::PassManagerImpl::run(llvm::Module&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x570e9fb)
#18 0x0000564ff37dd68f clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x636f68f)
#19 0x0000564ff37f1903 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x6383903)
#20 0x0000564ff4e60b29 clang::ParseAST(clang::Sema&, bool, bool) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x79f2b29)
#21 0x0000564ff3d6aed6 clang::FrontendAction::Execute() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x68fced6)
#22 0x0000564ff3cd9d5d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x686bd5d)
#23 0x0000564ff3e365bc clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x69c85bc)
#24 0x0000564ff0fa9d20 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x3b3bd20)
#25 0x0000564ff0fa5aff ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#26 0x0000564ff0fa4b61 clang_main(int, char**, llvm::ToolContext const&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x3b36b61)
#27 0x0000564ff0fb5c27 main (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x3b47c27)
#28 0x00007fa0674376b5 (/usr/lib/libc.so.6+0x276b5)
#29 0x00007fa067437769 __libc_start_main (/usr/lib/libc.so.6+0x27769)
#30 0x0000564ff0fa3525 _start (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/clang-21+0x3b35525)
```

Reduced IR:

```llvm
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
target triple = "hexagon"

define void @tcp_send_dupack() {
entry:
  br label %for.body.prol

for.body.prol:                                    ; preds = %for.body.prol, %entry
  %add.ptr12.prol = phi ptr [ %add.ptr.prol, %for.body.prol ], [ null, %entry ]
  %prol.iter = phi i32 [ %prol.iter.next, %for.body.prol ], [ 0, %entry ]
  %__tmp.sroa.5.0..sroa_idx.prol = getelementptr i8, ptr %add.ptr12.prol, i32 4
  %__tmp.sroa.5.0.copyload.prol = load i32, ptr %__tmp.sroa.5.0..sroa_idx.prol, align 4
  %add.ptr.prol = getelementptr i8, ptr %add.ptr12.prol, i32 -8
  store i32 %__tmp.sroa.5.0.copyload.prol, ptr %add.ptr.prol, align 4
  %prol.iter.next = add i32 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i32 %prol.iter, 0
  br i1 %prol.iter.cmp.not, label %for.body.prol.loopexit, label %for.body.prol

for.body.prol.loopexit:                           ; preds = %for.body.prol
  ret void
}
```

```
$ llc reduced.ll 
llc: /mnt/nvme/tmp/cvise.XkpzFC6AWA/src/llvm/lib/CodeGen/ScheduleDAG.cpp:522: void llvm::ScheduleDAGTopologicalSort::InitDAGTopologicalSorting(): Assertion `Node2Index[SU.NodeNum] > Node2Index[PD.getSUnit()->NodeNum] && "Wrong topological sorting"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: llc reduced.ll
1.      Running pass 'Function Pass Manager' on module 'reduced.ll'.
2.      Running pass 'Modulo Software Pipelining' on function '@tcp_send_dupack'
 #0 0x0000563af83e3dd8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x5993dd8)
 #1 0x0000563af83e14a5 llvm::sys::RunSignalHandlers() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x59914a5)
 #2 0x0000563af83e4b81 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x00007f1680c4def0 (/usr/lib/libc.so.6+0x3def0)
 #4 0x00007f1680ca774c (/usr/lib/libc.so.6+0x9774c)
 #5 0x00007f1680c4ddc0 raise (/usr/lib/libc.so.6+0x3ddc0)
 #6 0x00007f1680c3557a abort (/usr/lib/libc.so.6+0x2557a)
 #7 0x00007f1680c354e3 __assert_perror_fail (/usr/lib/libc.so.6+0x254e3)
 #8 0x0000563af76ad856 llvm::ScheduleDAGTopologicalSort::InitDAGTopologicalSorting() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4c5d856)
 #9 0x0000563af745d031 llvm::SwingSchedulerDAG::schedule() (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4a0d031)
#10 0x0000563af745bfff llvm::MachinePipeliner::swingModuloScheduler(llvm::MachineLoop&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4a0bfff)
#11 0x0000563af745a272 llvm::MachinePipeliner::scheduleLoop(llvm::MachineLoop&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4a0a272)
#12 0x0000563af745a04b llvm::MachinePipeliner::runOnMachineFunction(llvm::MachineFunction&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4a0a04b)
#13 0x0000563af73ec893 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x499c893)
#14 0x0000563af7965b55 llvm::FPPassManager::runOnFunction(llvm::Function&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4f15b55)
#15 0x0000563af796dd22 llvm::FPPassManager::runOnModule(llvm::Module&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4f1dd22)
#16 0x0000563af79665ab llvm::legacy::PassManagerImpl::run(llvm::Module&) (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x4f165ab)
#17 0x0000563af5caa0ee compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#18 0x0000563af5ca785d main (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x325785d)
#19 0x00007f1680c376b5 (/usr/lib/libc.so.6+0x276b5)
#20 0x00007f1680c37769 __libc_start_main (/usr/lib/libc.so.6+0x27769)
#21 0x0000563af5ca38e5 _start (/mnt/nvme/tmp/cvise.XkpzFC6AWA/install/llvm-c0b82df5f3484870d3728156da7d7e3720ef53ad/bin/llc+0x32538e5)
```

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


More information about the llvm-commits mailing list