Revert^2: Deopt does not throw
Rationale:
"CanThrow" of deopt was possibly misused to prevents some
optimizations. However, the instruction technically cannot
throw an exception, and indeed crashed the graph verifier
for some corner cases. This Cl sets that right.
Bug: 29868356
Test: test-art-host,target
(revert^2 of commit 2905de1c0e5b6a0c995be474b3f0efdfdc6a41c4)
Change-Id: I4d4e6c00eff52140aa1845332998224ececc92ef
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index 79d7330..b315c81 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -1272,8 +1272,6 @@
// 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;
@@ -2132,6 +2130,7 @@
!CanThrow() &&
!IsSuspendCheck() &&
!IsControlFlow() &&
+ !IsDeoptimize() &&
!IsNativeDebugInfo() &&
!IsParameterValue() &&
// If we added an explicit barrier then we should keep it.
@@ -3238,7 +3237,9 @@
bool NeedsEnvironment() const OVERRIDE { return true; }
- bool CanThrow() 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; }
DeoptimizationKind GetDeoptimizationKind() const { return GetPackedField<DeoptimizeKindField>(); }