Skip to content

Commit eb85b8d

Browse files
committed
8255665: C2 should aggressively remove temporary hook nodes
Reviewed-by: chagedorn, kvn
1 parent 18bc95b commit eb85b8d

16 files changed

+41
-79
lines changed

src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2377,7 +2377,7 @@ void MemoryGraphFixer::collect_memory_nodes() {
23772377
while (dead_phis.size() > 0) {
23782378
Node* n = dead_phis.pop();
23792379
n->replace_by(_phase->C->top());
2380-
n->destruct();
2380+
n->destruct(&_phase->igvn());
23812381
}
23822382
for (int i = rpo_list.size() - 1; i >= 0; i--) {
23832383
Node* c = rpo_list.at(i);

src/hotspot/share/opto/arraycopynode.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ Node* ArrayCopyNode::try_clone_instance(PhaseGVN *phase, bool can_reshape, int c
183183

184184
const Type* src_type = phase->type(base_src);
185185

186-
MergeMemNode* mem = MergeMemNode::make(in_mem);
186+
MergeMemNode* mem = phase->transform(MergeMemNode::make(in_mem))->as_MergeMem();
187187

188188
const TypeInstPtr* inst_src = src_type->isa_instptr();
189189

@@ -367,7 +367,7 @@ void ArrayCopyNode::array_copy_test_overlap(PhaseGVN *phase, bool can_reshape, b
367367
Node* ArrayCopyNode::array_copy_forward(PhaseGVN *phase,
368368
bool can_reshape,
369369
Node*& forward_ctl,
370-
MergeMemNode* mm,
370+
Node* mem,
371371
const TypePtr* atp_src,
372372
const TypePtr* atp_dest,
373373
Node* adr_src,
@@ -379,7 +379,7 @@ Node* ArrayCopyNode::array_copy_forward(PhaseGVN *phase,
379379
int count) {
380380
if (!forward_ctl->is_top()) {
381381
// copy forward
382-
mm = mm->clone()->as_MergeMem();
382+
MergeMemNode* mm = MergeMemNode::make(mem);
383383

384384
if (count > 0) {
385385
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
@@ -392,7 +392,7 @@ Node* ArrayCopyNode::array_copy_forward(PhaseGVN *phase,
392392
v = load(bs, phase, forward_ctl, mm, next_src, atp_src, value_type, copy_type);
393393
store(bs, phase, forward_ctl, mm, next_dest, atp_dest, v, value_type, copy_type);
394394
}
395-
} else if(can_reshape) {
395+
} else if (can_reshape) {
396396
PhaseIterGVN* igvn = phase->is_IterGVN();
397397
igvn->_worklist.push(adr_src);
398398
igvn->_worklist.push(adr_dest);
@@ -405,7 +405,7 @@ Node* ArrayCopyNode::array_copy_forward(PhaseGVN *phase,
405405
Node* ArrayCopyNode::array_copy_backward(PhaseGVN *phase,
406406
bool can_reshape,
407407
Node*& backward_ctl,
408-
MergeMemNode* mm,
408+
Node* mem,
409409
const TypePtr* atp_src,
410410
const TypePtr* atp_dest,
411411
Node* adr_src,
@@ -417,7 +417,7 @@ Node* ArrayCopyNode::array_copy_backward(PhaseGVN *phase,
417417
int count) {
418418
if (!backward_ctl->is_top()) {
419419
// copy backward
420-
mm = mm->clone()->as_MergeMem();
420+
MergeMemNode* mm = MergeMemNode::make(mem);
421421

422422
BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
423423
assert(copy_type != T_OBJECT || !bs->array_copy_requires_gc_barriers(false, T_OBJECT, false, BarrierSetC2::Optimization), "only tightly coupled allocations for object arrays");
@@ -432,7 +432,7 @@ Node* ArrayCopyNode::array_copy_backward(PhaseGVN *phase,
432432
}
433433
Node* v = load(bs, phase, backward_ctl, mm, adr_src, atp_src, value_type, copy_type);
434434
store(bs, phase, backward_ctl, mm, adr_dest, atp_dest, v, value_type, copy_type);
435-
} else if(can_reshape) {
435+
} else if (can_reshape) {
436436
PhaseIterGVN* igvn = phase->is_IterGVN();
437437
igvn->_worklist.push(adr_src);
438438
igvn->_worklist.push(adr_dest);
@@ -564,11 +564,7 @@ Node *ArrayCopyNode::Ideal(PhaseGVN *phase, bool can_reshape) {
564564
Node* dest = in(ArrayCopyNode::Dest);
565565
const TypePtr* atp_src = get_address_type(phase, _src_type, src);
566566
const TypePtr* atp_dest = get_address_type(phase, _dest_type, dest);
567-
568-
Node *in_mem = in(TypeFunc::Memory);
569-
if (!in_mem->is_MergeMem()) {
570-
in_mem = MergeMemNode::make(in_mem);
571-
}
567+
Node* in_mem = in(TypeFunc::Memory);
572568

573569
if (can_reshape) {
574570
assert(!phase->is_IterGVN()->delay_transform(), "cannot delay transforms");
@@ -580,13 +576,13 @@ Node *ArrayCopyNode::Ideal(PhaseGVN *phase, bool can_reshape) {
580576
array_copy_test_overlap(phase, can_reshape, disjoint_bases, count, forward_ctl, backward_ctl);
581577

582578
Node* forward_mem = array_copy_forward(phase, can_reshape, forward_ctl,
583-
in_mem->as_MergeMem(),
579+
in_mem,
584580
atp_src, atp_dest,
585581
adr_src, base_src, adr_dest, base_dest,
586582
copy_type, value_type, count);
587583

588584
Node* backward_mem = array_copy_backward(phase, can_reshape, backward_ctl,
589-
in_mem->as_MergeMem(),
585+
in_mem,
590586
atp_src, atp_dest,
591587
adr_src, base_src, adr_dest, base_dest,
592588
copy_type, value_type, count);

src/hotspot/share/opto/arraycopynode.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,12 @@ class ArrayCopyNode : public CallNode {
100100
bool disjoint_bases, int count,
101101
Node*& forward_ctl, Node*& backward_ctl);
102102
Node* array_copy_forward(PhaseGVN *phase, bool can_reshape, Node*& ctl,
103-
MergeMemNode* mm,
103+
Node* mem,
104104
const TypePtr* atp_src, const TypePtr* atp_dest,
105105
Node* adr_src, Node* base_src, Node* adr_dest, Node* base_dest,
106106
BasicType copy_type, const Type* value_type, int count);
107107
Node* array_copy_backward(PhaseGVN *phase, bool can_reshape, Node*& ctl,
108-
MergeMemNode* mm,
108+
Node* mem,
109109
const TypePtr* atp_src, const TypePtr* atp_dest,
110110
Node* adr_src, Node* base_src, Node* adr_dest, Node* base_dest,
111111
BasicType copy_type, const Type* value_type, int count);

src/hotspot/share/opto/cfgnode.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2302,12 +2302,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
23022302
Node* phi = mms.memory();
23032303
mms.set_memory(phase->transform(phi));
23042304
}
2305-
if (igvn) { // Unhook.
2306-
igvn->hash_delete(hook);
2307-
for (uint i = 1; i < hook->req(); i++) {
2308-
hook->set_req(i, NULL);
2309-
}
2310-
}
2305+
hook->destruct(igvn);
23112306
// Replace self with the result.
23122307
return result;
23132308
}

src/hotspot/share/opto/compile.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,8 +1128,7 @@ void Compile::print_missing_nodes() {
11281128
}
11291129
}
11301130
void Compile::record_modified_node(Node* n) {
1131-
if (_modified_nodes != NULL && !_inlining_incrementally &&
1132-
n->outcnt() != 0 && !n->is_Con()) {
1131+
if (_modified_nodes != NULL && !_inlining_incrementally && !n->is_Con()) {
11331132
_modified_nodes->push(n);
11341133
}
11351134
}

src/hotspot/share/opto/convertnode.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,7 @@ Node *ConvI2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
403403
Node *hook = new Node(1);
404404
hook->init_req(0, cx); // Add a use to cx to prevent him from dying
405405
Node* cy = phase->C->constrained_convI2L(phase, y, TypeInt::make(rylo, ryhi, widen), NULL);
406-
hook->del_req(0); // Just yank bogus edge
407-
hook->destruct();
406+
hook->destruct(phase);
408407
switch (op) {
409408
case Op_AddI: return new AddLNode(cx, cy);
410409
case Op_SubI: return new SubLNode(cx, cy);

src/hotspot/share/opto/divnode.cpp

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -326,14 +326,7 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
326326
Node* temp2 = phase->transform(new RShiftLNode(w1, phase->intcon(N / 2)));
327327

328328
// Remove the bogus extra edges used to keep things alive
329-
PhaseIterGVN* igvn = phase->is_IterGVN();
330-
if (igvn != NULL) {
331-
igvn->remove_dead_node(hook);
332-
} else {
333-
for (int i = 0; i < 4; i++) {
334-
hook->set_req(i, NULL);
335-
}
336-
}
329+
hook->destruct(phase);
337330

338331
return new AddLNode(temp1, temp2);
339332
}
@@ -916,11 +909,7 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
916909
// cmov2 is now the mod
917910

918911
// Now remove the bogus extra edges used to keep things alive
919-
if (can_reshape) {
920-
phase->is_IterGVN()->remove_dead_node(hook);
921-
} else {
922-
hook->set_req(0, NULL); // Just yank bogus edge during Parse phase
923-
}
912+
hook->destruct(phase);
924913
return cmov2;
925914
}
926915
}
@@ -972,11 +961,7 @@ Node *ModINode::Ideal(PhaseGVN *phase, bool can_reshape) {
972961
}
973962

974963
// Now remove the bogus extra edges used to keep things alive
975-
if (can_reshape) {
976-
phase->is_IterGVN()->remove_dead_node(hook);
977-
} else {
978-
hook->set_req(0, NULL); // Just yank bogus edge during Parse phase
979-
}
964+
hook->destruct(phase);
980965

981966
// return the value
982967
return result;
@@ -1091,11 +1076,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
10911076
// cmov2 is now the mod
10921077

10931078
// Now remove the bogus extra edges used to keep things alive
1094-
if (can_reshape) {
1095-
phase->is_IterGVN()->remove_dead_node(hook);
1096-
} else {
1097-
hook->set_req(0, NULL); // Just yank bogus edge during Parse phase
1098-
}
1079+
hook->destruct(phase);
10991080
return cmov2;
11001081
}
11011082
}
@@ -1147,11 +1128,7 @@ Node *ModLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
11471128
}
11481129

11491130
// Now remove the bogus extra edges used to keep things alive
1150-
if (can_reshape) {
1151-
phase->is_IterGVN()->remove_dead_node(hook);
1152-
} else {
1153-
hook->set_req(0, NULL); // Just yank bogus edge during Parse phase
1154-
}
1131+
hook->destruct(phase);
11551132

11561133
// return the value
11571134
return result;

src/hotspot/share/opto/ifnode.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -999,8 +999,7 @@ bool IfNode::fold_compares_helper(ProjNode* proj, ProjNode* success, ProjNode* f
999999
if (adjusted_lim == NULL) {
10001000
adjusted_lim = igvn->transform(new SubINode(hi, lo));
10011001
}
1002-
hook->del_req(0); // Just yank bogus edge
1003-
hook->destruct();
1002+
hook->destruct(igvn);
10041003
Node* newcmp = igvn->transform(new CmpUNode(adjusted_val, adjusted_lim));
10051004
Node* newbool = igvn->transform(new BoolNode(newcmp, cond));
10061005

src/hotspot/share/opto/lcm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ void PhaseCFG::implicit_null_check(Block* block, Node *proj, Node *val, int allo
430430
tmp1->replace_by(tmp);
431431
tmp2->replace_by(tmp1);
432432
tmp->replace_by(tmp2);
433-
tmp->destruct();
433+
tmp->destruct(NULL);
434434
}
435435

436436
// Remove the existing null check; use a new implicit null check instead.

src/hotspot/share/opto/loopPredicate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
727727
idx_type = (TypeInt*)mul->mul_ring(idx_type, scale_type);
728728
if (overflow || TypeInt::INT->higher_equal(idx_type)) {
729729
// May overflow
730-
mul->destruct();
730+
mul->destruct(&_igvn);
731731
if (!overflow) {
732732
max_idx_expr = new ConvI2LNode(max_idx_expr);
733733
register_new_node(max_idx_expr, ctrl);

0 commit comments

Comments
 (0)