1 IR builder. Kill greenland. Remove JTypeSpace.
Change-Id: I7d08cfd8c1fec46df4ce5f51706dff2e246695b5
diff --git a/src/compiler_llvm/gbc_expander.cc b/src/compiler_llvm/gbc_expander.cc
index 3ed8cba..086d29d 100644
--- a/src/compiler_llvm/gbc_expander.cc
+++ b/src/compiler_llvm/gbc_expander.cc
@@ -18,7 +18,7 @@
#include "utils_llvm.h"
#include "compiler.h"
-#include "greenland/intrinsic_helper.h"
+#include "intrinsic_helper.h"
#include "mirror/abstract_method.h"
#include "mirror/array.h"
#include "oat_compilation_unit.h"
@@ -43,7 +43,7 @@
using namespace art::compiler_llvm;
-using art::greenland::IntrinsicHelper;
+using art::compiler_llvm::IntrinsicHelper;
namespace art {
extern char RemapShorty(char shortyType);
@@ -125,6 +125,12 @@
llvm::BasicBlock* new_basic_block);
+ // Sign or zero extend category 1 types < 32bits in size to 32bits.
+ llvm::Value* SignOrZeroExtendCat1Types(llvm::Value* value, JType jty);
+
+ // Truncate category 1 types from 32bits to the given JType size.
+ llvm::Value* TruncateCat1Types(llvm::Value* value, JType jty);
+
//----------------------------------------------------------------------------
// Dex cache code generation helper function
//----------------------------------------------------------------------------
@@ -752,7 +758,7 @@
llvm::Constant* data_offset_value =
irb_.getPtrEquivInt(data_offset);
- llvm::Type* elem_type = irb_.getJType(elem_jty, kArray);
+ llvm::Type* elem_type = irb_.getJType(elem_jty);
llvm::Value* array_data_addr =
irb_.CreatePtrDisp(array_addr, data_offset_value,
@@ -913,7 +919,7 @@
DCHECK_GE(field_offset, 0);
llvm::PointerType* field_type =
- irb_.getJType(field_jty, kField)->getPointerTo();
+ irb_.getJType(field_jty)->getPointerTo();
field_offset_value = irb_.getPtrEquivInt(field_offset);
@@ -936,7 +942,7 @@
DCHECK_GE(field_offset, 0);
llvm::PointerType* field_type =
- irb_.getJType(field_jty, kField)->getPointerTo();
+ irb_.getJType(field_jty)->getPointerTo();
field_offset_value = irb_.getPtrEquivInt(field_offset);
@@ -963,7 +969,7 @@
llvm::Value* static_field_addr =
irb_.CreatePtrDisp(static_storage_addr, static_field_offset_value,
- irb_.getJType(field_jty, kField)->getPointerTo());
+ irb_.getJType(field_jty)->getPointerTo());
// TODO: Check is_volatile. We need to generate atomic store instruction
// when is_volatile is true.
@@ -984,7 +990,7 @@
llvm::Value* static_field_addr =
irb_.CreatePtrDisp(static_storage_addr, static_field_offset_value,
- irb_.getJType(field_jty, kField)->getPointerTo());
+ irb_.getJType(field_jty)->getPointerTo());
// TODO: Check is_volatile. We need to generate atomic store instruction
// when is_volatile is true.
@@ -1070,7 +1076,7 @@
// That case will cause overflow, which is undefined behavior in llvm.
// So we check the divisor is -1 or not, if the divisor is -1, we do
// the special path to avoid undefined behavior.
- llvm::Type* op_type = irb_.getJType(op_jty, kAccurate);
+ llvm::Type* op_type = irb_.getJType(op_jty);
llvm::Value* zero = irb_.getJZero(op_jty);
llvm::Value* neg_one = llvm::ConstantInt::getSigned(op_type, -1);
@@ -1291,6 +1297,47 @@
}
}
+llvm::Value* GBCExpanderPass::SignOrZeroExtendCat1Types(llvm::Value* value, JType jty) {
+ switch (jty) {
+ case kBoolean:
+ case kChar:
+ return irb_.CreateZExt(value, irb_.getJType(kInt));
+ case kByte:
+ case kShort:
+ return irb_.CreateSExt(value, irb_.getJType(kInt));
+ case kVoid:
+ case kInt:
+ case kLong:
+ case kFloat:
+ case kDouble:
+ case kObject:
+ return value; // Nothing to do.
+ default:
+ LOG(FATAL) << "Unknown java type: " << jty;
+ return NULL;
+ }
+}
+
+llvm::Value* GBCExpanderPass::TruncateCat1Types(llvm::Value* value, JType jty) {
+ switch (jty) {
+ case kBoolean:
+ case kChar:
+ case kByte:
+ case kShort:
+ return irb_.CreateTrunc(value, irb_.getJType(jty));
+ case kVoid:
+ case kInt:
+ case kLong:
+ case kFloat:
+ case kDouble:
+ case kObject:
+ return value; // Nothing to do.
+ default:
+ LOG(FATAL) << "Unknown java type: " << jty;
+ return NULL;
+ }
+}
+
llvm::Value* GBCExpanderPass::Expand_HLArrayGet(llvm::CallInst& call_inst,
JType elem_jty) {
uint32_t dex_pc = LV2UInt(call_inst.getMetadata("DexOff")->getOperand(0));
@@ -1309,32 +1356,7 @@
llvm::Value* array_elem_value = irb_.CreateLoad(array_elem_addr, kTBAAHeapArray, elem_jty);
- switch (elem_jty) {
- case kVoid:
- break;
-
- case kBoolean:
- case kChar:
- array_elem_value = irb_.CreateZExt(array_elem_value, irb_.getJType(elem_jty, kReg));
- break;
-
- case kByte:
- case kShort:
- array_elem_value = irb_.CreateSExt(array_elem_value, irb_.getJType(elem_jty, kReg));
- break;
-
- case kInt:
- case kLong:
- case kFloat:
- case kDouble:
- case kObject:
- break;
-
- default:
- LOG(FATAL) << "Unknown java type: " << elem_jty;
- }
-
- return array_elem_value;
+ return SignOrZeroExtendCat1Types(array_elem_value, elem_jty);
}
@@ -1353,27 +1375,7 @@
EmitGuard_ArrayIndexOutOfBoundsException(dex_pc, array_addr, index_value);
}
- switch (elem_jty) {
- case kVoid:
- break;
-
- case kBoolean:
- case kChar:
- case kByte:
- case kShort:
- new_value = irb_.CreateTrunc(new_value, irb_.getJType(elem_jty, kArray));
- break;
-
- case kInt:
- case kLong:
- case kFloat:
- case kDouble:
- case kObject:
- break;
-
- default:
- LOG(FATAL) << "Unknown java type: " << elem_jty;
- }
+ new_value = TruncateCat1Types(new_value, elem_jty);
llvm::Value* array_elem_addr = EmitArrayGEP(array_addr, index_value, elem_jty);
@@ -1436,7 +1438,7 @@
DCHECK_GE(field_offset, 0);
llvm::PointerType* field_type =
- irb_.getJType(field_jty, kField)->getPointerTo();
+ irb_.getJType(field_jty)->getPointerTo();
llvm::ConstantInt* field_offset_value = irb_.getPtrEquivInt(field_offset);
@@ -1446,10 +1448,11 @@
// TODO: Check is_volatile. We need to generate atomic load instruction
// when is_volatile is true.
field_value = irb_.CreateLoad(field_addr, kTBAAHeapInstance, field_jty);
+ field_value = SignOrZeroExtendCat1Types(field_value, field_jty);
}
if (field_jty == kFloat || field_jty == kDouble) {
- field_value = irb_.CreateBitCast(field_value, irb_.getJType(field_jty, kAccurate));
+ field_value = irb_.CreateBitCast(field_value, irb_.getJType(field_jty));
}
return field_value;
@@ -1464,7 +1467,7 @@
int opt_flags = LV2UInt(call_inst.getArgOperand(0));
if (field_jty == kFloat || field_jty == kDouble) {
- new_value = irb_.CreateBitCast(new_value, irb_.getJType(field_jty, kField));
+ new_value = irb_.CreateBitCast(new_value, irb_.getJType(field_jty));
}
if (!(opt_flags & MIR_IGNORE_NULL_CHECK)) {
@@ -1502,7 +1505,7 @@
DCHECK_GE(field_offset, 0);
llvm::PointerType* field_type =
- irb_.getJType(field_jty, kField)->getPointerTo();
+ irb_.getJType(field_jty)->getPointerTo();
llvm::Value* field_offset_value = irb_.getPtrEquivInt(field_offset);
@@ -1511,6 +1514,7 @@
// TODO: Check is_volatile. We need to generate atomic store instruction
// when is_volatile is true.
+ new_value = TruncateCat1Types(new_value, field_jty);
irb_.CreateStore(new_value, field_addr, kTBAAHeapInstance, field_jty);
if (field_jty == kObject) { // If put an object, mark the GC card table.
@@ -1718,16 +1722,17 @@
llvm::Value* static_field_addr =
irb_.CreatePtrDisp(static_storage_addr, static_field_offset_value,
- irb_.getJType(field_jty, kField)->getPointerTo());
+ irb_.getJType(field_jty)->getPointerTo());
// TODO: Check is_volatile. We need to generate atomic load instruction
// when is_volatile is true.
static_field_value = irb_.CreateLoad(static_field_addr, kTBAAHeapStatic, field_jty);
+ static_field_value = SignOrZeroExtendCat1Types(static_field_value, field_jty);
}
if (field_jty == kFloat || field_jty == kDouble) {
static_field_value =
- irb_.CreateBitCast(static_field_value, irb_.getJType(field_jty, kAccurate));
+ irb_.CreateBitCast(static_field_value, irb_.getJType(field_jty));
}
return static_field_value;
@@ -1740,7 +1745,7 @@
llvm::Value* new_value = call_inst.getArgOperand(1);
if (field_jty == kFloat || field_jty == kDouble) {
- new_value = irb_.CreateBitCast(new_value, irb_.getJType(field_jty, kField));
+ new_value = irb_.CreateBitCast(new_value, irb_.getJType(field_jty));
}
int field_offset;
@@ -1799,10 +1804,11 @@
llvm::Value* static_field_addr =
irb_.CreatePtrDisp(static_storage_addr, static_field_offset_value,
- irb_.getJType(field_jty, kField)->getPointerTo());
+ irb_.getJType(field_jty)->getPointerTo());
// TODO: Check is_volatile. We need to generate atomic store instruction
// when is_volatile is true.
+ new_value = TruncateCat1Types(new_value, field_jty);
irb_.CreateStore(new_value, static_field_addr, kTBAAHeapStatic, field_jty);
if (field_jty == kObject) { // If put an object, mark the GC card table.
@@ -2488,7 +2494,7 @@
char ret_shorty = shorty[0];
ret_shorty = art::RemapShorty(ret_shorty);
- llvm::Type* ret_type = irb_.getJType(ret_shorty, kAccurate);
+ llvm::Type* ret_type = irb_.getJType(ret_shorty);
// Get argument type
std::vector<llvm::Type*> args_type;
@@ -2496,12 +2502,12 @@
args_type.push_back(irb_.getJObjectTy()); // method object pointer
if (!is_static) {
- args_type.push_back(irb_.getJType('L', kAccurate)); // "this" object pointer
+ args_type.push_back(irb_.getJType('L')); // "this" object pointer
}
for (uint32_t i = 1; i < shorty_size; ++i) {
char shorty_type = art::RemapShorty(shorty[i]);
- args_type.push_back(irb_.getJType(shorty_type, kAccurate));
+ args_type.push_back(irb_.getJType(shorty_type));
}
return llvm::FunctionType::get(ret_type, args_type, false);