From 75ff2c96c37485ff8c74cf9942c0a4bf0710e91c Mon Sep 17 00:00:00 2001 From: Aart Bik Date: Sat, 21 Apr 2018 01:28:11 +0000 Subject: Revert "Revert^2: Deopt does not throw" This reverts commit 240384b7d96c2d579bf58ed7a3e9c9ba1911dae3. Reason for revert: P1 b/78360004 points to this so reverting for now (will triage later) Change-Id: I041c1d9fc045391c73e887268c3b1b9b69fcc216 --- compiler/optimizing/nodes.cc | 9 +++++++++ compiler/optimizing/nodes.h | 7 +++---- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'compiler/optimizing') diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 79bb70b9aa..f784f8f7f3 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -1916,6 +1916,15 @@ const HTryBoundary* HBasicBlock::ComputeTryEntryOfSuccessors() const { } } +bool HBasicBlock::HasThrowingInstructions() const { + for (HInstructionIterator it(GetInstructions()); !it.Done(); it.Advance()) { + if (it.Current()->CanThrow()) { + return true; + } + } + return false; +} + static bool HasOnlyOneInstruction(const HBasicBlock& block) { return block.GetPhis().IsEmpty() && !block.GetInstructions().IsEmpty() diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index b315c81693..79d733060b 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -1272,6 +1272,8 @@ class HBasicBlock : public ArenaObject { // the appropriate try entry will be returned. const HTryBoundary* ComputeTryEntryOfSuccessors() const; + bool HasThrowingInstructions() const; + // Returns whether this block dominates the blocked passed as parameter. bool Dominates(HBasicBlock* block) const; @@ -2130,7 +2132,6 @@ class HInstruction : public ArenaObject { !CanThrow() && !IsSuspendCheck() && !IsControlFlow() && - !IsDeoptimize() && !IsNativeDebugInfo() && !IsParameterValue() && // If we added an explicit barrier then we should keep it. @@ -3237,9 +3238,7 @@ class HDeoptimize FINAL : public HVariableInputSizeInstruction { bool NeedsEnvironment() const OVERRIDE { return true; } - // Even though deoptimize is often used for "exceptional cases" to go back to - // the interpreter, it never throws an exception. - bool CanThrow() const OVERRIDE { return false; } + bool CanThrow() const OVERRIDE { return true; } DeoptimizationKind GetDeoptimizationKind() const { return GetPackedField(); } -- cgit v1.2.3-59-g8ed1b