message: Type checker test for a move-wide instruction with overlapping source and destination
  Summary: This test covers an issue in the IR type checker fixed by
diff: @@ -524,3 +524,27 @@ TEST_F(IRTypeCheckerTest, polymorphicConstants3) {
  "v0' for register v0: expected type INT, but found REFERENCE instead",
  regular_checker.what());
  }
  +
  +TEST_F(IRTypeCheckerTest, overlappingMoveWide) {
  + using namespace dex_asm;
  + std::vector<IRInstruction*> insns = {
  + dasm(OPCODE_MOVE_WIDE, {1_v, 7_v}),
  + dasm(OPCODE_MOVE_WIDE, {0_v, 1_v}),
  + dasm(OPCODE_MOVE_WIDE, {0_v, 10_v}),
  + dasm(OPCODE_MOVE_WIDE, {1_v, 0_v}),
  + dasm(OPCODE_RETURN, {9_v}),
  + };
  + add_code(insns);
  + IRTypeChecker checker(m_method);
  + checker.run();
  + EXPECT_TRUE(checker.good()) << checker.what();
  + EXPECT_EQ("OK", checker.what());
  + EXPECT_EQ(LONG1, checker.get_type(insns[1], 1));
  + EXPECT_EQ(LONG2, checker.get_type(insns[1], 2));
  + EXPECT_EQ(LONG1, checker.get_type(insns[2], 0));
  + EXPECT_EQ(LONG2, checker.get_type(insns[2], 1));
  + EXPECT_EQ(DOUBLE1, checker.get_type(insns[3], 0));
  + EXPECT_EQ(DOUBLE2, checker.get_type(insns[3], 1));
  + EXPECT_EQ(DOUBLE1, checker.get_type(insns[4], 1));
  + EXPECT_EQ(DOUBLE2, checker.get_type(insns[4], 2));
  +}
  