xref: /llvm-project/mlir/test/Conversion/ControlFlowToLLVM/switch.mlir (revision eb6c4197d5263ed2e086925b2b2f032a19442d2b)
1*eb6c4197SMatthias Springer// RUN: mlir-opt %s -convert-cf-to-llvm -split-input-file | FileCheck %s
2*eb6c4197SMatthias Springer
3*eb6c4197SMatthias Springer// Unstructured control flow is converted, but the enclosing op is not
4*eb6c4197SMatthias Springer// converted.
5*eb6c4197SMatthias Springer
6*eb6c4197SMatthias Springer// CHECK-LABEL: func.func @single_case(
7*eb6c4197SMatthias Springer//  CHECK-SAME:     %[[val:.*]]: i32, %[[idx:.*]]: index) -> index {
8*eb6c4197SMatthias Springer//       CHECK:   %[[cast0:.*]] = builtin.unrealized_conversion_cast %[[idx]] : index to i64
9*eb6c4197SMatthias Springer//       CHECK:   llvm.switch %[[val]] : i32, ^[[bb1:.*]](%[[cast0]] : i64) [
10*eb6c4197SMatthias Springer//       CHECK:   ]
11*eb6c4197SMatthias Springer//       CHECK: ^[[bb1]](%[[arg0:.*]]: i64):
12*eb6c4197SMatthias Springer//       CHECK:   %[[cast1:.*]] = builtin.unrealized_conversion_cast %[[arg0]] : i64 to index
13*eb6c4197SMatthias Springer//       CHECK:   return %[[cast1]] : index
14*eb6c4197SMatthias Springer//       CHECK: }
15*eb6c4197SMatthias Springerfunc.func @single_case(%val: i32, %idx: index) -> index {
16*eb6c4197SMatthias Springer  cf.switch %val : i32, [
17*eb6c4197SMatthias Springer    default: ^bb1(%idx : index)
18*eb6c4197SMatthias Springer  ]
19*eb6c4197SMatthias Springer^bb1(%arg0: index):
20*eb6c4197SMatthias Springer  return %arg0 : index
21*eb6c4197SMatthias Springer}
22*eb6c4197SMatthias Springer
23*eb6c4197SMatthias Springer// -----
24*eb6c4197SMatthias Springer
25*eb6c4197SMatthias Springer// func.func and func.return types match. No unrealized_conversion_cast is
26*eb6c4197SMatthias Springer// needed.
27*eb6c4197SMatthias Springer
28*eb6c4197SMatthias Springer// CHECK-LABEL: func.func @single_case_type_match(
29*eb6c4197SMatthias Springer//  CHECK-SAME:     %[[val:.*]]: i32, %[[i:.*]]: i64) -> i64 {
30*eb6c4197SMatthias Springer//       CHECK:   llvm.switch %[[val]] : i32, ^[[bb1:.*]](%[[i]] : i64) [
31*eb6c4197SMatthias Springer//       CHECK:   ]
32*eb6c4197SMatthias Springer//       CHECK: ^[[bb1]](%[[arg0:.*]]: i64):
33*eb6c4197SMatthias Springer//       CHECK:   return %[[arg0]] : i64
34*eb6c4197SMatthias Springer//       CHECK: }
35*eb6c4197SMatthias Springerfunc.func @single_case_type_match(%val: i32, %i: i64) -> i64 {
36*eb6c4197SMatthias Springer  cf.switch %val : i32, [
37*eb6c4197SMatthias Springer    default: ^bb1(%i : i64)
38*eb6c4197SMatthias Springer  ]
39*eb6c4197SMatthias Springer^bb1(%arg0: i64):
40*eb6c4197SMatthias Springer  return %arg0 : i64
41*eb6c4197SMatthias Springer}
42*eb6c4197SMatthias Springer
43*eb6c4197SMatthias Springer// -----
44*eb6c4197SMatthias Springer
45*eb6c4197SMatthias Springer//   CHECK-LABEL: func.func @multi_case
46*eb6c4197SMatthias Springer// CHECK-COUNT-2:   unrealized_conversion_cast {{.*}} : index to i64
47*eb6c4197SMatthias Springer//         CHECK:   llvm.switch %{{.*}} : i32, ^{{.*}}(%{{.*}} : i64) [
48*eb6c4197SMatthias Springer//         CHECK:     12: ^{{.*}}(%{{.*}} : i64),
49*eb6c4197SMatthias Springer//         CHECK:     13: ^{{.*}}(%{{.*}} : i64),
50*eb6c4197SMatthias Springer//         CHECK:     14: ^{{.*}}(%{{.*}} : i64)
51*eb6c4197SMatthias Springer//         CHECK:   ]
52*eb6c4197SMatthias Springerfunc.func @multi_case(%val: i32, %idx1: index, %idx2: index, %i: i64) -> index {
53*eb6c4197SMatthias Springer  cf.switch %val : i32, [
54*eb6c4197SMatthias Springer    default: ^bb1(%idx1 : index),
55*eb6c4197SMatthias Springer    12: ^bb2(%idx2 : index),
56*eb6c4197SMatthias Springer    13: ^bb1(%idx1 : index),
57*eb6c4197SMatthias Springer    14: ^bb3(%i : i64)
58*eb6c4197SMatthias Springer  ]
59*eb6c4197SMatthias Springer^bb1(%arg0: index):
60*eb6c4197SMatthias Springer  return %arg0 : index
61*eb6c4197SMatthias Springer^bb2(%arg1: index):
62*eb6c4197SMatthias Springer  return %arg1 : index
63*eb6c4197SMatthias Springer^bb3(%arg2: i64):
64*eb6c4197SMatthias Springer  %cast = arith.index_cast %arg2 : i64 to index
65*eb6c4197SMatthias Springer  return %cast : index
66*eb6c4197SMatthias Springer}
67