< prev index next >

src/share/vm/opto/ifnode.cpp

Print this page

        

@@ -1528,24 +1528,29 @@
 //------------------------------Identity---------------------------------------
 // If the test is constant & we match, then we are the input Control
 Node *IfProjNode::Identity(PhaseTransform *phase) {
   // Can only optimize if cannot go the other way
   const TypeTuple *t = phase->type(in(0))->is_tuple();
-  if (t == TypeTuple::IFNEITHER ||
-      // kill dead branch first otherwise the IfNode's control will
-      // have 2 control uses (the IfNode that doesn't go away because
-      // it still has uses and this branch of the
-      // If). Node::has_special_unique_user() will cause this node to
-      // be reprocessed once the dead branch is killed.
-      (always_taken(t) && in(0)->outcnt() == 1)) {
+  if (t == TypeTuple::IFNEITHER || always_taken(t)) {
     // IfNode control
     return in(0)->in(0);
   }
   // no progress
   return this;
 }
 
+Node* IfProjNode::Ideal(PhaseGVN* phase, bool can_reshape) {
+  const Type* t = phase->type(in(0));
+  if (can_reshape && in(0)->outcnt() == 2 && t != Type::TOP && always_taken(t->is_tuple())) {
+    // Cut off dead branch if this branch is always taken
+    Node* other = in(0)->as_If()->proj_out(!is_IfTrue());
+    other->set_req(0, phase->C->top());
+    return this;
+  }
+  return NULL;
+}
+
 #ifndef PRODUCT
 //-------------------------------related---------------------------------------
 // An IfProjNode's related node set consists of its input (an IfNode) including
 // the IfNode's condition, plus all of its outputs at level 1. In compact mode,
 // the restrictions for IfNode apply (see IfNode::rel).
< prev index next >