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