Merge "Don't print signatures to avoid spaces."
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc
index 883c983..54155db 100644
--- a/compiler/optimizing/builder.cc
+++ b/compiler/optimizing/builder.cc
@@ -346,11 +346,19 @@
         // Catch blocks are always considered an entry point into the TryItem in
         // order to avoid splitting exceptional edges (they might not have been
         // created yet). We separate the move-exception (if present) from the
-        // rest of the block and insert a TryBoundary after it.
-        HInstruction* split_position = try_block->GetFirstInstruction();
-        if (split_position->IsLoadException()) {
-          DCHECK(split_position->GetNext()->IsStoreLocal());
-          split_position = split_position->GetNext()->GetNext();
+        // rest of the block and insert a TryBoundary after it, creating a
+        // landing pad for the exceptional edges.
+        HInstruction* first_insn = try_block->GetFirstInstruction();
+        HInstruction* split_position = nullptr;
+        if (first_insn->IsLoadException()) {
+          // Catch block starts with a LoadException. Split the block after the
+          // StoreLocal that must come after the load.
+          DCHECK(first_insn->GetNext()->IsStoreLocal());
+          split_position = first_insn->GetNext()->GetNext();
+        } else {
+          // Catch block does not obtain the exception. Split at the beginning
+          // to create an empty catch block.
+          split_position = first_insn;
         }
         DCHECK(split_position != nullptr);
         HBasicBlock* catch_block = try_block;
diff --git a/compiler/optimizing/builder.h b/compiler/optimizing/builder.h
index 9744a55..cae762b 100644
--- a/compiler/optimizing/builder.h
+++ b/compiler/optimizing/builder.h
@@ -98,9 +98,19 @@
   HBasicBlock* FindBlockStartingAt(int32_t dex_pc) const;
   HBasicBlock* FindOrCreateBlockStartingAt(int32_t dex_pc);
 
+  // Returns whether the dex_pc of `block` lies within the given range.
   bool IsBlockInPcRange(HBasicBlock* block, uint32_t dex_pc_start, uint32_t dex_pc_end);
+
+  // Adds new blocks to `branch_targets_` starting at the limits of TryItems and
+  // their exception handlers.
   void CreateBlocksForTryCatch(const DexFile::CodeItem& code_item);
+
+  // Splits edges which cross the boundaries of TryItems, inserts TryBoundary
+  // instructions and links them to the corresponding catch blocks.
   void InsertTryBoundaryBlocks(const DexFile::CodeItem& code_item);
+
+  // Splits a single edge, inserting a TryBoundary of given `kind` and linking
+  // it to exception handlers of `try_item`.
   void SplitTryBoundaryEdge(HBasicBlock* predecessor,
                             HBasicBlock* successor,
                             HTryBoundary::BoundaryKind kind,
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 5c10245..04c3963 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -1957,8 +1957,6 @@
 
   bool IsControlFlow() const OVERRIDE { return true; }
 
-  bool CanThrow() const OVERRIDE { return true; }
-
   // Returns the block's non-exceptional successor (index zero).
   HBasicBlock* GetNormalFlowSuccessor() const { return GetBlock()->GetSuccessors().Get(0); }