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()) {