diff --git a/src/compiler_llvm/ir_builder.cc b/src/compiler_llvm/ir_builder.cc
index 51a8170..88af166 100644
--- a/src/compiler_llvm/ir_builder.cc
+++ b/src/compiler_llvm/ir_builder.cc
@@ -28,13 +28,30 @@
 // General
 //----------------------------------------------------------------------------
 
-IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module)
-: LLVMIRBuilder(context), module_(&module), mdb_(context) {
-
+IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module,
+                     IntrinsicHelper& intrinsic_helper)
+    : LLVMIRBuilder(context), module_(&module), mdb_(context), java_object_type_(NULL),
+      java_method_type_(NULL), java_thread_type_(NULL), intrinsic_helper_(intrinsic_helper) {
   // Get java object type from module
   llvm::Type* jobject_struct_type = module.getTypeByName("JavaObject");
   CHECK(jobject_struct_type != NULL);
-  jobject_type_ = jobject_struct_type->getPointerTo();
+  java_object_type_ = jobject_struct_type->getPointerTo();
+
+  // If type of Method is not explicitly defined in the module, use JavaObject*
+  llvm::Type* type = module.getTypeByName("Method");
+  if (type != NULL) {
+    java_method_type_ = type->getPointerTo();
+  } else {
+    java_method_type_ = java_object_type_;
+  }
+
+  // If type of Thread is not explicitly defined in the module, use JavaObject*
+  type = module.getTypeByName("Thread");
+  if (type != NULL) {
+    java_thread_type_ = type->getPointerTo();
+  } else {
+    java_thread_type_ = java_object_type_;
+  }
 
   // Create JEnv* type
   llvm::Type* jenv_struct_type = llvm::StructType::create(context, "JEnv");
@@ -52,7 +69,7 @@
 // Type Helper Function
 //----------------------------------------------------------------------------
 
-llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
+llvm::Type* IRBuilder::getJType(JType jty) {
   switch (jty) {
   case kVoid:
     return getJVoidTy();
@@ -90,68 +107,6 @@
   }
 }
 
-
-llvm::Type* IRBuilder::getJTypeInRegSpace(JType jty) {
-  RegCategory regcat = GetRegCategoryFromJType(jty);
-
-  switch (regcat) {
-  case kRegUnknown:
-  case kRegZero:
-    LOG(FATAL) << "Register category \"Unknown\" or \"Zero\" does not have "
-               << "the LLVM type";
-    return NULL;
-
-  case kRegCat1nr:
-    return getInt32Ty();
-
-  case kRegCat2:
-    return getInt64Ty();
-
-  case kRegObject:
-    return getJObjectTy();
-  }
-
-  LOG(FATAL) << "Unknown register category: " << regcat;
-  return NULL;
-}
-
-
-llvm::Type* IRBuilder::getJTypeInArraySpace(JType jty) {
-  switch (jty) {
-  case kVoid:
-    LOG(FATAL) << "void type should not be used in array type space";
-    return NULL;
-
-  case kBoolean:
-  case kByte:
-    return getInt8Ty();
-
-  case kChar:
-  case kShort:
-    return getInt16Ty();
-
-  case kInt:
-    return getInt32Ty();
-
-  case kLong:
-    return getInt64Ty();
-
-  case kFloat:
-    return getFloatTy();
-
-  case kDouble:
-    return getDoubleTy();
-
-  case kObject:
-    return getJObjectTy();
-
-  default:
-    LOG(FATAL) << "Unknown java type: " << jty;
-    return NULL;
-  }
-}
-
-
 llvm::StructType* IRBuilder::getShadowFrameTy(uint32_t vreg_size) {
   std::string name(StringPrintf("ShadowFrame%u", vreg_size));
 
