[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