1/*
2 * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_OPTO_STRINGOPTS_HPP
26#define SHARE_OPTO_STRINGOPTS_HPP
27
28#include "opto/node.hpp"
29#include "opto/phaseX.hpp"
30
31class StringConcat;
32class IdealVariable;
33
34class PhaseStringOpts : public Phase {
35 friend class StringConcat;
36
37 private:
38 PhaseGVN* _gvn;
39
40 // List of dead nodes to clean up aggressively at the end
41 Unique_Node_List dead_worklist;
42
43 // Memory slices needed for code gen
44 int byte_adr_idx;
45
46 // Integer.sizeTable - used for int to String conversion
47 ciField* size_table_field;
48
49 // A set for use by various stages
50 VectorSet _visited;
51
52 // Collect a list of all SB.toString calls
53 Node_List collect_toString_calls();
54
55 // Examine the use of the SB alloc to see if it can be replace with
56 // a single string construction.
57 StringConcat* build_candidate(CallStaticJavaNode* call);
58
59 // Replace all the SB calls in concat with an optimization String allocation
60 void replace_string_concat(StringConcat* concat);
61
62 // Load the value of a static field, performing any constant folding.
63 Node* fetch_static_field(GraphKit& kit, ciField* field);
64
65 // Compute the number of characters required to represent the int value
66 Node* int_stringSize(GraphKit& kit, Node* value);
67
68 // Simplified version of Integer.getChars
69 void getChars(GraphKit& kit, Node* arg, Node* dst_array, BasicType bt, Node* end, Node* final_merge, Node* final_mem, int merge_index = 0);
70
71 // Copy the characters representing arg into dst_array starting at start
72 Node* int_getChars(GraphKit& kit, Node* arg, Node* dst_array, Node* dst_coder, Node* start, Node* size);
73
74 // Copy contents of the String str into dst_array starting at index start.
75 Node* copy_string(GraphKit& kit, Node* str, Node* dst_array, Node* dst_coder, Node* start);
76
77 // Copy 'count' bytes/chars from src_array to dst_array starting at index start
78 void arraycopy(GraphKit& kit, IdealKit& ideal, Node* src_array, Node* dst_array, BasicType elembt, Node* start, Node* count);
79
80 // Copy contents of constant src_array to dst_array by emitting individual stores
81 void copy_constant_string(GraphKit& kit, IdealKit& ideal, ciTypeArray* src_array, IdealVariable& count,
82 bool src_is_byte, Node* dst_array, Node* dst_coder, Node* start);
83
84 // Copy contents of a Latin1 encoded string from src_array to dst_array
85 void copy_latin1_string(GraphKit& kit, IdealKit& ideal, Node* src_array, IdealVariable& count,
86 Node* dst_array, Node* dst_coder, Node* start);
87
88 // Copy the char into dst_array at index start.
89 Node* copy_char(GraphKit& kit, Node* val, Node* dst_array, Node* dst_coder, Node* start);
90
91 // Allocate a byte array of specified length.
92 Node* allocate_byte_array(GraphKit& kit, IdealKit* ideal, Node* length);
93
94 // Returns the coder of a constant string
95 jbyte get_constant_coder(GraphKit& kit, Node* str);
96
97 // Returns the length of a constant string
98 int get_constant_length(GraphKit& kit, Node* str);
99
100 // Returns the value array of a constant string
101 ciTypeArray* get_constant_value(GraphKit& kit, Node* str);
102
103 // Clean up any leftover nodes
104 void record_dead_node(Node* node);
105 void remove_dead_nodes();
106
107 PhaseGVN* gvn() { return _gvn; }
108
109 enum {
110 // max length of constant string copy unrolling in copy_string
111 unroll_string_copy_length = 6
112 };
113
114 public:
115 PhaseStringOpts(PhaseGVN* gvn, Unique_Node_List* worklist);
116};
117
118#endif // SHARE_OPTO_STRINGOPTS_HPP
119