| // RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s |
| |
| // Check that omp.simd as a leaf of a composite construct still generates |
| // the appropriate loop vectorization attribute. |
| |
| // CHECK-LABEL: define internal void @test_parallel_do_simd..omp_par |
| // CHECK: omp.par.entry: |
| // CHECK: omp.par.region: |
| // CHECK: omp_loop.header: |
| // CHECK: omp_loop.inc: |
| // CHECK-NEXT: %omp_loop.next = add nuw i32 %omp_loop.iv, 1 |
| // CHECK-NEXT: br label %omp_loop.header, !llvm.loop ![[LOOP_ATTR:.*]] |
| // CHECK: ![[LOOP_ATTR]] = distinct !{![[LOOP_ATTR]], ![[LPAR:.*]], ![[LVEC:.*]]} |
| // CHECK: ![[LPAR]] = !{!"llvm.loop.parallel_accesses", ![[PAR_ACC:.*]]} |
| // CHECK: ![[LVEC]] = !{!"llvm.loop.vectorize.enable", i1 true} |
| |
| llvm.func @test_parallel_do_simd() { |
| %0 = llvm.mlir.constant(1 : i64) : i64 |
| %1 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr |
| %2 = llvm.mlir.constant(1000 : i32) : i32 |
| %3 = llvm.mlir.constant(1 : i32) : i32 |
| %4 = llvm.mlir.constant(1 : i64) : i64 |
| omp.parallel { |
| %5 = llvm.mlir.constant(1 : i64) : i64 |
| %6 = llvm.alloca %5 x i32 {bindc_name = "i", pinned} : (i64) -> !llvm.ptr |
| %7 = llvm.mlir.constant(1 : i64) : i64 |
| omp.wsloop { |
| omp.simd { |
| omp.loop_nest (%arg0) : i32 = (%3) to (%2) inclusive step (%3) { |
| llvm.store %arg0, %6 : i32, !llvm.ptr |
| omp.yield |
| } |
| } {omp.composite} |
| } {omp.composite} |
| omp.terminator |
| } |
| llvm.return |
| } |