Skip to content

Commit 1ee1bdd

Browse files
authored
[flang][Evaluate] OperationCode cleanup, fix for Constant<T> (#151566)
Make the OperationCode overloads take the derived operation instead of the Operation base class instance. This makes them usable from visitors of "Expr<T>.u". Also, fix small bug: OperationCode(Constant<T>) shoud be "Constant".
1 parent 0b9470b commit 1ee1bdd

File tree

4 files changed

+31
-39
lines changed

4 files changed

+31
-39
lines changed

flang/include/flang/Evaluate/tools.h

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,10 +1402,8 @@ using OperatorSet = common::EnumSet<Operator, 32>;
14021402

14031403
std::string ToString(Operator op);
14041404

1405-
template <typename... Ts, int Kind>
1406-
Operator OperationCode(
1407-
const evaluate::Operation<evaluate::LogicalOperation<Kind>, Ts...> &op) {
1408-
switch (op.derived().logicalOperator) {
1405+
template <int Kind> Operator OperationCode(const LogicalOperation<Kind> &op) {
1406+
switch (op.logicalOperator) {
14091407
case common::LogicalOperator::And:
14101408
return Operator::And;
14111409
case common::LogicalOperator::Or:
@@ -1420,10 +1418,10 @@ Operator OperationCode(
14201418
return Operator::Unknown;
14211419
}
14221420

1423-
template <typename T, typename... Ts>
1424-
Operator OperationCode(
1425-
const evaluate::Operation<evaluate::Relational<T>, Ts...> &op) {
1426-
switch (op.derived().opr) {
1421+
Operator OperationCode(const Relational<SomeType> &op);
1422+
1423+
template <typename T> Operator OperationCode(const Relational<T> &op) {
1424+
switch (op.opr) {
14271425
case common::RelationalOperator::LT:
14281426
return Operator::Lt;
14291427
case common::RelationalOperator::LE:
@@ -1440,70 +1438,60 @@ Operator OperationCode(
14401438
return Operator::Unknown;
14411439
}
14421440

1443-
template <typename T, typename... Ts>
1444-
Operator OperationCode(const evaluate::Operation<evaluate::Add<T>, Ts...> &op) {
1441+
template <typename T> Operator OperationCode(const Add<T> &op) {
14451442
return Operator::Add;
14461443
}
14471444

1448-
template <typename T, typename... Ts>
1449-
Operator OperationCode(
1450-
const evaluate::Operation<evaluate::Subtract<T>, Ts...> &op) {
1445+
template <typename T> Operator OperationCode(const Subtract<T> &op) {
14511446
return Operator::Sub;
14521447
}
14531448

1454-
template <typename T, typename... Ts>
1455-
Operator OperationCode(
1456-
const evaluate::Operation<evaluate::Multiply<T>, Ts...> &op) {
1449+
template <typename T> Operator OperationCode(const Multiply<T> &op) {
14571450
return Operator::Mul;
14581451
}
14591452

1460-
template <typename T, typename... Ts>
1461-
Operator OperationCode(
1462-
const evaluate::Operation<evaluate::Divide<T>, Ts...> &op) {
1453+
template <typename T> Operator OperationCode(const Divide<T> &op) {
14631454
return Operator::Div;
14641455
}
14651456

1466-
template <typename T, typename... Ts>
1467-
Operator OperationCode(
1468-
const evaluate::Operation<evaluate::Power<T>, Ts...> &op) {
1457+
template <typename T> Operator OperationCode(const Power<T> &op) {
14691458
return Operator::Pow;
14701459
}
14711460

1472-
template <typename T, typename... Ts>
1473-
Operator OperationCode(
1474-
const evaluate::Operation<evaluate::RealToIntPower<T>, Ts...> &op) {
1461+
template <typename T> Operator OperationCode(const RealToIntPower<T> &op) {
14751462
return Operator::Pow;
14761463
}
14771464

1478-
template <typename T, common::TypeCategory C, typename... Ts>
1479-
Operator OperationCode(
1480-
const evaluate::Operation<evaluate::Convert<T, C>, Ts...> &op) {
1465+
template <typename T, common::TypeCategory C>
1466+
Operator OperationCode(const Convert<T, C> &op) {
14811467
if constexpr (C == T::category) {
14821468
return Operator::Resize;
14831469
} else {
14841470
return Operator::Convert;
14851471
}
14861472
}
14871473

1488-
template <typename T, typename... Ts>
1489-
Operator OperationCode(
1490-
const evaluate::Operation<evaluate::Extremum<T>, Ts...> &op) {
1491-
if (op.derived().ordering == evaluate::Ordering::Greater) {
1474+
template <typename T> Operator OperationCode(const Extremum<T> &op) {
1475+
if (op.ordering == Ordering::Greater) {
14921476
return Operator::Max;
14931477
} else {
14941478
return Operator::Min;
14951479
}
14961480
}
14971481

1498-
template <typename T> Operator OperationCode(const evaluate::Constant<T> &x) {
1482+
template <typename T> Operator OperationCode(const Constant<T> &x) {
14991483
return Operator::Constant;
15001484
}
15011485

1486+
template <typename T> Operator OperationCode(const Designator<T> &x) {
1487+
return Operator::Identity;
1488+
}
1489+
15021490
template <typename T> Operator OperationCode(const T &) {
15031491
return Operator::Unknown;
15041492
}
15051493

1506-
Operator OperationCode(const evaluate::ProcedureDesignator &proc);
1494+
Operator OperationCode(const ProcedureDesignator &proc);
15071495

15081496
} // namespace operation
15091497

flang/lib/Evaluate/tools.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,17 +1693,17 @@ struct ArgumentExtractor
16931693
// to int(kind=4) for example.
16941694
return (*this)(x.template operand<0>());
16951695
} else {
1696-
return std::make_pair(operation::OperationCode(x),
1696+
return std::make_pair(operation::OperationCode(x.derived()),
16971697
OperationArgs(x, std::index_sequence_for<Os...>{}));
16981698
}
16991699
}
17001700

17011701
template <typename T> Result operator()(const Designator<T> &x) const {
1702-
return {operation::Operator::Identity, {AsSomeExpr(x)}};
1702+
return {operation::OperationCode(x), {AsSomeExpr(x)}};
17031703
}
17041704

17051705
template <typename T> Result operator()(const Constant<T> &x) const {
1706-
return {operation::Operator::Identity, {AsSomeExpr(x)}};
1706+
return {operation::OperationCode(x), {AsSomeExpr(x)}};
17071707
}
17081708

17091709
template <typename... Rs>
@@ -1793,6 +1793,10 @@ std::string operation::ToString(operation::Operator op) {
17931793
llvm_unreachable("Unhandler operator");
17941794
}
17951795

1796+
operation::Operator operation::OperationCode(const Relational<SomeType> &op) {
1797+
return common::visit([](auto &&s) { return OperationCode(s); }, op.u);
1798+
}
1799+
17961800
operation::Operator operation::OperationCode(const ProcedureDesignator &proc) {
17971801
Operator code{llvm::StringSwitch<Operator>(proc.GetName())
17981802
.Case("associated", Operator::Associated)

flang/test/Semantics/OpenMP/atomic04.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ subroutine more_invalid_atomic_update_stmts()
180180
x = x
181181

182182
!$omp atomic update
183-
!ERROR: The atomic variable x should appear as an argument in the update operation
183+
!ERROR: This is not a valid ATOMIC UPDATE operation
184184
x = 1
185185

186186
!$omp atomic update

flang/test/Semantics/OpenMP/atomic05.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ program OmpAtomic
1919
x = 2 * 4
2020
!ERROR: At most one clause from the 'memory-order' group is allowed on ATOMIC construct
2121
!$omp atomic update release, seq_cst
22-
!ERROR: The atomic variable x should appear as an argument in the update operation
22+
!ERROR: This is not a valid ATOMIC UPDATE operation
2323
x = 10
2424
!ERROR: At most one clause from the 'memory-order' group is allowed on ATOMIC construct
2525
!$omp atomic capture release, seq_cst

0 commit comments

Comments
 (0)