OSDN Git Service

ART: X86Mir2Lir::OpRegRegReg should expect kOpMul for r_dest == r_src2 case
authorPavel Vyssotski <pavel.n.vyssotski@intel.com>
Tue, 18 Nov 2014 05:51:24 +0000 (11:51 +0600)
committerPavel Vyssotski <pavel.n.vyssotski@intel.com>
Wed, 19 Nov 2014 13:37:12 +0000 (19:37 +0600)
OpRegRegReg in case of r_dest == r_src2 does not expect kOpMul as valid operation.
This provokes abort compiling instruction like "mul-int v0, v1, v0" if both
operands are arriving in registers.

The fix is to expect kOpMul as comutative operation.

Change-Id: I259e49edea4b8b08ca4ed1c61033bbc2b2229078
Signed-off-by: Pavel Vyssotski <pavel.n.vyssotski@intel.com>
compiler/dex/quick/x86/utility_x86.cc
test/800-smali/expected.txt
test/800-smali/smali/BadCaseInOpRegRegReg.smali [new file with mode: 0644]
test/800-smali/src/Main.java

index c1c79ca..ad3222c 100644 (file)
@@ -488,6 +488,7 @@ LIR* X86Mir2Lir::OpRegRegReg(OpKind op, RegStorage r_dest, RegStorage r_src1,
       case kOpAdc:
       case kOpAnd:
       case kOpXor:
+      case kOpMul:
         break;
       default:
         LOG(FATAL) << "Bad case in OpRegRegReg " << op;
index 01d7b81..7674a8a 100644 (file)
@@ -5,4 +5,5 @@ negLong
 sameFieldNames
 b/18380491
 invoke-super abstract
+BadCaseInOpRegRegReg
 Done!
diff --git a/test/800-smali/smali/BadCaseInOpRegRegReg.smali b/test/800-smali/smali/BadCaseInOpRegRegReg.smali
new file mode 100644 (file)
index 0000000..2683790
--- /dev/null
@@ -0,0 +1,13 @@
+.class public LBadCaseInOpRegRegReg;
+
+.super Ljava/lang/Object;
+
+.method public static getInt()I
+    .registers 2
+    const/4 v0, 0x0
+    const/4 v1, 0x1
+    add-int/2addr v0, v1
+    add-int/lit8 v1, v0, 0x1
+    mul-int v0, v1, v0
+    return v0
+.end method
index 3f613ef..8d318c3 100644 (file)
@@ -60,6 +60,7 @@ public class Main {
             new Object[]{42}, null, 42));
         testCases.add(new TestCase("invoke-super abstract", "B18380491ConcreteClass", "foo",
             new Object[]{0}, new AbstractMethodError(), null));
+        testCases.add(new TestCase("BadCaseInOpRegRegReg", "BadCaseInOpRegRegReg", "getInt", null, null, 2));
     }
 
     public void runTests() {