diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -789,7 +789,7 @@ /// 1 * x = x static int getOperationIdentity(llvm::StringRef reductionOpName, mlir::Location loc) { - if (reductionOpName.contains("add")) + if (reductionOpName.contains("add") || reductionOpName.contains("subtract")) return 0; else if (reductionOpName.contains("multiply")) return 1; @@ -840,6 +840,9 @@ case Fortran::parser::DefinedOperator::IntrinsicOperator::Add: res = builder.create(loc, op1, op2); break; + case Fortran::parser::DefinedOperator::IntrinsicOperator::Subtract: + res = builder.create(loc, op1, op2); + break; case Fortran::parser::DefinedOperator::IntrinsicOperator::Multiply: res = builder.create(loc, op1, op2); break; @@ -924,6 +927,9 @@ case Fortran::parser::DefinedOperator::IntrinsicOperator::Add: reductionName = "add_reduction"; break; + case Fortran::parser::DefinedOperator::IntrinsicOperator::Subtract: + reductionName = "subtract_reduction"; + break; case Fortran::parser::DefinedOperator::IntrinsicOperator::Multiply: reductionName = "multiply_reduction"; break; @@ -1034,6 +1040,7 @@ redDefinedOp->u)}; switch (intrinsicOp) { case Fortran::parser::DefinedOperator::IntrinsicOperator::Add: + case Fortran::parser::DefinedOperator::IntrinsicOperator::Subtract: case Fortran::parser::DefinedOperator::IntrinsicOperator::Multiply: break; @@ -1677,6 +1684,7 @@ switch (intrinsicOp) { case Fortran::parser::DefinedOperator::IntrinsicOperator::Add: + case Fortran::parser::DefinedOperator::IntrinsicOperator::Subtract: case Fortran::parser::DefinedOperator::IntrinsicOperator::Multiply: break; default: