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