diff --git a/tensorflow/core/grappler/optimizers/graph_optimizer_stage.cc b/tensorflow/core/grappler/optimizers/graph_optimizer_stage.cc
index 4e955db2f5a..f584b8d1548 100644
--- a/tensorflow/core/grappler/optimizers/graph_optimizer_stage.cc
+++ b/tensorflow/core/grappler/optimizers/graph_optimizer_stage.cc
@@ -84,11 +84,14 @@ NodeDef* AddCopyNode(const GraphOptimizerContext& ctx, const string& name,
 }
 
 NodeDef* AddEmptyNode(const GraphOptimizerContext& ctx, const string& name) {
-  CHECK(!ctx.node_map->NodeExists(name))
-      << "Node " << name << " already exists in a graph";
+  std::string new_name = name;
+  for (int count = 0; ctx.node_map->NodeExists(new_name); ++count) {
+    LOG(WARNING) << name << " already exists in the graph.";
+    new_name = absl::StrCat(name, "_", count);
+  }
   NodeDef* new_node = ctx.optimized_graph->add_node();
-  new_node->set_name(name);
-  ctx.node_map->AddNode(name, new_node);
+  new_node->set_name(new_name);
+  ctx.node_map->AddNode(new_name, new_node);
   return new_node;
 }
 
diff --git a/tensorflow/core/grappler/optimizers/graph_optimizer_stage_test.cc b/tensorflow/core/grappler/optimizers/graph_optimizer_stage_test.cc
index 678db7be83f..b0e923803d6 100644
--- a/tensorflow/core/grappler/optimizers/graph_optimizer_stage_test.cc
+++ b/tensorflow/core/grappler/optimizers/graph_optimizer_stage_test.cc
@@ -228,6 +228,10 @@ TEST_F(GraphOptimizerStageTest, AddNodes) {
   NodeDef* empty_node_by_name;
   TF_CHECK_OK(stage.GetInputNode("Add_2", &empty_node_by_name));
   EXPECT_EQ(empty_node, empty_node_by_name);
+
+  // Check that AddEmptyNode adds a unique suffix if the node already exists.
+  NodeDef* unique_empty_node = stage.AddEmptyNode("Add_2");
+  EXPECT_EQ(unique_empty_node->name(), "Add_2_0");
 }
 
 }  // namespace