< prev index next >
src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp
Print this page
rev 59252 : 8244813: [BACKOUT] 8244523: Shenandoah: Remove null-handling in LRB expansion
@@ -479,20 +479,20 @@
const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
return TypeFunc::make(domain, range);
}
-const TypeFunc* ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type(const Type* value_type) {
+const TypeFunc* ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type() {
const Type **fields = TypeTuple::fields(2);
- fields[TypeFunc::Parms+0] = value_type; // original field value
+ fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
fields[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // original load address
const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+2, fields);
// create result type (range)
fields = TypeTuple::fields(1);
- fields[TypeFunc::Parms+0] = value_type;
+ fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;
const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
return TypeFunc::make(domain, range);
}
@@ -1057,11 +1057,38 @@
}
return n;
}
}
}
- if (can_reshape &&
+ if (n->Opcode() == Op_CmpP) {
+ Node* in1 = n->in(1);
+ Node* in2 = n->in(2);
+ if (in1->bottom_type() == TypePtr::NULL_PTR) {
+ in2 = step_over_gc_barrier(in2);
+ }
+ if (in2->bottom_type() == TypePtr::NULL_PTR) {
+ in1 = step_over_gc_barrier(in1);
+ }
+ PhaseIterGVN* igvn = phase->is_IterGVN();
+ if (in1 != n->in(1)) {
+ if (igvn != NULL) {
+ n->set_req_X(1, in1, igvn);
+ } else {
+ n->set_req(1, in1);
+ }
+ assert(in2 == n->in(2), "only one change");
+ return n;
+ }
+ if (in2 != n->in(2)) {
+ if (igvn != NULL) {
+ n->set_req_X(2, in2, igvn);
+ } else {
+ n->set_req(2, in2);
+ }
+ return n;
+ }
+ } else if (can_reshape &&
n->Opcode() == Op_If &&
ShenandoahBarrierC2Support::is_heap_stable_test(n) &&
n->in(0) != NULL) {
Node* dom = n->in(0);
Node* prev_dom = n;
< prev index next >