[llvm] [GlobalISel] Support GISelValueTracking for G_FREEZE. (PR #223696)

Vikash Gupta via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 23:16:57 PDT 2026


https://github.com/vg0204 updated https://github.com/llvm/llvm-project/pull/223696

>From a40ac86cf346ae0f4329ca30010f1131ed98bcb1 Mon Sep 17 00:00:00 2001
From: vg0204 <Vikash.Gupta at amd.com>
Date: Tue, 15 Sep 2026 18:47:16 +0530
Subject: [PATCH 1/2] [GlobalISel] Support GISelValueTracking for G_FREEZE

Port the SDAG FREEZE handling to GlobalISel. Look through G_FREEZE in
computeKnownBits, computeNumSignBits, and computeKnownFPClass when the
source is guaranteed not undef or poison.

Part of #150515.
---
 .../CodeGen/GlobalISel/GISelValueTracking.cpp | 25 ++++++++
 .../AArch64/GlobalISel/knownbits-freeze.mir   | 51 +++++++++++++++++
 .../CodeGen/GlobalISel/KnownBitsTest.cpp      | 49 ++++++++++++++++
 .../CodeGen/GlobalISel/KnownFPClassTest.cpp   | 57 +++++++++++++++++++
 4 files changed, 182 insertions(+)
 create mode 100644 llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir

diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index e608b1ff6bb679..5b93872db2706b 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -326,6 +326,16 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
     Known = Known.trunc(BitWidth);
     break;
   }
+  case TargetOpcode::G_FREEZE: {
+    Register Src = MI.getOperand(1).getReg();
+    // freeze of undef/poison is an arbitrary noundef bit pattern, so known
+    // bits of the source are only valid when that source cannot be undef or
+    // poison.
+    if (Src.isVirtual() && MRI.getType(Src).isValid() &&
+        isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
+      computeKnownBitsImpl(Src, Known, DemandedElts, Depth + 1);
+    break;
+  }
   case TargetOpcode::COPY:
   case TargetOpcode::G_PHI:
   case TargetOpcode::PHI: {
@@ -2203,6 +2213,14 @@ void GISelValueTracking::computeKnownFPClass(Register R,
     }
     break;
   }
+  case TargetOpcode::G_FREEZE: {
+    Register Src = MI.getOperand(1).getReg();
+    if (Src.isVirtual() && MRI.getType(Src).isValid() &&
+        isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
+      computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known,
+                          Depth + 1);
+    break;
+  }
   case TargetOpcode::COPY: {
     Register Src = MI.getOperand(1).getReg();
 
@@ -2422,6 +2440,13 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
 
     return 1;
   }
+  case TargetOpcode::G_FREEZE: {
+    Register Src = MI.getOperand(1).getReg();
+    if (Src.isVirtual() && MRI.getType(Src).isValid() &&
+        isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
+      return computeNumSignBits(Src, DemandedElts, Depth + 1);
+    break;
+  }
   case TargetOpcode::G_SEXT: {
     Register Src = MI.getOperand(1).getReg();
     LLT SrcTy = MRI.getType(Src);
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir
new file mode 100644
index 00000000000000..4d381bad287920
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir
@@ -0,0 +1,51 @@
+# NOTE: Assertions have been autogenerated by utils/update_givaluetracking_test_checks.py UTC_ARGS: --version 5
+# RUN: llc -mtriple=aarch64 -passes="print<gisel-value-tracking>" -filetype=null %s 2>&1 | FileCheck %s
+
+---
+name:            FreezeAnd
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @FreezeAnd
+  ; CHECK-NEXT: %0:_ KnownBits:00000000000000001111111111111111 SignBits:16 IsKnownNeverZero:1
+  ; CHECK-NEXT: %1:_ KnownBits:00000000000000000000111111110000 SignBits:20 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:00000000000000000000111111110000 SignBits:20 IsKnownNeverZero:1
+  ; CHECK-NEXT: %3:_ KnownBits:00000000000000000000111111110000 SignBits:20 IsKnownNeverZero:1
+    %0:_(i32) = G_CONSTANT i32 65535
+    %1:_(i32) = G_CONSTANT i32 4080
+    %2:_(i32) = G_AND %0, %1
+    %3:_(i32) = G_FREEZE %2
+...
+---
+name:            FreezeNeg1
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @FreezeNeg1
+  ; CHECK-NEXT: %0:_ KnownBits:11111111 SignBits:8 IsKnownNeverZero:1
+  ; CHECK-NEXT: %1:_ KnownBits:11111111 SignBits:8 IsKnownNeverZero:1
+    %0:_(i8) = G_CONSTANT i8 -1
+    %1:_(i8) = G_FREEZE %0
+...
+---
+name:            FreezeUndef
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @FreezeUndef
+  ; CHECK-NEXT: %0:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %1:_ KnownBits:???????? SignBits:1 IsKnownNeverZero:0
+    %0:_(i8) = G_IMPLICIT_DEF
+    %1:_(i8) = G_FREEZE %0
+...
+---
+name:            FreezeAndUndef
+body:             |
+  bb.1:
+  ; CHECK-LABEL: name: @FreezeAndUndef
+  ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %1:_ KnownBits:00000000000000000000111111110000 SignBits:20 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:00000000000000000000????????0000 SignBits:20 IsKnownNeverZero:0
+  ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 IsKnownNeverZero:0
+    %0:_(i32) = G_IMPLICIT_DEF
+    %1:_(i32) = G_CONSTANT i32 4080
+    %2:_(i32) = G_AND %0, %1
+    %3:_(i32) = G_FREEZE %2
+...
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
index 18aca17fe7e599..69a4d9637fcb80 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
@@ -246,6 +246,55 @@ TEST_F(AArch64GISelMITest, TestKnownBitsAND) {
   EXPECT_EQ(0xC7u, Res.Zero.getZExtValue());
 }
 
+TEST_F(AArch64GISelMITest, TestKnownBitsFreeze) {
+  StringRef MIRString = R"(
+   %allones:_(s32) = G_CONSTANT i32 65535
+   %mask:_(s32) = G_CONSTANT i32 4080
+   %and:_(s32) = G_AND %allones, %mask
+   %fr_and:_(s32) = G_FREEZE %and
+   %copy_and:_(s32) = COPY %fr_and
+   %undef:_(s32) = G_IMPLICIT_DEF
+   %and_undef:_(s32) = G_AND %undef, %mask
+   %fr_undef:_(s32) = G_FREEZE %and_undef
+   %copy_undef:_(s32) = COPY %fr_undef
+)";
+  setUp(MIRString);
+  if (!TM)
+    GTEST_SKIP();
+
+  Register CopyAnd = Copies[Copies.size() - 2];
+  Register CopyUndef = Copies[Copies.size() - 1];
+  GISelValueTracking Info(*MF);
+
+  MachineInstr *FinalCopyAnd = MRI->getVRegDef(CopyAnd);
+  KnownBits AndBits = Info.getKnownBits(FinalCopyAnd->getOperand(1).getReg());
+  EXPECT_EQ(0xFF0u, AndBits.One.getZExtValue());
+  EXPECT_EQ(0xFFFFF00Fu, AndBits.Zero.getZExtValue());
+
+  MachineInstr *FinalCopyUndef = MRI->getVRegDef(CopyUndef);
+  KnownBits UndefBits =
+      Info.getKnownBits(FinalCopyUndef->getOperand(1).getReg());
+  EXPECT_TRUE(UndefBits.One.isZero());
+  EXPECT_TRUE(UndefBits.Zero.isZero());
+}
+
+TEST_F(AArch64GISelMITest, TestNumSignBitsFreeze) {
+  StringRef MIRString = "  %3:_(s8) = G_CONSTANT i8 -1\n"
+                        "  %4:_(s8) = G_FREEZE %3\n"
+                        "  %5:_(s8) = COPY %4\n"
+                        "  %6:_(s8) = G_IMPLICIT_DEF\n"
+                        "  %7:_(s8) = G_FREEZE %6\n"
+                        "  %8:_(s8) = COPY %7\n";
+  setUp(MIRString);
+  if (!TM)
+    GTEST_SKIP();
+  Register CopyFr = Copies[Copies.size() - 2];
+  Register CopyUndef = Copies[Copies.size() - 1];
+  GISelValueTracking Info(*MF);
+  EXPECT_EQ(8u, Info.computeNumSignBits(CopyFr));
+  EXPECT_EQ(1u, Info.computeNumSignBits(CopyUndef));
+}
+
 TEST_F(AArch64GISelMITest, TestKnownBitsOR) {
   StringRef MIRString = R"(
    %ptr:_(p0) = G_IMPLICIT_DEF
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index f5ac377f4f585a..427d32e73ead1f 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -31,6 +31,63 @@ TEST_F(AArch64GISelMITest, TestFPClassCstPosZero) {
   EXPECT_EQ(false, Known.getSignBit());
 }
 
+TEST_F(AArch64GISelMITest, TestFPClassFreeze) {
+  StringRef MIRString = R"(
+    %pos0:_(s32) = G_FCONSTANT float 0.0
+    %fr_pos0:_(s32) = G_FREEZE %pos0
+    %copy_pos0:_(s32) = COPY %fr_pos0
+    %neg0:_(s32) = G_FCONSTANT float -0.0
+    %fr_neg0:_(s32) = G_FREEZE %neg0
+    %copy_neg0:_(s32) = COPY %fr_neg0
+    %pinf:_(s32) = G_FCONSTANT float f0x7F800000
+    %fr_pinf:_(s32) = G_FREEZE %pinf
+    %copy_pinf:_(s32) = COPY %fr_pinf
+    %fneg:_(s32) = G_FNEG %pos0
+    %fr_fneg:_(s32) = G_FREEZE %fneg
+    %copy_fneg:_(s32) = COPY %fr_fneg
+    %undef:_(s32) = G_IMPLICIT_DEF
+    %fr_undef:_(s32) = G_FREEZE %undef
+    %copy_undef:_(s32) = COPY %fr_undef
+    %fabs_undef:_(s32) = G_FABS %undef
+    %fr_fabs:_(s32) = G_FREEZE %fabs_undef
+    %copy_fabs:_(s32) = COPY %fr_fabs
+)";
+  setUp(MIRString);
+  if (!TM)
+    GTEST_SKIP();
+
+  GISelValueTracking Info(*MF);
+  auto classOf = [&](unsigned FromEnd) {
+    Register CopyReg = Copies[Copies.size() - FromEnd];
+    return Info.computeKnownFPClass(
+        MRI->getVRegDef(CopyReg)->getOperand(1).getReg());
+  };
+
+  KnownFPClass Pos0 = classOf(6);
+  EXPECT_EQ(fcPosZero, Pos0.getKnownFPClasses());
+  EXPECT_EQ(false, Pos0.getSignBit());
+
+  KnownFPClass Neg0 = classOf(5);
+  EXPECT_EQ(fcNegZero, Neg0.getKnownFPClasses());
+  EXPECT_EQ(true, Neg0.getSignBit());
+
+  KnownFPClass PInf = classOf(4);
+  EXPECT_EQ(fcPosInf, PInf.getKnownFPClasses());
+  EXPECT_EQ(false, PInf.getSignBit());
+
+  KnownFPClass FNeg = classOf(3);
+  EXPECT_EQ(fcNegZero, FNeg.getKnownFPClasses());
+  EXPECT_EQ(true, FNeg.getSignBit());
+
+  KnownFPClass Undef = classOf(2);
+  EXPECT_EQ(fcAllFlags, Undef.getKnownFPClasses());
+  EXPECT_EQ(std::nullopt, Undef.getSignBit());
+
+  KnownFPClass FAbsUndef = classOf(1);
+  EXPECT_EQ(fcAllFlags, FAbsUndef.getKnownFPClasses());
+  EXPECT_EQ(std::nullopt, FAbsUndef.getSignBit());
+}
+
 TEST_F(AArch64GISelMITest, TestFPClassCstNegZero) {
   StringRef MIRString = "  %3:_(s32) = G_FCONSTANT float -0.0\n"
                         "  %4:_(s32) = COPY %3\n";

>From e5acaff33068ae9d0e2526213190a65946676df7 Mon Sep 17 00:00:00 2001
From: vg0204 <Vikash.Gupta at amd.com>
Date: Wed, 16 Sep 2026 11:46:33 +0530
Subject: [PATCH 2/2] Addressed the reviewed comments.

---
 .../CodeGen/GlobalISel/GISelValueTracking.cpp | 14 ++----
 .../AArch64/GlobalISel/knownbits-freeze.mir   | 26 ++++++++++
 .../CodeGen/GlobalISel/KnownBitsTest.cpp      | 49 -------------------
 .../CodeGen/GlobalISel/KnownFPClassTest.cpp   | 34 ++-----------
 4 files changed, 35 insertions(+), 88 deletions(-)

diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index 5b93872db2706b..18519d19548fdf 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -328,11 +328,9 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known,
   }
   case TargetOpcode::G_FREEZE: {
     Register Src = MI.getOperand(1).getReg();
-    // freeze of undef/poison is an arbitrary noundef bit pattern, so known
-    // bits of the source are only valid when that source cannot be undef or
-    // poison.
-    if (Src.isVirtual() && MRI.getType(Src).isValid() &&
-        isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
+    // freeze of undef/poison is an arbitrary noundef bit pattern, so the known
+    // bits of the source only carry over when it cannot be undef or poison.
+    if (isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
       computeKnownBitsImpl(Src, Known, DemandedElts, Depth + 1);
     break;
   }
@@ -2215,8 +2213,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
   }
   case TargetOpcode::G_FREEZE: {
     Register Src = MI.getOperand(1).getReg();
-    if (Src.isVirtual() && MRI.getType(Src).isValid() &&
-        isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
+    if (isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
       computeKnownFPClass(Src, DemandedElts, InterestedClasses, Known,
                           Depth + 1);
     break;
@@ -2442,8 +2439,7 @@ unsigned GISelValueTracking::computeNumSignBits(Register R,
   }
   case TargetOpcode::G_FREEZE: {
     Register Src = MI.getOperand(1).getReg();
-    if (Src.isVirtual() && MRI.getType(Src).isValid() &&
-        isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
+    if (isGuaranteedNotToBeUndefOrPoison(Src, MRI, Depth + 1))
       return computeNumSignBits(Src, DemandedElts, Depth + 1);
     break;
   }
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir
index 4d381bad287920..3756c282387eeb 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/knownbits-freeze.mir
@@ -16,6 +16,32 @@ body:             |
     %3:_(i32) = G_FREEZE %2
 ...
 ---
+name:            FreezeCopy
+body:             |
+  bb.1:
+    liveins: $w0
+  ; CHECK-LABEL: name: @FreezeCopy
+  ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %1:_ KnownBits:???????????????????????????????? SignBits:1 IsKnownNeverZero:0
+    %0:_(i32) = COPY $w0
+    %3:_(i32) = G_FREEZE %0
+...
+---
+name:            FreezeCopyAnd
+body:             |
+  bb.1:
+    liveins: $w0
+  ; CHECK-LABEL: name: @FreezeCopyAnd
+  ; CHECK-NEXT: %0:_ KnownBits:???????????????????????????????? SignBits:1 IsKnownNeverZero:0
+  ; CHECK-NEXT: %1:_ KnownBits:00000000000000000000111111110000 SignBits:20 IsKnownNeverZero:1
+  ; CHECK-NEXT: %2:_ KnownBits:00000000000000000000????????0000 SignBits:20 IsKnownNeverZero:0
+  ; CHECK-NEXT: %3:_ KnownBits:???????????????????????????????? SignBits:1 IsKnownNeverZero:0
+    %0:_(i32) = COPY $w0
+    %1:_(i32) = G_CONSTANT i32 4080
+    %2:_(i32) = G_AND %0, %1
+    %3:_(i32) = G_FREEZE %2
+...
+---
 name:            FreezeNeg1
 body:             |
   bb.1:
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
index 69a4d9637fcb80..18aca17fe7e599 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
@@ -246,55 +246,6 @@ TEST_F(AArch64GISelMITest, TestKnownBitsAND) {
   EXPECT_EQ(0xC7u, Res.Zero.getZExtValue());
 }
 
-TEST_F(AArch64GISelMITest, TestKnownBitsFreeze) {
-  StringRef MIRString = R"(
-   %allones:_(s32) = G_CONSTANT i32 65535
-   %mask:_(s32) = G_CONSTANT i32 4080
-   %and:_(s32) = G_AND %allones, %mask
-   %fr_and:_(s32) = G_FREEZE %and
-   %copy_and:_(s32) = COPY %fr_and
-   %undef:_(s32) = G_IMPLICIT_DEF
-   %and_undef:_(s32) = G_AND %undef, %mask
-   %fr_undef:_(s32) = G_FREEZE %and_undef
-   %copy_undef:_(s32) = COPY %fr_undef
-)";
-  setUp(MIRString);
-  if (!TM)
-    GTEST_SKIP();
-
-  Register CopyAnd = Copies[Copies.size() - 2];
-  Register CopyUndef = Copies[Copies.size() - 1];
-  GISelValueTracking Info(*MF);
-
-  MachineInstr *FinalCopyAnd = MRI->getVRegDef(CopyAnd);
-  KnownBits AndBits = Info.getKnownBits(FinalCopyAnd->getOperand(1).getReg());
-  EXPECT_EQ(0xFF0u, AndBits.One.getZExtValue());
-  EXPECT_EQ(0xFFFFF00Fu, AndBits.Zero.getZExtValue());
-
-  MachineInstr *FinalCopyUndef = MRI->getVRegDef(CopyUndef);
-  KnownBits UndefBits =
-      Info.getKnownBits(FinalCopyUndef->getOperand(1).getReg());
-  EXPECT_TRUE(UndefBits.One.isZero());
-  EXPECT_TRUE(UndefBits.Zero.isZero());
-}
-
-TEST_F(AArch64GISelMITest, TestNumSignBitsFreeze) {
-  StringRef MIRString = "  %3:_(s8) = G_CONSTANT i8 -1\n"
-                        "  %4:_(s8) = G_FREEZE %3\n"
-                        "  %5:_(s8) = COPY %4\n"
-                        "  %6:_(s8) = G_IMPLICIT_DEF\n"
-                        "  %7:_(s8) = G_FREEZE %6\n"
-                        "  %8:_(s8) = COPY %7\n";
-  setUp(MIRString);
-  if (!TM)
-    GTEST_SKIP();
-  Register CopyFr = Copies[Copies.size() - 2];
-  Register CopyUndef = Copies[Copies.size() - 1];
-  GISelValueTracking Info(*MF);
-  EXPECT_EQ(8u, Info.computeNumSignBits(CopyFr));
-  EXPECT_EQ(1u, Info.computeNumSignBits(CopyUndef));
-}
-
 TEST_F(AArch64GISelMITest, TestKnownBitsOR) {
   StringRef MIRString = R"(
    %ptr:_(p0) = G_IMPLICIT_DEF
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index 427d32e73ead1f..3cb3d7f872da4c 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -33,24 +33,12 @@ TEST_F(AArch64GISelMITest, TestFPClassCstPosZero) {
 
 TEST_F(AArch64GISelMITest, TestFPClassFreeze) {
   StringRef MIRString = R"(
-    %pos0:_(s32) = G_FCONSTANT float 0.0
-    %fr_pos0:_(s32) = G_FREEZE %pos0
-    %copy_pos0:_(s32) = COPY %fr_pos0
     %neg0:_(s32) = G_FCONSTANT float -0.0
     %fr_neg0:_(s32) = G_FREEZE %neg0
     %copy_neg0:_(s32) = COPY %fr_neg0
-    %pinf:_(s32) = G_FCONSTANT float f0x7F800000
-    %fr_pinf:_(s32) = G_FREEZE %pinf
-    %copy_pinf:_(s32) = COPY %fr_pinf
-    %fneg:_(s32) = G_FNEG %pos0
-    %fr_fneg:_(s32) = G_FREEZE %fneg
-    %copy_fneg:_(s32) = COPY %fr_fneg
     %undef:_(s32) = G_IMPLICIT_DEF
     %fr_undef:_(s32) = G_FREEZE %undef
     %copy_undef:_(s32) = COPY %fr_undef
-    %fabs_undef:_(s32) = G_FABS %undef
-    %fr_fabs:_(s32) = G_FREEZE %fabs_undef
-    %copy_fabs:_(s32) = COPY %fr_fabs
 )";
   setUp(MIRString);
   if (!TM)
@@ -63,29 +51,15 @@ TEST_F(AArch64GISelMITest, TestFPClassFreeze) {
         MRI->getVRegDef(CopyReg)->getOperand(1).getReg());
   };
 
-  KnownFPClass Pos0 = classOf(6);
-  EXPECT_EQ(fcPosZero, Pos0.getKnownFPClasses());
-  EXPECT_EQ(false, Pos0.getSignBit());
-
-  KnownFPClass Neg0 = classOf(5);
+  // freeze of a noundef value carries the source class and sign through.
+  KnownFPClass Neg0 = classOf(2);
   EXPECT_EQ(fcNegZero, Neg0.getKnownFPClasses());
   EXPECT_EQ(true, Neg0.getSignBit());
 
-  KnownFPClass PInf = classOf(4);
-  EXPECT_EQ(fcPosInf, PInf.getKnownFPClasses());
-  EXPECT_EQ(false, PInf.getSignBit());
-
-  KnownFPClass FNeg = classOf(3);
-  EXPECT_EQ(fcNegZero, FNeg.getKnownFPClasses());
-  EXPECT_EQ(true, FNeg.getSignBit());
-
-  KnownFPClass Undef = classOf(2);
+  // freeze of poison stays unknown.
+  KnownFPClass Undef = classOf(1);
   EXPECT_EQ(fcAllFlags, Undef.getKnownFPClasses());
   EXPECT_EQ(std::nullopt, Undef.getSignBit());
-
-  KnownFPClass FAbsUndef = classOf(1);
-  EXPECT_EQ(fcAllFlags, FAbsUndef.getKnownFPClasses());
-  EXPECT_EQ(std::nullopt, FAbsUndef.getSignBit());
 }
 
 TEST_F(AArch64GISelMITest, TestFPClassCstNegZero) {



More information about the llvm-commits mailing list