Skip to content

Commit 03b43d3

Browse files
committed
Fix scf-to-cfg conversion for IndexSwitchOp
Reviewed By: mehdi_amini Differential Revision: https://reviews.llvm.org/D158212
1 parent e651c19 commit 03b43d3

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

mlir/lib/Conversion/SCFToControlFlow/SCFToControlFlow.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,13 @@ IndexSwitchLowering::matchAndRewrite(IndexSwitchOp op,
665665
// Create the switch.
666666
rewriter.setInsertionPointToEnd(condBlock);
667667
SmallVector<ValueRange> caseOperands(caseSuccessors.size(), {});
668+
669+
// Cast switch index to integer case value.
670+
Value caseValue = rewriter.create<arith::IndexCastOp>(
671+
op.getLoc(), rewriter.getI32Type(), op.getArg());
672+
668673
rewriter.create<cf::SwitchOp>(
669-
op.getLoc(), op.getArg(), *defaultBlock, ValueRange(),
674+
op.getLoc(), caseValue, *defaultBlock, ValueRange(),
670675
rewriter.getDenseI32ArrayAttr(caseValues), caseSuccessors, caseOperands);
671676
rewriter.replaceOp(op, continueBlock->getArguments());
672677
return success();
@@ -686,8 +691,8 @@ void SCFToControlFlowPass::runOnOperation() {
686691

687692
// Configure conversion to lower out SCF operations.
688693
ConversionTarget target(getContext());
689-
target.addIllegalOp<scf::ForOp, scf::IfOp, scf::ParallelOp, scf::WhileOp,
690-
scf::ExecuteRegionOp>();
694+
target.addIllegalOp<scf::ForOp, scf::IfOp, scf::IndexSwitchOp,
695+
scf::ParallelOp, scf::WhileOp, scf::ExecuteRegionOp>();
691696
target.markUnknownOpDynamicallyLegal([](Operation *) { return true; });
692697
if (failed(
693698
applyPartialConversion(getOperation(), target, std::move(patterns))))

mlir/test/Conversion/SCFToControlFlow/convert-to-cfg.mlir

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -621,29 +621,30 @@ func.func @func_execute_region_elim_multi_yield() {
621621
// CHECK: "test.bar"(%[[z]])
622622
// CHECK: return
623623

624-
// SWITCH-LABEL: @index_switch
624+
// CHECK-LABEL: @index_switch
625625
func.func @index_switch(%i: index, %a: i32, %b: i32, %c: i32) -> i32 {
626-
// SWITCH: cf.switch %arg0 : index
627-
// SWITCH-NEXT: default: ^bb3
628-
// SWITCH-NEXT: 0: ^bb1
629-
// SWITCH-NEXT: 1: ^bb2
626+
// CHECK: %[[CASE:.*]] = arith.index_cast %arg0 : index to i32
627+
// CHECK: cf.switch %[[CASE]] : i32
628+
// CHECK-NEXT: default: ^[[DEFAULT:.+]],
629+
// CHECK-NEXT: 0: ^[[bb1:.+]],
630+
// CHECK-NEXT: 1: ^[[bb2:.+]]
630631
%0 = scf.index_switch %i -> i32
631-
// SWITCH: ^bb1:
632+
// CHECK: ^[[bb1]]:
632633
case 0 {
633-
// SWITCH-NEXT: llvm.br ^bb4(%arg1
634+
// CHECK-NEXT: br ^[[bb4:.+]](%arg1 : i32)
634635
scf.yield %a : i32
635636
}
636-
// SWITCH: ^bb2:
637+
// CHECK: ^[[bb2]]:
637638
case 1 {
638-
// SWITCH-NEXT: llvm.br ^bb4(%arg2
639+
// CHECK-NEXT: br ^[[bb4]](%arg2 : i32)
639640
scf.yield %b : i32
640641
}
641-
// SWITCH: ^bb3:
642+
// CHECK: ^[[DEFAULT]]:
642643
default {
643-
// SWITCH-NEXT: llvm.br ^bb4(%arg3
644+
// CHECK-NEXT: br ^[[bb4]](%arg3 : i32)
644645
scf.yield %c : i32
645646
}
646-
// SWITCH: ^bb4(%[[V:.*]]: i32
647-
// SWITCH-NEXT: return %[[V]]
647+
// CHECK: ^[[bb4]](%[[V:.*]]: i32
648+
// CHECK-NEXT: return %[[V]]
648649
return %0 : i32
649650
}

0 commit comments

Comments
 (0)