Quick compiler: reuse llvm context & ir builder
With this CL, we avoid setting up an llvm context, module and intrinsic
definitions for each method, and considerably speed up compilation time.
This does not represent a final form - we'll be reworking the compiler driver
to support Quick & Portable via the command line, and this code will likely
change at that time.
Change-Id: I19e298a011141c3bc35c4f28175b2b20653fd5e4
diff --git a/src/compiler/codegen/MethodBitcode.cc b/src/compiler/codegen/MethodBitcode.cc
index c84d6d3..cfe6e6a 100644
--- a/src/compiler/codegen/MethodBitcode.cc
+++ b/src/compiler/codegen/MethodBitcode.cc
@@ -166,27 +166,14 @@
}
cUnit->locMap.Put(val, loc);
}
-
void initIR(CompilationUnit* cUnit)
{
- cUnit->context = new llvm::LLVMContext();
- cUnit->module = new llvm::Module("art", *cUnit->context);
- llvm::StructType::create(*cUnit->context, "JavaObject");
- llvm::StructType::create(*cUnit->context, "Method");
- llvm::StructType::create(*cUnit->context, "Thread");
- cUnit->intrinsic_helper =
- new greenland::IntrinsicHelper(*cUnit->context, *cUnit->module);
- cUnit->irb =
- new greenland::IRBuilder(*cUnit->context, *cUnit->module,
- *cUnit->intrinsic_helper);
-}
-
-void freeIR(CompilationUnit* cUnit)
-{
- delete cUnit->irb;
- delete cUnit->intrinsic_helper;
- delete cUnit->module;
- delete cUnit->context;
+ QuickCompiler* quick =
+ reinterpret_cast<QuickCompiler*>(cUnit->compiler->GetCompilerContext());
+ cUnit->context = quick->GetLLVMContext();
+ cUnit->module = quick->GetLLVMModule();
+ cUnit->intrinsic_helper = quick->GetIntrinsicHelper();
+ cUnit->irb = quick->GetIRBuilder();
}
const char* llvmSSAName(CompilationUnit* cUnit, int ssaReg) {
@@ -840,7 +827,6 @@
RegLocation rlSrc[3];
RegLocation rlDest = badLoc;
Instruction::Code opcode = mir->dalvikInsn.opcode;
- uint32_t vA = mir->dalvikInsn.vA;
uint32_t vB = mir->dalvikInsn.vB;
uint32_t vC = mir->dalvikInsn.vC;
int optFlags = mir->optimizationFlags;
@@ -3480,7 +3466,8 @@
handleIntrinsicLaunchpads(cUnit);
- freeIR(cUnit);
+ cUnit->func->eraseFromParent();
+ cUnit->func = NULL;
}