[llvm] [LoopCacheAnalysis] Replace delinearization for fixed size array (PR #164798)
Mikael Holmen via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 23 23:17:25 PST 2025
mikaelholmen wrote:
Hello @kasuga-fj
The following starts crashing with this patch:
```opt -passes="loop-interchange" bbi-113032.ll -o /dev/null```
It crashes like
```
opt: ../lib/Analysis/LoopCacheAnalysis.cpp:372: bool llvm::IndexedReference::tryDelinearizeFixedSize(const SCEV *, SmallVectorImpl<const SCEV *> &, const SCEV *): Assertion `!Sizes.empty() && Subscripts.size() == Sizes.size() && Sizes.back() == ElementSize && "Unexpected delinearization result"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
Stack dump:
0. Program arguments: build-all/bin/opt -passes=loop-interchange bbi-113032.ll -o /dev/null
1. Running pass "function(loop(loop-interchange))" on module "bbi-113032.ll"
2. Running pass "loop(loop-interchange)" on function "test_a2_cm_i16_1"
#0 0x000055b598230f96 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (build-all/bin/opt+0x4f43f96)
#1 0x000055b59822e525 llvm::sys::RunSignalHandlers() (build-all/bin/opt+0x4f41525)
#2 0x000055b598232119 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x00007f436760c990 __restore_rt (/lib64/libpthread.so.0+0x12990)
#4 0x00007f4364fac52f raise (/lib64/libc.so.6+0x4e52f)
#5 0x00007f4364f7fe65 abort (/lib64/libc.so.6+0x21e65)
#6 0x00007f4364f7fd39 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21d39)
#7 0x00007f4364fa4e86 (/lib64/libc.so.6+0x46e86)
#8 0x000055b599e7dfae llvm::IndexedReference::delinearize(llvm::LoopInfo const&) (build-all/bin/opt+0x6b90fae)
#9 0x000055b599e7d0c4 llvm::IndexedReference::IndexedReference(llvm::Instruction&, llvm::LoopInfo const&, llvm::ScalarEvolution&) (build-all/bin/opt+0x6b900c4)
#10 0x000055b599e80fef llvm::CacheCost::populateReferenceGroups(llvm::SmallVector<llvm::SmallVector<std::unique_ptr<llvm::IndexedReference, std::default_delete<llvm::IndexedReference>>, 8u>, 8u>&) const (build-all/bin/opt+0x6b93fef)
#11 0x000055b599e80773 llvm::CacheCost::calculateCacheFootprint() (build-all/bin/opt+0x6b93773)
#12 0x000055b599e80c94 llvm::CacheCost::getCacheCost(llvm::Loop&, llvm::LoopStandardAnalysisResults&, llvm::DependenceInfo&, std::optional<unsigned int>) (build-all/bin/opt+0x6b93c94)
#13 0x000055b599e7ac8b (anonymous namespace)::CacheCostManager::computeIfUnitinialized() LoopInterchange.cpp:0:0
#14 0x000055b599e7447e (anonymous namespace)::LoopInterchange::processLoop(llvm::SmallVectorImpl<llvm::Loop*>&, unsigned int, unsigned int, std::vector<std::vector<char, std::allocator<char>>, std::allocator<std::vector<char, std::allocator<char>>>>&, (anonymous namespace)::CacheCostManager&) LoopInterchange.cpp:0:0
#15 0x000055b599e705d9 llvm::LoopInterchangePass::run(llvm::LoopNest&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (build-all/bin/opt+0x6b835d9)
#16 0x000055b59974373d llvm::detail::PassModel<llvm::LoopNest, llvm::LoopInterchangePass, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::LoopNest&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) PassBuilderPipelines.cpp:0:0
#17 0x000055b5999f4e5d std::optional<llvm::PreservedAnalyses> llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runSinglePass<llvm::LoopNest, std::unique_ptr<llvm::detail::PassConcept<llvm::LoopNest, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete<llvm::detail::PassConcept<llvm::LoopNest, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>>(llvm::LoopNest&, std::unique_ptr<llvm::detail::PassConcept<llvm::LoopNest, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete<llvm::detail::PassConcept<llvm::LoopNest, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&, llvm::PassInstrumentation&) (build-all/bin/opt+0x6707e5d)
#18 0x000055b5999f4155 llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runWithLoopNestPasses(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (build-all/bin/opt+0x6707155)
#19 0x000055b5999f3cee llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (build-all/bin/opt+0x6706cee)
#20 0x000055b59973941d llvm::detail::PassModel<llvm::Loop, llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) PassBuilderPipelines.cpp:0:0
#21 0x000055b5999f5aa0 llvm::FunctionToLoopPassAdaptor::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build-all/bin/opt+0x6708aa0)
#22 0x000055b59973bf0d llvm::detail::PassModel<llvm::Function, llvm::FunctionToLoopPassAdaptor, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilderPipelines.cpp:0:0
#23 0x000055b598454425 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (build-all/bin/opt+0x5167425)
#24 0x000055b59973dbed llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) PassBuilderPipelines.cpp:0:0
#25 0x000055b598458d3e llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (build-all/bin/opt+0x516bd3e)
#26 0x000055b5996cca8d llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) NewPMDriver.cpp:0:0
#27 0x000055b5984530e5 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (build-all/bin/opt+0x51660e5)
#28 0x000055b5996c4fb4 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::RTLIB::RuntimeLibcallsInfo&, 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, bool) (build-all/bin/opt+0x63d7fb4)
#29 0x000055b5981d2593 optMain (build-all/bin/opt+0x4ee5593)
#30 0x00007f4364f987e5 __libc_start_main (/lib64/libc.so.6+0x3a7e5)
#31 0x000055b5981cff2e _start (build-all/bin/opt+0x4ee2f2e)
Abort (core dumped)
```
[bbi-113032.ll.gz](https://github.com/user-attachments/files/23707405/bbi-113032.ll.gz)
https://godbolt.org/z/fWaqYYqej
https://github.com/llvm/llvm-project/pull/164798
More information about the llvm-commits
mailing list