Files
TheRock/compiler/amd-llvm/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.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

488 lines
20 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(inf norm sub zero) half @returns_nan_f16()
declare nofpclass(qnan inf norm sub zero) half @returns_snan_f16()
declare nofpclass(nan ninf norm sub zero) half @returns_pinf_f16()
declare nofpclass(nan pinf norm sub zero) half @returns_ninf_f16()
declare nofpclass(nan norm sub zero) half @returns_inf_f16()
declare nofpclass(norm sub zero) half @returns_inf_or_nan_f16()
declare nofpclass(inf nan norm psub zero) half @returns_nsub_f16()
declare nofpclass(inf nan norm nsub zero) half @returns_psub_f16()
declare nofpclass(inf nan norm zero) half @returns_sub_f16()
declare nofpclass(nan pinf pnorm psub pzero) half @returns_negative_f16()
declare nofpclass(pinf pnorm psub pzero) half @returns_negative_or_nan_f16()
declare nofpclass(nan ninf nnorm nsub nzero) half @returns_positive_f16()
declare nofpclass(ninf nnorm nsub nzero) half @returns_positive_or_nan_f16()
declare nofpclass(nan inf norm sub) half @returns_zero_f16()
declare nofpclass(nan inf norm sub pzero) half @returns_nzero_f16()
declare nofpclass(nan inf norm sub nzero) half @returns_pzero_f16()
declare nofpclass(inf norm sub) half @returns_zero_or_nan_f16()
define nofpclass(inf norm sub zero qnan) float @ret_only_snan__fpext(half %x) {
; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) float @ret_only_snan__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = fpext ninf half [[X]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf norm sub zero snan) float @ret_only_qnan__fpext(half %x) {
; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float +qnan
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf norm sub zero) float @ret_only_nan__fpext(half %x) {
; CHECK-LABEL: define nofpclass(inf zero sub norm) float @ret_only_nan__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float +qnan
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(nan norm sub zero) float @ret_only_inf__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan zero sub norm) float @ret_only_inf__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan half [[X]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(nan pinf norm sub zero) float @ret_only_ninf__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan pinf zero sub norm) float @ret_only_ninf__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float -inf
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(nan ninf norm sub zero) float @ret_only_pinf__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan ninf zero sub norm) float @ret_only_pinf__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float +inf
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm sub) float @ret_only_zero__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf sub norm) float @ret_only_zero__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan ninf half [[X]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm sub nzero) float @ret_only_pzero__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float @ret_only_pzero__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm sub pzero) float @ret_only_nzero__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf pzero sub norm) float @ret_only_nzero__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = fpext half %x to float
ret float %result
}
; Fold out select
define nofpclass(nan) float @ret_no_nan__fpext__select_nan_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(nan) float @ret_no_nan__fpext__select_nan_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NAN:%.*]] = call half @returns_nan_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%nan = call half @returns_nan_f16()
%select = select i1 %cond, half %nan, half %unknown
%result = fpext half %select to float
ret float %result
}
; Fold out select
define nofpclass(pinf) float @ret_no_pinf__fpext__select_pinf_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(pinf) float @ret_no_pinf__fpext__select_pinf_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[PINF:%.*]] = call half @returns_pinf_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%pinf = call half @returns_pinf_f16()
%select = select i1 %cond, half %pinf, half %unknown
%result = fpext half %select to float
ret float %result
}
; Fold out select
define nofpclass(ninf) float @ret_no_ninf__fpext__select_ninf_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(ninf) float @ret_no_ninf__fpext__select_ninf_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NINF:%.*]] = call half @returns_ninf_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%ninf = call half @returns_ninf_f16()
%select = select i1 %cond, half %ninf, half %unknown
%result = fpext half %select to float
ret float %result
}
; Fold out select
define nofpclass(inf) float @ret_no_inf__fpext__select_inf_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(inf) float @ret_no_inf__fpext__select_inf_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[INF:%.*]] = call half @returns_inf_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext ninf half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%inf = call half @returns_inf_f16()
%select = select i1 %cond, half %inf, half %unknown
%result = fpext half %select to float
ret float %result
}
; Fold out select
define nofpclass(nan inf) float @ret_no_inf_no_nan__fpext__select_inf_or_nan_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(nan inf) float @ret_no_inf_no_nan__fpext__select_inf_or_nan_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[INF_OR_NAN:%.*]] = call half @returns_inf_or_nan_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan ninf half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%inf.or.nan = call half @returns_inf_or_nan_f16()
%select = select i1 %cond, half %inf.or.nan, half %unknown
%result = fpext half %select to float
ret float %result
}
; Do not delete select, no subnormal result does not imply no
; subnormal source.
define nofpclass(nsub) float @ret_no_nsub__fpext__select_nsub_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(nsub) float @ret_no_nsub__fpext__select_nsub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NSUB:%.*]] = call half @returns_nsub_f16()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[NSUB]], half [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[SELECT]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%nsub = call half @returns_nsub_f16()
%select = select i1 %cond, half %nsub, half %unknown
%result = fpext half %select to float
ret float %result
}
; Do not delete select, no subnormal result does not imply no
; subnormal source.
define nofpclass(psub) float @ret_no_psub__fpext__select_psub_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(psub) float @ret_no_psub__fpext__select_psub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[PSUB:%.*]] = call half @returns_psub_f16()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[PSUB]], half [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[SELECT]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%psub = call half @returns_psub_f16()
%select = select i1 %cond, half %psub, half %unknown
%result = fpext half %select to float
ret float %result
}
; Do not delete select, no subnormal result does not imply no
; subnormal source.
define nofpclass(sub) float @ret_no_sub__fpext__select_sub_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(sub) float @ret_no_sub__fpext__select_sub_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SUB:%.*]] = call half @returns_sub_f16()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SUB]], half [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[SELECT]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%sub = call half @returns_sub_f16()
%select = select i1 %cond, half %sub, half %unknown
%result = fpext half %select to float
ret float %result
}
; Remove select
define nofpclass(pinf pnorm psub pzero) float @ret_no_positive__fpext__select_positive_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_no_positive__fpext__select_positive_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[POSITIVE:%.*]] = call half @returns_positive_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%positive = call half @returns_positive_f16()
%select = select i1 %cond, half %positive, half %unknown
%result = fpext half %select to float
ret float %result
}
; No remove select
define nofpclass(pinf pnorm psub pzero) float @ret_no_positive__fpext__select_positive_nan_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_no_positive__fpext__select_positive_nan_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[POSITIVE_OR_NAN:%.*]] = call half @returns_positive_or_nan_f16()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[POSITIVE_OR_NAN]], half [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[SELECT]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%positive.or.nan = call half @returns_positive_or_nan_f16()
%select = select i1 %cond, half %positive.or.nan, half %unknown
%result = fpext half %select to float
ret float %result
}
; Remove select
define nofpclass(nan pinf pnorm psub pzero) float @ret_no_positive_no_nan__fpext__select_positive_nan_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @ret_no_positive_no_nan__fpext__select_positive_nan_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[POSITIVE_OR_NAN:%.*]] = call half @returns_positive_or_nan_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%positive.or.nan = call half @returns_positive_or_nan_f16()
%select = select i1 %cond, half %positive.or.nan, half %unknown
%result = fpext half %select to float
ret float %result
}
; Remove select
define nofpclass(ninf nnorm nsub nzero) float @ret_no_negative__fpext__select_negative_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_no_negative__fpext__select_negative_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NEGATIVE:%.*]] = call half @returns_negative_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%negative = call half @returns_negative_f16()
%select = select i1 %cond, half %negative, half %unknown
%result = fpext half %select to float
ret float %result
}
; No remove select
define nofpclass(ninf nnorm nsub nzero) float @ret_no_negative__fpext__select_negative_nan_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_no_negative__fpext__select_negative_nan_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NEGATIVE_OR_NAN:%.*]] = call half @returns_negative_or_nan_f16()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[NEGATIVE_OR_NAN]], half [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[SELECT]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%negative.or.nan = call half @returns_negative_or_nan_f16()
%select = select i1 %cond, half %negative.or.nan, half %unknown
%result = fpext half %select to float
ret float %result
}
; Remove select
define nofpclass(nan ninf nnorm nsub nzero) float @ret_no_negative_no_nan__fpext__select_negative_nan_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_no_negative_no_nan__fpext__select_negative_nan_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NEGATIVE_OR_NAN:%.*]] = call half @returns_negative_or_nan_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%negative.or.nan = call half @returns_negative_or_nan_f16()
%select = select i1 %cond, half %negative.or.nan, half %unknown
%result = fpext half %select to float
ret float %result
}
define nofpclass(snan) float @ret_no_snan__fpext__always_zero() {
; CHECK-LABEL: define nofpclass(snan) float @ret_no_snan__fpext__always_zero() {
; CHECK-NEXT: [[ZERO:%.*]] = call half @returns_zero_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan ninf half [[ZERO]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%zero = call half @returns_zero_f16()
%result = fpext half %zero to float
ret float %result
}
define nofpclass(snan) float @ret_no_snan__fpext__always_zero_or_nan() {
; CHECK-LABEL: define nofpclass(snan) float @ret_no_snan__fpext__always_zero_or_nan() {
; CHECK-NEXT: [[ZERO_OR_NAN:%.*]] = call half @returns_zero_or_nan_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext ninf half [[ZERO_OR_NAN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%zero.or.nan = call half @returns_zero_or_nan_f16()
%result = fpext half %zero.or.nan to float
ret float %result
}
define nofpclass(snan) float @ret_no_snan__fpext__always_inf() {
; CHECK-LABEL: define nofpclass(snan) float @ret_no_snan__fpext__always_inf() {
; CHECK-NEXT: [[INF:%.*]] = call half @returns_inf_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan half [[INF]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%inf = call half @returns_inf_f16()
%result = fpext half %inf to float
ret float %result
}
define nofpclass(snan) float @ret_no_snan__fpext__always_inf_or_nan() {
; CHECK-LABEL: define nofpclass(snan) float @ret_no_snan__fpext__always_inf_or_nan() {
; CHECK-NEXT: [[INF_OR_NAN:%.*]] = call half @returns_inf_or_nan_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[INF_OR_NAN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%inf.or.nan = call half @returns_inf_or_nan_f16()
%result = fpext half %inf.or.nan to float
ret float %result
}
define nofpclass(inf nan norm zero) float @ret_only_sub__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf zero norm) float @ret_only_sub__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float poison
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm zero nsub) float @ret_only_psub__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf zero nsub norm) float @ret_only_psub__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float poison
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm zero psub) float @ret_only_nsub__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf zero psub norm) float @ret_only_nsub__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float poison
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm) float @ret_only_sub_zero__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf norm) float @ret_only_sub_zero__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = fpext nnan ninf half [[X]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm nzero nsub) float @ret_only_psub_pzero__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf nzero nsub norm) float @ret_only_psub_pzero__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float 0.000000e+00
;
%result = fpext half %x to float
ret float %result
}
define nofpclass(inf nan norm pzero psub) float @ret_only_nsub_nzero__fpext(half %x) {
; CHECK-LABEL: define nofpclass(nan inf pzero psub norm) float @ret_only_nsub_nzero__fpext(
; CHECK-SAME: half [[X:%.*]]) {
; CHECK-NEXT: ret float -0.000000e+00
;
%result = fpext half %x to float
ret float %result
}
; -> +inf
define nofpclass(ninf) float @ret_no_ninf__fpext__inf() {
; CHECK-LABEL: define nofpclass(ninf) float @ret_no_ninf__fpext__inf() {
; CHECK-NEXT: [[INF:%.*]] = call half @returns_inf_f16()
; CHECK-NEXT: ret float +inf
;
%inf = call half @returns_inf_f16()
%result = fpext half %inf to float
ret float %result
}
; -> -inf
define nofpclass(pinf) float @ret_no_pinf__fpext__inf() {
; CHECK-LABEL: define nofpclass(pinf) float @ret_no_pinf__fpext__inf() {
; CHECK-NEXT: [[INF:%.*]] = call half @returns_inf_f16()
; CHECK-NEXT: ret float -inf
;
%inf = call half @returns_inf_f16()
%result = fpext half %inf to float
ret float %result
}
define nofpclass(nzero) float @ret_no_nzero__fpext__select_nzero_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(nzero) float @ret_no_nzero__fpext__select_nzero_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[NZERO:%.*]] = call half @returns_nzero_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%nzero = call half @returns_nzero_f16()
%select = select i1 %cond, half %nzero, half %unknown
%result = fpext half %select to float
ret float %result
}
define nofpclass(pzero) float @ret_no_pzero__fpext__select_pzero_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(pzero) float @ret_no_pzero__fpext__select_pzero_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[PZERO:%.*]] = call half @returns_pzero_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%pzero = call half @returns_pzero_f16()
%select = select i1 %cond, half %pzero, half %unknown
%result = fpext half %select to float
ret float %result
}
define nofpclass(zero) float @ret_no_zero__fpext__select_zero_or_unknown(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(zero) float @ret_no_zero__fpext__select_zero_or_unknown(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[ZERO:%.*]] = call half @returns_zero_f16()
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[UNKNOWN]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%zero = call half @returns_zero_f16()
%select = select i1 %cond, half %zero, half %unknown
%result = fpext half %select to float
ret float %result
}
define nofpclass(snan) float @qnan_result_demands_snan_src(i1 %cond, half %unknown) {
; CHECK-LABEL: define nofpclass(snan) float @qnan_result_demands_snan_src(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call half @returns_snan_f16()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half [[UNKNOWN]]
; CHECK-NEXT: [[RESULT:%.*]] = fpext half [[SELECT]] to float
; CHECK-NEXT: ret float [[RESULT]]
;
%snan = call half @returns_snan_f16()
%select = select i1 %cond, half %snan, half %unknown
%result = fpext half %select to float
ret float %result
}