spirv-reader: add namer::IsRegistered

Change-Id: I014132f9a655c7f52ebce4b141f6ea5235e828f1
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49140
Auto-Submit: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/reader/spirv/namer.cc b/src/reader/spirv/namer.cc
index d23a0c3..9c5385f 100644
--- a/src/reader/spirv/namer.cc
+++ b/src/reader/spirv/namer.cc
@@ -105,17 +105,16 @@
 std::string Namer::FindUnusedDerivedName(const std::string& base_name) const {
   // Ensure uniqueness among names.
   std::string derived_name;
-  for (int i = 0;; i++) {
+  int i = 0;
+  do {
     std::stringstream new_name_stream;
     new_name_stream << base_name;
     if (i > 0) {
       new_name_stream << "_" << i;
     }
+    i++;
     derived_name = new_name_stream.str();
-    if (name_to_id_.count(derived_name) == 0) {
-      break;
-    }
-  }
+  } while (IsRegistered(derived_name));
   return derived_name;
 }
 
diff --git a/src/reader/spirv/namer.h b/src/reader/spirv/namer.h
index c889e83..5957ae5 100644
--- a/src/reader/spirv/namer.h
+++ b/src/reader/spirv/namer.h
@@ -57,6 +57,12 @@
     return id_to_name_.find(id) != id_to_name_.end();
   }
 
+  /// @param name a string
+  /// @returns true if the string has been registered as a name.
+  bool IsRegistered(const std::string& name) const {
+    return name_to_id_.find(name) != name_to_id_.end();
+  }
+
   /// @param id the SPIR-V ID
   /// @returns the name for the ID. It must have been registered.
   const std::string& GetName(uint32_t id) const {
diff --git a/src/reader/spirv/namer_test.cc b/src/reader/spirv/namer_test.cc
index 027223a..52e38e1 100644
--- a/src/reader/spirv/namer_test.cc
+++ b/src/reader/spirv/namer_test.cc
@@ -100,6 +100,24 @@
   EXPECT_THAT(namer.FindUnusedDerivedName("rigby"), Eq("rigby_2"));
 }
 
+TEST_F(SpvNamerTest, IsRegistered_NoRecordedName) {
+  Namer namer(fail_stream_);
+  EXPECT_FALSE(namer.IsRegistered("abbey"));
+}
+
+TEST_F(SpvNamerTest, IsRegistered_RegisteredById) {
+  Namer namer(fail_stream_);
+  namer.SaveName(1, "abbey");
+  EXPECT_TRUE(namer.IsRegistered("abbey"));
+}
+
+TEST_F(SpvNamerTest, IsRegistered_RegisteredByDerivation) {
+  Namer namer(fail_stream_);
+  const auto got = namer.MakeDerivedName("abbey");
+  EXPECT_TRUE(namer.IsRegistered("abbey"));
+  EXPECT_EQ(got, "abbey");
+}
+
 TEST_F(SpvNamerTest, MakeDerivedName_NoRecordedName) {
   Namer namer(fail_stream_);
   EXPECT_THAT(namer.MakeDerivedName("eleanor"), Eq("eleanor"));