From 88a6ccaaa298a7877b786726882c73f6b394063e Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Fri, 24 Jul 2015 21:29:11 -0400 Subject: [PATCH] 8131782: C1 Class.cast optimization breaks when Class is loaded from static final Change as_ValueType() to return InstanceConstant when appropriate Reviewed-by: jrose --- hotspot/src/share/vm/c1/c1_ValueType.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/hotspot/src/share/vm/c1/c1_ValueType.cpp b/hotspot/src/share/vm/c1/c1_ValueType.cpp index 0aebd036a78..5f86a8b9309 100644 --- a/hotspot/src/share/vm/c1/c1_ValueType.cpp +++ b/hotspot/src/share/vm/c1/c1_ValueType.cpp @@ -153,7 +153,19 @@ ValueType* as_ValueType(ciConstant value) { 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;