[llvm] [llvm][CodeGen] Fixed max cycle calculation with zero-cost instructions for window scheduler (PR #99454)

Nathan Chancellor via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 30 11:16:52 PDT 2024


nathanchance wrote:

This change crashes `clang` when building the Linux kernel for `ARCH=hexagon`. `cvise` spits out:

```c
enum { false } div64_u64_rem(long, long long *);
struct dp_tu_calc_input {
  int nlanes;
  int dsc_en;
};
struct tu_algo_data {
  long long pclk_fp;
};
long long dp_panel_update_tu_timings___trans_tmp_5,
    _dp_ctrl_calc_tu___trans_tmp_8, _dp_ctrl_calc_tu_temp2_fp;
long _dp_ctrl_calc_tu_temp1_fp;
__attribute__((__malloc__)) void *kzalloc();
long long drm_fixp_from_fraction(long b) {
  _Bool b_neg = 0;
  long b_abs = b_neg ?: b;
  unsigned long long rem;
  long long res_abs = div64_u64_rem(0, &rem);
  int i = 32;
  do {
    res_abs <<= 1;
    if (rem >= b_abs) {
      res_abs |= 1;
      rem -= b_abs;
    }
  } while (--i);
  return res_abs;
}
void _dp_ctrl_calc_tu(struct dp_tu_calc_input *in) {
  struct tu_algo_data *tu = kzalloc();
  struct dp_tu_calc_input __trans_tmp_1 = *in;
  struct tu_algo_data __trans_tmp_2 = *tu;
  {
    struct dp_tu_calc_input in = __trans_tmp_1;
    __trans_tmp_2;
    int nlanes = in.nlanes;
    long temp3_fp;
    if (in.dsc_en)
      goto fec_check;
    _dp_ctrl_calc_tu_temp2_fp = drm_fixp_from_fraction(1);
    temp3_fp = 0;
    long a = temp3_fp;
    a;
    nlanes;
    tu->pclk_fp = _dp_ctrl_calc_tu_temp2_fp;
  fec_check:
    _dp_ctrl_calc_tu_temp1_fp = drm_fixp_from_fraction(1000);
    long b = _dp_ctrl_calc_tu_temp1_fp;
    unsigned result = b;
    dp_panel_update_tu_timings___trans_tmp_5 = result;
  }
  long long b = tu->pclk_fp, result = b;
  _dp_ctrl_calc_tu___trans_tmp_8 = result;
}
void dp_ctrl_calc_tu_parameters() {
  struct dp_tu_calc_input in;
  _dp_ctrl_calc_tu(&in);
}
```

```
$ clang --target=hexagon -O2 -c -o /dev/null dp_ctrl.i
...
clang: /home/nathan/tmp/cvise.pDMTndXeEh/src/llvm/include/llvm/ADT/SmallVector.h:308: const_reference llvm::SmallVectorTemplateCommon<std::pair<llvm::SlotIndex, llvm::SlotIndex>>::operator[](size_type) const [T = std::pair<llvm::SlotIndex, llvm::SlotIndex>]: Assertion `idx < size()' 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: clang --target=hexagon -O2 -c -o /dev/null dp_ctrl.i
1.	<eof> parser at end of file
2.	Code generation
3.	Running pass 'Function Pass Manager' on module 'dp_ctrl.i'.
4.	Running pass 'Modulo Software Pipelining' on function '@dp_ctrl_calc_tu_parameters'
 #0 0x0000564b03199086 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x5629086)
 #1 0x0000564b03196b4e llvm::sys::RunSignalHandlers() (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x5626b4e)
 #2 0x0000564b031193cd CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f8e32ac2ae0 (/usr/lib/libc.so.6+0x3cae0)
 #4 0x00007f8e32b1ae44 (/usr/lib/libc.so.6+0x94e44)
 #5 0x00007f8e32ac2a30 raise (/usr/lib/libc.so.6+0x3ca30)
 #6 0x00007f8e32aaa4c3 abort (/usr/lib/libc.so.6+0x244c3)
 #7 0x00007f8e32aaa3df (/usr/lib/libc.so.6+0x243df)
 #8 0x00007f8e32abac67 (/usr/lib/libc.so.6+0x34c67)
 #9 0x0000564b02694625 llvm::LiveRangeCalc::findReachingDefs(llvm::LiveRange&, llvm::MachineBasicBlock&, llvm::SlotIndex, unsigned int, llvm::ArrayRef<llvm::SlotIndex>) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4b24625)
#10 0x0000564b02693757 llvm::LiveRangeCalc::extend(llvm::LiveRange&, llvm::SlotIndex, unsigned int, llvm::ArrayRef<llvm::SlotIndex>) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4b23757)
#11 0x0000564b026972bc llvm::LiveIntervalCalc::extendToUses(llvm::LiveRange&, llvm::Register, llvm::LaneBitmask, llvm::LiveInterval*) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4b272bc)
#12 0x0000564b02696e19 llvm::LiveIntervalCalc::calculate(llvm::LiveInterval&, bool) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4b26e19)
#13 0x0000564b02685125 llvm::LiveIntervals::repairIntervalsInRange(llvm::MachineBasicBlock*, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::ArrayRef<llvm::Register>) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4b15125)
#14 0x0000564b02ad6b7f llvm::WindowScheduler::updateLiveIntervals() (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4f66b7f)
#15 0x0000564b02ad31c7 llvm::WindowScheduler::generateTripleMBB() (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4f631c7)
#16 0x0000564b02ad1e2c llvm::WindowScheduler::preProcess() (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4f61e2c)
#17 0x0000564b02ad0af6 llvm::WindowScheduler::run() (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4f60af6)
#18 0x0000564b02749967 llvm::MachinePipeliner::runWindowScheduler(llvm::MachineLoop&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4bd9967)
#19 0x0000564b02747b8b llvm::MachinePipeliner::scheduleLoop(llvm::MachineLoop&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4bd7b8b)
#20 0x0000564b027479eb llvm::MachinePipeliner::runOnMachineFunction(llvm::MachineFunction&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4bd79eb)
#21 0x0000564b027076d2 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x4b976d2)
#22 0x0000564b02c900e6 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x51200e6)
#23 0x0000564b02c98972 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x5128972)
#24 0x0000564b02c90bc2 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x5120bc2)
#25 0x0000564b039d0e20 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, 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*) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x5e60e20)
#26 0x0000564b039f7f87 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x5e87f87)
#27 0x0000564b04e87f69 clang::ParseAST(clang::Sema&, bool, bool) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x7317f69)
#28 0x0000564b03e8ddbd clang::FrontendAction::Execute() (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x631ddbd)
#29 0x0000564b03df1c9d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x6281c9d)
#30 0x0000564b03f6ac4c clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x63fac4c)
#31 0x0000564b011eb5d5 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x367b5d5)
#32 0x0000564b011e7c1d ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#33 0x0000564b03c16709 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) Job.cpp:0:0
#34 0x0000564b03119106 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x55a9106)
#35 0x0000564b03c15da3 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x60a5da3)
#36 0x0000564b03bcd957 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x605d957)
#37 0x0000564b03bcdeb7 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x605deb7)
#38 0x0000564b03bf0659 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x6080659)
#39 0x0000564b011e70bd clang_main(int, char**, llvm::ToolContext const&) (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x36770bd)
#40 0x0000564b011f8a46 main (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x3688a46)
#41 0x00007f8e32aabc88 (/usr/lib/libc.so.6+0x25c88)
#42 0x00007f8e32aabd4c __libc_start_main (/usr/lib/libc.so.6+0x25d4c)
#43 0x0000564b011e54e5 _start (/home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin/clang-20+0x36754e5)
clang: error: clang frontend command failed with exit code 134 (use -v to see invocation)
ClangBuiltLinux clang version 20.0.0git (https://github.com/llvm/llvm-project.git d27ee36cdef28845b4aba4f438c7d8bef4be4da7)
Target: hexagon
Thread model: posix
InstalledDir: /home/nathan/tmp/cvise.pDMTndXeEh/install/llvm-bad/bin
Build config: +assertions
clang: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs.
```

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


More information about the llvm-commits mailing list