llvm / llvm/llvm-project

clang crashes on valid code at -O{s,2,3} on x86_64-linux-gnu: Assertion `(isa<SCEVCouldNotCompute>(ConstantMaxNotTaken) || isa<SCEVConstant>(ConstantMaxNotTaken)) && "No point in having a non-constant max backedge taken count!"' failed

Open
#202,343 1 comment 0 reactions 0 assignees View on GitHub
confirmed crash-on-valid llvm:SCEV
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

Compiler Explorer: https://godbolt.org/z/E4cPdf4Mh

Note:
- fails: 21.1.0 till trunk
- works: 20.1.0 and earlier

```
[520] % clangtk -v
clang version 23.0.0git (https://github.com/llvm/llvm-project.git 86940d72a1eba54d0a6a01bc5d418e6864344d64)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /local/home/suz/suz-local/software/local/clang-trunk/bin
Build config: +assertions
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
Found CUDA installation: /usr/local/cuda, version 12.1
[521] %
[521] % clangtk -O3 small.c
clang-23: /local/suz-local/software/clangbuild/llvm-project/llvm/lib/Analysis/ScalarEvolution.cpp:9078: llvm::ScalarEvolution::ExitLimit::ExitLimit(const llvm::SCEV*, const llvm::SCEV*, const llvm::SCEV*, bool, llvm::ArrayRef >): Assertion `(isa(ConstantMaxNotTaken) || isa(ConstantMaxNotTaken)) && "No point in having a non-constant max backedge taken count!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and dumped files.
Stack dump:
0. Program arguments: /local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23 -cc1 -triple x86_64-unknown-linux-gnu -O3 -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -main-file-name small.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/local/suz-local/software/emitesting/bugs/bug265 -fcoverage-compilation-dir=/local/suz-local/software/emitesting/bugs/bug265 -resource-dir /local/home/suz/suz-local/software/local/clang-trunk/lib/clang/23 -I /usr/local/include -I /local/suz-local/software/local/include -internal-isystem /local/home/suz/suz-local/software/local/clang-trunk/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fmessage-length=150 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -vectorize-loops -vectorize-slp -faddrsig -fdwarf2-cfi-asm -o /tmp/small-3aa288.o -x c small.c
1. parser at end of file
2. Optimizer
3. Running pass "function(drop-unnecessary-assumes,float2int,lower-constant-intrinsics,chr,loop(loop-rotate,loop-deletion),loop-distribute,inject-tli-mappings,loop-vectorize,drop-unnecessary-assumes,infer-alignment,loop-load-elim,instcombine,simplifycfg,slp-vectorizer,vector-combine,instcombine,loop-unroll,transform-warning,sroa,infer-alignment,instcombine,loop-mssa(licm),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,mergeicmps,expand-memcmp,tailcallelim,simplifycfg)" on module "small.c"
4. Running pass "loop(loop-rotate,loop-deletion)" on function "main"
#0 0x000055fef9d9af40 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x4555f40)
#1 0x000055fef9d97b0c llvm::sys::RunSignalHandlers() (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x4552b0c)
#2 0x000055fef9d97c72 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x000055fef9d97d2c SignalHandlerTerminate(int, siginfo_t*, void*) Signals.cpp:0:0
#4 0x00007efe20147520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#5 0x00007efe2019b9fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#6 0x00007efe2019b9fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#7 0x00007efe2019b9fc pthread_kill ./nptl/pthread_kill.c:89:10
#8 0x00007efe20147476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
#9 0x00007efe2012d7f3 abort ./stdlib/abort.c:81:7
#10 0x00007efe2012d71b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#11 0x00007efe2013ee96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#12 0x000055fef8c90ce4 llvm::ScalarEvolution::ExitLimit::ExitLimit(llvm::SCEV const*, llvm::SCEV const*, llvm::SCEV const*, bool, llvm::ArrayRef>) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x344bce4)
#13 0x000055fef8cf8793 llvm::ScalarEvolution::howManyGreaterThans(llvm::SCEV const*, llvm::SCEV const*, llvm::Loop const*, bool, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x34b3793)
#14 0x000055fef8cb89a9 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::CmpPredicate, llvm::SCEVUseT, llvm::SCEVUseT, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x34739a9)
#15 0x000055fef8ccf0b7 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::ICmpInst*, bool, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x348a0b7)
#16 0x000055fef8cb9525 llvm::ScalarEvolution::computeExitLimitFromCondImpl(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3474525)
#17 0x000055fef8cb9a6a llvm::ScalarEvolution::computeExitLimitFromCondCached(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3474a6a)
#18 0x000055fef8cb9cf8 llvm::ScalarEvolution::computeExitLimitFromCond(llvm::Loop const*, llvm::Value*, bool, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3474cf8)
#19 0x000055fef8cb9fd0 llvm::ScalarEvolution::computeExitLimit(llvm::Loop const*, llvm::BasicBlock*, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3474fd0)
#20 0x000055fef8cba39e llvm::ScalarEvolution::computeBackedgeTakenCount(llvm::Loop const*, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x347539e)
#21 0x000055fef8cbb0ee llvm::ScalarEvolution::getBackedgeTakenInfo(llvm::Loop const*) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x34760ee)
#22 0x000055fef8cdc6c5 llvm::ScalarEvolution::getBackedgeTakenCount(llvm::Loop const*, llvm::ScalarEvolution::ExitCountKind) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x34976c5)
#23 0x000055fefe16308a llvm::LoopDeletionPass::run(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x891e08a)
#24 0x000055fefb067986 llvm::detail::PassModel, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x5822986)
#25 0x000055fef9b9a9af std::optional llvm::PassManager, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runSinglePass, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>>(llvm::Loop&, std::unique_ptr, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>, std::default_delete, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>>>&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&, llvm::PassInstrumentation&) (.isra.0) LoopPassManager.cpp:0:0
#26 0x000055fef9b9bed0 llvm::PassManager, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::runWithoutLoopNestPasses(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x4356ed0)
#27 0x000055fef9b9c26c llvm::PassManager, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x435726c)
#28 0x000055fef9b9d2ba llvm::FunctionToLoopPassAdaptor::run(llvm::Function&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x43582ba)
#29 0x000055fef6c9bc26 llvm::detail::PassModel>::run(llvm::Function&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x1456c26)
#30 0x000055fef96ac197 llvm::PassManager>::run(llvm::Function&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3e67197)
#31 0x000055fef6c9ddc6 llvm::detail::PassModel>, llvm::AnalysisManager>::run(llvm::Function&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x1458dc6)
#32 0x000055fef96aa164 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3e65164)
#33 0x000055fef6c9e4b6 llvm::detail::PassModel>::run(llvm::Module&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x14594b6)
#34 0x000055fef96aad07 llvm::PassManager>::run(llvm::Module&, llvm::AnalysisManager&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x3e65d07)
#35 0x000055fefa1c506c (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr>&, std::unique_ptr>&, clang::BackendConsumer*) BackendUtil.cpp:0:0
#36 0x000055fefa1c91fe clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr, std::unique_ptr>, clang::BackendConsumer*) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x49841fe)
#37 0x000055fefa8a8742 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x5063742)
#38 0x000055fefc3b626c clang::ParseAST(clang::Sema&, bool, bool) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x6b7126c)
#39 0x000055fefac0e631 clang::FrontendAction::Execute() (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x53c9631)
#40 0x000055fefab87d65 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x5342d65)
#41 0x000055fefad09563 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0x54c4563)
#42 0x000055fef67ca722 cc1_main(llvm::ArrayRef, char const*, void*) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0xf85722)
#43 0x000055fef67c00fa ExecuteCC1Tool(llvm::SmallVectorImpl&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr) driver.cpp:0:0
#44 0x000055fef67c451e clang_main(int, char**, llvm::ToolContext const&) (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0xf7f51e)
#45 0x000055fef6685691 main (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0xe40691)
#46 0x00007efe2012ed90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#47 0x00007efe2012ee40 call_init ./csu/../csu/libc-start.c:128:20
#48 0x00007efe2012ee40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#49 0x000055fef67bf815 _start (/local/home/suz/suz-local/software/local/clang-trunk/bin/clang-23+0xf7a815)
clangtk: error: unable to execute command: Aborted
clangtk: error: clang frontend command failed with exit code -2 (use -v to see invocation)
clang version 23.0.0git (https://github.com/llvm/llvm-project.git 86940d72a1eba54d0a6a01bc5d418e6864344d64)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /local/home/suz/suz-local/software/local/clang-trunk/bin
Build config: +assertions
clangtk: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING CRASH REPRODUCER FILES TO THE BUG REPORT:
clangtk: note: diagnostic msg: /tmp/small-604098.c
clangtk: note: diagnostic msg: /tmp/small-604098.sh
clangtk: note: diagnostic msg:

********************
Aborted
```

```
short a;
int b, c;
int main() {
short *e = &a;
int f = 1;
*e += a - 1;
b = -671326422;
c = b;
c += a;
L:
f = 33 * c - ~f;
if (c <= f)
goto L;
return 0;
}
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the crash with the linked Compiler Explorer case or the shown clang -O3 small.c command. Start in llvm/lib/Analysis/ScalarEvolution.cpp around ExitLimit::ExitLimit at line 9078, then follow the LoopDeletionPass stack path. Done means valid input no longer triggers the assertion and the regression is covered by an appropriate test.

Written by the indexing model from the issue text.

Assessment

Tech stack
c
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.