1/*
2 * Copyright (c) 2009, 2015, 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_VM_OPTO_STRINGOPTS_HPP
26#define SHARE_VM_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_VM_OPTO_STRINGOPTS_HPP
119