144 lines · plain
1// RUN: mlir-opt %s --mlir-disable-threading -test-block-is-in-loop 2>&1 | FileCheck %s2 3module {4 // Test function with only one bb5 func.func @simple() {6 func.return7 }8// CHECK: Block is not in a loop9// CHECK-NEXT: ^bb0:10 11 // Test simple loop bb0 -> bb012 func.func @loopForever() {13 ^bb0:14 cf.br ^bb115 ^bb1:16 cf.br ^bb117 }18// CHECK: Block is not in a loop19// CHECK-NEXT: ^bb0:20// CHECK: Block is in a loop21// CHECK-NEXT: ^bb1:22 23 // Test bb0 -> bb1 -> bb2 -> bb124 func.func @loopForever2() {25 ^bb0:26 cf.br ^bb127 ^bb1:28 cf.br ^bb229 ^bb2:30 cf.br ^bb131 }32// CHECK: Block is not in a loop33// CHECK-NEXT: ^bb0:34// CHECK: Block is in a loop35// CHECK-NEXT: ^bb1:36// CHECK: Block is in a loop37// CHECK-NEXT: ^bb2:38 39 // Test conditional branch without loop40 // bb0 -> bb1 -> {bb2, bb3}41 func.func @noLoop(%arg0: i1) {42 cf.br ^bb143 ^bb1:44 cf.cond_br %arg0, ^bb2, ^bb345 ^bb2:46 func.return47 ^bb3:48 func.return49 }50// CHECK: Block is not in a loop51// CHECK-NEXT: ^bb0(%arg0: i1)52// CHECK: Block is not in a loop53// CHECK-NEXT: ^bb1:54// CHECK: Block is not in a loop55// CHECK-NEXT: ^bb2:56// CHECK: Block is not in a loop57// CHECK-NEXT: ^bb3:58 59 // test multiple loops60 // bb0 -> bb1 -> bb2 -> bb3 { -> bb2} -> bb4 { -> bb1 } -> bb561 func.func @multipleLoops(%arg0: i1, %arg1: i1) {62 cf.br ^bb163 ^bb1:64 cf.br ^bb265 ^bb2:66 cf.br ^bb367 ^bb3:68 cf.cond_br %arg0, ^bb4, ^bb269 ^bb4:70 cf.cond_br %arg1, ^bb1, ^bb571 ^bb5:72 return73 }74// CHECK: Block is not in a loop75// CHECK-NEXT: ^bb0(%arg0: i1, %arg1: i1)76// CHECK: Block is in a loop77// CHECK-NEXT: ^bb1:78// CHECK: Block is in a loop79// CHECK-NEXT: ^bb2:80// CHECK: Block is in a loop81// CHECK-NEXT: ^bb3:82// CHECK: Block is in a loop83// CHECK-NEXT: ^bb4:84// CHECK: Block is not in a loop85// CHECK-NEXT: ^bb5:86 87 // test derived from real Flang output88 func.func @_QPblockTest0(%arg0: i1, %arg1: i1) {89 cf.br ^bb190 ^bb1: // 2 preds: ^bb0, ^bb491 cf.cond_br %arg0, ^bb2, ^bb592 ^bb2: // pred: ^bb193 cf.cond_br %arg1, ^bb3, ^bb494 ^bb3: // pred: ^bb295 return96 ^bb4: // pred: ^bb297 cf.br ^bb198 ^bb5: // pred: ^bb199 return100 }101// CHECK: Block is not in a loop102// CHECK-NEXT: ^bb0(%arg0: i1, %arg1: i1)103// CHECK: Block is in a loop104// CHECK-NEXT: ^bb1:105// CHECK: Block is in a loop106// CHECK-NEXT: ^bb2:107// CHECK: Block is not in a loop108// CHECK-NEXT: ^bb3:109// CHECK: Block is in a loop110// CHECK-NEXT: ^bb4:111// CHECK: Block is not in a loop112// CHECK-NEXT: ^bb5:113 114// check nested blocks115 func.func @check_alloc_in_loop(%counter : i64) {116 cf.br ^bb1(%counter: i64)117 ^bb1(%lv : i64):118 %cm1 = arith.constant -1 : i64119 %rem = arith.addi %lv, %cm1 : i64120 %zero = arith.constant 0 : i64121 %p = arith.cmpi eq, %rem, %zero : i64122 cf.cond_br %p, ^bb3, ^bb2123 ^bb2:124 scf.execute_region -> () {125 %c1 = arith.constant 1 : i64126 scf.yield127 }128 cf.br ^bb1(%rem: i64)129 ^bb3:130 return131 }132// CHECK: Block is not in a loop133// CHECK-NEXT: ^bb0(%arg0: i64):134// CHECK: Block is in a loop135// CHECK-NEXT: ^bb1(%0: i64)136// CHECK: Block is in a loop137// CHECK-NEXT: ^bb0:138// CHECK-NEXT: %c1_i64139// CHECK: Block is in a loop140// CHECK-NEXT: ^bb2:141// CHECK: Block is not in a loop142// CHECK-NEXT: ^bb3:143}144