Improve DCE's SimplifyAlwaysThrows regarding Invoke location

Allow SimplifyAlwaysThrows to run on any invoke that always throws,
and not just the second to last instruction.

As a bonus, there are two places that would make a graph have
invokes that always throws:
  1) When inlining a method that has invokes that always throw.
  2) When trying to inline a method, and not doing it since it
     always throws.

Since we only have those two places, we can add a flag to the graph
that tracks this. We then skip the SimplifyAlwaysThrows optimization
altogether if the graph doesn't have that flag set.

Bug: 227316307
Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b
Change-Id: Ia353fcf2c055885cc04e10790584210c2e488e32
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index 90c8f74..ba6d1a7 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -2108,8 +2108,9 @@
   MoveBefore(insert_pos);
 }
 
-HBasicBlock* HBasicBlock::SplitBefore(HInstruction* cursor) {
-  DCHECK(!graph_->IsInSsaForm()) << "Support for SSA form not implemented.";
+HBasicBlock* HBasicBlock::SplitBefore(HInstruction* cursor, bool require_graph_not_in_ssa_form) {
+  DCHECK_IMPLIES(require_graph_not_in_ssa_form, !graph_->IsInSsaForm())
+      << "Support for SSA form not implemented.";
   DCHECK_EQ(cursor->GetBlock(), this);
 
   HBasicBlock* new_block =
@@ -2733,6 +2734,9 @@
   if (HasSIMD()) {
     outer_graph->SetHasSIMD(true);
   }
+  if (HasAlwaysThrowingInvokes()) {
+    outer_graph->SetHasAlwaysThrowingInvokes(true);
+  }
 
   HInstruction* return_value = nullptr;
   if (GetBlocks().size() == 3) {