llvm-project/llvm/test/CodeGen/ARM/lower-vmax.ll
valadaptive cdc6a84c14
TargetLowering: Allow FMINNUM/FMAXNUM to lower to FMINIMUM/FMAXIMUM even without nsz (#177828)
This restriction was originally added in
https://reviews.llvm.org/D143256, with the given justification:

> Currently, in TargetLowering, if the target does not support fminnum,
we lower to fminimum if neither operand could be a NaN. But this isn't
quite correct because fminnum and fminimum treat +/-0 differently; so,
we need to prove that one of the operands isn't a zero.

As far as I can tell, this was never correct. Before
https://github.com/llvm/llvm-project/pull/172012, `minnum` and `maxnum`
were nondeterministic with regards to signed zero, so it's always been
perfectly legal to lower them to operations that order signed zeroes.
2026-01-25 18:24:12 -05:00

49 lines
1.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=arm-eabihf -mattr=+neon < %s | FileCheck -check-prefixes=CHECK-NO_NEON %s
; RUN: llc -mtriple=arm-eabihf -mattr=+neon,+neonfp < %s | FileCheck -check-prefixes=CHECK-NEON %s
define float @max_f32(float, float) {
; CHECK-NO_NEON-LABEL: max_f32:
; CHECK-NO_NEON: @ %bb.0:
; CHECK-NO_NEON-NEXT: vmov.f32 s2, s1
; CHECK-NO_NEON-NEXT: @ kill: def $s0 killed $s0 def $d0
; CHECK-NO_NEON-NEXT: vmax.f32 d0, d1, d0
; CHECK-NO_NEON-NEXT: @ kill: def $s0 killed $s0 killed $d0
; CHECK-NO_NEON-NEXT: mov pc, lr
;
; CHECK-NEON-LABEL: max_f32:
; CHECK-NEON: @ %bb.0:
; CHECK-NEON-NEXT: vmov.f32 s2, s1
; CHECK-NEON-NEXT: @ kill: def $s0 killed $s0 def $d0
; CHECK-NEON-NEXT: vmax.f32 d0, d1, d0
; CHECK-NEON-NEXT: @ kill: def $s0 killed $s0 killed $d0
; CHECK-NEON-NEXT: mov pc, lr
%3 = call nnan float @llvm.maxnum.f32(float %1, float %0)
ret float %3
}
declare float @llvm.maxnum.f32(float, float) #1
define float @min_f32(float, float) {
; CHECK-NO_NEON-LABEL: min_f32:
; CHECK-NO_NEON: @ %bb.0:
; CHECK-NO_NEON-NEXT: vmov.f32 s2, s1
; CHECK-NO_NEON-NEXT: @ kill: def $s0 killed $s0 def $d0
; CHECK-NO_NEON-NEXT: vmin.f32 d0, d1, d0
; CHECK-NO_NEON-NEXT: @ kill: def $s0 killed $s0 killed $d0
; CHECK-NO_NEON-NEXT: mov pc, lr
;
; CHECK-NEON-LABEL: min_f32:
; CHECK-NEON: @ %bb.0:
; CHECK-NEON-NEXT: vmov.f32 s2, s1
; CHECK-NEON-NEXT: @ kill: def $s0 killed $s0 def $d0
; CHECK-NEON-NEXT: vmin.f32 d0, d1, d0
; CHECK-NEON-NEXT: @ kill: def $s0 killed $s0 killed $d0
; CHECK-NEON-NEXT: mov pc, lr
%3 = call nnan float @llvm.minnum.f32(float %1, float %0)
ret float %3
}
declare float @llvm.minnum.f32(float, float) #1