< prev index next >

src/hotspot/share/opto/callGenerator.cpp

Print this page
rev 52371 : [mq]: lvb.patch

@@ -38,10 +38,13 @@
 #include "opto/parse.hpp"
 #include "opto/rootnode.hpp"
 #include "opto/runtime.hpp"
 #include "opto/subnode.hpp"
 #include "runtime/sharedRuntime.hpp"
+#if INCLUDE_SHENANDOAHGC
+#include "gc/shenandoah/c2/shenandoahSupport.hpp"
+#endif
 
 // Utility function.
 const TypeFunc* CallGenerator::tf() const {
   return TypeFunc::make(method());
 }

@@ -832,10 +835,13 @@
   switch (iid) {
   case vmIntrinsics::_invokeBasic:
     {
       // Get MethodHandle receiver:
       Node* receiver = kit.argument(0);
+ #if INCLUDE_SHENANDOAHGC
+      receiver = ShenandoahBarrierNode::skip_through_barrier(receiver);
+ #endif
       if (receiver->Opcode() == Op_ConP) {
         input_not_const = false;
         const TypeOopPtr* oop_ptr = receiver->bottom_type()->is_oopptr();
         ciMethod* target = oop_ptr->const_oop()->as_method_handle()->get_vmtarget();
         const int vtable_index = Method::invalid_vtable_index;

@@ -859,15 +865,19 @@
     }
     break;
 
   case vmIntrinsics::_linkToVirtual:
   case vmIntrinsics::_linkToStatic:
+
   case vmIntrinsics::_linkToSpecial:
   case vmIntrinsics::_linkToInterface:
     {
       // Get MemberName argument:
       Node* member_name = kit.argument(callee->arg_size() - 1);
+ #if INCLUDE_SHENANDOAHGC
+      member_name = ShenandoahBarrierNode::skip_through_barrier(member_name);
+ #endif
       if (member_name->Opcode() == Op_ConP) {
         input_not_const = false;
         const TypeOopPtr* oop_ptr = member_name->bottom_type()->is_oopptr();
         ciMethod* target = oop_ptr->const_oop()->as_member_name()->get_vmtarget();
 
< prev index next >