< prev index next >

src/hotspot/share/opto/stringopts.cpp

Print this page




 304         result->append(other->argument(y), other->mode(y));
 305       }
 306     } else {
 307       result->append(argx, mode(x));
 308     }
 309   }
 310   result->set_allocation(other->_begin);
 311   for (uint i = 0; i < _constructors.size(); i++) {
 312     result->add_constructor(_constructors.at(i));
 313   }
 314   for (uint i = 0; i < other->_constructors.size(); i++) {
 315     result->add_constructor(other->_constructors.at(i));
 316   }
 317   result->_multiple = true;
 318   return result;
 319 }
 320 
 321 
 322 void StringConcat::eliminate_call(CallNode* call) {
 323   Compile* C = _stringopts->C;
 324   CallProjections projs;
 325   call->extract_projections(&projs, false);
 326   if (projs.fallthrough_catchproj != NULL) {
 327     C->gvn_replace_by(projs.fallthrough_catchproj, call->in(TypeFunc::Control));
 328   }
 329   if (projs.fallthrough_memproj != NULL) {
 330     C->gvn_replace_by(projs.fallthrough_memproj, call->in(TypeFunc::Memory));
 331   }
 332   if (projs.catchall_memproj != NULL) {
 333     C->gvn_replace_by(projs.catchall_memproj, C->top());
 334   }
 335   if (projs.fallthrough_ioproj != NULL) {
 336     C->gvn_replace_by(projs.fallthrough_ioproj, call->in(TypeFunc::I_O));
 337   }
 338   if (projs.catchall_ioproj != NULL) {
 339     C->gvn_replace_by(projs.catchall_ioproj, C->top());
 340   }
 341   if (projs.catchall_catchproj != NULL) {
 342     // EA can't cope with the partially collapsed graph this
 343     // creates so put it on the worklist to be collapsed later.
 344     for (SimpleDUIterator i(projs.catchall_catchproj); i.has_next(); i.next()) {
 345       Node *use = i.get();
 346       int opc = use->Opcode();
 347       if (opc == Op_CreateEx || opc == Op_Region) {
 348         _stringopts->record_dead_node(use);
 349       }
 350     }
 351     C->gvn_replace_by(projs.catchall_catchproj, C->top());
 352   }
 353   if (projs.resproj != NULL) {
 354     C->gvn_replace_by(projs.resproj, C->top());

 355   }
 356   C->gvn_replace_by(call, C->top());
 357 }
 358 
 359 void StringConcat::eliminate_initialize(InitializeNode* init) {
 360   Compile* C = _stringopts->C;
 361 
 362   // Eliminate Initialize node.
 363   assert(init->outcnt() <= 2, "only a control and memory projection expected");
 364   assert(init->req() <= InitializeNode::RawStores, "no pending inits");
 365   Node *ctrl_proj = init->proj_out_or_null(TypeFunc::Control);
 366   if (ctrl_proj != NULL) {
 367     C->gvn_replace_by(ctrl_proj, init->in(TypeFunc::Control));
 368   }
 369   Node *mem_proj = init->proj_out_or_null(TypeFunc::Memory);
 370   if (mem_proj != NULL) {
 371     Node *mem = init->in(TypeFunc::Memory);
 372     C->gvn_replace_by(mem_proj, mem);
 373   }
 374   C->gvn_replace_by(init, C->top());




 304         result->append(other->argument(y), other->mode(y));
 305       }
 306     } else {
 307       result->append(argx, mode(x));
 308     }
 309   }
 310   result->set_allocation(other->_begin);
 311   for (uint i = 0; i < _constructors.size(); i++) {
 312     result->add_constructor(_constructors.at(i));
 313   }
 314   for (uint i = 0; i < other->_constructors.size(); i++) {
 315     result->add_constructor(other->_constructors.at(i));
 316   }
 317   result->_multiple = true;
 318   return result;
 319 }
 320 
 321 
 322 void StringConcat::eliminate_call(CallNode* call) {
 323   Compile* C = _stringopts->C;
 324   CallProjections* projs = call->extract_projections(false);
 325   if (projs->fallthrough_catchproj != NULL) {
 326     C->gvn_replace_by(projs->fallthrough_catchproj, call->in(TypeFunc::Control));

 327   }
 328   if (projs->fallthrough_memproj != NULL) {
 329     C->gvn_replace_by(projs->fallthrough_memproj, call->in(TypeFunc::Memory));
 330   }
 331   if (projs->catchall_memproj != NULL) {
 332     C->gvn_replace_by(projs->catchall_memproj, C->top());
 333   }
 334   if (projs->fallthrough_ioproj != NULL) {
 335     C->gvn_replace_by(projs->fallthrough_ioproj, call->in(TypeFunc::I_O));
 336   }
 337   if (projs->catchall_ioproj != NULL) {
 338     C->gvn_replace_by(projs->catchall_ioproj, C->top());
 339   }
 340   if (projs->catchall_catchproj != NULL) {
 341     // EA can't cope with the partially collapsed graph this
 342     // creates so put it on the worklist to be collapsed later.
 343     for (SimpleDUIterator i(projs->catchall_catchproj); i.has_next(); i.next()) {
 344       Node *use = i.get();
 345       int opc = use->Opcode();
 346       if (opc == Op_CreateEx || opc == Op_Region) {
 347         _stringopts->record_dead_node(use);
 348       }
 349     }
 350     C->gvn_replace_by(projs->catchall_catchproj, C->top());
 351   }
 352   if (projs->resproj[0] != NULL) {
 353     assert(projs->nb_resproj == 1, "unexpected number of results");
 354     C->gvn_replace_by(projs->resproj[0], C->top());
 355   }
 356   C->gvn_replace_by(call, C->top());
 357 }
 358 
 359 void StringConcat::eliminate_initialize(InitializeNode* init) {
 360   Compile* C = _stringopts->C;
 361 
 362   // Eliminate Initialize node.
 363   assert(init->outcnt() <= 2, "only a control and memory projection expected");
 364   assert(init->req() <= InitializeNode::RawStores, "no pending inits");
 365   Node *ctrl_proj = init->proj_out_or_null(TypeFunc::Control);
 366   if (ctrl_proj != NULL) {
 367     C->gvn_replace_by(ctrl_proj, init->in(TypeFunc::Control));
 368   }
 369   Node *mem_proj = init->proj_out_or_null(TypeFunc::Memory);
 370   if (mem_proj != NULL) {
 371     Node *mem = init->in(TypeFunc::Memory);
 372     C->gvn_replace_by(mem_proj, mem);
 373   }
 374   C->gvn_replace_by(init, C->top());


< prev index next >