Skip to content

[flang][NFC] Move new code to right place #144551

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 148 additions & 0 deletions flang/include/flang/Evaluate/tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -1389,6 +1389,154 @@ inline bool HasCUDAImplicitTransfer(const Expr<SomeType> &expr) {
return (hasConstant || (hostSymbols > 0)) && deviceSymbols > 0;
}

// Checks whether the symbol on the LHS is present in the RHS expression.
bool CheckForSymbolMatch(const Expr<SomeType> *lhs, const Expr<SomeType> *rhs);

namespace operation {

enum class Operator {
Unknown,
Add,
And,
Associated,
Call,
Constant,
Convert,
Div,
Eq,
Eqv,
False,
Ge,
Gt,
Identity,
Intrinsic,
Le,
Lt,
Max,
Min,
Mul,
Ne,
Neqv,
Not,
Or,
Pow,
Resize, // Convert within the same TypeCategory
Sub,
True,
};

std::string ToString(Operator op);

template <typename... Ts, int Kind>
Operator OperationCode(
const evaluate::Operation<evaluate::LogicalOperation<Kind>, Ts...> &op) {
switch (op.derived().logicalOperator) {
case common::LogicalOperator::And:
return Operator::And;
case common::LogicalOperator::Or:
return Operator::Or;
case common::LogicalOperator::Eqv:
return Operator::Eqv;
case common::LogicalOperator::Neqv:
return Operator::Neqv;
case common::LogicalOperator::Not:
return Operator::Not;
}
return Operator::Unknown;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Relational<T>, Ts...> &op) {
switch (op.derived().opr) {
case common::RelationalOperator::LT:
return Operator::Lt;
case common::RelationalOperator::LE:
return Operator::Le;
case common::RelationalOperator::EQ:
return Operator::Eq;
case common::RelationalOperator::NE:
return Operator::Ne;
case common::RelationalOperator::GE:
return Operator::Ge;
case common::RelationalOperator::GT:
return Operator::Gt;
}
return Operator::Unknown;
}

template <typename T, typename... Ts>
Operator OperationCode(const evaluate::Operation<evaluate::Add<T>, Ts...> &op) {
return Operator::Add;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Subtract<T>, Ts...> &op) {
return Operator::Sub;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Multiply<T>, Ts...> &op) {
return Operator::Mul;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Divide<T>, Ts...> &op) {
return Operator::Div;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Power<T>, Ts...> &op) {
return Operator::Pow;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::RealToIntPower<T>, Ts...> &op) {
return Operator::Pow;
}

template <typename T, common::TypeCategory C, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Convert<T, C>, Ts...> &op) {
if constexpr (C == T::category) {
return Operator::Resize;
} else {
return Operator::Convert;
}
}

template <typename T> Operator OperationCode(const evaluate::Constant<T> &x) {
return Operator::Constant;
}

template <typename T> Operator OperationCode(const T &) {
return Operator::Unknown;
}

Operator OperationCode(const evaluate::ProcedureDesignator &proc);

} // namespace operation

// Return information about the top-level operation (ignoring parentheses):
// the operation code and the list of arguments.
std::pair<operation::Operator, std::vector<Expr<SomeType>>>
GetTopLevelOperation(const Expr<SomeType> &expr);

// Check if expr is same as x, or a sequence of Convert operations on x.
bool IsSameOrConvertOf(const Expr<SomeType> &expr, const Expr<SomeType> &x);

// Strip away any top-level Convert operations (if any exist) and return
// the input value. A ComplexConstructor(x, 0) is also considered as a
// convert operation.
// If the input is not Operation, Designator, FunctionRef or Constant,
// it returns std::nullopt.
std::optional<Expr<SomeType>> GetConvertInput(const Expr<SomeType> &x);

} // namespace Fortran::evaluate

namespace Fortran::semantics {
Expand Down
149 changes: 0 additions & 149 deletions flang/include/flang/Semantics/tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -756,154 +756,5 @@ std::string GetCommonBlockObjectName(const Symbol &, bool underscoring);
// Check for ambiguous USE associations
bool HadUseError(SemanticsContext &, SourceName at, const Symbol *);

// Checks whether the symbol on the LHS is present in the RHS expression.
bool CheckForSymbolMatch(const SomeExpr *lhs, const SomeExpr *rhs);

namespace operation {

enum class Operator {
Unknown,
Add,
And,
Associated,
Call,
Constant,
Convert,
Div,
Eq,
Eqv,
False,
Ge,
Gt,
Identity,
Intrinsic,
Le,
Lt,
Max,
Min,
Mul,
Ne,
Neqv,
Not,
Or,
Pow,
Resize, // Convert within the same TypeCategory
Sub,
True,
};

std::string ToString(Operator op);

template <typename... Ts, int Kind>
Operator OperationCode(
const evaluate::Operation<evaluate::LogicalOperation<Kind>, Ts...> &op) {
switch (op.derived().logicalOperator) {
case common::LogicalOperator::And:
return Operator::And;
case common::LogicalOperator::Or:
return Operator::Or;
case common::LogicalOperator::Eqv:
return Operator::Eqv;
case common::LogicalOperator::Neqv:
return Operator::Neqv;
case common::LogicalOperator::Not:
return Operator::Not;
}
return Operator::Unknown;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Relational<T>, Ts...> &op) {
switch (op.derived().opr) {
case common::RelationalOperator::LT:
return Operator::Lt;
case common::RelationalOperator::LE:
return Operator::Le;
case common::RelationalOperator::EQ:
return Operator::Eq;
case common::RelationalOperator::NE:
return Operator::Ne;
case common::RelationalOperator::GE:
return Operator::Ge;
case common::RelationalOperator::GT:
return Operator::Gt;
}
return Operator::Unknown;
}

template <typename T, typename... Ts>
Operator OperationCode(const evaluate::Operation<evaluate::Add<T>, Ts...> &op) {
return Operator::Add;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Subtract<T>, Ts...> &op) {
return Operator::Sub;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Multiply<T>, Ts...> &op) {
return Operator::Mul;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Divide<T>, Ts...> &op) {
return Operator::Div;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Power<T>, Ts...> &op) {
return Operator::Pow;
}

template <typename T, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::RealToIntPower<T>, Ts...> &op) {
return Operator::Pow;
}

template <typename T, common::TypeCategory C, typename... Ts>
Operator OperationCode(
const evaluate::Operation<evaluate::Convert<T, C>, Ts...> &op) {
if constexpr (C == T::category) {
return Operator::Resize;
} else {
return Operator::Convert;
}
}

template <typename T> //
Operator OperationCode(const evaluate::Constant<T> &x) {
return Operator::Constant;
}

template <typename T> //
Operator OperationCode(const T &) {
return Operator::Unknown;
}

Operator OperationCode(const evaluate::ProcedureDesignator &proc);

} // namespace operation

/// Return information about the top-level operation (ignoring parentheses):
/// the operation code and the list of arguments.
std::pair<operation::Operator, std::vector<SomeExpr>> GetTopLevelOperation(
const SomeExpr &expr);

/// Check if expr is same as x, or a sequence of Convert operations on x.
bool IsSameOrConvertOf(const SomeExpr &expr, const SomeExpr &x);

/// Strip away any top-level Convert operations (if any exist) and return
/// the input value. A ComplexConstructor(x, 0) is also considered as a
/// convert operation.
/// If the input is not Operation, Designator, FunctionRef or Constant,
/// it returns std::nullopt.
MaybeExpr GetConvertInput(const SomeExpr &x);
} // namespace Fortran::semantics
#endif // FORTRAN_SEMANTICS_TOOLS_H_
Loading
Loading