changeset 38045:808cbf1958ce

8153357: C2 creates incorrect cast after eliminating phi with unique input Summary: Refine C2's logic to determine the type of cast node added. Reviewed-by: kvn
author zmajo
date Mon, 18 Apr 2016 11:22:51 +0200
parents a2a381c8b429
children f8383064eaa2 4787ae4b4d1c
files hotspot/src/share/vm/opto/cfgnode.cpp
diffstat 1 files changed, 5 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/hotspot/src/share/vm/opto/cfgnode.cpp	Mon Apr 18 09:39:55 2016 +0200
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp	Mon Apr 18 11:22:51 2016 +0200
@@ -1703,16 +1703,19 @@
     }
 
     if (uncasted) {
-      // Wait until after parsing for the type information to propagate from the casts
+      // Add a cast node between the phi to be removed and its unique input.
+      // Wait until after parsing for the type information to propagate from the casts.
       assert(can_reshape, "Invalid during parsing");
       const Type* phi_type = bottom_type();
       assert(phi_type->isa_int() || phi_type->isa_ptr(), "bad phi type");
       int opcode;
+      // Determine the type of cast to be added.
       if (phi_type->isa_int()) {
         opcode = Op_CastII;
       } else {
         const Type* uin_type = phase->type(uin);
-        if (phi_type->join(TypePtr::NOTNULL) == uin_type->join(TypePtr::NOTNULL)) {
+        if ((phi_type->join(TypePtr::NOTNULL) == uin_type->join(TypePtr::NOTNULL)) ||
+            (!phi_type->isa_oopptr() && !uin_type->isa_oopptr())) {
           opcode = Op_CastPP;
         } else {
           opcode = Op_CheckCastPP;