47 lines · plain
1// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s2 3// Test that trying to outline an infinite loop doesn't lead to an assertion4// failure.5 6llvm.func @parallel_infinite_loop() -> () {7 omp.parallel {8 llvm.br ^bb19 ^bb1:10 llvm.br ^bb111 }12 llvm.return13}14 15// CHECK-LABEL: define void @parallel_infinite_loop() {16// CHECK: %[[VAL_2:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)17// CHECK: br label %[[VAL_3:.*]]18// CHECK: omp_parallel:19// CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 0, ptr @parallel_infinite_loop..omp_par)20// CHECK: unreachable21// CHECK: omp.region.cont: ; No predecessors!22// CHECK: br label %[[VAL_4:.*]]23// CHECK: omp.par.pre_finalize: ; preds = %[[VAL_5:.*]]24// CHECK: br label %[[FINI:.*]]25// CHECK: [[OMP_PAR_EXIT:omp.par.exit]]: ; preds = %[[FINI]]26// CHECK: ret void27// CHECK: [[FINI]]:28// CHECK: br label %[[OMP_PAR_EXIT]]29// CHECK: }30 31// CHECK-LABEL: define internal void @parallel_infinite_loop..omp_par(32// CHECK-SAME: ptr noalias %[[TID_ADDR:.*]], ptr noalias %[[ZERO_ADDR:.*]])33// CHECK: omp.par.entry:34// CHECK: %[[VAL_7:.*]] = alloca i32, align 435// CHECK: %[[VAL_8:.*]] = load i32, ptr %[[VAL_9:.*]], align 436// CHECK: store i32 %[[VAL_8]], ptr %[[VAL_7]], align 437// CHECK: %[[VAL_10:.*]] = load i32, ptr %[[VAL_7]], align 438// CHECK: br label %[[VAL_11:.*]]39// CHECK: omp.region.after_alloca: ; preds = %[[VAL_12:.*]]40// CHECK: br label %[[VAL_13:.*]]41// CHECK: omp.par.region: ; preds = %[[VAL_11]]42// CHECK: br label %[[VAL_14:.*]]43// CHECK: omp.par.region1: ; preds = %[[VAL_13]]44// CHECK: br label %[[VAL_15:.*]]45// CHECK: omp.par.region2: ; preds = %[[VAL_15]], %[[VAL_14]]46// CHECK: br label %[[VAL_15]]47