1 /*
   2  * Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "ci/ciMethodData.hpp"
  26 #include "ci/ciTypeFlow.hpp"
  27 #include "classfile/javaClasses.hpp"
  28 #include "classfile/symbolTable.hpp"
  29 #include "classfile/vmSymbols.hpp"
  30 #include "compiler/compileLog.hpp"
  31 #include "libadt/dict.hpp"
  32 #include "memory/oopFactory.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "oops/instanceKlass.hpp"
  35 #include "oops/instanceMirrorKlass.hpp"
  36 #include "oops/objArrayKlass.hpp"
  37 #include "oops/typeArrayKlass.hpp"
  38 #include "opto/arraycopynode.hpp"
  39 #include "opto/callnode.hpp"
  40 #include "opto/matcher.hpp"
  41 #include "opto/node.hpp"
  42 #include "opto/opcodes.hpp"
  43 #include "opto/rangeinference.hpp"
  44 #include "opto/runtime.hpp"
  45 #include "opto/type.hpp"
  46 #include "runtime/stubRoutines.hpp"
  47 #include "utilities/checkedCast.hpp"
  48 #include "utilities/debug.hpp"
  49 #include "utilities/ostream.hpp"
  50 #include "utilities/powerOfTwo.hpp"
  51 #include "utilities/stringUtils.hpp"
  52 #if INCLUDE_SHENANDOAHGC
  53 #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
  54 #endif // INCLUDE_SHENANDOAHGC
  55 
  56 // Portions of code courtesy of Clifford Click
  57 
  58 // Optimization - Graph Style
  59 
  60 // Dictionary of types shared among compilations.
  61 Dict* Type::_shared_type_dict = nullptr;
  62 
  63 // Array which maps compiler types to Basic Types
  64 const Type::TypeInfo Type::_type_info[Type::lastype] = {
  65   { Bad,             T_ILLEGAL,    "bad",           false, Node::NotAMachineReg},  // Bad
  66   { Control,         T_ILLEGAL,    "control",       false, 0                   },  // Control
  67   { Bottom,          T_VOID,       "top",           false, 0                   },  // Top
  68   { Bad,             T_INT,        "int:",          false, Op_RegI             },  // Int
  69   { Bad,             T_LONG,       "long:",         false, Op_RegL             },  // Long
  70   { Half,            T_VOID,       "half",          false, 0                   },  // Half
  71   { Bad,             T_NARROWOOP,  "narrowoop:",    false, Op_RegN             },  // NarrowOop
  72   { Bad,             T_NARROWKLASS,"narrowklass:",  false, Op_RegN             },  // NarrowKlass
  73   { Bad,             T_ILLEGAL,    "tuple:",        false, Node::NotAMachineReg},  // Tuple
  74   { Bad,             T_ARRAY,      "array:",        false, Node::NotAMachineReg},  // Array
  75   { Bad,             T_ARRAY,      "interfaces:",   false, Node::NotAMachineReg},  // Interfaces
  76 
  77 #if defined(PPC64)
  78   { Bad,             T_ILLEGAL,    "vectormask:",   false, Op_RegVectMask      },  // VectorMask.
  79   { Bad,             T_ILLEGAL,    "vectora:",      false, Op_VecA             },  // VectorA.
  80   { Bad,             T_ILLEGAL,    "vectors:",      false, 0                   },  // VectorS
  81   { Bad,             T_ILLEGAL,    "vectord:",      false, Op_RegL             },  // VectorD
  82   { Bad,             T_ILLEGAL,    "vectorx:",      false, Op_VecX             },  // VectorX
  83   { Bad,             T_ILLEGAL,    "vectory:",      false, 0                   },  // VectorY
  84   { Bad,             T_ILLEGAL,    "vectorz:",      false, 0                   },  // VectorZ
  85 #elif defined(S390)
  86   { Bad,             T_ILLEGAL,    "vectormask:",   false, Op_RegVectMask      },  // VectorMask.
  87   { Bad,             T_ILLEGAL,    "vectora:",      false, Op_VecA             },  // VectorA.
  88   { Bad,             T_ILLEGAL,    "vectors:",      false, 0                   },  // VectorS
  89   { Bad,             T_ILLEGAL,    "vectord:",      false, Op_RegL             },  // VectorD
  90   { Bad,             T_ILLEGAL,    "vectorx:",      false, Op_VecX             },  // VectorX
  91   { Bad,             T_ILLEGAL,    "vectory:",      false, 0                   },  // VectorY
  92   { Bad,             T_ILLEGAL,    "vectorz:",      false, 0                   },  // VectorZ
  93 #else // all other
  94   { Bad,             T_ILLEGAL,    "vectormask:",   false, Op_RegVectMask      },  // VectorMask.
  95   { Bad,             T_ILLEGAL,    "vectora:",      false, Op_VecA             },  // VectorA.
  96   { Bad,             T_ILLEGAL,    "vectors:",      false, Op_VecS             },  // VectorS
  97   { Bad,             T_ILLEGAL,    "vectord:",      false, Op_VecD             },  // VectorD
  98   { Bad,             T_ILLEGAL,    "vectorx:",      false, Op_VecX             },  // VectorX
  99   { Bad,             T_ILLEGAL,    "vectory:",      false, Op_VecY             },  // VectorY
 100   { Bad,             T_ILLEGAL,    "vectorz:",      false, Op_VecZ             },  // VectorZ
 101 #endif
 102   { Bad,             T_ADDRESS,    "anyptr:",       false, Op_RegP             },  // AnyPtr
 103   { Bad,             T_ADDRESS,    "rawptr:",       false, Op_RegP             },  // RawPtr
 104   { Bad,             T_OBJECT,     "oop:",          true,  Op_RegP             },  // OopPtr
 105   { Bad,             T_OBJECT,     "inst:",         true,  Op_RegP             },  // InstPtr
 106   { Bad,             T_OBJECT,     "ary:",          true,  Op_RegP             },  // AryPtr
 107   { Bad,             T_METADATA,   "metadata:",     false, Op_RegP             },  // MetadataPtr
 108   { Bad,             T_METADATA,   "klass:",        false, Op_RegP             },  // KlassPtr
 109   { Bad,             T_METADATA,   "instklass:",    false, Op_RegP             },  // InstKlassPtr
 110   { Bad,             T_METADATA,   "aryklass:",     false, Op_RegP             },  // AryKlassPtr
 111   { Bad,             T_OBJECT,     "func",          false, 0                   },  // Function
 112   { Abio,            T_ILLEGAL,    "abIO",          false, 0                   },  // Abio
 113   { Return_Address,  T_ADDRESS,    "return_address",false, Op_RegP             },  // Return_Address
 114   { Memory,          T_ILLEGAL,    "memory",        false, 0                   },  // Memory
 115   { HalfFloatBot,    T_SHORT,      "halffloat_top", false, Op_RegF             },  // HalfFloatTop
 116   { HalfFloatCon,    T_SHORT,      "hfcon:",        false, Op_RegF             },  // HalfFloatCon
 117   { HalfFloatTop,    T_SHORT,      "short",         false, Op_RegF             },  // HalfFloatBot
 118   { FloatBot,        T_FLOAT,      "float_top",     false, Op_RegF             },  // FloatTop
 119   { FloatCon,        T_FLOAT,      "ftcon:",        false, Op_RegF             },  // FloatCon
 120   { FloatTop,        T_FLOAT,      "float",         false, Op_RegF             },  // FloatBot
 121   { DoubleBot,       T_DOUBLE,     "double_top",    false, Op_RegD             },  // DoubleTop
 122   { DoubleCon,       T_DOUBLE,     "dblcon:",       false, Op_RegD             },  // DoubleCon
 123   { DoubleTop,       T_DOUBLE,     "double",        false, Op_RegD             },  // DoubleBot
 124   { Top,             T_ILLEGAL,    "bottom",        false, 0                   }   // Bottom
 125 };
 126 
 127 // Map ideal registers (machine types) to ideal types
 128 const Type *Type::mreg2type[_last_machine_leaf];
 129 
 130 // Map basic types to canonical Type* pointers.
 131 const Type* Type::     _const_basic_type[T_CONFLICT+1];
 132 
 133 // Map basic types to constant-zero Types.
 134 const Type* Type::            _zero_type[T_CONFLICT+1];
 135 
 136 // Map basic types to array-body alias types.
 137 const TypeAryPtr* TypeAryPtr::_array_body_type[T_CONFLICT+1];
 138 const TypeInterfaces* TypeAryPtr::_array_interfaces = nullptr;
 139 const TypeInterfaces* TypeAryKlassPtr::_array_interfaces = nullptr;
 140 
 141 //=============================================================================
 142 // Convenience common pre-built types.
 143 const Type *Type::ABIO;         // State-of-machine only
 144 const Type *Type::BOTTOM;       // All values
 145 const Type *Type::CONTROL;      // Control only
 146 const Type *Type::DOUBLE;       // All doubles
 147 const Type *Type::HALF_FLOAT;   // All half floats
 148 const Type *Type::FLOAT;        // All floats
 149 const Type *Type::HALF;         // Placeholder half of doublewide type
 150 const Type *Type::MEMORY;       // Abstract store only
 151 const Type *Type::RETURN_ADDRESS;
 152 const Type *Type::TOP;          // No values in set
 153 
 154 //------------------------------get_const_type---------------------------
 155 const Type* Type::get_const_type(ciType* type, InterfaceHandling interface_handling) {
 156   if (type == nullptr) {
 157     return nullptr;
 158   } else if (type->is_primitive_type()) {
 159     return get_const_basic_type(type->basic_type());
 160   } else {
 161     return TypeOopPtr::make_from_klass(type->as_klass(), interface_handling);
 162   }
 163 }
 164 
 165 //---------------------------array_element_basic_type---------------------------------
 166 // Mapping to the array element's basic type.
 167 BasicType Type::array_element_basic_type() const {
 168   BasicType bt = basic_type();
 169   if (bt == T_INT) {
 170     if (this == TypeInt::INT)   return T_INT;
 171     if (this == TypeInt::CHAR)  return T_CHAR;
 172     if (this == TypeInt::BYTE)  return T_BYTE;
 173     if (this == TypeInt::BOOL)  return T_BOOLEAN;
 174     if (this == TypeInt::SHORT) return T_SHORT;
 175     return T_VOID;
 176   }
 177   return bt;
 178 }
 179 
 180 // For two instance arrays of same dimension, return the base element types.
 181 // Otherwise or if the arrays have different dimensions, return null.
 182 void Type::get_arrays_base_elements(const Type *a1, const Type *a2,
 183                                     const TypeInstPtr **e1, const TypeInstPtr **e2) {
 184 
 185   if (e1) *e1 = nullptr;
 186   if (e2) *e2 = nullptr;
 187   const TypeAryPtr* a1tap = (a1 == nullptr) ? nullptr : a1->isa_aryptr();
 188   const TypeAryPtr* a2tap = (a2 == nullptr) ? nullptr : a2->isa_aryptr();
 189 
 190   if (a1tap != nullptr && a2tap != nullptr) {
 191     // Handle multidimensional arrays
 192     const TypePtr* a1tp = a1tap->elem()->make_ptr();
 193     const TypePtr* a2tp = a2tap->elem()->make_ptr();
 194     while (a1tp && a1tp->isa_aryptr() && a2tp && a2tp->isa_aryptr()) {
 195       a1tap = a1tp->is_aryptr();
 196       a2tap = a2tp->is_aryptr();
 197       a1tp = a1tap->elem()->make_ptr();
 198       a2tp = a2tap->elem()->make_ptr();
 199     }
 200     if (a1tp && a1tp->isa_instptr() && a2tp && a2tp->isa_instptr()) {
 201       if (e1) *e1 = a1tp->is_instptr();
 202       if (e2) *e2 = a2tp->is_instptr();
 203     }
 204   }
 205 }
 206 
 207 //---------------------------get_typeflow_type---------------------------------
 208 // Import a type produced by ciTypeFlow.
 209 const Type* Type::get_typeflow_type(ciType* type) {
 210   switch (type->basic_type()) {
 211 
 212   case ciTypeFlow::StateVector::T_BOTTOM:
 213     assert(type == ciTypeFlow::StateVector::bottom_type(), "");
 214     return Type::BOTTOM;
 215 
 216   case ciTypeFlow::StateVector::T_TOP:
 217     assert(type == ciTypeFlow::StateVector::top_type(), "");
 218     return Type::TOP;
 219 
 220   case ciTypeFlow::StateVector::T_NULL:
 221     assert(type == ciTypeFlow::StateVector::null_type(), "");
 222     return TypePtr::NULL_PTR;
 223 
 224   case ciTypeFlow::StateVector::T_LONG2:
 225     // The ciTypeFlow pass pushes a long, then the half.
 226     // We do the same.
 227     assert(type == ciTypeFlow::StateVector::long2_type(), "");
 228     return TypeInt::TOP;
 229 
 230   case ciTypeFlow::StateVector::T_DOUBLE2:
 231     // The ciTypeFlow pass pushes double, then the half.
 232     // Our convention is the same.
 233     assert(type == ciTypeFlow::StateVector::double2_type(), "");
 234     return Type::TOP;
 235 
 236   case T_ADDRESS:
 237     assert(type->is_return_address(), "");
 238     return TypeRawPtr::make((address)(intptr_t)type->as_return_address()->bci(), relocInfo::none);
 239 
 240   default:
 241     // make sure we did not mix up the cases:
 242     assert(type != ciTypeFlow::StateVector::bottom_type(), "");
 243     assert(type != ciTypeFlow::StateVector::top_type(), "");
 244     assert(type != ciTypeFlow::StateVector::null_type(), "");
 245     assert(type != ciTypeFlow::StateVector::long2_type(), "");
 246     assert(type != ciTypeFlow::StateVector::double2_type(), "");
 247     assert(!type->is_return_address(), "");
 248 
 249     return Type::get_const_type(type);
 250   }
 251 }
 252 
 253 
 254 //-----------------------make_from_constant------------------------------------
 255 const Type* Type::make_from_constant(ciConstant constant, bool require_constant,
 256                                      int stable_dimension, bool is_narrow_oop,
 257                                      bool is_autobox_cache) {
 258   switch (constant.basic_type()) {
 259     case T_BOOLEAN:  return TypeInt::make(constant.as_boolean());
 260     case T_CHAR:     return TypeInt::make(constant.as_char());
 261     case T_BYTE:     return TypeInt::make(constant.as_byte());
 262     case T_SHORT:    return TypeInt::make(constant.as_short());
 263     case T_INT:      return TypeInt::make(constant.as_int());
 264     case T_LONG:     return TypeLong::make(constant.as_long());
 265     case T_FLOAT:    return TypeF::make(constant.as_float());
 266     case T_DOUBLE:   return TypeD::make(constant.as_double());
 267     case T_ARRAY:
 268     case T_OBJECT: {
 269         const Type* con_type = nullptr;
 270         ciObject* oop_constant = constant.as_object();
 271         if (oop_constant->is_null_object()) {
 272           con_type = Type::get_zero_type(T_OBJECT);
 273         } else {
 274           guarantee(require_constant || oop_constant->should_be_constant(), "con_type must get computed");
 275           con_type = TypeOopPtr::make_from_constant(oop_constant, require_constant);
 276           if (Compile::current()->eliminate_boxing() && is_autobox_cache) {
 277             con_type = con_type->is_aryptr()->cast_to_autobox_cache();
 278           }
 279           if (stable_dimension > 0) {
 280             assert(FoldStableValues, "sanity");
 281             assert(!con_type->is_zero_type(), "default value for stable field");
 282             con_type = con_type->is_aryptr()->cast_to_stable(true, stable_dimension);
 283           }
 284         }
 285         if (is_narrow_oop) {
 286           con_type = con_type->make_narrowoop();
 287         }
 288         return con_type;
 289       }
 290     case T_ILLEGAL:
 291       // Invalid ciConstant returned due to OutOfMemoryError in the CI
 292       assert(Compile::current()->env()->failing(), "otherwise should not see this");
 293       return nullptr;
 294     default:
 295       // Fall through to failure
 296       return nullptr;
 297   }
 298 }
 299 
 300 static ciConstant check_mismatched_access(ciConstant con, BasicType loadbt, bool is_unsigned) {
 301   BasicType conbt = con.basic_type();
 302   switch (conbt) {
 303     case T_BOOLEAN: conbt = T_BYTE;   break;
 304     case T_ARRAY:   conbt = T_OBJECT; break;
 305     default:                          break;
 306   }
 307   switch (loadbt) {
 308     case T_BOOLEAN:   loadbt = T_BYTE;   break;
 309     case T_NARROWOOP: loadbt = T_OBJECT; break;
 310     case T_ARRAY:     loadbt = T_OBJECT; break;
 311     case T_ADDRESS:   loadbt = T_OBJECT; break;
 312     default:                             break;
 313   }
 314   if (conbt == loadbt) {
 315     if (is_unsigned && conbt == T_BYTE) {
 316       // LoadB (T_BYTE) with a small mask (<=8-bit) is converted to LoadUB (T_BYTE).
 317       return ciConstant(T_INT, con.as_int() & 0xFF);
 318     } else {
 319       return con;
 320     }
 321   }
 322   if (conbt == T_SHORT && loadbt == T_CHAR) {
 323     // LoadS (T_SHORT) with a small mask (<=16-bit) is converted to LoadUS (T_CHAR).
 324     return ciConstant(T_INT, con.as_int() & 0xFFFF);
 325   }
 326   return ciConstant(); // T_ILLEGAL
 327 }
 328 
 329 // Try to constant-fold a stable array element.
 330 const Type* Type::make_constant_from_array_element(ciArray* array, int off, int stable_dimension,
 331                                                    BasicType loadbt, bool is_unsigned_load) {
 332   // Decode the results of GraphKit::array_element_address.
 333   ciConstant element_value = array->element_value_by_offset(off);
 334   if (element_value.basic_type() == T_ILLEGAL) {
 335     return nullptr; // wrong offset
 336   }
 337   ciConstant con = check_mismatched_access(element_value, loadbt, is_unsigned_load);
 338 
 339   assert(con.basic_type() != T_ILLEGAL, "elembt=%s; loadbt=%s; unsigned=%d",
 340          type2name(element_value.basic_type()), type2name(loadbt), is_unsigned_load);
 341 
 342   if (con.is_valid() &&          // not a mismatched access
 343       !con.is_null_or_zero()) {  // not a default value
 344     bool is_narrow_oop = (loadbt == T_NARROWOOP);
 345     return Type::make_from_constant(con, /*require_constant=*/true, stable_dimension, is_narrow_oop, /*is_autobox_cache=*/false);
 346   }
 347   return nullptr;
 348 }
 349 
 350 const Type* Type::make_constant_from_field(ciInstance* holder, int off, bool is_unsigned_load, BasicType loadbt) {
 351   ciField* field;
 352   ciType* type = holder->java_mirror_type();
 353   if (type != nullptr && type->is_instance_klass() && off >= InstanceMirrorKlass::offset_of_static_fields()) {
 354     // Static field
 355     field = type->as_instance_klass()->get_field_by_offset(off, /*is_static=*/true);
 356   } else {
 357     // Instance field
 358     field = holder->klass()->as_instance_klass()->get_field_by_offset(off, /*is_static=*/false);
 359   }
 360   if (field == nullptr) {
 361     return nullptr; // Wrong offset
 362   }
 363   return Type::make_constant_from_field(field, holder, loadbt, is_unsigned_load);
 364 }
 365 
 366 const Type* Type::make_constant_from_field(ciField* field, ciInstance* holder,
 367                                            BasicType loadbt, bool is_unsigned_load) {
 368   if (!field->is_constant()) {
 369     return nullptr; // Non-constant field
 370   }
 371   ciConstant field_value;
 372   if (field->is_static()) {
 373     // final static field
 374     field_value = field->constant_value();
 375   } else if (holder != nullptr) {
 376     // final or stable non-static field
 377     // Treat final non-static fields of trusted classes (classes in
 378     // java.lang.invoke and sun.invoke packages and subpackages) as
 379     // compile time constants.
 380     field_value = field->constant_value_of(holder);
 381   }
 382   if (!field_value.is_valid()) {
 383     return nullptr; // Not a constant
 384   }
 385 
 386   ciConstant con = check_mismatched_access(field_value, loadbt, is_unsigned_load);
 387 
 388   assert(con.is_valid(), "elembt=%s; loadbt=%s; unsigned=%d",
 389          type2name(field_value.basic_type()), type2name(loadbt), is_unsigned_load);
 390 
 391   bool is_stable_array = FoldStableValues && field->is_stable() && field->type()->is_array_klass();
 392   int stable_dimension = (is_stable_array ? field->type()->as_array_klass()->dimension() : 0);
 393   bool is_narrow_oop = (loadbt == T_NARROWOOP);
 394 
 395   const Type* con_type = make_from_constant(con, /*require_constant=*/ true,
 396                                             stable_dimension, is_narrow_oop,
 397                                             field->is_autobox_cache());
 398   if (con_type != nullptr && field->is_call_site_target()) {
 399     ciCallSite* call_site = holder->as_call_site();
 400     if (!call_site->is_fully_initialized_constant_call_site()) {
 401       ciMethodHandle* target = con.as_object()->as_method_handle();
 402       Compile::current()->dependencies()->assert_call_site_target_value(call_site, target);
 403     }
 404   }
 405   return con_type;
 406 }
 407 
 408 //------------------------------make-------------------------------------------
 409 // Create a simple Type, with default empty symbol sets.  Then hashcons it
 410 // and look for an existing copy in the type dictionary.
 411 const Type *Type::make( enum TYPES t ) {
 412   return (new Type(t))->hashcons();
 413 }
 414 
 415 //------------------------------cmp--------------------------------------------
 416 bool Type::equals(const Type* t1, const Type* t2) {
 417   if (t1->_base != t2->_base) {
 418     return false; // Missed badly
 419   }
 420 
 421   assert(t1 != t2 || t1->eq(t2), "eq must be reflexive");
 422   return t1->eq(t2);
 423 }
 424 
 425 const Type* Type::maybe_remove_speculative(bool include_speculative) const {
 426   if (!include_speculative) {
 427     return remove_speculative();
 428   }
 429   return this;
 430 }
 431 
 432 //------------------------------hash-------------------------------------------
 433 int Type::uhash( const Type *const t ) {
 434   return (int)t->hash();
 435 }
 436 
 437 #define POSITIVE_INFINITE_F 0x7f800000 // hex representation for IEEE 754 single precision positive infinite
 438 #define POSITIVE_INFINITE_D 0x7ff0000000000000 // hex representation for IEEE 754 double precision positive infinite
 439 
 440 //--------------------------Initialize_shared----------------------------------
 441 void Type::Initialize_shared(Compile* current) {
 442   // This method does not need to be locked because the first system
 443   // compilations (stub compilations) occur serially.  If they are
 444   // changed to proceed in parallel, then this section will need
 445   // locking.
 446 
 447   Arena* save = current->type_arena();
 448   Arena* shared_type_arena = new (mtCompiler)Arena(mtCompiler, Arena::Tag::tag_type);
 449 
 450   current->set_type_arena(shared_type_arena);
 451 
 452   // Map the boolean result of Type::equals into a comparator result that CmpKey expects.
 453   CmpKey type_cmp = [](const void* t1, const void* t2) -> int32_t {
 454     return Type::equals((Type*) t1, (Type*) t2) ? 0 : 1;
 455   };
 456 
 457   _shared_type_dict = new (shared_type_arena) Dict(type_cmp, (Hash) Type::uhash, shared_type_arena, 128);
 458   current->set_type_dict(_shared_type_dict);
 459 
 460   // Make shared pre-built types.
 461   CONTROL = make(Control);      // Control only
 462   TOP     = make(Top);          // No values in set
 463   MEMORY  = make(Memory);       // Abstract store only
 464   ABIO    = make(Abio);         // State-of-machine only
 465   RETURN_ADDRESS=make(Return_Address);
 466   FLOAT   = make(FloatBot);     // All floats
 467   HALF_FLOAT = make(HalfFloatBot); // All half floats
 468   DOUBLE  = make(DoubleBot);    // All doubles
 469   BOTTOM  = make(Bottom);       // Everything
 470   HALF    = make(Half);         // Placeholder half of doublewide type
 471 
 472   TypeF::MAX = TypeF::make(max_jfloat); // Float MAX
 473   TypeF::MIN = TypeF::make(min_jfloat); // Float MIN
 474   TypeF::ZERO = TypeF::make(0.0); // Float 0 (positive zero)
 475   TypeF::ONE  = TypeF::make(1.0); // Float 1
 476   TypeF::POS_INF = TypeF::make(jfloat_cast(POSITIVE_INFINITE_F));
 477   TypeF::NEG_INF = TypeF::make(-jfloat_cast(POSITIVE_INFINITE_F));
 478 
 479   TypeH::MAX = TypeH::make(max_jfloat16); // HalfFloat MAX
 480   TypeH::MIN = TypeH::make(min_jfloat16); // HalfFloat MIN
 481   TypeH::ZERO = TypeH::make((jshort)0); // HalfFloat 0 (positive zero)
 482   TypeH::ONE  = TypeH::make(one_jfloat16); // HalfFloat 1
 483   TypeH::POS_INF = TypeH::make(pos_inf_jfloat16);
 484   TypeH::NEG_INF = TypeH::make(neg_inf_jfloat16);
 485 
 486   TypeD::MAX = TypeD::make(max_jdouble); // Double MAX
 487   TypeD::MIN = TypeD::make(min_jdouble); // Double MIN
 488   TypeD::ZERO = TypeD::make(0.0); // Double 0 (positive zero)
 489   TypeD::ONE  = TypeD::make(1.0); // Double 1
 490   TypeD::POS_INF = TypeD::make(jdouble_cast(POSITIVE_INFINITE_D));
 491   TypeD::NEG_INF = TypeD::make(-jdouble_cast(POSITIVE_INFINITE_D));
 492 
 493   TypeInt::MAX = TypeInt::make(max_jint); // Int MAX
 494   TypeInt::MIN = TypeInt::make(min_jint); // Int MIN
 495   TypeInt::MINUS_1  = TypeInt::make(-1);  // -1
 496   TypeInt::ZERO     = TypeInt::make( 0);  //  0
 497   TypeInt::ONE      = TypeInt::make( 1);  //  1
 498   TypeInt::BOOL     = TypeInt::make( 0, 1, WidenMin);  // 0 or 1, FALSE or TRUE.
 499   TypeInt::CC       = TypeInt::make(-1, 1, WidenMin);  // -1, 0 or 1, condition codes
 500   TypeInt::CC_LT    = TypeInt::make(-1,-1, WidenMin);  // == TypeInt::MINUS_1
 501   TypeInt::CC_GT    = TypeInt::make( 1, 1, WidenMin);  // == TypeInt::ONE
 502   TypeInt::CC_EQ    = TypeInt::make( 0, 0, WidenMin);  // == TypeInt::ZERO
 503   TypeInt::CC_NE    = TypeInt::make_or_top(TypeIntPrototype<jint, juint>{{-1, 1}, {1, max_juint}, {0, 1}}, WidenMin)->is_int();
 504   TypeInt::CC_LE    = TypeInt::make(-1, 0, WidenMin);
 505   TypeInt::CC_GE    = TypeInt::make( 0, 1, WidenMin);  // == TypeInt::BOOL
 506   TypeInt::BYTE     = TypeInt::make(-128, 127,     WidenMin); // Bytes
 507   TypeInt::UBYTE    = TypeInt::make(0, 255,        WidenMin); // Unsigned Bytes
 508   TypeInt::CHAR     = TypeInt::make(0, 65535,      WidenMin); // Java chars
 509   TypeInt::SHORT    = TypeInt::make(-32768, 32767, WidenMin); // Java shorts
 510   TypeInt::NON_ZERO = TypeInt::make_or_top(TypeIntPrototype<jint, juint>{{min_jint, max_jint}, {1, max_juint}, {0, 0}}, WidenMin)->is_int();
 511   TypeInt::POS      = TypeInt::make(0, max_jint,   WidenMin); // Non-neg values
 512   TypeInt::POS1     = TypeInt::make(1, max_jint,   WidenMin); // Positive values
 513   TypeInt::INT      = TypeInt::make(min_jint, max_jint, WidenMax); // 32-bit integers
 514   TypeInt::SYMINT   = TypeInt::make(-max_jint, max_jint, WidenMin); // symmetric range
 515   TypeInt::TYPE_DOMAIN = TypeInt::INT;
 516   // CmpL is overloaded both as the bytecode computation returning
 517   // a trinary (-1, 0, +1) integer result AND as an efficient long
 518   // compare returning optimizer ideal-type flags.
 519   assert(TypeInt::CC_LT == TypeInt::MINUS_1, "types must match for CmpL to work" );
 520   assert(TypeInt::CC_GT == TypeInt::ONE,     "types must match for CmpL to work" );
 521   assert(TypeInt::CC_EQ == TypeInt::ZERO,    "types must match for CmpL to work" );
 522   assert(TypeInt::CC_GE == TypeInt::BOOL,    "types must match for CmpL to work" );
 523 
 524   TypeLong::MAX = TypeLong::make(max_jlong); // Long MAX
 525   TypeLong::MIN = TypeLong::make(min_jlong); // Long MIN
 526   TypeLong::MINUS_1  = TypeLong::make(-1);   // -1
 527   TypeLong::ZERO     = TypeLong::make( 0);   //  0
 528   TypeLong::ONE      = TypeLong::make( 1);   //  1
 529   TypeLong::NON_ZERO = TypeLong::make_or_top(TypeIntPrototype<jlong, julong>{{min_jlong, max_jlong}, {1, max_julong}, {0, 0}}, WidenMin)->is_long();
 530   TypeLong::POS      = TypeLong::make(0, max_jlong, WidenMin); // Non-neg values
 531   TypeLong::NEG      = TypeLong::make(min_jlong, -1, WidenMin);
 532   TypeLong::LONG     = TypeLong::make(min_jlong, max_jlong, WidenMax); // 64-bit integers
 533   TypeLong::INT      = TypeLong::make((jlong)min_jint, (jlong)max_jint,WidenMin);
 534   TypeLong::UINT     = TypeLong::make(0, (jlong)max_juint, WidenMin);
 535   TypeLong::TYPE_DOMAIN = TypeLong::LONG;
 536 
 537   const Type **fboth =(const Type**)shared_type_arena->AmallocWords(2*sizeof(Type*));
 538   fboth[0] = Type::CONTROL;
 539   fboth[1] = Type::CONTROL;
 540   TypeTuple::IFBOTH = TypeTuple::make( 2, fboth );
 541 
 542   const Type **ffalse =(const Type**)shared_type_arena->AmallocWords(2*sizeof(Type*));
 543   ffalse[0] = Type::CONTROL;
 544   ffalse[1] = Type::TOP;
 545   TypeTuple::IFFALSE = TypeTuple::make( 2, ffalse );
 546 
 547   const Type **fneither =(const Type**)shared_type_arena->AmallocWords(2*sizeof(Type*));
 548   fneither[0] = Type::TOP;
 549   fneither[1] = Type::TOP;
 550   TypeTuple::IFNEITHER = TypeTuple::make( 2, fneither );
 551 
 552   const Type **ftrue =(const Type**)shared_type_arena->AmallocWords(2*sizeof(Type*));
 553   ftrue[0] = Type::TOP;
 554   ftrue[1] = Type::CONTROL;
 555   TypeTuple::IFTRUE = TypeTuple::make( 2, ftrue );
 556 
 557   const Type **floop =(const Type**)shared_type_arena->AmallocWords(2*sizeof(Type*));
 558   floop[0] = Type::CONTROL;
 559   floop[1] = TypeInt::INT;
 560   TypeTuple::LOOPBODY = TypeTuple::make( 2, floop );
 561 
 562   TypePtr::NULL_PTR= TypePtr::make(AnyPtr, TypePtr::Null, 0);
 563   TypePtr::NOTNULL = TypePtr::make(AnyPtr, TypePtr::NotNull, OffsetBot);
 564   TypePtr::BOTTOM  = TypePtr::make(AnyPtr, TypePtr::BotPTR, OffsetBot);
 565 
 566   TypeRawPtr::BOTTOM = TypeRawPtr::make( TypePtr::BotPTR );
 567   TypeRawPtr::NOTNULL= TypeRawPtr::make( TypePtr::NotNull );
 568 
 569   const Type **fmembar = TypeTuple::fields(0);
 570   TypeTuple::MEMBAR = TypeTuple::make(TypeFunc::Parms+0, fmembar);
 571 
 572   const Type **fsc = (const Type**)shared_type_arena->AmallocWords(2*sizeof(Type*));
 573   fsc[0] = TypeInt::CC;
 574   fsc[1] = Type::MEMORY;
 575   TypeTuple::STORECONDITIONAL = TypeTuple::make(2, fsc);
 576 
 577   TypeInstPtr::NOTNULL = TypeInstPtr::make(TypePtr::NotNull, current->env()->Object_klass());
 578   TypeInstPtr::BOTTOM  = TypeInstPtr::make(TypePtr::BotPTR,  current->env()->Object_klass());
 579   TypeInstPtr::MIRROR  = TypeInstPtr::make(TypePtr::NotNull, current->env()->Class_klass());
 580   TypeInstPtr::MARK    = TypeInstPtr::make(TypePtr::BotPTR,  current->env()->Object_klass(),
 581                                            false, nullptr, oopDesc::mark_offset_in_bytes());
 582   TypeInstPtr::KLASS   = TypeInstPtr::make(TypePtr::BotPTR,  current->env()->Object_klass(),
 583                                            false, nullptr, oopDesc::klass_offset_in_bytes());
 584   TypeOopPtr::BOTTOM  = TypeOopPtr::make(TypePtr::BotPTR, OffsetBot, TypeOopPtr::InstanceBot);
 585 
 586   TypeMetadataPtr::BOTTOM = TypeMetadataPtr::make(TypePtr::BotPTR, nullptr, OffsetBot);
 587 
 588   TypeNarrowOop::NULL_PTR = TypeNarrowOop::make( TypePtr::NULL_PTR );
 589   TypeNarrowOop::BOTTOM   = TypeNarrowOop::make( TypeInstPtr::BOTTOM );
 590 
 591   TypeNarrowKlass::NULL_PTR = TypeNarrowKlass::make( TypePtr::NULL_PTR );
 592 
 593   mreg2type[Op_Node] = Type::BOTTOM;
 594   mreg2type[Op_Set ] = nullptr;
 595   mreg2type[Op_RegN] = TypeNarrowOop::BOTTOM;
 596   mreg2type[Op_RegI] = TypeInt::INT;
 597   mreg2type[Op_RegP] = TypePtr::BOTTOM;
 598   mreg2type[Op_RegF] = Type::FLOAT;
 599   mreg2type[Op_RegD] = Type::DOUBLE;
 600   mreg2type[Op_RegL] = TypeLong::LONG;
 601   mreg2type[Op_RegFlags] = TypeInt::CC;
 602 
 603   GrowableArray<ciInstanceKlass*> array_interfaces;
 604   array_interfaces.push(current->env()->Cloneable_klass());
 605   array_interfaces.push(current->env()->Serializable_klass());
 606   TypeAryPtr::_array_interfaces = TypeInterfaces::make(&array_interfaces);
 607   TypeAryKlassPtr::_array_interfaces = TypeAryPtr::_array_interfaces;
 608 
 609   TypeAryPtr::BOTTOM = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::BOTTOM, TypeInt::POS), nullptr, false, Type::OffsetBot);
 610   TypeAryPtr::RANGE   = TypeAryPtr::make( TypePtr::BotPTR, TypeAry::make(Type::BOTTOM,TypeInt::POS), nullptr /* current->env()->Object_klass() */, false, arrayOopDesc::length_offset_in_bytes());
 611 
 612   TypeAryPtr::NARROWOOPS = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeNarrowOop::BOTTOM, TypeInt::POS), nullptr /*ciArrayKlass::make(o)*/,  false,  Type::OffsetBot);
 613 
 614 #ifdef _LP64
 615   if (UseCompressedOops) {
 616     assert(TypeAryPtr::NARROWOOPS->is_ptr_to_narrowoop(), "array of narrow oops must be ptr to narrow oop");
 617     TypeAryPtr::OOPS  = TypeAryPtr::NARROWOOPS;
 618   } else
 619 #endif
 620   {
 621     // There is no shared klass for Object[].  See note in TypeAryPtr::klass().
 622     TypeAryPtr::OOPS  = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInstPtr::BOTTOM,TypeInt::POS), nullptr /*ciArrayKlass::make(o)*/,  false,  Type::OffsetBot);
 623   }
 624   TypeAryPtr::BYTES   = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::BYTE      ,TypeInt::POS), ciTypeArrayKlass::make(T_BYTE),   true,  Type::OffsetBot);
 625   TypeAryPtr::SHORTS  = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::SHORT     ,TypeInt::POS), ciTypeArrayKlass::make(T_SHORT),  true,  Type::OffsetBot);
 626   TypeAryPtr::CHARS   = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::CHAR      ,TypeInt::POS), ciTypeArrayKlass::make(T_CHAR),   true,  Type::OffsetBot);
 627   TypeAryPtr::INTS    = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeInt::INT       ,TypeInt::POS), ciTypeArrayKlass::make(T_INT),    true,  Type::OffsetBot);
 628   TypeAryPtr::LONGS   = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(TypeLong::LONG     ,TypeInt::POS), ciTypeArrayKlass::make(T_LONG),   true,  Type::OffsetBot);
 629   TypeAryPtr::FLOATS  = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::FLOAT        ,TypeInt::POS), ciTypeArrayKlass::make(T_FLOAT),  true,  Type::OffsetBot);
 630   TypeAryPtr::DOUBLES = TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(Type::DOUBLE       ,TypeInt::POS), ciTypeArrayKlass::make(T_DOUBLE), true,  Type::OffsetBot);
 631 
 632   // Nobody should ask _array_body_type[T_NARROWOOP]. Use null as assert.
 633   TypeAryPtr::_array_body_type[T_NARROWOOP] = nullptr;
 634   TypeAryPtr::_array_body_type[T_OBJECT]  = TypeAryPtr::OOPS;
 635   TypeAryPtr::_array_body_type[T_ARRAY]   = TypeAryPtr::OOPS; // arrays are stored in oop arrays
 636   TypeAryPtr::_array_body_type[T_BYTE]    = TypeAryPtr::BYTES;
 637   TypeAryPtr::_array_body_type[T_BOOLEAN] = TypeAryPtr::BYTES;  // boolean[] is a byte array
 638   TypeAryPtr::_array_body_type[T_SHORT]   = TypeAryPtr::SHORTS;
 639   TypeAryPtr::_array_body_type[T_CHAR]    = TypeAryPtr::CHARS;
 640   TypeAryPtr::_array_body_type[T_INT]     = TypeAryPtr::INTS;
 641   TypeAryPtr::_array_body_type[T_LONG]    = TypeAryPtr::LONGS;
 642   TypeAryPtr::_array_body_type[T_FLOAT]   = TypeAryPtr::FLOATS;
 643   TypeAryPtr::_array_body_type[T_DOUBLE]  = TypeAryPtr::DOUBLES;
 644 
 645   TypeInstKlassPtr::OBJECT = TypeInstKlassPtr::make(TypePtr::NotNull, current->env()->Object_klass(), 0);
 646   TypeInstKlassPtr::OBJECT_OR_NULL = TypeInstKlassPtr::make(TypePtr::BotPTR, current->env()->Object_klass(), 0);
 647 
 648   const Type **fi2c = TypeTuple::fields(2);
 649   fi2c[TypeFunc::Parms+0] = TypeInstPtr::BOTTOM; // Method*
 650   fi2c[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // argument pointer
 651   TypeTuple::START_I2C = TypeTuple::make(TypeFunc::Parms+2, fi2c);
 652 
 653   const Type **intpair = TypeTuple::fields(2);
 654   intpair[0] = TypeInt::INT;
 655   intpair[1] = TypeInt::INT;
 656   TypeTuple::INT_PAIR = TypeTuple::make(2, intpair);
 657 
 658   const Type **longpair = TypeTuple::fields(2);
 659   longpair[0] = TypeLong::LONG;
 660   longpair[1] = TypeLong::LONG;
 661   TypeTuple::LONG_PAIR = TypeTuple::make(2, longpair);
 662 
 663   const Type **intccpair = TypeTuple::fields(2);
 664   intccpair[0] = TypeInt::INT;
 665   intccpair[1] = TypeInt::CC;
 666   TypeTuple::INT_CC_PAIR = TypeTuple::make(2, intccpair);
 667 
 668   const Type **longccpair = TypeTuple::fields(2);
 669   longccpair[0] = TypeLong::LONG;
 670   longccpair[1] = TypeInt::CC;
 671   TypeTuple::LONG_CC_PAIR = TypeTuple::make(2, longccpair);
 672 
 673   _const_basic_type[T_NARROWOOP]   = TypeNarrowOop::BOTTOM;
 674   _const_basic_type[T_NARROWKLASS] = Type::BOTTOM;
 675   _const_basic_type[T_BOOLEAN]     = TypeInt::BOOL;
 676   _const_basic_type[T_CHAR]        = TypeInt::CHAR;
 677   _const_basic_type[T_BYTE]        = TypeInt::BYTE;
 678   _const_basic_type[T_SHORT]       = TypeInt::SHORT;
 679   _const_basic_type[T_INT]         = TypeInt::INT;
 680   _const_basic_type[T_LONG]        = TypeLong::LONG;
 681   _const_basic_type[T_FLOAT]       = Type::FLOAT;
 682   _const_basic_type[T_DOUBLE]      = Type::DOUBLE;
 683   _const_basic_type[T_OBJECT]      = TypeInstPtr::BOTTOM;
 684   _const_basic_type[T_ARRAY]       = TypeInstPtr::BOTTOM; // there is no separate bottom for arrays
 685   _const_basic_type[T_VOID]        = TypePtr::NULL_PTR;   // reflection represents void this way
 686   _const_basic_type[T_ADDRESS]     = TypeRawPtr::BOTTOM;  // both interpreter return addresses & random raw ptrs
 687   _const_basic_type[T_CONFLICT]    = Type::BOTTOM;        // why not?
 688 
 689   _zero_type[T_NARROWOOP]   = TypeNarrowOop::NULL_PTR;
 690   _zero_type[T_NARROWKLASS] = TypeNarrowKlass::NULL_PTR;
 691   _zero_type[T_BOOLEAN]     = TypeInt::ZERO;     // false == 0
 692   _zero_type[T_CHAR]        = TypeInt::ZERO;     // '\0' == 0
 693   _zero_type[T_BYTE]        = TypeInt::ZERO;     // 0x00 == 0
 694   _zero_type[T_SHORT]       = TypeInt::ZERO;     // 0x0000 == 0
 695   _zero_type[T_INT]         = TypeInt::ZERO;
 696   _zero_type[T_LONG]        = TypeLong::ZERO;
 697   _zero_type[T_FLOAT]       = TypeF::ZERO;
 698   _zero_type[T_DOUBLE]      = TypeD::ZERO;
 699   _zero_type[T_OBJECT]      = TypePtr::NULL_PTR;
 700   _zero_type[T_ARRAY]       = TypePtr::NULL_PTR; // null array is null oop
 701   _zero_type[T_ADDRESS]     = TypePtr::NULL_PTR; // raw pointers use the same null
 702   _zero_type[T_VOID]        = Type::TOP;         // the only void value is no value at all
 703 
 704   // get_zero_type() should not happen for T_CONFLICT
 705   _zero_type[T_CONFLICT]= nullptr;
 706 
 707   TypeVect::VECTMASK = (TypeVect*)(new TypePVectMask(T_BOOLEAN, MaxVectorSize))->hashcons();
 708   mreg2type[Op_RegVectMask] = TypeVect::VECTMASK;
 709 
 710   if (Matcher::supports_scalable_vector()) {
 711     TypeVect::VECTA = TypeVect::make(T_BYTE, Matcher::scalable_vector_reg_size(T_BYTE));
 712   }
 713 
 714   // Vector predefined types, it needs initialized _const_basic_type[].
 715   if (Matcher::vector_size_supported(T_BYTE, 4)) {
 716     TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
 717   }
 718   if (Matcher::vector_size_supported(T_FLOAT, 2)) {
 719     TypeVect::VECTD = TypeVect::make(T_FLOAT, 2);
 720   }
 721   if (Matcher::vector_size_supported(T_FLOAT, 4)) {
 722     TypeVect::VECTX = TypeVect::make(T_FLOAT, 4);
 723   }
 724   if (Matcher::vector_size_supported(T_FLOAT, 8)) {
 725     TypeVect::VECTY = TypeVect::make(T_FLOAT, 8);
 726   }
 727   if (Matcher::vector_size_supported(T_FLOAT, 16)) {
 728     TypeVect::VECTZ = TypeVect::make(T_FLOAT, 16);
 729   }
 730 
 731   mreg2type[Op_VecA] = TypeVect::VECTA;
 732   mreg2type[Op_VecS] = TypeVect::VECTS;
 733   mreg2type[Op_VecD] = TypeVect::VECTD;
 734   mreg2type[Op_VecX] = TypeVect::VECTX;
 735   mreg2type[Op_VecY] = TypeVect::VECTY;
 736   mreg2type[Op_VecZ] = TypeVect::VECTZ;
 737 
 738 #if INCLUDE_SHENANDOAHGC
 739   ShenandoahBarrierSetC2::init();
 740 #endif //INCLUDE_SHENANDOAHGC
 741 
 742   BarrierSetC2::make_clone_type();
 743   LockNode::initialize_lock_Type();
 744   ArrayCopyNode::initialize_arraycopy_Type();
 745   OptoRuntime::initialize_types();
 746 
 747   // Restore working type arena.
 748   current->set_type_arena(save);
 749   current->set_type_dict(nullptr);
 750 }
 751 
 752 //------------------------------Initialize-------------------------------------
 753 void Type::Initialize(Compile* current) {
 754   assert(current->type_arena() != nullptr, "must have created type arena");
 755 
 756   if (_shared_type_dict == nullptr) {
 757     Initialize_shared(current);
 758   }
 759 
 760   Arena* type_arena = current->type_arena();
 761 
 762   // Create the hash-cons'ing dictionary with top-level storage allocation
 763   Dict *tdic = new (type_arena) Dict(*_shared_type_dict, type_arena);
 764   current->set_type_dict(tdic);
 765 }
 766 
 767 //------------------------------hashcons---------------------------------------
 768 // Do the hash-cons trick.  If the Type already exists in the type table,
 769 // delete the current Type and return the existing Type.  Otherwise stick the
 770 // current Type in the Type table.
 771 const Type *Type::hashcons(void) {
 772   DEBUG_ONLY(base());           // Check the assertion in Type::base().
 773   // Look up the Type in the Type dictionary
 774   Dict *tdic = type_dict();
 775   Type* old = (Type*)(tdic->Insert(this, this, false));
 776   if( old ) {                   // Pre-existing Type?
 777     if( old != this )           // Yes, this guy is not the pre-existing?
 778       delete this;              // Yes, Nuke this guy
 779     assert( old->_dual, "" );
 780     return old;                 // Return pre-existing
 781   }
 782 
 783   // Every type has a dual (to make my lattice symmetric).
 784   // Since we just discovered a new Type, compute its dual right now.
 785   assert( !_dual, "" );         // No dual yet
 786   _dual = xdual();              // Compute the dual
 787   if (equals(this, _dual)) {    // Handle self-symmetric
 788     if (_dual != this) {
 789       delete _dual;
 790       _dual = this;
 791     }
 792     return this;
 793   }
 794   assert( !_dual->_dual, "" );  // No reverse dual yet
 795   assert( !(*tdic)[_dual], "" ); // Dual not in type system either
 796   // New Type, insert into Type table
 797   tdic->Insert((void*)_dual,(void*)_dual);
 798   ((Type*)_dual)->_dual = this; // Finish up being symmetric
 799 #ifdef ASSERT
 800   Type *dual_dual = (Type*)_dual->xdual();
 801   assert( eq(dual_dual), "xdual(xdual()) should be identity" );
 802   delete dual_dual;
 803 #endif
 804   return this;                  // Return new Type
 805 }
 806 
 807 //------------------------------eq---------------------------------------------
 808 // Structural equality check for Type representations
 809 bool Type::eq( const Type * ) const {
 810   return true;                  // Nothing else can go wrong
 811 }
 812 
 813 //------------------------------hash-------------------------------------------
 814 // Type-specific hashing function.
 815 uint Type::hash(void) const {
 816   return _base;
 817 }
 818 
 819 //------------------------------is_finite--------------------------------------
 820 // Has a finite value
 821 bool Type::is_finite() const {
 822   return false;
 823 }
 824 
 825 //------------------------------is_nan-----------------------------------------
 826 // Is not a number (NaN)
 827 bool Type::is_nan()    const {
 828   return false;
 829 }
 830 
 831 #ifdef ASSERT
 832 class VerifyMeet;
 833 class VerifyMeetResult : public ArenaObj {
 834   friend class VerifyMeet;
 835   friend class Type;
 836 private:
 837   class VerifyMeetResultEntry {
 838   private:
 839     const Type* _in1;
 840     const Type* _in2;
 841     const Type* _res;
 842   public:
 843     VerifyMeetResultEntry(const Type* in1, const Type* in2, const Type* res):
 844             _in1(in1), _in2(in2), _res(res) {
 845     }
 846     VerifyMeetResultEntry():
 847             _in1(nullptr), _in2(nullptr), _res(nullptr) {
 848     }
 849 
 850     bool operator==(const VerifyMeetResultEntry& rhs) const {
 851       return _in1 == rhs._in1 &&
 852              _in2 == rhs._in2 &&
 853              _res == rhs._res;
 854     }
 855 
 856     bool operator!=(const VerifyMeetResultEntry& rhs) const {
 857       return !(rhs == *this);
 858     }
 859 
 860     static int compare(const VerifyMeetResultEntry& v1, const VerifyMeetResultEntry& v2) {
 861       if ((intptr_t) v1._in1 < (intptr_t) v2._in1) {
 862         return -1;
 863       } else if (v1._in1 == v2._in1) {
 864         if ((intptr_t) v1._in2 < (intptr_t) v2._in2) {
 865           return -1;
 866         } else if (v1._in2 == v2._in2) {
 867           assert(v1._res == v2._res || v1._res == nullptr || v2._res == nullptr, "same inputs should lead to same result");
 868           return 0;
 869         }
 870         return 1;
 871       }
 872       return 1;
 873     }
 874     const Type* res() const { return _res; }
 875   };
 876   uint _depth;
 877   GrowableArray<VerifyMeetResultEntry> _cache;
 878 
 879   // With verification code, the meet of A and B causes the computation of:
 880   // 1- meet(A, B)
 881   // 2- meet(B, A)
 882   // 3- meet(dual(meet(A, B)), dual(A))
 883   // 4- meet(dual(meet(A, B)), dual(B))
 884   // 5- meet(dual(A), dual(B))
 885   // 6- meet(dual(B), dual(A))
 886   // 7- meet(dual(meet(dual(A), dual(B))), A)
 887   // 8- meet(dual(meet(dual(A), dual(B))), B)
 888   //
 889   // In addition the meet of A[] and B[] requires the computation of the meet of A and B.
 890   //
 891   // The meet of A[] and B[] triggers the computation of:
 892   // 1- meet(A[], B[][)
 893   //   1.1- meet(A, B)
 894   //   1.2- meet(B, A)
 895   //   1.3- meet(dual(meet(A, B)), dual(A))
 896   //   1.4- meet(dual(meet(A, B)), dual(B))
 897   //   1.5- meet(dual(A), dual(B))
 898   //   1.6- meet(dual(B), dual(A))
 899   //   1.7- meet(dual(meet(dual(A), dual(B))), A)
 900   //   1.8- meet(dual(meet(dual(A), dual(B))), B)
 901   // 2- meet(B[], A[])
 902   //   2.1- meet(B, A) = 1.2
 903   //   2.2- meet(A, B) = 1.1
 904   //   2.3- meet(dual(meet(B, A)), dual(B)) = 1.4
 905   //   2.4- meet(dual(meet(B, A)), dual(A)) = 1.3
 906   //   2.5- meet(dual(B), dual(A)) = 1.6
 907   //   2.6- meet(dual(A), dual(B)) = 1.5
 908   //   2.7- meet(dual(meet(dual(B), dual(A))), B) = 1.8
 909   //   2.8- meet(dual(meet(dual(B), dual(A))), B) = 1.7
 910   // etc.
 911   // The number of meet operations performed grows exponentially with the number of dimensions of the arrays but the number
 912   // of different meet operations is linear in the number of dimensions. The function below caches meet results for the
 913   // duration of the meet at the root of the recursive calls.
 914   //
 915   const Type* meet(const Type* t1, const Type* t2) {
 916     bool found = false;
 917     const VerifyMeetResultEntry meet(t1, t2, nullptr);
 918     int pos = _cache.find_sorted<VerifyMeetResultEntry, VerifyMeetResultEntry::compare>(meet, found);
 919     const Type* res = nullptr;
 920     if (found) {
 921       res = _cache.at(pos).res();
 922     } else {
 923       res = t1->xmeet(t2);
 924       _cache.insert_sorted<VerifyMeetResultEntry::compare>(VerifyMeetResultEntry(t1, t2, res));
 925       found = false;
 926       _cache.find_sorted<VerifyMeetResultEntry, VerifyMeetResultEntry::compare>(meet, found);
 927       assert(found, "should be in table after it's added");
 928     }
 929     return res;
 930   }
 931 
 932   void add(const Type* t1, const Type* t2, const Type* res) {
 933     _cache.insert_sorted<VerifyMeetResultEntry::compare>(VerifyMeetResultEntry(t1, t2, res));
 934   }
 935 
 936   bool empty_cache() const {
 937     return _cache.length() == 0;
 938   }
 939 public:
 940   VerifyMeetResult(Compile* C) :
 941           _depth(0), _cache(C->comp_arena(), 2, 0, VerifyMeetResultEntry()) {
 942   }
 943 };
 944 
 945 void Type::assert_type_verify_empty() const {
 946   assert(Compile::current()->_type_verify == nullptr || Compile::current()->_type_verify->empty_cache(), "cache should have been discarded");
 947 }
 948 
 949 class VerifyMeet {
 950 private:
 951   Compile* _C;
 952 public:
 953   VerifyMeet(Compile* C) : _C(C) {
 954     if (C->_type_verify == nullptr) {
 955       C->_type_verify = new (C->comp_arena())VerifyMeetResult(C);
 956     }
 957     _C->_type_verify->_depth++;
 958   }
 959 
 960   ~VerifyMeet() {
 961     assert(_C->_type_verify->_depth != 0, "");
 962     _C->_type_verify->_depth--;
 963     if (_C->_type_verify->_depth == 0) {
 964       _C->_type_verify->_cache.trunc_to(0);
 965     }
 966   }
 967 
 968   const Type* meet(const Type* t1, const Type* t2) const {
 969     return _C->_type_verify->meet(t1, t2);
 970   }
 971 
 972   void add(const Type* t1, const Type* t2, const Type* res) const {
 973     _C->_type_verify->add(t1, t2, res);
 974   }
 975 };
 976 
 977 void Type::check_symmetrical(const Type* t, const Type* mt, const VerifyMeet& verify) const {
 978   Compile* C = Compile::current();
 979   const Type* mt2 = verify.meet(t, this);
 980   if (mt != mt2) {
 981     tty->print_cr("=== Meet Not Commutative ===");
 982     tty->print("t           = ");   t->dump(); tty->cr();
 983     tty->print("this        = ");      dump(); tty->cr();
 984     tty->print("t meet this = "); mt2->dump(); tty->cr();
 985     tty->print("this meet t = ");  mt->dump(); tty->cr();
 986     fatal("meet not commutative");
 987   }
 988   const Type* dual_join = mt->_dual;
 989   const Type* t2t    = verify.meet(dual_join,t->_dual);
 990   const Type* t2this = verify.meet(dual_join,this->_dual);
 991 
 992   // Interface meet Oop is Not Symmetric:
 993   // Interface:AnyNull meet Oop:AnyNull == Interface:AnyNull
 994   // Interface:NotNull meet Oop:NotNull == java/lang/Object:NotNull
 995 
 996   if (t2t != t->_dual || t2this != this->_dual) {
 997     tty->print_cr("=== Meet Not Symmetric ===");
 998     tty->print("t   =                   ");              t->dump(); tty->cr();
 999     tty->print("this=                   ");                 dump(); tty->cr();
1000     tty->print("mt=(t meet this)=       ");             mt->dump(); tty->cr();
1001 
1002     tty->print("t_dual=                 ");       t->_dual->dump(); tty->cr();
1003     tty->print("this_dual=              ");          _dual->dump(); tty->cr();
1004     tty->print("mt_dual=                ");      mt->_dual->dump(); tty->cr();
1005 
1006     tty->print("mt_dual meet t_dual=    "); t2t           ->dump(); tty->cr();
1007     tty->print("mt_dual meet this_dual= "); t2this        ->dump(); tty->cr();
1008 
1009     fatal("meet not symmetric");
1010   }
1011 }
1012 #endif
1013 
1014 //------------------------------meet-------------------------------------------
1015 // Compute the MEET of two types.  NOT virtual.  It enforces that meet is
1016 // commutative and the lattice is symmetric.
1017 const Type *Type::meet_helper(const Type *t, bool include_speculative) const {
1018   if (isa_narrowoop() && t->isa_narrowoop()) {
1019     const Type* result = make_ptr()->meet_helper(t->make_ptr(), include_speculative);
1020     return result->make_narrowoop();
1021   }
1022   if (isa_narrowklass() && t->isa_narrowklass()) {
1023     const Type* result = make_ptr()->meet_helper(t->make_ptr(), include_speculative);
1024     return result->make_narrowklass();
1025   }
1026 
1027 #ifdef ASSERT
1028   Compile* C = Compile::current();
1029   VerifyMeet verify(C);
1030 #endif
1031 
1032   const Type *this_t = maybe_remove_speculative(include_speculative);
1033   t = t->maybe_remove_speculative(include_speculative);
1034 
1035   const Type *mt = this_t->xmeet(t);
1036 #ifdef ASSERT
1037   verify.add(this_t, t, mt);
1038   if (isa_narrowoop() || t->isa_narrowoop()) {
1039     return mt;
1040   }
1041   if (isa_narrowklass() || t->isa_narrowklass()) {
1042     return mt;
1043   }
1044   this_t->check_symmetrical(t, mt, verify);
1045   const Type *mt_dual = verify.meet(this_t->_dual, t->_dual);
1046   this_t->_dual->check_symmetrical(t->_dual, mt_dual, verify);
1047 #endif
1048   return mt;
1049 }
1050 
1051 //------------------------------xmeet------------------------------------------
1052 // Compute the MEET of two types.  It returns a new Type object.
1053 const Type *Type::xmeet( const Type *t ) const {
1054   // Perform a fast test for common case; meeting the same types together.
1055   if( this == t ) return this;  // Meeting same type-rep?
1056 
1057   // Meeting TOP with anything?
1058   if( _base == Top ) return t;
1059 
1060   // Meeting BOTTOM with anything?
1061   if( _base == Bottom ) return BOTTOM;
1062 
1063   // Current "this->_base" is one of: Bad, Multi, Control, Top,
1064   // Abio, Abstore, Floatxxx, Doublexxx, Bottom, lastype.
1065   switch (t->base()) {  // Switch on original type
1066 
1067   // Cut in half the number of cases I must handle.  Only need cases for when
1068   // the given enum "t->type" is less than or equal to the local enum "type".
1069   case HalfFloatCon:
1070   case FloatCon:
1071   case DoubleCon:
1072   case Int:
1073   case Long:
1074     return t->xmeet(this);
1075 
1076   case OopPtr:
1077     return t->xmeet(this);
1078 
1079   case InstPtr:
1080     return t->xmeet(this);
1081 
1082   case MetadataPtr:
1083   case KlassPtr:
1084   case InstKlassPtr:
1085   case AryKlassPtr:
1086     return t->xmeet(this);
1087 
1088   case AryPtr:
1089     return t->xmeet(this);
1090 
1091   case NarrowOop:
1092     return t->xmeet(this);
1093 
1094   case NarrowKlass:
1095     return t->xmeet(this);
1096 
1097   case Bad:                     // Type check
1098   default:                      // Bogus type not in lattice
1099     typerr(t);
1100     return Type::BOTTOM;
1101 
1102   case Bottom:                  // Ye Olde Default
1103     return t;
1104 
1105   case HalfFloatTop:
1106     if (_base == HalfFloatTop) { return this; }
1107   case HalfFloatBot:            // Half Float
1108     if (_base == HalfFloatBot || _base == HalfFloatTop) { return HALF_FLOAT; }
1109     if (_base == FloatBot || _base == FloatTop) { return Type::BOTTOM; }
1110     if (_base == DoubleTop || _base == DoubleBot) { return Type::BOTTOM; }
1111     typerr(t);
1112     return Type::BOTTOM;
1113 
1114   case FloatTop:
1115     if (_base == FloatTop ) { return this; }
1116   case FloatBot:                // Float
1117     if (_base == FloatBot || _base == FloatTop) { return FLOAT; }
1118     if (_base == HalfFloatTop || _base == HalfFloatBot) { return Type::BOTTOM; }
1119     if (_base == DoubleTop || _base == DoubleBot) { return Type::BOTTOM; }
1120     typerr(t);
1121     return Type::BOTTOM;
1122 
1123   case DoubleTop:
1124     if (_base == DoubleTop) { return this; }
1125   case DoubleBot:               // Double
1126     if (_base == DoubleBot || _base == DoubleTop) { return DOUBLE; }
1127     if (_base == HalfFloatTop || _base == HalfFloatBot) { return Type::BOTTOM; }
1128     if (_base == FloatTop || _base == FloatBot) { return Type::BOTTOM; }
1129     typerr(t);
1130     return Type::BOTTOM;
1131 
1132   // These next few cases must match exactly or it is a compile-time error.
1133   case Control:                 // Control of code
1134   case Abio:                    // State of world outside of program
1135   case Memory:
1136     if (_base == t->_base)  { return this; }
1137     typerr(t);
1138     return Type::BOTTOM;
1139 
1140   case Top:                     // Top of the lattice
1141     return this;
1142   }
1143 
1144   // The type is unchanged
1145   return this;
1146 }
1147 
1148 //-----------------------------filter------------------------------------------
1149 const Type *Type::filter_helper(const Type *kills, bool include_speculative) const {
1150   const Type* ft = join_helper(kills, include_speculative);
1151   if (ft->empty())
1152     return Type::TOP;           // Canonical empty value
1153   return ft;
1154 }
1155 
1156 //------------------------------xdual------------------------------------------
1157 const Type *Type::xdual() const {
1158   // Note: the base() accessor asserts the sanity of _base.
1159   assert(_type_info[base()].dual_type != Bad, "implement with v-call");
1160   return new Type(_type_info[_base].dual_type);
1161 }
1162 
1163 //------------------------------has_memory-------------------------------------
1164 bool Type::has_memory() const {
1165   Type::TYPES tx = base();
1166   if (tx == Memory) return true;
1167   if (tx == Tuple) {
1168     const TypeTuple *t = is_tuple();
1169     for (uint i=0; i < t->cnt(); i++) {
1170       tx = t->field_at(i)->base();
1171       if (tx == Memory)  return true;
1172     }
1173   }
1174   return false;
1175 }
1176 
1177 #ifndef PRODUCT
1178 //------------------------------dump2------------------------------------------
1179 void Type::dump2( Dict &d, uint depth, outputStream *st ) const {
1180   st->print("%s", _type_info[_base].msg);
1181 }
1182 
1183 //------------------------------dump-------------------------------------------
1184 void Type::dump_on(outputStream *st) const {
1185   ResourceMark rm;
1186   Dict d(cmpkey,hashkey);       // Stop recursive type dumping
1187   dump2(d,1, st);
1188   if (is_ptr_to_narrowoop()) {
1189     st->print(" [narrow]");
1190   } else if (is_ptr_to_narrowklass()) {
1191     st->print(" [narrowklass]");
1192   }
1193 }
1194 
1195 //-----------------------------------------------------------------------------
1196 const char* Type::str(const Type* t) {
1197   stringStream ss;
1198   t->dump_on(&ss);
1199   return ss.as_string();
1200 }
1201 #endif
1202 
1203 //------------------------------singleton--------------------------------------
1204 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
1205 // constants (Ldi nodes).  Singletons are integer, float or double constants.
1206 bool Type::singleton(void) const {
1207   return _base == Top || _base == Half;
1208 }
1209 
1210 //------------------------------empty------------------------------------------
1211 // TRUE if Type is a type with no values, FALSE otherwise.
1212 bool Type::empty(void) const {
1213   switch (_base) {
1214   case DoubleTop:
1215   case FloatTop:
1216   case HalfFloatTop:
1217   case Top:
1218     return true;
1219 
1220   case Half:
1221   case Abio:
1222   case Return_Address:
1223   case Memory:
1224   case Bottom:
1225   case HalfFloatBot:
1226   case FloatBot:
1227   case DoubleBot:
1228     return false;  // never a singleton, therefore never empty
1229 
1230   default:
1231     ShouldNotReachHere();
1232     return false;
1233   }
1234 }
1235 
1236 //------------------------------dump_stats-------------------------------------
1237 // Dump collected statistics to stderr
1238 #ifndef PRODUCT
1239 void Type::dump_stats() {
1240   tty->print("Types made: %d\n", type_dict()->Size());
1241 }
1242 #endif
1243 
1244 //------------------------------category---------------------------------------
1245 #ifndef PRODUCT
1246 Type::Category Type::category() const {
1247   const TypeTuple* tuple;
1248   switch (base()) {
1249     case Type::Int:
1250     case Type::Long:
1251     case Type::Half:
1252     case Type::NarrowOop:
1253     case Type::NarrowKlass:
1254     case Type::Array:
1255     case Type::VectorA:
1256     case Type::VectorS:
1257     case Type::VectorD:
1258     case Type::VectorX:
1259     case Type::VectorY:
1260     case Type::VectorZ:
1261     case Type::VectorMask:
1262     case Type::AnyPtr:
1263     case Type::RawPtr:
1264     case Type::OopPtr:
1265     case Type::InstPtr:
1266     case Type::AryPtr:
1267     case Type::MetadataPtr:
1268     case Type::KlassPtr:
1269     case Type::InstKlassPtr:
1270     case Type::AryKlassPtr:
1271     case Type::Function:
1272     case Type::Return_Address:
1273     case Type::HalfFloatTop:
1274     case Type::HalfFloatCon:
1275     case Type::HalfFloatBot:
1276     case Type::FloatTop:
1277     case Type::FloatCon:
1278     case Type::FloatBot:
1279     case Type::DoubleTop:
1280     case Type::DoubleCon:
1281     case Type::DoubleBot:
1282       return Category::Data;
1283     case Type::Memory:
1284       return Category::Memory;
1285     case Type::Control:
1286       return Category::Control;
1287     case Type::Top:
1288     case Type::Abio:
1289     case Type::Bottom:
1290       return Category::Other;
1291     case Type::Bad:
1292     case Type::lastype:
1293       return Category::Undef;
1294     case Type::Tuple:
1295       // Recursive case. Return CatMixed if the tuple contains types of
1296       // different categories (e.g. CallStaticJavaNode's type), or the specific
1297       // category if all types are of the same category (e.g. IfNode's type).
1298       tuple = is_tuple();
1299       if (tuple->cnt() == 0) {
1300         return Category::Undef;
1301       } else {
1302         Category first = tuple->field_at(0)->category();
1303         for (uint i = 1; i < tuple->cnt(); i++) {
1304           if (tuple->field_at(i)->category() != first) {
1305             return Category::Mixed;
1306           }
1307         }
1308         return first;
1309       }
1310     default:
1311       assert(false, "unmatched base type: all base types must be categorized");
1312   }
1313   return Category::Undef;
1314 }
1315 
1316 bool Type::has_category(Type::Category cat) const {
1317   if (category() == cat) {
1318     return true;
1319   }
1320   if (category() == Category::Mixed) {
1321     const TypeTuple* tuple = is_tuple();
1322     for (uint i = 0; i < tuple->cnt(); i++) {
1323       if (tuple->field_at(i)->has_category(cat)) {
1324         return true;
1325       }
1326     }
1327   }
1328   return false;
1329 }
1330 #endif
1331 
1332 //------------------------------typerr-----------------------------------------
1333 void Type::typerr( const Type *t ) const {
1334 #ifndef PRODUCT
1335   tty->print("\nError mixing types: ");
1336   dump();
1337   tty->print(" and ");
1338   t->dump();
1339   tty->print("\n");
1340 #endif
1341   ShouldNotReachHere();
1342 }
1343 
1344 
1345 //=============================================================================
1346 // Convenience common pre-built types.
1347 const TypeF *TypeF::MAX;        // Floating point max
1348 const TypeF *TypeF::MIN;        // Floating point min
1349 const TypeF *TypeF::ZERO;       // Floating point zero
1350 const TypeF *TypeF::ONE;        // Floating point one
1351 const TypeF *TypeF::POS_INF;    // Floating point positive infinity
1352 const TypeF *TypeF::NEG_INF;    // Floating point negative infinity
1353 
1354 //------------------------------make-------------------------------------------
1355 // Create a float constant
1356 const TypeF *TypeF::make(float f) {
1357   return (TypeF*)(new TypeF(f))->hashcons();
1358 }
1359 
1360 //------------------------------meet-------------------------------------------
1361 // Compute the MEET of two types.  It returns a new Type object.
1362 const Type *TypeF::xmeet( const Type *t ) const {
1363   // Perform a fast test for common case; meeting the same types together.
1364   if( this == t ) return this;  // Meeting same type-rep?
1365 
1366   // Current "this->_base" is FloatCon
1367   switch (t->base()) {          // Switch on original type
1368   case AnyPtr:                  // Mixing with oops happens when javac
1369   case RawPtr:                  // reuses local variables
1370   case OopPtr:
1371   case InstPtr:
1372   case AryPtr:
1373   case MetadataPtr:
1374   case KlassPtr:
1375   case InstKlassPtr:
1376   case AryKlassPtr:
1377   case NarrowOop:
1378   case NarrowKlass:
1379   case Int:
1380   case Long:
1381   case HalfFloatTop:
1382   case HalfFloatCon:
1383   case HalfFloatBot:
1384   case DoubleTop:
1385   case DoubleCon:
1386   case DoubleBot:
1387   case Bottom:                  // Ye Olde Default
1388     return Type::BOTTOM;
1389 
1390   case FloatBot:
1391     return t;
1392 
1393   default:                      // All else is a mistake
1394     typerr(t);
1395 
1396   case FloatCon:                // Float-constant vs Float-constant?
1397     if( jint_cast(_f) != jint_cast(t->getf()) )         // unequal constants?
1398                                 // must compare bitwise as positive zero, negative zero and NaN have
1399                                 // all the same representation in C++
1400       return FLOAT;             // Return generic float
1401                                 // Equal constants
1402   case Top:
1403   case FloatTop:
1404     break;                      // Return the float constant
1405   }
1406   return this;                  // Return the float constant
1407 }
1408 
1409 //------------------------------xdual------------------------------------------
1410 // Dual: symmetric
1411 const Type *TypeF::xdual() const {
1412   return this;
1413 }
1414 
1415 //------------------------------eq---------------------------------------------
1416 // Structural equality check for Type representations
1417 bool TypeF::eq(const Type *t) const {
1418   // Bitwise comparison to distinguish between +/-0. These values must be treated
1419   // as different to be consistent with C1 and the interpreter.
1420   return (jint_cast(_f) == jint_cast(t->getf()));
1421 }
1422 
1423 //------------------------------hash-------------------------------------------
1424 // Type-specific hashing function.
1425 uint TypeF::hash(void) const {
1426   return *(uint*)(&_f);
1427 }
1428 
1429 //------------------------------is_finite--------------------------------------
1430 // Has a finite value
1431 bool TypeF::is_finite() const {
1432   return g_isfinite(getf()) != 0;
1433 }
1434 
1435 //------------------------------is_nan-----------------------------------------
1436 // Is not a number (NaN)
1437 bool TypeF::is_nan()    const {
1438   return g_isnan(getf()) != 0;
1439 }
1440 
1441 //------------------------------dump2------------------------------------------
1442 // Dump float constant Type
1443 #ifndef PRODUCT
1444 void TypeF::dump2( Dict &d, uint depth, outputStream *st ) const {
1445   Type::dump2(d,depth, st);
1446   st->print("%f", _f);
1447 }
1448 #endif
1449 
1450 //------------------------------singleton--------------------------------------
1451 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
1452 // constants (Ldi nodes).  Singletons are integer, float or double constants
1453 // or a single symbol.
1454 bool TypeF::singleton(void) const {
1455   return true;                  // Always a singleton
1456 }
1457 
1458 bool TypeF::empty(void) const {
1459   return false;                 // always exactly a singleton
1460 }
1461 
1462 //=============================================================================
1463 // Convenience common pre-built types.
1464 const TypeH* TypeH::MAX;        // Half float max
1465 const TypeH* TypeH::MIN;        // Half float min
1466 const TypeH* TypeH::ZERO;       // Half float zero
1467 const TypeH* TypeH::ONE;        // Half float one
1468 const TypeH* TypeH::POS_INF;    // Half float positive infinity
1469 const TypeH* TypeH::NEG_INF;    // Half float negative infinity
1470 
1471 //------------------------------make-------------------------------------------
1472 // Create a halffloat constant
1473 const TypeH* TypeH::make(short f) {
1474   return (TypeH*)(new TypeH(f))->hashcons();
1475 }
1476 
1477 const TypeH* TypeH::make(float f) {
1478   assert(StubRoutines::f2hf_adr() != nullptr, "");
1479   short hf = StubRoutines::f2hf(f);
1480   return (TypeH*)(new TypeH(hf))->hashcons();
1481 }
1482 
1483 //------------------------------xmeet-------------------------------------------
1484 // Compute the MEET of two types.  It returns a new Type object.
1485 const Type* TypeH::xmeet(const Type* t) const {
1486   // Perform a fast test for common case; meeting the same types together.
1487   if (this == t) return this;  // Meeting same type-rep?
1488 
1489   // Current "this->_base" is FloatCon
1490   switch (t->base()) {          // Switch on original type
1491   case AnyPtr:                  // Mixing with oops happens when javac
1492   case RawPtr:                  // reuses local variables
1493   case OopPtr:
1494   case InstPtr:
1495   case AryPtr:
1496   case MetadataPtr:
1497   case KlassPtr:
1498   case InstKlassPtr:
1499   case AryKlassPtr:
1500   case NarrowOop:
1501   case NarrowKlass:
1502   case Int:
1503   case Long:
1504   case FloatTop:
1505   case FloatCon:
1506   case FloatBot:
1507   case DoubleTop:
1508   case DoubleCon:
1509   case DoubleBot:
1510   case Bottom:                  // Ye Olde Default
1511     return Type::BOTTOM;
1512 
1513   case HalfFloatBot:
1514     return t;
1515 
1516   default:                      // All else is a mistake
1517     typerr(t);
1518 
1519   case HalfFloatCon:            // Half float-constant vs Half float-constant?
1520     if (_f != t->geth()) {      // unequal constants?
1521                                 // must compare bitwise as positive zero, negative zero and NaN have
1522                                 // all the same representation in C++
1523       return HALF_FLOAT;        // Return generic float
1524     }                           // Equal constants
1525   case Top:
1526   case HalfFloatTop:
1527     break;                      // Return the Half float constant
1528   }
1529   return this;                  // Return the Half float constant
1530 }
1531 
1532 //------------------------------xdual------------------------------------------
1533 // Dual: symmetric
1534 const Type* TypeH::xdual() const {
1535   return this;
1536 }
1537 
1538 //------------------------------eq---------------------------------------------
1539 // Structural equality check for Type representations
1540 bool TypeH::eq(const Type* t) const {
1541   // Bitwise comparison to distinguish between +/-0. These values must be treated
1542   // as different to be consistent with C1 and the interpreter.
1543   return (_f == t->geth());
1544 }
1545 
1546 //------------------------------hash-------------------------------------------
1547 // Type-specific hashing function.
1548 uint TypeH::hash(void) const {
1549   return *(jshort*)(&_f);
1550 }
1551 
1552 //------------------------------is_finite--------------------------------------
1553 // Has a finite value
1554 bool TypeH::is_finite() const {
1555   assert(StubRoutines::hf2f_adr() != nullptr, "");
1556   float f = StubRoutines::hf2f(geth());
1557   return g_isfinite(f) != 0;
1558 }
1559 
1560 float TypeH::getf() const {
1561   assert(StubRoutines::hf2f_adr() != nullptr, "");
1562   return StubRoutines::hf2f(geth());
1563 }
1564 
1565 //------------------------------is_nan-----------------------------------------
1566 // Is not a number (NaN)
1567 bool TypeH::is_nan() const {
1568   assert(StubRoutines::hf2f_adr() != nullptr, "");
1569   float f = StubRoutines::hf2f(geth());
1570   return g_isnan(f) != 0;
1571 }
1572 
1573 //------------------------------dump2------------------------------------------
1574 // Dump float constant Type
1575 #ifndef PRODUCT
1576 void TypeH::dump2(Dict &d, uint depth, outputStream* st) const {
1577   Type::dump2(d,depth, st);
1578   st->print("%f", getf());
1579 }
1580 #endif
1581 
1582 //------------------------------singleton--------------------------------------
1583 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
1584 // constants (Ldi nodes).  Singletons are integer, half float, float or double constants
1585 // or a single symbol.
1586 bool TypeH::singleton(void) const {
1587   return true;                  // Always a singleton
1588 }
1589 
1590 bool TypeH::empty(void) const {
1591   return false;                 // always exactly a singleton
1592 }
1593 
1594 //=============================================================================
1595 // Convenience common pre-built types.
1596 const TypeD *TypeD::MAX;        // Floating point max
1597 const TypeD *TypeD::MIN;        // Floating point min
1598 const TypeD *TypeD::ZERO;       // Floating point zero
1599 const TypeD *TypeD::ONE;        // Floating point one
1600 const TypeD *TypeD::POS_INF;    // Floating point positive infinity
1601 const TypeD *TypeD::NEG_INF;    // Floating point negative infinity
1602 
1603 //------------------------------make-------------------------------------------
1604 const TypeD *TypeD::make(double d) {
1605   return (TypeD*)(new TypeD(d))->hashcons();
1606 }
1607 
1608 //------------------------------meet-------------------------------------------
1609 // Compute the MEET of two types.  It returns a new Type object.
1610 const Type *TypeD::xmeet( const Type *t ) const {
1611   // Perform a fast test for common case; meeting the same types together.
1612   if( this == t ) return this;  // Meeting same type-rep?
1613 
1614   // Current "this->_base" is DoubleCon
1615   switch (t->base()) {          // Switch on original type
1616   case AnyPtr:                  // Mixing with oops happens when javac
1617   case RawPtr:                  // reuses local variables
1618   case OopPtr:
1619   case InstPtr:
1620   case AryPtr:
1621   case MetadataPtr:
1622   case KlassPtr:
1623   case InstKlassPtr:
1624   case AryKlassPtr:
1625   case NarrowOop:
1626   case NarrowKlass:
1627   case Int:
1628   case Long:
1629   case HalfFloatTop:
1630   case HalfFloatCon:
1631   case HalfFloatBot:
1632   case FloatTop:
1633   case FloatCon:
1634   case FloatBot:
1635   case Bottom:                  // Ye Olde Default
1636     return Type::BOTTOM;
1637 
1638   case DoubleBot:
1639     return t;
1640 
1641   default:                      // All else is a mistake
1642     typerr(t);
1643 
1644   case DoubleCon:               // Double-constant vs Double-constant?
1645     if( jlong_cast(_d) != jlong_cast(t->getd()) )       // unequal constants? (see comment in TypeF::xmeet)
1646       return DOUBLE;            // Return generic double
1647   case Top:
1648   case DoubleTop:
1649     break;
1650   }
1651   return this;                  // Return the double constant
1652 }
1653 
1654 //------------------------------xdual------------------------------------------
1655 // Dual: symmetric
1656 const Type *TypeD::xdual() const {
1657   return this;
1658 }
1659 
1660 //------------------------------eq---------------------------------------------
1661 // Structural equality check for Type representations
1662 bool TypeD::eq(const Type *t) const {
1663   // Bitwise comparison to distinguish between +/-0. These values must be treated
1664   // as different to be consistent with C1 and the interpreter.
1665   return (jlong_cast(_d) == jlong_cast(t->getd()));
1666 }
1667 
1668 //------------------------------hash-------------------------------------------
1669 // Type-specific hashing function.
1670 uint TypeD::hash(void) const {
1671   return *(uint*)(&_d);
1672 }
1673 
1674 //------------------------------is_finite--------------------------------------
1675 // Has a finite value
1676 bool TypeD::is_finite() const {
1677   return g_isfinite(getd()) != 0;
1678 }
1679 
1680 //------------------------------is_nan-----------------------------------------
1681 // Is not a number (NaN)
1682 bool TypeD::is_nan()    const {
1683   return g_isnan(getd()) != 0;
1684 }
1685 
1686 //------------------------------dump2------------------------------------------
1687 // Dump double constant Type
1688 #ifndef PRODUCT
1689 void TypeD::dump2( Dict &d, uint depth, outputStream *st ) const {
1690   Type::dump2(d,depth,st);
1691   st->print("%f", _d);
1692 }
1693 #endif
1694 
1695 //------------------------------singleton--------------------------------------
1696 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
1697 // constants (Ldi nodes).  Singletons are integer, float or double constants
1698 // or a single symbol.
1699 bool TypeD::singleton(void) const {
1700   return true;                  // Always a singleton
1701 }
1702 
1703 bool TypeD::empty(void) const {
1704   return false;                 // always exactly a singleton
1705 }
1706 
1707 const TypeInteger* TypeInteger::make(jlong lo, jlong hi, int w, BasicType bt) {
1708   if (bt == T_INT) {
1709     return TypeInt::make(checked_cast<jint>(lo), checked_cast<jint>(hi), w);
1710   }
1711   assert(bt == T_LONG, "basic type not an int or long");
1712   return TypeLong::make(lo, hi, w);
1713 }
1714 
1715 const TypeInteger* TypeInteger::make(jlong con, BasicType bt) {
1716   return make(con, con, WidenMin, bt);
1717 }
1718 
1719 jlong TypeInteger::get_con_as_long(BasicType bt) const {
1720   if (bt == T_INT) {
1721     return is_int()->get_con();
1722   }
1723   assert(bt == T_LONG, "basic type not an int or long");
1724   return is_long()->get_con();
1725 }
1726 
1727 const TypeInteger* TypeInteger::bottom(BasicType bt) {
1728   if (bt == T_INT) {
1729     return TypeInt::INT;
1730   }
1731   assert(bt == T_LONG, "basic type not an int or long");
1732   return TypeLong::LONG;
1733 }
1734 
1735 const TypeInteger* TypeInteger::zero(BasicType bt) {
1736   if (bt == T_INT) {
1737     return TypeInt::ZERO;
1738   }
1739   assert(bt == T_LONG, "basic type not an int or long");
1740   return TypeLong::ZERO;
1741 }
1742 
1743 const TypeInteger* TypeInteger::one(BasicType bt) {
1744   if (bt == T_INT) {
1745     return TypeInt::ONE;
1746   }
1747   assert(bt == T_LONG, "basic type not an int or long");
1748   return TypeLong::ONE;
1749 }
1750 
1751 const TypeInteger* TypeInteger::minus_1(BasicType bt) {
1752   if (bt == T_INT) {
1753     return TypeInt::MINUS_1;
1754   }
1755   assert(bt == T_LONG, "basic type not an int or long");
1756   return TypeLong::MINUS_1;
1757 }
1758 
1759 //=============================================================================
1760 // Convenience common pre-built types.
1761 const TypeInt* TypeInt::MAX;    // INT_MAX
1762 const TypeInt* TypeInt::MIN;    // INT_MIN
1763 const TypeInt* TypeInt::MINUS_1;// -1
1764 const TypeInt* TypeInt::ZERO;   // 0
1765 const TypeInt* TypeInt::ONE;    // 1
1766 const TypeInt* TypeInt::BOOL;   // 0 or 1, FALSE or TRUE.
1767 const TypeInt* TypeInt::CC;     // -1,0 or 1, condition codes
1768 const TypeInt* TypeInt::CC_LT;  // [-1]  == MINUS_1
1769 const TypeInt* TypeInt::CC_GT;  // [1]   == ONE
1770 const TypeInt* TypeInt::CC_EQ;  // [0]   == ZERO
1771 const TypeInt* TypeInt::CC_NE;
1772 const TypeInt* TypeInt::CC_LE;  // [-1,0]
1773 const TypeInt* TypeInt::CC_GE;  // [0,1] == BOOL (!)
1774 const TypeInt* TypeInt::BYTE;   // Bytes, -128 to 127
1775 const TypeInt* TypeInt::UBYTE;  // Unsigned Bytes, 0 to 255
1776 const TypeInt* TypeInt::CHAR;   // Java chars, 0-65535
1777 const TypeInt* TypeInt::SHORT;  // Java shorts, -32768-32767
1778 const TypeInt* TypeInt::NON_ZERO;
1779 const TypeInt* TypeInt::POS;    // Positive 32-bit integers or zero
1780 const TypeInt* TypeInt::POS1;   // Positive 32-bit integers
1781 const TypeInt* TypeInt::INT;    // 32-bit integers
1782 const TypeInt* TypeInt::SYMINT; // symmetric range [-max_jint..max_jint]
1783 const TypeInt* TypeInt::TYPE_DOMAIN; // alias for TypeInt::INT
1784 
1785 TypeInt::TypeInt(const TypeIntPrototype<jint, juint>& t, int widen, bool dual)
1786   : TypeInteger(Int, t.normalize_widen(widen), dual), _lo(t._srange._lo), _hi(t._srange._hi),
1787     _ulo(t._urange._lo), _uhi(t._urange._hi), _bits(t._bits) {
1788   DEBUG_ONLY(t.verify_constraints());
1789 }
1790 
1791 const Type* TypeInt::make_or_top(const TypeIntPrototype<jint, juint>& t, int widen, bool dual) {
1792   auto canonicalized_t = t.canonicalize_constraints();
1793   if (canonicalized_t.empty()) {
1794     return dual ? Type::BOTTOM : Type::TOP;
1795   }
1796   return (new TypeInt(canonicalized_t._data, widen, dual))->hashcons()->is_int();
1797 }
1798 
1799 const TypeInt* TypeInt::make(jint con) {
1800   juint ucon = con;
1801   return (new TypeInt(TypeIntPrototype<jint, juint>{{con, con}, {ucon, ucon}, {~ucon, ucon}},
1802                       WidenMin, false))->hashcons()->is_int();
1803 }
1804 
1805 const TypeInt* TypeInt::make(jint lo, jint hi, int widen) {
1806   assert(lo <= hi, "must be legal bounds");
1807   return make_or_top(TypeIntPrototype<jint, juint>{{lo, hi}, {0, max_juint}, {0, 0}}, widen)->is_int();
1808 }
1809 
1810 const Type* TypeInt::make_or_top(const TypeIntPrototype<jint, juint>& t, int widen) {
1811   return make_or_top(t, widen, false);
1812 }
1813 
1814 bool TypeInt::contains(jint i) const {
1815   assert(!_is_dual, "dual types should only be used for join calculation");
1816   juint u = i;
1817   return i >= _lo && i <= _hi &&
1818          u >= _ulo && u <= _uhi &&
1819          _bits.is_satisfied_by(u);
1820 }
1821 
1822 bool TypeInt::contains(const TypeInt* t) const {
1823   assert(!_is_dual && !t->_is_dual, "dual types should only be used for join calculation");
1824   return TypeIntHelper::int_type_is_subset(this, t);
1825 }
1826 
1827 #ifdef ASSERT
1828 bool TypeInt::strictly_contains(const TypeInt* t) const {
1829   assert(!_is_dual && !t->_is_dual, "dual types should only be used for join calculation");
1830   return TypeIntHelper::int_type_is_subset(this, t) && !TypeIntHelper::int_type_is_equal(this, t);
1831 }
1832 #endif // ASSERT
1833 
1834 const Type* TypeInt::xmeet(const Type* t) const {
1835   return TypeIntHelper::int_type_xmeet(this, t);
1836 }
1837 
1838 const Type* TypeInt::xdual() const {
1839   return new TypeInt(TypeIntPrototype<jint, juint>{{_lo, _hi}, {_ulo, _uhi}, _bits},
1840                      _widen, !_is_dual);
1841 }
1842 
1843 const Type* TypeInt::widen(const Type* old, const Type* limit) const {
1844   assert(!_is_dual, "dual types should only be used for join calculation");
1845   return TypeIntHelper::int_type_widen(this, old->isa_int(), limit->isa_int());
1846 }
1847 
1848 const Type* TypeInt::narrow(const Type* old) const {
1849   assert(!_is_dual, "dual types should only be used for join calculation");
1850   if (old == nullptr) {
1851     return this;
1852   }
1853 
1854   return TypeIntHelper::int_type_narrow(this, old->isa_int());
1855 }
1856 
1857 //-----------------------------filter------------------------------------------
1858 const Type* TypeInt::filter_helper(const Type* kills, bool include_speculative) const {
1859   assert(!_is_dual, "dual types should only be used for join calculation");
1860   const TypeInt* ft = join_helper(kills, include_speculative)->isa_int();
1861   if (ft == nullptr) {
1862     return Type::TOP;           // Canonical empty value
1863   }
1864   assert(!ft->_is_dual, "dual types should only be used for join calculation");
1865   if (ft->_widen < this->_widen) {
1866     // Do not allow the value of kill->_widen to affect the outcome.
1867     // The widen bits must be allowed to run freely through the graph.
1868     return (new TypeInt(TypeIntPrototype<jint, juint>{{ft->_lo, ft->_hi}, {ft->_ulo, ft->_uhi}, ft->_bits},
1869                         this->_widen, false))->hashcons();
1870   }
1871   return ft;
1872 }
1873 
1874 //------------------------------eq---------------------------------------------
1875 // Structural equality check for Type representations
1876 bool TypeInt::eq(const Type* t) const {
1877   const TypeInt* r = t->is_int();
1878   return TypeIntHelper::int_type_is_equal(this, r) && _widen == r->_widen && _is_dual == r->_is_dual;
1879 }
1880 
1881 //------------------------------hash-------------------------------------------
1882 // Type-specific hashing function.
1883 uint TypeInt::hash(void) const {
1884   return (uint)_lo + (uint)_hi + (uint)_ulo + (uint)_uhi +
1885          (uint)_bits._zeros + (uint)_bits._ones + (uint)_widen + (uint)_is_dual + (uint)Type::Int;
1886 }
1887 
1888 //------------------------------is_finite--------------------------------------
1889 // Has a finite value
1890 bool TypeInt::is_finite() const {
1891   return true;
1892 }
1893 
1894 //------------------------------singleton--------------------------------------
1895 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
1896 // constants.
1897 bool TypeInt::singleton(void) const {
1898   return _lo == _hi;
1899 }
1900 
1901 bool TypeInt::empty(void) const {
1902   return false;
1903 }
1904 
1905 //=============================================================================
1906 // Convenience common pre-built types.
1907 const TypeLong* TypeLong::MAX;
1908 const TypeLong* TypeLong::MIN;
1909 const TypeLong* TypeLong::MINUS_1;// -1
1910 const TypeLong* TypeLong::ZERO; // 0
1911 const TypeLong* TypeLong::ONE;  // 1
1912 const TypeLong* TypeLong::NON_ZERO;
1913 const TypeLong* TypeLong::POS;  // >=0
1914 const TypeLong* TypeLong::NEG;
1915 const TypeLong* TypeLong::LONG; // 64-bit integers
1916 const TypeLong* TypeLong::INT;  // 32-bit subrange
1917 const TypeLong* TypeLong::UINT; // 32-bit unsigned subrange
1918 const TypeLong* TypeLong::TYPE_DOMAIN; // alias for TypeLong::LONG
1919 
1920 TypeLong::TypeLong(const TypeIntPrototype<jlong, julong>& t, int widen, bool dual)
1921   : TypeInteger(Long, t.normalize_widen(widen), dual), _lo(t._srange._lo), _hi(t._srange._hi),
1922     _ulo(t._urange._lo), _uhi(t._urange._hi), _bits(t._bits) {
1923   DEBUG_ONLY(t.verify_constraints());
1924 }
1925 
1926 const Type* TypeLong::make_or_top(const TypeIntPrototype<jlong, julong>& t, int widen, bool dual) {
1927   auto canonicalized_t = t.canonicalize_constraints();
1928   if (canonicalized_t.empty()) {
1929     return dual ? Type::BOTTOM : Type::TOP;
1930   }
1931   return (new TypeLong(canonicalized_t._data, widen, dual))->hashcons()->is_long();
1932 }
1933 
1934 const TypeLong* TypeLong::make(jlong con) {
1935   julong ucon = con;
1936   return (new TypeLong(TypeIntPrototype<jlong, julong>{{con, con}, {ucon, ucon}, {~ucon, ucon}},
1937                        WidenMin, false))->hashcons()->is_long();
1938 }
1939 
1940 const TypeLong* TypeLong::make(jlong lo, jlong hi, int widen) {
1941   assert(lo <= hi, "must be legal bounds");
1942   return make_or_top(TypeIntPrototype<jlong, julong>{{lo, hi}, {0, max_julong}, {0, 0}}, widen)->is_long();
1943 }
1944 
1945 const Type* TypeLong::make_or_top(const TypeIntPrototype<jlong, julong>& t, int widen) {
1946   return make_or_top(t, widen, false);
1947 }
1948 
1949 bool TypeLong::contains(jlong i) const {
1950   assert(!_is_dual, "dual types should only be used for join calculation");
1951   julong u = i;
1952   return i >= _lo && i <= _hi &&
1953          u >= _ulo && u <= _uhi &&
1954          _bits.is_satisfied_by(u);
1955 }
1956 
1957 bool TypeLong::contains(const TypeLong* t) const {
1958   assert(!_is_dual && !t->_is_dual, "dual types should only be used for join calculation");
1959   return TypeIntHelper::int_type_is_subset(this, t);
1960 }
1961 
1962 #ifdef ASSERT
1963 bool TypeLong::strictly_contains(const TypeLong* t) const {
1964   assert(!_is_dual && !t->_is_dual, "dual types should only be used for join calculation");
1965   return TypeIntHelper::int_type_is_subset(this, t) && !TypeIntHelper::int_type_is_equal(this, t);
1966 }
1967 #endif // ASSERT
1968 
1969 const Type* TypeLong::xmeet(const Type* t) const {
1970   return TypeIntHelper::int_type_xmeet(this, t);
1971 }
1972 
1973 const Type* TypeLong::xdual() const {
1974   return new TypeLong(TypeIntPrototype<jlong, julong>{{_lo, _hi}, {_ulo, _uhi}, _bits},
1975                       _widen, !_is_dual);
1976 }
1977 
1978 const Type* TypeLong::widen(const Type* old, const Type* limit) const {
1979   assert(!_is_dual, "dual types should only be used for join calculation");
1980   return TypeIntHelper::int_type_widen(this, old->isa_long(), limit->isa_long());
1981 }
1982 
1983 const Type* TypeLong::narrow(const Type* old) const {
1984   assert(!_is_dual, "dual types should only be used for join calculation");
1985   if (old == nullptr) {
1986     return this;
1987   }
1988 
1989   return TypeIntHelper::int_type_narrow(this, old->isa_long());
1990 }
1991 
1992 //-----------------------------filter------------------------------------------
1993 const Type* TypeLong::filter_helper(const Type* kills, bool include_speculative) const {
1994   assert(!_is_dual, "dual types should only be used for join calculation");
1995   const TypeLong* ft = join_helper(kills, include_speculative)->isa_long();
1996   if (ft == nullptr) {
1997     return Type::TOP;           // Canonical empty value
1998   }
1999   assert(!ft->_is_dual, "dual types should only be used for join calculation");
2000   if (ft->_widen < this->_widen) {
2001     // Do not allow the value of kill->_widen to affect the outcome.
2002     // The widen bits must be allowed to run freely through the graph.
2003     return (new TypeLong(TypeIntPrototype<jlong, julong>{{ft->_lo, ft->_hi}, {ft->_ulo, ft->_uhi}, ft->_bits},
2004                          this->_widen, false))->hashcons();
2005   }
2006   return ft;
2007 }
2008 
2009 //------------------------------eq---------------------------------------------
2010 // Structural equality check for Type representations
2011 bool TypeLong::eq(const Type* t) const {
2012   const TypeLong* r = t->is_long();
2013   return TypeIntHelper::int_type_is_equal(this, r) && _widen == r->_widen && _is_dual == r->_is_dual;
2014 }
2015 
2016 //------------------------------hash-------------------------------------------
2017 // Type-specific hashing function.
2018 uint TypeLong::hash(void) const {
2019   return (uint)_lo + (uint)_hi + (uint)_ulo + (uint)_uhi +
2020          (uint)_bits._zeros + (uint)_bits._ones + (uint)_widen + (uint)_is_dual + (uint)Type::Long;
2021 }
2022 
2023 //------------------------------is_finite--------------------------------------
2024 // Has a finite value
2025 bool TypeLong::is_finite() const {
2026   return true;
2027 }
2028 
2029 //------------------------------singleton--------------------------------------
2030 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
2031 // constants
2032 bool TypeLong::singleton(void) const {
2033   return _lo == _hi;
2034 }
2035 
2036 bool TypeLong::empty(void) const {
2037   return false;
2038 }
2039 
2040 //------------------------------dump2------------------------------------------
2041 #ifndef PRODUCT
2042 void TypeInt::dump2(Dict& d, uint depth, outputStream* st) const {
2043   TypeIntHelper::int_type_dump(this, st, false);
2044 }
2045 
2046 void TypeInt::dump_verbose() const {
2047   TypeIntHelper::int_type_dump(this, tty, true);
2048 }
2049 
2050 void TypeLong::dump2(Dict& d, uint depth, outputStream* st) const {
2051   TypeIntHelper::int_type_dump(this, st, false);
2052 }
2053 
2054 void TypeLong::dump_verbose() const {
2055   TypeIntHelper::int_type_dump(this, tty, true);
2056 }
2057 #endif
2058 
2059 //=============================================================================
2060 // Convenience common pre-built types.
2061 const TypeTuple *TypeTuple::IFBOTH;     // Return both arms of IF as reachable
2062 const TypeTuple *TypeTuple::IFFALSE;
2063 const TypeTuple *TypeTuple::IFTRUE;
2064 const TypeTuple *TypeTuple::IFNEITHER;
2065 const TypeTuple *TypeTuple::LOOPBODY;
2066 const TypeTuple *TypeTuple::MEMBAR;
2067 const TypeTuple *TypeTuple::STORECONDITIONAL;
2068 const TypeTuple *TypeTuple::START_I2C;
2069 const TypeTuple *TypeTuple::INT_PAIR;
2070 const TypeTuple *TypeTuple::LONG_PAIR;
2071 const TypeTuple *TypeTuple::INT_CC_PAIR;
2072 const TypeTuple *TypeTuple::LONG_CC_PAIR;
2073 
2074 //------------------------------make-------------------------------------------
2075 // Make a TypeTuple from the range of a method signature
2076 const TypeTuple *TypeTuple::make_range(ciSignature* sig, InterfaceHandling interface_handling) {
2077   ciType* return_type = sig->return_type();
2078   uint arg_cnt = return_type->size();
2079   const Type **field_array = fields(arg_cnt);
2080   switch (return_type->basic_type()) {
2081   case T_LONG:
2082     field_array[TypeFunc::Parms]   = TypeLong::LONG;
2083     field_array[TypeFunc::Parms+1] = Type::HALF;
2084     break;
2085   case T_DOUBLE:
2086     field_array[TypeFunc::Parms]   = Type::DOUBLE;
2087     field_array[TypeFunc::Parms+1] = Type::HALF;
2088     break;
2089   case T_OBJECT:
2090   case T_ARRAY:
2091   case T_BOOLEAN:
2092   case T_CHAR:
2093   case T_FLOAT:
2094   case T_BYTE:
2095   case T_SHORT:
2096   case T_INT:
2097     field_array[TypeFunc::Parms] = get_const_type(return_type, interface_handling);
2098     break;
2099   case T_VOID:
2100     break;
2101   default:
2102     ShouldNotReachHere();
2103   }
2104   return (TypeTuple*)(new TypeTuple(TypeFunc::Parms + arg_cnt, field_array))->hashcons();
2105 }
2106 
2107 // Make a TypeTuple from the domain of a method signature
2108 const TypeTuple *TypeTuple::make_domain(ciInstanceKlass* recv, ciSignature* sig, InterfaceHandling interface_handling) {
2109   uint arg_cnt = sig->size();
2110 
2111   uint pos = TypeFunc::Parms;
2112   const Type **field_array;
2113   if (recv != nullptr) {
2114     arg_cnt++;
2115     field_array = fields(arg_cnt);
2116     // Use get_const_type here because it respects UseUniqueSubclasses:
2117     field_array[pos++] = get_const_type(recv, interface_handling)->join_speculative(TypePtr::NOTNULL);
2118   } else {
2119     field_array = fields(arg_cnt);
2120   }
2121 
2122   int i = 0;
2123   while (pos < TypeFunc::Parms + arg_cnt) {
2124     ciType* type = sig->type_at(i);
2125 
2126     switch (type->basic_type()) {
2127     case T_LONG:
2128       field_array[pos++] = TypeLong::LONG;
2129       field_array[pos++] = Type::HALF;
2130       break;
2131     case T_DOUBLE:
2132       field_array[pos++] = Type::DOUBLE;
2133       field_array[pos++] = Type::HALF;
2134       break;
2135     case T_OBJECT:
2136     case T_ARRAY:
2137     case T_FLOAT:
2138     case T_INT:
2139       field_array[pos++] = get_const_type(type, interface_handling);
2140       break;
2141     case T_BOOLEAN:
2142     case T_CHAR:
2143     case T_BYTE:
2144     case T_SHORT:
2145       field_array[pos++] = TypeInt::INT;
2146       break;
2147     default:
2148       ShouldNotReachHere();
2149     }
2150     i++;
2151   }
2152 
2153   return (TypeTuple*)(new TypeTuple(TypeFunc::Parms + arg_cnt, field_array))->hashcons();
2154 }
2155 
2156 const TypeTuple *TypeTuple::make( uint cnt, const Type **fields ) {
2157   return (TypeTuple*)(new TypeTuple(cnt,fields))->hashcons();
2158 }
2159 
2160 //------------------------------fields-----------------------------------------
2161 // Subroutine call type with space allocated for argument types
2162 // Memory for Control, I_O, Memory, FramePtr, and ReturnAdr is allocated implicitly
2163 const Type **TypeTuple::fields( uint arg_cnt ) {
2164   const Type **flds = (const Type **)(Compile::current()->type_arena()->AmallocWords((TypeFunc::Parms+arg_cnt)*sizeof(Type*) ));
2165   flds[TypeFunc::Control  ] = Type::CONTROL;
2166   flds[TypeFunc::I_O      ] = Type::ABIO;
2167   flds[TypeFunc::Memory   ] = Type::MEMORY;
2168   flds[TypeFunc::FramePtr ] = TypeRawPtr::BOTTOM;
2169   flds[TypeFunc::ReturnAdr] = Type::RETURN_ADDRESS;
2170 
2171   return flds;
2172 }
2173 
2174 //------------------------------meet-------------------------------------------
2175 // Compute the MEET of two types.  It returns a new Type object.
2176 const Type *TypeTuple::xmeet( const Type *t ) const {
2177   // Perform a fast test for common case; meeting the same types together.
2178   if( this == t ) return this;  // Meeting same type-rep?
2179 
2180   // Current "this->_base" is Tuple
2181   switch (t->base()) {          // switch on original type
2182 
2183   case Bottom:                  // Ye Olde Default
2184     return t;
2185 
2186   default:                      // All else is a mistake
2187     typerr(t);
2188 
2189   case Tuple: {                 // Meeting 2 signatures?
2190     const TypeTuple *x = t->is_tuple();
2191     assert( _cnt == x->_cnt, "" );
2192     const Type **fields = (const Type **)(Compile::current()->type_arena()->AmallocWords( _cnt*sizeof(Type*) ));
2193     for( uint i=0; i<_cnt; i++ )
2194       fields[i] = field_at(i)->xmeet( x->field_at(i) );
2195     return TypeTuple::make(_cnt,fields);
2196   }
2197   case Top:
2198     break;
2199   }
2200   return this;                  // Return the double constant
2201 }
2202 
2203 //------------------------------xdual------------------------------------------
2204 // Dual: compute field-by-field dual
2205 const Type *TypeTuple::xdual() const {
2206   const Type **fields = (const Type **)(Compile::current()->type_arena()->AmallocWords( _cnt*sizeof(Type*) ));
2207   for( uint i=0; i<_cnt; i++ )
2208     fields[i] = _fields[i]->dual();
2209   return new TypeTuple(_cnt,fields);
2210 }
2211 
2212 //------------------------------eq---------------------------------------------
2213 // Structural equality check for Type representations
2214 bool TypeTuple::eq( const Type *t ) const {
2215   const TypeTuple *s = (const TypeTuple *)t;
2216   if (_cnt != s->_cnt)  return false;  // Unequal field counts
2217   for (uint i = 0; i < _cnt; i++)
2218     if (field_at(i) != s->field_at(i)) // POINTER COMPARE!  NO RECURSION!
2219       return false;             // Missed
2220   return true;
2221 }
2222 
2223 //------------------------------hash-------------------------------------------
2224 // Type-specific hashing function.
2225 uint TypeTuple::hash(void) const {
2226   uintptr_t sum = _cnt;
2227   for( uint i=0; i<_cnt; i++ )
2228     sum += (uintptr_t)_fields[i];     // Hash on pointers directly
2229   return (uint)sum;
2230 }
2231 
2232 //------------------------------dump2------------------------------------------
2233 // Dump signature Type
2234 #ifndef PRODUCT
2235 void TypeTuple::dump2( Dict &d, uint depth, outputStream *st ) const {
2236   st->print("{");
2237   if( !depth || d[this] ) {     // Check for recursive print
2238     st->print("...}");
2239     return;
2240   }
2241   d.Insert((void*)this, (void*)this);   // Stop recursion
2242   if( _cnt ) {
2243     uint i;
2244     for( i=0; i<_cnt-1; i++ ) {
2245       st->print("%d:", i);
2246       _fields[i]->dump2(d, depth-1, st);
2247       st->print(", ");
2248     }
2249     st->print("%d:", i);
2250     _fields[i]->dump2(d, depth-1, st);
2251   }
2252   st->print("}");
2253 }
2254 #endif
2255 
2256 //------------------------------singleton--------------------------------------
2257 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
2258 // constants (Ldi nodes).  Singletons are integer, float or double constants
2259 // or a single symbol.
2260 bool TypeTuple::singleton(void) const {
2261   return false;                 // Never a singleton
2262 }
2263 
2264 bool TypeTuple::empty(void) const {
2265   for( uint i=0; i<_cnt; i++ ) {
2266     if (_fields[i]->empty())  return true;
2267   }
2268   return false;
2269 }
2270 
2271 //=============================================================================
2272 // Convenience common pre-built types.
2273 
2274 inline const TypeInt* normalize_array_size(const TypeInt* size) {
2275   // Certain normalizations keep us sane when comparing types.
2276   // We do not want arrayOop variables to differ only by the wideness
2277   // of their index types.  Pick minimum wideness, since that is the
2278   // forced wideness of small ranges anyway.
2279   if (size->_widen != Type::WidenMin)
2280     return TypeInt::make(size->_lo, size->_hi, Type::WidenMin);
2281   else
2282     return size;
2283 }
2284 
2285 //------------------------------make-------------------------------------------
2286 const TypeAry* TypeAry::make(const Type* elem, const TypeInt* size, bool stable) {
2287   if (UseCompressedOops && elem->isa_oopptr()) {
2288     elem = elem->make_narrowoop();
2289   }
2290   size = normalize_array_size(size);
2291   return (TypeAry*)(new TypeAry(elem,size,stable))->hashcons();
2292 }
2293 
2294 //------------------------------meet-------------------------------------------
2295 // Compute the MEET of two types.  It returns a new Type object.
2296 const Type *TypeAry::xmeet( const Type *t ) const {
2297   // Perform a fast test for common case; meeting the same types together.
2298   if( this == t ) return this;  // Meeting same type-rep?
2299 
2300   // Current "this->_base" is Ary
2301   switch (t->base()) {          // switch on original type
2302 
2303   case Bottom:                  // Ye Olde Default
2304     return t;
2305 
2306   default:                      // All else is a mistake
2307     typerr(t);
2308 
2309   case Array: {                 // Meeting 2 arrays?
2310     const TypeAry* a = t->is_ary();
2311     const Type* size = _size->xmeet(a->_size);
2312     const TypeInt* isize = size->isa_int();
2313     if (isize == nullptr) {
2314       assert(size == Type::TOP || size == Type::BOTTOM, "");
2315       return size;
2316     }
2317     return TypeAry::make(_elem->meet_speculative(a->_elem),
2318                          isize, _stable && a->_stable);
2319   }
2320   case Top:
2321     break;
2322   }
2323   return this;                  // Return the double constant
2324 }
2325 
2326 //------------------------------xdual------------------------------------------
2327 // Dual: compute field-by-field dual
2328 const Type *TypeAry::xdual() const {
2329   const TypeInt* size_dual = _size->dual()->is_int();
2330   size_dual = normalize_array_size(size_dual);
2331   return new TypeAry(_elem->dual(), size_dual, !_stable);
2332 }
2333 
2334 //------------------------------eq---------------------------------------------
2335 // Structural equality check for Type representations
2336 bool TypeAry::eq( const Type *t ) const {
2337   const TypeAry *a = (const TypeAry*)t;
2338   return _elem == a->_elem &&
2339     _stable == a->_stable &&
2340     _size == a->_size;
2341 }
2342 
2343 //------------------------------hash-------------------------------------------
2344 // Type-specific hashing function.
2345 uint TypeAry::hash(void) const {
2346   return (uint)(uintptr_t)_elem + (uint)(uintptr_t)_size + (uint)(_stable ? 43 : 0);
2347 }
2348 
2349 /**
2350  * Return same type without a speculative part in the element
2351  */
2352 const TypeAry* TypeAry::remove_speculative() const {
2353   return make(_elem->remove_speculative(), _size, _stable);
2354 }
2355 
2356 /**
2357  * Return same type with cleaned up speculative part of element
2358  */
2359 const Type* TypeAry::cleanup_speculative() const {
2360   return make(_elem->cleanup_speculative(), _size, _stable);
2361 }
2362 
2363 /**
2364  * Return same type but with a different inline depth (used for speculation)
2365  *
2366  * @param depth  depth to meet with
2367  */
2368 const TypePtr* TypePtr::with_inline_depth(int depth) const {
2369   if (!UseInlineDepthForSpeculativeTypes) {
2370     return this;
2371   }
2372   return make(AnyPtr, _ptr, _offset, _speculative, depth, _reloc);
2373 }
2374 
2375 //------------------------------dump2------------------------------------------
2376 #ifndef PRODUCT
2377 void TypeAry::dump2( Dict &d, uint depth, outputStream *st ) const {
2378   if (_stable)  st->print("stable:");
2379   _elem->dump2(d, depth, st);
2380   st->print("[");
2381   _size->dump2(d, depth, st);
2382   st->print("]");
2383 }
2384 #endif
2385 
2386 //------------------------------singleton--------------------------------------
2387 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
2388 // constants (Ldi nodes).  Singletons are integer, float or double constants
2389 // or a single symbol.
2390 bool TypeAry::singleton(void) const {
2391   return false;                 // Never a singleton
2392 }
2393 
2394 bool TypeAry::empty(void) const {
2395   return _elem->empty() || _size->empty();
2396 }
2397 
2398 //--------------------------ary_must_be_exact----------------------------------
2399 bool TypeAry::ary_must_be_exact() const {
2400   // This logic looks at the element type of an array, and returns true
2401   // if the element type is either a primitive or a final instance class.
2402   // In such cases, an array built on this ary must have no subclasses.
2403   if (_elem == BOTTOM)      return false;  // general array not exact
2404   if (_elem == TOP   )      return false;  // inverted general array not exact
2405   const TypeOopPtr*  toop = nullptr;
2406   if (UseCompressedOops && _elem->isa_narrowoop()) {
2407     toop = _elem->make_ptr()->isa_oopptr();
2408   } else {
2409     toop = _elem->isa_oopptr();
2410   }
2411   if (!toop)                return true;   // a primitive type, like int
2412   if (!toop->is_loaded())   return false;  // unloaded class
2413   const TypeInstPtr* tinst;
2414   if (_elem->isa_narrowoop())
2415     tinst = _elem->make_ptr()->isa_instptr();
2416   else
2417     tinst = _elem->isa_instptr();
2418   if (tinst)
2419     return tinst->instance_klass()->is_final();
2420   const TypeAryPtr*  tap;
2421   if (_elem->isa_narrowoop())
2422     tap = _elem->make_ptr()->isa_aryptr();
2423   else
2424     tap = _elem->isa_aryptr();
2425   if (tap)
2426     return tap->ary()->ary_must_be_exact();
2427   return false;
2428 }
2429 
2430 //==============================TypeVect=======================================
2431 // Convenience common pre-built types.
2432 const TypeVect* TypeVect::VECTA = nullptr; // vector length agnostic
2433 const TypeVect* TypeVect::VECTS = nullptr; //  32-bit vectors
2434 const TypeVect* TypeVect::VECTD = nullptr; //  64-bit vectors
2435 const TypeVect* TypeVect::VECTX = nullptr; // 128-bit vectors
2436 const TypeVect* TypeVect::VECTY = nullptr; // 256-bit vectors
2437 const TypeVect* TypeVect::VECTZ = nullptr; // 512-bit vectors
2438 const TypeVect* TypeVect::VECTMASK = nullptr; // predicate/mask vector
2439 
2440 //------------------------------make-------------------------------------------
2441 const TypeVect* TypeVect::make(BasicType elem_bt, uint length, bool is_mask) {
2442   if (is_mask) {
2443     return makemask(elem_bt, length);
2444   }
2445   assert(is_java_primitive(elem_bt), "only primitive types in vector");
2446   assert(Matcher::vector_size_supported(elem_bt, length), "length in range");
2447   int size = length * type2aelembytes(elem_bt);
2448   switch (Matcher::vector_ideal_reg(size)) {
2449   case Op_VecA:
2450     return (TypeVect*)(new TypeVectA(elem_bt, length))->hashcons();
2451   case Op_VecS:
2452     return (TypeVect*)(new TypeVectS(elem_bt, length))->hashcons();
2453   case Op_RegL:
2454   case Op_VecD:
2455   case Op_RegD:
2456     return (TypeVect*)(new TypeVectD(elem_bt, length))->hashcons();
2457   case Op_VecX:
2458     return (TypeVect*)(new TypeVectX(elem_bt, length))->hashcons();
2459   case Op_VecY:
2460     return (TypeVect*)(new TypeVectY(elem_bt, length))->hashcons();
2461   case Op_VecZ:
2462     return (TypeVect*)(new TypeVectZ(elem_bt, length))->hashcons();
2463   }
2464  ShouldNotReachHere();
2465   return nullptr;
2466 }
2467 
2468 // Create a vector mask type with the given element basic type and length.
2469 // - Returns "TypePVectMask" (PVectMask) for platforms that support the predicate
2470 //   feature and it is implemented properly in the backend, allowing the mask to
2471 //   be stored in a predicate/mask register.
2472 // - Returns a normal vector type "TypeVectA ~ TypeVectZ" (NVectMask) otherwise,
2473 //   where the vector mask is stored in a vector register.
2474 const TypeVect* TypeVect::makemask(BasicType elem_bt, uint length) {
2475   if (Matcher::has_predicated_vectors() &&
2476       Matcher::match_rule_supported_vector_masked(Op_VectorLoadMask, length, elem_bt)) {
2477     return TypePVectMask::make(elem_bt, length);
2478   } else {
2479     return make(elem_bt, length);
2480   }
2481 }
2482 
2483 //------------------------------meet-------------------------------------------
2484 // Compute the MEET of two types. Since each TypeVect is the only instance of
2485 // its species, meeting often returns itself
2486 const Type* TypeVect::xmeet(const Type* t) const {
2487   // Perform a fast test for common case; meeting the same types together.
2488   if (this == t) {
2489     return this;
2490   }
2491 
2492   // Current "this->_base" is Vector
2493   switch (t->base()) {          // switch on original type
2494 
2495   case Bottom:                  // Ye Olde Default
2496     return t;
2497 
2498   default:                      // All else is a mistake
2499     typerr(t);
2500   case VectorMask:
2501   case VectorA:
2502   case VectorS:
2503   case VectorD:
2504   case VectorX:
2505   case VectorY:
2506   case VectorZ: {                // Meeting 2 vectors?
2507     const TypeVect* v = t->is_vect();
2508     assert(base() == v->base(), "");
2509     assert(length() == v->length(), "");
2510     assert(element_basic_type() == v->element_basic_type(), "");
2511     return this;
2512   }
2513   case Top:
2514     break;
2515   }
2516   return this;
2517 }
2518 
2519 //------------------------------xdual------------------------------------------
2520 // Since each TypeVect is the only instance of its species, it is self-dual
2521 const Type* TypeVect::xdual() const {
2522   return this;
2523 }
2524 
2525 //------------------------------eq---------------------------------------------
2526 // Structural equality check for Type representations
2527 bool TypeVect::eq(const Type* t) const {
2528   const TypeVect* v = t->is_vect();
2529   return (element_basic_type() == v->element_basic_type()) && (length() == v->length());
2530 }
2531 
2532 //------------------------------hash-------------------------------------------
2533 // Type-specific hashing function.
2534 uint TypeVect::hash(void) const {
2535   return (uint)base() + (uint)(uintptr_t)_elem_bt + (uint)(uintptr_t)_length;
2536 }
2537 
2538 //------------------------------singleton--------------------------------------
2539 // TRUE if Type is a singleton type, FALSE otherwise. Singletons are simple
2540 // constants (Ldi nodes).  Vector is singleton if all elements are the same
2541 // constant value (when vector is created with Replicate code).
2542 bool TypeVect::singleton(void) const {
2543 // There is no Con node for vectors yet.
2544 //  return _elem->singleton();
2545   return false;
2546 }
2547 
2548 bool TypeVect::empty(void) const {
2549   return false;
2550 }
2551 
2552 //------------------------------dump2------------------------------------------
2553 #ifndef PRODUCT
2554 void TypeVect::dump2(Dict& d, uint depth, outputStream* st) const {
2555   switch (base()) {
2556   case VectorA:
2557     st->print("vectora"); break;
2558   case VectorS:
2559     st->print("vectors"); break;
2560   case VectorD:
2561     st->print("vectord"); break;
2562   case VectorX:
2563     st->print("vectorx"); break;
2564   case VectorY:
2565     st->print("vectory"); break;
2566   case VectorZ:
2567     st->print("vectorz"); break;
2568   case VectorMask:
2569     st->print("vectormask"); break;
2570   default:
2571     ShouldNotReachHere();
2572   }
2573   st->print("<%c,%u>", type2char(element_basic_type()), length());
2574 }
2575 #endif
2576 
2577 const TypePVectMask* TypePVectMask::make(const BasicType elem_bt, uint length) {
2578   return (TypePVectMask*) (new TypePVectMask(elem_bt, length))->hashcons();
2579 }
2580 
2581 //=============================================================================
2582 // Convenience common pre-built types.
2583 const TypePtr *TypePtr::NULL_PTR;
2584 const TypePtr *TypePtr::NOTNULL;
2585 const TypePtr *TypePtr::BOTTOM;
2586 
2587 //------------------------------meet-------------------------------------------
2588 // Meet over the PTR enum
2589 const TypePtr::PTR TypePtr::ptr_meet[TypePtr::lastPTR][TypePtr::lastPTR] = {
2590   //              TopPTR,    AnyNull,   Constant, Null,   NotNull, BotPTR,
2591   { /* Top     */ TopPTR,    AnyNull,   Constant, Null,   NotNull, BotPTR,},
2592   { /* AnyNull */ AnyNull,   AnyNull,   Constant, BotPTR, NotNull, BotPTR,},
2593   { /* Constant*/ Constant,  Constant,  Constant, BotPTR, NotNull, BotPTR,},
2594   { /* Null    */ Null,      BotPTR,    BotPTR,   Null,   BotPTR,  BotPTR,},
2595   { /* NotNull */ NotNull,   NotNull,   NotNull,  BotPTR, NotNull, BotPTR,},
2596   { /* BotPTR  */ BotPTR,    BotPTR,    BotPTR,   BotPTR, BotPTR,  BotPTR,}
2597 };
2598 
2599 //------------------------------make-------------------------------------------
2600 const TypePtr* TypePtr::make(TYPES t, enum PTR ptr, int offset,
2601                              const TypePtr* speculative, int inline_depth,
2602                              relocInfo::relocType reloc) {
2603   return (TypePtr*)(new TypePtr(t, ptr, offset, reloc, speculative, inline_depth))->hashcons();
2604 }
2605 
2606 //------------------------------cast_to_ptr_type-------------------------------
2607 const TypePtr* TypePtr::cast_to_ptr_type(PTR ptr) const {
2608   assert(_base == AnyPtr, "subclass must override cast_to_ptr_type");
2609   if( ptr == _ptr ) return this;
2610   return make(_base, ptr, _offset, _speculative, _inline_depth, _reloc);
2611 }
2612 
2613 //------------------------------get_con----------------------------------------
2614 intptr_t TypePtr::get_con() const {
2615   assert( _ptr == Null, "" );
2616   return _offset;
2617 }
2618 
2619 //------------------------------meet-------------------------------------------
2620 // Compute the MEET of two types.  It returns a new Type object.
2621 const Type *TypePtr::xmeet(const Type *t) const {
2622   const Type* res = xmeet_helper(t);
2623   if (res->isa_ptr() == nullptr) {
2624     return res;
2625   }
2626 
2627   const TypePtr* res_ptr = res->is_ptr();
2628   if (res_ptr->speculative() != nullptr) {
2629     // type->speculative() is null means that speculation is no better
2630     // than type, i.e. type->speculative() == type. So there are 2
2631     // ways to represent the fact that we have no useful speculative
2632     // data and we should use a single one to be able to test for
2633     // equality between types. Check whether type->speculative() ==
2634     // type and set speculative to null if it is the case.
2635     if (res_ptr->remove_speculative() == res_ptr->speculative()) {
2636       return res_ptr->remove_speculative();
2637     }
2638   }
2639 
2640   return res;
2641 }
2642 
2643 const Type *TypePtr::xmeet_helper(const Type *t) const {
2644   // Perform a fast test for common case; meeting the same types together.
2645   if( this == t ) return this;  // Meeting same type-rep?
2646 
2647   // Current "this->_base" is AnyPtr
2648   switch (t->base()) {          // switch on original type
2649   case Int:                     // Mixing ints & oops happens when javac
2650   case Long:                    // reuses local variables
2651   case HalfFloatTop:
2652   case HalfFloatCon:
2653   case HalfFloatBot:
2654   case FloatTop:
2655   case FloatCon:
2656   case FloatBot:
2657   case DoubleTop:
2658   case DoubleCon:
2659   case DoubleBot:
2660   case NarrowOop:
2661   case NarrowKlass:
2662   case Bottom:                  // Ye Olde Default
2663     return Type::BOTTOM;
2664   case Top:
2665     return this;
2666 
2667   case AnyPtr: {                // Meeting to AnyPtrs
2668     const TypePtr *tp = t->is_ptr();
2669     const TypePtr* speculative = xmeet_speculative(tp);
2670     int depth = meet_inline_depth(tp->inline_depth());
2671     return make(AnyPtr, meet_ptr(tp->ptr()), meet_offset(tp->offset()), speculative, depth);
2672   }
2673   case RawPtr:                  // For these, flip the call around to cut down
2674   case OopPtr:
2675   case InstPtr:                 // on the cases I have to handle.
2676   case AryPtr:
2677   case MetadataPtr:
2678   case KlassPtr:
2679   case InstKlassPtr:
2680   case AryKlassPtr:
2681     return t->xmeet(this);      // Call in reverse direction
2682   default:                      // All else is a mistake
2683     typerr(t);
2684 
2685   }
2686   return this;
2687 }
2688 
2689 //------------------------------meet_offset------------------------------------
2690 int TypePtr::meet_offset( int offset ) const {
2691   // Either is 'TOP' offset?  Return the other offset!
2692   if( _offset == OffsetTop ) return offset;
2693   if( offset == OffsetTop ) return _offset;
2694   // If either is different, return 'BOTTOM' offset
2695   if( _offset != offset ) return OffsetBot;
2696   return _offset;
2697 }
2698 
2699 //------------------------------dual_offset------------------------------------
2700 int TypePtr::dual_offset( ) const {
2701   if( _offset == OffsetTop ) return OffsetBot;// Map 'TOP' into 'BOTTOM'
2702   if( _offset == OffsetBot ) return OffsetTop;// Map 'BOTTOM' into 'TOP'
2703   return _offset;               // Map everything else into self
2704 }
2705 
2706 //------------------------------xdual------------------------------------------
2707 // Dual: compute field-by-field dual
2708 const TypePtr::PTR TypePtr::ptr_dual[TypePtr::lastPTR] = {
2709   BotPTR, NotNull, Constant, Null, AnyNull, TopPTR
2710 };
2711 const Type *TypePtr::xdual() const {
2712   return new TypePtr(AnyPtr, dual_ptr(), dual_offset(), relocInfo::none, dual_speculative(), dual_inline_depth());
2713 }
2714 
2715 //------------------------------xadd_offset------------------------------------
2716 int TypePtr::xadd_offset( intptr_t offset ) const {
2717   // Adding to 'TOP' offset?  Return 'TOP'!
2718   if( _offset == OffsetTop || offset == OffsetTop ) return OffsetTop;
2719   // Adding to 'BOTTOM' offset?  Return 'BOTTOM'!
2720   if( _offset == OffsetBot || offset == OffsetBot ) return OffsetBot;
2721   // Addition overflows or "accidentally" equals to OffsetTop? Return 'BOTTOM'!
2722   offset += (intptr_t)_offset;
2723   if (offset != (int)offset || offset == OffsetTop) return OffsetBot;
2724 
2725   // assert( _offset >= 0 && _offset+offset >= 0, "" );
2726   // It is possible to construct a negative offset during PhaseCCP
2727 
2728   return (int)offset;        // Sum valid offsets
2729 }
2730 
2731 //------------------------------add_offset-------------------------------------
2732 const TypePtr *TypePtr::add_offset( intptr_t offset ) const {
2733   return make(AnyPtr, _ptr, xadd_offset(offset), _speculative, _inline_depth, _reloc);
2734 }
2735 
2736 const TypePtr *TypePtr::with_offset(intptr_t offset) const {
2737   return make(AnyPtr, _ptr, offset, _speculative, _inline_depth, _reloc);
2738 }
2739 
2740 //------------------------------eq---------------------------------------------
2741 // Structural equality check for Type representations
2742 bool TypePtr::eq( const Type *t ) const {
2743   const TypePtr *a = (const TypePtr*)t;
2744   return _ptr == a->ptr() && _offset == a->offset() && _reloc == a->reloc() &&
2745          eq_speculative(a) && _inline_depth == a->_inline_depth;
2746 }
2747 
2748 //------------------------------hash-------------------------------------------
2749 // Type-specific hashing function.
2750 uint TypePtr::hash(void) const {
2751   return (uint)_ptr + (uint)_offset + (uint)_reloc + (uint)hash_speculative() + (uint)_inline_depth;
2752 }
2753 
2754 /**
2755  * Return same type without a speculative part
2756  */
2757 const TypePtr* TypePtr::remove_speculative() const {
2758   if (_speculative == nullptr) {
2759     return this;
2760   }
2761   assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth");
2762   return make(AnyPtr, _ptr, _offset, nullptr, _inline_depth, _reloc);
2763 }
2764 
2765 /**
2766  * Return same type but drop speculative part if we know we won't use
2767  * it
2768  */
2769 const Type* TypePtr::cleanup_speculative() const {
2770   if (speculative() == nullptr) {
2771     return this;
2772   }
2773   const Type* no_spec = remove_speculative();
2774   // If this is NULL_PTR then we don't need the speculative type
2775   // (with_inline_depth in case the current type inline depth is
2776   // InlineDepthTop)
2777   if (no_spec == NULL_PTR->with_inline_depth(inline_depth())) {
2778     return no_spec;
2779   }
2780   if (above_centerline(speculative()->ptr())) {
2781     return no_spec;
2782   }
2783   const TypeOopPtr* spec_oopptr = speculative()->isa_oopptr();
2784   // If the speculative may be null and is an inexact klass then it
2785   // doesn't help
2786   if (speculative() != TypePtr::NULL_PTR && speculative()->maybe_null() &&
2787       (spec_oopptr == nullptr || !spec_oopptr->klass_is_exact())) {
2788     return no_spec;
2789   }
2790   return this;
2791 }
2792 
2793 /**
2794  * dual of the speculative part of the type
2795  */
2796 const TypePtr* TypePtr::dual_speculative() const {
2797   if (_speculative == nullptr) {
2798     return nullptr;
2799   }
2800   return _speculative->dual()->is_ptr();
2801 }
2802 
2803 /**
2804  * meet of the speculative parts of 2 types
2805  *
2806  * @param other  type to meet with
2807  */
2808 const TypePtr* TypePtr::xmeet_speculative(const TypePtr* other) const {
2809   bool this_has_spec = (_speculative != nullptr);
2810   bool other_has_spec = (other->speculative() != nullptr);
2811 
2812   if (!this_has_spec && !other_has_spec) {
2813     return nullptr;
2814   }
2815 
2816   // If we are at a point where control flow meets and one branch has
2817   // a speculative type and the other has not, we meet the speculative
2818   // type of one branch with the actual type of the other. If the
2819   // actual type is exact and the speculative is as well, then the
2820   // result is a speculative type which is exact and we can continue
2821   // speculation further.
2822   const TypePtr* this_spec = _speculative;
2823   const TypePtr* other_spec = other->speculative();
2824 
2825   if (!this_has_spec) {
2826     this_spec = this;
2827   }
2828 
2829   if (!other_has_spec) {
2830     other_spec = other;
2831   }
2832 
2833   return this_spec->meet(other_spec)->is_ptr();
2834 }
2835 
2836 /**
2837  * dual of the inline depth for this type (used for speculation)
2838  */
2839 int TypePtr::dual_inline_depth() const {
2840   return -inline_depth();
2841 }
2842 
2843 /**
2844  * meet of 2 inline depths (used for speculation)
2845  *
2846  * @param depth  depth to meet with
2847  */
2848 int TypePtr::meet_inline_depth(int depth) const {
2849   return MAX2(inline_depth(), depth);
2850 }
2851 
2852 /**
2853  * Are the speculative parts of 2 types equal?
2854  *
2855  * @param other  type to compare this one to
2856  */
2857 bool TypePtr::eq_speculative(const TypePtr* other) const {
2858   if (_speculative == nullptr || other->speculative() == nullptr) {
2859     return _speculative == other->speculative();
2860   }
2861 
2862   if (_speculative->base() != other->speculative()->base()) {
2863     return false;
2864   }
2865 
2866   return _speculative->eq(other->speculative());
2867 }
2868 
2869 /**
2870  * Hash of the speculative part of the type
2871  */
2872 int TypePtr::hash_speculative() const {
2873   if (_speculative == nullptr) {
2874     return 0;
2875   }
2876 
2877   return _speculative->hash();
2878 }
2879 
2880 /**
2881  * add offset to the speculative part of the type
2882  *
2883  * @param offset  offset to add
2884  */
2885 const TypePtr* TypePtr::add_offset_speculative(intptr_t offset) const {
2886   if (_speculative == nullptr) {
2887     return nullptr;
2888   }
2889   return _speculative->add_offset(offset)->is_ptr();
2890 }
2891 
2892 const TypePtr* TypePtr::with_offset_speculative(intptr_t offset) const {
2893   if (_speculative == nullptr) {
2894     return nullptr;
2895   }
2896   return _speculative->with_offset(offset)->is_ptr();
2897 }
2898 
2899 /**
2900  * return exact klass from the speculative type if there's one
2901  */
2902 ciKlass* TypePtr::speculative_type() const {
2903   if (_speculative != nullptr && _speculative->isa_oopptr()) {
2904     const TypeOopPtr* speculative = _speculative->join(this)->is_oopptr();
2905     if (speculative->klass_is_exact()) {
2906       return speculative->exact_klass();
2907     }
2908   }
2909   return nullptr;
2910 }
2911 
2912 /**
2913  * return true if speculative type may be null
2914  */
2915 bool TypePtr::speculative_maybe_null() const {
2916   if (_speculative != nullptr) {
2917     const TypePtr* speculative = _speculative->join(this)->is_ptr();
2918     return speculative->maybe_null();
2919   }
2920   return true;
2921 }
2922 
2923 bool TypePtr::speculative_always_null() const {
2924   if (_speculative != nullptr) {
2925     const TypePtr* speculative = _speculative->join(this)->is_ptr();
2926     return speculative == TypePtr::NULL_PTR;
2927   }
2928   return false;
2929 }
2930 
2931 /**
2932  * Same as TypePtr::speculative_type() but return the klass only if
2933  * the speculative tells us is not null
2934  */
2935 ciKlass* TypePtr::speculative_type_not_null() const {
2936   if (speculative_maybe_null()) {
2937     return nullptr;
2938   }
2939   return speculative_type();
2940 }
2941 
2942 /**
2943  * Check whether new profiling would improve speculative type
2944  *
2945  * @param   exact_kls    class from profiling
2946  * @param   inline_depth inlining depth of profile point
2947  *
2948  * @return  true if type profile is valuable
2949  */
2950 bool TypePtr::would_improve_type(ciKlass* exact_kls, int inline_depth) const {
2951   // no profiling?
2952   if (exact_kls == nullptr) {
2953     return false;
2954   }
2955   if (speculative() == TypePtr::NULL_PTR) {
2956     return false;
2957   }
2958   // no speculative type or non exact speculative type?
2959   if (speculative_type() == nullptr) {
2960     return true;
2961   }
2962   // If the node already has an exact speculative type keep it,
2963   // unless it was provided by profiling that is at a deeper
2964   // inlining level. Profiling at a higher inlining depth is
2965   // expected to be less accurate.
2966   if (_speculative->inline_depth() == InlineDepthBottom) {
2967     return false;
2968   }
2969   assert(_speculative->inline_depth() != InlineDepthTop, "can't do the comparison");
2970   return inline_depth < _speculative->inline_depth();
2971 }
2972 
2973 /**
2974  * Check whether new profiling would improve ptr (= tells us it is non
2975  * null)
2976  *
2977  * @param   ptr_kind always null or not null?
2978  *
2979  * @return  true if ptr profile is valuable
2980  */
2981 bool TypePtr::would_improve_ptr(ProfilePtrKind ptr_kind) const {
2982   // profiling doesn't tell us anything useful
2983   if (ptr_kind != ProfileAlwaysNull && ptr_kind != ProfileNeverNull) {
2984     return false;
2985   }
2986   // We already know this is not null
2987   if (!this->maybe_null()) {
2988     return false;
2989   }
2990   // We already know the speculative type cannot be null
2991   if (!speculative_maybe_null()) {
2992     return false;
2993   }
2994   // We already know this is always null
2995   if (this == TypePtr::NULL_PTR) {
2996     return false;
2997   }
2998   // We already know the speculative type is always null
2999   if (speculative_always_null()) {
3000     return false;
3001   }
3002   if (ptr_kind == ProfileAlwaysNull && speculative() != nullptr && speculative()->isa_oopptr()) {
3003     return false;
3004   }
3005   return true;
3006 }
3007 
3008 //------------------------------dump2------------------------------------------
3009 const char *const TypePtr::ptr_msg[TypePtr::lastPTR] = {
3010   "TopPTR","AnyNull","Constant","null","NotNull","BotPTR"
3011 };
3012 
3013 #ifndef PRODUCT
3014 void TypePtr::dump2( Dict &d, uint depth, outputStream *st ) const {
3015   st->print("ptr:%s", ptr_msg[_ptr]);
3016   dump_offset(st);
3017   dump_inline_depth(st);
3018   dump_speculative(st);
3019 }
3020 
3021 void TypePtr::dump_offset(outputStream* st) const {
3022   if (_offset == OffsetBot) {
3023     st->print("+bot");
3024   } else if (_offset == OffsetTop) {
3025     st->print("+top");
3026   } else {
3027     st->print("+%d", _offset);
3028   }
3029 }
3030 
3031 /**
3032  *dump the speculative part of the type
3033  */
3034 void TypePtr::dump_speculative(outputStream *st) const {
3035   if (_speculative != nullptr) {
3036     st->print(" (speculative=");
3037     _speculative->dump_on(st);
3038     st->print(")");
3039   }
3040 }
3041 
3042 /**
3043  *dump the inline depth of the type
3044  */
3045 void TypePtr::dump_inline_depth(outputStream *st) const {
3046   if (_inline_depth != InlineDepthBottom) {
3047     if (_inline_depth == InlineDepthTop) {
3048       st->print(" (inline_depth=InlineDepthTop)");
3049     } else {
3050       st->print(" (inline_depth=%d)", _inline_depth);
3051     }
3052   }
3053 }
3054 #endif
3055 
3056 //------------------------------singleton--------------------------------------
3057 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
3058 // constants
3059 bool TypePtr::singleton(void) const {
3060   // TopPTR, Null, AnyNull, Constant are all singletons
3061   return (_offset != OffsetBot) && !below_centerline(_ptr);
3062 }
3063 
3064 bool TypePtr::empty(void) const {
3065   return (_offset == OffsetTop) || above_centerline(_ptr);
3066 }
3067 
3068 //=============================================================================
3069 // Convenience common pre-built types.
3070 const TypeRawPtr *TypeRawPtr::BOTTOM;
3071 const TypeRawPtr *TypeRawPtr::NOTNULL;
3072 
3073 //------------------------------make-------------------------------------------
3074 const TypeRawPtr *TypeRawPtr::make( enum PTR ptr ) {
3075   assert( ptr != Constant, "what is the constant?" );
3076   assert( ptr != Null, "Use TypePtr for null" );
3077   return (TypeRawPtr*)(new TypeRawPtr(ptr, nullptr, relocInfo::none))->hashcons();
3078 }
3079 
3080 const TypeRawPtr* TypeRawPtr::make(address bits, relocInfo::relocType reloc) {
3081   assert(bits != nullptr, "Use TypePtr for null");
3082   return (TypeRawPtr*)(new TypeRawPtr(Constant, bits, reloc))->hashcons();
3083 }
3084 
3085 //------------------------------cast_to_ptr_type-------------------------------
3086 const TypeRawPtr* TypeRawPtr::cast_to_ptr_type(PTR ptr) const {
3087   assert( ptr != Constant, "what is the constant?" );
3088   assert( ptr != Null, "Use TypePtr for null" );
3089   assert( _bits == nullptr, "Why cast a constant address?");
3090   if( ptr == _ptr ) return this;
3091   return make(ptr);
3092 }
3093 
3094 //------------------------------get_con----------------------------------------
3095 intptr_t TypeRawPtr::get_con() const {
3096   assert( _ptr == Null || _ptr == Constant, "" );
3097   return (intptr_t)_bits;
3098 }
3099 
3100 //------------------------------meet-------------------------------------------
3101 // Compute the MEET of two types.  It returns a new Type object.
3102 const Type *TypeRawPtr::xmeet( const Type *t ) const {
3103   // Perform a fast test for common case; meeting the same types together.
3104   if( this == t ) return this;  // Meeting same type-rep?
3105 
3106   // Current "this->_base" is RawPtr
3107   switch( t->base() ) {         // switch on original type
3108   case Bottom:                  // Ye Olde Default
3109     return t;
3110   case Top:
3111     return this;
3112   case AnyPtr:                  // Meeting to AnyPtrs
3113     break;
3114   case RawPtr: {                // might be top, bot, any/not or constant
3115     enum PTR tptr = t->is_ptr()->ptr();
3116     enum PTR ptr = meet_ptr( tptr );
3117     if( ptr == Constant ) {     // Cannot be equal constants, so...
3118       if( tptr == Constant && _ptr != Constant)  return t;
3119       if( _ptr == Constant && tptr != Constant)  return this;
3120       ptr = NotNull;            // Fall down in lattice
3121     }
3122     return make( ptr );
3123   }
3124 
3125   case OopPtr:
3126   case InstPtr:
3127   case AryPtr:
3128   case MetadataPtr:
3129   case KlassPtr:
3130   case InstKlassPtr:
3131   case AryKlassPtr:
3132     return TypePtr::BOTTOM;     // Oop meet raw is not well defined
3133   default:                      // All else is a mistake
3134     typerr(t);
3135   }
3136 
3137   // Found an AnyPtr type vs self-RawPtr type
3138   const TypePtr *tp = t->is_ptr();
3139   switch (tp->ptr()) {
3140   case TypePtr::TopPTR:  return this;
3141   case TypePtr::BotPTR:  return t;
3142   case TypePtr::Null:
3143     if( _ptr == TypePtr::TopPTR ) return t;
3144     return TypeRawPtr::BOTTOM;
3145   case TypePtr::NotNull: return TypePtr::make(AnyPtr, meet_ptr(TypePtr::NotNull), tp->meet_offset(0), tp->speculative(), tp->inline_depth());
3146   case TypePtr::AnyNull:
3147     if( _ptr == TypePtr::Constant) return this;
3148     return make( meet_ptr(TypePtr::AnyNull) );
3149   default: ShouldNotReachHere();
3150   }
3151   return this;
3152 }
3153 
3154 //------------------------------xdual------------------------------------------
3155 // Dual: compute field-by-field dual
3156 const Type *TypeRawPtr::xdual() const {
3157   return new TypeRawPtr(dual_ptr(), _bits, _reloc);
3158 }
3159 
3160 //------------------------------add_offset-------------------------------------
3161 const TypePtr* TypeRawPtr::add_offset(intptr_t offset) const {
3162   if( offset == OffsetTop ) return BOTTOM; // Undefined offset-> undefined pointer
3163   if( offset == OffsetBot ) return BOTTOM; // Unknown offset-> unknown pointer
3164   if( offset == 0 ) return this; // No change
3165   switch (_ptr) {
3166   case TypePtr::TopPTR:
3167   case TypePtr::BotPTR:
3168   case TypePtr::NotNull:
3169     return this;
3170   case TypePtr::Constant: {
3171     uintptr_t bits = (uintptr_t)_bits;
3172     uintptr_t sum = bits + offset;
3173     if (( offset < 0 )
3174         ? ( sum > bits )        // Underflow?
3175         : ( sum < bits )) {     // Overflow?
3176       return BOTTOM;
3177     } else if ( sum == 0 ) {
3178       return TypePtr::NULL_PTR;
3179     } else {
3180       return make((address)sum, _reloc);
3181     }
3182   }
3183   default:  ShouldNotReachHere();
3184   }
3185 }
3186 
3187 //------------------------------eq---------------------------------------------
3188 // Structural equality check for Type representations
3189 bool TypeRawPtr::eq( const Type *t ) const {
3190   const TypeRawPtr *a = (const TypeRawPtr*)t;
3191   return _bits == a->_bits && TypePtr::eq(t);
3192 }
3193 
3194 //------------------------------hash-------------------------------------------
3195 // Type-specific hashing function.
3196 uint TypeRawPtr::hash(void) const {
3197   return (uint)(uintptr_t)_bits + (uint)TypePtr::hash();
3198 }
3199 
3200 //------------------------------dump2------------------------------------------
3201 #ifndef PRODUCT
3202 void TypeRawPtr::dump2(Dict& d, uint depth, outputStream* st) const {
3203   if (_ptr == Constant) {
3204     st->print("rawptr:Constant:" INTPTR_FORMAT, p2i(_bits));
3205   } else {
3206     st->print("rawptr:%s", ptr_msg[_ptr]);
3207   }
3208 }
3209 #endif
3210 
3211 //=============================================================================
3212 // Convenience common pre-built type.
3213 const TypeOopPtr *TypeOopPtr::BOTTOM;
3214 
3215 TypeInterfaces::TypeInterfaces(ciInstanceKlass** interfaces_base, int nb_interfaces)
3216         : Type(Interfaces), _interfaces(interfaces_base, nb_interfaces),
3217           _hash(0), _exact_klass(nullptr) {
3218   _interfaces.sort(compare);
3219   initialize();
3220 }
3221 
3222 const TypeInterfaces* TypeInterfaces::make(GrowableArray<ciInstanceKlass*>* interfaces) {
3223   // hashcons() can only delete the last thing that was allocated: to
3224   // make sure all memory for the newly created TypeInterfaces can be
3225   // freed if an identical one exists, allocate space for the array of
3226   // interfaces right after the TypeInterfaces object so that they
3227   // form a contiguous piece of memory.
3228   int nb_interfaces = interfaces == nullptr ? 0 : interfaces->length();
3229   size_t total_size = sizeof(TypeInterfaces) + nb_interfaces * sizeof(ciInstanceKlass*);
3230 
3231   void* allocated_mem = operator new(total_size);
3232   ciInstanceKlass** interfaces_base = (ciInstanceKlass**)((char*)allocated_mem + sizeof(TypeInterfaces));
3233   for (int i = 0; i < nb_interfaces; ++i) {
3234     interfaces_base[i] = interfaces->at(i);
3235   }
3236   TypeInterfaces* result = ::new (allocated_mem) TypeInterfaces(interfaces_base, nb_interfaces);
3237   return (const TypeInterfaces*)result->hashcons();
3238 }
3239 
3240 void TypeInterfaces::initialize() {
3241   compute_hash();
3242   compute_exact_klass();
3243   DEBUG_ONLY(_initialized = true;)
3244 }
3245 
3246 int TypeInterfaces::compare(ciInstanceKlass* const& k1, ciInstanceKlass* const& k2) {
3247   if ((intptr_t)k1 < (intptr_t)k2) {
3248     return -1;
3249   } else if ((intptr_t)k1 > (intptr_t)k2) {
3250     return 1;
3251   }
3252   return 0;
3253 }
3254 
3255 int TypeInterfaces::compare(ciInstanceKlass** k1, ciInstanceKlass** k2) {
3256   return compare(*k1, *k2);
3257 }
3258 
3259 bool TypeInterfaces::eq(const Type* t) const {
3260   const TypeInterfaces* other = (const TypeInterfaces*)t;
3261   if (_interfaces.length() != other->_interfaces.length()) {
3262     return false;
3263   }
3264   for (int i = 0; i < _interfaces.length(); i++) {
3265     ciKlass* k1 = _interfaces.at(i);
3266     ciKlass* k2 = other->_interfaces.at(i);
3267     if (!k1->equals(k2)) {
3268       return false;
3269     }
3270   }
3271   return true;
3272 }
3273 
3274 bool TypeInterfaces::eq(ciInstanceKlass* k) const {
3275   assert(k->is_loaded(), "should be loaded");
3276   GrowableArray<ciInstanceKlass *>* interfaces = k->transitive_interfaces();
3277   if (_interfaces.length() != interfaces->length()) {
3278     return false;
3279   }
3280   for (int i = 0; i < interfaces->length(); i++) {
3281     bool found = false;
3282     _interfaces.find_sorted<ciInstanceKlass*, compare>(interfaces->at(i), found);
3283     if (!found) {
3284       return false;
3285     }
3286   }
3287   return true;
3288 }
3289 
3290 
3291 uint TypeInterfaces::hash() const {
3292   assert(_initialized, "must be");
3293   return _hash;
3294 }
3295 
3296 const Type* TypeInterfaces::xdual() const {
3297   return this;
3298 }
3299 
3300 void TypeInterfaces::compute_hash() {
3301   uint hash = 0;
3302   for (int i = 0; i < _interfaces.length(); i++) {
3303     ciKlass* k = _interfaces.at(i);
3304     hash += k->hash();
3305   }
3306   _hash = hash;
3307 }
3308 
3309 static int compare_interfaces(ciInstanceKlass** k1, ciInstanceKlass** k2) {
3310   return (int)((*k1)->ident() - (*k2)->ident());
3311 }
3312 
3313 void TypeInterfaces::dump(outputStream* st) const {
3314   if (_interfaces.length() == 0) {
3315     return;
3316   }
3317   ResourceMark rm;
3318   st->print(" (");
3319   GrowableArray<ciInstanceKlass*> interfaces;
3320   interfaces.appendAll(&_interfaces);
3321   // Sort the interfaces so they are listed in the same order from one run to the other of the same compilation
3322   interfaces.sort(compare_interfaces);
3323   for (int i = 0; i < interfaces.length(); i++) {
3324     if (i > 0) {
3325       st->print(",");
3326     }
3327     ciKlass* k = interfaces.at(i);
3328     k->print_name_on(st);
3329   }
3330   st->print(")");
3331 }
3332 
3333 #ifdef ASSERT
3334 void TypeInterfaces::verify() const {
3335   for (int i = 1; i < _interfaces.length(); i++) {
3336     ciInstanceKlass* k1 = _interfaces.at(i-1);
3337     ciInstanceKlass* k2 = _interfaces.at(i);
3338     assert(compare(k2, k1) > 0, "should be ordered");
3339     assert(k1 != k2, "no duplicate");
3340   }
3341 }
3342 #endif
3343 
3344 const TypeInterfaces* TypeInterfaces::union_with(const TypeInterfaces* other) const {
3345   GrowableArray<ciInstanceKlass*> result_list;
3346   int i = 0;
3347   int j = 0;
3348   while (i < _interfaces.length() || j < other->_interfaces.length()) {
3349     while (i < _interfaces.length() &&
3350            (j >= other->_interfaces.length() ||
3351             compare(_interfaces.at(i), other->_interfaces.at(j)) < 0)) {
3352       result_list.push(_interfaces.at(i));
3353       i++;
3354     }
3355     while (j < other->_interfaces.length() &&
3356            (i >= _interfaces.length() ||
3357             compare(other->_interfaces.at(j), _interfaces.at(i)) < 0)) {
3358       result_list.push(other->_interfaces.at(j));
3359       j++;
3360     }
3361     if (i < _interfaces.length() &&
3362         j < other->_interfaces.length() &&
3363         _interfaces.at(i) == other->_interfaces.at(j)) {
3364       result_list.push(_interfaces.at(i));
3365       i++;
3366       j++;
3367     }
3368   }
3369   const TypeInterfaces* result = TypeInterfaces::make(&result_list);
3370 #ifdef ASSERT
3371   result->verify();
3372   for (int i = 0; i < _interfaces.length(); i++) {
3373     assert(result->_interfaces.contains(_interfaces.at(i)), "missing");
3374   }
3375   for (int i = 0; i < other->_interfaces.length(); i++) {
3376     assert(result->_interfaces.contains(other->_interfaces.at(i)), "missing");
3377   }
3378   for (int i = 0; i < result->_interfaces.length(); i++) {
3379     assert(_interfaces.contains(result->_interfaces.at(i)) || other->_interfaces.contains(result->_interfaces.at(i)), "missing");
3380   }
3381 #endif
3382   return result;
3383 }
3384 
3385 const TypeInterfaces* TypeInterfaces::intersection_with(const TypeInterfaces* other) const {
3386   GrowableArray<ciInstanceKlass*> result_list;
3387   int i = 0;
3388   int j = 0;
3389   while (i < _interfaces.length() || j < other->_interfaces.length()) {
3390     while (i < _interfaces.length() &&
3391            (j >= other->_interfaces.length() ||
3392             compare(_interfaces.at(i), other->_interfaces.at(j)) < 0)) {
3393       i++;
3394     }
3395     while (j < other->_interfaces.length() &&
3396            (i >= _interfaces.length() ||
3397             compare(other->_interfaces.at(j), _interfaces.at(i)) < 0)) {
3398       j++;
3399     }
3400     if (i < _interfaces.length() &&
3401         j < other->_interfaces.length() &&
3402         _interfaces.at(i) == other->_interfaces.at(j)) {
3403       result_list.push(_interfaces.at(i));
3404       i++;
3405       j++;
3406     }
3407   }
3408   const TypeInterfaces* result = TypeInterfaces::make(&result_list);
3409 #ifdef ASSERT
3410   result->verify();
3411   for (int i = 0; i < _interfaces.length(); i++) {
3412     assert(!other->_interfaces.contains(_interfaces.at(i)) || result->_interfaces.contains(_interfaces.at(i)), "missing");
3413   }
3414   for (int i = 0; i < other->_interfaces.length(); i++) {
3415     assert(!_interfaces.contains(other->_interfaces.at(i)) || result->_interfaces.contains(other->_interfaces.at(i)), "missing");
3416   }
3417   for (int i = 0; i < result->_interfaces.length(); i++) {
3418     assert(_interfaces.contains(result->_interfaces.at(i)) && other->_interfaces.contains(result->_interfaces.at(i)), "missing");
3419   }
3420 #endif
3421   return result;
3422 }
3423 
3424 // Is there a single ciKlass* that can represent the interface set?
3425 ciInstanceKlass* TypeInterfaces::exact_klass() const {
3426   assert(_initialized, "must be");
3427   return _exact_klass;
3428 }
3429 
3430 void TypeInterfaces::compute_exact_klass() {
3431   if (_interfaces.length() == 0) {
3432     _exact_klass = nullptr;
3433     return;
3434   }
3435   ciInstanceKlass* res = nullptr;
3436   for (int i = 0; i < _interfaces.length(); i++) {
3437     ciInstanceKlass* interface = _interfaces.at(i);
3438     if (eq(interface)) {
3439       assert(res == nullptr, "");
3440       res = interface;
3441     }
3442   }
3443   _exact_klass = res;
3444 }
3445 
3446 #ifdef ASSERT
3447 void TypeInterfaces::verify_is_loaded() const {
3448   for (int i = 0; i < _interfaces.length(); i++) {
3449     ciKlass* interface = _interfaces.at(i);
3450     assert(interface->is_loaded(), "Interface not loaded");
3451   }
3452 }
3453 #endif
3454 
3455 // Can't be implemented because there's no way to know if the type is above or below the center line.
3456 const Type* TypeInterfaces::xmeet(const Type* t) const {
3457   ShouldNotReachHere();
3458   return Type::xmeet(t);
3459 }
3460 
3461 bool TypeInterfaces::singleton(void) const {
3462   ShouldNotReachHere();
3463   return Type::singleton();
3464 }
3465 
3466 bool TypeInterfaces::has_non_array_interface() const {
3467   assert(TypeAryPtr::_array_interfaces != nullptr, "How come Type::Initialize_shared wasn't called yet?");
3468 
3469   return !TypeAryPtr::_array_interfaces->contains(this);
3470 }
3471 
3472 //------------------------------TypeOopPtr-------------------------------------
3473 TypeOopPtr::TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, const TypeInterfaces* interfaces, bool xk, ciObject* o, int offset,
3474                        int instance_id, const TypePtr* speculative, int inline_depth)
3475   : TypePtr(t, ptr, offset, relocInfo::oop_type, speculative, inline_depth),
3476     _const_oop(o), _klass(k),
3477     _interfaces(interfaces),
3478     _klass_is_exact(xk),
3479     _is_ptr_to_narrowoop(false),
3480     _is_ptr_to_narrowklass(false),
3481     _is_ptr_to_boxed_value(false),
3482     _instance_id(instance_id) {
3483 #ifdef ASSERT
3484   if (klass() != nullptr && klass()->is_loaded()) {
3485     interfaces->verify_is_loaded();
3486   }
3487 #endif
3488   if (Compile::current()->eliminate_boxing() && (t == InstPtr) &&
3489       (offset > 0) && xk && (k != nullptr) && k->is_instance_klass()) {
3490     _is_ptr_to_boxed_value = k->as_instance_klass()->is_boxed_value_offset(offset);
3491   }
3492 #ifdef _LP64
3493   if (_offset > 0 || _offset == Type::OffsetTop || _offset == Type::OffsetBot) {
3494     if (_offset == oopDesc::klass_offset_in_bytes()) {
3495       _is_ptr_to_narrowklass = true;
3496     } else if (klass() == nullptr) {
3497       // Array with unknown body type
3498       assert(this->isa_aryptr(), "only arrays without klass");
3499       _is_ptr_to_narrowoop = UseCompressedOops;
3500     } else if (this->isa_aryptr()) {
3501       _is_ptr_to_narrowoop = (UseCompressedOops && klass()->is_obj_array_klass() &&
3502                              _offset != arrayOopDesc::length_offset_in_bytes());
3503     } else if (klass()->is_instance_klass()) {
3504       ciInstanceKlass* ik = klass()->as_instance_klass();
3505       if (this->isa_klassptr()) {
3506         // Perm objects don't use compressed references
3507       } else if (_offset == OffsetBot || _offset == OffsetTop) {
3508         // unsafe access
3509         _is_ptr_to_narrowoop = UseCompressedOops;
3510       } else {
3511         assert(this->isa_instptr(), "must be an instance ptr.");
3512 
3513         if (klass() == ciEnv::current()->Class_klass() &&
3514             (_offset == java_lang_Class::klass_offset() ||
3515              _offset == java_lang_Class::array_klass_offset())) {
3516           // Special hidden fields from the Class.
3517           assert(this->isa_instptr(), "must be an instance ptr.");
3518           _is_ptr_to_narrowoop = false;
3519         } else if (klass() == ciEnv::current()->Class_klass() &&
3520                    _offset >= InstanceMirrorKlass::offset_of_static_fields()) {
3521           // Static fields
3522           BasicType basic_elem_type = T_ILLEGAL;
3523           if (const_oop() != nullptr) {
3524             ciInstanceKlass* k = const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass();
3525             basic_elem_type = k->get_field_type_by_offset(_offset, true);
3526           }
3527           if (basic_elem_type != T_ILLEGAL) {
3528             _is_ptr_to_narrowoop = UseCompressedOops && ::is_reference_type(basic_elem_type);
3529           } else {
3530             // unsafe access
3531             _is_ptr_to_narrowoop = UseCompressedOops;
3532           }
3533         } else {
3534           // Instance fields which contains a compressed oop references.
3535           BasicType basic_elem_type = ik->get_field_type_by_offset(_offset, false);
3536           if (basic_elem_type != T_ILLEGAL) {
3537             _is_ptr_to_narrowoop = UseCompressedOops && ::is_reference_type(basic_elem_type);
3538           } else if (klass()->equals(ciEnv::current()->Object_klass())) {
3539             // Compile::find_alias_type() cast exactness on all types to verify
3540             // that it does not affect alias type.
3541             _is_ptr_to_narrowoop = UseCompressedOops;
3542           } else {
3543             // Type for the copy start in LibraryCallKit::inline_native_clone().
3544             _is_ptr_to_narrowoop = UseCompressedOops;
3545           }
3546         }
3547       }
3548     }
3549   }
3550 #endif
3551 }
3552 
3553 //------------------------------make-------------------------------------------
3554 const TypeOopPtr *TypeOopPtr::make(PTR ptr, int offset, int instance_id,
3555                                      const TypePtr* speculative, int inline_depth) {
3556   assert(ptr != Constant, "no constant generic pointers");
3557   ciKlass*  k = Compile::current()->env()->Object_klass();
3558   bool      xk = false;
3559   ciObject* o = nullptr;
3560   const TypeInterfaces* interfaces = TypeInterfaces::make();
3561   return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, interfaces, xk, o, offset, instance_id, speculative, inline_depth))->hashcons();
3562 }
3563 
3564 
3565 //------------------------------cast_to_ptr_type-------------------------------
3566 const TypeOopPtr* TypeOopPtr::cast_to_ptr_type(PTR ptr) const {
3567   assert(_base == OopPtr, "subclass must override cast_to_ptr_type");
3568   if( ptr == _ptr ) return this;
3569   return make(ptr, _offset, _instance_id, _speculative, _inline_depth);
3570 }
3571 
3572 //-----------------------------cast_to_instance_id----------------------------
3573 const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const {
3574   // There are no instances of a general oop.
3575   // Return self unchanged.
3576   return this;
3577 }
3578 
3579 //-----------------------------cast_to_exactness-------------------------------
3580 const TypeOopPtr* TypeOopPtr::cast_to_exactness(bool klass_is_exact) const {
3581   // There is no such thing as an exact general oop.
3582   // Return self unchanged.
3583   return this;
3584 }
3585 
3586 
3587 //------------------------------as_klass_type----------------------------------
3588 // Return the klass type corresponding to this instance or array type.
3589 // It is the type that is loaded from an object of this type.
3590 const TypeKlassPtr* TypeOopPtr::as_klass_type(bool try_for_exact) const {
3591   ShouldNotReachHere();
3592   return nullptr;
3593 }
3594 
3595 //------------------------------meet-------------------------------------------
3596 // Compute the MEET of two types.  It returns a new Type object.
3597 const Type *TypeOopPtr::xmeet_helper(const Type *t) const {
3598   // Perform a fast test for common case; meeting the same types together.
3599   if( this == t ) return this;  // Meeting same type-rep?
3600 
3601   // Current "this->_base" is OopPtr
3602   switch (t->base()) {          // switch on original type
3603 
3604   case Int:                     // Mixing ints & oops happens when javac
3605   case Long:                    // reuses local variables
3606   case HalfFloatTop:
3607   case HalfFloatCon:
3608   case HalfFloatBot:
3609   case FloatTop:
3610   case FloatCon:
3611   case FloatBot:
3612   case DoubleTop:
3613   case DoubleCon:
3614   case DoubleBot:
3615   case NarrowOop:
3616   case NarrowKlass:
3617   case Bottom:                  // Ye Olde Default
3618     return Type::BOTTOM;
3619   case Top:
3620     return this;
3621 
3622   default:                      // All else is a mistake
3623     typerr(t);
3624 
3625   case RawPtr:
3626   case MetadataPtr:
3627   case KlassPtr:
3628   case InstKlassPtr:
3629   case AryKlassPtr:
3630     return TypePtr::BOTTOM;     // Oop meet raw is not well defined
3631 
3632   case AnyPtr: {
3633     // Found an AnyPtr type vs self-OopPtr type
3634     const TypePtr *tp = t->is_ptr();
3635     int offset = meet_offset(tp->offset());
3636     PTR ptr = meet_ptr(tp->ptr());
3637     const TypePtr* speculative = xmeet_speculative(tp);
3638     int depth = meet_inline_depth(tp->inline_depth());
3639     switch (tp->ptr()) {
3640     case Null:
3641       if (ptr == Null)  return TypePtr::make(AnyPtr, ptr, offset, speculative, depth);
3642       // else fall through:
3643     case TopPTR:
3644     case AnyNull: {
3645       int instance_id = meet_instance_id(InstanceTop);
3646       return make(ptr, offset, instance_id, speculative, depth);
3647     }
3648     case BotPTR:
3649     case NotNull:
3650       return TypePtr::make(AnyPtr, ptr, offset, speculative, depth);
3651     default: typerr(t);
3652     }
3653   }
3654 
3655   case OopPtr: {                 // Meeting to other OopPtrs
3656     const TypeOopPtr *tp = t->is_oopptr();
3657     int instance_id = meet_instance_id(tp->instance_id());
3658     const TypePtr* speculative = xmeet_speculative(tp);
3659     int depth = meet_inline_depth(tp->inline_depth());
3660     return make(meet_ptr(tp->ptr()), meet_offset(tp->offset()), instance_id, speculative, depth);
3661   }
3662 
3663   case InstPtr:                  // For these, flip the call around to cut down
3664   case AryPtr:
3665     return t->xmeet(this);      // Call in reverse direction
3666 
3667   } // End of switch
3668   return this;                  // Return the double constant
3669 }
3670 
3671 
3672 //------------------------------xdual------------------------------------------
3673 // Dual of a pure heap pointer.  No relevant klass or oop information.
3674 const Type *TypeOopPtr::xdual() const {
3675   assert(klass() == Compile::current()->env()->Object_klass(), "no klasses here");
3676   assert(const_oop() == nullptr,             "no constants here");
3677   return new TypeOopPtr(_base, dual_ptr(), klass(), _interfaces, klass_is_exact(), const_oop(), dual_offset(), dual_instance_id(), dual_speculative(), dual_inline_depth());
3678 }
3679 
3680 //--------------------------make_from_klass_common-----------------------------
3681 // Computes the element-type given a klass.
3682 const TypeOopPtr* TypeOopPtr::make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact, InterfaceHandling interface_handling) {
3683   if (klass->is_instance_klass()) {
3684     Compile* C = Compile::current();
3685     Dependencies* deps = C->dependencies();
3686     assert((deps != nullptr) == (C->method() != nullptr && C->method()->code_size() > 0), "sanity");
3687     // Element is an instance
3688     bool klass_is_exact = false;
3689     if (klass->is_loaded()) {
3690       // Try to set klass_is_exact.
3691       ciInstanceKlass* ik = klass->as_instance_klass();
3692       klass_is_exact = ik->is_final();
3693       if (!klass_is_exact && klass_change
3694           && deps != nullptr && UseUniqueSubclasses) {
3695         ciInstanceKlass* sub = ik->unique_concrete_subklass();
3696         if (sub != nullptr) {
3697           deps->assert_abstract_with_unique_concrete_subtype(ik, sub);
3698           klass = ik = sub;
3699           klass_is_exact = sub->is_final();
3700         }
3701       }
3702       if (!klass_is_exact && try_for_exact && deps != nullptr &&
3703           !ik->is_interface() && !ik->has_subklass()) {
3704         // Add a dependence; if concrete subclass added we need to recompile
3705         deps->assert_leaf_type(ik);
3706         klass_is_exact = true;
3707       }
3708     }
3709     const TypeInterfaces* interfaces = TypePtr::interfaces(klass, true, true, false, interface_handling);
3710     return TypeInstPtr::make(TypePtr::BotPTR, klass, interfaces, klass_is_exact, nullptr, 0);
3711   } else if (klass->is_obj_array_klass()) {
3712     // Element is an object array. Recursively call ourself.
3713     ciKlass* eklass = klass->as_obj_array_klass()->element_klass();
3714     const TypeOopPtr *etype = TypeOopPtr::make_from_klass_common(eklass, false, try_for_exact, interface_handling);
3715     bool xk = etype->klass_is_exact();
3716     const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
3717     // We used to pass NotNull in here, asserting that the sub-arrays
3718     // are all not-null.  This is not true in generally, as code can
3719     // slam nulls down in the subarrays.
3720     const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::BotPTR, arr0, nullptr, xk, 0);
3721     return arr;
3722   } else if (klass->is_type_array_klass()) {
3723     // Element is an typeArray
3724     const Type* etype = get_const_basic_type(klass->as_type_array_klass()->element_type());
3725     const TypeAry* arr0 = TypeAry::make(etype, TypeInt::POS);
3726     // We used to pass NotNull in here, asserting that the array pointer
3727     // is not-null. That was not true in general.
3728     const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::BotPTR, arr0, klass, true, 0);
3729     return arr;
3730   } else {
3731     ShouldNotReachHere();
3732     return nullptr;
3733   }
3734 }
3735 
3736 //------------------------------make_from_constant-----------------------------
3737 // Make a java pointer from an oop constant
3738 const TypeOopPtr* TypeOopPtr::make_from_constant(ciObject* o, bool require_constant) {
3739   assert(!o->is_null_object(), "null object not yet handled here.");
3740 
3741   const bool make_constant = require_constant || o->should_be_constant();
3742 
3743   ciKlass* klass = o->klass();
3744   if (klass->is_instance_klass()) {
3745     // Element is an instance
3746     if (make_constant) {
3747       return TypeInstPtr::make(o);
3748     } else {
3749       return TypeInstPtr::make(TypePtr::NotNull, klass, true, nullptr, 0);
3750     }
3751   } else if (klass->is_obj_array_klass()) {
3752     // Element is an object array. Recursively call ourself.
3753     const TypeOopPtr *etype =
3754       TypeOopPtr::make_from_klass_raw(klass->as_obj_array_klass()->element_klass(), trust_interfaces);
3755     const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length()));
3756     // We used to pass NotNull in here, asserting that the sub-arrays
3757     // are all not-null.  This is not true in generally, as code can
3758     // slam nulls down in the subarrays.
3759     if (make_constant) {
3760       return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
3761     } else {
3762       return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0);
3763     }
3764   } else if (klass->is_type_array_klass()) {
3765     // Element is an typeArray
3766     const Type* etype =
3767       (Type*)get_const_basic_type(klass->as_type_array_klass()->element_type());
3768     const TypeAry* arr0 = TypeAry::make(etype, TypeInt::make(o->as_array()->length()));
3769     // We used to pass NotNull in here, asserting that the array pointer
3770     // is not-null. That was not true in general.
3771     if (make_constant) {
3772       return TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0);
3773     } else {
3774       return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0);
3775     }
3776   }
3777 
3778   fatal("unhandled object type");
3779   return nullptr;
3780 }
3781 
3782 //------------------------------get_con----------------------------------------
3783 intptr_t TypeOopPtr::get_con() const {
3784   assert( _ptr == Null || _ptr == Constant, "" );
3785   assert( _offset >= 0, "" );
3786 
3787   if (_offset != 0) {
3788     // After being ported to the compiler interface, the compiler no longer
3789     // directly manipulates the addresses of oops.  Rather, it only has a pointer
3790     // to a handle at compile time.  This handle is embedded in the generated
3791     // code and dereferenced at the time the nmethod is made.  Until that time,
3792     // it is not reasonable to do arithmetic with the addresses of oops (we don't
3793     // have access to the addresses!).  This does not seem to currently happen,
3794     // but this assertion here is to help prevent its occurrence.
3795     tty->print_cr("Found oop constant with non-zero offset");
3796     ShouldNotReachHere();
3797   }
3798 
3799   return (intptr_t)const_oop()->constant_encoding();
3800 }
3801 
3802 
3803 //-----------------------------filter------------------------------------------
3804 // Do not allow interface-vs.-noninterface joins to collapse to top.
3805 const Type *TypeOopPtr::filter_helper(const Type *kills, bool include_speculative) const {
3806 
3807   const Type* ft = join_helper(kills, include_speculative);
3808 
3809   if (ft->empty()) {
3810     return Type::TOP;           // Canonical empty value
3811   }
3812 
3813   return ft;
3814 }
3815 
3816 //------------------------------eq---------------------------------------------
3817 // Structural equality check for Type representations
3818 bool TypeOopPtr::eq( const Type *t ) const {
3819   const TypeOopPtr *a = (const TypeOopPtr*)t;
3820   if (_klass_is_exact != a->_klass_is_exact ||
3821       _instance_id != a->_instance_id)  return false;
3822   ciObject* one = const_oop();
3823   ciObject* two = a->const_oop();
3824   if (one == nullptr || two == nullptr) {
3825     return (one == two) && TypePtr::eq(t);
3826   } else {
3827     return one->equals(two) && TypePtr::eq(t);
3828   }
3829 }
3830 
3831 //------------------------------hash-------------------------------------------
3832 // Type-specific hashing function.
3833 uint TypeOopPtr::hash(void) const {
3834   return
3835     (uint)(const_oop() ? const_oop()->hash() : 0) +
3836     (uint)_klass_is_exact +
3837     (uint)_instance_id + TypePtr::hash();
3838 }
3839 
3840 //------------------------------dump2------------------------------------------
3841 #ifndef PRODUCT
3842 void TypeOopPtr::dump2(Dict& d, uint depth, outputStream* st) const {
3843   st->print("oopptr:%s", ptr_msg[_ptr]);
3844   if (_klass_is_exact) {
3845     st->print(":exact");
3846   }
3847   if (const_oop() != nullptr) {
3848     st->print(":" INTPTR_FORMAT, p2i(const_oop()));
3849   }
3850   dump_offset(st);
3851   dump_instance_id(st);
3852   dump_inline_depth(st);
3853   dump_speculative(st);
3854 }
3855 
3856 void TypeOopPtr::dump_instance_id(outputStream* st) const {
3857   if (_instance_id == InstanceTop) {
3858     st->print(",iid=top");
3859   } else if (_instance_id == InstanceBot) {
3860     st->print(",iid=bot");
3861   } else {
3862     st->print(",iid=%d", _instance_id);
3863   }
3864 }
3865 #endif
3866 
3867 //------------------------------singleton--------------------------------------
3868 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
3869 // constants
3870 bool TypeOopPtr::singleton(void) const {
3871   // detune optimizer to not generate constant oop + constant offset as a constant!
3872   // TopPTR, Null, AnyNull, Constant are all singletons
3873   return (_offset == 0) && !below_centerline(_ptr);
3874 }
3875 
3876 //------------------------------add_offset-------------------------------------
3877 const TypePtr* TypeOopPtr::add_offset(intptr_t offset) const {
3878   return make(_ptr, xadd_offset(offset), _instance_id, add_offset_speculative(offset), _inline_depth);
3879 }
3880 
3881 const TypeOopPtr* TypeOopPtr::with_offset(intptr_t offset) const {
3882   return make(_ptr, offset, _instance_id, with_offset_speculative(offset), _inline_depth);
3883 }
3884 
3885 /**
3886  * Return same type without a speculative part
3887  */
3888 const TypeOopPtr* TypeOopPtr::remove_speculative() const {
3889   if (_speculative == nullptr) {
3890     return this;
3891   }
3892   assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth");
3893   return make(_ptr, _offset, _instance_id, nullptr, _inline_depth);
3894 }
3895 
3896 /**
3897  * Return same type but drop speculative part if we know we won't use
3898  * it
3899  */
3900 const Type* TypeOopPtr::cleanup_speculative() const {
3901   // If the klass is exact and the ptr is not null then there's
3902   // nothing that the speculative type can help us with
3903   if (klass_is_exact() && !maybe_null()) {
3904     return remove_speculative();
3905   }
3906   return TypePtr::cleanup_speculative();
3907 }
3908 
3909 /**
3910  * Return same type but with a different inline depth (used for speculation)
3911  *
3912  * @param depth  depth to meet with
3913  */
3914 const TypePtr* TypeOopPtr::with_inline_depth(int depth) const {
3915   if (!UseInlineDepthForSpeculativeTypes) {
3916     return this;
3917   }
3918   return make(_ptr, _offset, _instance_id, _speculative, depth);
3919 }
3920 
3921 //------------------------------with_instance_id--------------------------------
3922 const TypePtr* TypeOopPtr::with_instance_id(int instance_id) const {
3923   assert(_instance_id != -1, "should be known");
3924   return make(_ptr, _offset, instance_id, _speculative, _inline_depth);
3925 }
3926 
3927 //------------------------------meet_instance_id--------------------------------
3928 int TypeOopPtr::meet_instance_id( int instance_id ) const {
3929   // Either is 'TOP' instance?  Return the other instance!
3930   if( _instance_id == InstanceTop ) return  instance_id;
3931   if(  instance_id == InstanceTop ) return _instance_id;
3932   // If either is different, return 'BOTTOM' instance
3933   if( _instance_id != instance_id ) return InstanceBot;
3934   return _instance_id;
3935 }
3936 
3937 //------------------------------dual_instance_id--------------------------------
3938 int TypeOopPtr::dual_instance_id( ) const {
3939   if( _instance_id == InstanceTop ) return InstanceBot; // Map TOP into BOTTOM
3940   if( _instance_id == InstanceBot ) return InstanceTop; // Map BOTTOM into TOP
3941   return _instance_id;              // Map everything else into self
3942 }
3943 
3944 
3945 const TypeInterfaces* TypeOopPtr::meet_interfaces(const TypeOopPtr* other) const {
3946   if (above_centerline(_ptr) && above_centerline(other->_ptr)) {
3947     return _interfaces->union_with(other->_interfaces);
3948   } else if (above_centerline(_ptr) && !above_centerline(other->_ptr)) {
3949     return other->_interfaces;
3950   } else if (above_centerline(other->_ptr) && !above_centerline(_ptr)) {
3951     return _interfaces;
3952   }
3953   return _interfaces->intersection_with(other->_interfaces);
3954 }
3955 
3956 /**
3957  * Check whether new profiling would improve speculative type
3958  *
3959  * @param   exact_kls    class from profiling
3960  * @param   inline_depth inlining depth of profile point
3961  *
3962  * @return  true if type profile is valuable
3963  */
3964 bool TypeOopPtr::would_improve_type(ciKlass* exact_kls, int inline_depth) const {
3965   // no way to improve an already exact type
3966   if (klass_is_exact()) {
3967     return false;
3968   }
3969   return TypePtr::would_improve_type(exact_kls, inline_depth);
3970 }
3971 
3972 //=============================================================================
3973 // Convenience common pre-built types.
3974 const TypeInstPtr *TypeInstPtr::NOTNULL;
3975 const TypeInstPtr *TypeInstPtr::BOTTOM;
3976 const TypeInstPtr *TypeInstPtr::MIRROR;
3977 const TypeInstPtr *TypeInstPtr::MARK;
3978 const TypeInstPtr *TypeInstPtr::KLASS;
3979 
3980 // Is there a single ciKlass* that can represent that type?
3981 ciKlass* TypeInstPtr::exact_klass_helper() const {
3982   if (_interfaces->empty()) {
3983     return _klass;
3984   }
3985   if (_klass != ciEnv::current()->Object_klass()) {
3986     if (_interfaces->eq(_klass->as_instance_klass())) {
3987       return _klass;
3988     }
3989     return nullptr;
3990   }
3991   return _interfaces->exact_klass();
3992 }
3993 
3994 //------------------------------TypeInstPtr-------------------------------------
3995 TypeInstPtr::TypeInstPtr(PTR ptr, ciKlass* k, const TypeInterfaces* interfaces, bool xk, ciObject* o, int off,
3996                          int instance_id, const TypePtr* speculative, int inline_depth)
3997   : TypeOopPtr(InstPtr, ptr, k, interfaces, xk, o, off, instance_id, speculative, inline_depth) {
3998   assert(k == nullptr || !k->is_loaded() || !k->is_interface(), "no interface here");
3999   assert(k != nullptr &&
4000          (k->is_loaded() || o == nullptr),
4001          "cannot have constants with non-loaded klass");
4002 };
4003 
4004 //------------------------------make-------------------------------------------
4005 const TypeInstPtr *TypeInstPtr::make(PTR ptr,
4006                                      ciKlass* k,
4007                                      const TypeInterfaces* interfaces,
4008                                      bool xk,
4009                                      ciObject* o,
4010                                      int offset,
4011                                      int instance_id,
4012                                      const TypePtr* speculative,
4013                                      int inline_depth) {
4014   assert( !k->is_loaded() || k->is_instance_klass(), "Must be for instance");
4015   // Either const_oop() is null or else ptr is Constant
4016   assert( (!o && ptr != Constant) || (o && ptr == Constant),
4017           "constant pointers must have a value supplied" );
4018   // Ptr is never Null
4019   assert( ptr != Null, "null pointers are not typed" );
4020 
4021   assert(instance_id <= 0 || xk, "instances are always exactly typed");
4022   if (ptr == Constant) {
4023     // Note:  This case includes meta-object constants, such as methods.
4024     xk = true;
4025   } else if (k->is_loaded()) {
4026     ciInstanceKlass* ik = k->as_instance_klass();
4027     if (!xk && ik->is_final())     xk = true;   // no inexact final klass
4028     assert(!ik->is_interface(), "no interface here");
4029     if (xk && ik->is_interface())  xk = false;  // no exact interface
4030   }
4031 
4032   // Now hash this baby
4033   TypeInstPtr *result =
4034     (TypeInstPtr*)(new TypeInstPtr(ptr, k, interfaces, xk, o ,offset, instance_id, speculative, inline_depth))->hashcons();
4035 
4036   return result;
4037 }
4038 
4039 const TypeInterfaces* TypePtr::interfaces(ciKlass*& k, bool klass, bool interface, bool array, InterfaceHandling interface_handling) {
4040   if (k->is_instance_klass()) {
4041     if (k->is_loaded()) {
4042       if (k->is_interface() && interface_handling == ignore_interfaces) {
4043         assert(interface, "no interface expected");
4044         k = ciEnv::current()->Object_klass();
4045         const TypeInterfaces* interfaces = TypeInterfaces::make();
4046         return interfaces;
4047       }
4048       GrowableArray<ciInstanceKlass *>* k_interfaces = k->as_instance_klass()->transitive_interfaces();
4049       const TypeInterfaces* interfaces = TypeInterfaces::make(k_interfaces);
4050       if (k->is_interface()) {
4051         assert(interface, "no interface expected");
4052         k = ciEnv::current()->Object_klass();
4053       } else {
4054         assert(klass, "no instance klass expected");
4055       }
4056       return interfaces;
4057     }
4058     const TypeInterfaces* interfaces = TypeInterfaces::make();
4059     return interfaces;
4060   }
4061   assert(array, "no array expected");
4062   assert(k->is_array_klass(), "Not an array?");
4063   ciType* e = k->as_array_klass()->base_element_type();
4064   if (e->is_loaded() && e->is_instance_klass() && e->as_instance_klass()->is_interface()) {
4065     if (interface_handling == ignore_interfaces) {
4066       k = ciObjArrayKlass::make(ciEnv::current()->Object_klass(), k->as_array_klass()->dimension());
4067     }
4068   }
4069   return TypeAryPtr::_array_interfaces;
4070 }
4071 
4072 //------------------------------cast_to_ptr_type-------------------------------
4073 const TypeInstPtr* TypeInstPtr::cast_to_ptr_type(PTR ptr) const {
4074   if( ptr == _ptr ) return this;
4075   // Reconstruct _sig info here since not a problem with later lazy
4076   // construction, _sig will show up on demand.
4077   return make(ptr, klass(), _interfaces, klass_is_exact(), ptr == Constant ? const_oop() : nullptr, _offset, _instance_id, _speculative, _inline_depth);
4078 }
4079 
4080 
4081 //-----------------------------cast_to_exactness-------------------------------
4082 const TypeInstPtr* TypeInstPtr::cast_to_exactness(bool klass_is_exact) const {
4083   if( klass_is_exact == _klass_is_exact ) return this;
4084   if (!_klass->is_loaded())  return this;
4085   ciInstanceKlass* ik = _klass->as_instance_klass();
4086   if( (ik->is_final() || _const_oop) )  return this;  // cannot clear xk
4087   assert(!ik->is_interface(), "no interface here");
4088   return make(ptr(), klass(), _interfaces, klass_is_exact, const_oop(), _offset, _instance_id, _speculative, _inline_depth);
4089 }
4090 
4091 //-----------------------------cast_to_instance_id----------------------------
4092 const TypeInstPtr* TypeInstPtr::cast_to_instance_id(int instance_id) const {
4093   if( instance_id == _instance_id ) return this;
4094   return make(_ptr, klass(),  _interfaces, _klass_is_exact, const_oop(), _offset, instance_id, _speculative, _inline_depth);
4095 }
4096 
4097 //------------------------------xmeet_unloaded---------------------------------
4098 // Compute the MEET of two InstPtrs when at least one is unloaded.
4099 // Assume classes are different since called after check for same name/class-loader
4100 const TypeInstPtr *TypeInstPtr::xmeet_unloaded(const TypeInstPtr *tinst, const TypeInterfaces* interfaces) const {
4101   int off = meet_offset(tinst->offset());
4102   PTR ptr = meet_ptr(tinst->ptr());
4103   int instance_id = meet_instance_id(tinst->instance_id());
4104   const TypePtr* speculative = xmeet_speculative(tinst);
4105   int depth = meet_inline_depth(tinst->inline_depth());
4106 
4107   const TypeInstPtr *loaded    = is_loaded() ? this  : tinst;
4108   const TypeInstPtr *unloaded  = is_loaded() ? tinst : this;
4109   if( loaded->klass()->equals(ciEnv::current()->Object_klass()) ) {
4110     //
4111     // Meet unloaded class with java/lang/Object
4112     //
4113     // Meet
4114     //          |                     Unloaded Class
4115     //  Object  |   TOP    |   AnyNull | Constant |   NotNull |  BOTTOM   |
4116     //  ===================================================================
4117     //   TOP    | ..........................Unloaded......................|
4118     //  AnyNull |  U-AN    |................Unloaded......................|
4119     // Constant | ... O-NN .................................. |   O-BOT   |
4120     //  NotNull | ... O-NN .................................. |   O-BOT   |
4121     //  BOTTOM  | ........................Object-BOTTOM ..................|
4122     //
4123     assert(loaded->ptr() != TypePtr::Null, "insanity check");
4124     //
4125     if (loaded->ptr() == TypePtr::TopPTR)        { return unloaded->with_speculative(speculative); }
4126     else if (loaded->ptr() == TypePtr::AnyNull)  { return make(ptr, unloaded->klass(), interfaces, false, nullptr, off, instance_id, speculative, depth); }
4127     else if (loaded->ptr() == TypePtr::BotPTR)   { return TypeInstPtr::BOTTOM->with_speculative(speculative); }
4128     else if (loaded->ptr() == TypePtr::Constant || loaded->ptr() == TypePtr::NotNull) {
4129       if (unloaded->ptr() == TypePtr::BotPTR)    { return TypeInstPtr::BOTTOM->with_speculative(speculative);  }
4130       else                                       { return TypeInstPtr::NOTNULL->with_speculative(speculative); }
4131     }
4132     else if (unloaded->ptr() == TypePtr::TopPTR) { return unloaded->with_speculative(speculative); }
4133 
4134     return unloaded->cast_to_ptr_type(TypePtr::AnyNull)->is_instptr()->with_speculative(speculative);
4135   }
4136 
4137   // Both are unloaded, not the same class, not Object
4138   // Or meet unloaded with a different loaded class, not java/lang/Object
4139   if (ptr != TypePtr::BotPTR) {
4140     return TypeInstPtr::NOTNULL->with_speculative(speculative);
4141   }
4142   return TypeInstPtr::BOTTOM->with_speculative(speculative);
4143 }
4144 
4145 
4146 //------------------------------meet-------------------------------------------
4147 // Compute the MEET of two types.  It returns a new Type object.
4148 const Type *TypeInstPtr::xmeet_helper(const Type *t) const {
4149   // Perform a fast test for common case; meeting the same types together.
4150   if( this == t ) return this;  // Meeting same type-rep?
4151 
4152   // Current "this->_base" is Pointer
4153   switch (t->base()) {          // switch on original type
4154 
4155   case Int:                     // Mixing ints & oops happens when javac
4156   case Long:                    // reuses local variables
4157   case HalfFloatTop:
4158   case HalfFloatCon:
4159   case HalfFloatBot:
4160   case FloatTop:
4161   case FloatCon:
4162   case FloatBot:
4163   case DoubleTop:
4164   case DoubleCon:
4165   case DoubleBot:
4166   case NarrowOop:
4167   case NarrowKlass:
4168   case Bottom:                  // Ye Olde Default
4169     return Type::BOTTOM;
4170   case Top:
4171     return this;
4172 
4173   default:                      // All else is a mistake
4174     typerr(t);
4175 
4176   case MetadataPtr:
4177   case KlassPtr:
4178   case InstKlassPtr:
4179   case AryKlassPtr:
4180   case RawPtr: return TypePtr::BOTTOM;
4181 
4182   case AryPtr: {                // All arrays inherit from Object class
4183     // Call in reverse direction to avoid duplication
4184     return t->is_aryptr()->xmeet_helper(this);
4185   }
4186 
4187   case OopPtr: {                // Meeting to OopPtrs
4188     // Found a OopPtr type vs self-InstPtr type
4189     const TypeOopPtr *tp = t->is_oopptr();
4190     int offset = meet_offset(tp->offset());
4191     PTR ptr = meet_ptr(tp->ptr());
4192     switch (tp->ptr()) {
4193     case TopPTR:
4194     case AnyNull: {
4195       int instance_id = meet_instance_id(InstanceTop);
4196       const TypePtr* speculative = xmeet_speculative(tp);
4197       int depth = meet_inline_depth(tp->inline_depth());
4198       return make(ptr, klass(), _interfaces, klass_is_exact(),
4199                   (ptr == Constant ? const_oop() : nullptr), offset, instance_id, speculative, depth);
4200     }
4201     case NotNull:
4202     case BotPTR: {
4203       int instance_id = meet_instance_id(tp->instance_id());
4204       const TypePtr* speculative = xmeet_speculative(tp);
4205       int depth = meet_inline_depth(tp->inline_depth());
4206       return TypeOopPtr::make(ptr, offset, instance_id, speculative, depth);
4207     }
4208     default: typerr(t);
4209     }
4210   }
4211 
4212   case AnyPtr: {                // Meeting to AnyPtrs
4213     // Found an AnyPtr type vs self-InstPtr type
4214     const TypePtr *tp = t->is_ptr();
4215     int offset = meet_offset(tp->offset());
4216     PTR ptr = meet_ptr(tp->ptr());
4217     int instance_id = meet_instance_id(InstanceTop);
4218     const TypePtr* speculative = xmeet_speculative(tp);
4219     int depth = meet_inline_depth(tp->inline_depth());
4220     switch (tp->ptr()) {
4221     case Null:
4222       if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset, speculative, depth);
4223       // else fall through to AnyNull
4224     case TopPTR:
4225     case AnyNull: {
4226       return make(ptr, klass(), _interfaces, klass_is_exact(),
4227                   (ptr == Constant ? const_oop() : nullptr), offset, instance_id, speculative, depth);
4228     }
4229     case NotNull:
4230     case BotPTR:
4231       return TypePtr::make(AnyPtr, ptr, offset, speculative,depth);
4232     default: typerr(t);
4233     }
4234   }
4235 
4236   /*
4237                  A-top         }
4238                /   |   \       }  Tops
4239            B-top A-any C-top   }
4240               | /  |  \ |      }  Any-nulls
4241            B-any   |   C-any   }
4242               |    |    |
4243            B-con A-con C-con   } constants; not comparable across classes
4244               |    |    |
4245            B-not   |   C-not   }
4246               | \  |  / |      }  not-nulls
4247            B-bot A-not C-bot   }
4248                \   |   /       }  Bottoms
4249                  A-bot         }
4250   */
4251 
4252   case InstPtr: {                // Meeting 2 Oops?
4253     // Found an InstPtr sub-type vs self-InstPtr type
4254     const TypeInstPtr *tinst = t->is_instptr();
4255     int off = meet_offset(tinst->offset());
4256     PTR ptr = meet_ptr(tinst->ptr());
4257     int instance_id = meet_instance_id(tinst->instance_id());
4258     const TypePtr* speculative = xmeet_speculative(tinst);
4259     int depth = meet_inline_depth(tinst->inline_depth());
4260     const TypeInterfaces* interfaces = meet_interfaces(tinst);
4261 
4262     ciKlass* tinst_klass = tinst->klass();
4263     ciKlass* this_klass  = klass();
4264 
4265     ciKlass* res_klass = nullptr;
4266     bool res_xk = false;
4267     const Type* res;
4268     MeetResult kind = meet_instptr(ptr, interfaces, this, tinst, res_klass, res_xk);
4269 
4270     if (kind == UNLOADED) {
4271       // One of these classes has not been loaded
4272       const TypeInstPtr* unloaded_meet = xmeet_unloaded(tinst, interfaces);
4273 #ifndef PRODUCT
4274       if (PrintOpto && Verbose) {
4275         tty->print("meet of unloaded classes resulted in: ");
4276         unloaded_meet->dump();
4277         tty->cr();
4278         tty->print("  this == ");
4279         dump();
4280         tty->cr();
4281         tty->print(" tinst == ");
4282         tinst->dump();
4283         tty->cr();
4284       }
4285 #endif
4286       res = unloaded_meet;
4287     } else {
4288       if (kind == NOT_SUBTYPE && instance_id > 0) {
4289         instance_id = InstanceBot;
4290       } else if (kind == LCA) {
4291         instance_id = InstanceBot;
4292       }
4293       ciObject* o = nullptr;             // Assume not constant when done
4294       ciObject* this_oop = const_oop();
4295       ciObject* tinst_oop = tinst->const_oop();
4296       if (ptr == Constant) {
4297         if (this_oop != nullptr && tinst_oop != nullptr &&
4298             this_oop->equals(tinst_oop))
4299           o = this_oop;
4300         else if (above_centerline(_ptr)) {
4301           assert(!tinst_klass->is_interface(), "");
4302           o = tinst_oop;
4303         } else if (above_centerline(tinst->_ptr)) {
4304           assert(!this_klass->is_interface(), "");
4305           o = this_oop;
4306         } else
4307           ptr = NotNull;
4308       }
4309       res = make(ptr, res_klass, interfaces, res_xk, o, off, instance_id, speculative, depth);
4310     }
4311 
4312     return res;
4313 
4314   } // End of case InstPtr
4315 
4316   } // End of switch
4317   return this;                  // Return the double constant
4318 }
4319 
4320 template<class T> TypePtr::MeetResult TypePtr::meet_instptr(PTR& ptr, const TypeInterfaces*& interfaces, const T* this_type, const T* other_type,
4321                                                             ciKlass*& res_klass, bool& res_xk) {
4322   ciKlass* this_klass = this_type->klass();
4323   ciKlass* other_klass = other_type->klass();
4324   bool this_xk = this_type->klass_is_exact();
4325   bool other_xk = other_type->klass_is_exact();
4326   PTR this_ptr = this_type->ptr();
4327   PTR other_ptr = other_type->ptr();
4328   const TypeInterfaces* this_interfaces = this_type->interfaces();
4329   const TypeInterfaces* other_interfaces = other_type->interfaces();
4330   // Check for easy case; klasses are equal (and perhaps not loaded!)
4331   // If we have constants, then we created oops so classes are loaded
4332   // and we can handle the constants further down.  This case handles
4333   // both-not-loaded or both-loaded classes
4334   if (ptr != Constant && this_klass->equals(other_klass) && this_xk == other_xk) {
4335     res_klass = this_klass;
4336     res_xk = this_xk;
4337     return QUICK;
4338   }
4339 
4340   // Classes require inspection in the Java klass hierarchy.  Must be loaded.
4341   if (!other_klass->is_loaded() || !this_klass->is_loaded()) {
4342     return UNLOADED;
4343   }
4344 
4345   // !!! Here's how the symmetry requirement breaks down into invariants:
4346   // If we split one up & one down AND they subtype, take the down man.
4347   // If we split one up & one down AND they do NOT subtype, "fall hard".
4348   // If both are up and they subtype, take the subtype class.
4349   // If both are up and they do NOT subtype, "fall hard".
4350   // If both are down and they subtype, take the supertype class.
4351   // If both are down and they do NOT subtype, "fall hard".
4352   // Constants treated as down.
4353 
4354   // Now, reorder the above list; observe that both-down+subtype is also
4355   // "fall hard"; "fall hard" becomes the default case:
4356   // If we split one up & one down AND they subtype, take the down man.
4357   // If both are up and they subtype, take the subtype class.
4358 
4359   // If both are down and they subtype, "fall hard".
4360   // If both are down and they do NOT subtype, "fall hard".
4361   // If both are up and they do NOT subtype, "fall hard".
4362   // If we split one up & one down AND they do NOT subtype, "fall hard".
4363 
4364   // If a proper subtype is exact, and we return it, we return it exactly.
4365   // If a proper supertype is exact, there can be no subtyping relationship!
4366   // If both types are equal to the subtype, exactness is and-ed below the
4367   // centerline and or-ed above it.  (N.B. Constants are always exact.)
4368 
4369   // Check for subtyping:
4370   const T* subtype = nullptr;
4371   bool subtype_exact = false;
4372   if (this_type->is_same_java_type_as(other_type)) {
4373     subtype = this_type;
4374     subtype_exact = below_centerline(ptr) ? (this_xk && other_xk) : (this_xk || other_xk);
4375   } else if (!other_xk && this_type->is_meet_subtype_of(other_type)) {
4376     subtype = this_type;     // Pick subtyping class
4377     subtype_exact = this_xk;
4378   } else if(!this_xk && other_type->is_meet_subtype_of(this_type)) {
4379     subtype = other_type;    // Pick subtyping class
4380     subtype_exact = other_xk;
4381   }
4382 
4383   if (subtype) {
4384     if (above_centerline(ptr)) { // both are up?
4385       this_type = other_type = subtype;
4386       this_xk = other_xk = subtype_exact;
4387     } else if (above_centerline(this_ptr) && !above_centerline(other_ptr)) {
4388       this_type = other_type; // tinst is down; keep down man
4389       this_xk = other_xk;
4390     } else if (above_centerline(other_ptr) && !above_centerline(this_ptr)) {
4391       other_type = this_type; // this is down; keep down man
4392       other_xk = this_xk;
4393     } else {
4394       this_xk = subtype_exact;  // either they are equal, or we'll do an LCA
4395     }
4396   }
4397 
4398   // Check for classes now being equal
4399   if (this_type->is_same_java_type_as(other_type)) {
4400     // If the klasses are equal, the constants may still differ.  Fall to
4401     // NotNull if they do (neither constant is null; that is a special case
4402     // handled elsewhere).
4403     res_klass = this_type->klass();
4404     res_xk = this_xk;
4405     return SUBTYPE;
4406   } // Else classes are not equal
4407 
4408   // Since klasses are different, we require a LCA in the Java
4409   // class hierarchy - which means we have to fall to at least NotNull.
4410   if (ptr == TopPTR || ptr == AnyNull || ptr == Constant) {
4411     ptr = NotNull;
4412   }
4413 
4414   interfaces = this_interfaces->intersection_with(other_interfaces);
4415 
4416   // Now we find the LCA of Java classes
4417   ciKlass* k = this_klass->least_common_ancestor(other_klass);
4418 
4419   res_klass = k;
4420   res_xk = false;
4421 
4422   return LCA;
4423 }
4424 
4425 //------------------------java_mirror_type--------------------------------------
4426 ciType* TypeInstPtr::java_mirror_type() const {
4427   // must be a singleton type
4428   if( const_oop() == nullptr )  return nullptr;
4429 
4430   // must be of type java.lang.Class
4431   if( klass() != ciEnv::current()->Class_klass() )  return nullptr;
4432 
4433   return const_oop()->as_instance()->java_mirror_type();
4434 }
4435 
4436 
4437 //------------------------------xdual------------------------------------------
4438 // Dual: do NOT dual on klasses.  This means I do NOT understand the Java
4439 // inheritance mechanism.
4440 const Type *TypeInstPtr::xdual() const {
4441   return new TypeInstPtr(dual_ptr(), klass(), _interfaces, klass_is_exact(), const_oop(), dual_offset(), dual_instance_id(), dual_speculative(), dual_inline_depth());
4442 }
4443 
4444 //------------------------------eq---------------------------------------------
4445 // Structural equality check for Type representations
4446 bool TypeInstPtr::eq( const Type *t ) const {
4447   const TypeInstPtr *p = t->is_instptr();
4448   return
4449     klass()->equals(p->klass()) &&
4450     _interfaces->eq(p->_interfaces) &&
4451     TypeOopPtr::eq(p);          // Check sub-type stuff
4452 }
4453 
4454 //------------------------------hash-------------------------------------------
4455 // Type-specific hashing function.
4456 uint TypeInstPtr::hash(void) const {
4457   return klass()->hash() + TypeOopPtr::hash() + _interfaces->hash();
4458 }
4459 
4460 bool TypeInstPtr::is_java_subtype_of_helper(const TypeOopPtr* other, bool this_exact, bool other_exact) const {
4461   return TypePtr::is_java_subtype_of_helper_for_instance(this, other, this_exact, other_exact);
4462 }
4463 
4464 
4465 bool TypeInstPtr::is_same_java_type_as_helper(const TypeOopPtr* other) const {
4466   return TypePtr::is_same_java_type_as_helper_for_instance(this, other);
4467 }
4468 
4469 bool TypeInstPtr::maybe_java_subtype_of_helper(const TypeOopPtr* other, bool this_exact, bool other_exact) const {
4470   return TypePtr::maybe_java_subtype_of_helper_for_instance(this, other, this_exact, other_exact);
4471 }
4472 
4473 
4474 //------------------------------dump2------------------------------------------
4475 // Dump oop Type
4476 #ifndef PRODUCT
4477 void TypeInstPtr::dump2(Dict &d, uint depth, outputStream* st) const {
4478   // Print the name of the klass.
4479   st->print("instptr:");
4480   klass()->print_name_on(st);
4481   _interfaces->dump(st);
4482 
4483   if (_ptr == Constant && (WizardMode || Verbose)) {
4484     ResourceMark rm;
4485     stringStream ss;
4486 
4487     st->print(" ");
4488     const_oop()->print_oop(&ss);
4489     // 'const_oop->print_oop()' may emit newlines('\n') into ss.
4490     // suppress newlines from it so -XX:+Verbose -XX:+PrintIdeal dumps one-liner for each node.
4491     char* buf = ss.as_string(/* c_heap= */false);
4492     StringUtils::replace_no_expand(buf, "\n", "");
4493     st->print_raw(buf);
4494   }
4495 
4496   st->print(":%s", ptr_msg[_ptr]);
4497   if (_klass_is_exact) {
4498     st->print(":exact");
4499   }
4500 
4501   dump_offset(st);
4502   dump_instance_id(st);
4503   dump_inline_depth(st);
4504   dump_speculative(st);
4505 }
4506 #endif
4507 
4508 //------------------------------add_offset-------------------------------------
4509 const TypePtr* TypeInstPtr::add_offset(intptr_t offset) const {
4510   return make(_ptr, klass(), _interfaces, klass_is_exact(), const_oop(), xadd_offset(offset),
4511               _instance_id, add_offset_speculative(offset), _inline_depth);
4512 }
4513 
4514 const TypeInstPtr* TypeInstPtr::with_offset(intptr_t offset) const {
4515   return make(_ptr, klass(), _interfaces, klass_is_exact(), const_oop(), offset,
4516               _instance_id, with_offset_speculative(offset), _inline_depth);
4517 }
4518 
4519 const TypeInstPtr* TypeInstPtr::remove_speculative() const {
4520   if (_speculative == nullptr) {
4521     return this;
4522   }
4523   assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth");
4524   return make(_ptr, klass(), _interfaces, klass_is_exact(), const_oop(), _offset,
4525               _instance_id, nullptr, _inline_depth);
4526 }
4527 
4528 const TypeInstPtr* TypeInstPtr::with_speculative(const TypePtr* speculative) const {
4529   return make(_ptr, klass(), _interfaces, klass_is_exact(), const_oop(), _offset, _instance_id, speculative, _inline_depth);
4530 }
4531 
4532 const TypePtr* TypeInstPtr::with_inline_depth(int depth) const {
4533   if (!UseInlineDepthForSpeculativeTypes) {
4534     return this;
4535   }
4536   return make(_ptr, klass(), _interfaces, klass_is_exact(), const_oop(), _offset, _instance_id, _speculative, depth);
4537 }
4538 
4539 const TypePtr* TypeInstPtr::with_instance_id(int instance_id) const {
4540   assert(is_known_instance(), "should be known");
4541   return make(_ptr, klass(), _interfaces, klass_is_exact(), const_oop(), _offset, instance_id, _speculative, _inline_depth);
4542 }
4543 
4544 const TypeKlassPtr* TypeInstPtr::as_klass_type(bool try_for_exact) const {
4545   bool xk = klass_is_exact();
4546   ciInstanceKlass* ik = klass()->as_instance_klass();
4547   if (try_for_exact && !xk && !ik->has_subklass() && !ik->is_final()) {
4548     if (_interfaces->eq(ik)) {
4549       Compile* C = Compile::current();
4550       Dependencies* deps = C->dependencies();
4551       deps->assert_leaf_type(ik);
4552       xk = true;
4553     }
4554   }
4555   return TypeInstKlassPtr::make(xk ? TypePtr::Constant : TypePtr::NotNull, klass(), _interfaces, 0);
4556 }
4557 
4558 template <class T1, class T2> bool TypePtr::is_meet_subtype_of_helper_for_instance(const T1* this_one, const T2* other, bool this_xk, bool other_xk) {
4559   static_assert(std::is_base_of<T2, T1>::value, "");
4560 
4561   if (!this_one->is_instance_type(other)) {
4562     return false;
4563   }
4564 
4565   if (other->klass() == ciEnv::current()->Object_klass() && other->_interfaces->empty()) {
4566     return true;
4567   }
4568 
4569   return this_one->klass()->is_subtype_of(other->klass()) &&
4570          (!this_xk || this_one->_interfaces->contains(other->_interfaces));
4571 }
4572 
4573 
4574 bool TypeInstPtr::is_meet_subtype_of_helper(const TypeOopPtr *other, bool this_xk, bool other_xk) const {
4575   return TypePtr::is_meet_subtype_of_helper_for_instance(this, other, this_xk, other_xk);
4576 }
4577 
4578 template <class T1, class T2>  bool TypePtr::is_meet_subtype_of_helper_for_array(const T1* this_one, const T2* other, bool this_xk, bool other_xk) {
4579   static_assert(std::is_base_of<T2, T1>::value, "");
4580   if (other->klass() == ciEnv::current()->Object_klass() && other->_interfaces->empty()) {
4581     return true;
4582   }
4583 
4584   if (this_one->is_instance_type(other)) {
4585     return other->klass() == ciEnv::current()->Object_klass() && this_one->_interfaces->contains(other->_interfaces);
4586   }
4587 
4588   int dummy;
4589   bool this_top_or_bottom = (this_one->base_element_type(dummy) == Type::TOP || this_one->base_element_type(dummy) == Type::BOTTOM);
4590   if (this_top_or_bottom) {
4591     return false;
4592   }
4593 
4594   const T1* other_ary = this_one->is_array_type(other);
4595   const TypePtr* other_elem = other_ary->elem()->make_ptr();
4596   const TypePtr* this_elem = this_one->elem()->make_ptr();
4597   if (other_elem != nullptr && this_elem != nullptr) {
4598     return this_one->is_reference_type(this_elem)->is_meet_subtype_of_helper(this_one->is_reference_type(other_elem), this_xk, other_xk);
4599   }
4600 
4601   if (other_elem == nullptr && this_elem == nullptr) {
4602     return this_one->klass()->is_subtype_of(other->klass());
4603   }
4604 
4605   return false;
4606 }
4607 
4608 bool TypeAryPtr::is_meet_subtype_of_helper(const TypeOopPtr *other, bool this_xk, bool other_xk) const {
4609   return TypePtr::is_meet_subtype_of_helper_for_array(this, other, this_xk, other_xk);
4610 }
4611 
4612 bool TypeInstKlassPtr::is_meet_subtype_of_helper(const TypeKlassPtr *other, bool this_xk, bool other_xk) const {
4613   return TypePtr::is_meet_subtype_of_helper_for_instance(this, other, this_xk, other_xk);
4614 }
4615 
4616 bool TypeAryKlassPtr::is_meet_subtype_of_helper(const TypeKlassPtr *other, bool this_xk, bool other_xk) const {
4617   return TypePtr::is_meet_subtype_of_helper_for_array(this, other, this_xk, other_xk);
4618 }
4619 
4620 //=============================================================================
4621 // Convenience common pre-built types.
4622 const TypeAryPtr* TypeAryPtr::BOTTOM;
4623 const TypeAryPtr* TypeAryPtr::RANGE;
4624 const TypeAryPtr* TypeAryPtr::OOPS;
4625 const TypeAryPtr* TypeAryPtr::NARROWOOPS;
4626 const TypeAryPtr* TypeAryPtr::BYTES;
4627 const TypeAryPtr* TypeAryPtr::SHORTS;
4628 const TypeAryPtr* TypeAryPtr::CHARS;
4629 const TypeAryPtr* TypeAryPtr::INTS;
4630 const TypeAryPtr* TypeAryPtr::LONGS;
4631 const TypeAryPtr* TypeAryPtr::FLOATS;
4632 const TypeAryPtr* TypeAryPtr::DOUBLES;
4633 
4634 //------------------------------make-------------------------------------------
4635 const TypeAryPtr *TypeAryPtr::make(PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset,
4636                                    int instance_id, const TypePtr* speculative, int inline_depth) {
4637   assert(!(k == nullptr && ary->_elem->isa_int()),
4638          "integral arrays must be pre-equipped with a class");
4639   if (!xk)  xk = ary->ary_must_be_exact();
4640   assert(instance_id <= 0 || xk, "instances are always exactly typed");
4641   if (k != nullptr && k->is_loaded() && k->is_obj_array_klass() &&
4642       k->as_obj_array_klass()->base_element_klass()->is_interface()) {
4643     k = nullptr;
4644   }
4645   return (TypeAryPtr*)(new TypeAryPtr(ptr, nullptr, ary, k, xk, offset, instance_id, false, speculative, inline_depth))->hashcons();
4646 }
4647 
4648 //------------------------------make-------------------------------------------
4649 const TypeAryPtr *TypeAryPtr::make(PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset,
4650                                    int instance_id, const TypePtr* speculative, int inline_depth,
4651                                    bool is_autobox_cache) {
4652   assert(!(k == nullptr && ary->_elem->isa_int()),
4653          "integral arrays must be pre-equipped with a class");
4654   assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" );
4655   if (!xk)  xk = (o != nullptr) || ary->ary_must_be_exact();
4656   assert(instance_id <= 0 || xk, "instances are always exactly typed");
4657   if (k != nullptr && k->is_loaded() && k->is_obj_array_klass() &&
4658       k->as_obj_array_klass()->base_element_klass()->is_interface()) {
4659     k = nullptr;
4660   }
4661   return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id, is_autobox_cache, speculative, inline_depth))->hashcons();
4662 }
4663 
4664 //------------------------------cast_to_ptr_type-------------------------------
4665 const TypeAryPtr* TypeAryPtr::cast_to_ptr_type(PTR ptr) const {
4666   if( ptr == _ptr ) return this;
4667   return make(ptr, ptr == Constant ? const_oop() : nullptr, _ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative, _inline_depth);
4668 }
4669 
4670 
4671 //-----------------------------cast_to_exactness-------------------------------
4672 const TypeAryPtr* TypeAryPtr::cast_to_exactness(bool klass_is_exact) const {
4673   if( klass_is_exact == _klass_is_exact ) return this;
4674   if (_ary->ary_must_be_exact())  return this;  // cannot clear xk
4675   return make(ptr(), const_oop(), _ary, klass(), klass_is_exact, _offset, _instance_id, _speculative, _inline_depth);
4676 }
4677 
4678 //-----------------------------cast_to_instance_id----------------------------
4679 const TypeAryPtr* TypeAryPtr::cast_to_instance_id(int instance_id) const {
4680   if( instance_id == _instance_id ) return this;
4681   return make(_ptr, const_oop(), _ary, klass(), _klass_is_exact, _offset, instance_id, _speculative, _inline_depth);
4682 }
4683 
4684 
4685 //-----------------------------max_array_length-------------------------------
4686 // A wrapper around arrayOopDesc::max_array_length(etype) with some input normalization.
4687 jint TypeAryPtr::max_array_length(BasicType etype) {
4688   if (!is_java_primitive(etype) && !::is_reference_type(etype)) {
4689     if (etype == T_NARROWOOP) {
4690       etype = T_OBJECT;
4691     } else if (etype == T_ILLEGAL) { // bottom[]
4692       etype = T_BYTE; // will produce conservatively high value
4693     } else {
4694       fatal("not an element type: %s", type2name(etype));
4695     }
4696   }
4697   return arrayOopDesc::max_array_length(etype);
4698 }
4699 
4700 //-----------------------------narrow_size_type-------------------------------
4701 // Narrow the given size type to the index range for the given array base type.
4702 // Return null if the resulting int type becomes empty.
4703 const TypeInt* TypeAryPtr::narrow_size_type(const TypeInt* size) const {
4704   jint hi = size->_hi;
4705   jint lo = size->_lo;
4706   jint min_lo = 0;
4707   jint max_hi = max_array_length(elem()->array_element_basic_type());
4708   //if (index_not_size)  --max_hi;     // type of a valid array index, FTR
4709   bool chg = false;
4710   if (lo < min_lo) {
4711     lo = min_lo;
4712     if (size->is_con()) {
4713       hi = lo;
4714     }
4715     chg = true;
4716   }
4717   if (hi > max_hi) {
4718     hi = max_hi;
4719     if (size->is_con()) {
4720       lo = hi;
4721     }
4722     chg = true;
4723   }
4724   // Negative length arrays will produce weird intermediate dead fast-path code
4725   if (lo > hi) {
4726     return TypeInt::ZERO;
4727   }
4728   if (!chg) {
4729     return size;
4730   }
4731   return TypeInt::make(lo, hi, Type::WidenMin);
4732 }
4733 
4734 //-------------------------------cast_to_size----------------------------------
4735 const TypeAryPtr* TypeAryPtr::cast_to_size(const TypeInt* new_size) const {
4736   assert(new_size != nullptr, "");
4737   new_size = narrow_size_type(new_size);
4738   if (new_size == size())  return this;
4739   const TypeAry* new_ary = TypeAry::make(elem(), new_size, is_stable());
4740   return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative, _inline_depth);
4741 }
4742 
4743 //------------------------------cast_to_stable---------------------------------
4744 const TypeAryPtr* TypeAryPtr::cast_to_stable(bool stable, int stable_dimension) const {
4745   if (stable_dimension <= 0 || (stable_dimension == 1 && stable == this->is_stable()))
4746     return this;
4747 
4748   const Type* elem = this->elem();
4749   const TypePtr* elem_ptr = elem->make_ptr();
4750 
4751   if (stable_dimension > 1 && elem_ptr != nullptr && elem_ptr->isa_aryptr()) {
4752     // If this is widened from a narrow oop, TypeAry::make will re-narrow it.
4753     elem = elem_ptr = elem_ptr->is_aryptr()->cast_to_stable(stable, stable_dimension - 1);
4754   }
4755 
4756   const TypeAry* new_ary = TypeAry::make(elem, size(), stable);
4757 
4758   return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative, _inline_depth);
4759 }
4760 
4761 //-----------------------------stable_dimension--------------------------------
4762 int TypeAryPtr::stable_dimension() const {
4763   if (!is_stable())  return 0;
4764   int dim = 1;
4765   const TypePtr* elem_ptr = elem()->make_ptr();
4766   if (elem_ptr != nullptr && elem_ptr->isa_aryptr())
4767     dim += elem_ptr->is_aryptr()->stable_dimension();
4768   return dim;
4769 }
4770 
4771 //----------------------cast_to_autobox_cache-----------------------------------
4772 const TypeAryPtr* TypeAryPtr::cast_to_autobox_cache() const {
4773   if (is_autobox_cache())  return this;
4774   const TypeOopPtr* etype = elem()->make_oopptr();
4775   if (etype == nullptr)  return this;
4776   // The pointers in the autobox arrays are always non-null.
4777   etype = etype->cast_to_ptr_type(TypePtr::NotNull)->is_oopptr();
4778   const TypeAry* new_ary = TypeAry::make(etype, size(), is_stable());
4779   return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative, _inline_depth, /*is_autobox_cache=*/true);
4780 }
4781 
4782 //------------------------------eq---------------------------------------------
4783 // Structural equality check for Type representations
4784 bool TypeAryPtr::eq( const Type *t ) const {
4785   const TypeAryPtr *p = t->is_aryptr();
4786   return
4787     _ary == p->_ary &&  // Check array
4788     TypeOopPtr::eq(p);  // Check sub-parts
4789 }
4790 
4791 //------------------------------hash-------------------------------------------
4792 // Type-specific hashing function.
4793 uint TypeAryPtr::hash(void) const {
4794   return (uint)(uintptr_t)_ary + TypeOopPtr::hash();
4795 }
4796 
4797 bool TypeAryPtr::is_java_subtype_of_helper(const TypeOopPtr* other, bool this_exact, bool other_exact) const {
4798   return TypePtr::is_java_subtype_of_helper_for_array(this, other, this_exact, other_exact);
4799 }
4800 
4801 bool TypeAryPtr::is_same_java_type_as_helper(const TypeOopPtr* other) const {
4802   return TypePtr::is_same_java_type_as_helper_for_array(this, other);
4803 }
4804 
4805 bool TypeAryPtr::maybe_java_subtype_of_helper(const TypeOopPtr* other, bool this_exact, bool other_exact) const {
4806   return TypePtr::maybe_java_subtype_of_helper_for_array(this, other, this_exact, other_exact);
4807 }
4808 //------------------------------meet-------------------------------------------
4809 // Compute the MEET of two types.  It returns a new Type object.
4810 const Type *TypeAryPtr::xmeet_helper(const Type *t) const {
4811   // Perform a fast test for common case; meeting the same types together.
4812   if( this == t ) return this;  // Meeting same type-rep?
4813   // Current "this->_base" is Pointer
4814   switch (t->base()) {          // switch on original type
4815 
4816   // Mixing ints & oops happens when javac reuses local variables
4817   case Int:
4818   case Long:
4819   case HalfFloatTop:
4820   case HalfFloatCon:
4821   case HalfFloatBot:
4822   case FloatTop:
4823   case FloatCon:
4824   case FloatBot:
4825   case DoubleTop:
4826   case DoubleCon:
4827   case DoubleBot:
4828   case NarrowOop:
4829   case NarrowKlass:
4830   case Bottom:                  // Ye Olde Default
4831     return Type::BOTTOM;
4832   case Top:
4833     return this;
4834 
4835   default:                      // All else is a mistake
4836     typerr(t);
4837 
4838   case OopPtr: {                // Meeting to OopPtrs
4839     // Found a OopPtr type vs self-AryPtr type
4840     const TypeOopPtr *tp = t->is_oopptr();
4841     int offset = meet_offset(tp->offset());
4842     PTR ptr = meet_ptr(tp->ptr());
4843     int depth = meet_inline_depth(tp->inline_depth());
4844     const TypePtr* speculative = xmeet_speculative(tp);
4845     switch (tp->ptr()) {
4846     case TopPTR:
4847     case AnyNull: {
4848       int instance_id = meet_instance_id(InstanceTop);
4849       return make(ptr, (ptr == Constant ? const_oop() : nullptr),
4850                   _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth);
4851     }
4852     case BotPTR:
4853     case NotNull: {
4854       int instance_id = meet_instance_id(tp->instance_id());
4855       return TypeOopPtr::make(ptr, offset, instance_id, speculative, depth);
4856     }
4857     default: ShouldNotReachHere();
4858     }
4859   }
4860 
4861   case AnyPtr: {                // Meeting two AnyPtrs
4862     // Found an AnyPtr type vs self-AryPtr type
4863     const TypePtr *tp = t->is_ptr();
4864     int offset = meet_offset(tp->offset());
4865     PTR ptr = meet_ptr(tp->ptr());
4866     const TypePtr* speculative = xmeet_speculative(tp);
4867     int depth = meet_inline_depth(tp->inline_depth());
4868     switch (tp->ptr()) {
4869     case TopPTR:
4870       return this;
4871     case BotPTR:
4872     case NotNull:
4873       return TypePtr::make(AnyPtr, ptr, offset, speculative, depth);
4874     case Null:
4875       if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset, speculative, depth);
4876       // else fall through to AnyNull
4877     case AnyNull: {
4878       int instance_id = meet_instance_id(InstanceTop);
4879       return make(ptr, (ptr == Constant ? const_oop() : nullptr),
4880                   _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth);
4881     }
4882     default: ShouldNotReachHere();
4883     }
4884   }
4885 
4886   case MetadataPtr:
4887   case KlassPtr:
4888   case InstKlassPtr:
4889   case AryKlassPtr:
4890   case RawPtr: return TypePtr::BOTTOM;
4891 
4892   case AryPtr: {                // Meeting 2 references?
4893     const TypeAryPtr *tap = t->is_aryptr();
4894     int off = meet_offset(tap->offset());
4895     const Type* tm = _ary->meet_speculative(tap->_ary);
4896     const TypeAry* tary = tm->isa_ary();
4897     if (tary == nullptr) {
4898       assert(tm == Type::TOP || tm == Type::BOTTOM, "");
4899       return tm;
4900     }
4901     PTR ptr = meet_ptr(tap->ptr());
4902     int instance_id = meet_instance_id(tap->instance_id());
4903     const TypePtr* speculative = xmeet_speculative(tap);
4904     int depth = meet_inline_depth(tap->inline_depth());
4905 
4906     ciKlass* res_klass = nullptr;
4907     bool res_xk = false;
4908     const Type* elem = tary->_elem;
4909     if (meet_aryptr(ptr, elem, this, tap, res_klass, res_xk) == NOT_SUBTYPE) {
4910       instance_id = InstanceBot;
4911     }
4912 
4913     ciObject* o = nullptr;             // Assume not constant when done
4914     ciObject* this_oop = const_oop();
4915     ciObject* tap_oop = tap->const_oop();
4916     if (ptr == Constant) {
4917       if (this_oop != nullptr && tap_oop != nullptr &&
4918           this_oop->equals(tap_oop)) {
4919         o = tap_oop;
4920       } else if (above_centerline(_ptr)) {
4921         o = tap_oop;
4922       } else if (above_centerline(tap->_ptr)) {
4923         o = this_oop;
4924       } else {
4925         ptr = NotNull;
4926       }
4927     }
4928     return make(ptr, o, TypeAry::make(elem, tary->_size, tary->_stable), res_klass, res_xk, off, instance_id, speculative, depth);
4929   }
4930 
4931   // All arrays inherit from Object class
4932   case InstPtr: {
4933     const TypeInstPtr *tp = t->is_instptr();
4934     int offset = meet_offset(tp->offset());
4935     PTR ptr = meet_ptr(tp->ptr());
4936     int instance_id = meet_instance_id(tp->instance_id());
4937     const TypePtr* speculative = xmeet_speculative(tp);
4938     int depth = meet_inline_depth(tp->inline_depth());
4939     const TypeInterfaces* interfaces = meet_interfaces(tp);
4940     const TypeInterfaces* tp_interfaces = tp->_interfaces;
4941     const TypeInterfaces* this_interfaces = _interfaces;
4942 
4943     switch (ptr) {
4944     case TopPTR:
4945     case AnyNull:                // Fall 'down' to dual of object klass
4946       // For instances when a subclass meets a superclass we fall
4947       // below the centerline when the superclass is exact. We need to
4948       // do the same here.
4949       if (tp->klass()->equals(ciEnv::current()->Object_klass()) && this_interfaces->contains(tp_interfaces) && !tp->klass_is_exact()) {
4950         return TypeAryPtr::make(ptr, _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth);
4951       } else {
4952         // cannot subclass, so the meet has to fall badly below the centerline
4953         ptr = NotNull;
4954         instance_id = InstanceBot;
4955         interfaces = this_interfaces->intersection_with(tp_interfaces);
4956         return TypeInstPtr::make(ptr, ciEnv::current()->Object_klass(), interfaces, false, nullptr,offset, instance_id, speculative, depth);
4957       }
4958     case Constant:
4959     case NotNull:
4960     case BotPTR:                // Fall down to object klass
4961       // LCA is object_klass, but if we subclass from the top we can do better
4962       if (above_centerline(tp->ptr())) {
4963         // If 'tp'  is above the centerline and it is Object class
4964         // then we can subclass in the Java class hierarchy.
4965         // For instances when a subclass meets a superclass we fall
4966         // below the centerline when the superclass is exact. We need
4967         // to do the same here.
4968         if (tp->klass()->equals(ciEnv::current()->Object_klass()) && this_interfaces->contains(tp_interfaces) && !tp->klass_is_exact()) {
4969           // that is, my array type is a subtype of 'tp' klass
4970           return make(ptr, (ptr == Constant ? const_oop() : nullptr),
4971                       _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth);
4972         }
4973       }
4974       // The other case cannot happen, since t cannot be a subtype of an array.
4975       // The meet falls down to Object class below centerline.
4976       if (ptr == Constant) {
4977          ptr = NotNull;
4978       }
4979       if (instance_id > 0) {
4980         instance_id = InstanceBot;
4981       }
4982       interfaces = this_interfaces->intersection_with(tp_interfaces);
4983       return TypeInstPtr::make(ptr, ciEnv::current()->Object_klass(), interfaces, false, nullptr, offset, instance_id, speculative, depth);
4984     default: typerr(t);
4985     }
4986   }
4987   }
4988   return this;                  // Lint noise
4989 }
4990 
4991 
4992 template<class T> TypePtr::MeetResult TypePtr::meet_aryptr(PTR& ptr, const Type*& elem, const T* this_ary,
4993                                                            const T* other_ary, ciKlass*& res_klass, bool& res_xk) {
4994   int dummy;
4995   bool this_top_or_bottom = (this_ary->base_element_type(dummy) == Type::TOP || this_ary->base_element_type(dummy) == Type::BOTTOM);
4996   bool other_top_or_bottom = (other_ary->base_element_type(dummy) == Type::TOP || other_ary->base_element_type(dummy) == Type::BOTTOM);
4997   ciKlass* this_klass = this_ary->klass();
4998   ciKlass* other_klass = other_ary->klass();
4999   bool this_xk = this_ary->klass_is_exact();
5000   bool other_xk = other_ary->klass_is_exact();
5001   PTR this_ptr = this_ary->ptr();
5002   PTR other_ptr = other_ary->ptr();
5003   res_klass = nullptr;
5004   MeetResult result = SUBTYPE;
5005   if (elem->isa_int()) {
5006     // Integral array element types have irrelevant lattice relations.
5007     // It is the klass that determines array layout, not the element type.
5008     if (this_top_or_bottom)
5009       res_klass = other_klass;
5010     else if (other_top_or_bottom || other_klass == this_klass) {
5011       res_klass = this_klass;
5012     } else {
5013       // Something like byte[int+] meets char[int+].
5014       // This must fall to bottom, not (int[-128..65535])[int+].
5015       // instance_id = InstanceBot;
5016       elem = Type::BOTTOM;
5017       result = NOT_SUBTYPE;
5018       if (above_centerline(ptr) || ptr == Constant) {
5019         ptr = NotNull;
5020         res_xk = false;
5021         return NOT_SUBTYPE;
5022       }
5023     }
5024   } else {// Non integral arrays.
5025     // Must fall to bottom if exact klasses in upper lattice
5026     // are not equal or super klass is exact.
5027     if ((above_centerline(ptr) || ptr == Constant) && !this_ary->is_same_java_type_as(other_ary) &&
5028         // meet with top[] and bottom[] are processed further down:
5029         !this_top_or_bottom && !other_top_or_bottom &&
5030         // both are exact and not equal:
5031         ((other_xk && this_xk) ||
5032          // 'tap'  is exact and super or unrelated:
5033          (other_xk && !other_ary->is_meet_subtype_of(this_ary)) ||
5034          // 'this' is exact and super or unrelated:
5035          (this_xk && !this_ary->is_meet_subtype_of(other_ary)))) {
5036       if (above_centerline(ptr) || (elem->make_ptr() && above_centerline(elem->make_ptr()->_ptr))) {
5037         elem = Type::BOTTOM;
5038       }
5039       ptr = NotNull;
5040       res_xk = false;
5041       return NOT_SUBTYPE;
5042     }
5043   }
5044 
5045   res_xk = false;
5046   switch (other_ptr) {
5047     case AnyNull:
5048     case TopPTR:
5049       // Compute new klass on demand, do not use tap->_klass
5050       if (below_centerline(this_ptr)) {
5051         res_xk = this_xk;
5052       } else {
5053         res_xk = (other_xk || this_xk);
5054       }
5055       return result;
5056     case Constant: {
5057       if (this_ptr == Constant) {
5058         res_xk = true;
5059       } else if(above_centerline(this_ptr)) {
5060         res_xk = true;
5061       } else {
5062         // Only precise for identical arrays
5063         res_xk = this_xk && (this_ary->is_same_java_type_as(other_ary) || (this_top_or_bottom && other_top_or_bottom));
5064       }
5065       return result;
5066     }
5067     case NotNull:
5068     case BotPTR:
5069       // Compute new klass on demand, do not use tap->_klass
5070       if (above_centerline(this_ptr)) {
5071         res_xk = other_xk;
5072       } else {
5073         res_xk = (other_xk && this_xk) &&
5074                  (this_ary->is_same_java_type_as(other_ary) || (this_top_or_bottom && other_top_or_bottom)); // Only precise for identical arrays
5075       }
5076       return result;
5077     default:  {
5078       ShouldNotReachHere();
5079       return result;
5080     }
5081   }
5082   return result;
5083 }
5084 
5085 
5086 //------------------------------xdual------------------------------------------
5087 // Dual: compute field-by-field dual
5088 const Type *TypeAryPtr::xdual() const {
5089   return new TypeAryPtr(dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id(), is_autobox_cache(), dual_speculative(), dual_inline_depth());
5090 }
5091 
5092 //------------------------------dump2------------------------------------------
5093 #ifndef PRODUCT
5094 void TypeAryPtr::dump2( Dict &d, uint depth, outputStream *st ) const {
5095   st->print("aryptr:");
5096   _ary->dump2(d, depth, st);
5097   _interfaces->dump(st);
5098 
5099   if (_ptr == Constant) {
5100     const_oop()->print(st);
5101   }
5102 
5103   st->print(":%s", ptr_msg[_ptr]);
5104   if (_klass_is_exact) {
5105     st->print(":exact");
5106   }
5107 
5108   if( _offset != 0 ) {
5109     BasicType basic_elem_type = elem()->basic_type();
5110     int header_size = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
5111     if( _offset == OffsetTop )       st->print("+undefined");
5112     else if( _offset == OffsetBot )  st->print("+any");
5113     else if( _offset < header_size ) st->print("+%d", _offset);
5114     else {
5115       if (basic_elem_type == T_ILLEGAL) {
5116         st->print("+any");
5117       } else {
5118         int elem_size = type2aelembytes(basic_elem_type);
5119         st->print("[%d]", (_offset - header_size)/elem_size);
5120       }
5121     }
5122   }
5123 
5124   dump_instance_id(st);
5125   dump_inline_depth(st);
5126   dump_speculative(st);
5127 }
5128 #endif
5129 
5130 bool TypeAryPtr::empty(void) const {
5131   if (_ary->empty())       return true;
5132   return TypeOopPtr::empty();
5133 }
5134 
5135 //------------------------------add_offset-------------------------------------
5136 const TypePtr* TypeAryPtr::add_offset(intptr_t offset) const {
5137   return make(_ptr, _const_oop, _ary, _klass, _klass_is_exact, xadd_offset(offset), _instance_id, add_offset_speculative(offset), _inline_depth);
5138 }
5139 
5140 const TypeAryPtr* TypeAryPtr::with_offset(intptr_t offset) const {
5141   return make(_ptr, _const_oop, _ary, _klass, _klass_is_exact, offset, _instance_id, with_offset_speculative(offset), _inline_depth);
5142 }
5143 
5144 const TypeAryPtr* TypeAryPtr::with_ary(const TypeAry* ary) const {
5145   return make(_ptr, _const_oop, ary, _klass, _klass_is_exact, _offset, _instance_id, _speculative, _inline_depth);
5146 }
5147 
5148 const TypeAryPtr* TypeAryPtr::remove_speculative() const {
5149   if (_speculative == nullptr) {
5150     return this;
5151   }
5152   assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth");
5153   return make(_ptr, _const_oop, _ary->remove_speculative()->is_ary(), _klass, _klass_is_exact, _offset, _instance_id, nullptr, _inline_depth);
5154 }
5155 
5156 const TypePtr* TypeAryPtr::with_inline_depth(int depth) const {
5157   if (!UseInlineDepthForSpeculativeTypes) {
5158     return this;
5159   }
5160   return make(_ptr, _const_oop, _ary->remove_speculative()->is_ary(), _klass, _klass_is_exact, _offset, _instance_id, _speculative, depth);
5161 }
5162 
5163 const TypePtr* TypeAryPtr::with_instance_id(int instance_id) const {
5164   assert(is_known_instance(), "should be known");
5165   return make(_ptr, _const_oop, _ary->remove_speculative()->is_ary(), _klass, _klass_is_exact, _offset, instance_id, _speculative, _inline_depth);
5166 }
5167 
5168 //=============================================================================
5169 
5170 //------------------------------hash-------------------------------------------
5171 // Type-specific hashing function.
5172 uint TypeNarrowPtr::hash(void) const {
5173   return _ptrtype->hash() + 7;
5174 }
5175 
5176 bool TypeNarrowPtr::singleton(void) const {    // TRUE if type is a singleton
5177   return _ptrtype->singleton();
5178 }
5179 
5180 bool TypeNarrowPtr::empty(void) const {
5181   return _ptrtype->empty();
5182 }
5183 
5184 intptr_t TypeNarrowPtr::get_con() const {
5185   return _ptrtype->get_con();
5186 }
5187 
5188 bool TypeNarrowPtr::eq( const Type *t ) const {
5189   const TypeNarrowPtr* tc = isa_same_narrowptr(t);
5190   if (tc != nullptr) {
5191     if (_ptrtype->base() != tc->_ptrtype->base()) {
5192       return false;
5193     }
5194     return tc->_ptrtype->eq(_ptrtype);
5195   }
5196   return false;
5197 }
5198 
5199 const Type *TypeNarrowPtr::xdual() const {    // Compute dual right now.
5200   const TypePtr* odual = _ptrtype->dual()->is_ptr();
5201   return make_same_narrowptr(odual);
5202 }
5203 
5204 
5205 const Type *TypeNarrowPtr::filter_helper(const Type *kills, bool include_speculative) const {
5206   if (isa_same_narrowptr(kills)) {
5207     const Type* ft =_ptrtype->filter_helper(is_same_narrowptr(kills)->_ptrtype, include_speculative);
5208     if (ft->empty())
5209       return Type::TOP;           // Canonical empty value
5210     if (ft->isa_ptr()) {
5211       return make_hash_same_narrowptr(ft->isa_ptr());
5212     }
5213     return ft;
5214   } else if (kills->isa_ptr()) {
5215     const Type* ft = _ptrtype->join_helper(kills, include_speculative);
5216     if (ft->empty())
5217       return Type::TOP;           // Canonical empty value
5218     return ft;
5219   } else {
5220     return Type::TOP;
5221   }
5222 }
5223 
5224 //------------------------------xmeet------------------------------------------
5225 // Compute the MEET of two types.  It returns a new Type object.
5226 const Type *TypeNarrowPtr::xmeet( const Type *t ) const {
5227   // Perform a fast test for common case; meeting the same types together.
5228   if( this == t ) return this;  // Meeting same type-rep?
5229 
5230   if (t->base() == base()) {
5231     const Type* result = _ptrtype->xmeet(t->make_ptr());
5232     if (result->isa_ptr()) {
5233       return make_hash_same_narrowptr(result->is_ptr());
5234     }
5235     return result;
5236   }
5237 
5238   // Current "this->_base" is NarrowKlass or NarrowOop
5239   switch (t->base()) {          // switch on original type
5240 
5241   case Int:                     // Mixing ints & oops happens when javac
5242   case Long:                    // reuses local variables
5243   case HalfFloatTop:
5244   case HalfFloatCon:
5245   case HalfFloatBot:
5246   case FloatTop:
5247   case FloatCon:
5248   case FloatBot:
5249   case DoubleTop:
5250   case DoubleCon:
5251   case DoubleBot:
5252   case AnyPtr:
5253   case RawPtr:
5254   case OopPtr:
5255   case InstPtr:
5256   case AryPtr:
5257   case MetadataPtr:
5258   case KlassPtr:
5259   case InstKlassPtr:
5260   case AryKlassPtr:
5261   case NarrowOop:
5262   case NarrowKlass:
5263 
5264   case Bottom:                  // Ye Olde Default
5265     return Type::BOTTOM;
5266   case Top:
5267     return this;
5268 
5269   default:                      // All else is a mistake
5270     typerr(t);
5271 
5272   } // End of switch
5273 
5274   return this;
5275 }
5276 
5277 #ifndef PRODUCT
5278 void TypeNarrowPtr::dump2( Dict & d, uint depth, outputStream *st ) const {
5279   _ptrtype->dump2(d, depth, st);
5280 }
5281 #endif
5282 
5283 const TypeNarrowOop *TypeNarrowOop::BOTTOM;
5284 const TypeNarrowOop *TypeNarrowOop::NULL_PTR;
5285 
5286 
5287 const TypeNarrowOop* TypeNarrowOop::make(const TypePtr* type) {
5288   return (const TypeNarrowOop*)(new TypeNarrowOop(type))->hashcons();
5289 }
5290 
5291 const TypeNarrowOop* TypeNarrowOop::remove_speculative() const {
5292   return make(_ptrtype->remove_speculative()->is_ptr());
5293 }
5294 
5295 const Type* TypeNarrowOop::cleanup_speculative() const {
5296   return make(_ptrtype->cleanup_speculative()->is_ptr());
5297 }
5298 
5299 #ifndef PRODUCT
5300 void TypeNarrowOop::dump2( Dict & d, uint depth, outputStream *st ) const {
5301   st->print("narrowoop: ");
5302   TypeNarrowPtr::dump2(d, depth, st);
5303 }
5304 #endif
5305 
5306 const TypeNarrowKlass *TypeNarrowKlass::NULL_PTR;
5307 
5308 const TypeNarrowKlass* TypeNarrowKlass::make(const TypePtr* type) {
5309   return (const TypeNarrowKlass*)(new TypeNarrowKlass(type))->hashcons();
5310 }
5311 
5312 #ifndef PRODUCT
5313 void TypeNarrowKlass::dump2( Dict & d, uint depth, outputStream *st ) const {
5314   st->print("narrowklass: ");
5315   TypeNarrowPtr::dump2(d, depth, st);
5316 }
5317 #endif
5318 
5319 
5320 //------------------------------eq---------------------------------------------
5321 // Structural equality check for Type representations
5322 bool TypeMetadataPtr::eq( const Type *t ) const {
5323   const TypeMetadataPtr *a = (const TypeMetadataPtr*)t;
5324   ciMetadata* one = metadata();
5325   ciMetadata* two = a->metadata();
5326   if (one == nullptr || two == nullptr) {
5327     return (one == two) && TypePtr::eq(t);
5328   } else {
5329     return one->equals(two) && TypePtr::eq(t);
5330   }
5331 }
5332 
5333 //------------------------------hash-------------------------------------------
5334 // Type-specific hashing function.
5335 uint TypeMetadataPtr::hash(void) const {
5336   return
5337     (metadata() ? metadata()->hash() : 0) +
5338     TypePtr::hash();
5339 }
5340 
5341 //------------------------------singleton--------------------------------------
5342 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
5343 // constants
5344 bool TypeMetadataPtr::singleton(void) const {
5345   // detune optimizer to not generate constant metadata + constant offset as a constant!
5346   // TopPTR, Null, AnyNull, Constant are all singletons
5347   return (_offset == 0) && !below_centerline(_ptr);
5348 }
5349 
5350 //------------------------------add_offset-------------------------------------
5351 const TypePtr* TypeMetadataPtr::add_offset( intptr_t offset ) const {
5352   return make( _ptr, _metadata, xadd_offset(offset));
5353 }
5354 
5355 //-----------------------------filter------------------------------------------
5356 // Do not allow interface-vs.-noninterface joins to collapse to top.
5357 const Type *TypeMetadataPtr::filter_helper(const Type *kills, bool include_speculative) const {
5358   const TypeMetadataPtr* ft = join_helper(kills, include_speculative)->isa_metadataptr();
5359   if (ft == nullptr || ft->empty())
5360     return Type::TOP;           // Canonical empty value
5361   return ft;
5362 }
5363 
5364  //------------------------------get_con----------------------------------------
5365 intptr_t TypeMetadataPtr::get_con() const {
5366   assert( _ptr == Null || _ptr == Constant, "" );
5367   assert( _offset >= 0, "" );
5368 
5369   if (_offset != 0) {
5370     // After being ported to the compiler interface, the compiler no longer
5371     // directly manipulates the addresses of oops.  Rather, it only has a pointer
5372     // to a handle at compile time.  This handle is embedded in the generated
5373     // code and dereferenced at the time the nmethod is made.  Until that time,
5374     // it is not reasonable to do arithmetic with the addresses of oops (we don't
5375     // have access to the addresses!).  This does not seem to currently happen,
5376     // but this assertion here is to help prevent its occurrence.
5377     tty->print_cr("Found oop constant with non-zero offset");
5378     ShouldNotReachHere();
5379   }
5380 
5381   return (intptr_t)metadata()->constant_encoding();
5382 }
5383 
5384 //------------------------------cast_to_ptr_type-------------------------------
5385 const TypeMetadataPtr* TypeMetadataPtr::cast_to_ptr_type(PTR ptr) const {
5386   if( ptr == _ptr ) return this;
5387   return make(ptr, metadata(), _offset);
5388 }
5389 
5390 //------------------------------meet-------------------------------------------
5391 // Compute the MEET of two types.  It returns a new Type object.
5392 const Type *TypeMetadataPtr::xmeet( const Type *t ) const {
5393   // Perform a fast test for common case; meeting the same types together.
5394   if( this == t ) return this;  // Meeting same type-rep?
5395 
5396   // Current "this->_base" is OopPtr
5397   switch (t->base()) {          // switch on original type
5398 
5399   case Int:                     // Mixing ints & oops happens when javac
5400   case Long:                    // reuses local variables
5401   case HalfFloatTop:
5402   case HalfFloatCon:
5403   case HalfFloatBot:
5404   case FloatTop:
5405   case FloatCon:
5406   case FloatBot:
5407   case DoubleTop:
5408   case DoubleCon:
5409   case DoubleBot:
5410   case NarrowOop:
5411   case NarrowKlass:
5412   case Bottom:                  // Ye Olde Default
5413     return Type::BOTTOM;
5414   case Top:
5415     return this;
5416 
5417   default:                      // All else is a mistake
5418     typerr(t);
5419 
5420   case AnyPtr: {
5421     // Found an AnyPtr type vs self-OopPtr type
5422     const TypePtr *tp = t->is_ptr();
5423     int offset = meet_offset(tp->offset());
5424     PTR ptr = meet_ptr(tp->ptr());
5425     switch (tp->ptr()) {
5426     case Null:
5427       if (ptr == Null)  return TypePtr::make(AnyPtr, ptr, offset, tp->speculative(), tp->inline_depth());
5428       // else fall through:
5429     case TopPTR:
5430     case AnyNull: {
5431       return make(ptr, _metadata, offset);
5432     }
5433     case BotPTR:
5434     case NotNull:
5435       return TypePtr::make(AnyPtr, ptr, offset, tp->speculative(), tp->inline_depth());
5436     default: typerr(t);
5437     }
5438   }
5439 
5440   case RawPtr:
5441   case KlassPtr:
5442   case InstKlassPtr:
5443   case AryKlassPtr:
5444   case OopPtr:
5445   case InstPtr:
5446   case AryPtr:
5447     return TypePtr::BOTTOM;     // Oop meet raw is not well defined
5448 
5449   case MetadataPtr: {
5450     const TypeMetadataPtr *tp = t->is_metadataptr();
5451     int offset = meet_offset(tp->offset());
5452     PTR tptr = tp->ptr();
5453     PTR ptr = meet_ptr(tptr);
5454     ciMetadata* md = (tptr == TopPTR) ? metadata() : tp->metadata();
5455     if (tptr == TopPTR || _ptr == TopPTR ||
5456         metadata()->equals(tp->metadata())) {
5457       return make(ptr, md, offset);
5458     }
5459     // metadata is different
5460     if( ptr == Constant ) {  // Cannot be equal constants, so...
5461       if( tptr == Constant && _ptr != Constant)  return t;
5462       if( _ptr == Constant && tptr != Constant)  return this;
5463       ptr = NotNull;            // Fall down in lattice
5464     }
5465     return make(ptr, nullptr, offset);
5466     break;
5467   }
5468   } // End of switch
5469   return this;                  // Return the double constant
5470 }
5471 
5472 
5473 //------------------------------xdual------------------------------------------
5474 // Dual of a pure metadata pointer.
5475 const Type *TypeMetadataPtr::xdual() const {
5476   return new TypeMetadataPtr(dual_ptr(), metadata(), dual_offset());
5477 }
5478 
5479 //------------------------------dump2------------------------------------------
5480 #ifndef PRODUCT
5481 void TypeMetadataPtr::dump2( Dict &d, uint depth, outputStream *st ) const {
5482   st->print("metadataptr:%s", ptr_msg[_ptr]);
5483   if (metadata() != nullptr) {
5484     st->print(":" INTPTR_FORMAT, p2i(metadata()));
5485   }
5486   dump_offset(st);
5487 }
5488 #endif
5489 
5490 
5491 //=============================================================================
5492 // Convenience common pre-built type.
5493 const TypeMetadataPtr *TypeMetadataPtr::BOTTOM;
5494 
5495 TypeMetadataPtr::TypeMetadataPtr(PTR ptr, ciMetadata* metadata, int offset):
5496   TypePtr(MetadataPtr, ptr, offset, relocInfo::metadata_type), _metadata(metadata) {
5497 }
5498 
5499 const TypeMetadataPtr* TypeMetadataPtr::make(ciMethod* m) {
5500   return make(Constant, m, 0);
5501 }
5502 const TypeMetadataPtr* TypeMetadataPtr::make(ciMethodData* m) {
5503   return make(Constant, m, 0);
5504 }
5505 
5506 //------------------------------make-------------------------------------------
5507 // Create a meta data constant
5508 const TypeMetadataPtr *TypeMetadataPtr::make(PTR ptr, ciMetadata* m, int offset) {
5509   assert(m == nullptr || !m->is_klass(), "wrong type");
5510   return (TypeMetadataPtr*)(new TypeMetadataPtr(ptr, m, offset))->hashcons();
5511 }
5512 
5513 
5514 const TypeKlassPtr* TypeAryPtr::as_klass_type(bool try_for_exact) const {
5515   const Type* elem = _ary->_elem;
5516   bool xk = klass_is_exact();
5517   if (elem->make_oopptr() != nullptr) {
5518     elem = elem->make_oopptr()->as_klass_type(try_for_exact);
5519     if (elem->is_klassptr()->klass_is_exact()) {
5520       xk = true;
5521     }
5522   }
5523   return TypeAryKlassPtr::make(xk ? TypePtr::Constant : TypePtr::NotNull, elem, klass(), 0);
5524 }
5525 
5526 const TypeKlassPtr* TypeKlassPtr::make(ciKlass *klass, InterfaceHandling interface_handling) {
5527   if (klass->is_instance_klass()) {
5528     return TypeInstKlassPtr::make(klass, interface_handling);
5529   }
5530   return TypeAryKlassPtr::make(klass, interface_handling);
5531 }
5532 
5533 const TypeKlassPtr* TypeKlassPtr::make(PTR ptr, ciKlass* klass, int offset, InterfaceHandling interface_handling) {
5534   if (klass->is_instance_klass()) {
5535     const TypeInterfaces* interfaces = TypePtr::interfaces(klass, true, true, false, interface_handling);
5536     return TypeInstKlassPtr::make(ptr, klass, interfaces, offset);
5537   }
5538   return TypeAryKlassPtr::make(ptr, klass, offset, interface_handling);
5539 }
5540 
5541 
5542 //------------------------------TypeKlassPtr-----------------------------------
5543 TypeKlassPtr::TypeKlassPtr(TYPES t, PTR ptr, ciKlass* klass, const TypeInterfaces* interfaces, int offset)
5544   : TypePtr(t, ptr, offset, relocInfo::metadata_type), _klass(klass), _interfaces(interfaces) {
5545   assert(klass == nullptr || !klass->is_loaded() || (klass->is_instance_klass() && !klass->is_interface()) ||
5546          klass->is_type_array_klass() || !klass->as_obj_array_klass()->base_element_klass()->is_interface(), "no interface here");
5547 }
5548 
5549 // Is there a single ciKlass* that can represent that type?
5550 ciKlass* TypeKlassPtr::exact_klass_helper() const {
5551   assert(_klass->is_instance_klass() && !_klass->is_interface(), "No interface");
5552   if (_interfaces->empty()) {
5553     return _klass;
5554   }
5555   if (_klass != ciEnv::current()->Object_klass()) {
5556     if (_interfaces->eq(_klass->as_instance_klass())) {
5557       return _klass;
5558     }
5559     return nullptr;
5560   }
5561   return _interfaces->exact_klass();
5562 }
5563 
5564 //------------------------------eq---------------------------------------------
5565 // Structural equality check for Type representations
5566 bool TypeKlassPtr::eq(const Type *t) const {
5567   const TypeKlassPtr *p = t->is_klassptr();
5568   return
5569     _interfaces->eq(p->_interfaces) &&
5570     TypePtr::eq(p);
5571 }
5572 
5573 //------------------------------hash-------------------------------------------
5574 // Type-specific hashing function.
5575 uint TypeKlassPtr::hash(void) const {
5576   return TypePtr::hash() + _interfaces->hash();
5577 }
5578 
5579 //------------------------------singleton--------------------------------------
5580 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
5581 // constants
5582 bool TypeKlassPtr::singleton(void) const {
5583   // detune optimizer to not generate constant klass + constant offset as a constant!
5584   // TopPTR, Null, AnyNull, Constant are all singletons
5585   return (_offset == 0) && !below_centerline(_ptr);
5586 }
5587 
5588 // Do not allow interface-vs.-noninterface joins to collapse to top.
5589 const Type *TypeKlassPtr::filter_helper(const Type *kills, bool include_speculative) const {
5590   // logic here mirrors the one from TypeOopPtr::filter. See comments
5591   // there.
5592   const Type* ft = join_helper(kills, include_speculative);
5593 
5594   if (ft->empty()) {
5595     return Type::TOP;           // Canonical empty value
5596   }
5597 
5598   return ft;
5599 }
5600 
5601 const TypeInterfaces* TypeKlassPtr::meet_interfaces(const TypeKlassPtr* other) const {
5602   if (above_centerline(_ptr) && above_centerline(other->_ptr)) {
5603     return _interfaces->union_with(other->_interfaces);
5604   } else if (above_centerline(_ptr) && !above_centerline(other->_ptr)) {
5605     return other->_interfaces;
5606   } else if (above_centerline(other->_ptr) && !above_centerline(_ptr)) {
5607     return _interfaces;
5608   }
5609   return _interfaces->intersection_with(other->_interfaces);
5610 }
5611 
5612 //------------------------------get_con----------------------------------------
5613 intptr_t TypeKlassPtr::get_con() const {
5614   assert( _ptr == Null || _ptr == Constant, "" );
5615   assert( _offset >= 0, "" );
5616 
5617   if (_offset != 0) {
5618     // After being ported to the compiler interface, the compiler no longer
5619     // directly manipulates the addresses of oops.  Rather, it only has a pointer
5620     // to a handle at compile time.  This handle is embedded in the generated
5621     // code and dereferenced at the time the nmethod is made.  Until that time,
5622     // it is not reasonable to do arithmetic with the addresses of oops (we don't
5623     // have access to the addresses!).  This does not seem to currently happen,
5624     // but this assertion here is to help prevent its occurrence.
5625     tty->print_cr("Found oop constant with non-zero offset");
5626     ShouldNotReachHere();
5627   }
5628 
5629   ciKlass* k = exact_klass();
5630 
5631   return (intptr_t)k->constant_encoding();
5632 }
5633 
5634 //=============================================================================
5635 // Convenience common pre-built types.
5636 
5637 // Not-null object klass or below
5638 const TypeInstKlassPtr *TypeInstKlassPtr::OBJECT;
5639 const TypeInstKlassPtr *TypeInstKlassPtr::OBJECT_OR_NULL;
5640 
5641 bool TypeInstKlassPtr::eq(const Type *t) const {
5642   const TypeKlassPtr *p = t->is_klassptr();
5643   return
5644     klass()->equals(p->klass()) &&
5645     TypeKlassPtr::eq(p);
5646 }
5647 
5648 uint TypeInstKlassPtr::hash(void) const {
5649   return klass()->hash() + TypeKlassPtr::hash();
5650 }
5651 
5652 const TypeInstKlassPtr *TypeInstKlassPtr::make(PTR ptr, ciKlass* k, const TypeInterfaces* interfaces, int offset) {
5653   TypeInstKlassPtr *r =
5654     (TypeInstKlassPtr*)(new TypeInstKlassPtr(ptr, k, interfaces, offset))->hashcons();
5655 
5656   return r;
5657 }
5658 
5659 //------------------------------add_offset-------------------------------------
5660 // Access internals of klass object
5661 const TypePtr* TypeInstKlassPtr::add_offset( intptr_t offset ) const {
5662   return make( _ptr, klass(), _interfaces, xadd_offset(offset) );
5663 }
5664 
5665 const TypeInstKlassPtr* TypeInstKlassPtr::with_offset(intptr_t offset) const {
5666   return make(_ptr, klass(), _interfaces, offset);
5667 }
5668 
5669 //------------------------------cast_to_ptr_type-------------------------------
5670 const TypeInstKlassPtr* TypeInstKlassPtr::cast_to_ptr_type(PTR ptr) const {
5671   assert(_base == InstKlassPtr, "subclass must override cast_to_ptr_type");
5672   if( ptr == _ptr ) return this;
5673   return make(ptr, _klass, _interfaces, _offset);
5674 }
5675 
5676 
5677 bool TypeInstKlassPtr::must_be_exact() const {
5678   if (!_klass->is_loaded())  return false;
5679   ciInstanceKlass* ik = _klass->as_instance_klass();
5680   if (ik->is_final())  return true;  // cannot clear xk
5681   return false;
5682 }
5683 
5684 //-----------------------------cast_to_exactness-------------------------------
5685 const TypeKlassPtr* TypeInstKlassPtr::cast_to_exactness(bool klass_is_exact) const {
5686   if (klass_is_exact == (_ptr == Constant)) return this;
5687   if (must_be_exact()) return this;
5688   ciKlass* k = klass();
5689   return make(klass_is_exact ? Constant : NotNull, k, _interfaces, _offset);
5690 }
5691 
5692 
5693 //-----------------------------as_instance_type--------------------------------
5694 // Corresponding type for an instance of the given class.
5695 // It will be NotNull, and exact if and only if the klass type is exact.
5696 const TypeOopPtr* TypeInstKlassPtr::as_instance_type(bool klass_change) const {
5697   ciKlass* k = klass();
5698   bool xk = klass_is_exact();
5699   Compile* C = Compile::current();
5700   Dependencies* deps = C->dependencies();
5701   assert((deps != nullptr) == (C->method() != nullptr && C->method()->code_size() > 0), "sanity");
5702   // Element is an instance
5703   bool klass_is_exact = false;
5704   const TypeInterfaces* interfaces = _interfaces;
5705   if (k->is_loaded()) {
5706     // Try to set klass_is_exact.
5707     ciInstanceKlass* ik = k->as_instance_klass();
5708     klass_is_exact = ik->is_final();
5709     if (!klass_is_exact && klass_change
5710         && deps != nullptr && UseUniqueSubclasses) {
5711       ciInstanceKlass* sub = ik->unique_concrete_subklass();
5712       if (sub != nullptr) {
5713         if (_interfaces->eq(sub)) {
5714           deps->assert_abstract_with_unique_concrete_subtype(ik, sub);
5715           k = ik = sub;
5716           xk = sub->is_final();
5717         }
5718       }
5719     }
5720   }
5721   return TypeInstPtr::make(TypePtr::BotPTR, k, interfaces, xk, nullptr, 0);
5722 }
5723 
5724 //------------------------------xmeet------------------------------------------
5725 // Compute the MEET of two types, return a new Type object.
5726 const Type    *TypeInstKlassPtr::xmeet( const Type *t ) const {
5727   // Perform a fast test for common case; meeting the same types together.
5728   if( this == t ) return this;  // Meeting same type-rep?
5729 
5730   // Current "this->_base" is Pointer
5731   switch (t->base()) {          // switch on original type
5732 
5733   case Int:                     // Mixing ints & oops happens when javac
5734   case Long:                    // reuses local variables
5735   case HalfFloatTop:
5736   case HalfFloatCon:
5737   case HalfFloatBot:
5738   case FloatTop:
5739   case FloatCon:
5740   case FloatBot:
5741   case DoubleTop:
5742   case DoubleCon:
5743   case DoubleBot:
5744   case NarrowOop:
5745   case NarrowKlass:
5746   case Bottom:                  // Ye Olde Default
5747     return Type::BOTTOM;
5748   case Top:
5749     return this;
5750 
5751   default:                      // All else is a mistake
5752     typerr(t);
5753 
5754   case AnyPtr: {                // Meeting to AnyPtrs
5755     // Found an AnyPtr type vs self-KlassPtr type
5756     const TypePtr *tp = t->is_ptr();
5757     int offset = meet_offset(tp->offset());
5758     PTR ptr = meet_ptr(tp->ptr());
5759     switch (tp->ptr()) {
5760     case TopPTR:
5761       return this;
5762     case Null:
5763       if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset, tp->speculative(), tp->inline_depth());
5764     case AnyNull:
5765       return make( ptr, klass(), _interfaces, offset );
5766     case BotPTR:
5767     case NotNull:
5768       return TypePtr::make(AnyPtr, ptr, offset, tp->speculative(), tp->inline_depth());
5769     default: typerr(t);
5770     }
5771   }
5772 
5773   case RawPtr:
5774   case MetadataPtr:
5775   case OopPtr:
5776   case AryPtr:                  // Meet with AryPtr
5777   case InstPtr:                 // Meet with InstPtr
5778     return TypePtr::BOTTOM;
5779 
5780   //
5781   //             A-top         }
5782   //           /   |   \       }  Tops
5783   //       B-top A-any C-top   }
5784   //          | /  |  \ |      }  Any-nulls
5785   //       B-any   |   C-any   }
5786   //          |    |    |
5787   //       B-con A-con C-con   } constants; not comparable across classes
5788   //          |    |    |
5789   //       B-not   |   C-not   }
5790   //          | \  |  / |      }  not-nulls
5791   //       B-bot A-not C-bot   }
5792   //           \   |   /       }  Bottoms
5793   //             A-bot         }
5794   //
5795 
5796   case InstKlassPtr: {  // Meet two KlassPtr types
5797     const TypeInstKlassPtr *tkls = t->is_instklassptr();
5798     int  off     = meet_offset(tkls->offset());
5799     PTR  ptr     = meet_ptr(tkls->ptr());
5800     const TypeInterfaces* interfaces = meet_interfaces(tkls);
5801 
5802     ciKlass* res_klass = nullptr;
5803     bool res_xk = false;
5804     switch(meet_instptr(ptr, interfaces, this, tkls, res_klass, res_xk)) {
5805       case UNLOADED:
5806         ShouldNotReachHere();
5807       case SUBTYPE:
5808       case NOT_SUBTYPE:
5809       case LCA:
5810       case QUICK: {
5811         assert(res_xk == (ptr == Constant), "");
5812         const Type* res = make(ptr, res_klass, interfaces, off);
5813         return res;
5814       }
5815       default:
5816         ShouldNotReachHere();
5817     }
5818   } // End of case KlassPtr
5819   case AryKlassPtr: {                // All arrays inherit from Object class
5820     const TypeAryKlassPtr *tp = t->is_aryklassptr();
5821     int offset = meet_offset(tp->offset());
5822     PTR ptr = meet_ptr(tp->ptr());
5823     const TypeInterfaces* interfaces = meet_interfaces(tp);
5824     const TypeInterfaces* tp_interfaces = tp->_interfaces;
5825     const TypeInterfaces* this_interfaces = _interfaces;
5826 
5827     switch (ptr) {
5828     case TopPTR:
5829     case AnyNull:                // Fall 'down' to dual of object klass
5830       // For instances when a subclass meets a superclass we fall
5831       // below the centerline when the superclass is exact. We need to
5832       // do the same here.
5833       if (klass()->equals(ciEnv::current()->Object_klass()) && tp_interfaces->contains(this_interfaces) && !klass_is_exact()) {
5834         return TypeAryKlassPtr::make(ptr, tp->elem(), tp->klass(), offset);
5835       } else {
5836         // cannot subclass, so the meet has to fall badly below the centerline
5837         ptr = NotNull;
5838         interfaces = _interfaces->intersection_with(tp->_interfaces);
5839         return make(ptr, ciEnv::current()->Object_klass(), interfaces, offset);
5840       }
5841     case Constant:
5842     case NotNull:
5843     case BotPTR:                // Fall down to object klass
5844       // LCA is object_klass, but if we subclass from the top we can do better
5845       if( above_centerline(_ptr) ) { // if( _ptr == TopPTR || _ptr == AnyNull )
5846         // If 'this' (InstPtr) is above the centerline and it is Object class
5847         // then we can subclass in the Java class hierarchy.
5848         // For instances when a subclass meets a superclass we fall
5849         // below the centerline when the superclass is exact. We need
5850         // to do the same here.
5851         if (klass()->equals(ciEnv::current()->Object_klass()) && tp_interfaces->contains(this_interfaces) && !klass_is_exact()) {
5852           // that is, tp's array type is a subtype of my klass
5853           return TypeAryKlassPtr::make(ptr,
5854                                        tp->elem(), tp->klass(), offset);
5855         }
5856       }
5857       // The other case cannot happen, since I cannot be a subtype of an array.
5858       // The meet falls down to Object class below centerline.
5859       if( ptr == Constant )
5860          ptr = NotNull;
5861       interfaces = this_interfaces->intersection_with(tp_interfaces);
5862       return make(ptr, ciEnv::current()->Object_klass(), interfaces, offset);
5863     default: typerr(t);
5864     }
5865   }
5866 
5867   } // End of switch
5868   return this;                  // Return the double constant
5869 }
5870 
5871 //------------------------------xdual------------------------------------------
5872 // Dual: compute field-by-field dual
5873 const Type    *TypeInstKlassPtr::xdual() const {
5874   return new TypeInstKlassPtr(dual_ptr(), klass(), _interfaces, dual_offset());
5875 }
5876 
5877 template <class T1, class T2> bool TypePtr::is_java_subtype_of_helper_for_instance(const T1* this_one, const T2* other, bool this_exact, bool other_exact) {
5878   static_assert(std::is_base_of<T2, T1>::value, "");
5879   if (!this_one->is_loaded() || !other->is_loaded()) {
5880     return false;
5881   }
5882   if (!this_one->is_instance_type(other)) {
5883     return false;
5884   }
5885 
5886   if (!other_exact) {
5887     return false;
5888   }
5889 
5890   if (other->klass()->equals(ciEnv::current()->Object_klass()) && other->_interfaces->empty()) {
5891     return true;
5892   }
5893 
5894   return this_one->klass()->is_subtype_of(other->klass()) && this_one->_interfaces->contains(other->_interfaces);
5895 }
5896 
5897 bool TypeInstKlassPtr::might_be_an_array() const {
5898   if (!instance_klass()->is_java_lang_Object()) {
5899     // TypeInstKlassPtr can be an array only if it is java.lang.Object: the only supertype of array types.
5900     return false;
5901   }
5902   if (interfaces()->has_non_array_interface()) {
5903     // Arrays only implement Cloneable and Serializable. If we see any other interface, [this] cannot be an array.
5904     return false;
5905   }
5906   // Cannot prove it's not an array.
5907   return true;
5908 }
5909 
5910 bool TypeInstKlassPtr::is_java_subtype_of_helper(const TypeKlassPtr* other, bool this_exact, bool other_exact) const {
5911   return TypePtr::is_java_subtype_of_helper_for_instance(this, other, this_exact, other_exact);
5912 }
5913 
5914 template <class T1, class T2> bool TypePtr::is_same_java_type_as_helper_for_instance(const T1* this_one, const T2* other) {
5915   static_assert(std::is_base_of<T2, T1>::value, "");
5916   if (!this_one->is_loaded() || !other->is_loaded()) {
5917     return false;
5918   }
5919   if (!this_one->is_instance_type(other)) {
5920     return false;
5921   }
5922   return this_one->klass()->equals(other->klass()) && this_one->_interfaces->eq(other->_interfaces);
5923 }
5924 
5925 bool TypeInstKlassPtr::is_same_java_type_as_helper(const TypeKlassPtr* other) const {
5926   return TypePtr::is_same_java_type_as_helper_for_instance(this, other);
5927 }
5928 
5929 template <class T1, class T2> bool TypePtr::maybe_java_subtype_of_helper_for_instance(const T1* this_one, const T2* other, bool this_exact, bool other_exact) {
5930   static_assert(std::is_base_of<T2, T1>::value, "");
5931   if (!this_one->is_loaded() || !other->is_loaded()) {
5932     return true;
5933   }
5934 
5935   if (this_one->is_array_type(other)) {
5936     return !this_exact && this_one->klass()->equals(ciEnv::current()->Object_klass())  && other->_interfaces->contains(this_one->_interfaces);
5937   }
5938 
5939   assert(this_one->is_instance_type(other), "unsupported");
5940 
5941   if (this_exact && other_exact) {
5942     return this_one->is_java_subtype_of(other);
5943   }
5944 
5945   if (!this_one->klass()->is_subtype_of(other->klass()) && !other->klass()->is_subtype_of(this_one->klass())) {
5946     return false;
5947   }
5948 
5949   if (this_exact) {
5950     return this_one->klass()->is_subtype_of(other->klass()) && this_one->_interfaces->contains(other->_interfaces);
5951   }
5952 
5953   return true;
5954 }
5955 
5956 bool TypeInstKlassPtr::maybe_java_subtype_of_helper(const TypeKlassPtr* other, bool this_exact, bool other_exact) const {
5957   return TypePtr::maybe_java_subtype_of_helper_for_instance(this, other, this_exact, other_exact);
5958 }
5959 
5960 const TypeKlassPtr* TypeInstKlassPtr::try_improve() const {
5961   if (!UseUniqueSubclasses) {
5962     return this;
5963   }
5964   ciKlass* k = klass();
5965   Compile* C = Compile::current();
5966   Dependencies* deps = C->dependencies();
5967   assert((deps != nullptr) == (C->method() != nullptr && C->method()->code_size() > 0), "sanity");
5968   const TypeInterfaces* interfaces = _interfaces;
5969   if (k->is_loaded()) {
5970     ciInstanceKlass* ik = k->as_instance_klass();
5971     bool klass_is_exact = ik->is_final();
5972     if (!klass_is_exact &&
5973         deps != nullptr) {
5974       ciInstanceKlass* sub = ik->unique_concrete_subklass();
5975       if (sub != nullptr) {
5976         if (_interfaces->eq(sub)) {
5977           deps->assert_abstract_with_unique_concrete_subtype(ik, sub);
5978           k = ik = sub;
5979           klass_is_exact = sub->is_final();
5980           return TypeKlassPtr::make(klass_is_exact ? Constant : _ptr, k, _offset);
5981         }
5982       }
5983     }
5984   }
5985   return this;
5986 }
5987 
5988 #ifndef PRODUCT
5989 void TypeInstKlassPtr::dump2(Dict& d, uint depth, outputStream* st) const {
5990   st->print("instklassptr:");
5991   klass()->print_name_on(st);
5992   _interfaces->dump(st);
5993   st->print(":%s", ptr_msg[_ptr]);
5994   dump_offset(st);
5995 }
5996 #endif // PRODUCT
5997 
5998 const TypeAryKlassPtr *TypeAryKlassPtr::make(PTR ptr, const Type* elem, ciKlass* k, int offset) {
5999   return (TypeAryKlassPtr*)(new TypeAryKlassPtr(ptr, elem, k, offset))->hashcons();
6000 }
6001 
6002 const TypeAryKlassPtr *TypeAryKlassPtr::make(PTR ptr, ciKlass* k, int offset, InterfaceHandling interface_handling) {
6003   if (k->is_obj_array_klass()) {
6004     // Element is an object array. Recursively call ourself.
6005     ciKlass* eklass = k->as_obj_array_klass()->element_klass();
6006     const TypeKlassPtr *etype = TypeKlassPtr::make(eklass, interface_handling)->cast_to_exactness(false);
6007     return TypeAryKlassPtr::make(ptr, etype, nullptr, offset);
6008   } else if (k->is_type_array_klass()) {
6009     // Element is an typeArray
6010     const Type* etype = get_const_basic_type(k->as_type_array_klass()->element_type());
6011     return TypeAryKlassPtr::make(ptr, etype, k, offset);
6012   } else {
6013     ShouldNotReachHere();
6014     return nullptr;
6015   }
6016 }
6017 
6018 const TypeAryKlassPtr* TypeAryKlassPtr::make(ciKlass* klass, InterfaceHandling interface_handling) {
6019   return TypeAryKlassPtr::make(Constant, klass, 0, interface_handling);
6020 }
6021 
6022 //------------------------------eq---------------------------------------------
6023 // Structural equality check for Type representations
6024 bool TypeAryKlassPtr::eq(const Type *t) const {
6025   const TypeAryKlassPtr *p = t->is_aryklassptr();
6026   return
6027     _elem == p->_elem &&  // Check array
6028     TypeKlassPtr::eq(p);  // Check sub-parts
6029 }
6030 
6031 //------------------------------hash-------------------------------------------
6032 // Type-specific hashing function.
6033 uint TypeAryKlassPtr::hash(void) const {
6034   return (uint)(uintptr_t)_elem + TypeKlassPtr::hash();
6035 }
6036 
6037 //----------------------compute_klass------------------------------------------
6038 // Compute the defining klass for this class
6039 ciKlass* TypeAryPtr::compute_klass() const {
6040   // Compute _klass based on element type.
6041   ciKlass* k_ary = nullptr;
6042   const TypeInstPtr *tinst;
6043   const TypeAryPtr *tary;
6044   const Type* el = elem();
6045   if (el->isa_narrowoop()) {
6046     el = el->make_ptr();
6047   }
6048 
6049   // Get element klass
6050   if ((tinst = el->isa_instptr()) != nullptr) {
6051     // Leave k_ary at null.
6052   } else if ((tary = el->isa_aryptr()) != nullptr) {
6053     // Leave k_ary at null.
6054   } else if ((el->base() == Type::Top) ||
6055              (el->base() == Type::Bottom)) {
6056     // element type of Bottom occurs from meet of basic type
6057     // and object; Top occurs when doing join on Bottom.
6058     // Leave k_ary at null.
6059   } else {
6060     assert(!el->isa_int(), "integral arrays must be pre-equipped with a class");
6061     // Compute array klass directly from basic type
6062     k_ary = ciTypeArrayKlass::make(el->basic_type());
6063   }
6064   return k_ary;
6065 }
6066 
6067 //------------------------------klass------------------------------------------
6068 // Return the defining klass for this class
6069 ciKlass* TypeAryPtr::klass() const {
6070   if( _klass ) return _klass;   // Return cached value, if possible
6071 
6072   // Oops, need to compute _klass and cache it
6073   ciKlass* k_ary = compute_klass();
6074 
6075   if( this != TypeAryPtr::OOPS && this->dual() != TypeAryPtr::OOPS ) {
6076     // The _klass field acts as a cache of the underlying
6077     // ciKlass for this array type.  In order to set the field,
6078     // we need to cast away const-ness.
6079     //
6080     // IMPORTANT NOTE: we *never* set the _klass field for the
6081     // type TypeAryPtr::OOPS.  This Type is shared between all
6082     // active compilations.  However, the ciKlass which represents
6083     // this Type is *not* shared between compilations, so caching
6084     // this value would result in fetching a dangling pointer.
6085     //
6086     // Recomputing the underlying ciKlass for each request is
6087     // a bit less efficient than caching, but calls to
6088     // TypeAryPtr::OOPS->klass() are not common enough to matter.
6089     ((TypeAryPtr*)this)->_klass = k_ary;
6090   }
6091   return k_ary;
6092 }
6093 
6094 // Is there a single ciKlass* that can represent that type?
6095 ciKlass* TypeAryPtr::exact_klass_helper() const {
6096   if (_ary->_elem->make_ptr() && _ary->_elem->make_ptr()->isa_oopptr()) {
6097     ciKlass* k = _ary->_elem->make_ptr()->is_oopptr()->exact_klass_helper();
6098     if (k == nullptr) {
6099       return nullptr;
6100     }
6101     k = ciObjArrayKlass::make(k);
6102     return k;
6103   }
6104 
6105   return klass();
6106 }
6107 
6108 const Type* TypeAryPtr::base_element_type(int& dims) const {
6109   const Type* elem = this->elem();
6110   dims = 1;
6111   while (elem->make_ptr() && elem->make_ptr()->isa_aryptr()) {
6112     elem = elem->make_ptr()->is_aryptr()->elem();
6113     dims++;
6114   }
6115   return elem;
6116 }
6117 
6118 //------------------------------add_offset-------------------------------------
6119 // Access internals of klass object
6120 const TypePtr* TypeAryKlassPtr::add_offset(intptr_t offset) const {
6121   return make(_ptr, elem(), klass(), xadd_offset(offset));
6122 }
6123 
6124 const TypeAryKlassPtr* TypeAryKlassPtr::with_offset(intptr_t offset) const {
6125   return make(_ptr, elem(), klass(), offset);
6126 }
6127 
6128 //------------------------------cast_to_ptr_type-------------------------------
6129 const TypeAryKlassPtr* TypeAryKlassPtr::cast_to_ptr_type(PTR ptr) const {
6130   assert(_base == AryKlassPtr, "subclass must override cast_to_ptr_type");
6131   if (ptr == _ptr) return this;
6132   return make(ptr, elem(), _klass, _offset);
6133 }
6134 
6135 bool TypeAryKlassPtr::must_be_exact() const {
6136   if (_elem == Type::BOTTOM) return false;
6137   if (_elem == Type::TOP   ) return false;
6138   const TypeKlassPtr*  tk = _elem->isa_klassptr();
6139   if (!tk)             return true;   // a primitive type, like int
6140   return tk->must_be_exact();
6141 }
6142 
6143 
6144 //-----------------------------cast_to_exactness-------------------------------
6145 const TypeKlassPtr *TypeAryKlassPtr::cast_to_exactness(bool klass_is_exact) const {
6146   if (must_be_exact()) return this;  // cannot clear xk
6147   ciKlass* k = _klass;
6148   const Type* elem = this->elem();
6149   if (elem->isa_klassptr() && !klass_is_exact) {
6150     elem = elem->is_klassptr()->cast_to_exactness(klass_is_exact);
6151   }
6152   return make(klass_is_exact ? Constant : NotNull, elem, k, _offset);
6153 }
6154 
6155 
6156 //-----------------------------as_instance_type--------------------------------
6157 // Corresponding type for an instance of the given class.
6158 // It will be NotNull, and exact if and only if the klass type is exact.
6159 const TypeOopPtr* TypeAryKlassPtr::as_instance_type(bool klass_change) const {
6160   ciKlass* k = klass();
6161   bool    xk = klass_is_exact();
6162   const Type* el = nullptr;
6163   if (elem()->isa_klassptr()) {
6164     el = elem()->is_klassptr()->as_instance_type(false)->cast_to_exactness(false);
6165     k = nullptr;
6166   } else {
6167     el = elem();
6168   }
6169   return TypeAryPtr::make(TypePtr::BotPTR, TypeAry::make(el, TypeInt::POS), k, xk, 0);
6170 }
6171 
6172 
6173 //------------------------------xmeet------------------------------------------
6174 // Compute the MEET of two types, return a new Type object.
6175 const Type    *TypeAryKlassPtr::xmeet( const Type *t ) const {
6176   // Perform a fast test for common case; meeting the same types together.
6177   if( this == t ) return this;  // Meeting same type-rep?
6178 
6179   // Current "this->_base" is Pointer
6180   switch (t->base()) {          // switch on original type
6181 
6182   case Int:                     // Mixing ints & oops happens when javac
6183   case Long:                    // reuses local variables
6184   case HalfFloatTop:
6185   case HalfFloatCon:
6186   case HalfFloatBot:
6187   case FloatTop:
6188   case FloatCon:
6189   case FloatBot:
6190   case DoubleTop:
6191   case DoubleCon:
6192   case DoubleBot:
6193   case NarrowOop:
6194   case NarrowKlass:
6195   case Bottom:                  // Ye Olde Default
6196     return Type::BOTTOM;
6197   case Top:
6198     return this;
6199 
6200   default:                      // All else is a mistake
6201     typerr(t);
6202 
6203   case AnyPtr: {                // Meeting to AnyPtrs
6204     // Found an AnyPtr type vs self-KlassPtr type
6205     const TypePtr *tp = t->is_ptr();
6206     int offset = meet_offset(tp->offset());
6207     PTR ptr = meet_ptr(tp->ptr());
6208     switch (tp->ptr()) {
6209     case TopPTR:
6210       return this;
6211     case Null:
6212       if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset, tp->speculative(), tp->inline_depth());
6213     case AnyNull:
6214       return make( ptr, _elem, klass(), offset );
6215     case BotPTR:
6216     case NotNull:
6217       return TypePtr::make(AnyPtr, ptr, offset, tp->speculative(), tp->inline_depth());
6218     default: typerr(t);
6219     }
6220   }
6221 
6222   case RawPtr:
6223   case MetadataPtr:
6224   case OopPtr:
6225   case AryPtr:                  // Meet with AryPtr
6226   case InstPtr:                 // Meet with InstPtr
6227     return TypePtr::BOTTOM;
6228 
6229   //
6230   //             A-top         }
6231   //           /   |   \       }  Tops
6232   //       B-top A-any C-top   }
6233   //          | /  |  \ |      }  Any-nulls
6234   //       B-any   |   C-any   }
6235   //          |    |    |
6236   //       B-con A-con C-con   } constants; not comparable across classes
6237   //          |    |    |
6238   //       B-not   |   C-not   }
6239   //          | \  |  / |      }  not-nulls
6240   //       B-bot A-not C-bot   }
6241   //           \   |   /       }  Bottoms
6242   //             A-bot         }
6243   //
6244 
6245   case AryKlassPtr: {  // Meet two KlassPtr types
6246     const TypeAryKlassPtr *tap = t->is_aryklassptr();
6247     int off = meet_offset(tap->offset());
6248     const Type* elem = _elem->meet(tap->_elem);
6249 
6250     PTR ptr = meet_ptr(tap->ptr());
6251     ciKlass* res_klass = nullptr;
6252     bool res_xk = false;
6253     meet_aryptr(ptr, elem, this, tap, res_klass, res_xk);
6254     assert(res_xk == (ptr == Constant), "");
6255     return make(ptr, elem, res_klass, off);
6256   } // End of case KlassPtr
6257   case InstKlassPtr: {
6258     const TypeInstKlassPtr *tp = t->is_instklassptr();
6259     int offset = meet_offset(tp->offset());
6260     PTR ptr = meet_ptr(tp->ptr());
6261     const TypeInterfaces* interfaces = meet_interfaces(tp);
6262     const TypeInterfaces* tp_interfaces = tp->_interfaces;
6263     const TypeInterfaces* this_interfaces = _interfaces;
6264 
6265     switch (ptr) {
6266     case TopPTR:
6267     case AnyNull:                // Fall 'down' to dual of object klass
6268       // For instances when a subclass meets a superclass we fall
6269       // below the centerline when the superclass is exact. We need to
6270       // do the same here.
6271       if (tp->klass()->equals(ciEnv::current()->Object_klass()) && this_interfaces->contains(tp_interfaces) &&
6272           !tp->klass_is_exact()) {
6273         return TypeAryKlassPtr::make(ptr, _elem, _klass, offset);
6274       } else {
6275         // cannot subclass, so the meet has to fall badly below the centerline
6276         ptr = NotNull;
6277         interfaces = this_interfaces->intersection_with(tp->_interfaces);
6278         return TypeInstKlassPtr::make(ptr, ciEnv::current()->Object_klass(), interfaces, offset);
6279       }
6280     case Constant:
6281     case NotNull:
6282     case BotPTR:                // Fall down to object klass
6283       // LCA is object_klass, but if we subclass from the top we can do better
6284       if (above_centerline(tp->ptr())) {
6285         // If 'tp'  is above the centerline and it is Object class
6286         // then we can subclass in the Java class hierarchy.
6287         // For instances when a subclass meets a superclass we fall
6288         // below the centerline when the superclass is exact. We need
6289         // to do the same here.
6290         if (tp->klass()->equals(ciEnv::current()->Object_klass()) && this_interfaces->contains(tp_interfaces) &&
6291             !tp->klass_is_exact()) {
6292           // that is, my array type is a subtype of 'tp' klass
6293           return make(ptr, _elem, _klass, offset);
6294         }
6295       }
6296       // The other case cannot happen, since t cannot be a subtype of an array.
6297       // The meet falls down to Object class below centerline.
6298       if (ptr == Constant)
6299          ptr = NotNull;
6300       interfaces = this_interfaces->intersection_with(tp_interfaces);
6301       return TypeInstKlassPtr::make(ptr, ciEnv::current()->Object_klass(), interfaces, offset);
6302     default: typerr(t);
6303     }
6304   }
6305 
6306   } // End of switch
6307   return this;                  // Return the double constant
6308 }
6309 
6310 template <class T1, class T2> bool TypePtr::is_java_subtype_of_helper_for_array(const T1* this_one, const T2* other, bool this_exact, bool other_exact) {
6311   static_assert(std::is_base_of<T2, T1>::value, "");
6312 
6313   if (other->klass() == ciEnv::current()->Object_klass() && other->_interfaces->empty() && other_exact) {
6314     return true;
6315   }
6316 
6317   int dummy;
6318   bool this_top_or_bottom = (this_one->base_element_type(dummy) == Type::TOP || this_one->base_element_type(dummy) == Type::BOTTOM);
6319 
6320   if (!this_one->is_loaded() || !other->is_loaded() || this_top_or_bottom) {
6321     return false;
6322   }
6323 
6324   if (this_one->is_instance_type(other)) {
6325     return other->klass() == ciEnv::current()->Object_klass() && this_one->_interfaces->contains(other->_interfaces) &&
6326            other_exact;
6327   }
6328 
6329   assert(this_one->is_array_type(other), "");
6330   const T1* other_ary = this_one->is_array_type(other);
6331   bool other_top_or_bottom = (other_ary->base_element_type(dummy) == Type::TOP || other_ary->base_element_type(dummy) == Type::BOTTOM);
6332   if (other_top_or_bottom) {
6333     return false;
6334   }
6335 
6336   const TypePtr* other_elem = other_ary->elem()->make_ptr();
6337   const TypePtr* this_elem = this_one->elem()->make_ptr();
6338   if (this_elem != nullptr && other_elem != nullptr) {
6339     return this_one->is_reference_type(this_elem)->is_java_subtype_of_helper(this_one->is_reference_type(other_elem), this_exact, other_exact);
6340   }
6341   if (this_elem == nullptr && other_elem == nullptr) {
6342     return this_one->klass()->is_subtype_of(other->klass());
6343   }
6344   return false;
6345 }
6346 
6347 bool TypeAryKlassPtr::is_java_subtype_of_helper(const TypeKlassPtr* other, bool this_exact, bool other_exact) const {
6348   return TypePtr::is_java_subtype_of_helper_for_array(this, other, this_exact, other_exact);
6349 }
6350 
6351 template <class T1, class T2> bool TypePtr::is_same_java_type_as_helper_for_array(const T1* this_one, const T2* other) {
6352   static_assert(std::is_base_of<T2, T1>::value, "");
6353 
6354   int dummy;
6355   bool this_top_or_bottom = (this_one->base_element_type(dummy) == Type::TOP || this_one->base_element_type(dummy) == Type::BOTTOM);
6356 
6357   if (!this_one->is_array_type(other) ||
6358       !this_one->is_loaded() || !other->is_loaded() || this_top_or_bottom) {
6359     return false;
6360   }
6361   const T1* other_ary = this_one->is_array_type(other);
6362   bool other_top_or_bottom = (other_ary->base_element_type(dummy) == Type::TOP || other_ary->base_element_type(dummy) == Type::BOTTOM);
6363 
6364   if (other_top_or_bottom) {
6365     return false;
6366   }
6367 
6368   const TypePtr* other_elem = other_ary->elem()->make_ptr();
6369   const TypePtr* this_elem = this_one->elem()->make_ptr();
6370   if (other_elem != nullptr && this_elem != nullptr) {
6371     return this_one->is_reference_type(this_elem)->is_same_java_type_as(this_one->is_reference_type(other_elem));
6372   }
6373   if (other_elem == nullptr && this_elem == nullptr) {
6374     return this_one->klass()->equals(other->klass());
6375   }
6376   return false;
6377 }
6378 
6379 bool TypeAryKlassPtr::is_same_java_type_as_helper(const TypeKlassPtr* other) const {
6380   return TypePtr::is_same_java_type_as_helper_for_array(this, other);
6381 }
6382 
6383 template <class T1, class T2> bool TypePtr::maybe_java_subtype_of_helper_for_array(const T1* this_one, const T2* other, bool this_exact, bool other_exact) {
6384   static_assert(std::is_base_of<T2, T1>::value, "");
6385   if (other->klass() == ciEnv::current()->Object_klass() && other->_interfaces->empty() && other_exact) {
6386     return true;
6387   }
6388   if (!this_one->is_loaded() || !other->is_loaded()) {
6389     return true;
6390   }
6391   if (this_one->is_instance_type(other)) {
6392     return other->klass()->equals(ciEnv::current()->Object_klass()) &&
6393            this_one->_interfaces->contains(other->_interfaces);
6394   }
6395 
6396   int dummy;
6397   bool this_top_or_bottom = (this_one->base_element_type(dummy) == Type::TOP || this_one->base_element_type(dummy) == Type::BOTTOM);
6398   if (this_top_or_bottom) {
6399     return true;
6400   }
6401 
6402   assert(this_one->is_array_type(other), "");
6403 
6404   const T1* other_ary = this_one->is_array_type(other);
6405   bool other_top_or_bottom = (other_ary->base_element_type(dummy) == Type::TOP || other_ary->base_element_type(dummy) == Type::BOTTOM);
6406   if (other_top_or_bottom) {
6407     return true;
6408   }
6409   if (this_exact && other_exact) {
6410     return this_one->is_java_subtype_of(other);
6411   }
6412 
6413   const TypePtr* this_elem = this_one->elem()->make_ptr();
6414   const TypePtr* other_elem = other_ary->elem()->make_ptr();
6415   if (other_elem != nullptr && this_elem != nullptr) {
6416     return this_one->is_reference_type(this_elem)->maybe_java_subtype_of_helper(this_one->is_reference_type(other_elem), this_exact, other_exact);
6417   }
6418   if (other_elem == nullptr && this_elem == nullptr) {
6419     return this_one->klass()->is_subtype_of(other->klass());
6420   }
6421   return false;
6422 }
6423 
6424 bool TypeAryKlassPtr::maybe_java_subtype_of_helper(const TypeKlassPtr* other, bool this_exact, bool other_exact) const {
6425   return TypePtr::maybe_java_subtype_of_helper_for_array(this, other, this_exact, other_exact);
6426 }
6427 
6428 //------------------------------xdual------------------------------------------
6429 // Dual: compute field-by-field dual
6430 const Type    *TypeAryKlassPtr::xdual() const {
6431   return new TypeAryKlassPtr(dual_ptr(), elem()->dual(), klass(), dual_offset());
6432 }
6433 
6434 // Is there a single ciKlass* that can represent that type?
6435 ciKlass* TypeAryKlassPtr::exact_klass_helper() const {
6436   if (elem()->isa_klassptr()) {
6437     ciKlass* k = elem()->is_klassptr()->exact_klass_helper();
6438     if (k == nullptr) {
6439       return nullptr;
6440     }
6441     k = ciObjArrayKlass::make(k);
6442     return k;
6443   }
6444 
6445   return klass();
6446 }
6447 
6448 ciKlass* TypeAryKlassPtr::klass() const {
6449   if (_klass != nullptr) {
6450     return _klass;
6451   }
6452   ciKlass* k = nullptr;
6453   if (elem()->isa_klassptr()) {
6454     // leave null
6455   } else if ((elem()->base() == Type::Top) ||
6456              (elem()->base() == Type::Bottom)) {
6457   } else {
6458     k = ciTypeArrayKlass::make(elem()->basic_type());
6459     ((TypeAryKlassPtr*)this)->_klass = k;
6460   }
6461   return k;
6462 }
6463 
6464 //------------------------------dump2------------------------------------------
6465 // Dump Klass Type
6466 #ifndef PRODUCT
6467 void TypeAryKlassPtr::dump2( Dict & d, uint depth, outputStream *st ) const {
6468   st->print("aryklassptr:[");
6469   _elem->dump2(d, depth, st);
6470   _interfaces->dump(st);
6471   st->print(":%s", ptr_msg[_ptr]);
6472   dump_offset(st);
6473 }
6474 #endif
6475 
6476 const Type* TypeAryKlassPtr::base_element_type(int& dims) const {
6477   const Type* elem = this->elem();
6478   dims = 1;
6479   while (elem->isa_aryklassptr()) {
6480     elem = elem->is_aryklassptr()->elem();
6481     dims++;
6482   }
6483   return elem;
6484 }
6485 
6486 //=============================================================================
6487 // Convenience common pre-built types.
6488 
6489 //------------------------------make-------------------------------------------
6490 const TypeFunc *TypeFunc::make( const TypeTuple *domain, const TypeTuple *range ) {
6491   return (TypeFunc*)(new TypeFunc(domain,range))->hashcons();
6492 }
6493 
6494 //------------------------------make-------------------------------------------
6495 const TypeFunc *TypeFunc::make(ciMethod* method) {
6496   Compile* C = Compile::current();
6497   const TypeFunc* tf = C->last_tf(method); // check cache
6498   if (tf != nullptr)  return tf;  // The hit rate here is almost 50%.
6499   const TypeTuple *domain;
6500   if (method->is_static()) {
6501     domain = TypeTuple::make_domain(nullptr, method->signature(), ignore_interfaces);
6502   } else {
6503     domain = TypeTuple::make_domain(method->holder(), method->signature(), ignore_interfaces);
6504   }
6505   const TypeTuple *range  = TypeTuple::make_range(method->signature(), ignore_interfaces);
6506   tf = TypeFunc::make(domain, range);
6507   C->set_last_tf(method, tf);  // fill cache
6508   return tf;
6509 }
6510 
6511 //------------------------------meet-------------------------------------------
6512 // Compute the MEET of two types.  It returns a new Type object.
6513 const Type *TypeFunc::xmeet( const Type *t ) const {
6514   // Perform a fast test for common case; meeting the same types together.
6515   if( this == t ) return this;  // Meeting same type-rep?
6516 
6517   // Current "this->_base" is Func
6518   switch (t->base()) {          // switch on original type
6519 
6520   case Bottom:                  // Ye Olde Default
6521     return t;
6522 
6523   default:                      // All else is a mistake
6524     typerr(t);
6525 
6526   case Top:
6527     break;
6528   }
6529   return this;                  // Return the double constant
6530 }
6531 
6532 //------------------------------xdual------------------------------------------
6533 // Dual: compute field-by-field dual
6534 const Type *TypeFunc::xdual() const {
6535   return this;
6536 }
6537 
6538 //------------------------------eq---------------------------------------------
6539 // Structural equality check for Type representations
6540 bool TypeFunc::eq( const Type *t ) const {
6541   const TypeFunc *a = (const TypeFunc*)t;
6542   return _domain == a->_domain &&
6543     _range == a->_range;
6544 }
6545 
6546 //------------------------------hash-------------------------------------------
6547 // Type-specific hashing function.
6548 uint TypeFunc::hash(void) const {
6549   return (uint)(uintptr_t)_domain + (uint)(uintptr_t)_range;
6550 }
6551 
6552 //------------------------------dump2------------------------------------------
6553 // Dump Function Type
6554 #ifndef PRODUCT
6555 void TypeFunc::dump2( Dict &d, uint depth, outputStream *st ) const {
6556   if( _range->cnt() <= Parms )
6557     st->print("void");
6558   else {
6559     uint i;
6560     for (i = Parms; i < _range->cnt()-1; i++) {
6561       _range->field_at(i)->dump2(d,depth,st);
6562       st->print("/");
6563     }
6564     _range->field_at(i)->dump2(d,depth,st);
6565   }
6566   st->print(" ");
6567   st->print("( ");
6568   if( !depth || d[this] ) {     // Check for recursive dump
6569     st->print("...)");
6570     return;
6571   }
6572   d.Insert((void*)this,(void*)this);    // Stop recursion
6573   if (Parms < _domain->cnt())
6574     _domain->field_at(Parms)->dump2(d,depth-1,st);
6575   for (uint i = Parms+1; i < _domain->cnt(); i++) {
6576     st->print(", ");
6577     _domain->field_at(i)->dump2(d,depth-1,st);
6578   }
6579   st->print(" )");
6580 }
6581 #endif
6582 
6583 //------------------------------singleton--------------------------------------
6584 // TRUE if Type is a singleton type, FALSE otherwise.   Singletons are simple
6585 // constants (Ldi nodes).  Singletons are integer, float or double constants
6586 // or a single symbol.
6587 bool TypeFunc::singleton(void) const {
6588   return false;                 // Never a singleton
6589 }
6590 
6591 bool TypeFunc::empty(void) const {
6592   return false;                 // Never empty
6593 }
6594 
6595 
6596 BasicType TypeFunc::return_type() const{
6597   if (range()->cnt() == TypeFunc::Parms) {
6598     return T_VOID;
6599   }
6600   return range()->field_at(TypeFunc::Parms)->basic_type();
6601 }