Skip to content

[aarch64] Cannot select: constant:i128<0> for llvm.maximum.f128 #139380

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
Urgau opened this issue May 10, 2025 · 1 comment · Fixed by #142170
Closed

[aarch64] Cannot select: constant:i128<0> for llvm.maximum.f128 #139380

Urgau opened this issue May 10, 2025 · 1 comment · Fixed by #142170
Assignees
Labels
backend:AArch64 crash Prefer [crash-on-valid] or [crash-on-invalid] llvm:SelectionDAG SelectionDAGISel as well

Comments

@Urgau
Copy link

Urgau commented May 10, 2025

I'm seeing an error when trying to use llvm.minimum.f128 and llvm.maximum.f128 on aarch64.

define fp128 @call_maximum_fp128(fp128 %x, fp128 %y) unnamed_addr #0 {
start:
  %0 = tail call fp128 @llvm.maximum.f128(fp128 %x, fp128 %y) #2
  ret fp128 %0
}

; Function Attrs: mustprogress nofree nosync nounwind readnone speculatable willreturn
declare fp128 @llvm.maximum.f128(fp128, fp128)
LLVM ERROR: Cannot select: 0x10c8bea0: i32 = setcc 0x10c888c0, Constant:i128<0>, seteq:ch
  0x10c888c0: i128 = bitcast 0x10c87fd8
    0x10c87fd8: f128,ch = CopyFromReg 0x10c105c0, Register:f128 %1
      0x10c87f60: f128 = Register %1
  0x10c8bbd0: i128 = Constant<0>
In function: call_maximum_fp128
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /opt/compiler-explorer/clang-trunk/bin/llc -o /app/output.s -x86-asm-syntax=intel <source>
1.	Running pass 'Function Pass Manager' on module '<source>'.
2.	Running pass 'AArch64 Instruction Selection' on function '@call_maximum_fp128'
 #0 0x0000000003b49548 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-trunk/bin/llc+0x3b49548)
 #1 0x0000000003b47104 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #2 0x000073d283c42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #3 0x000073d283c969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #4 0x000073d283c42476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #5 0x000073d283c287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #6 0x0000000000784592 llvm::UniqueStringSaver::save(llvm::Twine const&) (.cold) StringSaver.cpp:0:0
 #7 0x00000000038f0888 llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38f0888)
 #8 0x00000000038f6bf9 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38f6bf9)
 #9 0x0000000000bfa944 (anonymous namespace)::AArch64DAGToDAGISel::Select(llvm::SDNode*) AArch64ISelDAGToDAG.cpp:0:0
#10 0x00000000038edd74 llvm::SelectionDAGISel::DoInstructionSelection() (/opt/compiler-explorer/clang-trunk/bin/llc+0x38edd74)
#11 0x00000000038fc882 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/opt/compiler-explorer/clang-trunk/bin/llc+0x38fc882)
#12 0x00000000038ff1fa llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38ff1fa)
#13 0x00000000039010d6 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x39010d6)
#14 0x00000000038ed8f1 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38ed8f1)
#15 0x0000000002bb4a78 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#16 0x0000000003135322 llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x3135322)
#17 0x00000000031355b1 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x31355b1)
#18 0x0000000003136f19 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x3136f19)
#19 0x00000000008bec3f compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#20 0x000000000079977e main (/opt/compiler-explorer/clang-trunk/bin/llc+0x79977e)
#21 0x000073d283c29d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#22 0x000073d283c29e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#23 0x00000000008b6705 _start (/opt/compiler-explorer/clang-trunk/bin/llc+0x8b6705)
Program terminated with signal: SIGSEGV
Compiler returned: 139

https://godbolt.org/z/YWdK1ecM5

@llvmbot
Copy link
Member

llvmbot commented May 10, 2025

@llvm/issue-subscribers-backend-aarch64

Author: None (Urgau)

I'm seeing an error when trying to use `llvm.minimum.f128` and `llvm.maximum.f128` on aarch64.
define fp128 @<!-- -->call_maximum_fp128(fp128 %x, fp128 %y) unnamed_addr #<!-- -->0 {
start:
  %0 = tail call fp128 @<!-- -->llvm.maximum.f128(fp128 %x, fp128 %y) #<!-- -->2
  ret fp128 %0
}

; Function Attrs: mustprogress nofree nosync nounwind readnone speculatable willreturn
declare fp128 @<!-- -->llvm.maximum.f128(fp128, fp128)
LLVM ERROR: Cannot select: 0x10c8bea0: i32 = setcc 0x10c888c0, Constant:i128&lt;0&gt;, seteq:ch
  0x10c888c0: i128 = bitcast 0x10c87fd8
    0x10c87fd8: f128,ch = CopyFromReg 0x10c105c0, Register:f128 %1
      0x10c87f60: f128 = Register %1
  0x10c8bbd0: i128 = Constant&lt;0&gt;
In function: call_maximum_fp128
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /opt/compiler-explorer/clang-trunk/bin/llc -o /app/output.s -x86-asm-syntax=intel &lt;source&gt;
1.	Running pass 'Function Pass Manager' on module '&lt;source&gt;'.
2.	Running pass 'AArch64 Instruction Selection' on function '@<!-- -->call_maximum_fp128'
 #<!-- -->0 0x0000000003b49548 llvm::sys::PrintStackTrace(llvm::raw_ostream&amp;, int) (/opt/compiler-explorer/clang-trunk/bin/llc+0x3b49548)
 #<!-- -->1 0x0000000003b47104 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #<!-- -->2 0x000073d283c42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #<!-- -->3 0x000073d283c969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #<!-- -->4 0x000073d283c42476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #<!-- -->5 0x000073d283c287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #<!-- -->6 0x0000000000784592 llvm::UniqueStringSaver::save(llvm::Twine const&amp;) (.cold) StringSaver.cpp:0:0
 #<!-- -->7 0x00000000038f0888 llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38f0888)
 #<!-- -->8 0x00000000038f6bf9 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38f6bf9)
 #<!-- -->9 0x0000000000bfa944 (anonymous namespace)::AArch64DAGToDAGISel::Select(llvm::SDNode*) AArch64ISelDAGToDAG.cpp:0:0
#<!-- -->10 0x00000000038edd74 llvm::SelectionDAGISel::DoInstructionSelection() (/opt/compiler-explorer/clang-trunk/bin/llc+0x38edd74)
#<!-- -->11 0x00000000038fc882 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/opt/compiler-explorer/clang-trunk/bin/llc+0x38fc882)
#<!-- -->12 0x00000000038ff1fa llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&amp;) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38ff1fa)
#<!-- -->13 0x00000000039010d6 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&amp;) (/opt/compiler-explorer/clang-trunk/bin/llc+0x39010d6)
#<!-- -->14 0x00000000038ed8f1 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&amp;) (/opt/compiler-explorer/clang-trunk/bin/llc+0x38ed8f1)
#<!-- -->15 0x0000000002bb4a78 llvm::MachineFunctionPass::runOnFunction(llvm::Function&amp;) (.part.0) MachineFunctionPass.cpp:0:0
#<!-- -->16 0x0000000003135322 llvm::FPPassManager::runOnFunction(llvm::Function&amp;) (/opt/compiler-explorer/clang-trunk/bin/llc+0x3135322)
#<!-- -->17 0x00000000031355b1 llvm::FPPassManager::runOnModule(llvm::Module&amp;) (/opt/compiler-explorer/clang-trunk/bin/llc+0x31355b1)
#<!-- -->18 0x0000000003136f19 llvm::legacy::PassManagerImpl::run(llvm::Module&amp;) (/opt/compiler-explorer/clang-trunk/bin/llc+0x3136f19)
#<!-- -->19 0x00000000008bec3f compileModule(char**, llvm::LLVMContext&amp;) llc.cpp:0:0
#<!-- -->20 0x000000000079977e main (/opt/compiler-explorer/clang-trunk/bin/llc+0x79977e)
#<!-- -->21 0x000073d283c29d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#<!-- -->22 0x000073d283c29e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#<!-- -->23 0x00000000008b6705 _start (/opt/compiler-explorer/clang-trunk/bin/llc+0x8b6705)
Program terminated with signal: SIGSEGV
Compiler returned: 139

https://godbolt.org/z/YWdK1ecM5

@nikic nikic self-assigned this May 30, 2025
nikic added a commit that referenced this issue Jun 2, 2025
FMAXIMUM is currently legalized via IS_FPCLASS for the signed zero
handling. This is problematic, because it assumes the equivalent integer
type is legal. Many targets have legal fp128, but illegal i128, so this
results in legalization failures.

Fix this by replacing IS_FPCLASS with checking the bitcast to integer
instead. In that case it is sufficient to use any legal integer type, as
we're just interested in the sign bit. This can be obtained via a stack
temporary cast. There is existing FloatSignAsInt functionality used for
legalization of FABS and similar we can use for this purpose.

Fixes #139380.
Fixes #139381.
Fixes #140445.
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this issue Jun 2, 2025
FMAXIMUM is currently legalized via IS_FPCLASS for the signed zero
handling. This is problematic, because it assumes the equivalent integer
type is legal. Many targets have legal fp128, but illegal i128, so this
results in legalization failures.

Fix this by replacing IS_FPCLASS with checking the bitcast to integer
instead. In that case it is sufficient to use any legal integer type, as
we're just interested in the sign bit. This can be obtained via a stack
temporary cast. There is existing FloatSignAsInt functionality used for
legalization of FABS and similar we can use for this purpose.

Fixes llvm/llvm-project#139380.
Fixes llvm/llvm-project#139381.
Fixes llvm/llvm-project#140445.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:AArch64 crash Prefer [crash-on-valid] or [crash-on-invalid] llvm:SelectionDAG SelectionDAGISel as well
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants