tvm
Loading...
Searching...
No Matches
constant_utils.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
24#ifndef TVM_TOPI_DETAIL_CONSTANT_UTILS_H_
25#define TVM_TOPI_DETAIL_CONSTANT_UTILS_H_
26
27#include <tvm/ir/prim/expr.h>
28#include <tvm/runtime/logging.h>
29#include <tvm/sym/analyzer.h>
30#include <tvm/te/operation.h>
31
32#include <string>
33#include <vector>
34
35namespace tvm {
36namespace topi {
37namespace detail {
38
39using namespace tvm::te;
40
48inline bool IsConstInt(PrimExpr expr) { return expr->IsInstance<tvm::IntImmNode>(); }
49
58inline bool IsConstIntArray(ffi::Array<PrimExpr> array) {
59 bool IsConstInt = true;
60 for (auto const& elem : array) {
61 IsConstInt &= !elem.defined() || elem->IsInstance<tvm::IntImmNode>();
62 }
63 return IsConstInt;
64}
65
74inline int64_t GetConstInt(PrimExpr expr) {
75 if (expr->IsInstance<tvm::IntImmNode>()) {
76 return static_cast<int64_t>(expr.as<tvm::IntImmNode>()->value);
77 }
78 LOG(ERROR) << "expr must be a constant integer";
79 return -1;
80}
81
91inline std::vector<int> GetConstIntValues(ffi::Array<PrimExpr> exprs, const std::string& var_name) {
92 std::vector<int> result;
93 if (!exprs.defined()) return result;
94 for (auto expr : exprs) {
95 TVM_FFI_ICHECK(IsConstInt(expr))
96 << "All elements of " << var_name << " must be constant integers";
97 result.push_back(GetConstInt(expr));
98 }
99 return result;
100}
101
111inline std::vector<int64_t> GetConstInt64Values(ffi::Array<PrimExpr> exprs,
112 const std::string& var_name) {
113 std::vector<int64_t> result;
114 if (!exprs.defined()) return result;
115 for (auto expr : exprs) {
116 TVM_FFI_ICHECK(IsConstInt(expr))
117 << "All elements of " << var_name << " must be constant integers";
118 result.push_back(GetConstInt(expr));
119 }
120 return result;
121}
122
131inline bool EqualCheck(PrimExpr lhs, PrimExpr rhs) {
132 tvm::prim::ExprDeepEqual expr_equal;
133 bool result = expr_equal(lhs, rhs);
134 if (!result) {
135 PrimExpr t = tvm::sym::Analyzer()->Simplify(lhs - rhs);
136 if (const IntImmNode* i = t.as<IntImmNode>()) {
137 result = i->value == 0;
138 }
139 }
140 return result;
141}
142
143} // namespace detail
144} // namespace topi
145} // namespace tvm
146#endif // TVM_TOPI_DETAIL_CONSTANT_UTILS_H_
Algebra expression simplifications.
Constant integer literals in the program.
Definition expr.h:135
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:447
Managed reference to AnalyzerObj.
Definition analyzer.h:916
TIR expressions.
bool IsConstInt(const PrimExpr &x, int64_t value)
Check whether x is a constant integer expression.
Definition op.h:787
Tensor expression language DSL.
Definition extracted_task.h:33
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23
Operation node can generate one or multiple Tensors.
Compare two expressions recursively and check if they are equal to each other without var remapping.
Definition expr.h:795