ARM64: Avoid iterating through unresolved branches information when unnecessary.
authoralexandre.rames@arm.com <alexandre.rames@arm.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 2 Apr 2014 16:31:58 +0000 (16:31 +0000)
committeralexandre.rames@arm.com <alexandre.rames@arm.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 2 Apr 2014 16:31:58 +0000 (16:31 +0000)
R=ulan@chromium.org

Review URL: https://codereview.chromium.org/217343007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20444 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/arm64/assembler-arm64.cc

index 8bee92c..ad2997c 100644 (file)
@@ -456,6 +456,8 @@ void Assembler::bind(Label* label) {
   ASSERT(!label->is_near_linked());
   ASSERT(!label->is_bound());
 
+  DeleteUnresolvedBranchInfoForLabel(label);
+
   // If the label is linked, the link chain looks something like this:
   //
   // |--I----I-------I-------L
@@ -497,8 +499,6 @@ void Assembler::bind(Label* label) {
 
   ASSERT(label->is_bound());
   ASSERT(!label->is_linked());
-
-  DeleteUnresolvedBranchInfoForLabel(label);
 }
 
 
@@ -551,14 +551,16 @@ void Assembler::DeleteUnresolvedBranchInfoForLabel(Label* label) {
     return;
   }
 
-  // Branches to this label will be resolved when the label is bound below.
-  std::multimap<int, FarBranchInfo>::iterator it_tmp, it;
-  it = unresolved_branches_.begin();
-  while (it != unresolved_branches_.end()) {
-    it_tmp = it++;
-    if (it_tmp->second.label_ == label) {
-      CHECK(it_tmp->first >= pc_offset());
-      unresolved_branches_.erase(it_tmp);
+  if (label->is_linked()) {
+    // Branches to this label will be resolved when the label is bound below.
+    std::multimap<int, FarBranchInfo>::iterator it_tmp, it;
+    it = unresolved_branches_.begin();
+    while (it != unresolved_branches_.end()) {
+      it_tmp = it++;
+      if (it_tmp->second.label_ == label) {
+        CHECK(it_tmp->first >= pc_offset());
+        unresolved_branches_.erase(it_tmp);
+      }
     }
   }
   if (unresolved_branches_.empty()) {