================
@@ -802,6 +804,132 @@ Block 
*cir::BrCondOp::getSuccessorForOperands(ArrayRef<Attribute> operands) {
   return nullptr;
 }
 
+//===----------------------------------------------------------------------===//
+// CaseOp
+//===----------------------------------------------------------------------===//
+
+void cir::CaseOp::getSuccessorRegions(
+    mlir::RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> &regions) {
+  if (!point.isParent()) {
+    regions.push_back(RegionSuccessor());
+    return;
+  }
+  regions.push_back(RegionSuccessor(&getCaseRegion()));
+}
+
+void cir::CaseOp::build(OpBuilder &builder, OperationState &result,
+                        ArrayAttr value, CaseOpKind kind,
+                        OpBuilder::InsertPoint &insertPoint) {
+  OpBuilder::InsertionGuard guardSwitch(builder);
+  result.addAttribute("value", value);
+  result.getOrAddProperties<Properties>().kind =
+      cir::CaseOpKindAttr::get(builder.getContext(), kind);
+  Region *caseRegion = result.addRegion();
+  builder.createBlock(caseRegion);
+
+  insertPoint = builder.saveInsertionPoint();
+}
+
+LogicalResult cir::CaseOp::verify() { return success(); }
----------------
Andres-Salamanca wrote:

This verify() function was introduced when `cir.case` was added in [this 
commit](https://github.com/llvm/clangir/commit/92403f9797738a611ce128256a785a986127a9c8).
 Before that, cases in a `cir.switch` were represented as attributes and 
handled in the `parseSwitchOp` function  see [this version of the 
file](https://github.com/llvm/clangir/blob/580885200e25bec4377356bade2e39660b897c56/clang/lib/CIR/Dialect/IR/CIRDialect.cpp#L1493).

With the introduction of `cir.case`, that logic was refactored. Now, cases are 
modeled as proper operations rather than attributes. Most of the case handling 
logic was moved to 
[CIRGenFunction::buildCaseDefaultCascade](https://github.com/llvm/clangir/blob/92403f9797738a611ce128256a785a986127a9c8/clang/lib/CIR/CodeGen/CIRGenStmt.cpp#L671)
 and 
[CIRGenFunction::foldCaseStmt](https://github.com/llvm/clangir/blob/d071f2fbda9fbae87904c1d2f9f66005fb867791/clang/lib/CIR/CodeGen/CIRGenStmt.cpp#L678C12-L678C23).

>From what I understand, the rationale for this change is:

    "Then we can get the cases by traversing the body of the cir.switch 
operation easily instead of counting the regions and the attributes."
In the current setup, 
[CIRGenFunction::emitSwitchBody](https://github.com/llvm/clangir/blob/d071f2fbda9fbae87904c1d2f9f66005fb867791/clang/lib/CIR/CodeGen/CIRGenStmt.cpp#L1095C21-L1095C51)
 is responsible for creating the `cir.case` ops within the body of the 
`cir.switch`, and `buildCaseDefaultCascade` handles the logic for constructing 
and verifying that the case layout is correct. @bcardosolopes is this correct, 
or is there something I’m missing?

https://github.com/llvm/llvm-project/pull/137106
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to