tvm
Loading...
Searching...
No Matches
expr.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// Acknowledgement: Many low-level IR nodes originate from Halide.
25#ifndef TVM_IR_PRIM_EXPR_H_
26#define TVM_IR_PRIM_EXPR_H_
27
28#include <tvm/ffi/container/array.h>
29#include <tvm/ffi/container/map.h>
30#include <tvm/ffi/dtype.h>
31#include <tvm/ffi/string.h>
32#include <tvm/ir/attrs.h>
33#include <tvm/ir/cow.h>
34#include <tvm/ir/expr.h>
35#include <tvm/ir/node_functor.h>
37#include <tvm/runtime/base.h>
38
39#include <algorithm>
40#include <iostream>
41#include <limits>
42#include <string>
43#include <unordered_map>
44#include <utility>
45
46namespace tvm {
47namespace prim {
48
51
53class StringImmNode : public ExprNode {
54 public:
56 ffi::String value;
57 static void RegisterReflection() {
58 namespace refl = tvm::ffi::reflection;
59 refl::ObjectDef<StringImmNode>().def_ro("value", &StringImmNode::value);
60 }
62};
63
75
80class CastNode : public ExprNode {
81 public:
84 static void RegisterReflection() {
85 namespace refl = tvm::ffi::reflection;
86 refl::ObjectDef<CastNode>().def_ro("value", &CastNode::value);
87 }
89};
90
102
107template <typename T>
108class BinaryOpNode : public ExprNode {
109 public:
114 static void RegisterReflection() {
115 namespace refl = tvm::ffi::reflection;
116 refl::ObjectDef<T>().def_ro("a", &T::a).def_ro("b", &T::b);
117 }
118 static const constexpr int _type_child_slots [[maybe_unused]] = 0;
119 static const constexpr bool _type_final [[maybe_unused]] = true;
121};
122
124class AddNode : public BinaryOpNode<AddNode> {
125 public:
126 static constexpr const char* _type_key = "ir.prim.Add";
127};
128
140
142class SubNode : public BinaryOpNode<SubNode> {
143 public:
144 static constexpr const char* _type_key = "ir.prim.Sub";
145};
146
159
161class MulNode : public BinaryOpNode<MulNode> {
162 public:
163 static constexpr const char* _type_key = "ir.prim.Mul";
164};
165
177
182class DivNode : public BinaryOpNode<DivNode> {
183 public:
184 static constexpr const char* _type_key = "ir.prim.Div";
185};
186
198
203class ModNode : public BinaryOpNode<ModNode> {
204 public:
205 static constexpr const char* _type_key = "ir.prim.Mod";
206};
207
219
221class FloorDivNode : public BinaryOpNode<FloorDivNode> {
222 public:
223 static constexpr const char* _type_key = "ir.prim.FloorDiv";
224};
225
237
239class FloorModNode : public BinaryOpNode<FloorModNode> {
240 public:
241 static constexpr const char* _type_key = "ir.prim.FloorMod";
242};
243
255
257class MinNode : public BinaryOpNode<MinNode> {
258 public:
259 static constexpr const char* _type_key = "ir.prim.Min";
260};
261
273
275class MaxNode : public BinaryOpNode<MaxNode> {
276 public:
277 static constexpr const char* _type_key = "ir.prim.Max";
278};
279
291
296template <typename T>
297class CmpOpNode : public ExprNode {
298 public:
303 static void RegisterReflection() {
304 namespace refl = tvm::ffi::reflection;
305 refl::ObjectDef<T>().def_ro("a", &T::a).def_ro("b", &T::b);
306 }
307 static const constexpr int _type_child_slots [[maybe_unused]] = 0;
308 static const constexpr bool _type_final [[maybe_unused]] = true;
310};
311
313class EQNode : public CmpOpNode<EQNode> {
314 public:
315 static constexpr const char* _type_key = "ir.prim.EQ";
316};
317
329
331class NENode : public CmpOpNode<NENode> {
332 public:
333 static constexpr const char* _type_key = "ir.prim.NE";
334};
335
347
349class LTNode : public CmpOpNode<LTNode> {
350 public:
351 static constexpr const char* _type_key = "ir.prim.LT";
352};
353
365
367struct LENode : public CmpOpNode<LENode> {
368 public:
369 static constexpr const char* _type_key = "ir.prim.LE";
370};
371
383
385class GTNode : public CmpOpNode<GTNode> {
386 public:
387 static constexpr const char* _type_key = "ir.prim.GT";
388};
389
401
403class GENode : public CmpOpNode<GENode> {
404 public:
405 static constexpr const char* _type_key = "ir.prim.GE";
406};
407
419
421class AndNode : public ExprNode {
422 public:
427 static void RegisterReflection() {
428 namespace refl = tvm::ffi::reflection;
429 refl::ObjectDef<AndNode>().def_ro("a", &AndNode::a).def_ro("b", &AndNode::b);
430 }
432};
433
445
447class OrNode : public ExprNode {
448 public:
453 static void RegisterReflection() {
454 namespace refl = tvm::ffi::reflection;
455 refl::ObjectDef<OrNode>().def_ro("a", &OrNode::a).def_ro("b", &OrNode::b);
456 }
458};
459
471
473class NotNode : public ExprNode {
474 public:
477 static void RegisterReflection() {
478 namespace refl = tvm::ffi::reflection;
479 refl::ObjectDef<NotNode>().def_ro("a", &NotNode::a);
480 }
482};
483
495
503class SelectNode : public ExprNode {
504 public:
511 static void RegisterReflection() {
512 namespace refl = tvm::ffi::reflection;
513 refl::ObjectDef<SelectNode>()
514 .def_ro("condition", &SelectNode::condition)
515 .def_ro("true_value", &SelectNode::true_value)
516 .def_ro("false_value", &SelectNode::false_value);
517 }
519};
520
533
537class LetNode : public ExprNode {
538 public:
545 static void RegisterReflection() {
546 namespace refl = tvm::ffi::reflection;
547 refl::ObjectDef<LetNode>()
548 // TODO(tqchen): use SEqHashDefNonRecursive after the next pypi tvm-ffi release
549 .def_ro("var", &LetNode::var, refl::AttachFieldFlag::SEqHashDefRecursive())
550 .def_ro("value", &LetNode::value)
551 .def_ro("body", &LetNode::body);
552 }
554};
555
567
568/*
569 * \brief Template function to convert Map to unordered_map
570 * Sometimes useful for API gluing when internal uses unordered_map
571 * \param dmap The container map
572 * \return The corresponding unordered_map.
573 * \tparam K the key of the Map.
574 * \tparam V the value of the Map.
575 */
576template <typename K, typename V>
577inline std::unordered_map<K, V> as_unordered_map(const ffi::Map<K, V>& dmap) {
578 std::unordered_map<K, V> ret;
579 for (auto kv : dmap) {
580 ret[kv.first] = kv.second;
581 }
582 return ret;
583}
584} // namespace prim
585
586namespace ffi {
587
588template <>
589inline constexpr bool object_ref_contains_v<PrimExpr, prim::StringImmNode> = true;
590template <>
591inline constexpr bool object_ref_contains_v<PrimExpr, prim::CastNode> = true;
592template <>
593inline constexpr bool object_ref_contains_v<PrimExpr, prim::AddNode> = true;
594template <>
595inline constexpr bool object_ref_contains_v<PrimExpr, prim::SubNode> = true;
596template <>
597inline constexpr bool object_ref_contains_v<PrimExpr, prim::MulNode> = true;
598template <>
599inline constexpr bool object_ref_contains_v<PrimExpr, prim::DivNode> = true;
600template <>
601inline constexpr bool object_ref_contains_v<PrimExpr, prim::ModNode> = true;
602template <>
603inline constexpr bool object_ref_contains_v<PrimExpr, prim::FloorDivNode> = true;
604template <>
605inline constexpr bool object_ref_contains_v<PrimExpr, prim::FloorModNode> = true;
606template <>
607inline constexpr bool object_ref_contains_v<PrimExpr, prim::MinNode> = true;
608template <>
609inline constexpr bool object_ref_contains_v<PrimExpr, prim::MaxNode> = true;
610template <>
611inline constexpr bool object_ref_contains_v<PrimExpr, prim::EQNode> = true;
612template <>
613inline constexpr bool object_ref_contains_v<PrimExpr, prim::NENode> = true;
614template <>
615inline constexpr bool object_ref_contains_v<PrimExpr, prim::LTNode> = true;
616template <>
617inline constexpr bool object_ref_contains_v<PrimExpr, prim::LENode> = true;
618template <>
619inline constexpr bool object_ref_contains_v<PrimExpr, prim::GTNode> = true;
620template <>
621inline constexpr bool object_ref_contains_v<PrimExpr, prim::GENode> = true;
622template <>
623inline constexpr bool object_ref_contains_v<PrimExpr, prim::AndNode> = true;
624template <>
625inline constexpr bool object_ref_contains_v<PrimExpr, prim::OrNode> = true;
626template <>
627inline constexpr bool object_ref_contains_v<PrimExpr, prim::NotNode> = true;
628template <>
629inline constexpr bool object_ref_contains_v<PrimExpr, prim::SelectNode> = true;
630template <>
631inline constexpr bool object_ref_contains_v<PrimExpr, prim::RampNode> = true;
632template <>
633inline constexpr bool object_ref_contains_v<PrimExpr, prim::BroadcastNode> = true;
634template <>
635inline constexpr bool object_ref_contains_v<PrimExpr, prim::LetNode> = true;
636template <>
637inline constexpr bool object_ref_contains_v<PrimExpr, prim::ShuffleNode> = true;
638template <>
639inline constexpr bool use_default_type_traits_v<tvm::prim::StringImm> = false;
640
641template <>
642struct TypeTraits<tvm::prim::StringImm>
643 : public ObjectRefWithFallbackTraitsBase<tvm::prim::StringImm, ffi::String> {
645 return tvm::prim::StringImm(value);
646 }
647};
648} // namespace ffi
649} // namespace tvm
650
651#endif // TVM_IR_PRIM_EXPR_H_
Helpers for attribute objects.
Base type of all the expressions.
Definition base_expr.h:300
Constant floating point literals in the program.
Definition expr.h:550
Constant integer literals in the program.
Definition expr.h:487
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:401
Definition base_expr.h:137
Definition source_map.h:111
Managed reference to VarNode.
Definition expr.h:372
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
a + b
Definition expr.h:124
static constexpr const char * _type_key
Definition expr.h:126
Managed reference to AddNode.
Definition expr.h:133
Add(PrimExpr a, PrimExpr b, Span span=Span())
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Add, PrimExpr, AddNode)
static constexpr bool _type_container_is_exact
Definition expr.h:137
TVM_DEFINE_OBJECT_REF_COW_METHOD(AddNode)
a && b
Definition expr.h:421
PrimExpr b
The right operand.
Definition expr.h:426
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.And", AndNode, ExprNode)
static void RegisterReflection()
Definition expr.h:427
PrimExpr a
The left operand.
Definition expr.h:424
Managed reference to AndNode.
Definition expr.h:438
And(PrimExpr a, PrimExpr b, Span span=Span())
TVM_DEFINE_OBJECT_REF_COW_METHOD(AndNode)
static constexpr bool _type_container_is_exact
Definition expr.h:442
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(And, PrimExpr, AndNode)
Base template to implement binary ops.
Definition expr.h:108
static const constexpr int _type_child_slots
Definition expr.h:118
TVM_FFI_DECLARE_OBJECT_INFO_PREDEFINED_TYPE_KEY(T, ExprNode)
static void RegisterReflection()
Definition expr.h:114
PrimExpr a
The left operand.
Definition expr.h:111
PrimExpr b
The right operand.
Definition expr.h:113
static const constexpr bool _type_final
Definition expr.h:119
Cast value from one data type to another.
Definition expr.h:80
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.Cast", CastNode, ExprNode)
PrimExpr value
Original data type.
Definition expr.h:83
static void RegisterReflection()
Definition expr.h:84
Managed reference to CastNode.
Definition expr.h:95
static constexpr bool _type_container_is_exact
Definition expr.h:99
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Cast, PrimExpr, CastNode)
TVM_DEFINE_OBJECT_REF_COW_METHOD(CastNode)
Cast(PrimType value_ty, PrimExpr value, Span span=Span())
Base template to implement comparison ops.
Definition expr.h:297
static const constexpr bool _type_final
Definition expr.h:308
PrimExpr b
The right operand.
Definition expr.h:302
PrimExpr a
The left operand.
Definition expr.h:300
TVM_FFI_DECLARE_OBJECT_INFO_PREDEFINED_TYPE_KEY(T, ExprNode)
static void RegisterReflection()
Definition expr.h:303
static const constexpr int _type_child_slots
Definition expr.h:307
a / b in the C semnatics.
Definition expr.h:182
static constexpr const char * _type_key
Definition expr.h:184
Managed reference to DivNode.
Definition expr.h:191
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Div, PrimExpr, DivNode)
TVM_DEFINE_OBJECT_REF_COW_METHOD(DivNode)
Div(PrimExpr a, PrimExpr b, Span span=Span())
static constexpr bool _type_container_is_exact
Definition expr.h:195
a == b
Definition expr.h:313
static constexpr const char * _type_key
Definition expr.h:315
Managed reference to EQNode.
Definition expr.h:322
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(EQ, PrimExpr, EQNode)
EQ(PrimExpr a, PrimExpr b, Span span=Span())
static constexpr bool _type_container_is_exact
Definition expr.h:326
TVM_DEFINE_OBJECT_REF_COW_METHOD(EQNode)
Floor division, floor(a/b)
Definition expr.h:221
static constexpr const char * _type_key
Definition expr.h:223
Managed reference to FloorDivNode.
Definition expr.h:230
static constexpr bool _type_container_is_exact
Definition expr.h:234
FloorDiv(PrimExpr a, PrimExpr b, Span span=Span())
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(FloorDiv, PrimExpr, FloorDivNode)
TVM_DEFINE_OBJECT_REF_COW_METHOD(FloorDivNode)
The remainder of the floordiv.
Definition expr.h:239
static constexpr const char * _type_key
Definition expr.h:241
Managed reference to FloorModNode.
Definition expr.h:248
FloorMod(PrimExpr a, PrimExpr b, Span span=Span())
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(FloorMod, PrimExpr, FloorModNode)
static constexpr bool _type_container_is_exact
Definition expr.h:252
TVM_DEFINE_OBJECT_REF_COW_METHOD(FloorModNode)
a >= b
Definition expr.h:403
static constexpr const char * _type_key
Definition expr.h:405
Managed reference to GENode.
Definition expr.h:412
GE(PrimExpr a, PrimExpr b, Span span=Span())
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(GE, PrimExpr, GENode)
static constexpr bool _type_container_is_exact
Definition expr.h:416
TVM_DEFINE_OBJECT_REF_COW_METHOD(GENode)
a > b
Definition expr.h:385
static constexpr const char * _type_key
Definition expr.h:387
Managed reference to GTNode.
Definition expr.h:394
TVM_DEFINE_OBJECT_REF_COW_METHOD(GTNode)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(GT, PrimExpr, GTNode)
static constexpr bool _type_container_is_exact
Definition expr.h:398
GT(PrimExpr a, PrimExpr b, Span span=Span())
Managed reference to LENode.
Definition expr.h:376
TVM_DEFINE_OBJECT_REF_COW_METHOD(LENode)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(LE, PrimExpr, LENode)
static constexpr bool _type_container_is_exact
Definition expr.h:380
LE(PrimExpr a, PrimExpr b, Span span=Span())
a < b
Definition expr.h:349
static constexpr const char * _type_key
Definition expr.h:351
Managed reference to LTNode.
Definition expr.h:358
TVM_DEFINE_OBJECT_REF_COW_METHOD(LTNode)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(LT, PrimExpr, LTNode)
static constexpr bool _type_container_is_exact
Definition expr.h:362
LT(PrimExpr a, PrimExpr b, Span span=Span())
Let binding. Bind var to value then evaluate body.
Definition expr.h:537
PrimExpr value
The value to be binded.
Definition expr.h:542
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.Let", LetNode, ExprNode)
Var var
The variable.
Definition expr.h:540
static void RegisterReflection()
Definition expr.h:545
PrimExpr body
The result expression.
Definition expr.h:544
Managed reference to LetNode.
Definition expr.h:560
TVM_DEFINE_OBJECT_REF_COW_METHOD(LetNode)
static constexpr bool _type_container_is_exact
Definition expr.h:564
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Let, PrimExpr, LetNode)
Let(Var var, PrimExpr value, PrimExpr body, Span span=Span())
max(a, b)
Definition expr.h:275
static constexpr const char * _type_key
Definition expr.h:277
Managed reference to MaxNode.
Definition expr.h:284
TVM_DEFINE_OBJECT_REF_COW_METHOD(MaxNode)
Max(PrimExpr a, PrimExpr b, Span span=Span())
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Max, PrimExpr, MaxNode)
static constexpr bool _type_container_is_exact
Definition expr.h:288
min(a, b)
Definition expr.h:257
static constexpr const char * _type_key
Definition expr.h:259
Managed reference to MinNode.
Definition expr.h:266
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Min, PrimExpr, MinNode)
Min(PrimExpr a, PrimExpr b, Span span=Span())
static constexpr bool _type_container_is_exact
Definition expr.h:270
TVM_DEFINE_OBJECT_REF_COW_METHOD(MinNode)
a % b in the C semnatics.
Definition expr.h:203
static constexpr const char * _type_key
Definition expr.h:205
Managed reference to ModNode.
Definition expr.h:212
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Mod, PrimExpr, ModNode)
static constexpr bool _type_container_is_exact
Definition expr.h:216
Mod(PrimExpr a, PrimExpr b, Span span=Span())
TVM_DEFINE_OBJECT_REF_COW_METHOD(ModNode)
a * b
Definition expr.h:161
static constexpr const char * _type_key
Definition expr.h:163
Managed reference to MulNode.
Definition expr.h:170
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Mul, PrimExpr, MulNode)
TVM_DEFINE_OBJECT_REF_COW_METHOD(MulNode)
static constexpr bool _type_container_is_exact
Definition expr.h:174
Mul(PrimExpr a, PrimExpr b, Span span=Span())
a != b
Definition expr.h:331
static constexpr const char * _type_key
Definition expr.h:333
Managed reference to NENode.
Definition expr.h:340
TVM_DEFINE_OBJECT_REF_COW_METHOD(NENode)
NE(PrimExpr a, PrimExpr b, Span span=Span())
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(NE, PrimExpr, NENode)
static constexpr bool _type_container_is_exact
Definition expr.h:344
!a
Definition expr.h:473
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.Not", NotNode, ExprNode)
static void RegisterReflection()
Definition expr.h:477
PrimExpr a
The input operand.
Definition expr.h:476
Managed reference to NotNode.
Definition expr.h:488
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Not, PrimExpr, NotNode)
static constexpr bool _type_container_is_exact
Definition expr.h:492
TVM_DEFINE_OBJECT_REF_COW_METHOD(NotNode)
Not(PrimExpr a, Span span=Span())
a || b
Definition expr.h:447
PrimExpr b
The right operand.
Definition expr.h:452
static void RegisterReflection()
Definition expr.h:453
PrimExpr a
The left operand.
Definition expr.h:450
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.Or", OrNode, ExprNode)
Managed reference to OrNode.
Definition expr.h:464
TVM_DEFINE_OBJECT_REF_COW_METHOD(OrNode)
Or(PrimExpr a, PrimExpr b, Span span=Span())
static constexpr bool _type_container_is_exact
Definition expr.h:468
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Or, PrimExpr, OrNode)
return true_value if condition is true, otherwise return false_value.
Definition expr.h:503
PrimExpr false_value
value to be returned when condition is false.
Definition expr.h:510
PrimExpr true_value
value to be returned when condition is true.
Definition expr.h:508
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.Select", SelectNode, ExprNode)
PrimExpr condition
The condition.
Definition expr.h:506
static void RegisterReflection()
Definition expr.h:511
Managed reference to SelectNode.
Definition expr.h:525
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Select, PrimExpr, SelectNode)
static constexpr bool _type_container_is_exact
Definition expr.h:530
TVM_DEFINE_OBJECT_REF_COW_METHOD(SelectNode)
Select(PrimExpr condition, PrimExpr true_value, PrimExpr false_value, Span span=Span())
ffi::String constants, only used in asserts.
Definition expr.h:53
ffi::String value
The constant value content.
Definition expr.h:56
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("ir.prim.StringImm", StringImmNode, ExprNode)
static void RegisterReflection()
Definition expr.h:57
Managed reference to StringImmNode.
Definition expr.h:68
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(StringImm, PrimExpr, StringImmNode)
TVM_DEFINE_OBJECT_REF_COW_METHOD(StringImmNode)
static constexpr bool _type_container_is_exact
Definition expr.h:72
StringImm(ffi::String value, Span span=Span())
a - b
Definition expr.h:142
static constexpr const char * _type_key
Definition expr.h:144
Managed reference to SubNode.
Definition expr.h:151
TVM_DEFINE_OBJECT_REF_COW_METHOD(SubNode)
static constexpr bool _type_container_is_exact
Definition expr.h:156
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(Sub, PrimExpr, SubNode)
Sub(PrimExpr a, PrimExpr b, Span span=Span())
Copy-on-write helper macro for IR ffi::ObjectRef types.
Base expr nodes in TVM.
std::unordered_map< K, V > as_unordered_map(const ffi::Map< K, V > &dmap)
Definition expr.h:577
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition analyzer.h:40
Defines the Functor data structures.
static TVM_FFI_INLINE tvm::prim::StringImm ConvertFallbackValue(ffi::String value)
Definition expr.h:644
a <= b
Definition expr.h:367
static constexpr const char * _type_key
Definition expr.h:369
Primitive vector expressions.