https://github.com/badumbatish updated 
https://github.com/llvm/llvm-project/pull/172236

>From 4c146ffb2f718fc070246e36cd0107948e673198 Mon Sep 17 00:00:00 2001
From: Jasmine Tang <[email protected]>
Date: Sun, 14 Dec 2025 15:28:39 -0800
Subject: [PATCH 1/2] [CIR] Add the ability to detect enum argument for switch
 op

---
 clang/include/clang/CIR/Dialect/IR/CIROps.td | 4 +++-
 clang/lib/CIR/CodeGen/CIRGenStmt.cpp         | 1 +
 clang/test/CIR/CodeGen/switch.cpp            | 4 ++--
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td 
b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 868b813458aae..3b6f35ae96497 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -1216,7 +1216,8 @@ def CIR_SwitchOp : CIR_Op<"switch", [
 
   let arguments = (ins 
     CIR_IntType:$condition,
-    UnitAttr:$allEnumCasesCovered
+    UnitAttr:$allEnumCasesCovered,
+    UnitAttr:$handling_enum
   );
 
   let regions = (region AnyRegion:$body);
@@ -1230,6 +1231,7 @@ def CIR_SwitchOp : CIR_Op<"switch", [
   let assemblyFormat = [{
     `(` $condition `:` qualified(type($condition)) `)` 
      (`allEnumCasesCovered` $allEnumCasesCovered^)?
+     (`handling_enum` $handling_enum^)?
     $body
     attr-dict
   }];
diff --git a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp 
b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
index c7a95b34a0d6b..4a84376e8afd2 100644
--- a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
@@ -1106,6 +1106,7 @@ mlir::LogicalResult CIRGenFunction::emitSwitchStmt(const 
clang::SwitchStmt &s) {
     terminateBody(builder, caseOp.getCaseRegion(), caseOp.getLoc());
   terminateBody(builder, swop.getBody(), swop.getLoc());
 
+  
swop.setHandlingEnum(s.getCond()->IgnoreParenImpCasts()->getType()->isEnumeralType());
   swop.setAllEnumCasesCovered(s.isAllEnumCasesCovered());
 
   return res;
diff --git a/clang/test/CIR/CodeGen/switch.cpp 
b/clang/test/CIR/CodeGen/switch.cpp
index b7bd2da5e39b8..8ca58e8ca1a5a 100644
--- a/clang/test/CIR/CodeGen/switch.cpp
+++ b/clang/test/CIR/CodeGen/switch.cpp
@@ -1282,7 +1282,7 @@ void testSwitchCoverAllCase(M m) {
     break;
   }
 }
-// CIR: cir.switch(%[[ARG:.*]] : !s32i) allEnumCasesCovered {
+// CIR: cir.switch(%[[ARG:.*]] : !s32i) allEnumCasesCovered handling_enum {
 
 void testSwitchNotCoverAllCase(M m) {
   switch (m) {
@@ -1291,4 +1291,4 @@ void testSwitchNotCoverAllCase(M m) {
     break;
   }
 }
-// CIR: cir.switch(%[[ARG:.*]] : !s32i) {
+// CIR: cir.switch(%[[ARG:.*]] : !s32i) handling_enum {

>From 799473bbeef2d250bf61674f6093cb1a814ef86a Mon Sep 17 00:00:00 2001
From: Jasmine Tang <[email protected]>
Date: Thu, 1 Jan 2026 17:03:29 -0800
Subject: [PATCH 2/2] Resolve PR comments

---
 clang/include/clang/CIR/Dialect/IR/CIROps.td | 4 ++--
 clang/lib/CIR/CodeGen/CIRGenStmt.cpp         | 8 +++++++-
 clang/test/CIR/CodeGen/switch.cpp            | 4 ++--
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td 
b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index e931c6066b037..631b721c28c59 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -1250,7 +1250,7 @@ def CIR_SwitchOp : CIR_Op<"switch", [
   let arguments = (ins 
     CIR_IntType:$condition,
     UnitAttr:$all_enum_cases_covered,
-    UnitAttr:$handling_enum
+    UnitAttr:$is_enum
   );
 
   let regions = (region AnyRegion:$body);
@@ -1264,7 +1264,7 @@ def CIR_SwitchOp : CIR_Op<"switch", [
   let assemblyFormat = [{
     `(` $condition `:` qualified(type($condition)) `)` 
      (`all_enum_cases_covered` $all_enum_cases_covered^)?
-     (`handling_enum` $handling_enum^)?
+     (`is_enum` $is_enum^)?
     $body
     attr-dict
   }];
diff --git a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp 
b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
index fbf60580ccd19..43acd6cb4856e 100644
--- a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
@@ -1212,9 +1212,15 @@ mlir::LogicalResult CIRGenFunction::emitSwitchStmt(const 
clang::SwitchStmt &s) {
     terminateBody(builder, caseOp.getCaseRegion(), caseOp.getLoc());
   terminateBody(builder, swop.getBody(), swop.getLoc());
 
-  
swop.setHandlingEnum(s.getCond()->IgnoreParenImpCasts()->getType()->isEnumeralType());
+  swop.setIsEnum(
+      s.getCond()->IgnoreParenImpCasts()->getType()->isEnumeralType());
   swop.setAllEnumCasesCovered(s.isAllEnumCasesCovered());
 
+  // If all enum cases are covered, this implies IsEnum
+  // otherwise it must be the case that enum cases are not covered.
+  assert((swop.getAllEnumCasesCovered() && swop.getIsEnum()) ||
+         !swop.getAllEnumCasesCovered());
+
   return res;
 }
 
diff --git a/clang/test/CIR/CodeGen/switch.cpp 
b/clang/test/CIR/CodeGen/switch.cpp
index 2eb15bc47c487..30e54912df6bb 100644
--- a/clang/test/CIR/CodeGen/switch.cpp
+++ b/clang/test/CIR/CodeGen/switch.cpp
@@ -1282,7 +1282,7 @@ void testSwitchCoverAllCase(M m) {
     break;
   }
 }
-// CIR: cir.switch(%[[ARG:.*]] : !s32i) all_enum_cases_covered handling_enum {
+// CIR: cir.switch(%[[ARG:.*]] : !s32i) all_enum_cases_covered is_enum {
 
 void testSwitchNotCoverAllCase(M m) {
   switch (m) {
@@ -1291,4 +1291,4 @@ void testSwitchNotCoverAllCase(M m) {
     break;
   }
 }
-// CIR: cir.switch(%[[ARG:.*]] : !s32i) handling_enum {
+// CIR: cir.switch(%[[ARG:.*]] : !s32i) is_enum {

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

Reply via email to