changeset 23481:2b597b92442b

8131782: C1 Class.cast optimization breaks when Class is loaded from static final Summary: change as_ValueType() to return InstanceConstant when appropriate Reviewed-by: jrose
author shade
date Fri, 24 Jul 2015 21:29:11 -0400
parents 252404a1e9e2
children 218483967e52
files src/share/vm/c1/c1_ValueType.cpp
diffstat 1 files changed, 13 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/c1/c1_ValueType.cpp	Fri Dec 18 10:58:25 2015 -0800
+++ b/src/share/vm/c1/c1_ValueType.cpp	Fri Jul 24 21:29:11 2015 -0400
@@ -153,7 +153,19 @@
     case T_FLOAT  : return new FloatConstant (value.as_float ());
     case T_DOUBLE : return new DoubleConstant(value.as_double());
     case T_ARRAY  : // fall through (ciConstant doesn't have an array accessor)
-    case T_OBJECT : return new ObjectConstant(value.as_object());
+    case T_OBJECT : {
+      // TODO: Common the code with GraphBuilder::load_constant?
+      ciObject* obj = value.as_object();
+      if (obj->is_null_object())
+        return objectNull;
+      if (obj->is_loaded()) {
+        if (obj->is_array())
+          return new ArrayConstant(obj->as_array());
+        else if (obj->is_instance())
+          return new InstanceConstant(obj->as_instance());
+      }
+      return new ObjectConstant(obj);
+    }
   }
   ShouldNotReachHere();
   return illegalType;