diff --git a/grudge/execution.py b/grudge/execution.py
index ca6b7dd99c7108fd1a5a39b3770dde4d6c940e87..0241c82b532c9167c60362917a08c73123c385df 100644
--- a/grudge/execution.py
+++ b/grudge/execution.py
@@ -323,23 +323,6 @@ class ExecutionMapper(mappers.Evaluator,
         return [(insn.name,
             self.discr._discr_scoped_subexpr_name_to_value[insn.name])], []
 
-    def exec_vector_expr_assign(self, insn):
-        if self.bound_op.instrumented:
-            def stats_callback(n, vec_expr):
-                self.bound_op.vector_math_flop_counter.add(n*insn.flop_count())
-                return self.bound_op.vector_math_timer
-        else:
-            stats_callback = None
-
-        # FIXME: Reenable compiled vector exprs
-        if True:  # insn.flop_count() == 0:
-            return [(name, self(expr))
-                for name, expr in zip(insn.names, insn.exprs)], []
-        else:
-            compiled = insn.compiled(self.bound_op)
-            return zip(compiled.result_names(),
-                    compiled(self, stats_callback)), []
-
     def exec_diff_batch_assign(self, insn):
         field = self.rec(insn.field)
         repr_op = insn.operators[0]
diff --git a/grudge/symbolic/compiler.py b/grudge/symbolic/compiler.py
index 47822baa495040c9d1ce99798770ea7c83b45908..fc4ad5f016c522c4c362190dca4ae76aedd5cbd5 100644
--- a/grudge/symbolic/compiler.py
+++ b/grudge/symbolic/compiler.py
@@ -69,7 +69,38 @@ def _make_dep_mapper(include_subscripts):
             include_calls="descend_args")
 
 
-class Assign(Instruction):
+class AssignBase(Instruction):
+    comment = ""
+    scope_indicator = ""
+
+    def __str__(self):
+        comment = self.comment
+        if len(self.names) == 1:
+            if comment:
+                comment = "/* %s */ " % comment
+
+            return "%s <-%s %s%s" % (
+                    self.names[0], self.scope_indicator, comment,
+                    self.exprs[0])
+        else:
+            if comment:
+                comment = " /* %s */" % comment
+
+            lines = []
+            lines.append("{" + comment)
+            for n, e, dnr in zip(self.names, self.exprs, self.do_not_return):
+                if dnr:
+                    dnr_indicator = "-#"
+                else:
+                    dnr_indicator = ""
+
+                lines.append("  %s <%s-%s %s" % (
+                    n, dnr_indicator, self.scope_indicator, e))
+            lines.append("}")
+            return "\n".join(lines)
+
+
+class Assign(AssignBase):
     """
     .. attribute:: names
     .. attribute:: exprs
@@ -82,9 +113,6 @@ class Assign(Instruction):
     .. attribute:: is_scalar_valued
     """
 
-    comment = ""
-    scope_indicator = ""
-
     def __init__(self, names, exprs, **kwargs):
         Instruction.__init__(self, names=names, exprs=exprs, **kwargs)
 
@@ -115,32 +143,6 @@ class Assign(Instruction):
 
         return deps
 
-    def __str__(self):
-        comment = self.comment
-        if len(self.names) == 1:
-            if comment:
-                comment = "/* %s */ " % comment
-
-            return "%s <-%s %s%s" % (
-                    self.names[0], self.scope_indicator, comment,
-                    self.exprs[0])
-        else:
-            if comment:
-                comment = " /* %s */" % comment
-
-            lines = []
-            lines.append("{" + comment)
-            for n, e, dnr in zip(self.names, self.exprs, self.do_not_return):
-                if dnr:
-                    dnr_indicator = "-#"
-                else:
-                    dnr_indicator = ""
-
-                lines.append("  %s <%s-%s %s" % (
-                    n, dnr_indicator, self.scope_indicator, e))
-            lines.append("}")
-            return "\n".join(lines)
-
     def get_execution_method(self, exec_mapper):
         return exec_mapper.exec_assign
 
@@ -152,11 +154,15 @@ class ToDiscretizationScopedAssign(Assign):
         return exec_mapper.exec_assign_to_discr_scoped
 
 
-class FromDiscretizationScopedAssign(Assign):
+class FromDiscretizationScopedAssign(AssignBase):
     scope_indicator = "(discr)-"
 
     def __init__(self, name, **kwargs):
-        Instruction.__init__(self, name=name, **kwargs)
+        super(FromDiscretizationScopedAssign, self).__init__(name=name, **kwargs)
+
+    @memoize_method
+    def flop_count(self):
+        return 0
 
     def get_assignees(self):
         return frozenset([self.name])
@@ -258,34 +264,6 @@ class FluxExchangeBatchAssign(Instruction):
     def get_execution_method(self, exec_mapper):
         return exec_mapper.exec_flux_exchange_batch_assign
 
-
-class VectorExprAssign(Assign):
-    """
-    .. attribute:: compiled
-    """
-
-    def get_execution_method(self, exec_mapper):
-        return exec_mapper.exec_vector_expr_assign
-
-    comment = "compiled"
-
-    @memoize_method
-    def compiled(self, exec_mapper):
-        discr = exec_mapper.discr
-
-        from grudge.backends.vector_expr import \
-                VectorExpressionInfo, simple_result_dtype_getter
-        from grudge.backends.cuda.vector_expr import CompiledVectorExpression
-        return CompiledVectorExpression(
-                [VectorExpressionInfo(
-                    name=name,
-                    expr=expr,
-                    do_not_return=dnr)
-                    for name, expr, dnr in zip(
-                        self.names, self.exprs, self.do_not_return)],
-                result_dtype_getter=simple_result_dtype_getter,
-                allocator=discr.pool.allocate)
-
 # }}}
 
 
@@ -336,7 +314,7 @@ def dot_dataflow_graph(code, max_node_label_length=30,
         for dep in insn.get_dependencies():
             gen_expr_arrow(dep, node_names[insn])
 
-    from grudge.tools import is_obj_array
+    from pytools.obj_array import is_obj_array
 
     if is_obj_array(code.result):
         for subexp in code.result:
@@ -370,38 +348,37 @@ class Code(object):
                 for insn in self.instructions
                 for var_name in insn.get_assignees())
 
-        if 1:
-            # {{{ topological sort
+        # {{{ topological sort
 
-            added_insns = set()
-            ordered_insns = []
+        added_insns = set()
+        ordered_insns = []
 
-            def insert_insn(insn):
-                if insn in added_insns:
-                    return
+        def insert_insn(insn):
+            if insn in added_insns:
+                return
 
-                for dep in insn.get_dependencies():
-                    try:
-                        writer = var_to_writer[dep.name]
-                    except KeyError:
-                        # input variables won't be found
-                        pass
-                    else:
-                        insert_insn(writer)
+            for dep in insn.get_dependencies():
+                try:
+                    writer = var_to_writer[dep.name]
+                except KeyError:
+                    # input variables won't be found
+                    pass
+                else:
+                    insert_insn(writer)
 
-                ordered_insns.append(insn)
-                added_insns.add(insn)
+            ordered_insns.append(insn)
+            added_insns.add(insn)
 
-            for insn in self.instructions:
-                insert_insn(insn)
+        for insn in self.instructions:
+            insert_insn(insn)
 
-            assert len(ordered_insns) == len(self.instructions)
-            assert len(added_insns) == len(self.instructions)
+        assert len(ordered_insns) == len(self.instructions)
+        assert len(added_insns) == len(self.instructions)
 
-            # }}}
+        # }}}
 
         lines = []
-        for insn in self.instructions:
+        for insn in ordered_insns:
             lines.extend(str(insn).split("\n"))
         lines.append("RESULT: " + str(self.result))
 
@@ -659,16 +636,17 @@ class OperatorCompiler(mappers.IdentityMapper):
         # Finally, walk the expression and build the code.
         result = super(OperatorCompiler, self).__call__(expr, codegen_state)
 
-        # FIXME: Reenable assignment aggregation
-        #return Code(self.aggregate_assignments(self.eval_code, result), result)
-
         from pytools.obj_array import make_obj_array
         return (
                 Code(self.discr_code,
                     make_obj_array(
                         [Variable(name)
                             for name in self.discr_scope_names_copied_to_eval])),
-                Code(self.eval_code, result))
+                Code(
+                    # FIXME: Enable
+                    #self.aggregate_assignments(self.eval_code, result),
+                    self.eval_code,
+                    result))
 
     # }}}
 
@@ -876,7 +854,8 @@ class OperatorCompiler(mappers.IdentityMapper):
 
         from pytools import partition
         unprocessed_assigns, other_insns = partition(
-                lambda insn: isinstance(insn, Assign) and not insn.is_scalar_valued,
+                # FIXME: Re-add check for scalar result, exclude
+                lambda insn: isinstance(insn, Assign),
                 instructions)
 
         # filter out zero-flop-count assigns--no need to bother with those
@@ -1023,7 +1002,7 @@ class OperatorCompiler(mappers.IdentityMapper):
     # }}}
 
     def finalize_multi_assign(self, names, exprs, do_not_return, priority):
-        return VectorExprAssign(names=names, exprs=exprs,
+        return Assign(names=names, exprs=exprs,
                 do_not_return=do_not_return,
                 priority=priority)
 
diff --git a/grudge/symbolic/mappers/__init__.py b/grudge/symbolic/mappers/__init__.py
index 3b8e764d186f08a5f8bd859caca1acfe1053b4e9..917fa61951b5ad48cd5ab4f3288e1fd662b8bd3f 100644
--- a/grudge/symbolic/mappers/__init__.py
+++ b/grudge/symbolic/mappers/__init__.py
@@ -272,7 +272,7 @@ class FlopCounter(
     def map_operator_binding(self, expr):
         return self.rec(expr.field)
 
-    def map_scalar_parameter(self, expr):
+    def map_grudge_variable(self, expr):
         return 0
 
     def map_c_function(self, expr):