// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s // Test that trying to outline an infinite loop doesn't lead to an assertion // failure. llvm.func @parallel_infinite_loop() -> () { omp.parallel { llvm.br ^bb1 ^bb1: llvm.br ^bb1 } llvm.return } // CHECK-LABEL: define void @parallel_infinite_loop() { // CHECK: br label %[[VAL_3:.*]] // CHECK: omp_parallel: // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 0, ptr @parallel_infinite_loop..omp_par) // CHECK: unreachable // CHECK: omp.region.cont: ; No predecessors! // CHECK: br label %[[VAL_4:.*]] // CHECK: omp.par.pre_finalize: ; preds = %[[VAL_5:.*]] // CHECK: br label %[[FINI:.*]] // CHECK: [[OMP_PAR_EXIT:omp.par.exit]]: ; preds = %[[FINI]] // CHECK: ret void // CHECK: [[FINI]]: // CHECK: br label %[[OMP_PAR_EXIT]] // CHECK: } // CHECK-LABEL: define internal void @parallel_infinite_loop..omp_par( // CHECK-SAME: ptr noalias %[[TID_ADDR:.*]], ptr noalias %[[ZERO_ADDR:.*]]) // CHECK: omp.par.entry: // CHECK: %[[VAL_7:.*]] = alloca i32, align 4 // CHECK: %[[VAL_8:.*]] = load i32, ptr %[[VAL_9:.*]], align 4 // CHECK: store i32 %[[VAL_8]], ptr %[[VAL_7]], align 4 // CHECK: %[[VAL_10:.*]] = load i32, ptr %[[VAL_7]], align 4 // CHECK: br label %[[VAL_11:.*]] // CHECK: omp.region.after_alloca: ; preds = %[[VAL_12:.*]] // CHECK: br label %[[VAL_13:.*]] // CHECK: omp.par.region: ; preds = %[[VAL_11]] // CHECK: br label %[[VAL_14:.*]] // CHECK: omp.par.region1: ; preds = %[[VAL_13]] // CHECK: br label %[[VAL_15:.*]] // CHECK: omp.par.region2: ; preds = %[[VAL_15]], %[[VAL_14]] // CHECK: br label %[[VAL_15]]