@@ -203,10 +203,10 @@ class BlockBuilderNode::ExprNormalizer : public ExprFunctor<Expr(const Expr&)> {
203203
204204 private:
205205 /* !
206- * \brief Memoization map for expressions using Id for equality of variables.
207- */
206+ * \brief Memoization map for expressions using Id for equality of variables.
207+ */
208208 class ExprMemo {
209- public:
209+ public:
210210 Optional<Expr> Get (const Expr& expr) {
211211 if (const VarNode* var = expr.as <VarNode>()) {
212212 auto it = var_memo_.find (var->vid );
@@ -230,7 +230,7 @@ class BlockBuilderNode::ExprNormalizer : public ExprFunctor<Expr(const Expr&)> {
230230 }
231231 }
232232
233- private:
233+ private:
234234 std::unordered_map<Id, Expr, ObjectPtrHash, ObjectPtrEqual> var_memo_;
235235 std::unordered_map<Expr, Expr, ObjectPtrHash, ObjectPtrEqual> expr_memo_;
236236 };
@@ -370,7 +370,9 @@ Var BlockBuilderNode::Emit(const Expr& expr, bool is_dataflow, std::string name_
370370Var BlockBuilderNode::Emit (const VarBinding& binding) {
371371 BlockFrame* cur_frame = CurrentFrame ();
372372 if (cur_frame->is_dataflow ) {
373- ICHECK (binding->var .as <DataflowVarNode>());
373+ ICHECK (binding->var .as <DataflowVarNode>())
374+ << " Emit can only be used for local bindings in a dataflow block, use EmitOutput for "
375+ " output bindings instead" ;
374376 }
375377 cur_frame->bindings .push_back (binding);
376378 binding_table_[binding->var ->vid ] = binding->value ;
@@ -408,9 +410,11 @@ Var BlockBuilderNode::EmitMatchShape(const Expr& value, const Array<PrimExpr>& p
408410
409411Var BlockBuilderNode::EmitMatchShape (const MatchShape& binding) {
410412 BlockFrame* cur_frame = CurrentFrame ();
411- if (cur_frame->is_dataflow && binding->var .defined ()) {
412- ICHECK (!binding->var .as <DataflowVarNode>())
413- << " cannot bind DataflowVar outside dataflow block." ;
413+ if (binding->var .defined ()) {
414+ ICHECK (!cur_frame->is_dataflow || binding->var .as <DataflowVarNode>())
415+ << " EmitMatchShape can only be used for local bindings in a dataflow block." ;
416+ ICHECK (cur_frame->is_dataflow || !binding->var .as <DataflowVarNode>())
417+ << " cannot emit dataflow vars outside a dataflow block: " << binding->var ->name_hint ();
414418 }
415419 cur_frame->bindings .push_back (binding);
416420 // TODO(@altanh, @yuchen): what value should we bind? Consider
@@ -511,13 +515,9 @@ BlockBuilderNode::BlockFrame* BlockBuilderNode::CurrentFrame() {
511515 return &block_stack_.top ();
512516}
513517
514- NameTable* BlockBuilderNode::name_table () {
515- return name_table_.get ();
516- }
518+ NameTable* BlockBuilderNode::name_table () { return name_table_.get (); }
517519
518- BlockBuilder BlockBuilder::Create () {
519- return BlockBuilder (make_object<BlockBuilderNode>());
520- }
520+ BlockBuilder BlockBuilder::Create () { return BlockBuilder (make_object<BlockBuilderNode>()); }
521521
522522TVM_REGISTER_GLOBAL (" relax.BlockBuilderCreate" ).set_body_typed(BlockBuilder::Create);
523523
0 commit comments