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.
49 lines
1.8 KiB
LLVM
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
|
|
|