diff options
author | 2021-01-25 14:11:05 +0000 | |
---|---|---|
committer | 2021-01-25 07:01:32 -0800 | |
commit | 3a73ffb70151dbc99fa41f300a237f8c29783e0e (patch) | |
tree | 8debef1b372e5bea27d5265a9019446229955e3d /compiler/optimizing/scheduler.cc | |
parent | e585964df42e9fd2fab6f209810cb03e1b261ab1 (diff) |
Revert^4 "Partial Load Store Elimination"
This reverts commit 791df7a161ecfa28eb69862a4bc285282463b960.
This unreverts commit fc1ce4e8be0d977e3d41699f5ec746d68f63c024.
This unreverts commit b8686ce4c93eba7192ed7ef89e7ffd9f3aa6cd07.
We incorrectly failed to include PredicatedInstanceFieldGet in a few
conditions, including a DCHECK. This caused tests to fail under the
read-barrier-table-lookup configuration.
Reason for revert: Fixed 2 incorrect checks
Bug: 67037140
Test: ./art/test/testrunner/run_build_test_target.py -j70 art-gtest-read-barrier-table-lookup
Change-Id: I32b01b29fb32077fb5074e7c77a0226bd1fcaab4
Diffstat (limited to 'compiler/optimizing/scheduler.cc')
-rw-r--r-- | compiler/optimizing/scheduler.cc | 82 |
1 files changed, 38 insertions, 44 deletions
diff --git a/compiler/optimizing/scheduler.cc b/compiler/optimizing/scheduler.cc index c1891de69a..7140e2424a 100644 --- a/compiler/optimizing/scheduler.cc +++ b/compiler/optimizing/scheduler.cc @@ -14,13 +14,14 @@ * limitations under the License. */ -#include <string> - #include "scheduler.h" +#include <string> + #include "base/scoped_arena_allocator.h" #include "base/scoped_arena_containers.h" #include "data_type-inl.h" +#include "optimizing/load_store_analysis.h" #include "prepare_for_register_allocation.h" #ifdef ART_ENABLE_CODEGEN_arm64 @@ -107,6 +108,7 @@ static bool IsArrayAccess(const HInstruction* instruction) { static bool IsInstanceFieldAccess(const HInstruction* instruction) { return instruction->IsInstanceFieldGet() || instruction->IsInstanceFieldSet() || + instruction->IsPredicatedInstanceFieldGet() || instruction->IsUnresolvedInstanceFieldGet() || instruction->IsUnresolvedInstanceFieldSet(); } @@ -121,6 +123,7 @@ static bool IsStaticFieldAccess(const HInstruction* instruction) { static bool IsResolvedFieldAccess(const HInstruction* instruction) { return instruction->IsInstanceFieldGet() || instruction->IsInstanceFieldSet() || + instruction->IsPredicatedInstanceFieldGet() || instruction->IsStaticFieldGet() || instruction->IsStaticFieldSet(); } @@ -137,18 +140,7 @@ static bool IsFieldAccess(const HInstruction* instruction) { } static const FieldInfo* GetFieldInfo(const HInstruction* instruction) { - if (instruction->IsInstanceFieldGet()) { - return &instruction->AsInstanceFieldGet()->GetFieldInfo(); - } else if (instruction->IsInstanceFieldSet()) { - return &instruction->AsInstanceFieldSet()->GetFieldInfo(); - } else if (instruction->IsStaticFieldGet()) { - return &instruction->AsStaticFieldGet()->GetFieldInfo(); - } else if (instruction->IsStaticFieldSet()) { - return &instruction->AsStaticFieldSet()->GetFieldInfo(); - } else { - LOG(FATAL) << "Unexpected field access type"; - UNREACHABLE(); - } + return &instruction->GetFieldInfo(); } size_t SideEffectDependencyAnalysis::MemoryDependencyAnalysis::FieldAccessHeapLocation( @@ -560,7 +552,7 @@ void HScheduler::Schedule(HGraph* graph) { // should run the analysis or not. const HeapLocationCollector* heap_location_collector = nullptr; ScopedArenaAllocator allocator(graph->GetArenaStack()); - LoadStoreAnalysis lsa(graph, /*stats=*/nullptr, &allocator, /*for_elimination=*/false); + LoadStoreAnalysis lsa(graph, /*stats=*/nullptr, &allocator, LoadStoreAnalysisType::kBasic); if (!only_optimize_loop_blocks_ || graph->HasLoops()) { lsa.Run(); heap_location_collector = &lsa.GetHeapLocationCollector(); @@ -730,35 +722,37 @@ bool HScheduler::IsSchedulable(const HInstruction* instruction) const { // TODO: Some of the instructions above may be safe to schedule (maybe as // scheduling barriers). return instruction->IsArrayGet() || - instruction->IsArraySet() || - instruction->IsArrayLength() || - instruction->IsBoundType() || - instruction->IsBoundsCheck() || - instruction->IsCheckCast() || - instruction->IsClassTableGet() || - instruction->IsCurrentMethod() || - instruction->IsDivZeroCheck() || - (instruction->IsInstanceFieldGet() && !instruction->AsInstanceFieldGet()->IsVolatile()) || - (instruction->IsInstanceFieldSet() && !instruction->AsInstanceFieldSet()->IsVolatile()) || - instruction->IsInstanceOf() || - instruction->IsInvokeInterface() || - instruction->IsInvokeStaticOrDirect() || - instruction->IsInvokeUnresolved() || - instruction->IsInvokeVirtual() || - instruction->IsLoadString() || - instruction->IsNewArray() || - instruction->IsNewInstance() || - instruction->IsNullCheck() || - instruction->IsPackedSwitch() || - instruction->IsParameterValue() || - instruction->IsPhi() || - instruction->IsReturn() || - instruction->IsReturnVoid() || - instruction->IsSelect() || - (instruction->IsStaticFieldGet() && !instruction->AsStaticFieldGet()->IsVolatile()) || - (instruction->IsStaticFieldSet() && !instruction->AsStaticFieldSet()->IsVolatile()) || - instruction->IsSuspendCheck() || - instruction->IsTypeConversion(); + instruction->IsArraySet() || + instruction->IsArrayLength() || + instruction->IsBoundType() || + instruction->IsBoundsCheck() || + instruction->IsCheckCast() || + instruction->IsClassTableGet() || + instruction->IsCurrentMethod() || + instruction->IsDivZeroCheck() || + (instruction->IsInstanceFieldGet() && !instruction->AsInstanceFieldGet()->IsVolatile()) || + (instruction->IsPredicatedInstanceFieldGet() && + !instruction->AsPredicatedInstanceFieldGet()->IsVolatile()) || + (instruction->IsInstanceFieldSet() && !instruction->AsInstanceFieldSet()->IsVolatile()) || + instruction->IsInstanceOf() || + instruction->IsInvokeInterface() || + instruction->IsInvokeStaticOrDirect() || + instruction->IsInvokeUnresolved() || + instruction->IsInvokeVirtual() || + instruction->IsLoadString() || + instruction->IsNewArray() || + instruction->IsNewInstance() || + instruction->IsNullCheck() || + instruction->IsPackedSwitch() || + instruction->IsParameterValue() || + instruction->IsPhi() || + instruction->IsReturn() || + instruction->IsReturnVoid() || + instruction->IsSelect() || + (instruction->IsStaticFieldGet() && !instruction->AsStaticFieldGet()->IsVolatile()) || + (instruction->IsStaticFieldSet() && !instruction->AsStaticFieldSet()->IsVolatile()) || + instruction->IsSuspendCheck() || + instruction->IsTypeConversion(); } bool HScheduler::IsSchedulable(const HBasicBlock* block) const { |