changeset 53260:8d8702585652

8210853: JIT: C2 doesn't skip post barrier for new allocated objects Summary: skip copy Region node when look for last allocation Reviewed-by: thartmann, kvn Contributed-by: kuaiwei.kw@alibaba-inc.com
author kvn
date Tue, 30 Oct 2018 14:38:59 -0700
parents df10a0cacf3e
children d2a3503c72f7
files src/hotspot/share/opto/graphKit.cpp
diffstat 1 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/opto/graphKit.cpp	Tue Oct 30 13:48:19 2018 -0400
+++ b/src/hotspot/share/opto/graphKit.cpp	Tue Oct 30 14:38:59 2018 -0700
@@ -2116,8 +2116,17 @@
 // We use this to determine if an object is so "fresh" that
 // it does not require card marks.
 Node* GraphKit::just_allocated_object(Node* current_control) {
-  if (C->recent_alloc_ctl() == current_control)
-    return C->recent_alloc_obj();
+  Node* ctrl = current_control;
+  // Object::<init> is invoked after allocation, most of invoke nodes
+  // will be reduced, but a region node is kept in parse time, we check
+  // the pattern and skip the region node if it degraded to a copy.
+  if (ctrl != NULL && ctrl->is_Region() && ctrl->req() == 2 &&
+      ctrl->as_Region()->is_copy()) {
+    ctrl = ctrl->as_Region()->is_copy();
+  }
+  if (C->recent_alloc_ctl() == ctrl) {
+   return C->recent_alloc_obj();
+  }
   return NULL;
 }