Files
TheRock/compiler/amd-llvm/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

1356 lines
66 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -passes=instcombine < %s | FileCheck %s
declare nofpclass(qnan inf norm sub zero) float @returns_snan()
define nofpclass(snan) float @ret_no_snan__floor_no_snan(float nofpclass(nan) %x) {
; CHECK-LABEL: define nofpclass(snan) float @ret_no_snan__floor_no_snan(
; CHECK-SAME: float nofpclass(nan) [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[X]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf norm sub zero) float @ret_only_nan__floor(float %x) {
; CHECK-LABEL: define nofpclass(inf zero sub norm) float @ret_only_nan__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float [[X]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf norm sub zero) <2 x float> @ret_only_nan__floor_vec(<2 x float> %x) {
; CHECK-LABEL: define nofpclass(inf zero sub norm) <2 x float> @ret_only_nan__floor_vec(
; CHECK-SAME: <2 x float> [[X:%.*]]) {
; CHECK-NEXT: ret <2 x float> [[X]]
;
%result = call <2 x float> @llvm.floor.v2f32(<2 x float> %x)
ret <2 x float> %result
}
define nofpclass(inf norm sub zero qnan) float @ret_only_snan__floor(float %x) {
; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) float @ret_only_snan__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float [[X]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf norm sub zero snan) float @ret_only_qnan__floor(float %x) {
; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float [[X]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(nan norm sub zero) float @ret_only_inf__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan zero sub norm) float @ret_only_inf__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float [[X]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(nan pinf norm sub zero) float @ret_only_ninf__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan pinf zero sub norm) float @ret_only_ninf__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float -inf
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(nan ninf norm sub zero) float @ret_only_pinf__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan ninf zero sub norm) float @ret_only_pinf__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float +inf
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf nan norm sub) float @ret_only_zero__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan inf sub norm) float @ret_only_zero__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[X]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf nan norm sub nzero) float @ret_only_pzero__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float @ret_only_pzero__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf nan norm sub pzero) float @ret_only_nzero__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan inf pzero sub norm) float @ret_only_nzero__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[X]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(inf) float @ret_no_infs__floor(float %x) {
; CHECK-LABEL: define nofpclass(inf) float @ret_no_infs__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf float @llvm.floor.f32(float [[X]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(nan inf) float @ret_no_nans_no_infs__floor(float %x) {
; CHECK-LABEL: define nofpclass(nan inf) float @ret_no_nans_no_infs__floor(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[X]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %x)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__floor(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__floor(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(inf) float @ret_no_infs__simplify_select_inf__floor(i1 %cond, float nofpclass(nan norm sub zero) %is.inf, float %unknown) {
; CHECK-LABEL: define nofpclass(inf) float @ret_no_infs__simplify_select_inf__floor(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan zero sub norm) [[IS_INF:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf float @llvm.floor.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.inf, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(nan inf) float @ret_no_inf_no_nan__simplify_select_inf_or_nan__floor(i1 %cond, float nofpclass(norm sub zero) %is.inf.or.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan inf) float @ret_no_inf_no_nan__simplify_select_inf_or_nan__floor(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(zero sub norm) [[IS_INF_OR_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.inf.or.nan, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define float @ret_nozero_select_zero__floor(i1 %cond, float nofpclass(inf norm sub nan) %is.zero, float %unknown) {
; CHECK-LABEL: define float @ret_nozero_select_zero__floor(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf sub norm) [[IS_ZERO:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[IS_ZERO]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.zero, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__floor(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__floor(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) <2 x float> @source_known_sub_or_zero__floor_vec(<2 x float> nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) <2 x float> @source_known_sub_or_zero__floor_vec(
; CHECK-SAME: <2 x float> nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf <2 x float> @llvm.floor.v2f32(<2 x float> [[SUB_OR_ZERO]])
; CHECK-NEXT: ret <2 x float> [[RESULT]]
;
%result = call <2 x float> @llvm.floor.v2f32(<2 x float> %sub.or.zero)
ret <2 x float> %result
}
define nofpclass(snan) float @source_known_sub_or_zero_or_nan__floor(float nofpclass(inf norm) %sub.or.zero.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero_or_nan__floor(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO_OR_NAN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf float @llvm.floor.f32(float [[SUB_OR_ZERO_OR_NAN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %sub.or.zero.or.nan)
ret float %result
}
define nofpclass(snan) <2 x float> @source_known_sub_or_zero_or_nan__floor_vec(<2 x float> nofpclass(inf norm) %sub.or.zero.or.nan) {
; CHECK-LABEL: define nofpclass(snan) <2 x float> @source_known_sub_or_zero_or_nan__floor_vec(
; CHECK-SAME: <2 x float> nofpclass(inf norm) [[SUB_OR_ZERO_OR_NAN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf <2 x float> @llvm.floor.v2f32(<2 x float> [[SUB_OR_ZERO_OR_NAN]])
; CHECK-NEXT: ret <2 x float> [[RESULT]]
;
%result = call <2 x float> @llvm.floor.v2f32(<2 x float> %sub.or.zero.or.nan)
ret <2 x float> %result
}
define nofpclass(snan) float @source_known_psub_or_pzero__floor(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__floor(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.floor.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_psub_or_pzero_or_nan__floor(float nofpclass(inf norm nsub nzero) %psub.or.pzero.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero_or_nan__floor(
; CHECK-SAME: float nofpclass(inf nzero nsub norm) [[PSUB_OR_PZERO_OR_NAN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf float @llvm.floor.f32(float [[PSUB_OR_PZERO_OR_NAN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %psub.or.pzero.or.nan)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__floor(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__floor(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[NSUB_OR_NZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero_or_nan__floor(float nofpclass(inf norm psub pzero) %nsub.or.nzero.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero_or_nan__floor(
; CHECK-SAME: float nofpclass(inf pzero psub norm) [[NSUB_OR_NZERO_OR_NAN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf float @llvm.floor.f32(float [[NSUB_OR_NZERO_OR_NAN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %nsub.or.nzero.or.nan)
ret float %result
}
define nofpclass(snan) float @source_known_inf__floor(float nofpclass(nan norm sub zero) %inf) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf__floor(
; CHECK-SAME: float nofpclass(nan zero sub norm) [[INF:%.*]]) {
; CHECK-NEXT: ret float [[INF]]
;
%result = call float @llvm.floor.f32(float %inf)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_nan__floor(float nofpclass(norm sub zero) %inf.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_nan__floor(
; CHECK-SAME: float nofpclass(zero sub norm) [[INF_OR_NAN:%.*]]) {
; CHECK-NEXT: ret float [[INF_OR_NAN]]
;
%result = call float @llvm.floor.f32(float %inf.or.nan)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_nan_or_zero__floor(float nofpclass(norm sub) %inf.or.nan.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_nan_or_zero__floor(
; CHECK-SAME: float nofpclass(sub norm) [[INF_OR_NAN_OR_ZERO:%.*]]) {
; CHECK-NEXT: ret float [[INF_OR_NAN_OR_ZERO]]
;
%result = call float @llvm.floor.f32(float %inf.or.nan.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_nan_or_zero_or_sub__floor(float nofpclass(norm) %inf.or.nan.or.zero.or.sub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_nan_or_zero_or_sub__floor(
; CHECK-SAME: float nofpclass(norm) [[INF_OR_NAN_OR_ZERO_OR_SUB:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[INF_OR_NAN_OR_ZERO_OR_SUB]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %inf.or.nan.or.zero.or.sub)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_zero__floor(float nofpclass(nan norm sub) %inf.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_zero__floor(
; CHECK-SAME: float nofpclass(nan sub norm) [[INF_OR_ZERO:%.*]]) {
; CHECK-NEXT: ret float [[INF_OR_ZERO]]
;
%result = call float @llvm.floor.f32(float %inf.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_sub__floor(float nofpclass(inf nan norm zero) %sub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub__floor(
; CHECK-SAME: float nofpclass(nan inf zero norm) [[SUB:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[SUB]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %sub)
ret float %result
}
define nofpclass(snan) float @source_known_psub__floor(float nofpclass(inf nan norm nsub zero) %psub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub__floor(
; CHECK-SAME: float nofpclass(nan inf zero nsub norm) [[PSUB:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.floor.f32(float %psub)
ret float %result
}
define nofpclass(snan) float @source_known_nsub__floor(float nofpclass(inf nan norm psub zero) %nsub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub__floor(
; CHECK-SAME: float nofpclass(nan inf zero psub norm) [[NSUB:%.*]]) {
; CHECK-NEXT: ret float -1.000000e+00
;
%result = call float @llvm.floor.f32(float %nsub)
ret float %result
}
define nofpclass(snan) float @source_known_pinf__floor(float nofpclass(nan ninf norm sub zero) %pinf) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_pinf__floor(
; CHECK-SAME: float nofpclass(nan ninf zero sub norm) [[PINF:%.*]]) {
; CHECK-NEXT: ret float +inf
;
%result = call float @llvm.floor.f32(float %pinf)
ret float %result
}
define nofpclass(snan) float @source_known_pinf_or_nan__floor(float nofpclass(ninf norm sub zero) %pinf.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_pinf_or_nan__floor(
; CHECK-SAME: float nofpclass(ninf zero sub norm) [[PINF_OR_NAN:%.*]]) {
; CHECK-NEXT: ret float [[PINF_OR_NAN]]
;
%result = call float @llvm.floor.f32(float %pinf.or.nan)
ret float %result
}
define nofpclass(snan) float @source_known_ninf__floor(float nofpclass(nan pinf norm sub zero) %ninf) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_ninf__floor(
; CHECK-SAME: float nofpclass(nan pinf zero sub norm) [[NINF:%.*]]) {
; CHECK-NEXT: ret float -inf
;
%result = call float @llvm.floor.f32(float %ninf)
ret float %result
}
define nofpclass(snan) float @source_known_ninf_or_nan__floor(float nofpclass(pinf norm sub zero) %ninf.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_ninf_or_nan__floor(
; CHECK-SAME: float nofpclass(pinf zero sub norm) [[NINF_OR_NAN:%.*]]) {
; CHECK-NEXT: ret float [[NINF_OR_NAN]]
;
%result = call float @llvm.floor.f32(float %ninf.or.nan)
ret float %result
}
define nofpclass(snan) float @source_known_not_pinf__floor(float nofpclass(pinf) %not.pinf) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_not_pinf__floor(
; CHECK-SAME: float nofpclass(pinf) [[NOT_PINF:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[NOT_PINF]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %not.pinf)
ret float %result
}
define nofpclass(snan) float @source_known_not_ninf__floor(float nofpclass(ninf) %not.ninf) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_not_ninf__floor(
; CHECK-SAME: float nofpclass(ninf) [[NOT_NINF:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[NOT_NINF]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %not.ninf)
ret float %result
}
define nofpclass(snan) ppc_fp128 @source_known_not_pinf__floor__ppcf128(ppc_fp128 nofpclass(pinf) %not.pinf) {
; CHECK-LABEL: define nofpclass(snan) ppc_fp128 @source_known_not_pinf__floor__ppcf128(
; CHECK-SAME: ppc_fp128 nofpclass(pinf) [[NOT_PINF:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ppc_fp128 @llvm.floor.ppcf128(ppc_fp128 [[NOT_PINF]])
; CHECK-NEXT: ret ppc_fp128 [[RESULT]]
;
%result = call ppc_fp128 @llvm.floor.ppcf128(ppc_fp128 %not.pinf)
ret ppc_fp128 %result
}
define nofpclass(snan) <2 x ppc_fp128> @source_known_not_pinf__floor__v2ppcf128(<2 x ppc_fp128> nofpclass(pinf) %not.pinf) {
; CHECK-LABEL: define nofpclass(snan) <2 x ppc_fp128> @source_known_not_pinf__floor__v2ppcf128(
; CHECK-SAME: <2 x ppc_fp128> nofpclass(pinf) [[NOT_PINF:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call <2 x ppc_fp128> @llvm.floor.v2ppcf128(<2 x ppc_fp128> [[NOT_PINF]])
; CHECK-NEXT: ret <2 x ppc_fp128> [[RESULT]]
;
%result = call <2 x ppc_fp128> @llvm.floor.v2ppcf128(<2 x ppc_fp128> %not.pinf)
ret <2 x ppc_fp128> %result
}
define nofpclass(snan) ppc_fp128 @source_known_not_ninf__floor_ppcf128(ppc_fp128 nofpclass(ninf) %not.ninf) {
; CHECK-LABEL: define nofpclass(snan) ppc_fp128 @source_known_not_ninf__floor_ppcf128(
; CHECK-SAME: ppc_fp128 nofpclass(ninf) [[NOT_NINF:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ppc_fp128 @llvm.floor.ppcf128(ppc_fp128 [[NOT_NINF]])
; CHECK-NEXT: ret ppc_fp128 [[RESULT]]
;
%result = call ppc_fp128 @llvm.floor.ppcf128(ppc_fp128 %not.ninf)
ret ppc_fp128 %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__trunc(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__trunc(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.trunc.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__ceil(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__ceil(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.ceil.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.ceil.f32(float %select)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__rint(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__rint(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.rint.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.rint.f32(float %select)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__nearbyint(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__nearbyint(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.nearbyint.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.nearbyint.f32(float %select)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__round(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__round(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.round.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.round.f32(float %select)
ret float %result
}
define nofpclass(nan) float @ret_no_nans__simplify_select_nan__roundeven(i1 %cond, float nofpclass(inf norm sub zero) %is.nan, float %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans__simplify_select_nan__roundeven(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(inf zero sub norm) [[IS_NAN:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.roundeven.f32(float [[UNKNOWN]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %is.nan, float %unknown
%result = call float @llvm.roundeven.f32(float %select)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__trunc(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__trunc(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.trunc.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__trunc_insert_point(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__trunc_insert_point(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: [[BARRIER:%.*]] = call float @llvm.arithmetic.fence.f32(float [[RESULT]])
; CHECK-NEXT: ret float [[BARRIER]]
;
%result = call float @llvm.trunc.f32(float %sub.or.zero)
%barrier = call float @llvm.arithmetic.fence.f32(float %result)
ret float %barrier
}
define nofpclass(snan) float @source_known_psub_or_pzero__trunc(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__trunc(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.trunc.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__trunc(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__trunc(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.trunc.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_nan_or_zero__trunc(float nofpclass(norm sub) %inf.or.nan.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_nan_or_zero__trunc(
; CHECK-SAME: float nofpclass(sub norm) [[INF_OR_NAN_OR_ZERO:%.*]]) {
; CHECK-NEXT: ret float [[INF_OR_NAN_OR_ZERO]]
;
%result = call float @llvm.trunc.f32(float %inf.or.nan.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_nan_or_zero_or_sub__trunc(float nofpclass(norm) %inf.or.nan.or.zero.or.sub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_nan_or_zero_or_sub__trunc(
; CHECK-SAME: float nofpclass(norm) [[INF_OR_NAN_OR_ZERO_OR_SUB:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.trunc.f32(float [[INF_OR_NAN_OR_ZERO_OR_SUB]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.trunc.f32(float %inf.or.nan.or.zero.or.sub)
ret float %result
}
define nofpclass(snan) float @source_known_inf_or_zero__trunc(float nofpclass(nan norm sub) %inf.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_inf_or_zero__trunc(
; CHECK-SAME: float nofpclass(nan sub norm) [[INF_OR_ZERO:%.*]]) {
; CHECK-NEXT: ret float [[INF_OR_ZERO]]
;
%result = call float @llvm.trunc.f32(float %inf.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_sub__trunc(float nofpclass(inf nan norm zero) %sub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub__trunc(
; CHECK-SAME: float nofpclass(nan inf zero norm) [[SUB:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.trunc.f32(float %sub)
ret float %result
}
define nofpclass(snan) float @source_known_psub__trunc(float nofpclass(inf nan norm nsub zero) %psub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub__trunc(
; CHECK-SAME: float nofpclass(nan inf zero nsub norm) [[PSUB:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.trunc.f32(float %psub)
ret float %result
}
define nofpclass(snan) float @source_known_nsub__trunc(float nofpclass(inf nan norm psub zero) %nsub) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub__trunc(
; CHECK-SAME: float nofpclass(nan inf zero psub norm) [[NSUB:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.trunc.f32(float %nsub)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__ceil(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__ceil(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.ceil.f32(float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.ceil.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_psub_or_pzero__ceil(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__ceil(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.ceil.f32(float [[PSUB_OR_PZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.ceil.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__ceil(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__ceil(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.ceil.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__rint(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__rint(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.rint.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_psub_or_pzero__rint(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__rint(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.rint.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__rint(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__rint(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.rint.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__nearbyint(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__nearbyint(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.nearbyint.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_psub_or_pzero__nearbyint(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__nearbyint(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.nearbyint.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__nearbyint(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__nearbyint(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.nearbyint.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__round(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__round(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.round.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_psub_or_pzero__round(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__round(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.round.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__round(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__round(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.round.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(snan) float @source_known_sub_or_zero__roundeven(float nofpclass(nan inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_sub_or_zero__roundeven(
; CHECK-SAME: float nofpclass(nan inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.roundeven.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(snan) float @source_known_psub_or_pzero__roundeven(float nofpclass(nan inf norm nsub nzero) %psub.or.pzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_psub_or_pzero__roundeven(
; CHECK-SAME: float nofpclass(nan inf nzero nsub norm) [[PSUB_OR_PZERO:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.roundeven.f32(float %psub.or.pzero)
ret float %result
}
define nofpclass(snan) float @source_known_nsub_or_nzero__roundeven(float nofpclass(nan inf norm psub pzero) %nsub.or.nzero) {
; CHECK-LABEL: define nofpclass(snan) float @source_known_nsub_or_nzero__roundeven(
; CHECK-SAME: float nofpclass(nan inf pzero psub norm) [[NSUB_OR_NZERO:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.roundeven.f32(float %nsub.or.nzero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__floor(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__floor(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__floor(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__floor(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__floor(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__floor(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.floor.f32(float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.floor.f32(float %nsub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__trunc(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__trunc(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.trunc.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__trunc(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__trunc(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.trunc.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__trunc(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__trunc(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.trunc.f32(float %nsub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__ceil(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__ceil(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.ceil.f32(float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.ceil.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__ceil(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__ceil(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.ceil.f32(float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.ceil.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__ceil(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__ceil(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf float @llvm.ceil.f32(float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.ceil.f32(float %nsub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__rint(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__rint(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.rint.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__rint(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__rint(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.rint.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__rint(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__rint(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.rint.f32(float %nsub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__nearbyint(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__nearbyint(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.nearbyint.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__nearbyint(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__nearbyint(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.nearbyint.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__nearbyint(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__nearbyint(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.nearbyint.f32(float %nsub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__round(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__round(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.round.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__round(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__round(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.round.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__round(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__round(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.round.f32(float %nsub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__roundeven(float nofpclass(inf norm) %sub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_sub_or_zero_or_nan__roundeven(
; CHECK-SAME: float nofpclass(inf norm) [[SUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[SUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.roundeven.f32(float %sub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__roundeven(float nofpclass(inf norm nsub) %psub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_psub_or_zero_or_nan__roundeven(
; CHECK-SAME: float nofpclass(inf nsub norm) [[PSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[PSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.roundeven.f32(float %psub.or.zero)
ret float %result
}
define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__roundeven(float nofpclass(inf norm psub) %nsub.or.zero) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nans_source_known_nsub_or_zero_or_nan__roundeven(
; CHECK-SAME: float nofpclass(inf psub norm) [[NSUB_OR_ZERO:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[NSUB_OR_ZERO]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call float @llvm.roundeven.f32(float %nsub.or.zero)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(nsub) float @ret_no_nsub__roundeven__select_source_only_nsub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero psub) %only.nsub, float %unknown) {
; CHECK-LABEL: define nofpclass(nsub) float @ret_no_nsub__roundeven__select_source_only_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero psub norm) [[ONLY_NSUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_NSUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.roundeven.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.nsub, float %unknown
%result = call float @llvm.roundeven.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(psub) float @ret_no_psub__roundeven__select_source_only_nsub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero nsub) %only.psub, float %unknown) {
; CHECK-LABEL: define nofpclass(psub) float @ret_no_psub__roundeven__select_source_only_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero nsub norm) [[ONLY_PSUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_PSUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.roundeven.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.psub, float %unknown
%result = call float @llvm.roundeven.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(sub) float @ret_no_sub__roundeven__select_source_only_sub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero) %only.sub, float %unknown) {
; CHECK-LABEL: define nofpclass(sub) float @ret_no_sub__roundeven__select_source_only_sub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero norm) [[ONLY_SUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_SUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.roundeven.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.sub, float %unknown
%result = call float @llvm.roundeven.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(nsub) float @ret_no_nsub__trunc__select_source_only_nsub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero psub) %only.nsub, float %unknown) {
; CHECK-LABEL: define nofpclass(nsub) float @ret_no_nsub__trunc__select_source_only_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero psub norm) [[ONLY_NSUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_NSUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.nsub, float %unknown
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(psub) float @ret_no_psub__trunc__select_source_only_nsub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero nsub) %only.psub, float %unknown) {
; CHECK-LABEL: define nofpclass(psub) float @ret_no_psub__trunc__select_source_only_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero nsub norm) [[ONLY_PSUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_PSUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.psub, float %unknown
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(sub) float @ret_no_sub__trunc__select_source_only_sub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero) %only.sub, float %unknown) {
; CHECK-LABEL: define nofpclass(sub) float @ret_no_sub__trunc__select_source_only_sub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero norm) [[ONLY_SUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_SUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.sub, float %unknown
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(nsub) float @ret_no_nsub__floor__select_source_only_nsub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero psub) %only.nsub, float %unknown) {
; CHECK-LABEL: define nofpclass(nsub) float @ret_no_nsub__floor__select_source_only_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero psub norm) [[ONLY_NSUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_NSUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.nsub, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(psub) float @ret_no_psub__floor__select_source_only_nsub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero nsub) %only.psub, float %unknown) {
; CHECK-LABEL: define nofpclass(psub) float @ret_no_psub__floor__select_source_only_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero nsub norm) [[ONLY_PSUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_PSUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.psub, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
; select cannot be dropped, possible zero result implies possible subnormal source
define nofpclass(sub) float @ret_no_sub__floor__select_source_only_sub_or_unknown(i1 %cond, float nofpclass(nan inf norm zero) %only.sub, float %unknown) {
; CHECK-LABEL: define nofpclass(sub) float @ret_no_sub__floor__select_source_only_sub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan inf zero norm) [[ONLY_SUB:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[ONLY_SUB]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %only.sub, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub) float @zero_demands_norm_input__floor(i1 %cond, float %unknown, float nofpclass(nan inf sub zero) %only.norm) {
; CHECK-LABEL: define nofpclass(nan sub norm) float @zero_demands_norm_input__floor(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub) [[ONLY_NORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.norm
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub nzero) float @pzero_demands_pnorm_input__floor(i1 %cond, float %unknown, float nofpclass(nan inf nnorm sub zero) %only.pnorm) {
; CHECK-LABEL: define nofpclass(nan nzero sub norm) float @pzero_demands_pnorm_input__floor(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub nnorm) [[ONLY_PNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_PNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.pnorm
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub pzero) float @nzero_demands_pnorm_input__floor(i1 %cond, float %unknown, float nofpclass(nan inf pnorm sub zero) %only.nnorm) {
; CHECK-LABEL: define nofpclass(nan pzero sub norm) float @nzero_demands_pnorm_input__floor(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub pnorm) [[ONLY_NNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.nnorm
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub) float @zero_demands_norm_input__ceil(i1 %cond, float %unknown, float nofpclass(nan inf sub zero) %only.norm) {
; CHECK-LABEL: define nofpclass(nan sub norm) float @zero_demands_norm_input__ceil(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub) [[ONLY_NORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.ceil.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.norm
%result = call float @llvm.ceil.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub nzero) float @pzero_demands_pnorm_input__ceil(i1 %cond, float %unknown, float nofpclass(nan inf nnorm sub zero) %only.pnorm) {
; CHECK-LABEL: define nofpclass(nan nzero sub norm) float @pzero_demands_pnorm_input__ceil(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub nnorm) [[ONLY_PNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_PNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.ceil.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.pnorm
%result = call float @llvm.ceil.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub pzero) float @nzero_demands_pnorm_input__ceil(i1 %cond, float %unknown, float nofpclass(nan inf pnorm sub zero) %only.nnorm) {
; CHECK-LABEL: define nofpclass(nan pzero sub norm) float @nzero_demands_pnorm_input__ceil(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub pnorm) [[ONLY_NNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.ceil.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.nnorm
%result = call float @llvm.ceil.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub) float @zero_demands_norm_input__trunc(i1 %cond, float %unknown, float nofpclass(nan inf sub zero) %only.norm) {
; CHECK-LABEL: define nofpclass(nan sub norm) float @zero_demands_norm_input__trunc(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub) [[ONLY_NORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.norm
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub nzero) float @pzero_demands_pnorm_input__trunc(i1 %cond, float %unknown, float nofpclass(nan inf nnorm sub zero) %only.pnorm) {
; CHECK-LABEL: define nofpclass(nan nzero sub norm) float @pzero_demands_pnorm_input__trunc(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub nnorm) [[ONLY_PNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_PNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.pnorm
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub pzero) float @nzero_demands_pnorm_input__trunc(i1 %cond, float %unknown, float nofpclass(nan inf pnorm sub zero) %only.nnorm) {
; CHECK-LABEL: define nofpclass(nan pzero sub norm) float @nzero_demands_pnorm_input__trunc(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub pnorm) [[ONLY_NNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.nnorm
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub) float @zero_demands_norm_input__round(i1 %cond, float %unknown, float nofpclass(nan inf sub zero) %only.norm) {
; CHECK-LABEL: define nofpclass(nan sub norm) float @zero_demands_norm_input__round(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub) [[ONLY_NORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.round.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.norm
%result = call float @llvm.round.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub nzero) float @pzero_demands_pnorm_input__round(i1 %cond, float %unknown, float nofpclass(nan inf nnorm sub zero) %only.pnorm) {
; CHECK-LABEL: define nofpclass(nan nzero sub norm) float @pzero_demands_pnorm_input__round(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub nnorm) [[ONLY_PNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_PNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.round.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.pnorm
%result = call float @llvm.round.f32(float %select)
ret float %result
}
define nofpclass(nan norm sub pzero) float @nzero_demands_pnorm_input__round(i1 %cond, float %unknown, float nofpclass(nan inf pnorm sub zero) %only.nnorm) {
; CHECK-LABEL: define nofpclass(nan pzero sub norm) float @nzero_demands_pnorm_input__round(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]], float nofpclass(nan inf zero sub pnorm) [[ONLY_NNORM:%.*]]) {
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[UNKNOWN]], float [[ONLY_NNORM]]
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.round.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%select = select i1 %cond, float %unknown, float %only.nnorm
%result = call float @llvm.round.f32(float %select)
ret float %result
}
define nofpclass(snan) float @ret_only_only_psub__ceil(float nofpclass(nan inf norm nsub zero) %only.psub) {
; CHECK-LABEL: define nofpclass(snan) float @ret_only_only_psub__ceil(
; CHECK-SAME: float nofpclass(nan inf zero nsub norm) [[ONLY_PSUB:%.*]]) {
; CHECK-NEXT: ret float 1.000000e+00
;
%result = call float @llvm.ceil.f32(float %only.psub)
ret float %result
}
define nofpclass(snan) float @ret_only_only_psub__floor(float nofpclass(nan inf norm nsub zero) %only.psub) {
; CHECK-LABEL: define nofpclass(snan) float @ret_only_only_psub__floor(
; CHECK-SAME: float nofpclass(nan inf zero nsub norm) [[ONLY_PSUB:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.floor.f32(float %only.psub)
ret float %result
}
define nofpclass(snan) float @ret_only_only_psub__round(float nofpclass(nan inf norm nsub zero) %only.psub) {
; CHECK-LABEL: define nofpclass(snan) float @ret_only_only_psub__round(
; CHECK-SAME: float nofpclass(nan inf zero nsub norm) [[ONLY_PSUB:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = call float @llvm.round.f32(float %only.psub)
ret float %result
}
define nofpclass(snan) float @ret_only_only_nsub__ceil(float nofpclass(nan inf norm psub zero) %only.nsub) {
; CHECK-LABEL: define nofpclass(snan) float @ret_only_only_nsub__ceil(
; CHECK-SAME: float nofpclass(nan inf zero psub norm) [[ONLY_NSUB:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.ceil.f32(float %only.nsub)
ret float %result
}
define nofpclass(snan) float @ret_only_only_nsub__floor(float nofpclass(nan inf norm psub zero) %only.nsub) {
; CHECK-LABEL: define nofpclass(snan) float @ret_only_only_nsub__floor(
; CHECK-SAME: float nofpclass(nan inf zero psub norm) [[ONLY_NSUB:%.*]]) {
; CHECK-NEXT: ret float -1.000000e+00
;
%result = call float @llvm.floor.f32(float %only.nsub)
ret float %result
}
define nofpclass(snan) float @ret_only_only_nsub__round(float nofpclass(nan inf norm psub zero) %only.nsub) {
; CHECK-LABEL: define nofpclass(snan) float @ret_only_only_nsub__round(
; CHECK-SAME: float nofpclass(nan inf zero psub norm) [[ONLY_NSUB:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = call float @llvm.round.f32(float %only.nsub)
ret float %result
}
define nofpclass(nan) float @ret_non_nan__floor__drop_noundef(float %x) {
; CHECK-LABEL: define nofpclass(nan) float @ret_non_nan__floor__drop_noundef(
; CHECK-SAME: float [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan float @llvm.floor.f32(float [[X]])
; CHECK-NEXT: ret float [[RESULT]]
;
%result = call noundef float @llvm.floor.f32(float %x), !unknown.md !{}
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__trunc(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__trunc(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.trunc.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.trunc.f32(float %select)
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__floor(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__floor(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.floor.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.floor.f32(float %select)
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__ceil(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__ceil(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.ceil.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.ceil.f32(float %select)
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__rint(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__rint(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.rint.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.rint.f32(float %select)
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__nearbyint(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__nearbyint(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.nearbyint.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.nearbyint.f32(float %select)
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__round(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__round(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.round.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.round.f32(float %select)
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src__roundeven(i1 %cond, float %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src__roundeven(
; CHECK-SAME: i1 [[COND:%.*]], float [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call float @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[SNAN]], float [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = call float @llvm.roundeven.f32(float [[SELECT]])
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call float @returns_snan()
%select = select i1 %cond, float %snan, float %unknown
%result = call float @llvm.roundeven.f32(float %select)
ret float %result
}