< prev index next >

src/hotspot/share/c1/c1_GraphBuilder.cpp

Print this page

   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 "c1/c1_Canonicalizer.hpp"
  26 #include "c1/c1_CFGPrinter.hpp"
  27 #include "c1/c1_Compilation.hpp"
  28 #include "c1/c1_GraphBuilder.hpp"

  29 #include "c1/c1_InstructionPrinter.hpp"

  30 #include "ci/ciCallSite.hpp"
  31 #include "ci/ciField.hpp"


  32 #include "ci/ciKlass.hpp"
  33 #include "ci/ciMemberName.hpp"
  34 #include "ci/ciSymbols.hpp"
  35 #include "ci/ciUtilities.inline.hpp"
  36 #include "classfile/javaClasses.hpp"
  37 #include "compiler/compilationPolicy.hpp"
  38 #include "compiler/compileBroker.hpp"
  39 #include "compiler/compilerEvent.hpp"
  40 #include "interpreter/bytecode.hpp"
  41 #include "jfr/jfrEvents.hpp"
  42 #include "memory/resourceArea.hpp"

  43 #include "runtime/sharedRuntime.hpp"
  44 #include "utilities/checkedCast.hpp"
  45 #include "utilities/macros.hpp"
  46 #if INCLUDE_JFR
  47 #include "jfr/jfr.hpp"
  48 #endif
  49 
  50 class BlockListBuilder {
  51  private:
  52   Compilation* _compilation;
  53   IRScope*     _scope;
  54 
  55   BlockList    _blocks;                // internal list of all blocks
  56   BlockList*   _bci2block;             // mapping from bci to blocks for GraphBuilder
  57   GrowableArray<BlockList> _bci2block_successors; // Mapping bcis to their blocks successors while we dont have a blockend
  58 
  59   // fields used by mark_loops
  60   ResourceBitMap _active;              // for iteration of control flow graph
  61   ResourceBitMap _visited;             // for iteration of control flow graph
  62   GrowableArray<ResourceBitMap> _loop_map; // caches the information if a block is contained in a loop

1028 
1029       // Also check parent jsrs (if any) at this time to see whether
1030       // they are using this local. We don't handle skipping over a
1031       // ret.
1032       for (ScopeData* cur_scope_data = scope_data()->parent();
1033            cur_scope_data != nullptr && cur_scope_data->parsing_jsr() && cur_scope_data->scope() == scope();
1034            cur_scope_data = cur_scope_data->parent()) {
1035         if (cur_scope_data->jsr_return_address_local() == index) {
1036           BAILOUT("subroutine overwrites return address from previous subroutine");
1037         }
1038       }
1039     } else if (index == scope_data()->jsr_return_address_local()) {
1040       scope_data()->set_jsr_return_address_local(-1);
1041     }
1042   }
1043 
1044   state->store_local(index, x);
1045 }
1046 
1047 










1048 void GraphBuilder::load_indexed(BasicType type) {
1049   // In case of in block code motion in range check elimination
1050   ValueStack* state_before = copy_state_indexed_access();

1051   compilation()->set_has_access_indexed(true);
1052   Value index = ipop();
1053   Value array = apop();
1054   Value length = nullptr;
1055   if (CSEArrayLength ||
1056       (array->as_Constant() != nullptr) ||
1057       (array->as_AccessField() && array->as_AccessField()->field()->is_constant()) ||
1058       (array->as_NewArray() && array->as_NewArray()->length() && array->as_NewArray()->length()->type()->is_constant()) ||
1059       (array->as_NewMultiArray() && array->as_NewMultiArray()->dims()->at(0)->type()->is_constant())) {
1060     length = append(new ArrayLength(array, state_before));
1061   }
1062   push(as_ValueType(type), append(new LoadIndexed(array, index, length, type, state_before)));

























































1063 }
1064 
1065 
1066 void GraphBuilder::store_indexed(BasicType type) {
1067   // In case of in block code motion in range check elimination
1068   ValueStack* state_before = copy_state_indexed_access();

1069   compilation()->set_has_access_indexed(true);
1070   Value value = pop(as_ValueType(type));
1071   Value index = ipop();
1072   Value array = apop();
1073   Value length = nullptr;
1074   if (CSEArrayLength ||
1075       (array->as_Constant() != nullptr) ||
1076       (array->as_AccessField() && array->as_AccessField()->field()->is_constant()) ||
1077       (array->as_NewArray() && array->as_NewArray()->length() && array->as_NewArray()->length()->type()->is_constant()) ||
1078       (array->as_NewMultiArray() && array->as_NewMultiArray()->dims()->at(0)->type()->is_constant())) {
1079     length = append(new ArrayLength(array, state_before));
1080   }
1081   ciType* array_type = array->declared_type();
1082   bool check_boolean = false;
1083   if (array_type != nullptr) {
1084     if (array_type->is_loaded() &&
1085       array_type->as_array_klass()->element_type()->basic_type() == T_BOOLEAN) {
1086       assert(type == T_BYTE, "boolean store uses bastore");
1087       Value mask = append(new Constant(new IntConstant(1)));
1088       value = append(new LogicOp(Bytecodes::_iand, value, mask));
1089     }
1090   } else if (type == T_BYTE) {
1091     check_boolean = true;
1092   }
1093   StoreIndexed* result = new StoreIndexed(array, index, length, type, value, state_before, check_boolean);
1094   append(result);
1095   _memory->store_value(value);
1096 
1097   if (type == T_OBJECT && is_profiling()) {
1098     // Note that we'd collect profile data in this method if we wanted it.
1099     compilation()->set_would_profile(true);
1100 
1101     if (profile_checkcasts()) {
1102       result->set_profiled_method(method());
1103       result->set_profiled_bci(bci());
1104       result->set_should_profile(true);
1105     }
1106   }



1107 }
1108 
1109 
1110 void GraphBuilder::stack_op(Bytecodes::Code code) {
1111   switch (code) {
1112     case Bytecodes::_pop:
1113       { state()->raw_pop();
1114       }
1115       break;
1116     case Bytecodes::_pop2:
1117       { state()->raw_pop();
1118         state()->raw_pop();
1119       }
1120       break;
1121     case Bytecodes::_dup:
1122       { Value w = state()->raw_pop();
1123         state()->raw_push(w);
1124         state()->raw_push(w);
1125       }
1126       break;
1127     case Bytecodes::_dup_x1:
1128       { Value w1 = state()->raw_pop();
1129         Value w2 = state()->raw_pop();

1274 
1275 
1276 void GraphBuilder::_goto(int from_bci, int to_bci) {
1277   Goto *x = new Goto(block_at(to_bci), to_bci <= from_bci);
1278   if (is_profiling()) {
1279     compilation()->set_would_profile(true);
1280     x->set_profiled_bci(bci());
1281     if (profile_branches()) {
1282       x->set_profiled_method(method());
1283       x->set_should_profile(true);
1284     }
1285   }
1286   append(x);
1287 }
1288 
1289 
1290 void GraphBuilder::if_node(Value x, If::Condition cond, Value y, ValueStack* state_before) {
1291   BlockBegin* tsux = block_at(stream()->get_dest());
1292   BlockBegin* fsux = block_at(stream()->next_bci());
1293   bool is_bb = tsux->bci() < stream()->cur_bci() || fsux->bci() < stream()->cur_bci();



























1294   // In case of loop invariant code motion or predicate insertion
1295   // before the body of a loop the state is needed
1296   Instruction *i = append(new If(x, cond, false, y, tsux, fsux, (is_bb || compilation()->is_optimistic()) ? state_before : nullptr, is_bb));
1297 
1298   assert(i->as_Goto() == nullptr ||
1299          (i->as_Goto()->sux_at(0) == tsux  && i->as_Goto()->is_safepoint() == (tsux->bci() < stream()->cur_bci())) ||
1300          (i->as_Goto()->sux_at(0) == fsux  && i->as_Goto()->is_safepoint() == (fsux->bci() < stream()->cur_bci())),
1301          "safepoint state of Goto returned by canonicalizer incorrect");
1302 
1303   if (is_profiling()) {
1304     If* if_node = i->as_If();
1305     if (if_node != nullptr) {
1306       // Note that we'd collect profile data in this method if we wanted it.
1307       compilation()->set_would_profile(true);
1308       // At level 2 we need the proper bci to count backedges
1309       if_node->set_profiled_bci(bci());
1310       if (profile_branches()) {
1311         // Successors can be rotated by the canonicalizer, check for this case.
1312         if_node->set_profiled_method(method());
1313         if_node->set_should_profile(true);
1314         if (if_node->tsux() == fsux) {
1315           if_node->set_swapped(true);
1316         }

1531   }
1532 
1533   if (needs_check) {
1534     // Perform the registration of finalizable objects.
1535     ValueStack* state_before = copy_state_for_exception();
1536     load_local(objectType, 0);
1537     append_split(new Intrinsic(voidType, vmIntrinsics::_Object_init,
1538                                state()->pop_arguments(1),
1539                                true, state_before, true));
1540   }
1541 }
1542 
1543 
1544 void GraphBuilder::method_return(Value x, bool ignore_return) {
1545   if (method()->intrinsic_id() == vmIntrinsics::_Object_init) {
1546     call_register_finalizer();
1547   }
1548 
1549   // The conditions for a memory barrier are described in Parse::do_exits().
1550   bool need_mem_bar = false;
1551   if (method()->name() == ciSymbols::object_initializer_name() &&
1552        (scope()->wrote_final() || scope()->wrote_stable() ||
1553          (AlwaysSafeConstructors && scope()->wrote_fields()) ||
1554          (support_IRIW_for_not_multiple_copy_atomic_cpu && scope()->wrote_volatile()))) {
1555     need_mem_bar = true;
1556   }
1557 
1558   BasicType bt = method()->return_type()->basic_type();
1559   switch (bt) {
1560     case T_BYTE:
1561     {
1562       Value shift = append(new Constant(new IntConstant(24)));
1563       x = append(new ShiftOp(Bytecodes::_ishl, x, shift));
1564       x = append(new ShiftOp(Bytecodes::_ishr, x, shift));
1565       break;
1566     }
1567     case T_SHORT:
1568     {
1569       Value shift = append(new Constant(new IntConstant(16)));
1570       x = append(new ShiftOp(Bytecodes::_ishl, x, shift));
1571       x = append(new ShiftOp(Bytecodes::_ishr, x, shift));
1572       break;

1682   // Attach dimension info to stable arrays.
1683   if (FoldStableValues &&
1684       field->is_stable() && field_type == T_ARRAY && !field_value.is_null_or_zero()) {
1685     ciArray* array = field_value.as_object()->as_array();
1686     jint dimension = field->type()->as_array_klass()->dimension();
1687     value = new StableArrayConstant(array, dimension);
1688   }
1689 
1690   switch (field_type) {
1691     case T_ARRAY:
1692     case T_OBJECT:
1693       if (field_value.as_object()->should_be_constant()) {
1694         return new Constant(value);
1695       }
1696       return nullptr; // Not a constant.
1697     default:
1698       return new Constant(value);
1699   }
1700 }
1701 























1702 void GraphBuilder::access_field(Bytecodes::Code code) {
1703   bool will_link;
1704   ciField* field = stream()->get_field(will_link);
1705   ciInstanceKlass* holder = field->holder();
1706   BasicType field_type = field->type()->basic_type();
1707   ValueType* type = as_ValueType(field_type);

1708   // call will_link again to determine if the field is valid.
1709   const bool needs_patching = !holder->is_loaded() ||
1710                               !field->will_link(method(), code) ||
1711                               PatchALot;
1712 
1713   ValueStack* state_before = nullptr;
1714   if (!holder->is_initialized() || needs_patching) {
1715     // save state before instruction for debug info when
1716     // deoptimization happens during patching
1717     state_before = copy_state_before();
1718   }
1719 
1720   Value obj = nullptr;
1721   if (code == Bytecodes::_getstatic || code == Bytecodes::_putstatic) {
1722     if (state_before != nullptr) {
1723       // build a patching constant
1724       obj = new Constant(new InstanceConstant(holder->java_mirror()), state_before);
1725     } else {
1726       obj = new Constant(new InstanceConstant(holder->java_mirror()));
1727     }
1728   }
1729 
1730   if (code == Bytecodes::_putfield) {
1731     scope()->set_wrote_fields();
1732     if (field->is_volatile()) {
1733       scope()->set_wrote_volatile();
1734     }
1735     if (field->is_final()) {
1736       scope()->set_wrote_final();
1737     }
1738     if (field->is_stable()) {
1739       scope()->set_wrote_stable();
1740     }
1741   }
1742 
1743   const int offset = !needs_patching ? field->offset_in_bytes() : -1;
1744   switch (code) {
1745     case Bytecodes::_getstatic: {
1746       // check for compile-time constants, i.e., initialized static final fields
1747       Value constant = nullptr;
1748       if (field->is_static_constant() && !PatchALot) {
1749         ciConstant field_value = field->constant_value();
1750         assert(!field->is_stable() || !field_value.is_null_or_zero(),
1751                "stable static w/ default value shouldn't be a constant");
1752         constant = make_constant(field_value, field);
1753       }
1754       if (constant != nullptr) {
1755         push(type, append(constant));
1756       } else {
1757         if (state_before == nullptr) {
1758           state_before = copy_state_for_exception();
1759         }
1760         push(type, append(new LoadField(append(obj), offset, field, true,
1761                                         state_before, needs_patching)));

1762       }
1763       break;
1764     }
1765     case Bytecodes::_putstatic: {
1766       Value val = pop(type);
1767       if (state_before == nullptr) {
1768         state_before = copy_state_for_exception();
1769       }
1770       if (field->type()->basic_type() == T_BOOLEAN) {
1771         Value mask = append(new Constant(new IntConstant(1)));
1772         val = append(new LogicOp(Bytecodes::_iand, val, mask));
1773       }









1774       append(new StoreField(append(obj), offset, field, val, true, state_before, needs_patching));
1775       break;
1776     }
1777     case Bytecodes::_getfield: {
1778       // Check for compile-time constants, i.e., trusted final non-static fields.
1779       Value constant = nullptr;
1780       obj = apop();
1781       ObjectType* obj_type = obj->type()->as_ObjectType();
1782       if (field->is_constant() && obj_type->is_constant() && !PatchALot) {
1783         ciObject* const_oop = obj_type->constant_value();
1784         if (!const_oop->is_null_object() && const_oop->is_loaded()) {
1785           ciConstant field_value = field->constant_value_of(const_oop);
1786           if (field_value.is_valid()) {
1787             constant = make_constant(field_value, field);
1788             // For CallSite objects add a dependency for invalidation of the optimization.
1789             if (field->is_call_site_target()) {
1790               ciCallSite* call_site = const_oop->as_call_site();
1791               if (!call_site->is_fully_initialized_constant_call_site()) {
1792                 ciMethodHandle* target = field_value.as_object()->as_method_handle();
1793                 dependency_recorder()->assert_call_site_target_value(call_site, target);







1794               }
1795             }
1796           }
1797         }
1798       }
1799       if (constant != nullptr) {
1800         push(type, append(constant));
1801       } else {
1802         if (state_before == nullptr) {
1803           state_before = copy_state_for_exception();
1804         }
1805         LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching);
1806         Value replacement = !needs_patching ? _memory->load(load) : load;
1807         if (replacement != load) {
1808           assert(replacement->is_linked() || !replacement->can_be_linked(), "should already by linked");
1809           // Writing an (integer) value to a boolean, byte, char or short field includes an implicit narrowing
1810           // conversion. Emit an explicit conversion here to get the correct field value after the write.
1811           BasicType bt = field->type()->basic_type();
1812           switch (bt) {
1813           case T_BOOLEAN:
1814           case T_BYTE:
1815             replacement = append(new Convert(Bytecodes::_i2b, replacement, as_ValueType(bt)));
1816             break;
1817           case T_CHAR:
1818             replacement = append(new Convert(Bytecodes::_i2c, replacement, as_ValueType(bt)));
1819             break;
1820           case T_SHORT:
1821             replacement = append(new Convert(Bytecodes::_i2s, replacement, as_ValueType(bt)));
1822             break;
1823           default:
1824             break;
1825           }
1826           push(type, replacement);























1827         } else {
1828           push(type, append(load));

































































































1829         }
1830       }
1831       break;
1832     }
1833     case Bytecodes::_putfield: {
1834       Value val = pop(type);
1835       obj = apop();
1836       if (state_before == nullptr) {
1837         state_before = copy_state_for_exception();
1838       }
1839       if (field->type()->basic_type() == T_BOOLEAN) {
1840         Value mask = append(new Constant(new IntConstant(1)));
1841         val = append(new LogicOp(Bytecodes::_iand, val, mask));
1842       }
1843       StoreField* store = new StoreField(obj, offset, field, val, false, state_before, needs_patching);
1844       if (!needs_patching) store = _memory->store(store);
1845       if (store != nullptr) {
1846         append(store);











































1847       }
1848       break;
1849     }
1850     default:
1851       ShouldNotReachHere();
1852       break;
1853   }
1854 }
1855 
1856 
1857 Dependencies* GraphBuilder::dependency_recorder() const {
1858   return compilation()->dependency_recorder();
1859 }
1860 
1861 // How many arguments do we want to profile?
1862 Values* GraphBuilder::args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver) {
1863   int n = 0;
1864   bool has_receiver = may_have_receiver && Bytecodes::has_receiver(method()->java_code_at_bci(bci()));
1865   start = has_receiver ? 1 : 0;
1866   if (profile_arguments()) {
1867     ciProfileData* data = method()->method_data()->bci_to_data(bci());
1868     if (data != nullptr && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) {
1869       n = data->is_CallTypeData() ? data->as_CallTypeData()->number_of_arguments() : data->as_VirtualCallTypeData()->number_of_arguments();
1870     }
1871   }
1872   // If we are inlining then we need to collect arguments to profile parameters for the target
1873   if (profile_parameters() && target != nullptr) {
1874     if (target->method_data() != nullptr && target->method_data()->parameters_type_data() != nullptr) {
1875       // The receiver is profiled on method entry so it's included in
1876       // the number of parameters but here we're only interested in

1952       break;
1953     case Bytecodes::_invokehandle:
1954       code = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokespecial;
1955       break;
1956     default:
1957       break;
1958     }
1959   } else {
1960     if (bc_raw == Bytecodes::_invokehandle) {
1961       assert(!will_link, "should come here only for unlinked call");
1962       code = Bytecodes::_invokespecial;
1963     }
1964   }
1965 
1966   if (code == Bytecodes::_invokespecial) {
1967     // Additional receiver subtype checks for interface calls via invokespecial or invokeinterface.
1968     ciKlass* receiver_constraint = nullptr;
1969 
1970     if (bc_raw == Bytecodes::_invokeinterface) {
1971       receiver_constraint = holder;
1972     } else if (bc_raw == Bytecodes::_invokespecial && !target->is_object_initializer() && calling_klass->is_interface()) {
1973       receiver_constraint = calling_klass;
1974     }
1975 
1976     if (receiver_constraint != nullptr) {
1977       int index = state()->stack_size() - (target->arg_size_no_receiver() + 1);
1978       Value receiver = state()->stack_at(index);
1979       CheckCast* c = new CheckCast(receiver_constraint, receiver, copy_state_before());
1980       // go to uncommon_trap when checkcast fails
1981       c->set_invokespecial_receiver_check();
1982       state()->stack_at_put(index, append_split(c));
1983     }
1984   }
1985 
1986   // Push appendix argument (MethodType, CallSite, etc.), if one.
1987   bool patch_for_appendix = false;
1988   int patching_appendix_arg = 0;
1989   if (Bytecodes::has_optional_appendix(bc_raw) && (!will_link || PatchALot)) {
1990     Value arg = append(new Constant(new ObjectConstant(compilation()->env()->unloaded_ciinstance()), copy_state_before()));
1991     apush(arg);
1992     patch_for_appendix = true;

2142       }
2143     } else {
2144       print_inlining(target, "no static binding", /*success*/ false);
2145     }
2146   } else {
2147     print_inlining(target, "not inlineable", /*success*/ false);
2148   }
2149 
2150   // If we attempted an inline which did not succeed because of a
2151   // bailout during construction of the callee graph, the entire
2152   // compilation has to be aborted. This is fairly rare and currently
2153   // seems to only occur for jasm-generated classes which contain
2154   // jsr/ret pairs which are not associated with finally clauses and
2155   // do not have exception handlers in the containing method, and are
2156   // therefore not caught early enough to abort the inlining without
2157   // corrupting the graph. (We currently bail out with a non-empty
2158   // stack at a ret in these situations.)
2159   CHECK_BAILOUT();
2160 
2161   // inlining not successful => standard invoke
2162   ValueType* result_type = as_ValueType(declared_signature->return_type());
2163   ValueStack* state_before = copy_state_exhandling();
2164 
2165   // The bytecode (code) might change in this method so we are checking this very late.
2166   const bool has_receiver =
2167     code == Bytecodes::_invokespecial   ||
2168     code == Bytecodes::_invokevirtual   ||
2169     code == Bytecodes::_invokeinterface;
2170   Values* args = state()->pop_arguments(target->arg_size_no_receiver() + patching_appendix_arg);
2171   Value recv = has_receiver ? apop() : nullptr;
2172 
2173   // A null check is required here (when there is a receiver) for any of the following cases
2174   // - invokespecial, always need a null check.
2175   // - invokevirtual, when the target is final and loaded. Calls to final targets will become optimized
2176   //   and require null checking. If the target is loaded a null check is emitted here.
2177   //   If the target isn't loaded the null check must happen after the call resolution. We achieve that
2178   //   by using the target methods unverified entry point (see CompiledIC::compute_monomorphic_entry).
2179   //   (The JVM specification requires that LinkageError must be thrown before a NPE. An unloaded target may
2180   //   potentially fail, and can't have the null check before the resolution.)
2181   // - A call that will be profiled. (But we can't add a null check when the target is unloaded, by the same
2182   //   reason as above, so calls with a receiver to unloaded targets can't be profiled.)

2191       null_check(recv);
2192     }
2193 
2194     if (is_profiling()) {
2195       // Note that we'd collect profile data in this method if we wanted it.
2196       compilation()->set_would_profile(true);
2197 
2198       if (profile_calls()) {
2199         assert(cha_monomorphic_target == nullptr || exact_target == nullptr, "both can not be set");
2200         ciKlass* target_klass = nullptr;
2201         if (cha_monomorphic_target != nullptr) {
2202           target_klass = cha_monomorphic_target->holder();
2203         } else if (exact_target != nullptr) {
2204           target_klass = exact_target->holder();
2205         }
2206         profile_call(target, recv, target_klass, collect_args_for_profiling(args, nullptr, false), false);
2207       }
2208     }
2209   }
2210 
2211   Invoke* result = new Invoke(code, result_type, recv, args, target, state_before);
2212   // push result
2213   append_split(result);
2214 
2215   if (result_type != voidType) {
2216     push(result_type, result);
2217   }
2218   if (profile_return() && result_type->is_object_kind()) {

2219     profile_return_type(result, target);
2220   }
2221 }
2222 
2223 
2224 void GraphBuilder::new_instance(int klass_index) {
2225   ValueStack* state_before = copy_state_exhandling();
2226   ciKlass* klass = stream()->get_klass();
2227   assert(klass->is_instance_klass(), "must be an instance klass");
2228   NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass());
2229   _memory->new_instance(new_instance);
2230   apush(append_split(new_instance));
2231 }
2232 
2233 
2234 void GraphBuilder::new_type_array() {
2235   ValueStack* state_before = copy_state_exhandling();
2236   apush(append_split(new NewTypeArray(ipop(), (BasicType)stream()->get_index(), state_before, true)));
2237 }
2238 
2239 
2240 void GraphBuilder::new_object_array() {
2241   ciKlass* klass = stream()->get_klass();
2242   ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
2243   NewArray* n = new NewObjectArray(klass, ipop(), state_before);
2244   apush(append_split(n));
2245 }
2246 
2247 
2248 bool GraphBuilder::direct_compare(ciKlass* k) {
2249   if (k->is_loaded() && k->is_instance_klass() && !UseSlowPath) {
2250     ciInstanceKlass* ik = k->as_instance_klass();
2251     if (ik->is_final()) {
2252       return true;
2253     } else {

2286   ciKlass* klass = stream()->get_klass();
2287   ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
2288   InstanceOf* i = new InstanceOf(klass, apop(), state_before);
2289   ipush(append_split(i));
2290   i->set_direct_compare(direct_compare(klass));
2291 
2292   if (is_profiling()) {
2293     // Note that we'd collect profile data in this method if we wanted it.
2294     compilation()->set_would_profile(true);
2295 
2296     if (profile_checkcasts()) {
2297       i->set_profiled_method(method());
2298       i->set_profiled_bci(bci());
2299       i->set_should_profile(true);
2300     }
2301   }
2302 }
2303 
2304 
2305 void GraphBuilder::monitorenter(Value x, int bci) {



















2306   // save state before locking in case of deoptimization after a NullPointerException
2307   ValueStack* state_before = copy_state_for_exception_with_bci(bci);
2308   append_with_bci(new MonitorEnter(x, state()->lock(x), state_before), bci);
2309   kill_all();
2310 }
2311 
2312 
2313 void GraphBuilder::monitorexit(Value x, int bci) {
2314   append_with_bci(new MonitorExit(x, state()->unlock()), bci);
2315   kill_all();
2316 }
2317 
2318 
2319 void GraphBuilder::new_multi_array(int dimensions) {
2320   ciKlass* klass = stream()->get_klass();
2321   ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
2322 
2323   Values* dims = new Values(dimensions, dimensions, nullptr);
2324   // fill in all dimensions
2325   int i = dimensions;
2326   while (i-- > 0) dims->at_put(i, ipop());
2327   // create array
2328   NewArray* n = new NewMultiArray(klass, dims, state_before);

2413 
2414 Instruction* GraphBuilder::append_split(StateSplit* instr) {
2415   return append_with_bci(instr, bci());
2416 }
2417 
2418 
2419 void GraphBuilder::null_check(Value value) {
2420   if (value->as_NewArray() != nullptr || value->as_NewInstance() != nullptr) {
2421     return;
2422   } else {
2423     Constant* con = value->as_Constant();
2424     if (con) {
2425       ObjectType* c = con->type()->as_ObjectType();
2426       if (c && c->is_loaded()) {
2427         ObjectConstant* oc = c->as_ObjectConstant();
2428         if (!oc || !oc->value()->is_null_object()) {
2429           return;
2430         }
2431       }
2432     }

2433   }
2434   append(new NullCheck(value, copy_state_for_exception()));
2435 }
2436 
2437 
2438 
2439 XHandlers* GraphBuilder::handle_exception(Instruction* instruction) {
2440   if (!has_handler() && (!instruction->needs_exception_state() || instruction->exception_state() != nullptr)) {
2441     assert(instruction->exception_state() == nullptr
2442            || instruction->exception_state()->kind() == ValueStack::EmptyExceptionState
2443            || (instruction->exception_state()->kind() == ValueStack::ExceptionState && _compilation->env()->should_retain_local_variables()),
2444            "exception_state should be of exception kind");
2445     return new XHandlers();
2446   }
2447 
2448   XHandlers*  exception_handlers = new XHandlers();
2449   ScopeData*  cur_scope_data = scope_data();
2450   ValueStack* cur_state = instruction->state_before();
2451   ValueStack* prev_state = nullptr;
2452   int scope_count = 0;
2453 
2454   assert(cur_state != nullptr, "state_before must be set");
2455   do {
2456     int cur_bci = cur_state->bci();
2457     assert(cur_scope_data->scope() == cur_state->scope(), "scopes do not match");
2458     assert(cur_bci == SynchronizationEntryBCI || cur_bci == cur_scope_data->stream()->cur_bci(), "invalid bci");


2459 
2460     // join with all potential exception handlers
2461     XHandlers* list = cur_scope_data->xhandlers();
2462     const int n = list->length();
2463     for (int i = 0; i < n; i++) {
2464       XHandler* h = list->handler_at(i);
2465       if (h->covers(cur_bci)) {
2466         // h is a potential exception handler => join it
2467         compilation()->set_has_exception_handlers(true);
2468 
2469         BlockBegin* entry = h->entry_block();
2470         if (entry == block()) {
2471           // It's acceptable for an exception handler to cover itself
2472           // but we don't handle that in the parser currently.  It's
2473           // very rare so we bailout instead of trying to handle it.
2474           BAILOUT_("exception handler covers itself", exception_handlers);
2475         }
2476         assert(entry->bci() == h->handler_bci(), "must match");
2477         assert(entry->bci() == -1 || entry == cur_scope_data->block_at(entry->bci()), "blocks must correspond");
2478 

3252     state->store_local(idx, new Local(type, vt, idx, false));
3253     idx += type->size();
3254   }
3255 
3256   // lock synchronized method
3257   if (method()->is_synchronized()) {
3258     state->lock(nullptr);
3259   }
3260 
3261   return state;
3262 }
3263 
3264 
3265 GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope)
3266   : _scope_data(nullptr)
3267   , _compilation(compilation)
3268   , _memory(new MemoryBuffer())
3269   , _inline_bailout_msg(nullptr)
3270   , _instruction_count(0)
3271   , _osr_entry(nullptr)


3272 {
3273   int osr_bci = compilation->osr_bci();
3274 
3275   // determine entry points and bci2block mapping
3276   BlockListBuilder blm(compilation, scope, osr_bci);
3277   CHECK_BAILOUT();
3278 
3279   BlockList* bci2block = blm.bci2block();
3280   BlockBegin* start_block = bci2block->at(0);
3281 
3282   push_root_scope(scope, bci2block, start_block);
3283 
3284   // setup state for std entry
3285   _initial_state = state_at_entry();
3286   start_block->merge(_initial_state, compilation->has_irreducible_loops());
3287 
3288   // End nulls still exist here
3289 
3290   // complete graph
3291   _vmap        = new ValueMap();

4004   // Temporarily set up bytecode stream so we can append instructions
4005   // (only using the bci of this stream)
4006   scope_data()->set_stream(scope_data()->parent()->stream());
4007 
4008   // Pass parameters into callee state: add assignments
4009   // note: this will also ensure that all arguments are computed before being passed
4010   ValueStack* callee_state = state();
4011   ValueStack* caller_state = state()->caller_state();
4012   for (int i = args_base; i < caller_state->stack_size(); ) {
4013     const int arg_no = i - args_base;
4014     Value arg = caller_state->stack_at_inc(i);
4015     store_local(callee_state, arg, arg_no);
4016   }
4017 
4018   // Remove args from stack.
4019   // Note that we preserve locals state in case we can use it later
4020   // (see use of pop_scope() below)
4021   caller_state->truncate_stack(args_base);
4022   assert(callee_state->stack_size() == 0, "callee stack must be empty");
4023 




























4024   Value lock = nullptr;
4025   BlockBegin* sync_handler = nullptr;
4026 
4027   // Inline the locking of the receiver if the callee is synchronized
4028   if (callee->is_synchronized()) {
4029     lock = callee->is_static() ? append(new Constant(new InstanceConstant(callee->holder()->java_mirror())))
4030                                : state()->local_at(0);
4031     sync_handler = new BlockBegin(SynchronizationEntryBCI);
4032     inline_sync_entry(lock, sync_handler);
4033   }
4034 
4035   if (compilation()->env()->dtrace_method_probes()) {
4036     Values* args = new Values(1);
4037     args->push(append(new Constant(new MethodConstant(method()))));
4038     append(new RuntimeCall(voidType, "dtrace_method_entry", CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), args));
4039   }
4040 
4041   if (profile_inlined_calls()) {
4042     profile_invocation(callee, copy_state_before_with_bci(SynchronizationEntryBCI));
4043   }

   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 "c1/c1_Canonicalizer.hpp"
  26 #include "c1/c1_CFGPrinter.hpp"
  27 #include "c1/c1_Compilation.hpp"
  28 #include "c1/c1_GraphBuilder.hpp"
  29 #include "c1/c1_Instruction.hpp"
  30 #include "c1/c1_InstructionPrinter.hpp"
  31 #include "c1/c1_ValueType.hpp"
  32 #include "ci/ciCallSite.hpp"
  33 #include "ci/ciField.hpp"
  34 #include "ci/ciFlatArrayKlass.hpp"
  35 #include "ci/ciInlineKlass.hpp"
  36 #include "ci/ciKlass.hpp"
  37 #include "ci/ciMemberName.hpp"
  38 #include "ci/ciSymbols.hpp"
  39 #include "ci/ciUtilities.inline.hpp"
  40 #include "classfile/javaClasses.hpp"
  41 #include "compiler/compilationPolicy.hpp"
  42 #include "compiler/compileBroker.hpp"
  43 #include "compiler/compilerEvent.hpp"
  44 #include "interpreter/bytecode.hpp"
  45 #include "jfr/jfrEvents.hpp"
  46 #include "memory/resourceArea.hpp"
  47 #include "runtime/arguments.hpp"
  48 #include "runtime/sharedRuntime.hpp"
  49 #include "utilities/checkedCast.hpp"
  50 #include "utilities/macros.hpp"
  51 #if INCLUDE_JFR
  52 #include "jfr/jfr.hpp"
  53 #endif
  54 
  55 class BlockListBuilder {
  56  private:
  57   Compilation* _compilation;
  58   IRScope*     _scope;
  59 
  60   BlockList    _blocks;                // internal list of all blocks
  61   BlockList*   _bci2block;             // mapping from bci to blocks for GraphBuilder
  62   GrowableArray<BlockList> _bci2block_successors; // Mapping bcis to their blocks successors while we dont have a blockend
  63 
  64   // fields used by mark_loops
  65   ResourceBitMap _active;              // for iteration of control flow graph
  66   ResourceBitMap _visited;             // for iteration of control flow graph
  67   GrowableArray<ResourceBitMap> _loop_map; // caches the information if a block is contained in a loop

1033 
1034       // Also check parent jsrs (if any) at this time to see whether
1035       // they are using this local. We don't handle skipping over a
1036       // ret.
1037       for (ScopeData* cur_scope_data = scope_data()->parent();
1038            cur_scope_data != nullptr && cur_scope_data->parsing_jsr() && cur_scope_data->scope() == scope();
1039            cur_scope_data = cur_scope_data->parent()) {
1040         if (cur_scope_data->jsr_return_address_local() == index) {
1041           BAILOUT("subroutine overwrites return address from previous subroutine");
1042         }
1043       }
1044     } else if (index == scope_data()->jsr_return_address_local()) {
1045       scope_data()->set_jsr_return_address_local(-1);
1046     }
1047   }
1048 
1049   state->store_local(index, x);
1050 }
1051 
1052 
1053 ValueStack* GraphBuilder::state_before_for_indexed_access(BasicType type, int array_idx) {
1054   if (type == T_OBJECT && state()->stack_at(array_idx)->maybe_flat_array()) {
1055     // Save the entire state and re-execute on deopt when accessing flat arrays
1056     ValueStack* state_before = copy_state_before();
1057     state_before->set_should_reexecute(true);
1058     return state_before;
1059   }
1060   return copy_state_indexed_access();
1061 }
1062 
1063 void GraphBuilder::load_indexed(BasicType type) {
1064   // In case of in block code motion in range check elimination
1065   int array_idx = state()->stack_size() - 2;
1066   ValueStack* state_before = state_before_for_indexed_access(type, array_idx);
1067   compilation()->set_has_access_indexed(true);
1068   Value index = ipop();
1069   Value array = apop();
1070   Value length = nullptr;
1071   if (CSEArrayLength ||
1072       (array->as_Constant() != nullptr) ||
1073       (array->as_AccessField() && array->as_AccessField()->field()->is_constant()) ||
1074       (array->as_NewArray() && array->as_NewArray()->length() && array->as_NewArray()->length()->type()->is_constant()) ||
1075       (array->as_NewMultiArray() && array->as_NewMultiArray()->dims()->at(0)->type()->is_constant())) {
1076     length = append(new ArrayLength(array, state_before));
1077   }
1078 
1079   bool need_membar = false;
1080   LoadIndexed* load_indexed = nullptr;
1081   Instruction* result = nullptr;
1082   if (array->is_loaded_flat_array()) {
1083     ciType* array_type = array->declared_type();
1084     ciFlatArrayKlass* array_klass = array_type->as_flat_array_klass();
1085     ciInlineKlass* elem_klass = array_klass->element_klass()->as_inline_klass();
1086 
1087     bool can_delay_access = false;
1088     ciBytecodeStream s(method());
1089     s.force_bci(bci());
1090     s.next();
1091     if (s.cur_bc() == Bytecodes::_getfield) {
1092       bool is_null_free = array_klass->is_elem_null_free();
1093       bool will_link;
1094       ciField* next_field = s.get_field(will_link);
1095       bool next_needs_patching = !next_field->holder()->is_initialized() ||
1096                                  !next_field->will_link(method(), Bytecodes::_getfield) ||
1097                                  PatchALot;
1098       bool needs_atomic_access = array_klass->is_elem_atomic();
1099       can_delay_access = is_null_free && C1UseDelayedFlattenedFieldReads &&
1100                          !next_needs_patching && !needs_atomic_access;
1101     }
1102     if (can_delay_access) {
1103       // potentially optimizable array access, storing information for delayed decision
1104       LoadIndexed* li = new LoadIndexed(array, index, length, type, state_before);
1105       DelayedLoadIndexed* dli = new DelayedLoadIndexed(li, state_before);
1106       li->set_delayed(dli);
1107       set_pending_load_indexed(dli);
1108       return; // Nothing else to do for now
1109     } else {
1110       NewInstance* buffer = new NewInstance(elem_klass, state_before, false, true);
1111       buffer->set_null_free(true);
1112       _memory->new_instance(buffer);
1113       result = append_split(buffer);
1114       load_indexed = new LoadIndexed(array, index, length, type, state_before);
1115       load_indexed->set_buffer(buffer);
1116       // The LoadIndexed node will initialize this instance by copying from
1117       // the flat field.  Ensure these stores are visible before any
1118       // subsequent store that publishes this reference.
1119       need_membar = true;
1120     }
1121   } else {
1122     load_indexed = new LoadIndexed(array, index, length, type, state_before);
1123     if (profile_array_accesses() && is_reference_type(type)) {
1124       compilation()->set_would_profile(true);
1125       load_indexed->set_should_profile(true);
1126       load_indexed->set_profiled_method(method());
1127       load_indexed->set_profiled_bci(bci());
1128     }
1129   }
1130   result = append(load_indexed);
1131   if (need_membar) {
1132     append(new MemBar(lir_membar_storestore));
1133   }
1134   assert(!load_indexed->should_profile() || load_indexed == result, "should not be optimized out");
1135   push(as_ValueType(type), result);
1136 }
1137 
1138 
1139 void GraphBuilder::store_indexed(BasicType type) {
1140   // In case of in block code motion in range check elimination
1141   int array_idx = state()->stack_size() - 3;
1142   ValueStack* state_before = state_before_for_indexed_access(type, array_idx);
1143   compilation()->set_has_access_indexed(true);
1144   Value value = pop(as_ValueType(type));
1145   Value index = ipop();
1146   Value array = apop();
1147   Value length = nullptr;
1148   if (CSEArrayLength ||
1149       (array->as_Constant() != nullptr) ||
1150       (array->as_AccessField() && array->as_AccessField()->field()->is_constant()) ||
1151       (array->as_NewArray() && array->as_NewArray()->length() && array->as_NewArray()->length()->type()->is_constant()) ||
1152       (array->as_NewMultiArray() && array->as_NewMultiArray()->dims()->at(0)->type()->is_constant())) {
1153     length = append(new ArrayLength(array, state_before));
1154   }
1155   ciType* array_type = array->declared_type();
1156   bool check_boolean = false;
1157   if (array_type != nullptr) {
1158     if (array_type->is_loaded() &&
1159       array_type->as_array_klass()->element_type()->basic_type() == T_BOOLEAN) {
1160       assert(type == T_BYTE, "boolean store uses bastore");
1161       Value mask = append(new Constant(new IntConstant(1)));
1162       value = append(new LogicOp(Bytecodes::_iand, value, mask));
1163     }
1164   } else if (type == T_BYTE) {
1165     check_boolean = true;
1166   }



1167 
1168   StoreIndexed* store_indexed = new StoreIndexed(array, index, length, type, value, state_before, check_boolean);
1169   if (profile_array_accesses() && is_reference_type(type) && !array->is_loaded_flat_array()) {
1170     compilation()->set_would_profile(true);
1171     store_indexed->set_should_profile(true);
1172     store_indexed->set_profiled_method(method());
1173     store_indexed->set_profiled_bci(bci());



1174   }
1175   Instruction* result = append(store_indexed);
1176   assert(!store_indexed->should_profile() || store_indexed == result, "should not be optimized out");
1177   _memory->store_value(value);
1178 }
1179 

1180 void GraphBuilder::stack_op(Bytecodes::Code code) {
1181   switch (code) {
1182     case Bytecodes::_pop:
1183       { state()->raw_pop();
1184       }
1185       break;
1186     case Bytecodes::_pop2:
1187       { state()->raw_pop();
1188         state()->raw_pop();
1189       }
1190       break;
1191     case Bytecodes::_dup:
1192       { Value w = state()->raw_pop();
1193         state()->raw_push(w);
1194         state()->raw_push(w);
1195       }
1196       break;
1197     case Bytecodes::_dup_x1:
1198       { Value w1 = state()->raw_pop();
1199         Value w2 = state()->raw_pop();

1344 
1345 
1346 void GraphBuilder::_goto(int from_bci, int to_bci) {
1347   Goto *x = new Goto(block_at(to_bci), to_bci <= from_bci);
1348   if (is_profiling()) {
1349     compilation()->set_would_profile(true);
1350     x->set_profiled_bci(bci());
1351     if (profile_branches()) {
1352       x->set_profiled_method(method());
1353       x->set_should_profile(true);
1354     }
1355   }
1356   append(x);
1357 }
1358 
1359 
1360 void GraphBuilder::if_node(Value x, If::Condition cond, Value y, ValueStack* state_before) {
1361   BlockBegin* tsux = block_at(stream()->get_dest());
1362   BlockBegin* fsux = block_at(stream()->next_bci());
1363   bool is_bb = tsux->bci() < stream()->cur_bci() || fsux->bci() < stream()->cur_bci();
1364 
1365   bool subst_check = false;
1366   if (Arguments::is_valhalla_enabled() && (stream()->cur_bc() == Bytecodes::_if_acmpeq || stream()->cur_bc() == Bytecodes::_if_acmpne)) {
1367     ValueType* left_vt = x->type();
1368     ValueType* right_vt = y->type();
1369     if (left_vt->is_object()) {
1370       assert(right_vt->is_object(), "must be");
1371       ciKlass* left_klass = x->as_loaded_klass_or_null();
1372       ciKlass* right_klass = y->as_loaded_klass_or_null();
1373 
1374       if (left_klass == nullptr || right_klass == nullptr) {
1375         // The klass is still unloaded, or came from a Phi node. Go slow case;
1376         subst_check = true;
1377       } else if (left_klass->can_be_inline_klass() || right_klass->can_be_inline_klass()) {
1378         // Either operand may be a value object, but we're not sure. Go slow case;
1379         subst_check = true;
1380       } else {
1381         // No need to do substitutability check
1382       }
1383     }
1384   }
1385   if ((stream()->cur_bc() == Bytecodes::_if_acmpeq || stream()->cur_bc() == Bytecodes::_if_acmpne) &&
1386       is_profiling() && profile_branches()) {
1387     compilation()->set_would_profile(true);
1388     append(new ProfileACmpTypes(method(), bci(), x, y));
1389   }
1390 
1391   // In case of loop invariant code motion or predicate insertion
1392   // before the body of a loop the state is needed
1393   Instruction *i = append(new If(x, cond, false, y, tsux, fsux, (is_bb || compilation()->is_optimistic() || subst_check) ? state_before : nullptr, is_bb, subst_check));
1394 
1395   assert(i->as_Goto() == nullptr ||
1396          (i->as_Goto()->sux_at(0) == tsux  && i->as_Goto()->is_safepoint() == (tsux->bci() < stream()->cur_bci())) ||
1397          (i->as_Goto()->sux_at(0) == fsux  && i->as_Goto()->is_safepoint() == (fsux->bci() < stream()->cur_bci())),
1398          "safepoint state of Goto returned by canonicalizer incorrect");
1399 
1400   if (is_profiling()) {
1401     If* if_node = i->as_If();
1402     if (if_node != nullptr) {
1403       // Note that we'd collect profile data in this method if we wanted it.
1404       compilation()->set_would_profile(true);
1405       // At level 2 we need the proper bci to count backedges
1406       if_node->set_profiled_bci(bci());
1407       if (profile_branches()) {
1408         // Successors can be rotated by the canonicalizer, check for this case.
1409         if_node->set_profiled_method(method());
1410         if_node->set_should_profile(true);
1411         if (if_node->tsux() == fsux) {
1412           if_node->set_swapped(true);
1413         }

1628   }
1629 
1630   if (needs_check) {
1631     // Perform the registration of finalizable objects.
1632     ValueStack* state_before = copy_state_for_exception();
1633     load_local(objectType, 0);
1634     append_split(new Intrinsic(voidType, vmIntrinsics::_Object_init,
1635                                state()->pop_arguments(1),
1636                                true, state_before, true));
1637   }
1638 }
1639 
1640 
1641 void GraphBuilder::method_return(Value x, bool ignore_return) {
1642   if (method()->intrinsic_id() == vmIntrinsics::_Object_init) {
1643     call_register_finalizer();
1644   }
1645 
1646   // The conditions for a memory barrier are described in Parse::do_exits().
1647   bool need_mem_bar = false;
1648   if (method()->is_object_constructor() &&
1649        (scope()->wrote_non_strict_final() || scope()->wrote_stable() ||
1650          (AlwaysSafeConstructors && scope()->wrote_fields()) ||
1651          (support_IRIW_for_not_multiple_copy_atomic_cpu && scope()->wrote_volatile()))) {
1652     need_mem_bar = true;
1653   }
1654 
1655   BasicType bt = method()->return_type()->basic_type();
1656   switch (bt) {
1657     case T_BYTE:
1658     {
1659       Value shift = append(new Constant(new IntConstant(24)));
1660       x = append(new ShiftOp(Bytecodes::_ishl, x, shift));
1661       x = append(new ShiftOp(Bytecodes::_ishr, x, shift));
1662       break;
1663     }
1664     case T_SHORT:
1665     {
1666       Value shift = append(new Constant(new IntConstant(16)));
1667       x = append(new ShiftOp(Bytecodes::_ishl, x, shift));
1668       x = append(new ShiftOp(Bytecodes::_ishr, x, shift));
1669       break;

1779   // Attach dimension info to stable arrays.
1780   if (FoldStableValues &&
1781       field->is_stable() && field_type == T_ARRAY && !field_value.is_null_or_zero()) {
1782     ciArray* array = field_value.as_object()->as_array();
1783     jint dimension = field->type()->as_array_klass()->dimension();
1784     value = new StableArrayConstant(array, dimension);
1785   }
1786 
1787   switch (field_type) {
1788     case T_ARRAY:
1789     case T_OBJECT:
1790       if (field_value.as_object()->should_be_constant()) {
1791         return new Constant(value);
1792       }
1793       return nullptr; // Not a constant.
1794     default:
1795       return new Constant(value);
1796   }
1797 }
1798 
1799 void GraphBuilder::copy_inline_content(ciInlineKlass* vk, Value src, int src_off, Value dest, int dest_off, ValueStack* state_before, ciField* enclosing_field) {
1800   for (int i = 0; i < vk->nof_declared_nonstatic_fields(); i++) {
1801     ciField* field = vk->declared_nonstatic_field_at(i);
1802     int offset = field->offset_in_bytes() - vk->payload_offset();
1803     if (field->is_flat()) {
1804       copy_inline_content(field->type()->as_inline_klass(), src, src_off + offset, dest, dest_off + offset, state_before, enclosing_field);
1805       if (!field->is_null_free()) {
1806         // Nullable, copy the null marker using Unsafe because null markers are not real fields
1807         int null_marker_offset = field->null_marker_offset() - vk->payload_offset();
1808         Value offset = append(new Constant(new LongConstant(src_off + null_marker_offset)));
1809         Value nm = append(new UnsafeGet(T_BOOLEAN, src, offset, false));
1810         offset = append(new Constant(new LongConstant(dest_off + null_marker_offset)));
1811         append(new UnsafePut(T_BOOLEAN, dest, offset, nm, false));
1812       }
1813     } else {
1814       Value value = append(new LoadField(src, src_off + offset, field, false, state_before, false));
1815       StoreField* store = new StoreField(dest, dest_off + offset, field, value, false, state_before, false);
1816       store->set_enclosing_field(enclosing_field);
1817       append(store);
1818     }
1819   }
1820 }
1821 
1822 void GraphBuilder::access_field(Bytecodes::Code code) {
1823   bool will_link;
1824   ciField* field = stream()->get_field(will_link);
1825   ciInstanceKlass* holder = field->holder();
1826   BasicType field_basic_type = field->type()->basic_type();
1827   ValueType* type = as_ValueType(field_basic_type);
1828 
1829   // call will_link again to determine if the field is valid.
1830   const bool needs_patching = !holder->is_loaded() ||
1831                               !field->will_link(method(), code) ||
1832                               (!field->is_flat() && PatchALot);
1833 
1834   ValueStack* state_before = nullptr;
1835   if (!holder->is_initialized() || needs_patching) {
1836     // save state before instruction for debug info when
1837     // deoptimization happens during patching
1838     state_before = copy_state_before();
1839   }
1840 
1841   Value obj = nullptr;
1842   if (code == Bytecodes::_getstatic || code == Bytecodes::_putstatic) {
1843     if (state_before != nullptr) {
1844       // build a patching constant
1845       obj = new Constant(new InstanceConstant(holder->java_mirror()), state_before);
1846     } else {
1847       obj = new Constant(new InstanceConstant(holder->java_mirror()));
1848     }
1849   }
1850 
1851   if (code == Bytecodes::_putfield) {
1852     scope()->set_wrote_fields();
1853     if (field->is_volatile()) {
1854       scope()->set_wrote_volatile();
1855     }
1856     if (field->is_final() && !field->is_strict()) {
1857       scope()->set_wrote_non_strict_final();
1858     }
1859     if (field->is_stable()) {
1860       scope()->set_wrote_stable();
1861     }
1862   }
1863 
1864   int offset = !needs_patching ? field->offset_in_bytes() : -1;
1865   switch (code) {
1866     case Bytecodes::_getstatic: {
1867       // check for compile-time constants, i.e., initialized static final fields
1868       Value constant = nullptr;
1869       if (field->is_static_constant() && !PatchALot) {
1870         ciConstant field_value = field->constant_value();
1871         assert(!field->is_stable() || !field_value.is_null_or_zero(),
1872                "stable static w/ default value shouldn't be a constant");
1873         constant = make_constant(field_value, field);
1874       }
1875       if (constant != nullptr) {
1876         push(type, append(constant));
1877       } else {
1878         if (state_before == nullptr) {
1879           state_before = copy_state_for_exception();
1880         }
1881         LoadField* load_field = new LoadField(append(obj), offset, field, true,
1882                                         state_before, needs_patching);
1883         push(type, append(load_field));
1884       }
1885       break;
1886     }
1887     case Bytecodes::_putstatic: {
1888       Value val = pop(type);
1889       if (state_before == nullptr) {
1890         state_before = copy_state_for_exception();
1891       }
1892       if (field_basic_type == T_BOOLEAN) {
1893         Value mask = append(new Constant(new IntConstant(1)));
1894         val = append(new LogicOp(Bytecodes::_iand, val, mask));
1895       }
1896       if (field->is_null_free()) {
1897         null_check(val);
1898 
1899         ciType* field_type = field->type();
1900         if (field_type->is_loaded() && field->empty_null_free_initialized_value_field(!method()->is_class_initializer())) {
1901           // Storing to an empty, null-free inline type field that is already initialized. Ignore.
1902           break;
1903         }
1904       }
1905       append(new StoreField(append(obj), offset, field, val, true, state_before, needs_patching));
1906       break;
1907     }
1908     case Bytecodes::_getfield: {
1909       // Check for compile-time constants, i.e., trusted final non-static fields.
1910       Value constant = nullptr;
1911       if (state_before == nullptr && field->is_flat()) {
1912         // Save the entire state and re-execute on deopt when accessing flat fields
1913         assert(Interpreter::bytecode_should_reexecute(code), "should reexecute");
1914         state_before = copy_state_before();
1915       }
1916       if (!has_pending_field_access() && !has_pending_load_indexed()) {
1917         obj = apop();
1918         ObjectType* obj_type = obj->type()->as_ObjectType();
1919         if (field->is_constant() && !field->is_flat() && obj_type->is_constant() && !PatchALot) {
1920           ciObject* const_oop = obj_type->constant_value();
1921           if (!const_oop->is_null_object() && const_oop->is_loaded()) {
1922             ciConstant field_value = field->constant_value_of(const_oop);
1923             if (field_value.is_valid()) {
1924               constant = make_constant(field_value, field);
1925               // For CallSite objects add a dependency for invalidation of the optimization.
1926               if (field->is_call_site_target()) {
1927                 ciCallSite* call_site = const_oop->as_call_site();
1928                 if (!call_site->is_fully_initialized_constant_call_site()) {
1929                   ciMethodHandle* target = field_value.as_object()->as_method_handle();
1930                   dependency_recorder()->assert_call_site_target_value(call_site, target);
1931                 }
1932               }
1933             }
1934           }
1935         }
1936       }
1937       if (constant != nullptr) {
1938         push(type, append(constant));
1939       } else {
1940         if (state_before == nullptr) {
1941           state_before = copy_state_for_exception();
1942         }
1943         if (!field->is_flat()) {
1944           if (has_pending_field_access()) {
1945             assert(!needs_patching, "Can't patch delayed field access");
1946             obj = pending_field_access()->obj();
1947             offset += pending_field_access()->offset() - field->holder()->as_inline_klass()->payload_offset();
1948             field = pending_field_access()->holder()->get_field_by_offset(offset, false);
1949             assert(field != nullptr, "field not found");
1950             set_pending_field_access(nullptr);
1951           } else if (has_pending_load_indexed()) {
1952             assert(!needs_patching, "Can't patch delayed field access");
1953             pending_load_indexed()->update(field, offset - field->holder()->as_inline_klass()->payload_offset());
1954             LoadIndexed* li = pending_load_indexed()->load_instr();
1955             li->set_type(type);
1956             push(type, append(li));
1957             set_pending_load_indexed(nullptr);




1958             break;
1959           }
1960           LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching);
1961           Value replacement = !needs_patching ? _memory->load(load) : load;
1962           if (replacement != load) {
1963             assert(replacement->is_linked() || !replacement->can_be_linked(), "should already be linked");
1964             // Writing an (integer) value to a boolean, byte, char or short field includes an implicit narrowing
1965             // conversion. Emit an explicit conversion here to get the correct field value after the write.
1966             switch (field_basic_type) {
1967             case T_BOOLEAN:
1968             case T_BYTE:
1969               replacement = append(new Convert(Bytecodes::_i2b, replacement, type));
1970               break;
1971             case T_CHAR:
1972               replacement = append(new Convert(Bytecodes::_i2c, replacement, type));
1973               break;
1974             case T_SHORT:
1975               replacement = append(new Convert(Bytecodes::_i2s, replacement, type));
1976               break;
1977             default:
1978               break;
1979             }
1980             push(type, replacement);
1981           } else {
1982             push(type, append(load));
1983           }
1984         } else {
1985           // Flat field
1986           assert(!needs_patching, "Can't patch flat inline type field access");
1987           ciInlineKlass* inline_klass = field->type()->as_inline_klass();
1988           if (field->is_atomic()) {
1989             assert(!has_pending_field_access(), "Pending field accesses are not supported");
1990             LoadField* load = new LoadField(obj, offset, field, false, state_before, needs_patching);
1991             push(type, append(load));
1992           } else {
1993             // Look at the next bytecode to check if we can delay the field access
1994             bool can_delay_access = false;
1995             if (field->is_null_free()) {
1996               ciBytecodeStream s(method());
1997               s.force_bci(bci());
1998               s.next();
1999               if (s.cur_bc() == Bytecodes::_getfield && !needs_patching) {
2000                 ciField* next_field = s.get_field(will_link);
2001                 bool next_needs_patching = !next_field->holder()->is_loaded() ||
2002                                           !next_field->will_link(method(), Bytecodes::_getfield) ||
2003                                           PatchALot;
2004                 // We can't update the offset for atomic accesses
2005                 bool next_needs_atomic_access = next_field->is_flat() && next_field->is_atomic();
2006                 can_delay_access = C1UseDelayedFlattenedFieldReads && !next_needs_patching && !next_needs_atomic_access && next_field->is_null_free();
2007               }
2008             }
2009 
2010             if (can_delay_access) {
2011               // Flat fields contain the nested value's payload but not its object header,
2012               // so accumulate the field offset relative to the holder's payload.
2013               if (has_pending_load_indexed()) {
2014                 pending_load_indexed()->update(field, offset - field->holder()->as_inline_klass()->payload_offset());
2015               } else if (has_pending_field_access()) {
2016                 pending_field_access()->inc_offset(offset - field->holder()->as_inline_klass()->payload_offset());
2017               } else {
2018                 null_check(obj);
2019                 DelayedFieldAccess* dfa = new DelayedFieldAccess(obj, field->holder(), field->offset_in_bytes(), state_before);
2020                 set_pending_field_access(dfa);
2021               }
2022             } else {
2023               if (!field->is_strict()) {
2024                 scope()->set_wrote_non_strict_final();
2025               }
2026               scope()->set_wrote_fields();
2027               if (has_pending_load_indexed()) {
2028                 assert(field->is_null_free(), "nullable fields do not support delayed accesses yet");
2029                 assert(!needs_patching, "Can't patch delayed field access");
2030                 pending_load_indexed()->update(field, offset - field->holder()->as_inline_klass()->payload_offset());
2031                 NewInstance* buffer = new NewInstance(inline_klass, pending_load_indexed()->state_before(), false, true);
2032                 buffer->set_null_free(true);
2033                 _memory->new_instance(buffer);
2034                 pending_load_indexed()->load_instr()->set_buffer(buffer);
2035                 apush(append_split(buffer));
2036                 append(pending_load_indexed()->load_instr());
2037                 set_pending_load_indexed(nullptr);
2038               } else if (has_pending_field_access()) {
2039                 assert(field->is_null_free(), "nullable fields do not support delayed accesses yet");
2040                 state_before = pending_field_access()->state_before();
2041                 NewInstance* buffer = new NewInstance(inline_klass, state_before, false, true);
2042                 _memory->new_instance(buffer);
2043                 apush(append_split(buffer));
2044                 copy_inline_content(inline_klass, pending_field_access()->obj(),
2045                                     pending_field_access()->offset() + field->offset_in_bytes() - field->holder()->as_inline_klass()->payload_offset(),
2046                                     buffer, inline_klass->payload_offset(), state_before);
2047                 set_pending_field_access(nullptr);
2048               } else {
2049                 if (!field->is_null_free() && !inline_klass->is_initialized()) {
2050                   // Cannot allocate an instance of inline_klass because it may have not been
2051                   // initialized, bailout for now
2052                   bailout("load from an uninitialized nullable non-atomic flat field");
2053                   return;
2054                 }
2055 
2056                 NewInstance* buffer = new NewInstance(inline_klass, state_before, false, true);
2057                 _memory->new_instance(buffer);
2058                 append_split(buffer);
2059 
2060                 if (inline_klass->is_initialized() && inline_klass->is_empty()) {
2061                   // Needs an explicit null check because below code does not perform any actual load if there are no fields
2062                   null_check(obj);
2063                 }
2064                 copy_inline_content(inline_klass, obj, field->offset_in_bytes(), buffer, inline_klass->payload_offset(), state_before);
2065 
2066                 Instruction* result = buffer;
2067                 if (!field->is_null_free()) {
2068                   Value int_zero = append(new Constant(intZero));
2069                   Value object_null = append(new Constant(objectNull));
2070                   Value nm_offset = append(new Constant(new LongConstant(offset + inline_klass->null_marker_offset_in_payload())));
2071                   Value nm = append(new UnsafeGet(T_BOOLEAN, obj, nm_offset, false));
2072                   result = append(new IfOp(nm, Instruction::neq, int_zero, buffer, object_null, state_before, false));
2073                 }
2074                 apush(result);
2075               }
2076 
2077               // If we allocated a new instance ensure the stores to copy the
2078               // field contents are visible before any subsequent store that
2079               // publishes this reference.
2080               append(new MemBar(lir_membar_storestore));
2081             }
2082           }
2083         }
2084       }
2085       break;
2086     }
2087     case Bytecodes::_putfield: {
2088       Value val = pop(type);
2089       obj = apop();
2090       if (state_before == nullptr) {
2091         state_before = copy_state_for_exception();
2092       }
2093       if (field_basic_type == T_BOOLEAN) {
2094         Value mask = append(new Constant(new IntConstant(1)));
2095         val = append(new LogicOp(Bytecodes::_iand, val, mask));
2096       }
2097 
2098       ciType* field_type = field->type();
2099       if (field_type->is_loaded() && field->empty_null_free_initialized_value_field(!method()->is_object_constructor())) {
2100         // Storing to an empty, null-free inline type field that is already initialized. Ignore.
2101         null_check(obj);
2102         null_check(val);
2103       } else if (!field->is_flat()) {
2104         if (field->is_null_free()) {
2105           null_check(val);
2106         }
2107         StoreField* store = new StoreField(obj, offset, field, val, false, state_before, needs_patching);
2108         if (!needs_patching) store = _memory->store(store);
2109         if (store != nullptr) {
2110           append(store);
2111         }
2112       } else {
2113         // Flat field
2114         assert(!needs_patching, "Can't patch flat inline type field access");
2115         ciInlineKlass* inline_klass = field_type->as_inline_klass();
2116         if (field->is_atomic()) {
2117           if (field->is_null_free()) {
2118             null_check(val);
2119           }
2120           append(new StoreField(obj, offset, field, val, false, state_before, needs_patching));
2121         } else if (field->is_null_free()) {
2122           assert(!inline_klass->is_empty(), "should have been handled");
2123           copy_inline_content(inline_klass, val, inline_klass->payload_offset(), obj, offset, state_before, field);
2124         } else {
2125           if (!inline_klass->is_initialized()) {
2126             // null_reset_value is not available, bailout for now
2127             bailout("store to an uninitialized nullable non-atomic flat field");
2128             return;
2129           }
2130 
2131           // Store the subfields when field is a nullable non-atomic field
2132           Value object_null = append(new Constant(objectNull));
2133           Value null_reset_value = append(new Constant(new ObjectConstant(inline_klass->get_null_reset_value().as_object())));
2134           Value src = append(new IfOp(val, Instruction::neq, object_null, val, null_reset_value, state_before, false));
2135           copy_inline_content(inline_klass, src, inline_klass->payload_offset(), obj, offset, state_before);
2136 
2137           // Store the null marker
2138           Value int_one = append(new Constant(new IntConstant(1)));
2139           Value int_zero = append(new Constant(intZero));
2140           Value nm = append(new IfOp(val, Instruction::neq, object_null, int_one, int_zero, state_before, false));
2141           Value nm_offset = append(new Constant(new LongConstant(offset + inline_klass->null_marker_offset_in_payload())));
2142           append(new UnsafePut(T_BOOLEAN, obj, nm_offset, nm, false));
2143         }
2144       }
2145       break;
2146     }
2147     default:
2148       ShouldNotReachHere();
2149       break;
2150   }
2151 }
2152 

2153 Dependencies* GraphBuilder::dependency_recorder() const {
2154   return compilation()->dependency_recorder();
2155 }
2156 
2157 // How many arguments do we want to profile?
2158 Values* GraphBuilder::args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver) {
2159   int n = 0;
2160   bool has_receiver = may_have_receiver && Bytecodes::has_receiver(method()->java_code_at_bci(bci()));
2161   start = has_receiver ? 1 : 0;
2162   if (profile_arguments()) {
2163     ciProfileData* data = method()->method_data()->bci_to_data(bci());
2164     if (data != nullptr && (data->is_CallTypeData() || data->is_VirtualCallTypeData())) {
2165       n = data->is_CallTypeData() ? data->as_CallTypeData()->number_of_arguments() : data->as_VirtualCallTypeData()->number_of_arguments();
2166     }
2167   }
2168   // If we are inlining then we need to collect arguments to profile parameters for the target
2169   if (profile_parameters() && target != nullptr) {
2170     if (target->method_data() != nullptr && target->method_data()->parameters_type_data() != nullptr) {
2171       // The receiver is profiled on method entry so it's included in
2172       // the number of parameters but here we're only interested in

2248       break;
2249     case Bytecodes::_invokehandle:
2250       code = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokespecial;
2251       break;
2252     default:
2253       break;
2254     }
2255   } else {
2256     if (bc_raw == Bytecodes::_invokehandle) {
2257       assert(!will_link, "should come here only for unlinked call");
2258       code = Bytecodes::_invokespecial;
2259     }
2260   }
2261 
2262   if (code == Bytecodes::_invokespecial) {
2263     // Additional receiver subtype checks for interface calls via invokespecial or invokeinterface.
2264     ciKlass* receiver_constraint = nullptr;
2265 
2266     if (bc_raw == Bytecodes::_invokeinterface) {
2267       receiver_constraint = holder;
2268     } else if (bc_raw == Bytecodes::_invokespecial && !target->is_object_constructor() && calling_klass->is_interface()) {
2269       receiver_constraint = calling_klass;
2270     }
2271 
2272     if (receiver_constraint != nullptr) {
2273       int index = state()->stack_size() - (target->arg_size_no_receiver() + 1);
2274       Value receiver = state()->stack_at(index);
2275       CheckCast* c = new CheckCast(receiver_constraint, receiver, copy_state_before());
2276       // go to uncommon_trap when checkcast fails
2277       c->set_invokespecial_receiver_check();
2278       state()->stack_at_put(index, append_split(c));
2279     }
2280   }
2281 
2282   // Push appendix argument (MethodType, CallSite, etc.), if one.
2283   bool patch_for_appendix = false;
2284   int patching_appendix_arg = 0;
2285   if (Bytecodes::has_optional_appendix(bc_raw) && (!will_link || PatchALot)) {
2286     Value arg = append(new Constant(new ObjectConstant(compilation()->env()->unloaded_ciinstance()), copy_state_before()));
2287     apush(arg);
2288     patch_for_appendix = true;

2438       }
2439     } else {
2440       print_inlining(target, "no static binding", /*success*/ false);
2441     }
2442   } else {
2443     print_inlining(target, "not inlineable", /*success*/ false);
2444   }
2445 
2446   // If we attempted an inline which did not succeed because of a
2447   // bailout during construction of the callee graph, the entire
2448   // compilation has to be aborted. This is fairly rare and currently
2449   // seems to only occur for jasm-generated classes which contain
2450   // jsr/ret pairs which are not associated with finally clauses and
2451   // do not have exception handlers in the containing method, and are
2452   // therefore not caught early enough to abort the inlining without
2453   // corrupting the graph. (We currently bail out with a non-empty
2454   // stack at a ret in these situations.)
2455   CHECK_BAILOUT();
2456 
2457   // inlining not successful => standard invoke
2458   ciType* return_type = declared_signature->return_type();
2459   ValueStack* state_before = copy_state_exhandling();
2460 
2461   // The bytecode (code) might change in this method so we are checking this very late.
2462   const bool has_receiver =
2463     code == Bytecodes::_invokespecial   ||
2464     code == Bytecodes::_invokevirtual   ||
2465     code == Bytecodes::_invokeinterface;
2466   Values* args = state()->pop_arguments(target->arg_size_no_receiver() + patching_appendix_arg);
2467   Value recv = has_receiver ? apop() : nullptr;
2468 
2469   // A null check is required here (when there is a receiver) for any of the following cases
2470   // - invokespecial, always need a null check.
2471   // - invokevirtual, when the target is final and loaded. Calls to final targets will become optimized
2472   //   and require null checking. If the target is loaded a null check is emitted here.
2473   //   If the target isn't loaded the null check must happen after the call resolution. We achieve that
2474   //   by using the target methods unverified entry point (see CompiledIC::compute_monomorphic_entry).
2475   //   (The JVM specification requires that LinkageError must be thrown before a NPE. An unloaded target may
2476   //   potentially fail, and can't have the null check before the resolution.)
2477   // - A call that will be profiled. (But we can't add a null check when the target is unloaded, by the same
2478   //   reason as above, so calls with a receiver to unloaded targets can't be profiled.)

2487       null_check(recv);
2488     }
2489 
2490     if (is_profiling()) {
2491       // Note that we'd collect profile data in this method if we wanted it.
2492       compilation()->set_would_profile(true);
2493 
2494       if (profile_calls()) {
2495         assert(cha_monomorphic_target == nullptr || exact_target == nullptr, "both can not be set");
2496         ciKlass* target_klass = nullptr;
2497         if (cha_monomorphic_target != nullptr) {
2498           target_klass = cha_monomorphic_target->holder();
2499         } else if (exact_target != nullptr) {
2500           target_klass = exact_target->holder();
2501         }
2502         profile_call(target, recv, target_klass, collect_args_for_profiling(args, nullptr, false), false);
2503       }
2504     }
2505   }
2506 
2507   Invoke* result = new Invoke(code, return_type, recv, args, target, state_before);
2508   // push result
2509   append_split(result);
2510 
2511   if (!return_type->is_void()) {
2512     push(as_ValueType(return_type), result);
2513   }
2514 
2515   if (profile_return() && return_type->is_object()) {
2516     profile_return_type(result, target);
2517   }
2518 }
2519 
2520 
2521 void GraphBuilder::new_instance(int klass_index) {
2522   ValueStack* state_before = copy_state_exhandling();
2523   ciKlass* klass = stream()->get_klass();
2524   assert(klass->is_instance_klass(), "must be an instance klass");
2525   NewInstance* new_instance = new NewInstance(klass->as_instance_klass(), state_before, stream()->is_unresolved_klass(), false);
2526   _memory->new_instance(new_instance);
2527   apush(append_split(new_instance));
2528 }
2529 

2530 void GraphBuilder::new_type_array() {
2531   ValueStack* state_before = copy_state_exhandling();
2532   apush(append_split(new NewTypeArray(ipop(), (BasicType)stream()->get_index(), state_before, true)));
2533 }
2534 
2535 
2536 void GraphBuilder::new_object_array() {
2537   ciKlass* klass = stream()->get_klass();
2538   ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
2539   NewArray* n = new NewObjectArray(klass, ipop(), state_before);
2540   apush(append_split(n));
2541 }
2542 
2543 
2544 bool GraphBuilder::direct_compare(ciKlass* k) {
2545   if (k->is_loaded() && k->is_instance_klass() && !UseSlowPath) {
2546     ciInstanceKlass* ik = k->as_instance_klass();
2547     if (ik->is_final()) {
2548       return true;
2549     } else {

2582   ciKlass* klass = stream()->get_klass();
2583   ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
2584   InstanceOf* i = new InstanceOf(klass, apop(), state_before);
2585   ipush(append_split(i));
2586   i->set_direct_compare(direct_compare(klass));
2587 
2588   if (is_profiling()) {
2589     // Note that we'd collect profile data in this method if we wanted it.
2590     compilation()->set_would_profile(true);
2591 
2592     if (profile_checkcasts()) {
2593       i->set_profiled_method(method());
2594       i->set_profiled_bci(bci());
2595       i->set_should_profile(true);
2596     }
2597   }
2598 }
2599 
2600 
2601 void GraphBuilder::monitorenter(Value x, int bci) {
2602   bool maybe_inlinetype = false;
2603   if (bci == InvocationEntryBci) {
2604     // Called by GraphBuilder::inline_sync_entry.
2605 #ifdef ASSERT
2606     ciType* obj_type = x->declared_type();
2607     assert(obj_type == nullptr || !obj_type->is_inlinetype(), "inline types cannot have synchronized methods");
2608 #endif
2609   } else {
2610     // We are compiling a monitorenter bytecode
2611     if (Arguments::is_valhalla_enabled()) {
2612       ciType* obj_type = x->declared_type();
2613       if (obj_type == nullptr || obj_type->can_be_inline_klass()) {
2614         // If we're (possibly) locking on an inline type, check for markWord::always_locked_pattern
2615         // and throw IMSE. (obj_type is null for Phi nodes, so let's just be conservative).
2616         maybe_inlinetype = true;
2617       }
2618     }
2619   }
2620 
2621   // save state before locking in case of deoptimization after a NullPointerException
2622   ValueStack* state_before = copy_state_for_exception_with_bci(bci);
2623   append_with_bci(new MonitorEnter(x, state()->lock(x), state_before, maybe_inlinetype), bci);
2624   kill_all();
2625 }
2626 
2627 
2628 void GraphBuilder::monitorexit(Value x, int bci) {
2629   append_with_bci(new MonitorExit(x, state()->unlock()), bci);
2630   kill_all();
2631 }
2632 
2633 
2634 void GraphBuilder::new_multi_array(int dimensions) {
2635   ciKlass* klass = stream()->get_klass();
2636   ValueStack* state_before = !klass->is_loaded() || PatchALot ? copy_state_before() : copy_state_exhandling();
2637 
2638   Values* dims = new Values(dimensions, dimensions, nullptr);
2639   // fill in all dimensions
2640   int i = dimensions;
2641   while (i-- > 0) dims->at_put(i, ipop());
2642   // create array
2643   NewArray* n = new NewMultiArray(klass, dims, state_before);

2728 
2729 Instruction* GraphBuilder::append_split(StateSplit* instr) {
2730   return append_with_bci(instr, bci());
2731 }
2732 
2733 
2734 void GraphBuilder::null_check(Value value) {
2735   if (value->as_NewArray() != nullptr || value->as_NewInstance() != nullptr) {
2736     return;
2737   } else {
2738     Constant* con = value->as_Constant();
2739     if (con) {
2740       ObjectType* c = con->type()->as_ObjectType();
2741       if (c && c->is_loaded()) {
2742         ObjectConstant* oc = c->as_ObjectConstant();
2743         if (!oc || !oc->value()->is_null_object()) {
2744           return;
2745         }
2746       }
2747     }
2748     if (value->is_null_free()) return;
2749   }
2750   append(new NullCheck(value, copy_state_for_exception()));
2751 }
2752 
2753 
2754 
2755 XHandlers* GraphBuilder::handle_exception(Instruction* instruction) {
2756   if (!has_handler() && (!instruction->needs_exception_state() || instruction->exception_state() != nullptr)) {
2757     assert(instruction->exception_state() == nullptr
2758            || instruction->exception_state()->kind() == ValueStack::EmptyExceptionState
2759            || (instruction->exception_state()->kind() == ValueStack::ExceptionState && _compilation->env()->should_retain_local_variables()),
2760            "exception_state should be of exception kind");
2761     return new XHandlers();
2762   }
2763 
2764   XHandlers*  exception_handlers = new XHandlers();
2765   ScopeData*  cur_scope_data = scope_data();
2766   ValueStack* cur_state = instruction->state_before();
2767   ValueStack* prev_state = nullptr;
2768   int scope_count = 0;
2769 
2770   assert(cur_state != nullptr, "state_before must be set");
2771   do {
2772     int cur_bci = cur_state->bci();
2773     assert(cur_scope_data->scope() == cur_state->scope(), "scopes do not match");
2774     assert(cur_bci == SynchronizationEntryBCI || cur_bci == cur_scope_data->stream()->cur_bci()
2775            || has_pending_field_access() || has_pending_load_indexed(), "invalid bci");
2776 
2777 
2778     // join with all potential exception handlers
2779     XHandlers* list = cur_scope_data->xhandlers();
2780     const int n = list->length();
2781     for (int i = 0; i < n; i++) {
2782       XHandler* h = list->handler_at(i);
2783       if (h->covers(cur_bci)) {
2784         // h is a potential exception handler => join it
2785         compilation()->set_has_exception_handlers(true);
2786 
2787         BlockBegin* entry = h->entry_block();
2788         if (entry == block()) {
2789           // It's acceptable for an exception handler to cover itself
2790           // but we don't handle that in the parser currently.  It's
2791           // very rare so we bailout instead of trying to handle it.
2792           BAILOUT_("exception handler covers itself", exception_handlers);
2793         }
2794         assert(entry->bci() == h->handler_bci(), "must match");
2795         assert(entry->bci() == -1 || entry == cur_scope_data->block_at(entry->bci()), "blocks must correspond");
2796 

3570     state->store_local(idx, new Local(type, vt, idx, false));
3571     idx += type->size();
3572   }
3573 
3574   // lock synchronized method
3575   if (method()->is_synchronized()) {
3576     state->lock(nullptr);
3577   }
3578 
3579   return state;
3580 }
3581 
3582 
3583 GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope)
3584   : _scope_data(nullptr)
3585   , _compilation(compilation)
3586   , _memory(new MemoryBuffer())
3587   , _inline_bailout_msg(nullptr)
3588   , _instruction_count(0)
3589   , _osr_entry(nullptr)
3590   , _pending_field_access(nullptr)
3591   , _pending_load_indexed(nullptr)
3592 {
3593   int osr_bci = compilation->osr_bci();
3594 
3595   // determine entry points and bci2block mapping
3596   BlockListBuilder blm(compilation, scope, osr_bci);
3597   CHECK_BAILOUT();
3598 
3599   BlockList* bci2block = blm.bci2block();
3600   BlockBegin* start_block = bci2block->at(0);
3601 
3602   push_root_scope(scope, bci2block, start_block);
3603 
3604   // setup state for std entry
3605   _initial_state = state_at_entry();
3606   start_block->merge(_initial_state, compilation->has_irreducible_loops());
3607 
3608   // End nulls still exist here
3609 
3610   // complete graph
3611   _vmap        = new ValueMap();

4324   // Temporarily set up bytecode stream so we can append instructions
4325   // (only using the bci of this stream)
4326   scope_data()->set_stream(scope_data()->parent()->stream());
4327 
4328   // Pass parameters into callee state: add assignments
4329   // note: this will also ensure that all arguments are computed before being passed
4330   ValueStack* callee_state = state();
4331   ValueStack* caller_state = state()->caller_state();
4332   for (int i = args_base; i < caller_state->stack_size(); ) {
4333     const int arg_no = i - args_base;
4334     Value arg = caller_state->stack_at_inc(i);
4335     store_local(callee_state, arg, arg_no);
4336   }
4337 
4338   // Remove args from stack.
4339   // Note that we preserve locals state in case we can use it later
4340   // (see use of pop_scope() below)
4341   caller_state->truncate_stack(args_base);
4342   assert(callee_state->stack_size() == 0, "callee stack must be empty");
4343 
4344   // Check if we need a membar at the beginning of the java.lang.Object
4345   // constructor to satisfy the memory model for strict fields.
4346   if (Arguments::is_valhalla_enabled() && method()->intrinsic_id() == vmIntrinsics::_Object_init) {
4347     Value receiver = state()->local_at(0);
4348     ciType* klass = receiver->exact_type();
4349     if (klass == nullptr) {
4350       // No exact type, check if the declared type has no implementors and add a dependency
4351       klass = receiver->declared_type();
4352       klass = compilation()->cha_exact_type(klass);
4353     }
4354     if (klass != nullptr && klass->is_instance_klass()) {
4355       // Exact receiver type, check if there is a strict field
4356       ciInstanceKlass* holder = klass->as_instance_klass();
4357       for (int i = 0; i < holder->nof_nonstatic_fields(); i++) {
4358         ciField* field = holder->nonstatic_field_at(i);
4359         if (field->is_strict()) {
4360           // Found a strict field, a membar is needed
4361           append(new MemBar(lir_membar_storestore));
4362           break;
4363         }
4364       }
4365     } else if (klass == nullptr) {
4366       // We can't statically determine the type of the receiver and therefore need
4367       // to put a membar here because it could have a strict field.
4368       append(new MemBar(lir_membar_storestore));
4369     }
4370   }
4371 
4372   Value lock = nullptr;
4373   BlockBegin* sync_handler = nullptr;
4374 
4375   // Inline the locking of the receiver if the callee is synchronized
4376   if (callee->is_synchronized()) {
4377     lock = callee->is_static() ? append(new Constant(new InstanceConstant(callee->holder()->java_mirror())))
4378                                : state()->local_at(0);
4379     sync_handler = new BlockBegin(SynchronizationEntryBCI);
4380     inline_sync_entry(lock, sync_handler);
4381   }
4382 
4383   if (compilation()->env()->dtrace_method_probes()) {
4384     Values* args = new Values(1);
4385     args->push(append(new Constant(new MethodConstant(method()))));
4386     append(new RuntimeCall(voidType, "dtrace_method_entry", CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_entry), args));
4387   }
4388 
4389   if (profile_inlined_calls()) {
4390     profile_invocation(callee, copy_state_before_with_bci(SynchronizationEntryBCI));
4391   }
< prev index next >