llvm-project/llvm/test/tools/llvm-reduce/remove-attributes-strictfp.ll
Kevin P. Neal b06568fa62 [FPEnv][llvm-reduce] Correct strictfp test.
Correct llvm-reduce strictfp test to follow the rules documented in the
LangRef:
https://llvm.org/docs/LangRef.html#constrained-floating-point-intrinsics

This test needed the strictfp attribute added to a function call.

Note that attributes of intrinsics cannot be changed in declarations,
but attributes can be changed in call sites. Thus the changes to the
declarations. And the constrained intrinsics have strictfp attributes
by default.

Test changes verified with D146845.
2024-02-06 08:12:50 -05:00

48 lines
1.9 KiB
LLVM

; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=attributes --test FileCheck --test-arg %s --test-arg --input-file %s -o %t
; RUN: FileCheck --check-prefixes=CHECK,RESULT %s < %t
; Test that invalid reductions aren't produced on strictfp functions.
; CHECK-LABEL: define float @strictfp_intrinsic(float %x, float %y)
; RESULT-SAME: [[STRICTFP_ONLY:#[0-9]+]] {
define float @strictfp_intrinsic(float %x, float %y) #0 {
%val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")
ret float %val
}
; CHECK-LABEL: define float @strictfp_callsite(float %x, float %y)
; RESULT-SAME: [[STRICTFP_ONLY]] {
; RESULT: call float @extern.func(float %x, float %y) [[STRICTFP_ONLY]]
define float @strictfp_callsite(float %x, float %y) #0 {
%val = call float @extern.func(float %x, float %y) #0
ret float %val
}
; CHECK-LABEL: define float @strictfp_declaration(float %x, float %y)
; RESULT-SAME: [[STRICTFP_ONLY]] {
define float @strictfp_declaration(float %x, float %y) #0 {
%val = call float @strict.extern.func(float %x, float %y)
ret float %val
}
; CHECK-LABEL: define float @strictfp_no_constrained_ops(float %x, float %y)
; RESULT-SAME: [[STRICTFP_ONLY]] {
define float @strictfp_no_constrained_ops(float %x, float %y) #0 {
%val = call float @llvm.copysign.f32(float %x, float %y) #1
ret float %val
}
; CHECK-LABEL: declare float @strict.extern.func(float, float)
; RESULT-SAME: [[STRICTFP_ONLY]]{{$}}
declare float @strict.extern.func(float, float) #0
declare float @extern.func(float, float)
declare float @llvm.copysign.f32(float, float)
declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
; RESULT: attributes [[STRICTFP_ONLY]] = { strictfp }
attributes #0 = { nounwind strictfp }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) strictfp }