From 08b60ea29684c526f7bfb4ec30f6b0bf2186422d Mon Sep 17 00:00:00 2001 From: Santiago Aboy Solanes Date: Fri, 24 May 2024 16:36:52 +0100 Subject: Eliminate never taken loops If a loop is never taken we can safely eliminate it. Known limitation: Due to how the loop trip calculation works, if the calculation would overflow we would get "unknown" number of trips. This could happen even for loops with 0 real iterations like `(int i = Integer.MAX_VALUE; i < Integer.MIN_VALUE; i++)`. Bug: 336236538 Fixes: 336236538 Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b Test: m test-art-host-gtest-art_compiler_tests64 Change-Id: I26cae89a593e3375f9f1990a47f3c8973a76364c --- compiler/optimizing/loop_optimization.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'compiler/optimizing/loop_optimization.cc') diff --git a/compiler/optimizing/loop_optimization.cc b/compiler/optimizing/loop_optimization.cc index 8d698d6c82..215986910b 100644 --- a/compiler/optimizing/loop_optimization.cc +++ b/compiler/optimizing/loop_optimization.cc @@ -1094,9 +1094,16 @@ bool HLoopOptimization::TryFullUnrolling(LoopAnalysisInfo* analysis_info, bool g bool HLoopOptimization::TryLoopScalarOpts(LoopNode* node) { HLoopInformation* loop_info = node->loop_info; int64_t trip_count = LoopAnalysis::GetLoopTripCount(loop_info, &induction_range_); + if (trip_count == 0) { + // Mark the loop as dead. + HIf* loop_hif = loop_info->GetHeader()->GetLastInstruction()->AsIf(); + int32_t constant = loop_info->Contains(*loop_hif->IfTrueSuccessor()) ? 0 : 1; + loop_hif->ReplaceInput(graph_->GetIntConstant(constant), 0u); + return true; + } + LoopAnalysisInfo analysis_info(loop_info); LoopAnalysis::CalculateLoopBasicProperties(loop_info, &analysis_info, trip_count); - if (analysis_info.HasInstructionsPreventingScalarOpts() || arch_loop_helper_->IsLoopNonBeneficialForScalarOpts(&analysis_info)) { return false; -- cgit v1.2.3-59-g8ed1b