diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index a6f3f5a..b8b4a3b 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -20,7 +20,7 @@
 namespace art {
 
 void HGraph::AddBlock(HBasicBlock* block) {
-  block->set_block_id(blocks_.Size());
+  block->SetBlockId(blocks_.Size());
   blocks_.Add(block);
 }
 
@@ -33,8 +33,8 @@
   for (size_t i = 0; i < blocks_.Size(); i++) {
     if (!visited.IsBitSet(i)) {
       HBasicBlock* block = blocks_.Get(i);
-      for (size_t j = 0; j < block->successors()->Size(); j++) {
-        block->successors()->Get(j)->RemovePredecessor(block);
+      for (size_t j = 0; j < block->GetSuccessors()->Size(); j++) {
+        block->GetSuccessors()->Get(j)->RemovePredecessor(block);
       }
     }
   }
@@ -43,14 +43,14 @@
 void HGraph::VisitBlockForBackEdges(HBasicBlock* block,
                                     ArenaBitVector* visited,
                                     ArenaBitVector* visiting) const {
-  int id = block->block_id();
+  int id = block->GetBlockId();
   if (visited->IsBitSet(id)) return;
 
   visited->SetBit(id);
   visiting->SetBit(id);
-  for (size_t i = 0; i < block->successors()->Size(); i++) {
-    HBasicBlock* successor = block->successors()->Get(i);
-    if (visiting->IsBitSet(successor->block_id())) {
+  for (size_t i = 0; i < block->GetSuccessors()->Size(); i++) {
+    HBasicBlock* successor = block->GetSuccessors()->Get(i);
+    if (visiting->IsBitSet(successor->GetBlockId())) {
       successor->AddBackEdge(block);
     } else {
       VisitBlockForBackEdges(successor, visited, visiting);
@@ -76,8 +76,8 @@
   GrowableArray<size_t> visits(arena_, blocks_.Size());
   visits.SetSize(blocks_.Size());
   dominator_order_.Add(entry_block_);
-  for (size_t i = 0; i < entry_block_->successors()->Size(); i++) {
-    VisitBlockForDominatorTree(entry_block_->successors()->Get(i), entry_block_, &visits);
+  for (size_t i = 0; i < entry_block_->GetSuccessors()->Size(); i++) {
+    VisitBlockForDominatorTree(entry_block_->GetSuccessors()->Get(i), entry_block_, &visits);
   }
 }
 
@@ -85,15 +85,15 @@
   ArenaBitVector visited(arena_, blocks_.Size(), false);
   // Walk the dominator tree of the first block and mark the visited blocks.
   while (first != nullptr) {
-    visited.SetBit(first->block_id());
-    first = first->dominator();
+    visited.SetBit(first->GetBlockId());
+    first = first->GetDominator();
   }
   // Walk the dominator tree of the second block until a marked block is found.
   while (second != nullptr) {
-    if (visited.IsBitSet(second->block_id())) {
+    if (visited.IsBitSet(second->GetBlockId())) {
       return second;
     }
-    second = second->dominator();
+    second = second->GetDominator();
   }
   LOG(ERROR) << "Could not find common dominator";
   return nullptr;
@@ -102,28 +102,29 @@
 void HGraph::VisitBlockForDominatorTree(HBasicBlock* block,
                                         HBasicBlock* predecessor,
                                         GrowableArray<size_t>* visits) {
-  if (block->dominator() == nullptr) {
-    block->set_dominator(predecessor);
+  if (block->GetDominator() == nullptr) {
+    block->SetDominator(predecessor);
   } else {
-    block->set_dominator(FindCommonDominator(block->dominator(), predecessor));
+    block->SetDominator(FindCommonDominator(block->GetDominator(), predecessor));
   }
 
-  visits->Increment(block->block_id());
+  visits->Increment(block->GetBlockId());
   // Once all the forward edges have been visited, we know the immediate
   // dominator of the block. We can then start visiting its successors.
-  if (visits->Get(block->block_id()) ==
-      block->predecessors()->Size() - block->NumberOfBackEdges()) {
+  if (visits->Get(block->GetBlockId()) ==
+      block->GetPredecessors()->Size() - block->NumberOfBackEdges()) {
     dominator_order_.Add(block);
-    for (size_t i = 0; i < block->successors()->Size(); i++) {
-      VisitBlockForDominatorTree(block->successors()->Get(i), block, visits);
+    for (size_t i = 0; i < block->GetSuccessors()->Size(); i++) {
+      VisitBlockForDominatorTree(block->GetSuccessors()->Get(i), block, visits);
     }
   }
 }
 
 void HBasicBlock::AddInstruction(HInstruction* instruction) {
-  DCHECK(instruction->block() == nullptr);
-  instruction->set_block(this);
-  instruction->set_id(graph()->GetNextInstructionId());
+  DCHECK(instruction->GetBlock() == nullptr);
+  DCHECK(instruction->GetId() == -1);
+  instruction->SetBlock(this);
+  instruction->SetId(GetGraph()->GetNextInstructionId());
   if (first_instruction_ == nullptr) {
     DCHECK(last_instruction_ == nullptr);
     first_instruction_ = last_instruction_ = instruction;
@@ -147,7 +148,7 @@
 #undef DEFINE_ACCEPT
 
 void HGraphVisitor::VisitInsertionOrder() {
-  const GrowableArray<HBasicBlock*>* blocks = graph_->blocks();
+  const GrowableArray<HBasicBlock*>* blocks = graph_->GetBlocks();
   for (size_t i = 0 ; i < blocks->Size(); i++) {
     VisitBasicBlock(blocks->Get(i));
   }
