diff options
| author | 2015-06-21 18:57:02 +0100 | |
|---|---|---|
| committer | 2015-06-21 18:57:02 +0100 | |
| commit | aa919207d2fb63af11d72d3b7cdbc435769565af (patch) | |
| tree | dd5e34a864dcb866eea52e85c49f514a39bacda5 /compiler/optimizing/builder.cc | |
| parent | 74f774f0d6389c432122ca262c6705118f5ebd6e (diff) | |
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
Diffstat (limited to 'compiler/optimizing/builder.cc')
| -rw-r--r-- | compiler/optimizing/builder.cc | 5 |
1 files changed, 3 insertions, 2 deletions
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<uint32_t> 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; } |