Mercurial > hg > truffle
comparison src/share/vm/opto/compile.hpp @ 8048:8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
Summary: Add support for expensive nodes.
Reviewed-by: kvn
author | roland |
---|---|
date | Tue, 12 Feb 2013 12:56:11 +0100 |
parents | 5698813d45eb |
children | 571076d3c79d |
comparison
equal
deleted
inserted
replaced
8047:1e5e28bac299 | 8048:8b3da8d14c93 |
---|---|
312 CompileLog* _log; // from CompilerThread | 312 CompileLog* _log; // from CompilerThread |
313 const char* _failure_reason; // for record_failure/failing pattern | 313 const char* _failure_reason; // for record_failure/failing pattern |
314 GrowableArray<CallGenerator*>* _intrinsics; // List of intrinsics. | 314 GrowableArray<CallGenerator*>* _intrinsics; // List of intrinsics. |
315 GrowableArray<Node*>* _macro_nodes; // List of nodes which need to be expanded before matching. | 315 GrowableArray<Node*>* _macro_nodes; // List of nodes which need to be expanded before matching. |
316 GrowableArray<Node*>* _predicate_opaqs; // List of Opaque1 nodes for the loop predicates. | 316 GrowableArray<Node*>* _predicate_opaqs; // List of Opaque1 nodes for the loop predicates. |
317 GrowableArray<Node*>* _expensive_nodes; // List of nodes that are expensive to compute and that we'd better not let the GVN freely common | |
317 ConnectionGraph* _congraph; | 318 ConnectionGraph* _congraph; |
318 #ifndef PRODUCT | 319 #ifndef PRODUCT |
319 IdealGraphPrinter* _printer; | 320 IdealGraphPrinter* _printer; |
320 #endif | 321 #endif |
321 | 322 |
395 void set_cg(CallGenerator* cg) { _cg = cg; } | 396 void set_cg(CallGenerator* cg) { _cg = cg; } |
396 }; | 397 }; |
397 | 398 |
398 GrowableArray<PrintInliningBuffer>* _print_inlining_list; | 399 GrowableArray<PrintInliningBuffer>* _print_inlining_list; |
399 int _print_inlining; | 400 int _print_inlining; |
401 | |
402 // Only keep nodes in the expensive node list that need to be optimized | |
403 void cleanup_expensive_nodes(PhaseIterGVN &igvn); | |
404 // Use for sorting expensive nodes to bring similar nodes together | |
405 static int cmp_expensive_nodes(Node** n1, Node** n2); | |
406 // Expensive nodes list already sorted? | |
407 bool expensive_nodes_sorted() const; | |
400 | 408 |
401 public: | 409 public: |
402 | 410 |
403 outputStream* print_inlining_stream() const { | 411 outputStream* print_inlining_stream() const { |
404 return _print_inlining_list->at(_print_inlining).ss(); | 412 return _print_inlining_list->at(_print_inlining).ss(); |
571 #endif | 579 #endif |
572 } | 580 } |
573 | 581 |
574 int macro_count() { return _macro_nodes->length(); } | 582 int macro_count() { return _macro_nodes->length(); } |
575 int predicate_count() { return _predicate_opaqs->length();} | 583 int predicate_count() { return _predicate_opaqs->length();} |
584 int expensive_count() { return _expensive_nodes->length(); } | |
576 Node* macro_node(int idx) { return _macro_nodes->at(idx); } | 585 Node* macro_node(int idx) { return _macro_nodes->at(idx); } |
577 Node* predicate_opaque1_node(int idx) { return _predicate_opaqs->at(idx);} | 586 Node* predicate_opaque1_node(int idx) { return _predicate_opaqs->at(idx);} |
587 Node* expensive_node(int idx) { return _expensive_nodes->at(idx); } | |
578 ConnectionGraph* congraph() { return _congraph;} | 588 ConnectionGraph* congraph() { return _congraph;} |
579 void set_congraph(ConnectionGraph* congraph) { _congraph = congraph;} | 589 void set_congraph(ConnectionGraph* congraph) { _congraph = congraph;} |
580 void add_macro_node(Node * n) { | 590 void add_macro_node(Node * n) { |
581 //assert(n->is_macro(), "must be a macro node"); | 591 //assert(n->is_macro(), "must be a macro node"); |
582 assert(!_macro_nodes->contains(n), " duplicate entry in expand list"); | 592 assert(!_macro_nodes->contains(n), " duplicate entry in expand list"); |
590 // remove from _predicate_opaqs list also if it is there | 600 // remove from _predicate_opaqs list also if it is there |
591 if (predicate_count() > 0 && _predicate_opaqs->contains(n)){ | 601 if (predicate_count() > 0 && _predicate_opaqs->contains(n)){ |
592 _predicate_opaqs->remove(n); | 602 _predicate_opaqs->remove(n); |
593 } | 603 } |
594 } | 604 } |
605 void add_expensive_node(Node * n); | |
606 void remove_expensive_node(Node * n) { | |
607 if (_expensive_nodes->contains(n)) { | |
608 _expensive_nodes->remove(n); | |
609 } | |
610 } | |
595 void add_predicate_opaq(Node * n) { | 611 void add_predicate_opaq(Node * n) { |
596 assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1"); | 612 assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1"); |
597 assert(_macro_nodes->contains(n), "should have already been in macro list"); | 613 assert(_macro_nodes->contains(n), "should have already been in macro list"); |
598 _predicate_opaqs->append(n); | 614 _predicate_opaqs->append(n); |
599 } | 615 } |
601 // uncommon traps will be eliminated from the graph. | 617 // uncommon traps will be eliminated from the graph. |
602 void cleanup_loop_predicates(PhaseIterGVN &igvn); | 618 void cleanup_loop_predicates(PhaseIterGVN &igvn); |
603 bool is_predicate_opaq(Node * n) { | 619 bool is_predicate_opaq(Node * n) { |
604 return _predicate_opaqs->contains(n); | 620 return _predicate_opaqs->contains(n); |
605 } | 621 } |
622 | |
623 // Are there candidate expensive nodes for optimization? | |
624 bool should_optimize_expensive_nodes(PhaseIterGVN &igvn); | |
625 // Check whether n1 and n2 are similar | |
626 static int cmp_expensive_nodes(Node* n1, Node* n2); | |
627 // Sort expensive nodes to locate similar expensive nodes | |
628 void sort_expensive_nodes(); | |
606 | 629 |
607 // Compilation environment. | 630 // Compilation environment. |
608 Arena* comp_arena() { return &_comp_arena; } | 631 Arena* comp_arena() { return &_comp_arena; } |
609 ciEnv* env() const { return _env; } | 632 ciEnv* env() const { return _env; } |
610 CompileLog* log() const { return _log; } | 633 CompileLog* log() const { return _log; } |