< prev index next >

src/hotspot/share/ci/ciConstant.cpp

Print this page
@@ -1,7 +1,7 @@
  /*
-  * Copyright (c) 1999, 2025, Oracle and/or its affiliates. All rights reserved.
+  * Copyright (c) 1999, 2026, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

@@ -29,12 +29,33 @@
  
  // ciConstant
  //
  // This class represents a constant value.
  
+ ciConstant ciConstant::make_zero_or_null(BasicType bt) {
+   switch (bt) {
+   case T_FLOAT: return ciConstant((jfloat).0f);
+   case T_DOUBLE: return ciConstant((jdouble).0);
+   case T_LONG: return ciConstant((jlong)0L);
+   case T_BOOLEAN:
+   case T_CHAR:
+   case T_BYTE:
+   case T_SHORT:
+   case T_INT:
+     return ciConstant(bt, 0);
+   case T_OBJECT:
+   case T_ARRAY:
+     return ciConstant(bt, CURRENT_ENV->get_object(nullptr));
+   default:
+     ShouldNotReachHere();
+     return ciConstant();
+   }
+ }
+ 
  // ------------------------------------------------------------------
  // ciConstant::is_null_or_zero
+ // This assumes `this->is_valid()`, otherwise, `as_object` will assert.
  bool ciConstant::is_null_or_zero() const {
    if (!is_java_primitive(basic_type())) {
      return as_object()->is_null_object();
    } else if (type2size[basic_type()] == 1) {
      // treat float bits as int, to avoid comparison with -0 and NaN

@@ -60,11 +81,11 @@
    return false;
  }
  
  // ------------------------------------------------------------------
  // ciConstant::print
- void ciConstant::print() {
+ void ciConstant::print() const {
    tty->print("<ciConstant type=%s value=",
               basictype_to_str(basic_type()));
    switch (basic_type()) {
    case T_BOOLEAN:
      tty->print("%s", bool_to_str(_value._int != 0));
< prev index next >