Quick compiler - fix run-test 019
Two problems:
1. Was treating an array object store as a regular array store
2. Codegen bug that (somewhat disturbingly) existed in the
non-quick code. I'm a little surprised that it hadn't
shown up before now, but it would tend to be masked if
the array base register in question was promoted.
Change-Id: I62bcb866174538ceedcc1309edcf22261237840a
diff --git a/src/compiler/codegen/GenCommon.cc b/src/compiler/codegen/GenCommon.cc
index 40c0f22..9082a49 100644
--- a/src/compiler/codegen/GenCommon.cc
+++ b/src/compiler/codegen/GenCommon.cc
@@ -1439,7 +1439,7 @@
int regLen = INVALID_REG;
if (needsRangeCheck) {
regLen = rARG1;
- loadWordDisp(cUnit, rlArray.lowReg, lenOffset, regLen); // Get len
+ loadWordDisp(cUnit, rArray, lenOffset, regLen); // Get len
}
/* rPtr -> array data */
int rPtr = oatAllocTemp(cUnit);
diff --git a/src/compiler/codegen/MethodBitcode.cc b/src/compiler/codegen/MethodBitcode.cc
index cf7b6ff..89c11c6 100644
--- a/src/compiler/codegen/MethodBitcode.cc
+++ b/src/compiler/codegen/MethodBitcode.cc
@@ -2557,7 +2557,7 @@
}
void cvtAput(CompilationUnit* cUnit, llvm::CallInst* callInst, OpSize size,
- int scale)
+ int scale, bool isObject)
{
DCHECK_EQ(callInst->getNumArgOperands(), 4U);
llvm::ConstantInt* optFlags =
@@ -2565,8 +2565,24 @@
RegLocation rlSrc = getLoc(cUnit, callInst->getArgOperand(1));
RegLocation rlArray = getLoc(cUnit, callInst->getArgOperand(2));
RegLocation rlIndex = getLoc(cUnit, callInst->getArgOperand(3));
- genArrayPut(cUnit, optFlags->getZExtValue(), size, rlArray, rlIndex,
- rlSrc, scale);
+ if (isObject) {
+ genArrayObjPut(cUnit, optFlags->getZExtValue(), rlArray, rlIndex,
+ rlSrc, scale);
+ } else {
+ genArrayPut(cUnit, optFlags->getZExtValue(), size, rlArray, rlIndex,
+ rlSrc, scale);
+ }
+}
+
+void cvtAputObj(CompilationUnit* cUnit, llvm::CallInst* callInst)
+{
+ cvtAput(cUnit, callInst, kWord, 2, true /* isObject */);
+}
+
+void cvtAputPrimitive(CompilationUnit* cUnit, llvm::CallInst* callInst,
+ OpSize size, int scale)
+{
+ cvtAput(cUnit, callInst, size, scale, false /* isObject */);
}
void cvtIget(CompilationUnit* cUnit, llvm::CallInst* callInst, OpSize size,
@@ -2942,25 +2958,27 @@
break;
case greenland::IntrinsicHelper::HLArrayPut:
- case greenland::IntrinsicHelper::HLArrayPutObject:
case greenland::IntrinsicHelper::HLArrayPutFloat:
- cvtAput(cUnit, callInst, kWord, 2);
+ cvtAputPrimitive(cUnit, callInst, kWord, 2);
+ break;
+ case greenland::IntrinsicHelper::HLArrayPutObject:
+ cvtAputObj(cUnit, callInst);
break;
case greenland::IntrinsicHelper::HLArrayPutWide:
case greenland::IntrinsicHelper::HLArrayPutDouble:
- cvtAput(cUnit, callInst, kLong, 3);
+ cvtAputPrimitive(cUnit, callInst, kLong, 3);
break;
case greenland::IntrinsicHelper::HLArrayPutBoolean:
- cvtAput(cUnit, callInst, kUnsignedByte, 0);
+ cvtAputPrimitive(cUnit, callInst, kUnsignedByte, 0);
break;
case greenland::IntrinsicHelper::HLArrayPutByte:
- cvtAput(cUnit, callInst, kSignedByte, 0);
+ cvtAputPrimitive(cUnit, callInst, kSignedByte, 0);
break;
case greenland::IntrinsicHelper::HLArrayPutChar:
- cvtAput(cUnit, callInst, kUnsignedHalf, 1);
+ cvtAputPrimitive(cUnit, callInst, kUnsignedHalf, 1);
break;
case greenland::IntrinsicHelper::HLArrayPutShort:
- cvtAput(cUnit, callInst, kSignedHalf, 1);
+ cvtAputPrimitive(cUnit, callInst, kSignedHalf, 1);
break;
case greenland::IntrinsicHelper::HLIGet:
diff --git a/src/compiler/codegen/arm/ArchUtility.cc b/src/compiler/codegen/arm/ArchUtility.cc
index 725200a..cdb8486 100644
--- a/src/compiler/codegen/arm/ArchUtility.cc
+++ b/src/compiler/codegen/arm/ArchUtility.cc
@@ -218,6 +218,8 @@
sprintf(tbuf,"%d", operand);
break;
case 'C':
+ DCHECK_LT(operand, static_cast<int>(
+ sizeof(coreRegNames)/sizeof(coreRegNames[0])));
sprintf(tbuf,"%s",coreRegNames[operand]);
break;
case 'E':