1*1ef51e04SChristian Ulmann// RUN: mlir-opt -pass-pipeline="builtin.module(any(test-cfg-loop-info))" --split-input-file %s 2>&1 | FileCheck %s 2*1ef51e04SChristian Ulmann 3*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "no_loop_single_block" 4*1ef51e04SChristian Ulmann// CHECK: no loops 5*1ef51e04SChristian Ulmannfunc.func @no_loop_single_block() { 6*1ef51e04SChristian Ulmann return 7*1ef51e04SChristian Ulmann} 8*1ef51e04SChristian Ulmann 9*1ef51e04SChristian Ulmann// ----- 10*1ef51e04SChristian Ulmann 11*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "no_loop" 12*1ef51e04SChristian Ulmann// CHECK: no loops 13*1ef51e04SChristian Ulmannfunc.func @no_loop() { 14*1ef51e04SChristian Ulmann cf.br ^bb1 15*1ef51e04SChristian Ulmann^bb1: 16*1ef51e04SChristian Ulmann return 17*1ef51e04SChristian Ulmann} 18*1ef51e04SChristian Ulmann 19*1ef51e04SChristian Ulmann// ----- 20*1ef51e04SChristian Ulmann 21*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "simple_loop" 22*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]] 23*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 containing: 24*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><exiting> 25*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch> 26*1ef51e04SChristian Ulmannfunc.func @simple_loop(%c: i1) { 27*1ef51e04SChristian Ulmann cf.br ^bb1 28*1ef51e04SChristian Ulmann^bb1: 29*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb2, ^bb3 30*1ef51e04SChristian Ulmann^bb2: 31*1ef51e04SChristian Ulmann cf.br ^bb1 32*1ef51e04SChristian Ulmann^bb3: 33*1ef51e04SChristian Ulmann return 34*1ef51e04SChristian Ulmann} 35*1ef51e04SChristian Ulmann 36*1ef51e04SChristian Ulmann// ----- 37*1ef51e04SChristian Ulmann 38*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "single_block_loop" 39*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]] 40*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 containing: 41*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><latch><exiting> 42*1ef51e04SChristian Ulmannfunc.func @single_block_loop(%c: i1) { 43*1ef51e04SChristian Ulmann cf.br ^bb1 44*1ef51e04SChristian Ulmann^bb1: 45*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb1, ^bb2 46*1ef51e04SChristian Ulmann^bb2: 47*1ef51e04SChristian Ulmann return 48*1ef51e04SChristian Ulmann} 49*1ef51e04SChristian Ulmann 50*1ef51e04SChristian Ulmann// ----- 51*1ef51e04SChristian Ulmann 52*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "nested_loop" 53*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]], ^[[BB4:.*]] 54*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 55*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><exiting> 56*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch> 57*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]] 58*1ef51e04SChristian Ulmann// CHECK: Loop at depth 2 59*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<header><exiting> 60*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]<latch> 61*1ef51e04SChristian Ulmannfunc.func @nested_loop(%c: i1) { 62*1ef51e04SChristian Ulmann cf.br ^bb1 63*1ef51e04SChristian Ulmann^bb1: 64*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb2, ^bb4 65*1ef51e04SChristian Ulmann^bb2: 66*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb1, ^bb3 67*1ef51e04SChristian Ulmann^bb3: 68*1ef51e04SChristian Ulmann cf.br ^bb2 69*1ef51e04SChristian Ulmann^bb4: 70*1ef51e04SChristian Ulmann return 71*1ef51e04SChristian Ulmann} 72*1ef51e04SChristian Ulmann 73*1ef51e04SChristian Ulmann// ----- 74*1ef51e04SChristian Ulmann 75*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "multi_latch" 76*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]], ^[[BB4:.*]] 77*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 78*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header><exiting> 79*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch> 80*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]<latch> 81*1ef51e04SChristian Ulmannfunc.func @multi_latch(%c: i1) { 82*1ef51e04SChristian Ulmann cf.br ^bb1 83*1ef51e04SChristian Ulmann^bb1: 84*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb4, ^bb2 85*1ef51e04SChristian Ulmann^bb2: 86*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb1, ^bb3 87*1ef51e04SChristian Ulmann^bb3: 88*1ef51e04SChristian Ulmann cf.br ^bb1 89*1ef51e04SChristian Ulmann^bb4: 90*1ef51e04SChristian Ulmann return 91*1ef51e04SChristian Ulmann} 92*1ef51e04SChristian Ulmann 93*1ef51e04SChristian Ulmann// ----- 94*1ef51e04SChristian Ulmann 95*1ef51e04SChristian Ulmann// CHECK-LABEL: Testing : "multiple_loops" 96*1ef51e04SChristian Ulmann// CHECK-NEXT: Blocks : ^[[BB0:.*]], ^[[BB1:.*]], ^[[BB2:.*]], ^[[BB3:.*]], ^[[BB4:.*]], ^[[BB5:.*]] 97*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 98*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB3]]<header><exiting> 99*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB4]]<latch> 100*1ef51e04SChristian Ulmann// CHECK: Loop at depth 1 101*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB1]]<header> 102*1ef51e04SChristian Ulmann// CHECK-SAME: ^[[BB2]]<latch><exiting> 103*1ef51e04SChristian Ulmannfunc.func @multiple_loops(%c: i1) { 104*1ef51e04SChristian Ulmann cf.br ^bb1 105*1ef51e04SChristian Ulmann^bb1: 106*1ef51e04SChristian Ulmann cf.br ^bb2 107*1ef51e04SChristian Ulmann^bb2: 108*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb3, ^bb1 109*1ef51e04SChristian Ulmann^bb3: 110*1ef51e04SChristian Ulmann cf.cond_br %c, ^bb5, ^bb4 111*1ef51e04SChristian Ulmann^bb4: 112*1ef51e04SChristian Ulmann cf.br ^bb3 113*1ef51e04SChristian Ulmann^bb5: 114*1ef51e04SChristian Ulmann return 115*1ef51e04SChristian Ulmann} 116