Files
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

367 lines
19 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()
declare nofpclass(qnan inf norm sub zero) half @returns_snan()
define nofpclass(inf norm sub zero) half @ret_only_nan(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(inf zero sub norm) half @ret_only_nan(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half +qnan
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf norm sub zero) <2 x half> @ret_only_nan_vec(<2 x half> %x, <2 x half> %y, <2 x half> %z) {
; CHECK-LABEL: define nofpclass(inf zero sub norm) <2 x half> @ret_only_nan_vec(
; CHECK-SAME: <2 x half> [[X:%.*]], <2 x half> [[Y:%.*]], <2 x half> [[Z:%.*]]) {
; CHECK-NEXT: ret <2 x half> splat (half +qnan)
;
%result = call <2 x half> @llvm.fma.v2f16(<2 x half> %x, <2 x half> %y, <2 x half> %z)
ret <2 x half> %result
}
define nofpclass(inf norm sub zero qnan) half @ret_only_snan(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) half @ret_only_snan(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[X]], half [[Y]], half [[Z]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf norm sub zero snan) half @ret_only_qnan(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half @ret_only_qnan(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half +qnan
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(nan norm sub zero) half @ret_only_inf(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan zero sub norm) half @ret_only_inf(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[X]], half [[Y]], half [[Z]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(nan pinf norm sub zero) half @ret_only_ninf(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan pinf zero sub norm) half @ret_only_ninf(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half -inf
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(nan ninf norm sub zero) half @ret_only_pinf(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan ninf zero sub norm) half @ret_only_pinf(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half +inf
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf nan norm sub) half @ret_only_zero(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan inf sub norm) half @ret_only_zero(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[X]], half [[Y]], half [[Z]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf nan norm sub nzero) half @ret_only_pzero(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) half @ret_only_pzero(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half 0.000000e+00
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf nan norm sub pzero) half @ret_only_nzero(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan inf pzero sub norm) half @ret_only_nzero(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half -0.000000e+00
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(nan) half @ret_no_nans(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan) half @ret_no_nans(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[X]], half [[Y]], half [[Z]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf) half @ret_no_infs(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(inf) half @ret_no_infs(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[X]], half [[Y]], half [[Z]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(nan inf) half @ret_no_nans_no_infs(half %x, half %y, half %z) {
; CHECK-LABEL: define nofpclass(nan inf) half @ret_no_nans_no_infs(
; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[X]], half [[Y]], half [[Z]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call half @llvm.fma.f16(half %x, half %y, half %z)
ret half %result
}
define nofpclass(inf norm sub zero) half @ret_only_nan__square(half noundef %x, half %z) {
; CHECK-LABEL: define nofpclass(inf zero sub norm) half @ret_only_nan__square(
; CHECK-SAME: half noundef [[X:%.*]], half [[Z:%.*]]) {
; CHECK-NEXT: ret half +qnan
;
%result = call half @llvm.fma.f16(half %x, half %x, half %z)
ret half %result
}
define nofpclass(nan) half @ret_nonan__select_nan_or_unknown_src0(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__select_nan_or_unknown_src0(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[NAN:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[UNKNOWN0]], half [[UNKNOWN1]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%nan = call half @returns_nan()
%nan.or.unknown = select i1 %cond, half %nan, half %unknown0
%result = call half @llvm.fma.f16(half %nan.or.unknown, half %unknown1, half %unknown2)
ret half %result
}
define nofpclass(nan) half @ret_nonan__select_nan_or_unknown_src1(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__select_nan_or_unknown_src1(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[NAN:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[UNKNOWN0]], half [[UNKNOWN1]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%nan = call half @returns_nan()
%nan.or.unknown = select i1 %cond, half %nan, half %unknown1
%result = call half @llvm.fma.f16(half %unknown0, half %nan.or.unknown, half %unknown2)
ret half %result
}
define nofpclass(nan) half @ret_nonan__select_nan_or_unknown_src2(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__select_nan_or_unknown_src2(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[NAN:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[UNKNOWN0]], half [[UNKNOWN1]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%nan = call half @returns_nan()
%nan.or.unknown = select i1 %cond, half %nan, half %unknown2
%result = call half @llvm.fma.f16(half %unknown0, half %unknown1, half %nan.or.unknown)
ret half %result
}
define nofpclass(nan) half @ret_nonan__fma__select_nan_or_unknown_all_src(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__fma__select_nan_or_unknown_all_src(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[NAN0:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[NAN1:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[NAN2:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[UNKNOWN0]], half [[UNKNOWN1]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%nan0 = call half @returns_nan()
%nan.or.unknown0 = select i1 %cond, half %nan0, half %unknown0
%nan1 = call half @returns_nan()
%nan.or.unknown1 = select i1 %cond, half %nan1, half %unknown1
%nan2 = call half @returns_nan()
%nan.or.unknown2 = select i1 %cond, half %nan2, half %unknown2
%result = call half @llvm.fma.f16(half %nan.or.unknown0, half %nan.or.unknown1, half %nan.or.unknown2)
ret half %result
}
define nofpclass(nan) half @ret_nonan__fmuladd__select_nan_or_unknown_all_src(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__fmuladd__select_nan_or_unknown_all_src(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[NAN0:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[NAN1:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[NAN2:%.*]] = call half @returns_nan()
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fmuladd.f16(half [[UNKNOWN0]], half [[UNKNOWN1]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%nan0 = call half @returns_nan()
%nan.or.unknown0 = select i1 %cond, half %nan0, half %unknown0
%nan1 = call half @returns_nan()
%nan.or.unknown1 = select i1 %cond, half %nan1, half %unknown1
%nan2 = call half @returns_nan()
%nan.or.unknown2 = select i1 %cond, half %nan2, half %unknown2
%result = call half @llvm.fmuladd.f16(half %nan.or.unknown0, half %nan.or.unknown1, half %nan.or.unknown2)
ret half %result
}
define nofpclass(nan) half @ret_nonan__fmuladd__no_nan_all_src(i1 %cond, half nofpclass(nan) %not.nan0, half nofpclass(nan) %not.nan1, half nofpclass(nan) %not.nan2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__fmuladd__no_nan_all_src(
; CHECK-SAME: i1 [[COND:%.*]], half nofpclass(nan) [[NOT_NAN0:%.*]], half nofpclass(nan) [[NOT_NAN1:%.*]], half nofpclass(nan) [[NOT_NAN2:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan nsz half @llvm.fmuladd.f16(half [[NOT_NAN0]], half [[NOT_NAN1]], half [[NOT_NAN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call nsz half @llvm.fmuladd.f16(half %not.nan0, half %not.nan1, half %not.nan2)
ret half %result
}
define nofpclass(inf) half @ret_noinf__fmuladd__no_inf_all_src(i1 %cond, half nofpclass(inf) %not.inf0, half nofpclass(inf) %not.inf1, half nofpclass(inf) %not.inf2) {
; CHECK-LABEL: define nofpclass(inf) half @ret_noinf__fmuladd__no_inf_all_src(
; CHECK-SAME: i1 [[COND:%.*]], half nofpclass(inf) [[NOT_INF0:%.*]], half nofpclass(inf) [[NOT_INF1:%.*]], half nofpclass(inf) [[NOT_INF2:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf nsz half @llvm.fmuladd.f16(half [[NOT_INF0]], half [[NOT_INF1]], half [[NOT_INF2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call nsz half @llvm.fmuladd.f16(half %not.inf0, half %not.inf1, half %not.inf2)
ret half %result
}
define nofpclass(nan inf) half @ret_noinf_nonan__fmuladd__no_inf_all_src(i1 %cond, half nofpclass(nan inf) %not.nan.or.inf0, half nofpclass(nan inf) %not.nan.or.inf1, half nofpclass(nan inf) %not.nan.or.inf2) {
; CHECK-LABEL: define nofpclass(nan inf) half @ret_noinf_nonan__fmuladd__no_inf_all_src(
; CHECK-SAME: i1 [[COND:%.*]], half nofpclass(nan inf) [[NOT_NAN_OR_INF0:%.*]], half nofpclass(nan inf) [[NOT_NAN_OR_INF1:%.*]], half nofpclass(nan inf) [[NOT_NAN_OR_INF2:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf nsz half @llvm.fmuladd.f16(half [[NOT_NAN_OR_INF0]], half [[NOT_NAN_OR_INF1]], half [[NOT_NAN_OR_INF2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call nsz half @llvm.fmuladd.f16(half %not.nan.or.inf0, half %not.nan.or.inf1, half %not.nan.or.inf2)
ret half %result
}
define nofpclass(nan) half @ret_nonan__fmuladd__no_nan_all_src__drop_ub_attrs_md(i1 %cond, half nofpclass(nan) %not.nan0, half nofpclass(nan) %not.nan1, half nofpclass(nan) %not.nan2) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__fmuladd__no_nan_all_src__drop_ub_attrs_md(
; CHECK-SAME: i1 [[COND:%.*]], half nofpclass(nan) [[NOT_NAN0:%.*]], half nofpclass(nan) [[NOT_NAN1:%.*]], half nofpclass(nan) [[NOT_NAN2:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fmuladd.f16(half [[NOT_NAN0]], half [[NOT_NAN1]], half [[NOT_NAN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call noundef half @llvm.fmuladd.f16(half %not.nan0, half %not.nan1, half noundef %not.nan2), !unknown.md !0, !noundef !0
ret half %result
}
define nofpclass(nan inf) half @ret_noinf_nonan__fmuladd__no_inf_all_src__drop_ub_attrs_md(half nofpclass(nan inf) %not.nan.or.inf0, half nofpclass(nan inf) %not.nan.or.inf1, half nofpclass(nan inf) %not.nan.or.inf2) {
; CHECK-LABEL: define nofpclass(nan inf) half @ret_noinf_nonan__fmuladd__no_inf_all_src__drop_ub_attrs_md(
; CHECK-SAME: half nofpclass(nan inf) [[NOT_NAN_OR_INF0:%.*]], half nofpclass(nan inf) [[NOT_NAN_OR_INF1:%.*]], half nofpclass(nan inf) [[NOT_NAN_OR_INF2:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf half @llvm.fmuladd.f16(half [[NOT_NAN_OR_INF0]], half [[NOT_NAN_OR_INF1]], half [[NOT_NAN_OR_INF2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call noundef half @llvm.fmuladd.f16(half %not.nan.or.inf0, half %not.nan.or.inf1, half %not.nan.or.inf2), !unknown.md !0, !noundef !0
ret half %result
}
define nofpclass(nan) half @ret_nonan__fma_square__no_nan_all_src(half nofpclass(nan) %not.nan0, half nofpclass(nan) %not.nan1) {
; CHECK-LABEL: define nofpclass(nan) half @ret_nonan__fma_square__no_nan_all_src(
; CHECK-SAME: half nofpclass(nan) [[NOT_NAN0:%.*]], half nofpclass(nan) [[NOT_NAN1:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan half @llvm.fma.f16(half [[NOT_NAN0]], half [[NOT_NAN0]], half [[NOT_NAN1]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call noundef half @llvm.fma.f16(half %not.nan0, half %not.nan0, half %not.nan1), !unknown.md !0, !noundef !0
ret half %result
}
define nofpclass(inf) half @ret_noinf__fma_square__no_inf_all_src(half nofpclass(inf) %not.nan0, half nofpclass(inf) %not.nan1) {
; CHECK-LABEL: define nofpclass(inf) half @ret_noinf__fma_square__no_inf_all_src(
; CHECK-SAME: half nofpclass(inf) [[NOT_NAN0:%.*]], half nofpclass(inf) [[NOT_NAN1:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call ninf half @llvm.fma.f16(half [[NOT_NAN0]], half [[NOT_NAN0]], half [[NOT_NAN1]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call noundef half @llvm.fma.f16(half %not.nan0, half %not.nan0, half %not.nan1), !unknown.md !0, !noundef !0
ret half %result
}
define nofpclass(nan inf) half @ret_nonan_noinf__fma_square__no_nan_no_inf_all_src(half nofpclass(nan inf) %not.nan0, half nofpclass(nan inf) %not.nan1) {
; CHECK-LABEL: define nofpclass(nan inf) half @ret_nonan_noinf__fma_square__no_nan_no_inf_all_src(
; CHECK-SAME: half nofpclass(nan inf) [[NOT_NAN0:%.*]], half nofpclass(nan inf) [[NOT_NAN1:%.*]]) {
; CHECK-NEXT: [[RESULT:%.*]] = call nnan ninf nsz half @llvm.fma.f16(half [[NOT_NAN0]], half [[NOT_NAN0]], half [[NOT_NAN1]])
; CHECK-NEXT: ret half [[RESULT]]
;
%result = call nsz noundef half @llvm.fma.f16(half %not.nan0, half %not.nan0, half %not.nan1), !unknown.md !0, !noundef !0
ret half %result
}
define nofpclass(snan) half @qnan_result_demands_snan_square_src0(i1 noundef %cond, half noundef %unknown0, half noundef %unknown1) {
; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_square_src0(
; CHECK-SAME: i1 noundef [[COND:%.*]], half noundef [[UNKNOWN0:%.*]], half noundef [[UNKNOWN1:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call half @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half [[UNKNOWN0]]
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[SELECT]], half [[SELECT]], half [[UNKNOWN1]])
; CHECK-NEXT: ret half [[RESULT]]
;
%snan = call half @returns_snan()
%select = select i1 %cond, half %snan, half %unknown0
%result = call half @llvm.fma.f16(half %select, half %select, half %unknown1)
ret half %result
}
define nofpclass(snan) half @qnan_result_demands_snan_square_src1(i1 noundef %cond, half noundef %unknown0, half noundef %unknown1) {
; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_square_src1(
; CHECK-SAME: i1 noundef [[COND:%.*]], half noundef [[UNKNOWN0:%.*]], half noundef [[UNKNOWN1:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call half @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half [[UNKNOWN0]]
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], half [[UNKNOWN1]], half [[SELECT]])
; CHECK-NEXT: ret half [[RESULT]]
;
%snan = call half @returns_snan()
%select = select i1 %cond, half %snan, half %unknown0
%result = call half @llvm.fma.f16(half %unknown1, half %unknown1, half %select)
ret half %result
}
define nofpclass(snan) half @qnan_result_demands_snan_src0(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src0(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call half @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half [[UNKNOWN0]]
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[SELECT]], half [[UNKNOWN1]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%snan = call half @returns_snan()
%select = select i1 %cond, half %snan, half %unknown0
%result = call half @llvm.fma.f16(half %select, half %unknown1, half %unknown2)
ret half %result
}
define nofpclass(snan) half @qnan_result_demands_snan_src1(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src1(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call half @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half [[UNKNOWN0]]
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], half [[SELECT]], half [[UNKNOWN2]])
; CHECK-NEXT: ret half [[RESULT]]
;
%snan = call half @returns_snan()
%select = select i1 %cond, half %snan, half %unknown0
%result = call half @llvm.fma.f16(half %unknown1, half %select, half %unknown2)
ret half %result
}
define nofpclass(snan) half @qnan_result_demands_snan_src2(i1 %cond, half %unknown0, half %unknown1, half %unknown2) {
; CHECK-LABEL: define nofpclass(snan) half @qnan_result_demands_snan_src2(
; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN0:%.*]], half [[UNKNOWN1:%.*]], half [[UNKNOWN2:%.*]]) {
; CHECK-NEXT: [[SNAN:%.*]] = call half @returns_snan()
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], half [[SNAN]], half [[UNKNOWN0]]
; CHECK-NEXT: [[RESULT:%.*]] = call half @llvm.fma.f16(half [[UNKNOWN1]], half [[UNKNOWN2]], half [[SELECT]])
; CHECK-NEXT: ret half [[RESULT]]
;
%snan = call half @returns_snan()
%select = select i1 %cond, half %snan, half %unknown0
%result = call half @llvm.fma.f16(half %unknown1, half %unknown2, half %select)
ret half %result
}
!0 = !{}