Mercurial > hg > truffle
comparison src/share/vm/opto/memnode.cpp @ 553:041fe019d769
6791132: bad control in autobox split code
Reviewed-by: kvn
author | never |
---|---|
date | Tue, 13 Jan 2009 11:43:20 -0800 |
parents | a1980da045cc |
children | 3b5ac9e7e6ea |
comparison
equal
deleted
inserted
replaced
551:6c4cda924d2e | 553:041fe019d769 |
---|---|
1074 // Push the loads from the phi that comes from valueOf up | 1074 // Push the loads from the phi that comes from valueOf up |
1075 // through it to allow elimination of the loads and the recovery | 1075 // through it to allow elimination of the loads and the recovery |
1076 // of the original value. | 1076 // of the original value. |
1077 Node* mem_phi = in(Memory); | 1077 Node* mem_phi = in(Memory); |
1078 Node* offset = in(Address)->in(AddPNode::Offset); | 1078 Node* offset = in(Address)->in(AddPNode::Offset); |
1079 Node* region = base->in(0); | |
1079 | 1080 |
1080 Node* in1 = clone(); | 1081 Node* in1 = clone(); |
1081 Node* in1_addr = in1->in(Address)->clone(); | 1082 Node* in1_addr = in1->in(Address)->clone(); |
1082 in1_addr->set_req(AddPNode::Base, base->in(allocation_index)); | 1083 in1_addr->set_req(AddPNode::Base, base->in(allocation_index)); |
1083 in1_addr->set_req(AddPNode::Address, base->in(allocation_index)); | 1084 in1_addr->set_req(AddPNode::Address, base->in(allocation_index)); |
1084 in1_addr->set_req(AddPNode::Offset, offset); | 1085 in1_addr->set_req(AddPNode::Offset, offset); |
1085 in1->set_req(0, base->in(allocation_index)); | 1086 in1->set_req(0, region->in(allocation_index)); |
1086 in1->set_req(Address, in1_addr); | 1087 in1->set_req(Address, in1_addr); |
1087 in1->set_req(Memory, mem_phi->in(allocation_index)); | 1088 in1->set_req(Memory, mem_phi->in(allocation_index)); |
1088 | 1089 |
1089 Node* in2 = clone(); | 1090 Node* in2 = clone(); |
1090 Node* in2_addr = in2->in(Address)->clone(); | 1091 Node* in2_addr = in2->in(Address)->clone(); |
1091 in2_addr->set_req(AddPNode::Base, base->in(load_index)); | 1092 in2_addr->set_req(AddPNode::Base, base->in(load_index)); |
1092 in2_addr->set_req(AddPNode::Address, base->in(load_index)); | 1093 in2_addr->set_req(AddPNode::Address, base->in(load_index)); |
1093 in2_addr->set_req(AddPNode::Offset, offset); | 1094 in2_addr->set_req(AddPNode::Offset, offset); |
1094 in2->set_req(0, base->in(load_index)); | 1095 in2->set_req(0, region->in(load_index)); |
1095 in2->set_req(Address, in2_addr); | 1096 in2->set_req(Address, in2_addr); |
1096 in2->set_req(Memory, mem_phi->in(load_index)); | 1097 in2->set_req(Memory, mem_phi->in(load_index)); |
1097 | 1098 |
1098 in1_addr = phase->transform(in1_addr); | 1099 in1_addr = phase->transform(in1_addr); |
1099 in1 = phase->transform(in1); | 1100 in1 = phase->transform(in1); |
1100 in2_addr = phase->transform(in2_addr); | 1101 in2_addr = phase->transform(in2_addr); |
1101 in2 = phase->transform(in2); | 1102 in2 = phase->transform(in2); |
1102 | 1103 |
1103 PhiNode* result = PhiNode::make_blank(base->in(0), this); | 1104 PhiNode* result = PhiNode::make_blank(region, this); |
1104 result->set_req(allocation_index, in1); | 1105 result->set_req(allocation_index, in1); |
1105 result->set_req(load_index, in2); | 1106 result->set_req(load_index, in2); |
1106 return result; | 1107 return result; |
1107 } | 1108 } |
1108 } else if (base->is_Load()) { | 1109 } else if (base->is_Load()) { |