summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornikolay serdjuk <nikolay.y.serdjuk@intel.com>2014-03-25 12:21:29 +0700
committernikolay serdjuk <nikolay.y.serdjuk@intel.com>2014-03-25 12:21:29 +0700
commitee40aa4650d7d000335ccfcb2fbb742acfb1f1c3 (patch)
treec22a662c63f4a81fbf0d761c6c386d02041c59e0
parent89ff4f99ae477758b8e2300dc1a9cb828ed3a53c (diff)
downloadandroid_art-ee40aa4650d7d000335ccfcb2fbb742acfb1f1c3.tar.gz
android_art-ee40aa4650d7d000335ccfcb2fbb742acfb1f1c3.tar.bz2
android_art-ee40aa4650d7d000335ccfcb2fbb742acfb1f1c3.zip
An argument is handled incorrectly for add-int/lit8 during optimization phase
Dalvik instruction 'add-int/lit8' stores a constant in the third parameter. But during optimization phase the compiler reads the constant from the second parameter. This is incorrect because it leads to wrong decision that no array bound checks are needed in our test case. As a consequence it fails with SIGSEGV because of accessing elements which are beyond the bounds. Change-Id: I653892514934046d31a9e4d206d9d95ebb6267ab Signed-off-by: nikolay serdjuk <nikolay.y.serdjuk@intel.com>
-rw-r--r--compiler/dex/local_value_numbering.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/compiler/dex/local_value_numbering.cc b/compiler/dex/local_value_numbering.cc
index 45167a83f7..8dbc2bb9c3 100644
--- a/compiler/dex/local_value_numbering.cc
+++ b/compiler/dex/local_value_numbering.cc
@@ -482,9 +482,9 @@ uint16_t LocalValueNumbering::GetValueNumber(MIR* mir) {
case Instruction::SHL_INT_LIT8:
case Instruction::SHR_INT_LIT8:
case Instruction::USHR_INT_LIT8: {
- // Same as res = op + 2 operands, except use vB as operand 2
+ // Same as res = op + 2 operands, except use vC as operand 2
uint16_t operand1 = GetOperandValue(mir->ssa_rep->uses[0]);
- uint16_t operand2 = LookupValue(Instruction::CONST, mir->dalvikInsn.vB, 0, 0);
+ uint16_t operand2 = LookupValue(Instruction::CONST, mir->dalvikInsn.vC, 0, 0);
res = LookupValue(opcode, operand1, operand2, NO_VALUE);
SetOperandValue(mir->ssa_rep->defs[0], res);
}