mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 21:55:39 +08:00
[flang][openacc] Support .neqv. reduction operator
Add support for the `.neqv.` reduction operator for Flang/OpenACC lowering. Depends on D154900 Reviewed By: razvanlupusoru Differential Revision: https://reviews.llvm.org/D154901
This commit is contained in:
@@ -687,12 +687,10 @@ 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::AccEqv &&
|
||||
op == mlir::acc::ReductionOperator::AccNeqv)
|
||||
TODO(loc, "reduction operator");
|
||||
|
||||
if (op == mlir::acc::ReductionOperator::AccLand ||
|
||||
op == mlir::acc::ReductionOperator::AccLor) {
|
||||
op == mlir::acc::ReductionOperator::AccLor ||
|
||||
op == mlir::acc::ReductionOperator::AccEqv ||
|
||||
op == mlir::acc::ReductionOperator::AccNeqv) {
|
||||
assert(mlir::isa<fir::LogicalType>(ty) && "expect fir.logical type");
|
||||
bool value = true; // .true. for .and. and .eqv.
|
||||
if (op == mlir::acc::ReductionOperator::AccLor ||
|
||||
@@ -847,6 +845,10 @@ static mlir::Value genCombiner(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
return genComparisonCombiner(builder, loc, mlir::arith::CmpIPredicate::eq,
|
||||
value1, value2);
|
||||
|
||||
if (op == mlir::acc::ReductionOperator::AccNeqv)
|
||||
return genComparisonCombiner(builder, loc, mlir::arith::CmpIPredicate::ne,
|
||||
value1, value2);
|
||||
|
||||
TODO(loc, "reduction operator");
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
|
||||
|
||||
! CHECK-LABEL: acc.reduction.recipe @reduction_neqv_l32 : !fir.logical<4> reduction_operator <neqv> 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: %[[NEQV:.*]] = arith.cmpi ne, %[[V1]], %[[V2]] : i1
|
||||
! CHECK: %[[CONV:.*]] = fir.convert %[[NEQV]] : (i1) -> !fir.logical<4>
|
||||
! CHECK: acc.yield %[[CONV]] : !fir.logical<4>
|
||||
! CHECK: }
|
||||
|
||||
! CHECK-LABEL: acc.reduction.recipe @reduction_eqv_l32 : !fir.logical<4> reduction_operator <eqv> init {
|
||||
! CHECK: ^bb0(%{{.*}}: !fir.logical<4>):
|
||||
! CHECK: %[[CST:.*]] = arith.constant true
|
||||
@@ -706,3 +719,13 @@ end subroutine
|
||||
! CHECK-LABEL: func.func @_QPacc_reduction_eqv()
|
||||
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) -> !fir.ref<!fir.logical<4>> {name = "l"}
|
||||
! CHECK: acc.parallel reduction(@reduction_eqv_l32 -> %[[RED]] : !fir.ref<!fir.logical<4>>)
|
||||
|
||||
subroutine acc_reduction_neqv()
|
||||
logical :: l
|
||||
!$acc parallel reduction(.neqv.:l)
|
||||
!$acc end parallel
|
||||
end subroutine
|
||||
|
||||
! CHECK-LABEL: func.func @_QPacc_reduction_neqv()
|
||||
! CHECK: %[[RED:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<!fir.logical<4>>) -> !fir.ref<!fir.logical<4>> {name = "l"}
|
||||
! CHECK: acc.parallel reduction(@reduction_neqv_l32 -> %[[RED]] : !fir.ref<!fir.logical<4>>)
|
||||
|
||||
Reference in New Issue
Block a user