Skip to content

Commit e2733a6

Browse files
[Flang][OpenMP] Add trivial conversion pattern for omp.ordered_region (#66085)
Fixes #65570
1 parent c24a422 commit e2733a6

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

flang/test/Fir/convert-to-llvm-openmp-and-fir.fir

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,7 @@ func.func @_QPs(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "x"}) {
657657
}
658658

659659
// -----
660+
660661
// Test if llvm.alloca is properly inserted in the omp section
661662

662663
//CHECK: %[[CONST:.*]] = llvm.mlir.constant(1 : i64) : i64
@@ -693,3 +694,35 @@ fir.global internal @_QFEx target : i32 {
693694
%0 = fir.zero_bits i32
694695
fir.has_value %0 : i32
695696
}
697+
698+
// -----
699+
700+
// Test if llvm.alloca is properly inserted in the omp ordered region
701+
702+
// CHECK: llvm.func @sub_
703+
func.func @sub_() {
704+
%c0 = arith.constant 0 : index
705+
%c1 = arith.constant 1 : index
706+
%0 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsubEi"}
707+
// CHECK: omp.ordered_region
708+
omp.ordered_region {
709+
%1 = fir.convert %c1 : (index) -> i32
710+
cf.br ^bb1(%1, %c1 : i32, index)
711+
^bb1(%2: i32, %3: index): // 2 preds: ^bb0, ^bb2
712+
%4 = arith.cmpi sgt, %3, %c0 : index
713+
cf.cond_br %4, ^bb2, ^bb3
714+
^bb2: // pred: ^bb1
715+
fir.store %2 to %0 : !fir.ref<i32>
716+
%5 = fir.load %0 : !fir.ref<i32>
717+
// CHECK: llvm.add
718+
%6 = arith.addi %5, %1 : i32
719+
// CHECK: llvm.sub
720+
%7 = arith.subi %3, %c1 : index
721+
cf.br ^bb1(%6, %7 : i32, index)
722+
^bb3: // pred: ^bb1
723+
fir.store %2 to %0 : !fir.ref<i32>
724+
// CHECK: omp.terminator
725+
omp.terminator
726+
}
727+
return
728+
}

mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,10 @@ void mlir::configureOpenMPToLLVMConversionLegality(
199199
ConversionTarget &target, LLVMTypeConverter &typeConverter) {
200200
target.addDynamicallyLegalOp<
201201
mlir::omp::AtomicUpdateOp, mlir::omp::CriticalOp, mlir::omp::TargetOp,
202-
mlir::omp::DataOp, mlir::omp::ParallelOp, mlir::omp::WsLoopOp,
203-
mlir::omp::SimdLoopOp, mlir::omp::MasterOp, mlir::omp::SectionOp,
204-
mlir::omp::SectionsOp, mlir::omp::SingleOp, mlir::omp::TaskGroupOp,
205-
mlir::omp::TaskOp>([&](Operation *op) {
202+
mlir::omp::DataOp, mlir::omp::OrderedRegionOp, mlir::omp::ParallelOp,
203+
mlir::omp::WsLoopOp, mlir::omp::SimdLoopOp, mlir::omp::MasterOp,
204+
mlir::omp::SectionOp, mlir::omp::SectionsOp, mlir::omp::SingleOp,
205+
mlir::omp::TaskGroupOp, mlir::omp::TaskOp>([&](Operation *op) {
206206
return typeConverter.isLegal(&op->getRegion(0)) &&
207207
typeConverter.isLegal(op->getOperandTypes()) &&
208208
typeConverter.isLegal(op->getResultTypes());
@@ -234,6 +234,7 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
234234
AtomicReadOpConversion, ReductionOpConversion,
235235
ReductionDeclareOpConversion, RegionOpConversion<omp::CriticalOp>,
236236
RegionOpConversion<omp::MasterOp>, ReductionOpConversion,
237+
RegionOpConversion<omp::OrderedRegionOp>,
237238
RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
238239
RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
239240
RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,

mlir/test/Conversion/OpenMPToLLVM/convert-to-llvmir.mlir

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,3 +384,34 @@ llvm.func @_QQmain() {
384384
llvm.func @_QFPdo_work(%arg0: !llvm.ptr<i32> {fir.bindc_name = "i"}) {
385385
llvm.return
386386
}
387+
388+
// -----
389+
390+
// CHECK-LABEL: @sub_
391+
llvm.func @sub_() {
392+
%0 = llvm.mlir.constant(0 : index) : i64
393+
%1 = llvm.mlir.constant(1 : index) : i64
394+
%2 = llvm.mlir.constant(1 : i64) : i64
395+
%3 = llvm.alloca %2 x i32 {bindc_name = "i", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFsubEi"} : (i64) -> !llvm.ptr<i32>
396+
// CHECK: omp.ordered_region
397+
omp.ordered_region {
398+
%4 = llvm.trunc %1 : i64 to i32
399+
llvm.br ^bb1(%4, %1 : i32, i64)
400+
^bb1(%5: i32, %6: i64): // 2 preds: ^bb0, ^bb2
401+
%7 = llvm.icmp "sgt" %6, %0 : i64
402+
llvm.cond_br %7, ^bb2, ^bb3
403+
^bb2: // pred: ^bb1
404+
llvm.store %5, %3 : !llvm.ptr<i32>
405+
%8 = llvm.load %3 : !llvm.ptr<i32>
406+
// CHECK: llvm.add
407+
%9 = arith.addi %8, %4 : i32
408+
// CHECK: llvm.sub
409+
%10 = arith.subi %6, %1 : i64
410+
llvm.br ^bb1(%9, %10 : i32, i64)
411+
^bb3: // pred: ^bb1
412+
llvm.store %5, %3 : !llvm.ptr<i32>
413+
// CHECK: omp.terminator
414+
omp.terminator
415+
}
416+
llvm.return
417+
}

0 commit comments

Comments
 (0)