diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/graph_checker.cc | 9 | ||||
| -rw-r--r-- | compiler/optimizing/inliner.cc | 4 | ||||
| -rw-r--r-- | compiler/optimizing/intrinsics.h | 11 |
3 files changed, 15 insertions, 9 deletions
diff --git a/compiler/optimizing/graph_checker.cc b/compiler/optimizing/graph_checker.cc index 8f2f25355d..d4b0bf2e81 100644 --- a/compiler/optimizing/graph_checker.cc +++ b/compiler/optimizing/graph_checker.cc @@ -739,14 +739,7 @@ void GraphChecker::VisitInvoke(HInvoke* invoke) { // Check for intrinsics which should have been replaced by intermediate representation in the // instruction builder. - if (IsIntrinsicWithSpecializedHir(invoke->GetIntrinsic()) && - // FIXME: The inliner can currently create graphs with any of the intrinsics with HIR. - // However, we are able to compensate for `StringCharAt` and `StringLength` in the - // `HInstructionSimplifier`, so we're allowing these two intrinsics for now, preserving - // the old behavior. Besides fixing the bug, we should also clean up the simplifier - // and remove `SimplifyStringCharAt` and `SimplifyStringLength`. Bug: 319045458 - invoke->GetIntrinsic() != Intrinsics::kStringCharAt && - invoke->GetIntrinsic() != Intrinsics::kStringLength) { + if (!IsValidIntrinsicAfterBuilder(invoke->GetIntrinsic())) { AddError( StringPrintf("The graph contains the instrinsic %d which should have been replaced in the " "instruction builder: %s:%d in block %d.", diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc index e0bf028138..16abf0b0de 100644 --- a/compiler/optimizing/inliner.cc +++ b/compiler/optimizing/inliner.cc @@ -1543,7 +1543,9 @@ bool HInliner::TryBuildAndInline(HInvoke* invoke_instruction, bool is_speculative) { // If invoke_instruction is devirtualized to a different method, give intrinsics // another chance before we try to inline it. - if (invoke_instruction->GetResolvedMethod() != method && method->IsIntrinsic()) { + if (invoke_instruction->GetResolvedMethod() != method && + method->IsIntrinsic() && + IsValidIntrinsicAfterBuilder(static_cast<Intrinsics>(method->GetIntrinsic()))) { MaybeRecordStat(stats_, MethodCompilationStat::kIntrinsicRecognized); // For simplicity, always create a new instruction to replace the existing // invoke. diff --git a/compiler/optimizing/intrinsics.h b/compiler/optimizing/intrinsics.h index d14d264204..0a431b8aa8 100644 --- a/compiler/optimizing/intrinsics.h +++ b/compiler/optimizing/intrinsics.h @@ -177,6 +177,17 @@ static inline bool IsIntrinsicWithSpecializedHir(Intrinsics intrinsic) { } } +static inline bool IsValidIntrinsicAfterBuilder(Intrinsics intrinsic) { + return !IsIntrinsicWithSpecializedHir(intrinsic) || + // FIXME: The inliner can currently create graphs with any of the intrinsics with HIR. + // However, we are able to compensate for `StringCharAt` and `StringLength` in the + // `HInstructionSimplifier`, so we're allowing these two intrinsics for now, preserving + // the old behavior. Besides fixing the bug, we should also clean up the simplifier + // and remove `SimplifyStringCharAt` and `SimplifyStringLength`. Bug: 319045458 + intrinsic == Intrinsics::kStringCharAt || + intrinsic == Intrinsics::kStringLength; +} + #define GENERIC_OPTIMIZATION(name, bit) \ public: \ void Set##name() { SetBit(k##name); } \ |