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 @cf_br( 7*eb6c4197SMatthias Springer// CHECK-SAME: %[[arg0:.*]]: index) -> index { 8*eb6c4197SMatthias Springer// CHECK: %[[cast0:.*]] = builtin.unrealized_conversion_cast %[[arg0]] : index to i64 9*eb6c4197SMatthias Springer// CHECK: llvm.br ^[[bb1:.*]](%[[cast0]] : i64) 10*eb6c4197SMatthias Springer// CHECK: ^[[bb1]](%[[arg1:.*]]: i64): 11*eb6c4197SMatthias Springer// CHECK: %[[cast1:.*]] = builtin.unrealized_conversion_cast %[[arg1]] : i64 to index 12*eb6c4197SMatthias Springer// CHECK: return %[[cast1]] : index 13*eb6c4197SMatthias Springer// CHECK: } 14*eb6c4197SMatthias Springerfunc.func @cf_br(%arg0: index) -> index { 15*eb6c4197SMatthias Springer cf.br ^bb1(%arg0 : index) 16*eb6c4197SMatthias Springer^bb1(%arg1: index): 17*eb6c4197SMatthias Springer return %arg1 : index 18*eb6c4197SMatthias Springer} 19*eb6c4197SMatthias Springer 20*eb6c4197SMatthias Springer// ----- 21*eb6c4197SMatthias Springer 22*eb6c4197SMatthias Springer// func.func and func.return types match. No unrealized_conversion_cast is 23*eb6c4197SMatthias Springer// needed. 24*eb6c4197SMatthias Springer 25*eb6c4197SMatthias Springer// CHECK-LABEL: func.func @cf_br_type_match( 26*eb6c4197SMatthias Springer// CHECK-SAME: %[[arg0:.*]]: i64) -> i64 { 27*eb6c4197SMatthias Springer// CHECK: llvm.br ^[[bb1:.*]](%[[arg0:.*]] : i64) 28*eb6c4197SMatthias Springer// CHECK: ^[[bb1]](%[[arg1:.*]]: i64): 29*eb6c4197SMatthias Springer// CHECK: return %[[arg1]] : i64 30*eb6c4197SMatthias Springer// CHECK: } 31*eb6c4197SMatthias Springerfunc.func @cf_br_type_match(%arg0: i64) -> i64 { 32*eb6c4197SMatthias Springer cf.br ^bb1(%arg0 : i64) 33*eb6c4197SMatthias Springer^bb1(%arg1: i64): 34*eb6c4197SMatthias Springer return %arg1 : i64 35*eb6c4197SMatthias Springer} 36*eb6c4197SMatthias Springer 37*eb6c4197SMatthias Springer// ----- 38*eb6c4197SMatthias Springer 39*eb6c4197SMatthias Springer// Test case for cf.cond_br. 40*eb6c4197SMatthias Springer 41*eb6c4197SMatthias Springer// CHECK-LABEL: func.func @cf_cond_br 42*eb6c4197SMatthias Springer// CHECK-COUNT-2: unrealized_conversion_cast {{.*}} : index to i64 43*eb6c4197SMatthias Springer// CHECK: llvm.cond_br %{{.*}}, ^{{.*}}(%{{.*}} : i64), ^{{.*}}(%{{.*}} : i64) 44*eb6c4197SMatthias Springer// CHECK: ^{{.*}}(%{{.*}}: i64): 45*eb6c4197SMatthias Springer// CHECK: unrealized_conversion_cast {{.*}} : i64 to index 46*eb6c4197SMatthias Springer// CHECK: ^{{.*}}(%{{.*}}: i64): 47*eb6c4197SMatthias Springer// CHECK: unrealized_conversion_cast {{.*}} : i64 to index 48*eb6c4197SMatthias Springerfunc.func @cf_cond_br(%cond: i1, %a: index, %b: index) -> index { 49*eb6c4197SMatthias Springer cf.cond_br %cond, ^bb1(%a : index), ^bb2(%b : index) 50*eb6c4197SMatthias Springer^bb1(%arg1: index): 51*eb6c4197SMatthias Springer return %arg1 : index 52*eb6c4197SMatthias Springer^bb2(%arg2: index): 53*eb6c4197SMatthias Springer return %arg2 : index 54*eb6c4197SMatthias Springer} 55*eb6c4197SMatthias Springer 56*eb6c4197SMatthias Springer// ----- 57*eb6c4197SMatthias Springer 58*eb6c4197SMatthias Springer// Unreachable block (and IR in general) is not converted during a dialect 59*eb6c4197SMatthias Springer// conversion. 60*eb6c4197SMatthias Springer 61*eb6c4197SMatthias Springer// CHECK-LABEL: func.func @unreachable_block() 62*eb6c4197SMatthias Springer// CHECK: return 63*eb6c4197SMatthias Springer// CHECK: ^[[bb1:.*]](%[[arg0:.*]]: index): 64*eb6c4197SMatthias Springer// CHECK: cf.br ^[[bb1]](%[[arg0]] : index) 65*eb6c4197SMatthias Springerfunc.func @unreachable_block() { 66*eb6c4197SMatthias Springer return 67*eb6c4197SMatthias Springer^bb1(%arg0: index): 68*eb6c4197SMatthias Springer cf.br ^bb1(%arg0 : index) 69*eb6c4197SMatthias Springer} 70