94 lines · plain
1// Test lowering of the omp.unroll_heuristic2// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s3 4 5// CHECK-LABEL: define void @unroll_heuristic_nested_loop(6// CHECK-SAME: ptr %[[ptr:.+]], i32 %[[outer_tc:.+]], i32 %[[inner_tc:.+]]) {7// CHECK-NEXT: br label %omp_omp.loop.preheader8// CHECK-EMPTY:9// CHECK-NEXT: omp_omp.loop.preheader:10// CHECK-NEXT: br label %omp_omp.loop.header11// CHECK-EMPTY:12// CHECK-NEXT: omp_omp.loop.header:13// CHECK-NEXT: %omp_omp.loop.iv = phi i32 [ 0, %omp_omp.loop.preheader ], [ %omp_omp.loop.next, %omp_omp.loop.inc ]14// CHECK-NEXT: br label %omp_omp.loop.cond15// CHECK-EMPTY:16// CHECK-NEXT: omp_omp.loop.cond:17// CHECK-NEXT: %omp_omp.loop.cmp = icmp ult i32 %omp_omp.loop.iv, %[[outer_tc]]18// CHECK-NEXT: br i1 %omp_omp.loop.cmp, label %omp_omp.loop.body, label %omp_omp.loop.exit19// CHECK-EMPTY:20// CHECK-NEXT: omp_omp.loop.body:21// CHECK-NEXT: br label %omp.loop.region22// CHECK-EMPTY:23// CHECK-NEXT: omp.loop.region:24// CHECK-NEXT: br label %omp_omp.loop.preheader125// CHECK-EMPTY:26// CHECK-NEXT: omp_omp.loop.preheader1:27// CHECK-NEXT: br label %omp_omp.loop.header228// CHECK-EMPTY:29// CHECK-NEXT: omp_omp.loop.header2:30// CHECK-NEXT: %omp_omp.loop.iv8 = phi i32 [ 0, %omp_omp.loop.preheader1 ], [ %omp_omp.loop.next10, %omp_omp.loop.inc5 ]31// CHECK-NEXT: br label %omp_omp.loop.cond332// CHECK-EMPTY:33// CHECK-NEXT: omp_omp.loop.cond3:34// CHECK-NEXT: %omp_omp.loop.cmp9 = icmp ult i32 %omp_omp.loop.iv8, %[[inner_tc]]35// CHECK-NEXT: br i1 %omp_omp.loop.cmp9, label %omp_omp.loop.body4, label %omp_omp.loop.exit636// CHECK-EMPTY:37// CHECK-NEXT: omp_omp.loop.body4:38// CHECK-NEXT: br label %omp.loop.region1239// CHECK-EMPTY:40// CHECK-NEXT: omp.loop.region12:41// CHECK-NEXT: store float 4.200000e+01, ptr %[[ptr]], align 442// CHECK-NEXT: br label %omp.region.cont1143// CHECK-EMPTY:44// CHECK-NEXT: omp.region.cont11:45// CHECK-NEXT: br label %omp_omp.loop.inc546// CHECK-EMPTY:47// CHECK-NEXT: omp_omp.loop.inc5:48// CHECK-NEXT: %omp_omp.loop.next10 = add nuw i32 %omp_omp.loop.iv8, 149// CHECK-NEXT: br label %omp_omp.loop.header2, !llvm.loop ![[$MD1:[0-9]+]]50// CHECK-EMPTY:51// CHECK-NEXT: omp_omp.loop.exit6:52// CHECK-NEXT: br label %omp_omp.loop.after753// CHECK-EMPTY:54// CHECK-NEXT: omp_omp.loop.after7:55// CHECK-NEXT: br label %omp.region.cont56// CHECK-EMPTY:57// CHECK-NEXT: omp.region.cont:58// CHECK-NEXT: br label %omp_omp.loop.inc59// CHECK-EMPTY:60// CHECK-NEXT: omp_omp.loop.inc:61// CHECK-NEXT: %omp_omp.loop.next = add nuw i32 %omp_omp.loop.iv, 162// CHECK-NEXT: br label %omp_omp.loop.header, !llvm.loop ![[$MD3:[0-9]+]]63// CHECK-EMPTY:64// CHECK-NEXT: omp_omp.loop.exit:65// CHECK-NEXT: br label %omp_omp.loop.after66// CHECK-EMPTY:67// CHECK-NEXT: omp_omp.loop.after:68// CHECK-NEXT: ret void69// CHECK-NEXT: }70llvm.func @unroll_heuristic_nested_loop(%ptr: !llvm.ptr, %outer_tc: i32, %inner_tc: i32) -> () {71 %outer_cli = omp.new_cli72 %inner_cli = omp.new_cli73 omp.canonical_loop(%outer_cli) %outer_iv : i32 in range(%outer_tc) {74 omp.canonical_loop(%inner_cli) %inner_iv : i32 in range(%inner_tc) {75 %val = llvm.mlir.constant(42.0 : f32) : f3276 llvm.store %val, %ptr : f32, !llvm.ptr77 omp.terminator78 }79 omp.terminator80 }81 omp.unroll_heuristic(%outer_cli)82 omp.unroll_heuristic(%inner_cli)83 llvm.return84}85 86 87// Start of metadata88// CHECK-LABEL: !llvm.module.flags89 90// CHECK: ![[$MD1]] = distinct !{![[$MD1]], ![[$MD2:[0-9]+]]}91// CHECK: ![[$MD2]] = !{!"llvm.loop.unroll.enable"}92// CHECK: ![[$MD3]] = distinct !{![[$MD3]], ![[$MD2]]}93 94