[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits

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

>From 6432eb2c4bab2e75c6ed539120f95836fe953287 Mon Sep 17 00:00:00 2001
From: Matt Arsenault 
Date: Thu, 15 Jan 2026 10:18:49 +0100
Subject: [PATCH 1/3] InstCombine: Implement SimplifyDemandedFPClass for frexp

---
 llvm/include/llvm/Support/KnownFPClass.h  |  4 ++
 llvm/lib/Analysis/ValueTracking.cpp   | 24 ++---
 llvm/lib/Support/KnownFPClass.cpp | 27 ++
 .../InstCombineSimplifyDemanded.cpp   | 49 +
 .../simplify-demanded-fpclass-frexp.ll| 54 ++-
 5 files changed, 99 insertions(+), 59 deletions(-)

diff --git a/llvm/include/llvm/Support/KnownFPClass.h 
b/llvm/include/llvm/Support/KnownFPClass.h
index 6c1a6a7e9b5c3..93ebf99564386 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -332,6 +332,10 @@ struct KnownFPClass {
bool IsTrunc,
bool IsMultiUnitFPType);
 
+  /// Propagate known class for mantissa component of frexp
+  static LLVM_ABI KnownFPClass frexp_mant(
+  const KnownFPClass &Src, DenormalMode Mode = DenormalMode::getDynamic());
+
   void resetAll() { *this = KnownFPClass(); }
 };
 
diff --git a/llvm/lib/Analysis/ValueTracking.cpp 
b/llvm/lib/Analysis/ValueTracking.cpp
index 171952120fc40..4ff3ca6bfbcf1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5926,27 +5926,9 @@ void computeKnownFPClass(const Value *V, const APInt 
&DemandedElts,
   const fltSemantics &FltSem =
   Op->getType()->getScalarType()->getFltSemantics();
 
-  if (KnownSrc.isKnownNever(fcNegative))
-Known.knownNot(fcNegative);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcNegZero);
-if (KnownSrc.isKnownNever(fcNegInf))
-  Known.knownNot(fcNegInf);
-  }
-
-  if (KnownSrc.isKnownNever(fcPositive))
-Known.knownNot(fcPositive);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcPosZero);
-if (KnownSrc.isKnownNever(fcPosInf))
-  Known.knownNot(fcPosInf);
-  }
-
-  Known.propagateNaN(KnownSrc);
+  DenormalMode Mode =
+  F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
+  Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
   return;
 }
 default:
diff --git a/llvm/lib/Support/KnownFPClass.cpp 
b/llvm/lib/Support/KnownFPClass.cpp
index ae8c4a9133897..ae7b7aa598da4 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -450,3 +450,30 @@ KnownFPClass KnownFPClass::roundToIntegral(const 
KnownFPClass &KnownSrc,
 
   return Known;
 }
+
+KnownFPClass KnownFPClass::frexp_mant(const KnownFPClass &KnownSrc,
+  DenormalMode Mode) {
+  KnownFPClass Known;
+  Known.knownNot(fcSubnormal);
+
+  if (KnownSrc.isKnownNever(fcNegative))
+Known.knownNot(fcNegative);
+  else {
+if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
+  Known.knownNot(fcNegZero);
+if (KnownSrc.isKnownNever(fcNegInf))
+  Known.knownNot(fcNegInf);
+  }
+
+  if (KnownSrc.isKnownNever(fcPositive))
+Known.knownNot(fcPositive);
+  else {
+if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
+  Known.knownNot(fcPosZero);
+if (KnownSrc.isKnownNever(fcPosInf))
+  Known.knownNot(fcPosInf);
+  }
+
+  Known.propagateNaN(KnownSrc);
+  return Known;
+}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 78d7be41fae67..93bb72f6fde2b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDema

[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits

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

>From 6432eb2c4bab2e75c6ed539120f95836fe953287 Mon Sep 17 00:00:00 2001
From: Matt Arsenault 
Date: Thu, 15 Jan 2026 10:18:49 +0100
Subject: [PATCH 1/3] InstCombine: Implement SimplifyDemandedFPClass for frexp

---
 llvm/include/llvm/Support/KnownFPClass.h  |  4 ++
 llvm/lib/Analysis/ValueTracking.cpp   | 24 ++---
 llvm/lib/Support/KnownFPClass.cpp | 27 ++
 .../InstCombineSimplifyDemanded.cpp   | 49 +
 .../simplify-demanded-fpclass-frexp.ll| 54 ++-
 5 files changed, 99 insertions(+), 59 deletions(-)

diff --git a/llvm/include/llvm/Support/KnownFPClass.h 
b/llvm/include/llvm/Support/KnownFPClass.h
index 6c1a6a7e9b5c3..93ebf99564386 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -332,6 +332,10 @@ struct KnownFPClass {
bool IsTrunc,
bool IsMultiUnitFPType);
 
+  /// Propagate known class for mantissa component of frexp
+  static LLVM_ABI KnownFPClass frexp_mant(
+  const KnownFPClass &Src, DenormalMode Mode = DenormalMode::getDynamic());
+
   void resetAll() { *this = KnownFPClass(); }
 };
 
diff --git a/llvm/lib/Analysis/ValueTracking.cpp 
b/llvm/lib/Analysis/ValueTracking.cpp
index 171952120fc40..4ff3ca6bfbcf1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5926,27 +5926,9 @@ void computeKnownFPClass(const Value *V, const APInt 
&DemandedElts,
   const fltSemantics &FltSem =
   Op->getType()->getScalarType()->getFltSemantics();
 
-  if (KnownSrc.isKnownNever(fcNegative))
-Known.knownNot(fcNegative);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcNegZero);
-if (KnownSrc.isKnownNever(fcNegInf))
-  Known.knownNot(fcNegInf);
-  }
-
-  if (KnownSrc.isKnownNever(fcPositive))
-Known.knownNot(fcPositive);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcPosZero);
-if (KnownSrc.isKnownNever(fcPosInf))
-  Known.knownNot(fcPosInf);
-  }
-
-  Known.propagateNaN(KnownSrc);
+  DenormalMode Mode =
+  F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
+  Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
   return;
 }
 default:
diff --git a/llvm/lib/Support/KnownFPClass.cpp 
b/llvm/lib/Support/KnownFPClass.cpp
index ae8c4a9133897..ae7b7aa598da4 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -450,3 +450,30 @@ KnownFPClass KnownFPClass::roundToIntegral(const 
KnownFPClass &KnownSrc,
 
   return Known;
 }
+
+KnownFPClass KnownFPClass::frexp_mant(const KnownFPClass &KnownSrc,
+  DenormalMode Mode) {
+  KnownFPClass Known;
+  Known.knownNot(fcSubnormal);
+
+  if (KnownSrc.isKnownNever(fcNegative))
+Known.knownNot(fcNegative);
+  else {
+if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
+  Known.knownNot(fcNegZero);
+if (KnownSrc.isKnownNever(fcNegInf))
+  Known.knownNot(fcNegInf);
+  }
+
+  if (KnownSrc.isKnownNever(fcPositive))
+Known.knownNot(fcPositive);
+  else {
+if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
+  Known.knownNot(fcPosZero);
+if (KnownSrc.isKnownNever(fcPosInf))
+  Known.knownNot(fcPosInf);
+  }
+
+  Known.propagateNaN(KnownSrc);
+  return Known;
+}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 78d7be41fae67..93bb72f6fde2b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDema

[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits

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

>From 9fc86544efff9d888632a0a27b7ec106fa69c21f Mon Sep 17 00:00:00 2001
From: Matt Arsenault 
Date: Thu, 15 Jan 2026 10:18:49 +0100
Subject: [PATCH 1/2] InstCombine: Implement SimplifyDemandedFPClass for frexp

---
 llvm/include/llvm/Support/KnownFPClass.h  |  4 ++
 llvm/lib/Analysis/ValueTracking.cpp   | 24 ++---
 llvm/lib/Support/KnownFPClass.cpp | 27 ++
 .../InstCombineSimplifyDemanded.cpp   | 49 +
 .../simplify-demanded-fpclass-frexp.ll| 54 ++-
 5 files changed, 99 insertions(+), 59 deletions(-)

diff --git a/llvm/include/llvm/Support/KnownFPClass.h 
b/llvm/include/llvm/Support/KnownFPClass.h
index 6c1a6a7e9b5c3..93ebf99564386 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -332,6 +332,10 @@ struct KnownFPClass {
bool IsTrunc,
bool IsMultiUnitFPType);
 
+  /// Propagate known class for mantissa component of frexp
+  static LLVM_ABI KnownFPClass frexp_mant(
+  const KnownFPClass &Src, DenormalMode Mode = DenormalMode::getDynamic());
+
   void resetAll() { *this = KnownFPClass(); }
 };
 
diff --git a/llvm/lib/Analysis/ValueTracking.cpp 
b/llvm/lib/Analysis/ValueTracking.cpp
index 171952120fc40..4ff3ca6bfbcf1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5926,27 +5926,9 @@ void computeKnownFPClass(const Value *V, const APInt 
&DemandedElts,
   const fltSemantics &FltSem =
   Op->getType()->getScalarType()->getFltSemantics();
 
-  if (KnownSrc.isKnownNever(fcNegative))
-Known.knownNot(fcNegative);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcNegZero);
-if (KnownSrc.isKnownNever(fcNegInf))
-  Known.knownNot(fcNegInf);
-  }
-
-  if (KnownSrc.isKnownNever(fcPositive))
-Known.knownNot(fcPositive);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcPosZero);
-if (KnownSrc.isKnownNever(fcPosInf))
-  Known.knownNot(fcPosInf);
-  }
-
-  Known.propagateNaN(KnownSrc);
+  DenormalMode Mode =
+  F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
+  Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
   return;
 }
 default:
diff --git a/llvm/lib/Support/KnownFPClass.cpp 
b/llvm/lib/Support/KnownFPClass.cpp
index ae8c4a9133897..ae7b7aa598da4 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -450,3 +450,30 @@ KnownFPClass KnownFPClass::roundToIntegral(const 
KnownFPClass &KnownSrc,
 
   return Known;
 }
+
+KnownFPClass KnownFPClass::frexp_mant(const KnownFPClass &KnownSrc,
+  DenormalMode Mode) {
+  KnownFPClass Known;
+  Known.knownNot(fcSubnormal);
+
+  if (KnownSrc.isKnownNever(fcNegative))
+Known.knownNot(fcNegative);
+  else {
+if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
+  Known.knownNot(fcNegZero);
+if (KnownSrc.isKnownNever(fcNegInf))
+  Known.knownNot(fcNegInf);
+  }
+
+  if (KnownSrc.isKnownNever(fcPositive))
+Known.knownNot(fcPositive);
+  else {
+if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
+  Known.knownNot(fcPosZero);
+if (KnownSrc.isKnownNever(fcPosInf))
+  Known.knownNot(fcPosInf);
+  }
+
+  Known.propagateNaN(KnownSrc);
+  return Known;
+}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 86c229c667eea..f958d9fb9569e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDema

[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits

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

>From 9fc86544efff9d888632a0a27b7ec106fa69c21f Mon Sep 17 00:00:00 2001
From: Matt Arsenault 
Date: Thu, 15 Jan 2026 10:18:49 +0100
Subject: [PATCH 1/2] InstCombine: Implement SimplifyDemandedFPClass for frexp

---
 llvm/include/llvm/Support/KnownFPClass.h  |  4 ++
 llvm/lib/Analysis/ValueTracking.cpp   | 24 ++---
 llvm/lib/Support/KnownFPClass.cpp | 27 ++
 .../InstCombineSimplifyDemanded.cpp   | 49 +
 .../simplify-demanded-fpclass-frexp.ll| 54 ++-
 5 files changed, 99 insertions(+), 59 deletions(-)

diff --git a/llvm/include/llvm/Support/KnownFPClass.h 
b/llvm/include/llvm/Support/KnownFPClass.h
index 6c1a6a7e9b5c3..93ebf99564386 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -332,6 +332,10 @@ struct KnownFPClass {
bool IsTrunc,
bool IsMultiUnitFPType);
 
+  /// Propagate known class for mantissa component of frexp
+  static LLVM_ABI KnownFPClass frexp_mant(
+  const KnownFPClass &Src, DenormalMode Mode = DenormalMode::getDynamic());
+
   void resetAll() { *this = KnownFPClass(); }
 };
 
diff --git a/llvm/lib/Analysis/ValueTracking.cpp 
b/llvm/lib/Analysis/ValueTracking.cpp
index 171952120fc40..4ff3ca6bfbcf1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5926,27 +5926,9 @@ void computeKnownFPClass(const Value *V, const APInt 
&DemandedElts,
   const fltSemantics &FltSem =
   Op->getType()->getScalarType()->getFltSemantics();
 
-  if (KnownSrc.isKnownNever(fcNegative))
-Known.knownNot(fcNegative);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcNegZero);
-if (KnownSrc.isKnownNever(fcNegInf))
-  Known.knownNot(fcNegInf);
-  }
-
-  if (KnownSrc.isKnownNever(fcPositive))
-Known.knownNot(fcPositive);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcPosZero);
-if (KnownSrc.isKnownNever(fcPosInf))
-  Known.knownNot(fcPosInf);
-  }
-
-  Known.propagateNaN(KnownSrc);
+  DenormalMode Mode =
+  F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
+  Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
   return;
 }
 default:
diff --git a/llvm/lib/Support/KnownFPClass.cpp 
b/llvm/lib/Support/KnownFPClass.cpp
index ae8c4a9133897..ae7b7aa598da4 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -450,3 +450,30 @@ KnownFPClass KnownFPClass::roundToIntegral(const 
KnownFPClass &KnownSrc,
 
   return Known;
 }
+
+KnownFPClass KnownFPClass::frexp_mant(const KnownFPClass &KnownSrc,
+  DenormalMode Mode) {
+  KnownFPClass Known;
+  Known.knownNot(fcSubnormal);
+
+  if (KnownSrc.isKnownNever(fcNegative))
+Known.knownNot(fcNegative);
+  else {
+if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
+  Known.knownNot(fcNegZero);
+if (KnownSrc.isKnownNever(fcNegInf))
+  Known.knownNot(fcNegInf);
+  }
+
+  if (KnownSrc.isKnownNever(fcPositive))
+Known.knownNot(fcPositive);
+  else {
+if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
+  Known.knownNot(fcPosZero);
+if (KnownSrc.isKnownNever(fcPosInf))
+  Known.knownNot(fcPosInf);
+  }
+
+  Known.propagateNaN(KnownSrc);
+  return Known;
+}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 86c229c667eea..f958d9fb9569e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDema

[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits


@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&

arsenm wrote:

Trying to use this feels awkward. The opcode switch already matched the 
extractvalue. I also want to bind the actual intrinsic call for the recursive 
call to SimplifyDemandedFPClass, not the source 

https://github.com/llvm/llvm-project/pull/176122
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Yingwei Zheng via llvm-branch-commits


@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDemandedMask |= fcPosInf;
+  if (DemandedMask & fcNegInf)
+SrcDemandedMask |= fcNegInf;
+
+  KnownFPClass KnownSrc;
+  if (SimplifyDemandedFPClass(II, 0, SrcDemandedMask, KnownSrc,

dtcxzyw wrote:

The latter one. Alive2: https://alive2.llvm.org/ce/z/y2ibWd
```
Transformation doesn't verify!

ERROR: Mismatch in memory

Example:
i1 %cond = #x0 (0)
half %unknown = #x7c21 (SNaN)
ptr %ptr = pointer(non-local, block_id=1, offset=0) / Address=#x08

Source:
half %select = #x7c00 (+oo)
{half, i16, i32} %frexp = { #x7c00 (+oo), poison, #x0003 (3) }
half %frexp.mant = #x7c00 (+oo)
half %frexp.mant2 = #x7c00 (+oo)

SOURCE MEMORY STATE
===
NON-LOCAL BLOCKS:
Block 0 >   size: 0 align: 2alloc type: 0   alive: false
address: #x00
Block 1 >   size: 5 align: 1alloc type: 0   alive: true 
address: #x08
Contents:
*: #x


Target:
{half, i16, i32} %frexp = { #x7c21 (SNaN), poison, #x0003 (3) }
half %frexp.mant = #x7c21 (SNaN)
half %frexp.mant2 = #x7c21 (SNaN)

TARGET MEMORY STATE
===
NON-LOCAL BLOCKS:
Block 0 >   size: 0 align: 2alloc type: 0   alive: false
address: #x00
Block 1 >   size: 5 align: 1alloc type: 0   alive: true 
address: #x08
Contents:
*: #x


Mismatch in pointer(non-local, block_id=1, offset=0)
Source value: #x7c00
Target value: #x7c21
```
The counterexample provided by Alive2 is not good enough (the return value of 
src is poison).


https://github.com/llvm/llvm-project/pull/176122
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits


@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDemandedMask |= fcPosInf;
+  if (DemandedMask & fcNegInf)
+SrcDemandedMask |= fcNegInf;
+
+  KnownFPClass KnownSrc;
+  if (SimplifyDemandedFPClass(II, 0, SrcDemandedMask, KnownSrc,

arsenm wrote:

You mean like 
https://github.com/llvm/llvm-project/blob/872574dd6e897c6dda29324f4f9cd67167ede07d/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll#L212,
 or with multiple uses of the extracted mant 

https://github.com/llvm/llvm-project/pull/176122
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-llvm-transforms

Author: Matt Arsenault (arsenm)


Changes



---
Full diff: https://github.com/llvm/llvm-project/pull/176122.diff


5 Files Affected:

- (modified) llvm/include/llvm/Support/KnownFPClass.h (+4) 
- (modified) llvm/lib/Analysis/ValueTracking.cpp (+3-21) 
- (modified) llvm/lib/Support/KnownFPClass.cpp (+27) 
- (modified) llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
(+49) 
- (modified) 
llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-frexp.ll (+16-38) 


``diff
diff --git a/llvm/include/llvm/Support/KnownFPClass.h 
b/llvm/include/llvm/Support/KnownFPClass.h
index e2b0d20c790a9..923e589589b68 100644
--- a/llvm/include/llvm/Support/KnownFPClass.h
+++ b/llvm/include/llvm/Support/KnownFPClass.h
@@ -326,6 +326,10 @@ struct KnownFPClass {
bool IsTrunc,
bool IsMultiUnitFPType);
 
+  /// Propagate known class for mantissa component of frexp
+  static LLVM_ABI KnownFPClass frexp_mant(
+  const KnownFPClass &Src, DenormalMode Mode = DenormalMode::getDynamic());
+
   void resetAll() { *this = KnownFPClass(); }
 };
 
diff --git a/llvm/lib/Analysis/ValueTracking.cpp 
b/llvm/lib/Analysis/ValueTracking.cpp
index 171952120fc40..4ff3ca6bfbcf1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -5926,27 +5926,9 @@ void computeKnownFPClass(const Value *V, const APInt 
&DemandedElts,
   const fltSemantics &FltSem =
   Op->getType()->getScalarType()->getFltSemantics();
 
-  if (KnownSrc.isKnownNever(fcNegative))
-Known.knownNot(fcNegative);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalNegZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcNegZero);
-if (KnownSrc.isKnownNever(fcNegInf))
-  Known.knownNot(fcNegInf);
-  }
-
-  if (KnownSrc.isKnownNever(fcPositive))
-Known.knownNot(fcPositive);
-  else {
-if (F &&
-
KnownSrc.isKnownNeverLogicalPosZero(F->getDenormalMode(FltSem)))
-  Known.knownNot(fcPosZero);
-if (KnownSrc.isKnownNever(fcPosInf))
-  Known.knownNot(fcPosInf);
-  }
-
-  Known.propagateNaN(KnownSrc);
+  DenormalMode Mode =
+  F ? F->getDenormalMode(FltSem) : DenormalMode::getDynamic();
+  Known = KnownFPClass::frexp_mant(KnownSrc, Mode);
   return;
 }
 default:
diff --git a/llvm/lib/Support/KnownFPClass.cpp 
b/llvm/lib/Support/KnownFPClass.cpp
index ae8c4a9133897..ae7b7aa598da4 100644
--- a/llvm/lib/Support/KnownFPClass.cpp
+++ b/llvm/lib/Support/KnownFPClass.cpp
@@ -450,3 +450,30 @@ KnownFPClass KnownFPClass::roundToIntegral(const 
KnownFPClass &KnownSrc,
 
   return Known;
 }
+
+KnownFPClass KnownFPClass::frexp_mant(const KnownFPClass &KnownSrc,
+  DenormalMode Mode) {
+  KnownFPClass Known;
+  Known.knownNot(fcSubnormal);
+
+  if (KnownSrc.isKnownNever(fcNegative))
+Known.knownNot(fcNegative);
+  else {
+if (KnownSrc.isKnownNeverLogicalNegZero(Mode))
+  Known.knownNot(fcNegZero);
+if (KnownSrc.isKnownNever(fcNegInf))
+  Known.knownNot(fcNegInf);
+  }
+
+  if (KnownSrc.isKnownNever(fcPositive))
+Known.knownNot(fcPositive);
+  else {
+if (KnownSrc.isKnownNeverLogicalPosZero(Mode))
+  Known.knownNot(fcPosZero);
+if (KnownSrc.isKnownNever(fcPosInf))
+  Known.knownNot(fcPosInf);
+  }
+
+  Known.propagateNaN(KnownSrc);
+  return Known;
+}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 6c004f679cd08..1fc298dfc52a2 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2941,6 +2941,55 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
 Known = KnownLHS | KnownRHS;
 break;
   }
+  case Instruction::ExtractValue: {
+ExtractValueInst *Extract = cast(I);
+ArrayRef Indices = Extract->getIndices();
+Value *Src = Extract->getAggregateOperand();
+if (isa(Src->getType()) && Indices.size() == 1 &&
+Indices[0] == 0) {
+  if (auto *II = dyn_cast(Src)) {
+switch (II->getIntrinsicID()) {
+case Intrinsic::frexp: {
+  FPClassTest SrcDemandedMask = fcNone;
+  if (DemandedMask & fcNan)
+SrcDemandedMask |= fcNan;
+  if (DemandedMask & fcNegFinite)
+SrcDemandedMask |= fcNegFinite;
+  if (DemandedMask & fcPosFinite)
+SrcDemandedMask |= fcPosFinite;
+  if (DemandedMask & fcPosInf)
+SrcDemandedMask |= fcPosInf;
+  if (DemandedMask & fcNegInf)
+SrcDemandedMask |= fcNegInf;
+
+  

[llvm-branch-commits] [llvm] InstCombine: Implement SimplifyDemandedFPClass for frexp (PR #176122)

2026-01-15 Thread Matt Arsenault via llvm-branch-commits

https://github.com/arsenm ready_for_review 
https://github.com/llvm/llvm-project/pull/176122
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits