From aa919207d2fb63af11d72d3b7cdbc435769565af Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Sun, 21 Jun 2015 18:57:02 +0100 Subject: Fix String Change baseline compiler errors. The String Change adds multiple move results if the uninitialized string is in multiple registers. This adds StoreLocals on the same instruction, which isn't allowed. Now, a LoadLocal is added for each extra move needed. Change-Id: I49f676cb85de051e737e0653138cbb947a73e48b --- compiler/optimizing/builder.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'compiler/optimizing') diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 2a555e46ac..ffa4cc328d 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -810,6 +810,7 @@ bool HGraphBuilder::BuildInvoke(const Instruction& instruction, // Add move-result for StringFactory method. if (is_string_init) { uint32_t orig_this_reg = is_range ? register_index : args[0]; + UpdateLocal(orig_this_reg, invoke); const VerifiedMethod* verified_method = compiler_driver_->GetVerifiedMethod(dex_file_, dex_compilation_unit_->GetDexMethodIndex()); if (verified_method == nullptr) { @@ -823,10 +824,10 @@ bool HGraphBuilder::BuildInvoke(const Instruction& instruction, if (map_it != string_init_map.end()) { std::set reg_set = map_it->second; for (auto set_it = reg_set.begin(); set_it != reg_set.end(); ++set_it) { - UpdateLocal(*set_it, invoke); + HInstruction* load_local = LoadLocal(orig_this_reg, Primitive::kPrimNot); + UpdateLocal(*set_it, load_local); } } - UpdateLocal(orig_this_reg, invoke); } return true; } -- cgit v1.2.3-59-g8ed1b