< prev index next >
src/hotspot/share/opto/subnode.cpp
Print this page
rev 53156 : Use BarrierSetC2::ideal_node() API for CmpPNode::Ideal()
*** 36,49 ****
#include "opto/mulnode.hpp"
#include "opto/opcodes.hpp"
#include "opto/phaseX.hpp"
#include "opto/subnode.hpp"
#include "runtime/sharedRuntime.hpp"
- #include "utilities/macros.hpp"
- #if INCLUDE_SHENANDOAHGC
- #include "gc/shenandoah/c2/shenandoahSupport.hpp"
- #endif
// Portions of code courtesy of Clifford Click
// Optimization - Graph Style
--- 36,45 ----
*** 939,979 ****
// Also check for the case of comparing an unknown klass loaded from the primary
// super-type array vs a known klass with no subtypes. This amounts to
// checking to see an unknown klass subtypes a known klass with no subtypes;
// this only happens on an exact match. We can shorten this test by 1 load.
Node *CmpPNode::Ideal( PhaseGVN *phase, bool can_reshape ) {
! BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
! #if INCLUDE_SHENANDOAHGC
! if (UseShenandoahGC) {
! Node* in1 = in(1);
! Node* in2 = in(2);
! if (in1->bottom_type() == TypePtr::NULL_PTR) {
! in2 = bs->step_over_gc_barrier(in2);
! }
! if (in2->bottom_type() == TypePtr::NULL_PTR) {
! in1 = bs->step_over_gc_barrier(in1);
! }
! PhaseIterGVN* igvn = phase->is_IterGVN();
! if (in1 != in(1)) {
! if (igvn != NULL) {
! set_req_X(1, in1, igvn);
! } else {
! set_req(1, in1);
}
- assert(in2 == in(2), "only one change");
- return this;
- }
- if (in2 != in(2)) {
- if (igvn != NULL) {
- set_req_X(2, in2, igvn);
- } else {
- set_req(2, in2);
- }
- return this;
- }
- }
- #endif
// Normalize comparisons between Java mirrors into comparisons of the low-
// level klass, where a dependent load could be shortened.
//
// The new pattern has a nice effect of matching the same pattern used in the
--- 935,948 ----
// Also check for the case of comparing an unknown klass loaded from the primary
// super-type array vs a known klass with no subtypes. This amounts to
// checking to see an unknown klass subtypes a known klass with no subtypes;
// this only happens on an exact match. We can shorten this test by 1 load.
Node *CmpPNode::Ideal( PhaseGVN *phase, bool can_reshape ) {
! Node *ideal = BarrierSet::barrier_set()->barrier_set_c2()->ideal_node(phase, this, can_reshape);
! if (ideal != NULL) {
! return ideal;
}
// Normalize comparisons between Java mirrors into comparisons of the low-
// level klass, where a dependent load could be shortened.
//
// The new pattern has a nice effect of matching the same pattern used in the
< prev index next >