diff options
author | 2018-09-06 14:13:56 -0700 | |
---|---|---|
committer | 2018-09-06 14:23:53 -0700 | |
commit | 76a5936cd283d9a32c89635577b2da9c8e46785b (patch) | |
tree | 2c34f17ff00e23c2e8f06fb1fbee3235c9b5ae42 /tensorflow/core/common_runtime/function.cc | |
parent | 64fd29ca227707a4c6212638346a6b92885bf18a (diff) |
Enable unused "_Arg" nodes to be pruned from a function body.
Previously, because "_Arg" nodes are considered to be "stateful", these nodes were unconditionally included in the seed set of nodes for pruning a function body. Since an "_Arg" node has no visible side effect, we can safely prune these, which makes small projection functions (like `lambda x, y: y`) more efficient.
PiperOrigin-RevId: 211867380
Diffstat (limited to 'tensorflow/core/common_runtime/function.cc')
-rw-r--r-- | tensorflow/core/common_runtime/function.cc | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/tensorflow/core/common_runtime/function.cc b/tensorflow/core/common_runtime/function.cc index b00e526309..1c9b69721d 100644 --- a/tensorflow/core/common_runtime/function.cc +++ b/tensorflow/core/common_runtime/function.cc @@ -615,11 +615,14 @@ void PruneFunctionBody(Graph* g) { std::unordered_set<const Node*> nodes; for (auto n : g->nodes()) { // NOTE(mrry): "_Retval" nodes are stateful, and so will be added - // to the seed set of `nodes`. + // to the seed set of `nodes`. "_Arg" nodes are also stateful, but we + // specifically exclude them as seeds, to avoid unconditionally executing + // unused argument nodes (e.g. in a function like `lambda x, y: y`). // TODO(mrry): Investigate whether the `n->IsControlFlow()` test is // still needed. It would be preferable to prune entire loops and/or // conditionals if they are not used in the graph. - if (n->IsControlFlow() || n->op_def().is_stateful()) { + if (n->IsControlFlow() || + (n->op_def().is_stateful() && n->type_string() != kArgOp)) { nodes.insert(n); } } |