Skip to content

Commit 874b880

Browse files
authored
[MLIR][OpenMP] Lowering support for Order clause in SIMD directive (llvm#96866)
1 parent d16b21b commit 874b880

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,18 @@ convertOmpParallel(omp::ParallelOp opInst, llvm::IRBuilderBase &builder,
14601460
return bodyGenStatus;
14611461
}
14621462

1463+
/// Convert Order attribute to llvm::omp::OrderKind.
1464+
static llvm::omp::OrderKind
1465+
convertOrderKind(std::optional<omp::ClauseOrderKind> o) {
1466+
if (!o)
1467+
return llvm::omp::OrderKind::OMP_ORDER_unknown;
1468+
switch (*o) {
1469+
case omp::ClauseOrderKind::Concurrent:
1470+
return llvm::omp::OrderKind::OMP_ORDER_concurrent;
1471+
}
1472+
llvm_unreachable("Unknown ClauseOrderKind kind");
1473+
}
1474+
14631475
/// Converts an OpenMP simd loop into LLVM IR using OpenMPIRBuilder.
14641476
static LogicalResult
14651477
convertOmpSimd(Operation &opInst, llvm::IRBuilderBase &builder,
@@ -1539,11 +1551,12 @@ convertOmpSimd(Operation &opInst, llvm::IRBuilderBase &builder,
15391551
safelen = builder.getInt64(safelenVar.value());
15401552

15411553
llvm::MapVector<llvm::Value *, llvm::Value *> alignedVars;
1542-
ompBuilder->applySimd(
1543-
loopInfo, alignedVars,
1544-
simdOp.getIfExpr() ? moduleTranslation.lookupValue(simdOp.getIfExpr())
1545-
: nullptr,
1546-
llvm::omp::OrderKind::OMP_ORDER_unknown, simdlen, safelen);
1554+
llvm::omp::OrderKind order = convertOrderKind(simdOp.getOrderVal());
1555+
ompBuilder->applySimd(loopInfo, alignedVars,
1556+
simdOp.getIfExpr()
1557+
? moduleTranslation.lookupValue(simdOp.getIfExpr())
1558+
: nullptr,
1559+
order, simdlen, safelen);
15471560

15481561
builder.restoreIP(afterIP);
15491562
return success();

mlir/test/Target/LLVMIR/openmp-llvm.mlir

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,26 @@ llvm.func @simd_if(%arg0: !llvm.ptr {fir.bindc_name = "n"}, %arg1: !llvm.ptr {fi
826826

827827
// -----
828828

829+
// CHECK-LABEL: @simd_order
830+
llvm.func @simd_order() {
831+
%0 = llvm.mlir.constant(10 : i64) : i64
832+
%1 = llvm.mlir.constant(1 : i64) : i64
833+
%2 = llvm.alloca %1 x i64 : (i64) -> !llvm.ptr
834+
omp.simd order(concurrent) safelen(2) {
835+
omp.loop_nest (%arg0) : i64 = (%1) to (%0) inclusive step (%1) {
836+
llvm.store %arg0, %2 : i64, !llvm.ptr
837+
omp.yield
838+
}
839+
}
840+
llvm.return
841+
}
842+
// If clause order(concurrent) is specified then the memory instructions
843+
// are marked parallel even if 'safelen' is finite.
844+
// CHECK: llvm.loop.parallel_accesses
845+
// CHECK-NEXT: llvm.loop.vectorize.enable
846+
// CHECK-NEXT: llvm.loop.vectorize.width{{.*}}i64 2
847+
// -----
848+
829849
llvm.func @body(i64)
830850

831851
llvm.func @test_omp_wsloop_ordered(%lb : i64, %ub : i64, %step : i64) -> () {

0 commit comments

Comments
 (0)