< prev index next >

src/hotspot/share/opto/cfgnode.cpp

Print this page

        

@@ -1644,16 +1644,17 @@
   // Note: During parsing, phis are often transformed before their regions.
   // This means we have to use type_or_null to defend against untyped regions.
   if( phase->type_or_null(r) == Type::TOP ) // Dead code?
     return NULL;                // No change
 
-  // If all inputs are value types, push the value type node down through the
-  // phi because value type nodes should be merged through their input values.
+  // If all inputs are value types of the same type, push the value type node down
+  // through the phi because value type nodes should be merged through their input values.
   if (req() > 2 && in(1) != NULL && in(1)->is_ValueTypeBase() && (can_reshape || in(1)->is_ValueType())) {
     int opcode = in(1)->Opcode();
     uint i = 2;
-    for (; i < req() && in(i) && in(i)->is_ValueTypeBase(); i++) {
+    // Check if inputs are values of the same type
+    for (; i < req() && in(i) && in(i)->is_ValueTypeBase() && in(i)->cmp(*in(1)); i++) {
       assert(in(i)->Opcode() == opcode, "mixing pointers and values?");
     }
     if (i == req()) {
       ValueTypeBaseNode* vt = in(1)->as_ValueTypeBase()->clone_with_phis(phase, in(0));
       for (uint i = 2; i < req(); ++i) {
< prev index next >