brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 2d4a775 Raw
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