diff options
author | Alex Light <allight@google.com> | 2021-01-22 14:05:13 +0000 |
---|---|---|
committer | Alex Light <allight@google.com> | 2021-01-22 07:15:51 -0800 |
commit | fc1ce4e8be0d977e3d41699f5ec746d68f63c024 (patch) | |
tree | b656aa7c9e62aa181dfbf7fd4f2a0d32b8bf0704 /compiler/optimizing/optimizing_unit_test.h | |
parent | c6da1be58086e873c9695f8c4c1a3a8ca718696e (diff) |
Revert^2 "Partial Load Store Elimination"
This reverts commit 47ac53100303e7e864b7f6d65f17b23088ccf1d6.
There was a bug in LSE where we would incorrectly record the
shadow$_monitor_ field as not having a default initial value. This
caused partial LSE to be unable to compile the Object.identityHashCode
function, causing crashes. This issue was fixed in a parent CL. Also
updated all Offsets in LSE_test to be outside of the object header
regardless of configuration.
Test: ./test.py --host
Bug: 67037140
Reason for revert: Fixed issue with shadow$_monitor_ field and offsets
Change-Id: I4fb2afff4d410da818db38ed833927dfc0f6be33
Diffstat (limited to 'compiler/optimizing/optimizing_unit_test.h')
-rw-r--r-- | compiler/optimizing/optimizing_unit_test.h | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/compiler/optimizing/optimizing_unit_test.h b/compiler/optimizing/optimizing_unit_test.h index 89b606d9d2..cf97c41983 100644 --- a/compiler/optimizing/optimizing_unit_test.h +++ b/compiler/optimizing/optimizing_unit_test.h @@ -18,8 +18,10 @@ #define ART_COMPILER_OPTIMIZING_OPTIMIZING_UNIT_TEST_H_ #include <memory> +#include <string_view> #include <vector> +#include "base/indenter.h" #include "base/malloc_arena_pool.h" #include "base/scoped_arena_allocator.h" #include "builder.h" @@ -30,7 +32,9 @@ #include "dex/standard_dex_file.h" #include "driver/dex_compilation_unit.h" #include "graph_checker.h" +#include "gtest/gtest.h" #include "handle_scope-inl.h" +#include "handle_scope.h" #include "mirror/class_loader.h" #include "mirror/dex_cache.h" #include "nodes.h" @@ -38,8 +42,6 @@ #include "ssa_builder.h" #include "ssa_liveness_analysis.h" -#include "gtest/gtest.h" - namespace art { #define NUM_INSTRUCTIONS(...) \ @@ -183,8 +185,8 @@ class OptimizingUnitTestHelper { } } - void InitGraph() { - CreateGraph(); + void InitGraph(VariableSizedHandleScope* handles = nullptr) { + CreateGraph(handles); entry_block_ = AddNewBlock(); return_block_ = AddNewBlock(); exit_block_ = AddNewBlock(); @@ -246,6 +248,48 @@ class OptimizingUnitTestHelper { return environment; } + void EnsurePredecessorOrder(HBasicBlock* target, std::initializer_list<HBasicBlock*> preds) { + // Make sure the given preds and block predecessors have the same blocks. + BitVector bv(preds.size(), false, Allocator::GetMallocAllocator()); + auto preds_and_idx = ZipCount(MakeIterationRange(target->GetPredecessors())); + bool correct_preds = preds.size() == target->GetPredecessors().size() && + std::all_of(preds.begin(), preds.end(), [&](HBasicBlock* pred) { + return std::any_of(preds_and_idx.begin(), + preds_and_idx.end(), + // Make sure every target predecessor is used only + // once. + [&](std::pair<HBasicBlock*, uint32_t> cur) { + if (cur.first == pred && !bv.IsBitSet(cur.second)) { + bv.SetBit(cur.second); + return true; + } else { + return false; + } + }); + }) && + bv.NumSetBits() == preds.size(); + auto dump_list = [](auto it) { + std::ostringstream oss; + oss << "["; + bool first = true; + for (HBasicBlock* b : it) { + if (!first) { + oss << ", "; + } + first = false; + oss << b->GetBlockId(); + } + oss << "]"; + return oss.str(); + }; + ASSERT_TRUE(correct_preds) << "Predecessors of " << target->GetBlockId() << " are " + << dump_list(target->GetPredecessors()) << " not " + << dump_list(preds); + if (correct_preds) { + std::copy(preds.begin(), preds.end(), target->predecessors_.begin()); + } + } + protected: bool CheckGraph(HGraph* graph, bool check_ref_type_info, std::ostream& oss) { GraphChecker checker(graph); @@ -342,12 +386,34 @@ class AdjacencyListGraph { AdjacencyListGraph& operator=(AdjacencyListGraph&&) = default; AdjacencyListGraph& operator=(const AdjacencyListGraph&) = default; + std::ostream& Dump(std::ostream& os) const { + struct Namer : public BlockNamer { + public: + explicit Namer(const AdjacencyListGraph& alg) : BlockNamer(), alg_(alg) {} + std::ostream& PrintName(std::ostream& os, HBasicBlock* blk) const override { + if (alg_.HasBlock(blk)) { + return os << alg_.GetName(blk) << " (" << blk->GetBlockId() << ")"; + } else { + return os << "<Unnamed B" << blk->GetBlockId() << ">"; + } + } + + const AdjacencyListGraph& alg_; + }; + Namer namer(*this); + return graph_->Dump(os, namer); + } + private: HGraph* graph_; SafeMap<const std::string_view, HBasicBlock*> name_to_block_; SafeMap<const HBasicBlock*, const std::string_view> block_to_name_; }; +inline std::ostream& operator<<(std::ostream& oss, const AdjacencyListGraph& alg) { + return alg.Dump(oss); +} + } // namespace art #endif // ART_COMPILER_OPTIMIZING_OPTIMIZING_UNIT_TEST_H_ |