annotate src/share/vm/opto/stringopts.hpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
2 * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
4 *
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
7 * published by the Free Software Foundation.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
8 *
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
13 * accompanied this code).
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
14 *
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1080
diff changeset
21 * questions.
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
22 *
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
23 */
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
24
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
25 class StringConcat;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
26
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
27 class PhaseStringOpts : public Phase {
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
28 friend class StringConcat;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
29
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
30 private:
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
31 PhaseGVN* _gvn;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
32
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
33 // List of dead nodes to clean up aggressively at the end
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
34 Unique_Node_List dead_worklist;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
35
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
36 // Memory slices needed for code gen
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
37 int char_adr_idx;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
38 int value_field_idx;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
39 int count_field_idx;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
40 int offset_field_idx;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
41
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
42 // Integer.sizeTable - used for int to String conversion
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
43 ciField* size_table_field;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
44
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
45 // A set for use by various stages
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
46 VectorSet _visited;
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
47
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
48 // Collect a list of all SB.toString calls
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
49 Node_List collect_toString_calls();
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
50
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
51 // Examine the use of the SB alloc to see if it can be replace with
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
52 // a single string construction.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
53 StringConcat* build_candidate(CallStaticJavaNode* call);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
54
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
55 // Replace all the SB calls in concat with an optimization String allocation
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
56 void replace_string_concat(StringConcat* concat);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
57
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
58 // Load the value of a static field, performing any constant folding.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
59 Node* fetch_static_field(GraphKit& kit, ciField* field);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
60
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
61 // Compute the number of characters required to represent the int value
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
62 Node* int_stringSize(GraphKit& kit, Node* value);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
63
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
64 // Copy the characters representing value into char_array starting at start
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
65 void int_getChars(GraphKit& kit, Node* value, Node* char_array, Node* start, Node* end);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
66
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
67 // Copy of the contents of the String str into char_array starting at index start.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
68 Node* copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
69
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
70 // Clean up any leftover nodes
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
71 void record_dead_node(Node* node);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
72 void remove_dead_nodes();
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
73
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
74 PhaseGVN* gvn() { return _gvn; }
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
75
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
76 enum {
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
77 // max length of constant string copy unrolling in copy_string
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
78 unroll_string_copy_length = 6
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
79 };
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
80
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
81 public:
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
82 PhaseStringOpts(PhaseGVN* gvn, Unique_Node_List* worklist);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents:
diff changeset
83 };