[PowerPC] `Binary operator types must match!` assertion failure with some uses of `@llvm.uadd.with.overflow.i64` on `pwr7` and older
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
```llvm
; ModuleID = 'reduced.bc'
target datalayout = "E-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512"
target triple = "powerpc64-unknown-linux5.10.0-unknown"
; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #0
define fastcc { i64, i1 } @crypto.codecs.base64_hex_ct.base64.encodedLen(i64 %0) {
Entry:
%1 = udiv i64 %0, 3
%2 = icmp ne i64 %0, 0
%3 = zext i1 %2 to i64
%4 = add i64 %1, %3
%5 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 1, i64 %4)
ret { i64, i1 } %5
}
attributes #0 = { nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none) }
```
```console
❯ llc --version | head -n2
LLVM (http://llvm.org/):
LLVM version 22.1.8
❯ llc -O0 reduced.ll
llc: /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:11171: llvm::SDValue llvm::SelectionDAG::getNode(unsigned int, const llvm::SDLoc&, llvm::SDVTList, llvm::ArrayRef, llvm::SDNodeFlags): Assertion `VTList.VTs[0].isInteger() && VTList.VTs[1].isInteger() && Ops[0].getValueType() == Ops[1].getValueType() && Ops[0].getValueType() == VTList.VTs[0] && Ops[2].getValueType() == VTList.VTs[1] && "Binary operator types must match!"' 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: llc -O0 reduced.ll
1. Running pass 'Function Pass Manager' on module 'reduced.ll'.
2. Running pass 'PowerPC DAG->DAG Pattern Instruction Selection' on function '@crypto.codecs.base64_hex_ct.base64.encodedLen'
#0 0x00007d026dc2232d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/alexrp/Sources/llvm/llvm/lib/Support/Unix/Signals.inc:846:3
#1 0x00007d026dc1f464 llvm::sys::RunSignalHandlers() /home/alexrp/Sources/llvm/llvm/lib/Support/Signals.cpp:108:20
#2 0x00007d026dc1fc7c SignalHandler(int, siginfo_t*, void*) /home/alexrp/Sources/llvm/llvm/lib/Support/Unix/Signals.inc:429:14
#3 0x00007d026c445cb0 (/usr/lib/x86_64-linux-gnu/libc.so.6+0x45cb0)
#4 0x00007d026c4a642c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x00007d026c4a642c __pthread_kill_internal ./nptl/pthread_kill.c:89:10
#6 0x00007d026c4a642c pthread_kill ./nptl/pthread_kill.c:100:10
#7 0x00007d026c445b7e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007d026c4288ec internal_signal_block_all ./stdlib/../sysdeps/unix/sysv/linux/internal-signals.h:81:3
#9 0x00007d026c4288ec __abort_lock_wrlock ./stdlib/abort.c:62:3
#10 0x00007d026c4288ec abort ./stdlib/abort.c:85:3
#11 0x00007d026c429979 _IO_acquire_lock_fct ./libio/libioP.h:991:6
#12 0x00007d026c429979 _IO_peekc_locked ./libio/peekc.c:37:3
#13 0x00007d026c43bf75 __libc_message_wrapper ./assert/../include/stdio.h:203:3
#14 0x00007d026c43bf75 __assert_fail ./assert/assert.c:37:3
#15 0x00007d026d57e2ff llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::SDVTList, llvm::ArrayRef, llvm::SDNodeFlags) (.cold) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:11169:5
#16 0x00007d026e860c84 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::SDVTList, llvm::SDValue, llvm::SDValue, llvm::SDValue) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:11304:41
#17 0x00007d026e58fdbe llvm::TrackingMDRef::untrack() /home/alexrp/Sources/llvm/llvm/include/llvm/IR/TrackingMDRef.h:89:9
#18 0x00007d026e58fdbe llvm::TrackingMDRef::~TrackingMDRef() /home/alexrp/Sources/llvm/llvm/include/llvm/IR/TrackingMDRef.h:55:29
#19 0x00007d026e58fdbe llvm::TypedTrackingMDRef::~TypedTrackingMDRef() /home/alexrp/Sources/llvm/llvm/include/llvm/IR/TrackingMDRef.h:106:26
#20 0x00007d026e58fdbe llvm::DebugLoc::~DebugLoc() /home/alexrp/Sources/llvm/llvm/include/llvm/IR/DebugLoc.h:123:7
#21 0x00007d026e58fdbe llvm::SDLoc::~SDLoc() /home/alexrp/Sources/llvm/llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1236:7
#22 0x00007d026e58fdbe (anonymous namespace)::DAGCombiner::visitUADDOLike(llvm::SDValue, llvm::SDValue, llvm::SDNode*) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:3586:44
#23 0x00007d026e61048f (anonymous namespace)::DAGCombiner::visitADDO(llvm::SDNode*) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:3568:5
#24 0x00007d026e65a573 (anonymous namespace)::DAGCombiner::combine(llvm::SDNode*) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:2095:8
#25 0x00007d026e65c4dc Run /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1858:25
#26 0x00007d026e65c4dc llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::BatchAAResults*, llvm::CodeGenOptLevel) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:30768:44
#27 0x00007d026e88636b llvm::TimeRegion::~TimeRegion() /home/alexrp/Sources/llvm/llvm/include/llvm/Support/Timer.h:167:9
#28 0x00007d026e88636b llvm::NamedRegionTimer::~NamedRegionTimer() /home/alexrp/Sources/llvm/llvm/include/llvm/Support/Timer.h:175:8
#29 0x00007d026e88636b llvm::SelectionDAGISel::CodeGenAndEmitDAG() /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:978:3
#30 0x00007d026e88a963 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1937:33
#31 0x00007d026e88bd03 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:635:22
#32 0x00007d0271cb71bc (anonymous namespace)::PPCDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Sources/llvm/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:173:5
#33 0x00007d026e8778f1 llvm::OptLevelChanger::~OptLevelChanger() /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:285:11
#34 0x00007d026e8778f1 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:402:1
#35 0x00007d026e8778f1 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:374:6
#36 0x00007d026e1ab02a llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) /home/alexrp/Sources/llvm/llvm/lib/CodeGen/MachineFunctionPass.cpp:108:30
#37 0x00007d026ddddcaa llvm::FPPassManager::runOnFunction(llvm::Function&) /home/alexrp/Sources/llvm/llvm/lib/IR/LegacyPassManager.cpp:1398:40
#38 0x00007d026ddddeb5 llvm::ilist_detail::node_base_prevnext, true>::getNext() const /home/alexrp/Sources/llvm/llvm/include/llvm/ADT/ilist_node_base.h:42:38
#39 0x00007d026ddddeb5 llvm::ilist_node_impl>::getNext() /home/alexrp/Sources/llvm/llvm/include/llvm/ADT/ilist_node.h:108:66
#40 0x00007d026ddddeb5 llvm::ilist_iterator, false, false>::operator++() /home/alexrp/Sources/llvm/llvm/include/llvm/ADT/ilist_iterator.h:187:25
#41 0x00007d026ddddeb5 llvm::FPPassManager::runOnModule(llvm::Module&) /home/alexrp/Sources/llvm/llvm/lib/IR/LegacyPassManager.cpp:1443:22
#42 0x00007d026ddde74f runOnModule /home/alexrp/Sources/llvm/llvm/lib/IR/LegacyPassManager.cpp:1513:38
#43 0x00007d026ddde74f llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/alexrp/Sources/llvm/llvm/lib/IR/LegacyPassManager.cpp:531:55
#44 0x00005a8b52f929f5 compileModule(char**, llvm::SmallVectorImpl&, llvm::LLVMContext&, std::__cxx11::basic_string, std::allocator>&) /home/alexrp/Sources/llvm/llvm/tools/llc/llc.cpp:874:34
#45 0x00005a8b52f85f5c main /home/alexrp/Sources/llvm/llvm/tools/llc/llc.cpp:462:35
#46 0x00007d026c42a601 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:83:3
#47 0x00007d026c42a718 call_init ./csu/../csu/libc-start.c:128:20
#48 0x00007d026c42a718 __libc_start_main ./csu/../csu/libc-start.c:347:5
#49 0x00005a8b52f86ce5 _start (/opt/llvm-22/bin/llc+0x15ce5)
```
Works with `-mcpu pwr8` and up.
Contributor guide
Assessment
This issue has not been assessed yet.