35 ConversionPatternRewriter &rewriter)
const override {
36 auto loc = switchOp.getLoc();
38 Region &defaultRegion = switchOp.getDefaultRegion();
39 bool hasResults = !switchOp.getResultTypes().empty();
42 scf::IfOp prevIfOp =
nullptr;
44 rewriter.setInsertionPointAfter(switchOp);
45 auto switchCases = switchOp.getCases();
46 for (
size_t i = 0; i < switchCases.size(); i++) {
47 auto caseValueInt = switchCases[i];
49 rewriter.setInsertionPointToStart(&prevIfOp.getElseRegion().front());
52 arith::ConstantIndexOp::create(rewriter, loc, caseValueInt);
54 arith::CmpIOp::create(rewriter, loc, arith::CmpIPredicate::eq,
55 switchOp.getOperand(), caseValue);
57 auto ifOp = scf::IfOp::create(rewriter, loc, switchOp.getResultTypes(),
60 Region &caseRegion = switchOp.getCaseRegions()[i];
61 rewriter.eraseBlock(&ifOp.getThenRegion().front());
62 rewriter.inlineRegionBefore(caseRegion, ifOp.getThenRegion(),
63 ifOp.getThenRegion().end());
65 if (i + 1 == switchCases.size()) {
66 rewriter.eraseBlock(&ifOp.getElseRegion().front());
67 rewriter.inlineRegionBefore(defaultRegion, ifOp.getElseRegion(),
68 ifOp.getElseRegion().end());
71 if (prevIfOp && hasResults) {
72 rewriter.setInsertionPointToEnd(&prevIfOp.getElseRegion().front());
73 scf::YieldOp::create(rewriter, loc, ifOp.getResult(0));
76 if (i == 0 && hasResults)
77 finalResult = ifOp.getResult(0);
83 rewriter.replaceOp(switchOp, finalResult);
85 rewriter.eraseOp(switchOp);