[clang] [CIR] Upstream support for switch statements case kinds (PR #138003)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Thu May 1 11:10:28 PDT 2025


================
@@ -428,6 +429,52 @@ mlir::LogicalResult CIRGenFunction::emitBreakStmt(const clang::BreakStmt &s) {
   return mlir::success();
 }
 
+const CaseStmt *CIRGenFunction::foldCaseStmt(const clang::CaseStmt &s,
+                                             mlir::Type condType,
+                                             mlir::ArrayAttr &value,
+                                             cir::CaseOpKind &kind) {
+  const CaseStmt *caseStmt = &s;
+  const CaseStmt *lastCase = &s;
+  SmallVector<mlir::Attribute, 4> caseEltValueListAttr;
+
+  // Fold cascading cases whenever possible to simplify codegen a bit.
+  while (caseStmt) {
+    lastCase = caseStmt;
+
+    auto intVal = caseStmt->getLHS()->EvaluateKnownConstInt(getContext());
+
+    if (auto *rhs = caseStmt->getRHS()) {
----------------
andykaylor wrote:

```suggestion
    // If the case statement has an RHS value, it is representing a GNU
    // case range statement, where LHS is the beginning of the range
    // and RHS is the end of the range.
    if (const Expr *rhs = caseStmt->getRHS()) {
```

https://github.com/llvm/llvm-project/pull/138003


More information about the cfe-commits mailing list