diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc
index 6831e9b..3663448 100644
--- a/compiler/optimizing/builder.cc
+++ b/compiler/optimizing/builder.cc
@@ -1225,12 +1225,6 @@
   }
 }
 
-static Primitive::Type GetFieldAccessType(const DexFile& dex_file, uint16_t field_index) {
-  const DexFile::FieldId& field_id = dex_file.GetFieldId(field_index);
-  const char* type = dex_file.GetFieldTypeDescriptor(field_id);
-  return Primitive::GetType(type[0]);
-}
-
 bool HGraphBuilder::BuildInstanceFieldAccess(const Instruction& instruction,
                                              uint32_t dex_pc,
                                              bool is_put) {
@@ -1250,61 +1244,44 @@
   ArtField* resolved_field =
       compiler_driver_->ComputeInstanceFieldInfo(field_index, dex_compilation_unit_, is_put, soa);
 
+  if (resolved_field == nullptr) {
+    MaybeRecordStat(MethodCompilationStat::kNotCompiledUnresolvedField);
+    return false;
+  }
+
+  Primitive::Type field_type = resolved_field->GetTypeAsPrimitiveType();
 
   HInstruction* object = LoadLocal(obj_reg, Primitive::kPrimNot, dex_pc);
-  HInstruction* null_check = new (arena_) HNullCheck(object, dex_pc);
-  current_block_->AddInstruction(null_check);
-
-  Primitive::Type field_type = (resolved_field == nullptr)
-      ? GetFieldAccessType(*dex_file_, field_index)
-      : resolved_field->GetTypeAsPrimitiveType();
+  current_block_->AddInstruction(new (arena_) HNullCheck(object, dex_pc));
   if (is_put) {
     Temporaries temps(graph_);
+    HInstruction* null_check = current_block_->GetLastInstruction();
     // We need one temporary for the null check.
     temps.Add(null_check);
     HInstruction* value = LoadLocal(source_or_dest_reg, field_type, dex_pc);
-    HInstruction* field_set = nullptr;
-    if (resolved_field == nullptr) {
-      MaybeRecordStat(MethodCompilationStat::kUnresolvedField);
-      field_set = new (arena_) HUnresolvedInstanceFieldSet(null_check,
-                                                           value,
-                                                           field_type,
-                                                           field_index,
-                                                           dex_pc);
-    } else {
-      field_set = new (arena_) HInstanceFieldSet(null_check,
-                                                 value,
-                                                 field_type,
-                                                 resolved_field->GetOffset(),
-                                                 resolved_field->IsVolatile(),
-                                                 field_index,
-                                                 *dex_file_,
-                                                 dex_compilation_unit_->GetDexCache(),
-                                                 dex_pc);
-    }
-    current_block_->AddInstruction(field_set);
+    current_block_->AddInstruction(new (arena_) HInstanceFieldSet(
+        null_check,
+        value,
+        field_type,
+        resolved_field->GetOffset(),
+        resolved_field->IsVolatile(),
+        field_index,
+        *dex_file_,
+        dex_compilation_unit_->GetDexCache(),
+        dex_pc));
   } else {
-    HInstruction* field_get = nullptr;
-    if (resolved_field == nullptr) {
-      MaybeRecordStat(MethodCompilationStat::kUnresolvedField);
-      field_get = new (arena_) HUnresolvedInstanceFieldGet(null_check,
-                                                           field_type,
-                                                           field_index,
-                                                           dex_pc);
-    } else {
-      field_get = new (arena_) HInstanceFieldGet(null_check,
-                                                 field_type,
-                                                 resolved_field->GetOffset(),
-                                                 resolved_field->IsVolatile(),
-                                                 field_index,
-                                                 *dex_file_,
-                                                 dex_compilation_unit_->GetDexCache(),
-                                                 dex_pc);
-    }
-    current_block_->AddInstruction(field_get);
-    UpdateLocal(source_or_dest_reg, field_get, dex_pc);
-  }
+    current_block_->AddInstruction(new (arena_) HInstanceFieldGet(
+        current_block_->GetLastInstruction(),
+        field_type,
+        resolved_field->GetOffset(),
+        resolved_field->IsVolatile(),
+        field_index,
+        *dex_file_,
+        dex_compilation_unit_->GetDexCache(),
+        dex_pc));
 
+    UpdateLocal(source_or_dest_reg, current_block_->GetLastInstruction(), dex_pc);
+  }
   return true;
 }
 
@@ -1361,18 +1338,8 @@
       soa, dex_cache, class_loader, dex_compilation_unit_, field_index, true);
 
   if (resolved_field == nullptr) {
-    MaybeRecordStat(MethodCompilationStat::kUnresolvedField);
-    Primitive::Type field_type = GetFieldAccessType(*dex_file_, field_index);
-    if (is_put) {
-      HInstruction* value = LoadLocal(source_or_dest_reg, field_type, dex_pc);
-      current_block_->AddInstruction(
-          new (arena_) HUnresolvedStaticFieldSet(value, field_type, field_index, dex_pc));
-    } else {
-      current_block_->AddInstruction(
-          new (arena_) HUnresolvedStaticFieldGet(field_type, field_index, dex_pc));
-      UpdateLocal(source_or_dest_reg, current_block_->GetLastInstruction(), dex_pc);
-    }
-    return true;
+    MaybeRecordStat(MethodCompilationStat::kNotCompiledUnresolvedField);
+    return false;
   }
 
   const DexFile& outer_dex_file = *outer_compilation_unit_->GetDexFile();
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc
index 1b66121..3c6a41d 100644
--- a/compiler/optimizing/code_generator.cc
+++ b/compiler/optimizing/code_generator.cc
@@ -413,120 +413,6 @@
   InvokeRuntime(entrypoint, invoke, invoke->GetDexPc(), nullptr);
 }
 
-void CodeGenerator::CreateUnresolvedFieldLocationSummary(
-    HInstruction* field_access,
-    Primitive::Type field_type,
-    const FieldAccessCallingConvetion& calling_convention) {
-  bool is_instance = field_access->IsUnresolvedInstanceFieldGet()
-      || field_access->IsUnresolvedInstanceFieldSet();
-  bool is_get = field_access->IsUnresolvedInstanceFieldGet()
-      || field_access->IsUnresolvedStaticFieldGet();
-
-  ArenaAllocator* allocator = field_access->GetBlock()->GetGraph()->GetArena();
-  LocationSummary* locations =
-      new (allocator) LocationSummary(field_access, LocationSummary::kCall);
-
-  locations->AddTemp(calling_convention.GetFieldIndexLocation());
-
-  if (is_instance) {
-    // Add the `this` object for instance field accesses.
-    locations->SetInAt(0, calling_convention.GetObjectLocation());
-  }
-
-  // Note that pSetXXStatic/pGetXXStatic always takes/returns an int or int64
-  // regardless of the the type. Because of that we forced to special case
-  // the access to floating point values.
-  if (is_get) {
-    if (Primitive::IsFloatingPointType(field_type)) {
-      // The return value will be stored in regular registers while register
-      // allocator expects it in a floating point register. Allocate a temp for
-      // it and make the transfer at codegen.
-      AddLocationAsTemp(calling_convention.GetReturnLocation(field_type), locations);
-      locations->SetOut(calling_convention.GetFpuLocation(field_type));
-    } else {
-      locations->SetOut(calling_convention.GetReturnLocation(field_type));
-    }
-  } else {
-     size_t set_index = is_instance ? 1 : 0;
-     if (Primitive::IsFloatingPointType(field_type)) {
-      // The set value comes from a float location while the calling convention
-      // expects it in a regular register location. Allocate a temp for it and
-      // make the transfer at codegen.
-      AddLocationAsTemp(calling_convention.GetSetValueLocation(field_type, is_instance), locations);
-      locations->SetInAt(set_index, calling_convention.GetFpuLocation(field_type));
-    } else {
-      locations->SetInAt(set_index,
-          calling_convention.GetSetValueLocation(field_type, is_instance));
-    }
-  }
-}
-
-void CodeGenerator::GenerateUnresolvedFieldAccess(HInstruction* field_access,
-                                                  Primitive::Type field_type,
-                                                  uint32_t field_index,
-                                                  uint32_t dex_pc) {
-  LocationSummary* locations = field_access->GetLocations();
-
-  MoveConstant(locations->GetTemp(0), field_index);
-
-  bool is_instance = field_access->IsUnresolvedInstanceFieldGet()
-      || field_access->IsUnresolvedInstanceFieldSet();
-  bool is_get = field_access->IsUnresolvedInstanceFieldGet()
-      || field_access->IsUnresolvedStaticFieldGet();
-
-  if (!is_get && Primitive::IsFloatingPointType(field_type)) {
-    MoveLocationToTemp(locations->InAt(is_instance ? 1 : 0), *locations, 1, field_type);
-  }
-
-  QuickEntrypointEnum entrypoint = kQuickSet8Static;  // Initialize to anything to avoid warnings.
-  switch (field_type) {
-    case Primitive::kPrimBoolean:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGetBooleanInstance : kQuickSet8Instance)
-          : (is_get ? kQuickGetBooleanStatic : kQuickSet8Static);
-      break;
-    case Primitive::kPrimByte:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGetByteInstance : kQuickSet8Instance)
-          : (is_get ? kQuickGetByteStatic : kQuickSet8Static);
-      break;
-    case Primitive::kPrimShort:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGetShortInstance : kQuickSet16Instance)
-          : (is_get ? kQuickGetShortStatic : kQuickSet16Static);
-      break;
-    case Primitive::kPrimChar:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGetCharInstance : kQuickSet16Instance)
-          : (is_get ? kQuickGetCharStatic : kQuickSet16Static);
-      break;
-    case Primitive::kPrimInt:
-    case Primitive::kPrimFloat:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGet32Instance : kQuickSet32Instance)
-          : (is_get ? kQuickGet32Static : kQuickSet32Static);
-      break;
-    case Primitive::kPrimNot:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGetObjInstance : kQuickSetObjInstance)
-          : (is_get ? kQuickGetObjStatic : kQuickSetObjStatic);
-      break;
-    case Primitive::kPrimLong:
-    case Primitive::kPrimDouble:
-      entrypoint = is_instance
-          ? (is_get ? kQuickGet64Instance : kQuickSet64Instance)
-          : (is_get ? kQuickGet64Static : kQuickSet64Static);
-      break;
-    default:
-      LOG(FATAL) << "Invalid type " << field_type;
-  }
-  InvokeRuntime(entrypoint, field_access, dex_pc, nullptr);
-
-  if (is_get && Primitive::IsFloatingPointType(field_type)) {
-    MoveTempToLocation(*locations, 1, locations->Out(), field_type);
-  }
-}
-
 void CodeGenerator::BlockIfInRegister(Location location, bool is_out) const {
   // The DCHECKS below check that a register is not specified twice in
   // the summary. The out location can overlap with an input, so we need
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h
index 11478a4..a54dbf1 100644
--- a/compiler/optimizing/code_generator.h
+++ b/compiler/optimizing/code_generator.h
@@ -136,22 +136,6 @@
   DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitor);
 };
 
-class FieldAccessCallingConvetion {
- public:
-  virtual Location GetObjectLocation() const = 0;
-  virtual Location GetFieldIndexLocation() const = 0;
-  virtual Location GetReturnLocation(Primitive::Type type) const = 0;
-  virtual Location GetSetValueLocation(Primitive::Type type, bool is_instance) const = 0;
-  virtual Location GetFpuLocation(Primitive::Type type) const = 0;
-  virtual ~FieldAccessCallingConvetion() {}
-
- protected:
-  FieldAccessCallingConvetion() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetion);
-};
-
 class CodeGenerator {
  public:
   // Compiles the graph to executable instructions. Returns whether the compilation
@@ -186,16 +170,6 @@
   virtual void Bind(HBasicBlock* block) = 0;
   virtual void Move(HInstruction* instruction, Location location, HInstruction* move_for) = 0;
   virtual void MoveConstant(Location destination, int32_t value) = 0;
-  virtual void AddLocationAsTemp(Location location, LocationSummary* locations) = 0;
-  virtual void MoveLocationToTemp(Location source,
-                                  const LocationSummary& locations,
-                                  int temp_index,
-                                  Primitive::Type type) = 0;
-  virtual void MoveTempToLocation(const LocationSummary& locations,
-                                  int temp_index,
-                                  Location destination,
-                                  Primitive::Type type) = 0;
-
   virtual Assembler* GetAssembler() = 0;
   virtual const Assembler& GetAssembler() const = 0;
   virtual size_t GetWordSize() const = 0;
@@ -404,16 +378,6 @@
 
   void GenerateInvokeUnresolvedRuntimeCall(HInvokeUnresolved* invoke);
 
-  void CreateUnresolvedFieldLocationSummary(
-      HInstruction* field_access,
-      Primitive::Type field_type,
-      const FieldAccessCallingConvetion& calling_convention);
-
-  void GenerateUnresolvedFieldAccess(HInstruction* field_access,
-                                     Primitive::Type field_type,
-                                     uint32_t field_index,
-                                     uint32_t dex_pc);
-
   void SetDisassemblyInformation(DisassemblyInformation* info) { disasm_info_ = info; }
   DisassemblyInformation* GetDisassemblyInformation() const { return disasm_info_; }
 
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc
index 15fc446..6f89293 100644
--- a/compiler/optimizing/code_generator_arm.cc
+++ b/compiler/optimizing/code_generator_arm.cc
@@ -969,59 +969,6 @@
   __ LoadImmediate(location.AsRegister<Register>(), value);
 }
 
-void CodeGeneratorARM::AddLocationAsTemp(Location location, LocationSummary* locations) {
-  if (location.IsRegister()) {
-    locations->AddTemp(location);
-  } else if (location.IsRegisterPair()) {
-    locations->AddTemp(Location::RegisterLocation(location.AsRegisterPairLow<Register>()));
-    locations->AddTemp(Location::RegisterLocation(location.AsRegisterPairHigh<Register>()));
-  } else {
-    UNIMPLEMENTED(FATAL) << "AddLocationAsTemp not implemented for location " << location;
-  }
-}
-
-void CodeGeneratorARM::MoveLocationToTemp(Location source,
-                                          const LocationSummary& locations,
-                                          int temp_index,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  if (type == Primitive::kPrimFloat) {
-    DCHECK(source.IsFpuRegister()) << source;
-    __ vmovrs(locations.GetTemp(temp_index).AsRegister<Register>(),
-              source.AsFpuRegister<SRegister>());
-  } else {
-    DCHECK_EQ(type, Primitive::kPrimDouble) << type;
-    DCHECK(source.IsFpuRegisterPair()) << source;
-    __ vmovrrd(locations.GetTemp(temp_index).AsRegister<Register>(),
-               locations.GetTemp(temp_index + 1).AsRegister<Register>(),
-               FromLowSToD(source.AsFpuRegisterPairLow<SRegister>()));
-  }
-}
-
-void CodeGeneratorARM::MoveTempToLocation(const LocationSummary& locations,
-                                          int temp_index,
-                                          Location destination,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  if (type == Primitive::kPrimFloat) {
-    DCHECK(destination.IsFpuRegister()) << destination;
-    __ vmovsr(destination.AsFpuRegister<SRegister>(),
-              locations.GetTemp(temp_index).AsRegister<Register>());
-  } else {
-    DCHECK(type == Primitive::kPrimDouble);
-    DCHECK(destination.IsFpuRegisterPair()) << destination;
-    __ vmovdrr(FromLowSToD(destination.AsFpuRegisterPairLow<SRegister>()),
-               locations.GetTemp(temp_index).AsRegister<Register>(),
-               locations.GetTemp(temp_index + 1).AsRegister<Register>());
-  }
-}
-
 void CodeGeneratorARM::InvokeRuntime(QuickEntrypointEnum entrypoint,
                                      HInstruction* instruction,
                                      uint32_t dex_pc,
@@ -3589,66 +3536,6 @@
   HandleFieldSet(instruction, instruction->GetFieldInfo(), instruction->GetValueCanBeNull());
 }
 
-void LocationsBuilderARM::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  FieldAccessCallingConvetionARM calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderARM::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  FieldAccessCallingConvetionARM calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderARM::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  FieldAccessCallingConvetionARM calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderARM::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  FieldAccessCallingConvetionARM calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
 void LocationsBuilderARM::VisitNullCheck(HNullCheck* instruction) {
   LocationSummary::CallKind call_kind = instruction->CanThrowIntoCatchBlock()
       ? LocationSummary::kCallOnSlowPath
diff --git a/compiler/optimizing/code_generator_arm.h b/compiler/optimizing/code_generator_arm.h
index 651b31b..91cfd00 100644
--- a/compiler/optimizing/code_generator_arm.h
+++ b/compiler/optimizing/code_generator_arm.h
@@ -97,40 +97,6 @@
   DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitorARM);
 };
 
-class FieldAccessCallingConvetionARM : public FieldAccessCallingConvetion {
- public:
-  FieldAccessCallingConvetionARM() {}
-
-  Location GetObjectLocation() const OVERRIDE {
-    return Location::RegisterLocation(R1);
-  }
-  Location GetFieldIndexLocation() const OVERRIDE {
-    return Location::RegisterLocation(R0);
-  }
-  Location GetReturnLocation(Primitive::Type type) const OVERRIDE {
-    return Primitive::Is64BitType(type)
-        ? Location::RegisterPairLocation(R0, R1)
-        : Location::RegisterLocation(R0);
-  }
-  Location GetSetValueLocation(Primitive::Type type, bool is_instance) const OVERRIDE {
-    return Primitive::Is64BitType(type)
-        ? (is_instance
-            ? Location::RegisterPairLocation(R2, R3)
-            : Location::RegisterPairLocation(R1, R2))
-        : (is_instance
-            ? Location::RegisterLocation(R2)
-            : Location::RegisterLocation(R1));
-  }
-  Location GetFpuLocation(Primitive::Type type) const OVERRIDE {
-    return Primitive::Is64BitType(type)
-        ? Location::FpuRegisterPairLocation(S0, S1)
-        : Location::FpuRegisterLocation(S0);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetionARM);
-};
-
 class ParallelMoveResolverARM : public ParallelMoveResolverWithSwap {
  public:
   ParallelMoveResolverARM(ArenaAllocator* allocator, CodeGeneratorARM* codegen)
@@ -274,17 +240,6 @@
   void Bind(HBasicBlock* block) OVERRIDE;
   void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE;
   void MoveConstant(Location destination, int32_t value) OVERRIDE;
-
-  void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE;
-  void MoveLocationToTemp(Location source,
-                          const LocationSummary& locations,
-                          int temp_index,
-                          Primitive::Type type) OVERRIDE;
-  void MoveTempToLocation(const LocationSummary& locations,
-                          int temp_index,
-                          Location destination,
-                          Primitive::Type type) OVERRIDE;
-
   size_t SaveCoreRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
   size_t RestoreCoreRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
   size_t SaveFloatingPointRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index c774bf0..531b669 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -19,6 +19,7 @@
 #include "arch/arm64/instruction_set_features_arm64.h"
 #include "art_method.h"
 #include "code_generator_utils.h"
+#include "common_arm64.h"
 #include "compiled_method.h"
 #include "entrypoints/quick/quick_entrypoints.h"
 #include "entrypoints/quick/quick_entrypoints_enum.h"
@@ -720,46 +721,6 @@
   __ Mov(RegisterFrom(location, Primitive::kPrimInt), value);
 }
 
-void CodeGeneratorARM64::AddLocationAsTemp(Location location, LocationSummary* locations) {
-  if (location.IsRegister()) {
-    locations->AddTemp(location);
-  } else {
-    UNIMPLEMENTED(FATAL) << "AddLocationAsTemp not implemented for location " << location;
-  }
-}
-
-void CodeGeneratorARM64::MoveLocationToTemp(Location source,
-                                          const LocationSummary& locations,
-                                          int temp_index,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(source.IsFpuRegister()) << source;
-  Primitive::Type temp_type = Primitive::Is64BitType(type)
-      ? Primitive::kPrimLong
-      : Primitive::kPrimInt;
-  __ Fmov(RegisterFrom(locations.GetTemp(temp_index), temp_type),
-          FPRegisterFrom(source, type));
-}
-
-void CodeGeneratorARM64::MoveTempToLocation(const LocationSummary& locations,
-                                          int temp_index,
-                                          Location destination,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(destination.IsFpuRegister()) << destination;
-  Primitive::Type temp_type = Primitive::Is64BitType(type)
-      ? Primitive::kPrimLong
-      : Primitive::kPrimInt;
-  __ Fmov(FPRegisterFrom(destination, type),
-          RegisterFrom(locations.GetTemp(temp_index), temp_type));
-}
-
 Location CodeGeneratorARM64::GetStackLocation(HLoadLocal* load) const {
   Primitive::Type type = load->GetType();
 
@@ -3199,66 +3160,6 @@
   HandleFieldSet(instruction, instruction->GetFieldInfo(), instruction->GetValueCanBeNull());
 }
 
-void LocationsBuilderARM64::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  FieldAccessCallingConvetionARM64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM64::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderARM64::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  FieldAccessCallingConvetionARM64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM64::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderARM64::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  FieldAccessCallingConvetionARM64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM64::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderARM64::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  FieldAccessCallingConvetionARM64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorARM64::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
 void LocationsBuilderARM64::VisitSuspendCheck(HSuspendCheck* instruction) {
   new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCallOnSlowPath);
 }
diff --git a/compiler/optimizing/code_generator_arm64.h b/compiler/optimizing/code_generator_arm64.h
index 3218002..576406e 100644
--- a/compiler/optimizing/code_generator_arm64.h
+++ b/compiler/optimizing/code_generator_arm64.h
@@ -18,7 +18,6 @@
 #define ART_COMPILER_OPTIMIZING_CODE_GENERATOR_ARM64_H_
 
 #include "code_generator.h"
-#include "common_arm64.h"
 #include "dex/compiler_enums.h"
 #include "driver/compiler_options.h"
 #include "nodes.h"
@@ -142,31 +141,6 @@
   DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitorARM64);
 };
 
-class FieldAccessCallingConvetionARM64 : public FieldAccessCallingConvetion {
- public:
-  FieldAccessCallingConvetionARM64() {}
-
-  Location GetObjectLocation() const OVERRIDE {
-    return helpers::LocationFrom(vixl::x1);
-  }
-  Location GetFieldIndexLocation() const OVERRIDE {
-    return helpers::LocationFrom(vixl::x0);
-  }
-  Location GetReturnLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return helpers::LocationFrom(vixl::x0);
-  }
-  Location GetSetValueLocation(
-      Primitive::Type type ATTRIBUTE_UNUSED, bool is_instance) const OVERRIDE {
-    return is_instance ? helpers::LocationFrom(vixl::x2) : helpers::LocationFrom(vixl::x1);
-  }
-  Location GetFpuLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return helpers::LocationFrom(vixl::d0);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetionARM64);
-};
-
 class InstructionCodeGeneratorARM64 : public HGraphVisitor {
  public:
   InstructionCodeGeneratorARM64(HGraph* graph, CodeGeneratorARM64* codegen);
@@ -369,17 +343,6 @@
   // locations, and is used for optimisation and debugging.
   void MoveLocation(Location destination, Location source,
                     Primitive::Type type = Primitive::kPrimVoid);
-
-  void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE;
-  void MoveLocationToTemp(Location source,
-                          const LocationSummary& locations,
-                          int temp_index,
-                          Primitive::Type type) OVERRIDE;
-  void MoveTempToLocation(const LocationSummary& locations,
-                          int temp_index,
-                          Location destination,
-                          Primitive::Type type) OVERRIDE;
-
   void Load(Primitive::Type type, vixl::CPURegister dst, const vixl::MemOperand& src);
   void Store(Primitive::Type type, vixl::CPURegister rt, const vixl::MemOperand& dst);
   void LoadAcquire(HInstruction* instruction, vixl::CPURegister dst, const vixl::MemOperand& src);
diff --git a/compiler/optimizing/code_generator_mips64.cc b/compiler/optimizing/code_generator_mips64.cc
index d521d78..bf0d2e2 100644
--- a/compiler/optimizing/code_generator_mips64.cc
+++ b/compiler/optimizing/code_generator_mips64.cc
@@ -861,52 +861,6 @@
   __ LoadConst32(location.AsRegister<GpuRegister>(), value);
 }
 
-void CodeGeneratorMIPS64::AddLocationAsTemp(Location location, LocationSummary* locations) {
-  if (location.IsRegister()) {
-    locations->AddTemp(location);
-  } else {
-    UNIMPLEMENTED(FATAL) << "AddLocationAsTemp not implemented for location " << location;
-  }
-}
-
-void CodeGeneratorMIPS64::MoveLocationToTemp(Location source,
-                                          const LocationSummary& locations,
-                                          int temp_index,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(source.IsFpuRegister()) << source;
-  if (type == Primitive::kPrimFloat) {
-    __ Mfc1(locations.GetTemp(temp_index).AsRegister<GpuRegister>(),
-            source.AsFpuRegister<FpuRegister>());
-  } else {
-    DCHECK_EQ(type, Primitive::kPrimDouble);
-    __ Dmfc1(locations.GetTemp(temp_index).AsRegister<GpuRegister>(),
-             source.AsFpuRegister<FpuRegister>());
-  }
-}
-
-void CodeGeneratorMIPS64::MoveTempToLocation(const LocationSummary& locations,
-                                          int temp_index,
-                                          Location destination,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(destination.IsFpuRegister()) << destination;
-  if (type == Primitive::kPrimFloat) {
-    __ Mtc1(locations.GetTemp(temp_index).AsRegister<GpuRegister>(),
-            destination.AsFpuRegister<FpuRegister>());
-  } else {
-    DCHECK_EQ(type, Primitive::kPrimDouble);
-    __ Dmtc1(locations.GetTemp(temp_index).AsRegister<GpuRegister>(),
-             destination.AsFpuRegister<FpuRegister>());
-  }
-}
-
 Location CodeGeneratorMIPS64::GetStackLocation(HLoadLocal* load) const {
   Primitive::Type type = load->GetType();
 
@@ -3154,66 +3108,6 @@
   HandleFieldSet(instruction, instruction->GetFieldInfo());
 }
 
-void LocationsBuilderMIPS64::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  FieldAccessCallingConvetionMIPS64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorMIPS64::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderMIPS64::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  FieldAccessCallingConvetionMIPS64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorMIPS64::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderMIPS64::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  FieldAccessCallingConvetionMIPS64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorMIPS64::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderMIPS64::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  FieldAccessCallingConvetionMIPS64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorMIPS64::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
 void LocationsBuilderMIPS64::VisitSuspendCheck(HSuspendCheck* instruction) {
   new (GetGraph()->GetArena()) LocationSummary(instruction, LocationSummary::kCallOnSlowPath);
 }
diff --git a/compiler/optimizing/code_generator_mips64.h b/compiler/optimizing/code_generator_mips64.h
index cac94c7..8511eb6 100644
--- a/compiler/optimizing/code_generator_mips64.h
+++ b/compiler/optimizing/code_generator_mips64.h
@@ -106,31 +106,6 @@
   DISALLOW_COPY_AND_ASSIGN(InvokeRuntimeCallingConvention);
 };
 
-class FieldAccessCallingConvetionMIPS64 : public FieldAccessCallingConvetion {
- public:
-  FieldAccessCallingConvetionMIPS64() {}
-
-  Location GetObjectLocation() const OVERRIDE {
-    return Location::RegisterLocation(A1);
-  }
-  Location GetFieldIndexLocation() const OVERRIDE {
-    return Location::RegisterLocation(A0);
-  }
-  Location GetReturnLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return Location::RegisterLocation(A0);
-  }
-  Location GetSetValueLocation(
-      Primitive::Type type ATTRIBUTE_UNUSED, bool is_instance) const OVERRIDE {
-    return is_instance ? Location::RegisterLocation(A2) : Location::RegisterLocation(A1);
-  }
-  Location GetFpuLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return Location::FpuRegisterLocation(F0);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetionMIPS64);
-};
-
 class ParallelMoveResolverMIPS64 : public ParallelMoveResolverWithSwap {
  public:
   ParallelMoveResolverMIPS64(ArenaAllocator* allocator, CodeGeneratorMIPS64* codegen)
@@ -310,17 +285,6 @@
 
   void MoveConstant(Location destination, int32_t value) OVERRIDE;
 
-  void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE;
-  void MoveLocationToTemp(Location source,
-                          const LocationSummary& locations,
-                          int temp_index,
-                          Primitive::Type type) OVERRIDE;
-  void MoveTempToLocation(const LocationSummary& locations,
-                          int temp_index,
-                          Location destination,
-                          Primitive::Type type) OVERRIDE;
-
-
   void SwapLocations(Location loc1, Location loc2, Primitive::Type type);
 
   // Generate code to invoke a runtime entry point.
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index a8dbbdc..9c5ecc3 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -904,62 +904,6 @@
   __ movl(location.AsRegister<Register>(), Immediate(value));
 }
 
-void CodeGeneratorX86::AddLocationAsTemp(Location location, LocationSummary* locations) {
-  if (location.IsRegister()) {
-    locations->AddTemp(location);
-  } else if (location.IsRegisterPair()) {
-    locations->AddTemp(Location::RegisterLocation(location.AsRegisterPairLow<Register>()));
-    locations->AddTemp(Location::RegisterLocation(location.AsRegisterPairHigh<Register>()));
-  } else {
-    UNIMPLEMENTED(FATAL) << "AddLocationAsTemp not implemented for location " << location;
-  }
-}
-
-void CodeGeneratorX86::MoveLocationToTemp(Location source,
-                                          const LocationSummary& locations,
-                                          int temp_index,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(source.IsFpuRegister()) << source;
-  XmmRegister src_reg = source.AsFpuRegister<XmmRegister>();
-  if (type == Primitive::kPrimFloat) {
-    __ movd(locations.GetTemp(temp_index).AsRegister<Register>(), src_reg);
-  } else {
-    DCHECK(type == Primitive::kPrimDouble);
-    __ movd(locations.GetTemp(temp_index).AsRegister<Register>(), src_reg);
-    __ psrlq(src_reg, Immediate(32));
-    __ movd(locations.GetTemp(temp_index + 1).AsRegister<Register>(), src_reg);
-  }
-}
-
-void CodeGeneratorX86::MoveTempToLocation(const LocationSummary& locations,
-                                          int temp_index,
-                                          Location destination,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(destination.IsFpuRegister()) << destination;
-  XmmRegister dst_reg = destination.AsFpuRegister<XmmRegister>();
-  if (type == Primitive::kPrimFloat) {
-    __ movd(dst_reg, locations.GetTemp(temp_index).AsRegister<Register>());
-  } else {
-    DCHECK(type == Primitive::kPrimDouble);
-    size_t elem_size = Primitive::ComponentSize(Primitive::kPrimInt);
-    // Create stack space for 2 elements.
-    __ subl(ESP, Immediate(2 * elem_size));
-    __ movl(Address(ESP, 0), locations.GetTemp(temp_index).AsRegister<Register>());
-    __ movl(Address(ESP, elem_size), locations.GetTemp(temp_index + 1).AsRegister<Register>());
-    __ movsd(dst_reg, Address(ESP, 0));
-    // And remove the temporary stack space we allocated.
-    __ addl(ESP, Immediate(2 * elem_size));
-  }
-}
-
 void InstructionCodeGeneratorX86::HandleGoto(HInstruction* got, HBasicBlock* successor) {
   DCHECK(!successor->IsExitBlock());
 
@@ -4079,66 +4023,6 @@
   HandleFieldGet(instruction, instruction->GetFieldInfo());
 }
 
-void LocationsBuilderX86::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  FieldAccessCallingConvetionX86 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderX86::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  FieldAccessCallingConvetionX86 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderX86::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  FieldAccessCallingConvetionX86 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderX86::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  FieldAccessCallingConvetionX86 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
 void LocationsBuilderX86::VisitNullCheck(HNullCheck* instruction) {
   LocationSummary::CallKind call_kind = instruction->CanThrowIntoCatchBlock()
       ? LocationSummary::kCallOnSlowPath
diff --git a/compiler/optimizing/code_generator_x86.h b/compiler/optimizing/code_generator_x86.h
index 1a63083..f3307cf 100644
--- a/compiler/optimizing/code_generator_x86.h
+++ b/compiler/optimizing/code_generator_x86.h
@@ -92,38 +92,6 @@
   DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitorX86);
 };
 
-class FieldAccessCallingConvetionX86 : public FieldAccessCallingConvetion {
- public:
-  FieldAccessCallingConvetionX86() {}
-
-  Location GetObjectLocation() const OVERRIDE {
-    return Location::RegisterLocation(ECX);
-  }
-  Location GetFieldIndexLocation() const OVERRIDE {
-    return Location::RegisterLocation(EAX);
-  }
-  Location GetReturnLocation(Primitive::Type type) const OVERRIDE {
-    return Primitive::Is64BitType(type)
-        ? Location::RegisterPairLocation(EAX, EDX)
-        : Location::RegisterLocation(EAX);
-  }
-  Location GetSetValueLocation(Primitive::Type type, bool is_instance) const OVERRIDE {
-    return Primitive::Is64BitType(type)
-        ? (is_instance
-            ? Location::RegisterPairLocation(EDX, EBX)
-            : Location::RegisterPairLocation(ECX, EDX))
-        : (is_instance
-            ? Location::RegisterLocation(EDX)
-            : Location::RegisterLocation(ECX));
-  }
-  Location GetFpuLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return Location::FpuRegisterLocation(XMM0);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetionX86);
-};
-
 class ParallelMoveResolverX86 : public ParallelMoveResolverWithSwap {
  public:
   ParallelMoveResolverX86(ArenaAllocator* allocator, CodeGeneratorX86* codegen)
@@ -261,17 +229,6 @@
   void Bind(HBasicBlock* block) OVERRIDE;
   void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE;
   void MoveConstant(Location destination, int32_t value) OVERRIDE;
-
-  void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE;
-  void MoveLocationToTemp(Location source,
-                          const LocationSummary& locations,
-                          int temp_index,
-                          Primitive::Type type) OVERRIDE;
-  void MoveTempToLocation(const LocationSummary& locations,
-                          int temp_index,
-                          Location destination,
-                          Primitive::Type type) OVERRIDE;
-
   size_t SaveCoreRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
   size_t RestoreCoreRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
   size_t SaveFloatingPointRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index ef20b71..134bfed 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -928,42 +928,6 @@
   Load64BitValue(location.AsRegister<CpuRegister>(), static_cast<int64_t>(value));
 }
 
-void CodeGeneratorX86_64::AddLocationAsTemp(Location location, LocationSummary* locations) {
-  if (location.IsRegister()) {
-    locations->AddTemp(location);
-  } else {
-    UNIMPLEMENTED(FATAL) << "AddLocationAsTemp not implemented for location " << location;
-  }
-}
-
-void CodeGeneratorX86_64::MoveLocationToTemp(Location source,
-                                             const LocationSummary& locations,
-                                             int temp_index,
-                                             Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(source.IsFpuRegister()) << source;
-  __ movd(locations.GetTemp(temp_index).AsRegister<CpuRegister>(),
-          source.AsFpuRegister<XmmRegister>(),
-          Primitive::Is64BitType(type));
-}
-
-void CodeGeneratorX86_64::MoveTempToLocation(const LocationSummary& locations,
-                                          int temp_index,
-                                          Location destination,
-                                          Primitive::Type type) {
-  if (!Primitive::IsFloatingPointType(type)) {
-    UNIMPLEMENTED(FATAL) << "MoveLocationToTemp not implemented for type " << type;
-  }
-
-  DCHECK(destination.IsFpuRegister()) << destination;
-  __ movd(destination.AsFpuRegister<XmmRegister>(),
-          locations.GetTemp(temp_index).AsRegister<CpuRegister>(),
-          Primitive::Is64BitType(type));
-}
-
 void InstructionCodeGeneratorX86_64::HandleGoto(HInstruction* got, HBasicBlock* successor) {
   DCHECK(!successor->IsExitBlock());
 
@@ -3823,66 +3787,6 @@
   HandleFieldSet(instruction, instruction->GetFieldInfo(), instruction->GetValueCanBeNull());
 }
 
-void LocationsBuilderX86_64::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  FieldAccessCallingConvetionX86_64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86_64::VisitUnresolvedInstanceFieldGet(
-    HUnresolvedInstanceFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderX86_64::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  FieldAccessCallingConvetionX86_64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86_64::VisitUnresolvedInstanceFieldSet(
-    HUnresolvedInstanceFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderX86_64::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  FieldAccessCallingConvetionX86_64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86_64::VisitUnresolvedStaticFieldGet(
-    HUnresolvedStaticFieldGet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
-void LocationsBuilderX86_64::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  FieldAccessCallingConvetionX86_64 calling_convention;
-  codegen_->CreateUnresolvedFieldLocationSummary(
-      instruction, instruction->GetFieldType(), calling_convention);
-}
-
-void InstructionCodeGeneratorX86_64::VisitUnresolvedStaticFieldSet(
-    HUnresolvedStaticFieldSet* instruction) {
-  codegen_->GenerateUnresolvedFieldAccess(instruction,
-                                          instruction->GetFieldType(),
-                                          instruction->GetFieldIndex(),
-                                          instruction->GetDexPc());
-}
-
 void LocationsBuilderX86_64::VisitNullCheck(HNullCheck* instruction) {
   LocationSummary::CallKind call_kind = instruction->CanThrowIntoCatchBlock()
       ? LocationSummary::kCallOnSlowPath
diff --git a/compiler/optimizing/code_generator_x86_64.h b/compiler/optimizing/code_generator_x86_64.h
index 68c2b3d..9b2423f 100644
--- a/compiler/optimizing/code_generator_x86_64.h
+++ b/compiler/optimizing/code_generator_x86_64.h
@@ -70,32 +70,6 @@
   DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConvention);
 };
 
-class FieldAccessCallingConvetionX86_64 : public FieldAccessCallingConvetion {
- public:
-  FieldAccessCallingConvetionX86_64() {}
-
-  Location GetObjectLocation() const OVERRIDE {
-    return Location::RegisterLocation(RSI);
-  }
-  Location GetFieldIndexLocation() const OVERRIDE {
-    return Location::RegisterLocation(RDI);
-  }
-  Location GetReturnLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return Location::RegisterLocation(RAX);
-  }
-  Location GetSetValueLocation(
-      Primitive::Type type ATTRIBUTE_UNUSED, bool is_instance) const OVERRIDE {
-    return Location::RegisterLocation(is_instance ? RDX : RSI);
-  }
-  Location GetFpuLocation(Primitive::Type type ATTRIBUTE_UNUSED) const OVERRIDE {
-    return Location::FpuRegisterLocation(XMM0);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetionX86_64);
-};
-
-
 class InvokeDexCallingConventionVisitorX86_64 : public InvokeDexCallingConventionVisitor {
  public:
   InvokeDexCallingConventionVisitorX86_64() {}
@@ -255,15 +229,6 @@
   void Bind(HBasicBlock* block) OVERRIDE;
   void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE;
   void MoveConstant(Location destination, int32_t value) OVERRIDE;
-  void AddLocationAsTemp(Location location, LocationSummary* locations) OVERRIDE;
-  void MoveLocationToTemp(Location source,
-                          const LocationSummary& locations,
-                          int temp_index,
-                          Primitive::Type type) OVERRIDE;
-  void MoveTempToLocation(const LocationSummary& locations,
-                          int temp_index,
-                          Location destination,
-                          Primitive::Type type) OVERRIDE;
   size_t SaveCoreRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
   size_t RestoreCoreRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
   size_t SaveFloatingPointRegister(size_t stack_index, uint32_t reg_id) OVERRIDE;
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc
index 628d75a..d05c514 100644
--- a/compiler/optimizing/graph_visualizer.cc
+++ b/compiler/optimizing/graph_visualizer.cc
@@ -393,22 +393,6 @@
     StartAttributeStream("intrinsic") << invoke->GetIntrinsic();
   }
 
-  void VisitUnresolvedInstanceFieldGet(HUnresolvedInstanceFieldGet* field_access) OVERRIDE {
-    StartAttributeStream("field_type") << field_access->GetFieldType();
-  }
-
-  void VisitUnresolvedInstanceFieldSet(HUnresolvedInstanceFieldSet* field_access) OVERRIDE {
-    StartAttributeStream("field_type") << field_access->GetFieldType();
-  }
-
-  void VisitUnresolvedStaticFieldGet(HUnresolvedStaticFieldGet* field_access) OVERRIDE {
-    StartAttributeStream("field_type") << field_access->GetFieldType();
-  }
-
-  void VisitUnresolvedStaticFieldSet(HUnresolvedStaticFieldSet* field_access) OVERRIDE {
-    StartAttributeStream("field_type") << field_access->GetFieldType();
-  }
-
   void VisitTryBoundary(HTryBoundary* try_boundary) OVERRIDE {
     StartAttributeStream("kind") << (try_boundary->IsEntry() ? "entry" : "exit");
   }
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index a44c982..90ff20c 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -1066,10 +1066,6 @@
   M(Shr, BinaryOperation)                                               \
   M(StaticFieldGet, Instruction)                                        \
   M(StaticFieldSet, Instruction)                                        \
-  M(UnresolvedInstanceFieldGet, Instruction)                            \
-  M(UnresolvedInstanceFieldSet, Instruction)                            \
-  M(UnresolvedStaticFieldGet, Instruction)                              \
-  M(UnresolvedStaticFieldSet, Instruction)                              \
   M(StoreLocal, Instruction)                                            \
   M(Sub, BinaryOperation)                                               \
   M(SuspendCheck, Instruction)                                          \
@@ -4675,124 +4671,6 @@
   DISALLOW_COPY_AND_ASSIGN(HStaticFieldSet);
 };
 
-class HUnresolvedInstanceFieldGet : public HExpression<1> {
- public:
-  HUnresolvedInstanceFieldGet(HInstruction* obj,
-                              Primitive::Type field_type,
-                              uint32_t field_index,
-                              uint32_t dex_pc)
-      : HExpression(field_type, SideEffects::AllExceptGCDependency()),
-        field_index_(field_index),
-        dex_pc_(dex_pc) {
-    SetRawInputAt(0, obj);
-  }
-
-  bool NeedsEnvironment() const OVERRIDE { return true; }
-  bool CanThrow() const OVERRIDE { return true; }
-
-  Primitive::Type GetFieldType() const { return GetType(); }
-  uint32_t GetFieldIndex() const { return field_index_; }
-  uint32_t GetDexPc() const { return dex_pc_; }
-
-  DECLARE_INSTRUCTION(UnresolvedInstanceFieldGet);
-
- private:
-  const uint32_t field_index_;
-  const uint32_t dex_pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(HUnresolvedInstanceFieldGet);
-};
-
-class HUnresolvedInstanceFieldSet : public HTemplateInstruction<2> {
- public:
-  HUnresolvedInstanceFieldSet(HInstruction* obj,
-                              HInstruction* value,
-                              Primitive::Type field_type,
-                              uint32_t field_index,
-                              uint32_t dex_pc)
-      : HTemplateInstruction(SideEffects::AllExceptGCDependency()),
-        field_type_(field_type),
-        field_index_(field_index),
-        dex_pc_(dex_pc) {
-    DCHECK_EQ(field_type, value->GetType());
-    SetRawInputAt(0, obj);
-    SetRawInputAt(1, value);
-  }
-
-  bool NeedsEnvironment() const OVERRIDE { return true; }
-  bool CanThrow() const OVERRIDE { return true; }
-
-  Primitive::Type GetFieldType() const { return field_type_; }
-  uint32_t GetFieldIndex() const { return field_index_; }
-  uint32_t GetDexPc() const { return dex_pc_; }
-
-  DECLARE_INSTRUCTION(UnresolvedInstanceFieldSet);
-
- private:
-  const Primitive::Type field_type_;
-  const uint32_t field_index_;
-  const uint32_t dex_pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(HUnresolvedInstanceFieldSet);
-};
-
-class HUnresolvedStaticFieldGet : public HExpression<0> {
- public:
-  HUnresolvedStaticFieldGet(Primitive::Type field_type,
-                            uint32_t field_index,
-                            uint32_t dex_pc)
-      : HExpression(field_type, SideEffects::AllExceptGCDependency()),
-        field_index_(field_index),
-        dex_pc_(dex_pc) {
-  }
-
-  bool NeedsEnvironment() const OVERRIDE { return true; }
-  bool CanThrow() const OVERRIDE { return true; }
-
-  Primitive::Type GetFieldType() const { return GetType(); }
-  uint32_t GetFieldIndex() const { return field_index_; }
-  uint32_t GetDexPc() const { return dex_pc_; }
-
-  DECLARE_INSTRUCTION(UnresolvedStaticFieldGet);
-
- private:
-  const uint32_t field_index_;
-  const uint32_t dex_pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(HUnresolvedStaticFieldGet);
-};
-
-class HUnresolvedStaticFieldSet : public HTemplateInstruction<1> {
- public:
-  HUnresolvedStaticFieldSet(HInstruction* value,
-                            Primitive::Type field_type,
-                            uint32_t field_index,
-                            uint32_t dex_pc)
-      : HTemplateInstruction(SideEffects::AllExceptGCDependency()),
-        field_type_(field_type),
-        field_index_(field_index),
-        dex_pc_(dex_pc) {
-    DCHECK_EQ(field_type, value->GetType());
-    SetRawInputAt(0, value);
-  }
-
-  bool NeedsEnvironment() const OVERRIDE { return true; }
-  bool CanThrow() const OVERRIDE { return true; }
-
-  Primitive::Type GetFieldType() const { return field_type_; }
-  uint32_t GetFieldIndex() const { return field_index_; }
-  uint32_t GetDexPc() const { return dex_pc_; }
-
-  DECLARE_INSTRUCTION(UnresolvedStaticFieldSet);
-
- private:
-  const Primitive::Type field_type_;
-  const uint32_t field_index_;
-  const uint32_t dex_pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(HUnresolvedStaticFieldSet);
-};
-
 // Implement the move-exception DEX instruction.
 class HLoadException : public HExpression<0> {
  public:
diff --git a/compiler/optimizing/optimizing_compiler_stats.h b/compiler/optimizing/optimizing_compiler_stats.h
index f1d2970..c7701b7 100644
--- a/compiler/optimizing/optimizing_compiler_stats.h
+++ b/compiler/optimizing/optimizing_compiler_stats.h
@@ -34,7 +34,6 @@
   kInstructionSimplifications,
   kInstructionSimplificationsArch,
   kUnresolvedMethod,
-  kUnresolvedField,
   kNotCompiledBranchOutsideMethodCode,
   kNotCompiledCannotBuildSSA,
   kNotCompiledCantAccesType,
@@ -46,6 +45,7 @@
   kNotCompiledPathological,
   kNotCompiledSpaceFilter,
   kNotCompiledUnhandledInstruction,
+  kNotCompiledUnresolvedField,
   kNotCompiledUnsupportedIsa,
   kNotCompiledVerifyAtRuntime,
   kNotOptimizedDisabled,
@@ -104,7 +104,6 @@
       case kInstructionSimplifications: return "kInstructionSimplifications";
       case kInstructionSimplificationsArch: return "kInstructionSimplificationsArch";
       case kUnresolvedMethod : return "kUnresolvedMethod";
-      case kUnresolvedField : return "kUnresolvedField";
       case kNotCompiledBranchOutsideMethodCode: return "kNotCompiledBranchOutsideMethodCode";
       case kNotCompiledCannotBuildSSA : return "kNotCompiledCannotBuildSSA";
       case kNotCompiledCantAccesType : return "kNotCompiledCantAccesType";
@@ -116,6 +115,7 @@
       case kNotCompiledPathological : return "kNotCompiledPathological";
       case kNotCompiledSpaceFilter : return "kNotCompiledSpaceFilter";
       case kNotCompiledUnhandledInstruction : return "kNotCompiledUnhandledInstruction";
+      case kNotCompiledUnresolvedField : return "kNotCompiledUnresolvedField";
       case kNotCompiledUnsupportedIsa : return "kNotCompiledUnsupportedIsa";
       case kNotCompiledVerifyAtRuntime : return "kNotCompiledVerifyAtRuntime";
       case kNotOptimizedDisabled : return "kNotOptimizedDisabled";
diff --git a/compiler/optimizing/reference_type_propagation.cc b/compiler/optimizing/reference_type_propagation.cc
index cee495e..a88c543 100644
--- a/compiler/optimizing/reference_type_propagation.cc
+++ b/compiler/optimizing/reference_type_propagation.cc
@@ -52,8 +52,6 @@
   void SetClassAsTypeInfo(HInstruction* instr, mirror::Class* klass, bool is_exact);
   void VisitInstanceFieldGet(HInstanceFieldGet* instr) OVERRIDE;
   void VisitStaticFieldGet(HStaticFieldGet* instr) OVERRIDE;
-  void VisitUnresolvedInstanceFieldGet(HUnresolvedInstanceFieldGet* instr) OVERRIDE;
-  void VisitUnresolvedStaticFieldGet(HUnresolvedStaticFieldGet* instr) OVERRIDE;
   void VisitInvoke(HInvoke* instr) OVERRIDE;
   void VisitArrayGet(HArrayGet* instr) OVERRIDE;
   void VisitCheckCast(HCheckCast* instr) OVERRIDE;
@@ -451,22 +449,6 @@
   UpdateFieldAccessTypeInfo(instr, instr->GetFieldInfo());
 }
 
-void RTPVisitor::VisitUnresolvedInstanceFieldGet(HUnresolvedInstanceFieldGet* instr) {
-  // TODO: Use descriptor to get the actual type.
-  if (instr->GetFieldType() == Primitive::kPrimNot) {
-    instr->SetReferenceTypeInfo(
-      ReferenceTypeInfo::Create(object_class_handle_, /* is_exact */ false));
-  }
-}
-
-void RTPVisitor::VisitUnresolvedStaticFieldGet(HUnresolvedStaticFieldGet* instr) {
-  // TODO: Use descriptor to get the actual type.
-  if (instr->GetFieldType() == Primitive::kPrimNot) {
-    instr->SetReferenceTypeInfo(
-      ReferenceTypeInfo::Create(object_class_handle_, /* is_exact */ false));
-  }
-}
-
 void RTPVisitor::VisitLoadClass(HLoadClass* instr) {
   ScopedObjectAccess soa(Thread::Current());
   mirror::DexCache* dex_cache =
diff --git a/test/529-checker-unresolved/src/Main.java b/test/529-checker-unresolved/src/Main.java
index adb5ada..6f04797 100644
--- a/test/529-checker-unresolved/src/Main.java
+++ b/test/529-checker-unresolved/src/Main.java
@@ -44,76 +44,6 @@
     super.superMethod();
   }
 
-  /// CHECK-START: void Main.callUnresolvedStaticFieldAccess() register (before)
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimByte
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimChar
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimInt
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimLong
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimFloat
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimDouble
-  /// CHECK:        UnresolvedStaticFieldSet field_type:PrimNot
-
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimByte
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimChar
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimInt
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimLong
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimFloat
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimDouble
-  /// CHECK:        UnresolvedStaticFieldGet field_type:PrimNot
-  static public void callUnresolvedStaticFieldAccess() {
-    Object o = new Object();
-    UnresolvedClass.staticByte = (byte)1;
-    UnresolvedClass.staticChar = '1';
-    UnresolvedClass.staticInt = 123456789;
-    UnresolvedClass.staticLong = 123456789123456789l;
-    UnresolvedClass.staticFloat = 123456789123456789f;
-    UnresolvedClass.staticDouble = 123456789123456789d;
-    UnresolvedClass.staticObject = o;
-
-    expectEquals((byte)1, UnresolvedClass.staticByte);
-    expectEquals('1', UnresolvedClass.staticChar);
-    expectEquals(123456789, UnresolvedClass.staticInt);
-    expectEquals(123456789123456789l, UnresolvedClass.staticLong);
-    expectEquals(123456789123456789f, UnresolvedClass.staticFloat);
-    expectEquals(123456789123456789d, UnresolvedClass.staticDouble);
-    expectEquals(o, UnresolvedClass.staticObject);
-  }
-
-  /// CHECK-START: void Main.callUnresolvedInstanceFieldAccess(UnresolvedClass) register (before)
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimByte
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimChar
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimInt
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimLong
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimFloat
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimDouble
-  /// CHECK:        UnresolvedInstanceFieldSet field_type:PrimNot
-
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimByte
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimChar
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimInt
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimLong
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimFloat
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimDouble
-  /// CHECK:        UnresolvedInstanceFieldGet field_type:PrimNot
-  static public void callUnresolvedInstanceFieldAccess(UnresolvedClass c) {
-    Object o = new Object();
-    c.instanceByte = (byte)1;
-    c.instanceChar = '1';
-    c.instanceInt = 123456789;
-    c.instanceLong = 123456789123456789l;
-    c.instanceFloat = 123456789123456789f;
-    c.instanceDouble = 123456789123456789d;
-    c.instanceObject = o;
-
-    expectEquals((byte)1, c.instanceByte);
-    expectEquals('1', c.instanceChar);
-    expectEquals(123456789, c.instanceInt);
-    expectEquals(123456789123456789l, c.instanceLong);
-    expectEquals(123456789123456789f, c.instanceFloat);
-    expectEquals(123456789123456789d, c.instanceDouble);
-    expectEquals(o, c.instanceObject);
-  }
-
   /// CHECK-START: void Main.main(java.lang.String[]) register (before)
   /// CHECK:        InvokeUnresolved invoke_type:direct
   static public void main(String[] args) {
@@ -122,49 +52,5 @@
     callInvokeUnresolvedVirtual(c);
     callInvokeUnresolvedInterface(c);
     callInvokeUnresolvedSuper(new Main());
-    callUnresolvedStaticFieldAccess();
-    callUnresolvedInstanceFieldAccess(c);
-  }
-
-  public static void expectEquals(byte expected, byte result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-  public static void expectEquals(char expected, char result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-  public static void expectEquals(int expected, int result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-  public static void expectEquals(long expected, long result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-    public static void expectEquals(float expected, float result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-  public static void expectEquals(double expected, double result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
-  }
-
-  public static void expectEquals(Object expected, Object result) {
-    if (expected != result) {
-      throw new Error("Expected: " + expected + ", found: " + result);
-    }
   }
 }
diff --git a/test/529-checker-unresolved/src/Unresolved.java b/test/529-checker-unresolved/src/Unresolved.java
index 03ceb68..5bf92dd 100644
--- a/test/529-checker-unresolved/src/Unresolved.java
+++ b/test/529-checker-unresolved/src/Unresolved.java
@@ -40,22 +40,6 @@
   public void interfaceMethod() {
     System.out.println("UnresolvedClass.interfaceMethod()");
   }
-
-  public static byte staticByte;
-  public static char staticChar;
-  public static int staticInt;
-  public static long staticLong;
-  public static float staticFloat;
-  public static double staticDouble;
-  public static Object staticObject;
-
-  public byte instanceByte;
-  public char instanceChar;
-  public int instanceInt;
-  public long instanceLong;
-  public float instanceFloat;
-  public double instanceDouble;
-  public Object instanceObject;
 }
 
 final class UnresolvedFinalClass {
