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
