[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