[llvm] [GlobalISel] use constexpr LLT types when creating ISel data (PR #191574)

Stanley Gambarin via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 08:57:21 PDT 2026


https://github.com/stanleygambarin updated https://github.com/llvm/llvm-project/pull/191574

>From 92cb18b3ead14a9fad748f7431bdc7598ad04e42 Mon Sep 17 00:00:00 2001
From: "Gambarin, Stanley" <stanley.gambarin at intel.com>
Date: Fri, 10 Apr 2026 11:17:32 -0700
Subject: [PATCH] [GlobalISel] use constexpr LLT types when creating ISel data

The GlobalISel uses a lookup table to map LLTs which is constructed
prior to initialization of extended LLT functionality, resulting in
ANY_SCALAR entries. During instruction selection, a hash-based
lookup is done on actual INTEGER/FLOAT LLTs. But hash values of
ANY_SCALAR do not match those of INTEGER/FLOAT, causing a failure.

Workaround is the use constexpr LLT, which encodes INTEGER/FLOAT LLT.

Assisted-by: Claude Opus 4.6
---
 .../GlobalISelEmitter/GlobalISelEmitter.td    |  4 +-
 .../GlobalISel/GlobalISelMatchTable.cpp       | 57 ++++++++++---------
 2 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td b/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td
index b4cdd53d78124..d69f7af096c31 100644
--- a/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td
+++ b/llvm/test/TableGen/GlobalISelEmitter/GlobalISelEmitter.td
@@ -117,8 +117,8 @@ def HasC : Predicate<"Subtarget->hasC()"> { let RecomputePerFunction = 1; }
 // EXTENDED-NEXT:  };
 // EXTENDED-NEXT:  const static size_t NumTypeObjects = 3;
 // EXTENDED-NEXT:  const static LLT TypeObjects[] = {
-// EXTENDED-NEXT:    LLT::integer(32),
-// EXTENDED-NEXT:    LLT::floatIEEE(32),
+// EXTENDED-NEXT:    LLT(LLT::Kind::INTEGER, ElementCount::getFixed(0), 32),
+// EXTENDED-NEXT:    LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 32, LLT::FpSemantics::S_IEEEsingle),
 // EXTENDED-NEXT:    LLT::pointer(0, 32),
 // EXTENDED-NEXT:  };
 
diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
index 1968097f91983..9d692c2b63a1d 100644
--- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
+++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
@@ -409,19 +409,37 @@ void LLTCodeGen::emitCxxEnumValue(raw_ostream &OS) const {
 }
 
 void LLTCodeGen::emitCxxConstructorCall(raw_ostream &OS) const {
-  if (Ty.isScalar()) {
-    if (Ty.isInteger())
-      OS << "LLT::integer(" << Ty.getScalarSizeInBits() << ")";
-    else if (Ty.isBFloat16())
-      OS << "LLT::bfloat16()";
-    else if (Ty.isPPCF128())
-      OS << "LLT::ppcf128()";
-    else if (Ty.isX86FP80())
-      OS << "LLT::x86fp80()";
-    else if (Ty.isFloat())
-      OS << "LLT::floatIEEE(" << Ty.getScalarSizeInBits() << ")";
+  auto EmitScalarType = [&OS](LLT T) {
+    if (T.isInteger())
+      OS << "LLT(LLT::Kind::INTEGER, ElementCount::getFixed(0), "
+         << T.getScalarSizeInBits() << ")";
+    else if (T.isBFloat16())
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 16, "
+            "LLT::FpSemantics::S_BFloat)";
+    else if (T.isPPCF128())
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 128, "
+            "LLT::FpSemantics::S_PPCDoubleDouble)";
+    else if (T.isX86FP80())
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 80, "
+            "LLT::FpSemantics::S_x87DoubleExtended)";
+    else if (T.isFloat(16))
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 16, "
+            "LLT::FpSemantics::S_IEEEhalf)";
+    else if (T.isFloat(32))
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 32, "
+            "LLT::FpSemantics::S_IEEEsingle)";
+    else if (T.isFloat(64))
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 64, "
+            "LLT::FpSemantics::S_IEEEdouble)";
+    else if (T.isFloat(128))
+      OS << "LLT(LLT::Kind::FLOAT, ElementCount::getFixed(0), 128, "
+            "LLT::FpSemantics::S_IEEEquad)";
     else
-      OS << "LLT::scalar(" << Ty.getScalarSizeInBits() << ")";
+      OS << "LLT::scalar(" << T.getScalarSizeInBits() << ")";
+  };
+
+  if (Ty.isScalar()) {
+    EmitScalarType(Ty);
     return;
   }
 
@@ -430,20 +448,7 @@ void LLTCodeGen::emitCxxConstructorCall(raw_ostream &OS) const {
        << (Ty.isScalable() ? "ElementCount::getScalable("
                            : "ElementCount::getFixed(")
        << Ty.getElementCount().getKnownMinValue() << "), ";
-
-    LLT ElemTy = Ty.getElementType();
-    if (ElemTy.isInteger())
-      OS << "LLT::integer(" << ElemTy.getScalarSizeInBits() << ")";
-    else if (ElemTy.isBFloat16())
-      OS << "LLT::bfloat16()";
-    else if (ElemTy.isPPCF128())
-      OS << "LLT::ppcf128()";
-    else if (ElemTy.isX86FP80())
-      OS << "LLT::x86fp80()";
-    else if (ElemTy.isFloat())
-      OS << "LLT::floatIEEE(" << ElemTy.getScalarSizeInBits() << ")";
-    else
-      OS << "LLT::scalar(" << Ty.getScalarSizeInBits() << ")";
+    EmitScalarType(Ty.getElementType());
     OS << ")";
     return;
   }



More information about the llvm-commits mailing list