[llvm] [Valuetracking] Use all FPClasses ordering information for min/max (PR #199651)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 1 06:47: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: 2666b44bdc9d2098d394c0afce91a00437b75823 -->
<!-- llvm-hackme-head-sha: 230961b77a82a3c1186092f05ca2fb666c7c7e3b -->
<!-- llvm-hackme-patch-sha256: 643a6822fac2fb44482bd93ded1bc9e63266a136a154843ab2330765bcd76040 -->
<!-- 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.
## Reproducer
**Kind**: crash
**IR Reproducer**:
```llvm
; RUN: opt -passes=attributor -S
define float @f() {
%r = call float @llvm.maxnum.f32(float poison, float poison)
ret float %r
}
```
**Stacktrace**:
```
opt: ../llvm-project-pr/llvm/include/llvm/ADT/BitmaskEnum.h:137: constexpr std::underlying_type_t<Enum> llvm::BitmaskEnumDetail::Underlying(E) [with E = llvm::FPClassTest; std::underlying_type_t<Enum> = unsigned int]: Assertion `U <= Mask<E>() && "Enum value too large (or largest val too small?)"' 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/tmp7zw6ptw3.ll -passes=attributor
1. Running pass "attributor" on module "/tmp/tmp7zw6ptw3.ll"
#0 0x00007ffff7e16892 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/Unix/Signals.inc:884:3
#1 0x00007ffff7e1336c llvm::sys::RunSignalHandlers() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/Signals.cpp:108:20
#2 0x00007ffff7e13571 SignalHandler(int, siginfo_t*, void*) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/Unix/Signals.inc:448: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 0x00007ffff7d236b5 (/llvm-hackme/work/llvm-hackme/llvm-build-pr/bin/../lib/libLLVMSupport.so.23.0git+0x1236b5)
#10 0x00007ffff7d24027 (/llvm-hackme/work/llvm-hackme/llvm-build-pr/bin/../lib/libLLVMSupport.so.23.0git+0x124027)
#11 0x00007ffff7d4978d std::underlying_type<llvm::FPClassTest>::type llvm::BitmaskEnumDetail::Underlying<llvm::FPClassTest>(llvm::FPClassTest) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/BitmaskEnum.h:137:3
#12 0x00007ffff7d4978d llvm::FPClassTest llvm::BitmaskEnumDetail::operator~<llvm::FPClassTest, void>(llvm::FPClassTest) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/BitmaskEnum.h:153:36
#13 0x00007ffff7d4978d llvm::KnownFPClass::knownNot(llvm::FPClassTest) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Support/KnownFPClass.h:176:37
#14 0x00007ffff7d4978d llvm::KnownFPClass::minMaxLike(llvm::KnownFPClass const&, llvm::KnownFPClass const&, llvm::KnownFPClass::MinMaxKind, llvm::DenormalMode) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Support/KnownFPClass.cpp:112:21
#15 0x00007fffeead6074 computeKnownFPClass(llvm::Value const*, llvm::APInt const&, llvm::FPClassTest, llvm::KnownFPClass&, llvm::SimplifyQuery const&, unsigned int) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ValueTracking.cpp:5341:13
#16 0x00007fffeead8592 llvm::APInt::~APInt() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/APInt.h:192:5
#17 0x00007fffeead8592 computeKnownFPClass(llvm::Value const*, llvm::KnownFPClass&, llvm::FPClassTest, llvm::SimplifyQuery const&, unsigned int) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ValueTracking.cpp:4928:1
#18 0x00007fffeead864a llvm::computeKnownFPClass(llvm::Value const*, llvm::FPClassTest, llvm::SimplifyQuery const&, unsigned int) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Analysis/ValueTracking.cpp:6143:10
#19 0x00007ffff1182a57 std::underlying_type<llvm::FPClassTest>::type llvm::BitmaskEnumDetail::Underlying<llvm::FPClassTest>(llvm::FPClassTest) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/BitmaskEnum.h:137:3
#20 0x00007ffff1182a57 llvm::FPClassTest llvm::BitmaskEnumDetail::operator~<llvm::FPClassTest, void>(llvm::FPClassTest) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/BitmaskEnum.h:153:36
#21 0x00007ffff1182a57 (anonymous namespace)::AANoFPClassImpl::initialize(llvm::Attributor&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/AttributorAttributes.cpp:10527:20
#22 0x00007ffff1181fa4 llvm::AANoFPClass const* llvm::Attributor::getOrCreateAAFor<llvm::AANoFPClass>(llvm::IRPosition, llvm::AbstractAttribute const*, llvm::DepClassTy, bool, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Transforms/IPO/Attributor.h:1643:7
#23 0x00007ffff11a45dd operator() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/AttributorAttributes.cpp:388:5
#24 0x00007ffff11a45dd bool llvm::function_ref<bool (llvm::Value&)>::callback_fn<void clampReturnedValueStates<llvm::AANoFPClass, llvm::BitIntegerState<unsigned int, 1023u, 0u>, (llvm::Attribute::AttrKind)0, false>(llvm::Attributor&, llvm::AANoFPClass const&, llvm::BitIntegerState<unsigned int, 1023u, 0u>&, llvm::CallBase const*)::'lambda'(llvm::Value&)>(long, llvm::Value&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:52
#25 0x00007ffff11018cd llvm::function_ref<bool (llvm::Value&)>::operator()(llvm::Value&) const /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:12
#26 0x00007ffff11018cd operator() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:2085:16
#27 0x00007ffff11018cd operator()<llvm::AA::ValueAndContext*> /usr/include/c++/11/bits/predefined_ops.h:395:24
#28 0x00007ffff11018cd __find_if<llvm::AA::ValueAndContext*, __gnu_cxx::__ops::_Iter_negate<llvm::Attributor::checkForAllReturnedValues(llvm::function_ref<bool(llvm::Value&)>, const llvm::AbstractAttribute&, llvm::AA::ValueScope, bool)::<lambda(const llvm::AA::ValueAndContext&)> > > /usr/include/c++/11/bits/stl_algobase.h:2099:14
#29 0x00007ffff11018cd __find_if_not<llvm::AA::ValueAndContext*, __gnu_cxx::__ops::_Iter_pred<llvm::Attributor::checkForAllReturnedValues(llvm::function_ref<bool(llvm::Value&)>, const llvm::AbstractAttribute&, llvm::AA::ValueScope, bool)::<lambda(const llvm::AA::ValueAndContext&)> > > /usr/include/c++/11/bits/stl_algo.h:106:28
#30 0x00007ffff11018cd find_if_not<llvm::AA::ValueAndContext*, llvm::Attributor::checkForAllReturnedValues(llvm::function_ref<bool(llvm::Value&)>, const llvm::AbstractAttribute&, llvm::AA::ValueScope, bool)::<lambda(const llvm::AA::ValueAndContext&)> > /usr/include/c++/11/bits/stl_algo.h:513:32
#31 0x00007ffff11018cd all_of<llvm::AA::ValueAndContext*, llvm::Attributor::checkForAllReturnedValues(llvm::function_ref<bool(llvm::Value&)>, const llvm::AbstractAttribute&, llvm::AA::ValueScope, bool)::<lambda(const llvm::AA::ValueAndContext&)> > /usr/include/c++/11/bits/stl_algo.h:453:40
#32 0x00007ffff11018cd all_of<llvm::SmallVector<llvm::AA::ValueAndContext>&, llvm::Attributor::checkForAllReturnedValues(llvm::function_ref<bool(llvm::Value&)>, const llvm::AbstractAttribute&, llvm::AA::ValueScope, bool)::<lambda(const llvm::AA::ValueAndContext&)> > /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/STLExtras.h:1739:21
#33 0x00007ffff11018cd llvm::Attributor::checkForAllReturnedValues(llvm::function_ref<bool (llvm::Value&)>, llvm::AbstractAttribute const&, llvm::AA::ValueScope, bool) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:2084:22
#34 0x00007ffff11a42ea clampReturnedValueStates<llvm::AANoFPClass, llvm::BitIntegerState<unsigned int, 1023, 0>, (llvm::Attribute::AttrKind)0, false> /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/AttributorAttributes.cpp:401:3
#35 0x00007ffff11a42ea (anonymous namespace)::AAReturnedFromReturnedValues<llvm::AANoFPClass, (anonymous namespace)::AANoFPClassImpl, llvm::BitIntegerState<unsigned int, 1023u, 0u>, false, (llvm::Attribute::AttrKind)0, false>::updateImpl(llvm::Attributor&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/AttributorAttributes.cpp:424:53
#36 0x00007ffff10de97a llvm::AbstractAttribute::update(llvm::Attributor&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:1138:3
#37 0x00007ffff10de97a llvm::AbstractAttribute::update(llvm::Attributor&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:1129:14
#38 0x00007ffff10f8dee llvm::Attributor::updateAA(llvm::AbstractAttribute&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:2763:19
#39 0x00007ffff110bdb4 llvm::AANoFPClass const* llvm::Attributor::getOrCreateAAFor<llvm::AANoFPClass>(llvm::IRPosition, llvm::AbstractAttribute const*, llvm::DepClassTy, bool, bool) (.isra.0) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Transforms/IPO/Attributor.h:1659:13
#40 0x00007ffff110e7c3 llvm::AANoFPClass const* llvm::Attributor::getOrCreateAAFor<llvm::AANoFPClass>(llvm::IRPosition const&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/Transforms/IPO/Attributor.h:1671:53
#41 0x00007ffff110e7c3 llvm::Attributor::identifyDefaultAbstractAttributes(llvm::Function&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:3524:38
#42 0x00007ffff1117d43 runAttributorOnFunctions(llvm::InformationCache&, llvm::SetVector<llvm::Function*, llvm::SmallVector<llvm::Function*, 0u>, llvm::DenseSet<llvm::Function*, llvm::DenseMapInfo<llvm::Function*, void> >, 0u>&, llvm::AnalysisGetter&, llvm::CallGraphUpdater&, bool, bool) (.constprop.0) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:3946:22
#43 0x00007ffff1118a2b llvm::SmallPtrSet<void*, 2u>::SmallPtrSet() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:547:25
#44 0x00007ffff1118a2b llvm::PreservedAnalyses::PreservedAnalyses() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/Analysis.h:112:7
#45 0x00007ffff1118a2b llvm::PreservedAnalyses::none() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/Analysis.h:115:62
#46 0x00007ffff1118a2b llvm::AttributorPass::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/lib/Transforms/IPO/Attributor.cpp:4109:36
#47 0x00007ffff16fa766 llvm::detail::PassModel<llvm::Module, llvm::AttributorPass, 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/PassManagerInternal.h:94:3
#48 0x00007fffee2e49ef 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
#49 0x00007ffff7f91db4 llvm::SmallPtrSetImplBase::~SmallPtrSetImplBase() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:89:5
#50 0x00007ffff7f91db4 llvm::SmallPtrSetImpl<llvm::AnalysisKey*>::~SmallPtrSetImpl() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:366:35
#51 0x00007ffff7f91db4 llvm::SmallPtrSet<llvm::AnalysisKey*, 2u>::~SmallPtrSet() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/ADT/SmallPtrSet.h:533:7
#52 0x00007ffff7f91db4 llvm::PreservedAnalyses::~PreservedAnalyses() /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/include/llvm/IR/Analysis.h:112:7
#53 0x00007ffff7f91db4 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:582:10
#54 0x00007ffff7f9f9e7 optMain /llvm-hackme/work/llvm-hackme/llvm-build-pr/../llvm-project-pr/llvm/tools/opt/optdriver.cpp:805:25
#55 0x00007ffff7a00d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#56 0x00007ffff7a00e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#57 0x0000555555555095 _start (/llvm-hackme/work/llvm-hackme/llvm-build-pr/bin/opt+0x1095)
```
**Baseline Revision**: `2666b44bdc9d2098d394c0afce91a00437b75823`
**PR Head SHA**: `230961b77a82a3c1186092f05ca2fb666c7c7e3b`
**Patch SHA256**: `643a6822fac2fb44482bd93ded1bc9e63266a136a154843ab2330765bcd76040`
https://github.com/llvm/llvm-project/pull/199651
More information about the llvm-commits
mailing list