Skip to content

Commit

Permalink
[flang][openacc] Support .or. reduction operator
Browse files Browse the repository at this point in the history
Add support for the `.or.` reduction operator for
Flang/OpenACC lowering.

Depends on D154896

Reviewed By: razvanlupusoru

Differential Revision: https://reviews.llvm.org/D154898
  • Loading branch information
clementval committed Jul 12, 2023
1 parent 40779e8 commit 464594d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 12 deletions.
37 changes: 25 additions & 12 deletions flang/lib/Lower/OpenACC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -687,16 +687,19 @@ static R getReductionInitValue(mlir::acc::ReductionOperator op, mlir::Type ty) {
static mlir::Value genReductionInitValue(fir::FirOpBuilder &builder,
mlir::Location loc, mlir::Type ty,
mlir::acc::ReductionOperator op) {
if (op == mlir::acc::ReductionOperator::AccLor &&
op == mlir::acc::ReductionOperator::AccEqv &&
if (op == mlir::acc::ReductionOperator::AccEqv &&
op == mlir::acc::ReductionOperator::AccNeqv)
TODO(loc, "reduction operator");

if (op == mlir::acc::ReductionOperator::AccLand) {
if (op == mlir::acc::ReductionOperator::AccLand ||
op == mlir::acc::ReductionOperator::AccLor) {
assert(mlir::isa<fir::LogicalType>(ty) && "expect fir.logical type");
return builder.createBool(loc, true);
bool value = true; // .true. for .and. and .eqv.
if (op == mlir::acc::ReductionOperator::AccLor ||
op == mlir::acc::ReductionOperator::AccNeqv)
value = false; // .false. for .or. and .neqv.
return builder.createBool(loc, value);
}

if (ty.isIntOrIndex())
return builder.create<mlir::arith::ConstantOp>(
loc, ty,
Expand Down Expand Up @@ -740,6 +743,17 @@ static mlir::Value genReductionInitValue(fir::FirOpBuilder &builder,
TODO(loc, "reduction type");
}

template <typename Op>
static mlir::Value genLogicalCombiner(fir::FirOpBuilder &builder,
mlir::Location loc, mlir::Value value1,
mlir::Value value2) {
mlir::Type i1 = builder.getI1Type();
mlir::Value v1 = builder.create<fir::ConvertOp>(loc, i1, value1);
mlir::Value v2 = builder.create<fir::ConvertOp>(loc, i1, value2);
mlir::Value add = builder.create<Op>(loc, v1, v2);
return builder.create<fir::ConvertOp>(loc, value1.getType(), add);
}

static mlir::Value genCombiner(fir::FirOpBuilder &builder, mlir::Location loc,
mlir::acc::ReductionOperator op, mlir::Type ty,
mlir::Value value1, mlir::Value value2) {
Expand Down Expand Up @@ -810,13 +824,12 @@ static mlir::Value genCombiner(fir::FirOpBuilder &builder, mlir::Location loc,
if (op == mlir::acc::ReductionOperator::AccXor)
return builder.create<mlir::arith::XOrIOp>(loc, value1, value2);

if (op == mlir::acc::ReductionOperator::AccLand) {
mlir::Type i1 = builder.getI1Type();
mlir::Value v1 = builder.create<fir::ConvertOp>(loc, i1, value1);
mlir::Value v2 = builder.create<fir::ConvertOp>(loc, i1, value2);
mlir::Value add = builder.create<mlir::arith::AndIOp>(loc, v1, v2);
return builder.create<fir::ConvertOp>(loc, value1.getType(), add);
}
if (op == mlir::acc::ReductionOperator::AccLand)
return genLogicalCombiner<mlir::arith::AndIOp>(builder, loc, value1,
value2);

if (op == mlir::acc::ReductionOperator::AccLor)
return genLogicalCombiner<mlir::arith::OrIOp>(builder, loc, value1, value2);

TODO(loc, "reduction operator");
}
Expand Down
23 changes: 23 additions & 0 deletions flang/test/Lower/OpenACC/acc-reduction.f90
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,19 @@

! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s

! CHECK-LABEL: acc.reduction.recipe @reduction_lor_l32 : !fir.logical<4> reduction_operator <lor> init {
! CHECK: ^bb0(%{{.*}}: !fir.logical<4>):
! CHECK: %[[CST:.*]] = arith.constant false
! CHECK: acc.yield %[[CST]] : i1
! CHECK: } combiner {
! CHECK: ^bb0(%[[ARG0:.*]]: !fir.logical<4>, %[[ARG1:.*]]: !fir.logical<4>):
! CHECK: %[[V1:.*]] = fir.convert %[[ARG0]] : (!fir.logical<4>) -> i1
! CHECK: %[[V2:.*]] = fir.convert %[[ARG1]] : (!fir.logical<4>) -> i1
! CHECK: %[[AND:.*]] = arith.ori %[[V1]], %[[V2]] : i1
! CHECK: %[[CONV:.*]] = fir.convert %[[AND]] : (i1) -> !fir.logical<4>
! CHECK: acc.yield %[[CONV]] : !fir.logical<4>
! CHECK: }

! CHECK-LABEL: acc.reduction.recipe @reduction_land_l32 : !fir.logical<4> reduction_operator <land> init {
! CHECK: ^bb0(%{{.*}}: !fir.logical<4>):
! CHECK: %[[CST:.*]] = arith.constant true
Expand Down Expand Up @@ -660,3 +673,13 @@ subroutine acc_reduction_and()
! CHECK-LABEL: func.func @_QPacc_reduction_and()
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%0 : !fir.ref<!fir.logical<4>>) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(@reduction_land_l32 -> %[[RED]] : !fir.ref<!fir.logical<4>>)

subroutine acc_reduction_or()
logical :: l
!$acc parallel reduction(.or.:l)
!$acc end parallel
end subroutine

! CHECK-LABEL: func.func @_QPacc_reduction_or()
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) -> !fir.ref<!fir.logical<4>> {name = "l"}
! CHECK: acc.parallel reduction(@reduction_lor_l32 -> %[[RED]] : !fir.ref<!fir.logical<4>>)

0 comments on commit 464594d

Please sign in to comment.