https://github.com/arsenm updated 
https://github.com/llvm/llvm-project/pull/176123

>From dbb4b7d5f45fe2c07f7533c567848cc195122782 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Thu, 15 Jan 2026 11:21:53 +0100
Subject: [PATCH 1/4] InstCombine: Fold known-qnan results to a literal nan

Previously we only considered fcNan to fold to qnan for canonicalizing
results, ignoring the simpler case where we know the nan is already
quiet.
---
 .../InstCombine/InstCombineSimplifyDemanded.cpp      |  2 ++
 .../InstCombine/simplify-demanded-fpclass-exp.ll     |  2 +-
 .../simplify-demanded-fpclass-extractelement.ll      |  3 +--
 .../InstCombine/simplify-demanded-fpclass-fadd.ll    |  3 +--
 .../InstCombine/simplify-demanded-fpclass-fmul.ll    |  6 ++----
 .../InstCombine/simplify-demanded-fpclass-fpext.ll   |  3 +--
 .../simplify-demanded-fpclass-fptrunc-round.ll       |  3 +--
 .../InstCombine/simplify-demanded-fpclass-fptrunc.ll |  3 +--
 .../InstCombine/simplify-demanded-fpclass-frexp.ll   |  7 +++----
 .../simplify-demanded-fpclass-insertelement.ll       |  7 +++----
 .../InstCombine/simplify-demanded-fpclass-maximum.ll |  3 +--
 .../simplify-demanded-fpclass-maximumnum.ll          |  3 +--
 .../InstCombine/simplify-demanded-fpclass-minimum.ll |  3 +--
 .../simplify-demanded-fpclass-minimumnum.ll          |  3 +--
 .../simplify-demanded-fpclass-rounding-intrinsics.ll |  2 +-
 .../simplify-demanded-fpclass-shufflevector.ll       |  7 +++----
 .../InstCombine/simplify-demanded-fpclass-sqrt.ll    | 12 +++---------
 .../InstCombine/simplify-demanded-fpclass.ll         |  2 +-
 18 files changed, 28 insertions(+), 46 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index d8f8a03a76a2f..28010f080dc67 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2029,6 +2029,8 @@ static Constant *getFPClassConstant(Type *Ty, FPClassTest 
Mask,
     return ConstantFP::getInfinity(Ty);
   case fcNegInf:
     return ConstantFP::getInfinity(Ty, true);
+  case fcQNan:
+    return ConstantFP::getQNaN(Ty);
   default:
     return nullptr;
   }
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
index ef68699c73166..2a33ff195911e 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
@@ -490,7 +490,7 @@ define nofpclass(nzero) float @source_is_known_snan(float 
nofpclass(inf norm sub
 define nofpclass(nzero) float @source_is_known_qnan(float nofpclass(inf norm 
sub zero snan) %must.be.qnan) {
 ; CHECK-LABEL: define nofpclass(nzero) float @source_is_known_qnan(
 ; CHECK-SAME: float nofpclass(snan inf zero sub norm) [[MUST_BE_QNAN:%.*]]) {
-; CHECK-NEXT:    ret float [[MUST_BE_QNAN]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %exp = call float @llvm.exp2.f32(float %must.be.qnan)
   ret float %exp
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll
index e571774c72f2b..6cabee258d2b6 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll
@@ -17,8 +17,7 @@ define nofpclass(inf norm sub zero) half 
@ret_only_nan__extractelement_unknown(<
 define nofpclass(snan inf norm sub zero) half 
@ret_only_qnan__extractelement_unknown(<4 x half> %vec, i32 %idx) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__extractelement_unknown(
 ; CHECK-SAME: <4 x half> [[VEC:%.*]], i32 [[IDX:%.*]]) {
-; CHECK-NEXT:    [[EXT:%.*]] = extractelement <4 x half> [[VEC]], i32 [[IDX]]
-; CHECK-NEXT:    ret half [[EXT]]
+; CHECK-NEXT:    ret half 0xH7E00
 ;
   %ext = extractelement <4 x half> %vec, i32 %idx
   ret half %ext
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll
index ae9458cc1fe34..ea75dcd33c9c4 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fadd.ll
@@ -43,8 +43,7 @@ define nofpclass(inf zero sub norm) half @ret_only_nan(half 
%x, half %y) {
 define nofpclass(snan inf zero sub norm) half @ret_only_qnan(half %x, half %y) 
{
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half @ret_only_qnan(
 ; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]]) {
-; CHECK-NEXT:    [[ADD:%.*]] = fadd half [[X]], [[Y]]
-; CHECK-NEXT:    ret half [[ADD]]
+; CHECK-NEXT:    ret half 0xH7E00
 ;
   %add = fadd half %x, %y
   ret half %add
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
index 300fe7cfac036..c40200f819e7d 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
@@ -112,8 +112,7 @@ define nofpclass(inf norm sub zero) float 
@ret_only_nan_results_square(float nou
 define nofpclass(inf norm sub zero snan) float 
@ret_only_qnan_results_square(float noundef %x) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float 
@ret_only_qnan_results_square(
 ; CHECK-SAME: float noundef [[X:%.*]]) {
-; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[X]], [[X]]
-; CHECK-NEXT:    ret float [[MUL]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %mul = fmul float %x, %x
   ret float %mul
@@ -885,8 +884,7 @@ define nofpclass(inf norm sub zero) float 
@ret_only_nan_results_fmul(float %x, f
 define nofpclass(inf norm sub zero snan) float 
@ret_only_qnan_results_fmul(float %x, float %y) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float 
@ret_only_qnan_results_fmul(
 ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
-; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[X]], [[Y]]
-; CHECK-NEXT:    ret float [[MUL]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %mul = fmul float %x, %y
   ret float %mul
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll
index c1070954a26ff..7334277750d7e 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fpext.ll
@@ -36,8 +36,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan__fpext(half %x) {
 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:    [[RESULT:%.*]] = fpext half [[X]] to float
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %result = fpext half %x to float
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
index 238c170fa3c79..c32196503344f 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
@@ -40,8 +40,7 @@ define nofpclass(inf norm sub zero qnan) half 
@ret_only_snan__fptrunc(float %x)
 define nofpclass(inf norm sub zero snan) half @ret_only_qnan__fptrunc(float 
%x) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__fptrunc(
 ; CHECK-SAME: float [[X:%.*]]) {
-; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fptrunc.round.f16.f32(float 
[[X]], metadata !"round.downward")
-; CHECK-NEXT:    ret half [[RESULT]]
+; CHECK-NEXT:    ret half 0xH7E00
 ;
   %result = call half @llvm.fptrunc.round.f16.f32(float %x, metadata 
!"round.downward")
   ret half %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
index 3a667389c5fad..eae99c2b5cff8 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
@@ -40,8 +40,7 @@ define nofpclass(inf norm sub zero qnan) half 
@ret_only_snan__fptrunc(float %x)
 define nofpclass(inf norm sub zero snan) half @ret_only_qnan__fptrunc(float 
%x) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__fptrunc(
 ; CHECK-SAME: float [[X:%.*]]) {
-; CHECK-NEXT:    [[RESULT:%.*]] = fptrunc float [[X]] to half
-; CHECK-NEXT:    ret half [[RESULT]]
+; CHECK-NEXT:    ret half 0xH7E00
 ;
   %result = fptrunc float %x to half
   ret half %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll
index dc9c00ef15461..f4e7478dad5a1 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll
@@ -65,7 +65,7 @@ define nofpclass(nan) half @extractvalue_not_frexp() {
 define nofpclass(snan inf norm sub zero) half @ret_only_qnan__frexp(half 
%unknown) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__frexp(
 ; CHECK-SAME: half [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret half [[UNKNOWN]]
+; CHECK-NEXT:    ret half 0xH7E00
 ;
   %frexp = call { half, i32 } @llvm.frexp.f16.i32(half %unknown)
   %frexp.mant = extractvalue { half, i32 } %frexp, 0
@@ -316,8 +316,7 @@ define nofpclass(qnan) half 
@ret_nofpclass_qnan__frexp_select_unknown_qnan(i1 %c
 ; CHECK-LABEL: define nofpclass(qnan) half 
@ret_nofpclass_qnan__frexp_select_unknown_qnan(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[ONLY_QNAN:%.*]] = call half @returns_qnan()
-; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[UNKNOWN]], half 
[[ONLY_QNAN]]
-; CHECK-NEXT:    [[FREXP:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half 
[[SELECT]])
+; CHECK-NEXT:    [[FREXP:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half 
[[UNKNOWN]])
 ; CHECK-NEXT:    [[FREXP_MANT:%.*]] = extractvalue { half, i32 } [[FREXP]], 0
 ; CHECK-NEXT:    ret half [[FREXP_MANT]]
 ;
@@ -533,7 +532,7 @@ define nofpclass(snan) half @src_only_inf__frexp() {
 define nofpclass(snan) half @src_only_nan__frexp() {
 ; CHECK-LABEL: define nofpclass(snan) half @src_only_nan__frexp() {
 ; CHECK-NEXT:    [[ONLY_NAN:%.*]] = call half @returns_nan()
-; CHECK-NEXT:    ret half [[ONLY_NAN]]
+; CHECK-NEXT:    ret half 0xH7E00
 ;
   %only.nan = call half @returns_nan()
   %frexp = call { half, i32 } @llvm.frexp.f16.i32(half %only.nan)
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll
index 36d8766d967aa..8c6679d8be038 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll
@@ -29,8 +29,7 @@ define nofpclass(qnan inf zero sub norm) <4 x half> 
@ret_only_snan__insert_unkno
 define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__insert_unknown_unknown(<4 x half> %vec, half %elt, i32 %idx) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__insert_unknown_unknown(
 ; CHECK-SAME: <4 x half> [[VEC:%.*]], half [[ELT:%.*]], i32 [[IDX:%.*]]) {
-; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[VEC]], half 
[[ELT]], i32 [[IDX]]
-; CHECK-NEXT:    ret <4 x half> [[INSERT]]
+; CHECK-NEXT:    ret <4 x half> splat (half 0xH7E00)
 ;
   %insert = insertelement <4 x half> %vec, half %elt, i32 %idx
   ret <4 x half> %insert
@@ -160,7 +159,7 @@ define nofpclass(snan) <4 x half> 
@insert_unknown_taints_known_nan_vector_input(
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@insert_unknown_taints_known_nan_vector_input(
 ; CHECK-SAME: half [[UNKNOWN_ELT:%.*]], i32 [[IDX:%.*]]) {
 ; CHECK-NEXT:    [[NAN_VEC:%.*]] = call <4 x half> @returns_nan()
-; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[NAN_VEC]], half 
[[UNKNOWN_ELT]], i32 [[IDX]]
+; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> splat (half 
0xH7E00), half [[UNKNOWN_ELT]], i32 [[IDX]]
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[INSERT]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
@@ -175,7 +174,7 @@ define nofpclass(snan) <4 x half> 
@insert_unknown_vector_taints_known_nan_vector
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@insert_unknown_vector_taints_known_nan_vector_insert(
 ; CHECK-SAME: <4 x half> [[UNKNOWN_VEC:%.*]], i32 [[IDX:%.*]]) {
 ; CHECK-NEXT:    [[NAN_ELT:%.*]] = call half @returns_nan_f16()
-; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[UNKNOWN_VEC]], 
half [[NAN_ELT]], i32 [[IDX]]
+; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[UNKNOWN_VEC]], 
half 0xH7E00, i32 [[IDX]]
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[INSERT]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll
index 4c0f2f9d7ae78..b6a6e63af8acb 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximum.ll
@@ -68,8 +68,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan(float %x, float %y
 define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float 
%y) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan(
 ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
-; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximum.f32(float 
[[X]], float [[Y]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %result = call float @llvm.maximum.f32(float %x, float %y)
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximumnum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximumnum.ll
index 4c87ca17a3512..2589d80a256d6 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximumnum.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-maximumnum.ll
@@ -67,8 +67,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan(float %x, float %y
 define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float 
%y) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan(
 ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
-; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.maximumnum.f32(float 
[[X]], float [[Y]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %result = call float @llvm.maximumnum.f32(float %x, float %y)
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll
index e62ec503c78ab..fba6e9c45da4d 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimum.ll
@@ -67,8 +67,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan(float %x, float %y
 define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float 
%y) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan(
 ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
-; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimum.f32(float 
[[X]], float [[Y]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %result = call float @llvm.minimum.f32(float %x, float %y)
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimumnum.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimumnum.ll
index e66e3afb52c77..b67077cb7dbd9 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimumnum.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-minimumnum.ll
@@ -67,8 +67,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan(float %x, float %y
 define nofpclass(inf norm sub zero snan) float @ret_only_qnan(float %x, float 
%y) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float @ret_only_qnan(
 ; CHECK-SAME: float [[X:%.*]], float [[Y:%.*]]) {
-; CHECK-NEXT:    [[RESULT:%.*]] = call nsz float @llvm.minimumnum.f32(float 
[[X]], float [[Y]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %result = call float @llvm.minimumnum.f32(float %x, float %y)
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
index 568a22b7c9a83..4c547eb87e8b5 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
@@ -41,7 +41,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan__floor(float %x) {
 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]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %result = call float @llvm.floor.f32(float %x)
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll
index ee8be3ca1bf89..565e9b76ddea3 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll
@@ -28,8 +28,7 @@ define nofpclass(qnan inf zero sub norm) <4 x half> 
@ret_only_snan__shufflevecto
 define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__shufflevector_unknown(<4 x half> %vec0, <4 x half> %vec1) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__shufflevector_unknown(
 ; CHECK-SAME: <4 x half> [[VEC0:%.*]], <4 x half> [[VEC1:%.*]]) {
-; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[VEC0]], <4 x 
half> [[VEC1]], <4 x i32> <i32 6, i32 2, i32 3, i32 0>
-; CHECK-NEXT:    ret <4 x half> [[SHUFFLE]]
+; CHECK-NEXT:    ret <4 x half> splat (half 0xH7E00)
 ;
   %shuffle = shufflevector <4 x half> %vec0, <4 x half> %vec1, <4 x i32> <i32 
6, i32 2, i32 3, i32 0>
   ret <4 x half> %shuffle
@@ -242,7 +241,7 @@ define nofpclass(snan) <4 x half> 
@ret_nonnan_rhs_taints_known_nan_result(i1 %co
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@ret_nonnan_rhs_taints_known_nan_result(
 ; CHECK-SAME: i1 [[COND:%.*]], <4 x half> [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NAN:%.*]] = call <4 x half> @returns_nan()
-; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[NAN]], <4 x 
half> [[UNKNOWN]], <4 x i32> <i32 5, i32 0, i32 1, i32 3>
+; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> <half 0xH7E00, 
half 0xH7E00, half poison, half 0xH7E00>, <4 x half> [[UNKNOWN]], <4 x i32> 
<i32 5, i32 0, i32 1, i32 3>
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[SHUFFLE]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
@@ -257,7 +256,7 @@ define nofpclass(snan) <4 x half> 
@ret_nonnan_lhs_taints_known_nan_result(i1 %co
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@ret_nonnan_lhs_taints_known_nan_result(
 ; CHECK-SAME: i1 [[COND:%.*]], <4 x half> [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NAN:%.*]] = call <4 x half> @returns_nan()
-; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[UNKNOWN]], <4 x 
half> [[NAN]], <4 x i32> <i32 5, i32 0, i32 1, i32 3>
+; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[UNKNOWN]], <4 x 
half> <half poison, half 0xH7E00, half poison, half poison>, <4 x i32> <i32 5, 
i32 0, i32 1, i32 3>
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[SHUFFLE]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-sqrt.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-sqrt.ll
index b09faf0f4c3af..0520fef0f0e79 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-sqrt.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-sqrt.ll
@@ -163,9 +163,7 @@ define nofpclass(inf norm zero) float 
@ret_only_nan_or_sub__sqrt__select_unknown
 ; CHECK-LABEL: define nofpclass(inf zero norm) float 
@ret_only_nan_or_sub__sqrt__select_unknown_or_maybe_ninf(
 ; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan) [[X:%.*]]) {
 ; CHECK-NEXT:    [[MAYBE_NINF:%.*]] = call nofpclass(nan pinf sub norm) float 
@func()
-; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 
0xFFF0000000000000
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.sqrt.f32(float [[SELECT]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %maybe.ninf = call nofpclass(pinf norm sub nan) float @func()
   %select = select i1 %cond, float %x, float %maybe.ninf
@@ -178,9 +176,7 @@ define nofpclass(inf norm zero) float 
@ret_only_nan_or_sub__sqrt__select_unknown
 ; CHECK-LABEL: define nofpclass(inf zero norm) float 
@ret_only_nan_or_sub__sqrt__select_unknown_or_maybe_nnorm(
 ; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan) [[X:%.*]]) {
 ; CHECK-NEXT:    [[MAYBE_NNORM:%.*]] = call nofpclass(nan inf sub pnorm) float 
@func()
-; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 
[[MAYBE_NNORM]]
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.sqrt.f32(float [[SELECT]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %maybe.nnorm = call nofpclass(inf pnorm sub nan) float @func()
   %select = select i1 %cond, float %x, float %maybe.nnorm
@@ -193,9 +189,7 @@ define nofpclass(inf norm zero) float 
@ret_only_nan_or_sub__sqrt__select_unknown
 ; CHECK-LABEL: define nofpclass(inf zero norm) float 
@ret_only_nan_or_sub__sqrt__select_unknown_or_maybe_nsub(
 ; CHECK-SAME: i1 [[COND:%.*]], float nofpclass(nan) [[X:%.*]]) {
 ; CHECK-NEXT:    [[MAYBE_NSUB:%.*]] = call nofpclass(nan inf psub norm) float 
@func()
-; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 
[[MAYBE_NSUB]]
-; CHECK-NEXT:    [[RESULT:%.*]] = call float @llvm.sqrt.f32(float [[SELECT]])
-; CHECK-NEXT:    ret float [[RESULT]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %maybe.nsub = call nofpclass(inf norm psub nan) float @func()
   %select = select i1 %cond, float %x, float %maybe.nsub
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
index 545a5f895ab6f..491375ee57dba 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
@@ -1417,7 +1417,7 @@ define nofpclass(snan) float 
@ret_nofpclass_snan__nofpclass_call_only_nan(i1 %co
 ; CHECK-LABEL: define nofpclass(snan) float 
@ret_nofpclass_snan__nofpclass_call_only_nan
 ; CHECK-SAME: (i1 [[COND:%.*]], float [[Y:%.*]]) {
 ; CHECK-NEXT:    [[MUST_BE_NAN:%.*]] = call nofpclass(inf zero sub norm) float 
@extern()
-; CHECK-NEXT:    ret float [[MUST_BE_NAN]]
+; CHECK-NEXT:    ret float 0x7FF8000000000000
 ;
   %must.be.nan = call nofpclass(inf norm zero sub) float @extern()
   ret float %must.be.nan

>From 38bd5067aa1572532d30a52dd5afc25ad46dcae4 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Thu, 15 Jan 2026 17:26:57 +0100
Subject: [PATCH 2/4] Move isAggregateType, although this can't break for any
 existing case

---
 .../InstCombine/InstCombineSimplifyDemanded.cpp           | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 28010f080dc67..2b9b4166fa139 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2014,14 +2014,14 @@ static Constant *getFPClassConstant(Type *Ty, 
FPClassTest Mask,
   if (Mask == fcPosZero)
     return Constant::getNullValue(Ty);
 
-  // Turn any possible snans into quiet if we can.
-  if (Mask == fcNan && IsCanonicalizing)
-    return ConstantFP::getQNaN(Ty);
-
   // TODO: Support aggregate types that are allowed by FPMathOperator.
   if (Ty->isAggregateType())
     return nullptr;
 
+  // Turn any possible snans into quiet if we can.
+  if (Mask == fcNan && IsCanonicalizing)
+    return ConstantFP::getQNaN(Ty);
+
   switch (Mask) {
   case fcNegZero:
     return ConstantFP::getZero(Ty, true);

>From c73ccb4e67a1f027da56644e39be48c416ff14f1 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Thu, 15 Jan 2026 17:24:36 +0100
Subject: [PATCH 3/4] Check IsCanonicalizing

---
 .../InstCombineSimplifyDemanded.cpp           |  3 +-
 .../InstCombine/simplify-demanded-fpclass.ll  | 86 ++++++++++++++++++-
 2 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 2b9b4166fa139..661e1baf559fb 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2030,7 +2030,8 @@ static Constant *getFPClassConstant(Type *Ty, FPClassTest 
Mask,
   case fcNegInf:
     return ConstantFP::getInfinity(Ty, true);
   case fcQNan:
-    return ConstantFP::getQNaN(Ty);
+    // Payload bits cannot be dropped for pure signbit operations.
+    return IsCanonicalizing ? ConstantFP::getQNaN(Ty) : nullptr;
   default:
     return nullptr;
   }
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
index 491375ee57dba..b0bae1e2ee835 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
@@ -353,6 +353,90 @@ define nofpclass(inf) float 
@ret_nofpclass_inf__select_chain_inf_nan_1(i1 %cond,
   ret float %select1
 }
 
+define nofpclass(inf norm sub zero) float @ret_only_nan__fabs(float %unknown) {
+; CHECK-LABEL: define nofpclass(inf zero sub norm) float @ret_only_nan__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[UNKNOWN]])
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(snan inf norm sub zero) float @ret_only_qnan__fabs(float 
%unknown) {
+; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float 
@ret_only_qnan__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[UNKNOWN]])
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(qnan inf norm sub zero) float @ret_only_snan__fabs(float 
%unknown) {
+; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) float 
@ret_only_snan__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[UNKNOWN]])
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(nan norm sub zero) float @ret_only_inf__fabs(float %unknown) {
+; CHECK-LABEL: define nofpclass(nan zero sub norm) float @ret_only_inf__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    ret float 0x7FF0000000000000
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(nan ninf norm sub zero) float @ret_only_pinf__fabs(float 
%unknown) {
+; CHECK-LABEL: define nofpclass(nan ninf zero sub norm) float 
@ret_only_pinf__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    ret float 0x7FF0000000000000
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(nan pinf norm sub zero) float @ret_only_ninf__fabs(float 
%unknown) {
+; CHECK-LABEL: define nofpclass(nan pinf zero sub norm) float 
@ret_only_ninf__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    ret float poison
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(nan inf norm sub) float @ret_only_zero__fabs(float %unknown) {
+; CHECK-LABEL: define nofpclass(nan inf sub norm) float @ret_only_zero__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    ret float 0.000000e+00
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(nan inf norm sub pzero) float @ret_only_nzero__fabs(float 
%unknown) {
+; CHECK-LABEL: define nofpclass(nan inf pzero sub norm) float 
@ret_only_nzero__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    ret float poison
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
+define nofpclass(nan inf norm sub nzero) float @ret_only_pzero__fabs(float 
%unknown) {
+; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float 
@ret_only_pzero__fabs
+; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
+; CHECK-NEXT:    ret float 0.000000e+00
+;
+  %fabs = call float @llvm.fabs.f32(float %unknown)
+  ret float %fabs
+}
+
 ; Simplify to fabs %x
 define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_ninf_rhs(i1 %cond, 
float %x) {
 ; CHECK-LABEL: define nofpclass(inf) float 
@ret_nofpclass_inf__fabs_select_ninf_rhs
@@ -1417,7 +1501,7 @@ define nofpclass(snan) float 
@ret_nofpclass_snan__nofpclass_call_only_nan(i1 %co
 ; CHECK-LABEL: define nofpclass(snan) float 
@ret_nofpclass_snan__nofpclass_call_only_nan
 ; CHECK-SAME: (i1 [[COND:%.*]], float [[Y:%.*]]) {
 ; CHECK-NEXT:    [[MUST_BE_NAN:%.*]] = call nofpclass(inf zero sub norm) float 
@extern()
-; CHECK-NEXT:    ret float 0x7FF8000000000000
+; CHECK-NEXT:    ret float [[MUST_BE_NAN]]
 ;
   %must.be.nan = call nofpclass(inf norm zero sub) float @extern()
   ret float %must.be.nan

>From e595e0fa7c0e270e05fb7f45989100904323af86 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Tue, 20 Jan 2026 23:36:27 +0100
Subject: [PATCH 4/4] regenerate tests

---
 .../simplify-demanded-fpclass-exp.ll          |  2 +-
 ...implify-demanded-fpclass-extractelement.ll |  3 +-
 ...simplify-demanded-fpclass-fptrunc-round.ll |  3 +-
 .../simplify-demanded-fpclass-fptrunc.ll      |  3 +-
 .../simplify-demanded-fpclass-frexp.ll        |  3 +-
 ...simplify-demanded-fpclass-insertelement.ll |  7 +-
 ...fy-demanded-fpclass-rounding-intrinsics.ll |  2 +-
 ...simplify-demanded-fpclass-shufflevector.ll |  7 +-
 .../InstCombine/simplify-demanded-fpclass.ll  | 84 -------------------
 9 files changed, 18 insertions(+), 96 deletions(-)

diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
index 2a33ff195911e..ef68699c73166 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-exp.ll
@@ -490,7 +490,7 @@ define nofpclass(nzero) float @source_is_known_snan(float 
nofpclass(inf norm sub
 define nofpclass(nzero) float @source_is_known_qnan(float nofpclass(inf norm 
sub zero snan) %must.be.qnan) {
 ; CHECK-LABEL: define nofpclass(nzero) float @source_is_known_qnan(
 ; CHECK-SAME: float nofpclass(snan inf zero sub norm) [[MUST_BE_QNAN:%.*]]) {
-; CHECK-NEXT:    ret float 0x7FF8000000000000
+; CHECK-NEXT:    ret float [[MUST_BE_QNAN]]
 ;
   %exp = call float @llvm.exp2.f32(float %must.be.qnan)
   ret float %exp
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll
index 6cabee258d2b6..e571774c72f2b 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-extractelement.ll
@@ -17,7 +17,8 @@ define nofpclass(inf norm sub zero) half 
@ret_only_nan__extractelement_unknown(<
 define nofpclass(snan inf norm sub zero) half 
@ret_only_qnan__extractelement_unknown(<4 x half> %vec, i32 %idx) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__extractelement_unknown(
 ; CHECK-SAME: <4 x half> [[VEC:%.*]], i32 [[IDX:%.*]]) {
-; CHECK-NEXT:    ret half 0xH7E00
+; CHECK-NEXT:    [[EXT:%.*]] = extractelement <4 x half> [[VEC]], i32 [[IDX]]
+; CHECK-NEXT:    ret half [[EXT]]
 ;
   %ext = extractelement <4 x half> %vec, i32 %idx
   ret half %ext
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
index c32196503344f..238c170fa3c79 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc-round.ll
@@ -40,7 +40,8 @@ define nofpclass(inf norm sub zero qnan) half 
@ret_only_snan__fptrunc(float %x)
 define nofpclass(inf norm sub zero snan) half @ret_only_qnan__fptrunc(float 
%x) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__fptrunc(
 ; CHECK-SAME: float [[X:%.*]]) {
-; CHECK-NEXT:    ret half 0xH7E00
+; CHECK-NEXT:    [[RESULT:%.*]] = call half @llvm.fptrunc.round.f16.f32(float 
[[X]], metadata !"round.downward")
+; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %result = call half @llvm.fptrunc.round.f16.f32(float %x, metadata 
!"round.downward")
   ret half %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
index eae99c2b5cff8..3a667389c5fad 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fptrunc.ll
@@ -40,7 +40,8 @@ define nofpclass(inf norm sub zero qnan) half 
@ret_only_snan__fptrunc(float %x)
 define nofpclass(inf norm sub zero snan) half @ret_only_qnan__fptrunc(float 
%x) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) half 
@ret_only_qnan__fptrunc(
 ; CHECK-SAME: float [[X:%.*]]) {
-; CHECK-NEXT:    ret half 0xH7E00
+; CHECK-NEXT:    [[RESULT:%.*]] = fptrunc float [[X]] to half
+; CHECK-NEXT:    ret half [[RESULT]]
 ;
   %result = fptrunc float %x to half
   ret half %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll
index f4e7478dad5a1..5cebd6ccd2c10 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll
@@ -316,7 +316,8 @@ define nofpclass(qnan) half 
@ret_nofpclass_qnan__frexp_select_unknown_qnan(i1 %c
 ; CHECK-LABEL: define nofpclass(qnan) half 
@ret_nofpclass_qnan__frexp_select_unknown_qnan(
 ; CHECK-SAME: i1 [[COND:%.*]], half [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[ONLY_QNAN:%.*]] = call half @returns_qnan()
-; CHECK-NEXT:    [[FREXP:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half 
[[UNKNOWN]])
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], half [[UNKNOWN]], half 
[[ONLY_QNAN]]
+; CHECK-NEXT:    [[FREXP:%.*]] = call { half, i32 } @llvm.frexp.f16.i32(half 
[[SELECT]])
 ; CHECK-NEXT:    [[FREXP_MANT:%.*]] = extractvalue { half, i32 } [[FREXP]], 0
 ; CHECK-NEXT:    ret half [[FREXP_MANT]]
 ;
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll
index 8c6679d8be038..36d8766d967aa 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-insertelement.ll
@@ -29,7 +29,8 @@ define nofpclass(qnan inf zero sub norm) <4 x half> 
@ret_only_snan__insert_unkno
 define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__insert_unknown_unknown(<4 x half> %vec, half %elt, i32 %idx) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__insert_unknown_unknown(
 ; CHECK-SAME: <4 x half> [[VEC:%.*]], half [[ELT:%.*]], i32 [[IDX:%.*]]) {
-; CHECK-NEXT:    ret <4 x half> splat (half 0xH7E00)
+; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[VEC]], half 
[[ELT]], i32 [[IDX]]
+; CHECK-NEXT:    ret <4 x half> [[INSERT]]
 ;
   %insert = insertelement <4 x half> %vec, half %elt, i32 %idx
   ret <4 x half> %insert
@@ -159,7 +160,7 @@ define nofpclass(snan) <4 x half> 
@insert_unknown_taints_known_nan_vector_input(
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@insert_unknown_taints_known_nan_vector_input(
 ; CHECK-SAME: half [[UNKNOWN_ELT:%.*]], i32 [[IDX:%.*]]) {
 ; CHECK-NEXT:    [[NAN_VEC:%.*]] = call <4 x half> @returns_nan()
-; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> splat (half 
0xH7E00), half [[UNKNOWN_ELT]], i32 [[IDX]]
+; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[NAN_VEC]], half 
[[UNKNOWN_ELT]], i32 [[IDX]]
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[INSERT]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
@@ -174,7 +175,7 @@ define nofpclass(snan) <4 x half> 
@insert_unknown_vector_taints_known_nan_vector
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@insert_unknown_vector_taints_known_nan_vector_insert(
 ; CHECK-SAME: <4 x half> [[UNKNOWN_VEC:%.*]], i32 [[IDX:%.*]]) {
 ; CHECK-NEXT:    [[NAN_ELT:%.*]] = call half @returns_nan_f16()
-; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[UNKNOWN_VEC]], 
half 0xH7E00, i32 [[IDX]]
+; CHECK-NEXT:    [[INSERT:%.*]] = insertelement <4 x half> [[UNKNOWN_VEC]], 
half [[NAN_ELT]], i32 [[IDX]]
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[INSERT]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
index 4c547eb87e8b5..568a22b7c9a83 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-rounding-intrinsics.ll
@@ -41,7 +41,7 @@ define nofpclass(inf norm sub zero qnan) float 
@ret_only_snan__floor(float %x) {
 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 0x7FF8000000000000
+; CHECK-NEXT:    ret float [[X]]
 ;
   %result = call float @llvm.floor.f32(float %x)
   ret float %result
diff --git 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll
index 565e9b76ddea3..ee8be3ca1bf89 100644
--- 
a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll
+++ 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-shufflevector.ll
@@ -28,7 +28,8 @@ define nofpclass(qnan inf zero sub norm) <4 x half> 
@ret_only_snan__shufflevecto
 define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__shufflevector_unknown(<4 x half> %vec0, <4 x half> %vec1) {
 ; CHECK-LABEL: define nofpclass(snan inf zero sub norm) <4 x half> 
@ret_only_qnan__shufflevector_unknown(
 ; CHECK-SAME: <4 x half> [[VEC0:%.*]], <4 x half> [[VEC1:%.*]]) {
-; CHECK-NEXT:    ret <4 x half> splat (half 0xH7E00)
+; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[VEC0]], <4 x 
half> [[VEC1]], <4 x i32> <i32 6, i32 2, i32 3, i32 0>
+; CHECK-NEXT:    ret <4 x half> [[SHUFFLE]]
 ;
   %shuffle = shufflevector <4 x half> %vec0, <4 x half> %vec1, <4 x i32> <i32 
6, i32 2, i32 3, i32 0>
   ret <4 x half> %shuffle
@@ -241,7 +242,7 @@ define nofpclass(snan) <4 x half> 
@ret_nonnan_rhs_taints_known_nan_result(i1 %co
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@ret_nonnan_rhs_taints_known_nan_result(
 ; CHECK-SAME: i1 [[COND:%.*]], <4 x half> [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NAN:%.*]] = call <4 x half> @returns_nan()
-; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> <half 0xH7E00, 
half 0xH7E00, half poison, half 0xH7E00>, <4 x half> [[UNKNOWN]], <4 x i32> 
<i32 5, i32 0, i32 1, i32 3>
+; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[NAN]], <4 x 
half> [[UNKNOWN]], <4 x i32> <i32 5, i32 0, i32 1, i32 3>
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[SHUFFLE]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
@@ -256,7 +257,7 @@ define nofpclass(snan) <4 x half> 
@ret_nonnan_lhs_taints_known_nan_result(i1 %co
 ; CHECK-LABEL: define nofpclass(snan) <4 x half> 
@ret_nonnan_lhs_taints_known_nan_result(
 ; CHECK-SAME: i1 [[COND:%.*]], <4 x half> [[UNKNOWN:%.*]]) {
 ; CHECK-NEXT:    [[NAN:%.*]] = call <4 x half> @returns_nan()
-; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[UNKNOWN]], <4 x 
half> <half poison, half 0xH7E00, half poison, half poison>, <4 x i32> <i32 5, 
i32 0, i32 1, i32 3>
+; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x half> [[UNKNOWN]], <4 x 
half> [[NAN]], <4 x i32> <i32 5, i32 0, i32 1, i32 3>
 ; CHECK-NEXT:    [[EXP:%.*]] = call <4 x half> @llvm.exp.v4f16(<4 x half> 
[[SHUFFLE]])
 ; CHECK-NEXT:    ret <4 x half> [[EXP]]
 ;
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
index b0bae1e2ee835..545a5f895ab6f 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
@@ -353,90 +353,6 @@ define nofpclass(inf) float 
@ret_nofpclass_inf__select_chain_inf_nan_1(i1 %cond,
   ret float %select1
 }
 
-define nofpclass(inf norm sub zero) float @ret_only_nan__fabs(float %unknown) {
-; CHECK-LABEL: define nofpclass(inf zero sub norm) float @ret_only_nan__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[UNKNOWN]])
-; CHECK-NEXT:    ret float [[FABS]]
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(snan inf norm sub zero) float @ret_only_qnan__fabs(float 
%unknown) {
-; CHECK-LABEL: define nofpclass(snan inf zero sub norm) float 
@ret_only_qnan__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[UNKNOWN]])
-; CHECK-NEXT:    ret float [[FABS]]
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(qnan inf norm sub zero) float @ret_only_snan__fabs(float 
%unknown) {
-; CHECK-LABEL: define nofpclass(qnan inf zero sub norm) float 
@ret_only_snan__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[UNKNOWN]])
-; CHECK-NEXT:    ret float [[FABS]]
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(nan norm sub zero) float @ret_only_inf__fabs(float %unknown) {
-; CHECK-LABEL: define nofpclass(nan zero sub norm) float @ret_only_inf__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret float 0x7FF0000000000000
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(nan ninf norm sub zero) float @ret_only_pinf__fabs(float 
%unknown) {
-; CHECK-LABEL: define nofpclass(nan ninf zero sub norm) float 
@ret_only_pinf__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret float 0x7FF0000000000000
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(nan pinf norm sub zero) float @ret_only_ninf__fabs(float 
%unknown) {
-; CHECK-LABEL: define nofpclass(nan pinf zero sub norm) float 
@ret_only_ninf__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret float poison
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(nan inf norm sub) float @ret_only_zero__fabs(float %unknown) {
-; CHECK-LABEL: define nofpclass(nan inf sub norm) float @ret_only_zero__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret float 0.000000e+00
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(nan inf norm sub pzero) float @ret_only_nzero__fabs(float 
%unknown) {
-; CHECK-LABEL: define nofpclass(nan inf pzero sub norm) float 
@ret_only_nzero__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret float poison
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
-define nofpclass(nan inf norm sub nzero) float @ret_only_pzero__fabs(float 
%unknown) {
-; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float 
@ret_only_pzero__fabs
-; CHECK-SAME: (float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    ret float 0.000000e+00
-;
-  %fabs = call float @llvm.fabs.f32(float %unknown)
-  ret float %fabs
-}
-
 ; Simplify to fabs %x
 define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_ninf_rhs(i1 %cond, 
float %x) {
 ; CHECK-LABEL: define nofpclass(inf) float 
@ret_nofpclass_inf__fabs_select_ninf_rhs

_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to