[llvm] [InstCombine] Avoid rewriting multi-use post-inc latch icmps (preserve nsw/nuw for later passes) (PR #215960)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 00:32:44 PDT 2026


dtcxzyw wrote:

The following correctness issue was found by [llvm-hackme](https://github.com/dtcxzyw/llvm-hackme).

<!-- llvm-hackme-state: bug_found -->
<!-- llvm-hackme-baseline: 6651a116b6f5ab6e9812be29b33e1fa6bdaaf76c -->
<!-- llvm-hackme-head-sha: 2b7f5f883614f6262e4d18458f8167da9fc36418 -->
<!-- llvm-hackme-patch-sha256: a1c60e0bf955b30910910d70fdddaa10d9925353eba811dd20c2d95dcc946918 -->
<!-- llvm-hackme-kind: crash -->

This comment is generated by an automated correctness checking service designed to help identify critical correctness bugs (opt crashes or Alive2 miscompilations) and improve PR review efficiency under limited reviewer bandwidth.

The reproducer was generated by LLM.

This bug is a regression introduced by this PR. It does not reproduce on the baseline commit.

## Reproducer

**Kind**: crash

**IR Reproducer**:
```llvm
; RUN: opt -passes=print<scalar-evolution> -S
define void @t(ptr %p) {
entry:
  br label %loop
loop:
  %iv = phi ptr [ %p, %entry ], [ %iv2, %loop ]
  %iv2 = getelementptr inbounds i8, ptr %iv, i64 4
  %cmp = icmp ule ptr %iv2, %p
  br i1 %cmp, label %loop, label %exit
exit:
  ret void
}
```

**Stacktrace**:
```
Printing analysis 'Scalar Evolution Analysis' for function 't':
Classifying expressions for: @t
  %iv = phi ptr [ %p, %entry ], [ %iv2, %loop ]
  -->  opt: ../llvm-project-pr/llvm/include/llvm/Support/Casting.h:572: decltype(auto) llvm::cast(From*) [with To = llvm::IntegerType; From = llvm::Type]: Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' 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: /llvm-hackme/work/llvm-hackme/llvm-build-pr/bin/opt -S -o /dev/null /tmp/tmp9xvlbgud.ll -passes=print<scalar-evolution>
1.	Running pass "function(print<scalar-evolution>)" on module "/tmp/tmp9xvlbgud.ll"
2.	Running pass "print<scalar-evolution>" on function "t"
 #0 0x00007ffff7e1a882 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/Unix/Signals.inc:931:22
 #1 0x00007ffff7e174bc llvm::sys::RunSignalHandlers() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/Signals.cpp:108:20
 #2 0x00007ffff7e176c5 SignalHandler(int, siginfo_t*, void*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/Unix/Signals.inc:474:14
 #3 0x00007ffff7a19520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007ffff7a6d9fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #5 0x00007ffff7a19476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #6 0x00007ffff79ff7f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #7 0x00007ffff79ff71b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
 #8 0x00007ffff7a10e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
 #9 0x00007fffee5e1995 (/llvm-hackme/work/llvm-hackme/llvm-build-pr/bin/../lib/../lib/libLLVMAnalysis.so.24.0git+0x3e1995)
#10 0x00007fffee643eef decltype(auto) llvm::dyn_cast<llvm::SCEVConstant, llvm::SCEV const>(llvm::SCEV const*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:2418:1
#11 0x00007fffee643eef llvm::ScalarEvolution::willNotOverflow(llvm::Instruction::BinaryOps, bool, llvm::SCEV const*, llvm::SCEV const*, llvm::Instruction const*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:2385:38
#12 0x00007fffee65748f llvm::ScalarEvolution::howManyLessThansViaPreInc(llvm::SCEV const*, llvm::SCEV const*, llvm::Loop const*, bool, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:13446:57
#13 0x00007fffee658103 llvm::simplify_type<llvm::SCEV const* const>::getSimplifiedValue(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:48:75
#14 0x00007fffee658103 llvm::CastInfo<llvm::SCEVCouldNotCompute, llvm::SCEV const* const, void>::isPossible(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:510:48
#15 0x00007fffee658103 bool llvm::isa<llvm::SCEVCouldNotCompute, llvm::SCEV const*>(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:548:47
#16 0x00007fffee658103 llvm::ScalarEvolution::ExitLimit::hasFullInfo() const /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Analysis/ScalarEvolution.h:1370:39
#17 0x00007fffee658103 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::CmpPredicate, llvm::SCEVUseT<llvm::SCEV const*>, llvm::SCEVUseT<llvm::SCEV const*>, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9623:28
#18 0x00007fffee6586d5 llvm::simplify_type<llvm::SCEV const* const>::getSimplifiedValue(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:48:75
#19 0x00007fffee6586d5 llvm::CastInfo<llvm::SCEVCouldNotCompute, llvm::SCEV const* const, void>::isPossible(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:510:48
#20 0x00007fffee6586d5 bool llvm::isa<llvm::SCEVCouldNotCompute, llvm::SCEV const*>(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:548:47
#21 0x00007fffee6586d5 llvm::ScalarEvolution::ExitLimit::hasAnyInfo() const /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Analysis/ScalarEvolution.h:1364:39
#22 0x00007fffee6586d5 llvm::ScalarEvolution::computeExitLimitFromICmp(llvm::Loop const*, llvm::ICmpInst*, bool, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9433:20
#23 0x00007fffee658f35 llvm::simplify_type<llvm::SCEV const* const>::getSimplifiedValue(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:48:75
#24 0x00007fffee658f35 llvm::CastInfo<llvm::SCEVCouldNotCompute, llvm::SCEV const* const, void>::isPossible(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:510:48
#25 0x00007fffee658f35 bool llvm::isa<llvm::SCEVCouldNotCompute, llvm::SCEV const*>(llvm::SCEV const* const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/Casting.h:548:47
#26 0x00007fffee658f35 llvm::ScalarEvolution::ExitLimit::hasFullInfo() const /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Analysis/ScalarEvolution.h:1370:39
#27 0x00007fffee658f35 llvm::ScalarEvolution::computeExitLimitFromCondImpl(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9291:23
#28 0x00007fffee6594a5 llvm::ScalarEvolution::computeExitLimitFromCondCached(llvm::ScalarEvolution::ExitLimitCache&, llvm::Loop const*, llvm::Value*, bool, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9274:15
#29 0x00007fffee659610 llvm::ScalarEvolution::computeExitLimitFromCond(llvm::Loop const*, llvm::Value*, bool, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9229:74
#30 0x00007fffee612b43 llvm::ScalarEvolution::computeExitLimit(llvm::Loop const*, llvm::BasicBlock*, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9204:52
#31 0x00007fffee612e3f llvm::ScalarEvolution::computeBackedgeTakenCount(llvm::Loop const*, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:9115:5
#32 0x00007fffee6137b2 llvm::ScalarEvolution::BackedgeTakenInfo::hasAnyInfo() const /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Analysis/ScalarEvolution.h:1809:36
#33 0x00007fffee6137b2 llvm::ScalarEvolution::getBackedgeTakenInfo(llvm::Loop const*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:8688:24
#34 0x00007fffee632355 llvm::ScalarEvolution::getBackedgeTakenCount(llvm::Loop const*, llvm::ScalarEvolution::ExitCountKind) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:8621:1
#35 0x00007fffee61655f llvm::ScalarEvolution::getConstantMaxBackedgeTakenCount(llvm::Loop const*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Analysis/ScalarEvolution.h:1102:33
#36 0x00007fffee61655f llvm::ScalarEvolution::getRangeRef(llvm::SCEV const*, llvm::ScalarEvolution::RangeSignHint, unsigned int) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:6927:43
#37 0x00007fffee651f6c llvm::ScalarEvolution::getSignedRange(llvm::SCEV const*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Analysis/ScalarEvolution.h:1212:44
#38 0x00007fffee651f6c llvm::ScalarEvolution::inferNoWrapViaConstantRanges(llvm::SCEVAddRecExpr const*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:5176:5
#39 0x00007fffee652e11 llvm::ScalarEvolution::createAddRecFromPHI(llvm::PHINode*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:5987:49
#40 0x00007fffee653166 llvm::ScalarEvolution::createNodeForPHI(llvm::PHINode*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:6138:3
#41 0x00007fffee611733 llvm::ScalarEvolution::createSCEVIter(llvm::Value*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:7669:40
#42 0x00007fffee65ac6a llvm::ScalarEvolution::print(llvm::raw_ostream&) const /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:14475:18
#43 0x00007fffee65b939 llvm::SmallPtrSet<void*, 2u>::SmallPtrSet() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:546:25
#44 0x00007fffee65b939 llvm::PreservedAnalyses::PreservedAnalyses() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/Analysis.h:112:7
#45 0x00007fffee65b939 llvm::PreservedAnalyses::all() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/Analysis.h:119:23
#46 0x00007fffee65b939 llvm::ScalarEvolutionPrinterPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ScalarEvolution.cpp:15217:33
#47 0x00007ffff145df46 llvm::detail::PassModel<llvm::Function, llvm::ScalarEvolutionPrinterPass, llvm::AnalysisManager<llvm::Function> >::runImpl(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function> >&, llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/PassManagerInternal.h:129:3
#48 0x00007fffedd03918 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/PassManagerImpl.h:80:18
#49 0x00007ffff145c5a6 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function> >, llvm::AnalysisManager<llvm::Function> >::runImpl(llvm::detail::PassConcept<llvm::Function, llvm::AnalysisManager<llvm::Function> >&, llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/PassManagerInternal.h:129:3
#50 0x00007fffedd0270c llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/IR/PassManager.cpp:132:41
#51 0x00007ffff145ff36 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module> >::runImpl(llvm::detail::PassConcept<llvm::Module, llvm::AnalysisManager<llvm::Module> >&, llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/PassManagerInternal.h:129:3
#52 0x00007fffedd02168 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/PassManagerImpl.h:80:18
#53 0x00007ffff7f94874 llvm::SmallPtrSetImplBase::~SmallPtrSetImplBase() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:89:5
#54 0x00007ffff7f94874 llvm::SmallPtrSetImpl<llvm::AnalysisKey*>::~SmallPtrSetImpl() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:365:35
#55 0x00007ffff7f94874 llvm::SmallPtrSet<llvm::AnalysisKey*, 2u>::~SmallPtrSet() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:532:7
#56 0x00007ffff7f94874 llvm::PreservedAnalyses::~PreservedAnalyses() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/Analysis.h:112:7
#57 0x00007ffff7f94874 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, 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) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/tools/opt/NewPMDriver.cpp:580:10
#58 0x00007ffff7fa18c4 optMain /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/tools/opt/optdriver.cpp:805:25
#59 0x00007ffff7a00d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#60 0x00007ffff7a00e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#61 0x0000555555555095 _start (/llvm-hackme/work/llvm-hackme/llvm-build-pr/bin/opt+0x1095)
```


**Baseline Revision**: `6651a116b6f5ab6e9812be29b33e1fa6bdaaf76c`
**PR Head SHA**: `2b7f5f883614f6262e4d18458f8167da9fc36418`
**Patch SHA256**: `a1c60e0bf955b30910910d70fdddaa10d9925353eba811dd20c2d95dcc946918`


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


More information about the llvm-commits mailing list