[Mlir-commits] [mlir] [mlir][spirv-to-llvm] Add conversion for spirv.Switch (PR #232941)

Arseniy Obolenskiy llvmlistbot at llvm.org
Mon Oct 19 22:13:17 PDT 2026


================
@@ -612,6 +612,35 @@ class BranchConditionalConversionPattern
   }
 };
 
+class SwitchConversionPattern : public SPIRVToLLVMConversion<spirv::SwitchOp> {
+public:
+  using SPIRVToLLVMConversion<spirv::SwitchOp>::SPIRVToLLVMConversion;
+
+  LogicalResult
+  matchAndRewrite(spirv::SwitchOp op, OpAdaptor adaptor,
+                  ConversionPatternRewriter &rewriter) const override {
+    Value selector = adaptor.getSelector();
+    auto selectorType = dyn_cast<IntegerType>(selector.getType());
+    if (!selectorType)
+      return rewriter.notifyMatchFailure(op, "selector is not an integer");
+
+    SmallVector<APInt> caseValues;
+    if (auto literals = op.getLiterals()) {
+      unsigned width = selectorType.getWidth();
+      bool isSigned = op.getSelector().getType().isSignedInteger();
+      for (const APInt &val : literals->getValues<APInt>())
+        caseValues.push_back(isSigned ? val.sextOrTrunc(width)
+                                      : val.zextOrTrunc(width));
+    }
+
+    SmallVector<ValueRange> caseOperands = adaptor.getTargetOperands();
+    rewriter.replaceOpWithNewOp<LLVM::SwitchOp>(
+        op, selector, op.getDefaultTarget(), adaptor.getDefaultOperands(),
+        caseValues, op.getTargets(), caseOperands);
----------------
aobolensk wrote:

```suggestion
        op, adaptor.getSelector(), op.getDefaultTarget(),
        adaptor.getDefaultOperands(), caseValues, op.getTargets(),
        caseOperands);
```

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


More information about the Mlir-commits mailing list