Skip to content

Assertion llvm::isUIntN(BitWidth, val) && "Value is not an N-bit unsigned value" when using @llvm.usub.with.overflow on Hexagon #127296

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
alexrp opened this issue Feb 15, 2025 · 6 comments · Fixed by #127360

Comments

@alexrp
Copy link
Member

alexrp commented Feb 15, 2025

target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
target triple = "hexagon-unknown-linux4.19.0-musl"

define fastcc void @os.linux.tls.initStatic() {
  %1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 0, i32 1)
  br label %2

2:                                                ; preds = %0
  %3 = extractvalue { i32, i1 } %1, 0
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32) #0

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
❯ llc reduced.ll -march hexagon -O0
llc: /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/APInt.h:127: llvm::APInt::APInt(unsigned int, uint64_t, bool, bool): Assertion `llvm::isUIntN(BitWidth, val) && "Value is not an N-bit unsigned value"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: llc reduced.ll -march hexagon -O0
1.      Running pass 'Function Pass Manager' on module 'reduced.ll'.
2.      Running pass 'Hexagon DAG->DAG Pattern Instruction Selection' on function '@os.linux.tls.initStatic'
 #0 0x0000771d51b80ed2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/alexrp/Source/llvm-project/llvm/lib/Support/Unix/Signals.inc:802:3
 #1 0x0000771d51b7e87f llvm::sys::RunSignalHandlers() /home/alexrp/Source/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #2 0x0000771d51b7ec0d SignalHandler(int) /home/alexrp/Source/llvm-project/llvm/lib/Support/Unix/Signals.inc:415:1
 #3 0x0000771d50445330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x0000771d5049eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x0000771d5049eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x0000771d5049eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x0000771d5044527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x0000771d504288ff abort ./stdlib/abort.c:81:7
 #9 0x0000771d5042881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x0000771d5043b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x0000771d51a220b9 llvm::maxIntN(long) /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/MathExtras.h:252:35
#12 0x0000771d51a220b9 llvm::isIntN(unsigned int, long) /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/MathExtras.h:262:53
#13 0x0000771d51a220b9 llvm::APInt::APInt(unsigned int, unsigned long, bool, bool) /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/APInt.h:120:11
#14 0x0000771d5277f3f6 llvm::SelectionDAG::getConstant(llvm::APInt const&, llvm::SDLoc const&, llvm::EVT, bool, bool) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1674:39
#15 0x0000771d5277f3f6 llvm::SelectionDAG::getConstant(unsigned long, llvm::SDLoc const&, llvm::EVT, bool, bool) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1668:21
#16 0x0000771d555f5de6 llvm::HexagonTargetLowering::LowerUAddSubO(llvm::SDValue, llvm::SelectionDAG&) const /home/alexrp/Source/llvm-project/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp:3275:32
#17 0x0000771d525da658 (anonymous namespace)::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1316:43
#18 0x0000771d525dbb18 llvm::SelectionDAG::Legalize() /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:5842:28
#19 0x0000771d527bbb69 llvm::TimeRegion::~TimeRegion() /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/Timer.h:160:9
#20 0x0000771d527bbb69 llvm::NamedRegionTimer::~NamedRegionTimer() /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/Timer.h:168:8
#21 0x0000771d527bbb69 llvm::SelectionDAGISel::CodeGenAndEmitDAG() /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1079:3
#22 0x0000771d527c0235 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1904:33
#23 0x0000771d527c18f9 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:616:22
#24 0x0000771d555cd384 llvm::HexagonDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h:47:17
#25 0x0000771d527b2227 llvm::OptLevelChanger::~OptLevelChanger() /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:269:11
#26 0x0000771d527b2227 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:376:1
#27 0x0000771d527b2227 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:347:6
#28 0x0000771d520fa4bf llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:94:33
#29 0x0000771d51d45424 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1416:7
#30 0x0000771d51d45641 llvm::ilist_detail::node_base_prevnext<llvm::ilist_node_base<true, void>, true>::getNext() const /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/ilist_node_base.h:42:38
#31 0x0000771d51d45641 llvm::ilist_node_impl<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false, void>>::getNext() /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/ilist_node.h:117:66
#32 0x0000771d51d45641 llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false, void>, false, false>::operator++() /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/ilist_iterator.h:187:25
#33 0x0000771d51d45641 llvm::FPPassManager::runOnModule(llvm::Module&) /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1451:22
#34 0x0000771d51d45e8d runOnModule /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1528:7
#35 0x0000771d51d45e8d llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:539:55
#36 0x000058a5a81e89df compileModule(char**, llvm::LLVMContext&) /home/alexrp/Source/llvm-project/llvm/tools/llc/llc.cpp:753:34
#37 0x000058a5a81dd057 main /home/alexrp/Source/llvm-project/llvm/tools/llc/llc.cpp:411:35
#38 0x0000771d5042a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#39 0x0000771d5042a28b call_init ./csu/../csu/libc-start.c:128:20
#40 0x0000771d5042a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#41 0x000058a5a81ddde5 _start (/opt/llvm-20/bin/llc+0x12de5)
@alexrp
Copy link
Member Author

alexrp commented Feb 15, 2025

cc @androm3da

@llvmbot
Copy link
Member

llvmbot commented Feb 15, 2025

@llvm/issue-subscribers-backend-hexagon

Author: Alex Rønne Petersen (alexrp)

```llvm target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" target triple = "hexagon-unknown-linux4.19.0-musl"

define fastcc void @os.linux.tls.initStatic() {
%1 = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 0, i32 1)
br label %2

2: ; preds = %0
%3 = extractvalue { i32, i1 } %1, 0
ret void
}

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32) #0

attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }


❯ llc reduced.ll -march hexagon -O0
llc: /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/APInt.h:127: llvm::APInt::APInt(unsigned int, uint64_t, bool, bool): Assertion `llvm::isUIntN(BitWidth, val) && "Value is not an N-bit unsigned value"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llc reduced.ll -march hexagon -O0

  1.  Running pass 'Function Pass Manager' on module 'reduced.ll'.
    
  2.  Running pass 'Hexagon DAG-&gt;DAG Pattern Instruction Selection' on function '@<!-- -->os.linux.tls.initStatic'
    

#0 0x0000771d51b80ed2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/alexrp/Source/llvm-project/llvm/lib/Support/Unix/Signals.inc:802:3
#1 0x0000771d51b7e87f llvm::sys::RunSignalHandlers() /home/alexrp/Source/llvm-project/llvm/lib/Support/Signals.cpp:105:20
#2 0x0000771d51b7ec0d SignalHandler(int) /home/alexrp/Source/llvm-project/llvm/lib/Support/Unix/Signals.inc:415:1
#3 0x0000771d50445330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#4 0x0000771d5049eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x0000771d5049eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x0000771d5049eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x0000771d5044527e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x0000771d504288ff abort ./stdlib/abort.c:81:7
#9 0x0000771d5042881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x0000771d5043b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x0000771d51a220b9 llvm::maxIntN(long) /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/MathExtras.h:252:35
#12 0x0000771d51a220b9 llvm::isIntN(unsigned int, long) /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/MathExtras.h:262:53
#13 0x0000771d51a220b9 llvm::APInt::APInt(unsigned int, unsigned long, bool, bool) /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/APInt.h:120:11
#14 0x0000771d5277f3f6 llvm::SelectionDAG::getConstant(llvm::APInt const&, llvm::SDLoc const&, llvm::EVT, bool, bool) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1674:39
#15 0x0000771d5277f3f6 llvm::SelectionDAG::getConstant(unsigned long, llvm::SDLoc const&, llvm::EVT, bool, bool) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1668:21
#16 0x0000771d555f5de6 llvm::HexagonTargetLowering::LowerUAddSubO(llvm::SDValue, llvm::SelectionDAG&) const /home/alexrp/Source/llvm-project/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp:3275:32
#17 0x0000771d525da658 (anonymous namespace)::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1316:43
#18 0x0000771d525dbb18 llvm::SelectionDAG::Legalize() /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:5842:28
#19 0x0000771d527bbb69 llvm::TimeRegion::~TimeRegion() /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/Timer.h:160:9
#20 0x0000771d527bbb69 llvm::NamedRegionTimer::~NamedRegionTimer() /home/alexrp/Source/llvm-project/llvm/include/llvm/Support/Timer.h:168:8
#21 0x0000771d527bbb69 llvm::SelectionDAGISel::CodeGenAndEmitDAG() /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1079:3
#22 0x0000771d527c0235 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1904:33
#23 0x0000771d527c18f9 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:616:22
#24 0x0000771d555cd384 llvm::HexagonDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/Target/Hexagon/HexagonISelDAGToDAG.h:47:17
#25 0x0000771d527b2227 llvm::OptLevelChanger::~OptLevelChanger() /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:269:11
#26 0x0000771d527b2227 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:376:1
#27 0x0000771d527b2227 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:347:6
#28 0x0000771d520fa4bf llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) /home/alexrp/Source/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:94:33
#29 0x0000771d51d45424 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1416:7
#30 0x0000771d51d45641 llvm::ilist_detail::node_base_prevnext<llvm::ilist_node_base<true, void>, true>::getNext() const /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/ilist_node_base.h:42:38
#31 0x0000771d51d45641 llvm::ilist_node_impl<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false, void>>::getNext() /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/ilist_node.h:117:66
#32 0x0000771d51d45641 llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false, void>, false, false>::operator++() /home/alexrp/Source/llvm-project/llvm/include/llvm/ADT/ilist_iterator.h:187:25
#33 0x0000771d51d45641 llvm::FPPassManager::runOnModule(llvm::Module&) /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1451:22
#34 0x0000771d51d45e8d runOnModule /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1528:7
#35 0x0000771d51d45e8d llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/alexrp/Source/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:539:55
#36 0x000058a5a81e89df compileModule(char**, llvm::LLVMContext&) /home/alexrp/Source/llvm-project/llvm/tools/llc/llc.cpp:753:34
#37 0x000058a5a81dd057 main /home/alexrp/Source/llvm-project/llvm/tools/llc/llc.cpp:411:35
#38 0x0000771d5042a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#39 0x0000771d5042a28b call_init ./csu/../csu/libc-start.c:128:20
#40 0x0000771d5042a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#41 0x000058a5a81ddde5 _start (/opt/llvm-20/bin/llc+0x12de5)

</details>

@androm3da androm3da self-assigned this Feb 15, 2025
@tstellar tstellar moved this from Needs Triage to Needs Fix in LLVM Release Status Feb 15, 2025
@androm3da
Copy link
Member

FYI @iajbar and @yandalur I tried reverting #117558 on top of main and that seemed to remove the assertion.

So I am just guessing that maybe this code in HexagonTargetLowering::LowerUAddSubO() depends on the implicit truncation? Not quite sure how to mitigate that, so I'll assign this issue to you, Ikhlas.

     if (Opc == ISD::USUBO) {
      SDValue Op = DAG.getNode(ISD::SUB, dl, VTs.VTs[0], {X, Y});
      SDValue Ov = DAG.getSetCC(dl, MVT::i1, Op,
                                DAG.getConstant(-1, dl, ty(Op)), ISD::SETEQ);
      return DAG.getMergeValues({Op, Ov}, dl);
    }

@androm3da androm3da assigned iajbar and unassigned androm3da Feb 15, 2025
@topperc
Copy link
Collaborator

topperc commented Feb 15, 2025

FYI @iajbar and @yandalur I tried reverting #117558 on top of main and that seemed to remove the assertion.

So I am just guessing that maybe this code in HexagonTargetLowering::LowerUAddSubO() depends on the implicit truncation? Not quite sure how to mitigate that, so I'll assign this issue to you, Ikhlas.

     if (Opc == ISD::USUBO) {
      SDValue Op = DAG.getNode(ISD::SUB, dl, VTs.VTs[0], {X, Y});
      SDValue Ov = DAG.getSetCC(dl, MVT::i1, Op,
                                DAG.getConstant(-1, dl, ty(Op)), ISD::SETEQ);
      return DAG.getMergeValues({Op, Ov}, dl);
    }

Change DAG.getConstant to DAG.getAllOnesConstant and drop the -1 argument.

The -1 is being signed extended to 64 bits for uint64_t operand to getConstant, but the type is only 32 bits. Using getSignedConstant would also be a fix.

androm3da added a commit to androm3da/llvm-project that referenced this issue Feb 16, 2025
After llvm#117558 landed, this code would assert "Value is not an N-bit unsigned
value" in getConstant(), from a test case in zig.

Co-authored-by:  Craig Topper <[email protected]>
Fixes llvm#127296
androm3da added a commit to androm3da/llvm-project that referenced this issue Feb 16, 2025
After llvm#117558 landed, this code would assert "Value is not an N-bit unsigned
value" in getConstant(), from a test case in zig.

Co-authored-by:  Craig Topper <[email protected]>
Fixes llvm#127296
@github-project-automation github-project-automation bot moved this from Needs Fix to Done in LLVM Release Status Feb 17, 2025
@nikic
Copy link
Contributor

nikic commented Feb 17, 2025

/cherry-pick 788cb72

@llvmbot
Copy link
Member

llvmbot commented Feb 17, 2025

/pull-request #127527

swift-ci pushed a commit to swiftlang/llvm-project that referenced this issue Feb 18, 2025
After llvm#117558 landed, this code would assert "Value is not an N-bit
unsigned value" in getConstant(), from a test case in zig.

Co-authored-by:  Craig Topper <[email protected]>
Fixes llvm#127296

(cherry picked from commit 788cb72)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment