36 ConversionPatternRewriter &rewriter)
const override {
37 auto loc = switchOp.getLoc();
39 Region &defaultRegion = switchOp.getDefaultRegion();
40 bool hasResults = !switchOp.getResultTypes().empty();
42 SmallVector<Value> finalResults;
43 scf::IfOp prevIfOp =
nullptr;
45 rewriter.setInsertionPointAfter(switchOp);
46 auto switchCases = switchOp.getCases();
47 Value switchOperand = adaptor.getArg();
49 return rewriter.notifyMatchFailure(switchOp,
50 "missing converted switch operand");
51 for (
size_t i = 0; i < switchCases.size(); i++) {
52 auto caseValueInt = switchCases[i];
54 rewriter.setInsertionPointToStart(&prevIfOp.getElseRegion().front());
57 arith::ConstantIndexOp::create(rewriter, loc, caseValueInt);
58 Value cond = arith::CmpIOp::create(
59 rewriter, loc, arith::CmpIPredicate::eq, switchOperand, caseValue);
61 auto ifOp = scf::IfOp::create(rewriter, loc, switchOp.getResultTypes(),
64 Region &caseRegion = switchOp.getCaseRegions()[i];
65 rewriter.eraseBlock(&ifOp.getThenRegion().front());
66 rewriter.inlineRegionBefore(caseRegion, ifOp.getThenRegion(),
67 ifOp.getThenRegion().end());
69 if (i + 1 == switchCases.size()) {
70 rewriter.eraseBlock(&ifOp.getElseRegion().front());
71 rewriter.inlineRegionBefore(defaultRegion, ifOp.getElseRegion(),
72 ifOp.getElseRegion().end());
75 if (prevIfOp && hasResults) {
76 rewriter.setInsertionPointToEnd(&prevIfOp.getElseRegion().front());
77 scf::YieldOp::create(rewriter, loc, ifOp.getResults());
80 if (i == 0 && hasResults)
81 llvm::append_range(finalResults, ifOp.getResults());
87 rewriter.replaceOp(switchOp, finalResults);
89 rewriter.eraseOp(switchOp);