mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 19:44:41 +02:00
6892658: C2 should optimize some stringbuilder patterns
Reviewed-by: kvn, twisti
This commit is contained in:
parent
63cc2211ed
commit
9db2092b1b
35 changed files with 2245 additions and 115 deletions
|
@ -279,6 +279,34 @@ class GraphKit : public Phase {
|
|||
}
|
||||
Node* basic_plus_adr(Node* base, Node* ptr, Node* offset);
|
||||
|
||||
|
||||
// Some convenient shortcuts for common nodes
|
||||
Node* IfTrue(IfNode* iff) { return _gvn.transform(new (C,1) IfTrueNode(iff)); }
|
||||
Node* IfFalse(IfNode* iff) { return _gvn.transform(new (C,1) IfFalseNode(iff)); }
|
||||
|
||||
Node* AddI(Node* l, Node* r) { return _gvn.transform(new (C,3) AddINode(l, r)); }
|
||||
Node* SubI(Node* l, Node* r) { return _gvn.transform(new (C,3) SubINode(l, r)); }
|
||||
Node* MulI(Node* l, Node* r) { return _gvn.transform(new (C,3) MulINode(l, r)); }
|
||||
Node* DivI(Node* ctl, Node* l, Node* r) { return _gvn.transform(new (C,3) DivINode(ctl, l, r)); }
|
||||
|
||||
Node* AndI(Node* l, Node* r) { return _gvn.transform(new (C,3) AndINode(l, r)); }
|
||||
Node* OrI(Node* l, Node* r) { return _gvn.transform(new (C,3) OrINode(l, r)); }
|
||||
Node* XorI(Node* l, Node* r) { return _gvn.transform(new (C,3) XorINode(l, r)); }
|
||||
|
||||
Node* MaxI(Node* l, Node* r) { return _gvn.transform(new (C,3) MaxINode(l, r)); }
|
||||
Node* MinI(Node* l, Node* r) { return _gvn.transform(new (C,3) MinINode(l, r)); }
|
||||
|
||||
Node* LShiftI(Node* l, Node* r) { return _gvn.transform(new (C,3) LShiftINode(l, r)); }
|
||||
Node* RShiftI(Node* l, Node* r) { return _gvn.transform(new (C,3) RShiftINode(l, r)); }
|
||||
Node* URShiftI(Node* l, Node* r) { return _gvn.transform(new (C,3) URShiftINode(l, r)); }
|
||||
|
||||
Node* CmpI(Node* l, Node* r) { return _gvn.transform(new (C,3) CmpINode(l, r)); }
|
||||
Node* CmpL(Node* l, Node* r) { return _gvn.transform(new (C,3) CmpLNode(l, r)); }
|
||||
Node* CmpP(Node* l, Node* r) { return _gvn.transform(new (C,3) CmpPNode(l, r)); }
|
||||
Node* Bool(Node* cmp, BoolTest::mask relop) { return _gvn.transform(new (C,2) BoolNode(cmp, relop)); }
|
||||
|
||||
Node* AddP(Node* b, Node* a, Node* o) { return _gvn.transform(new (C,4) AddPNode(b, a, o)); }
|
||||
|
||||
// Convert between int and long, and size_t.
|
||||
// (See macros ConvI2X, etc., in type.hpp for ConvI2X, etc.)
|
||||
Node* ConvI2L(Node* offset);
|
||||
|
@ -400,7 +428,7 @@ class GraphKit : public Phase {
|
|||
void set_all_memory(Node* newmem);
|
||||
|
||||
// Create a memory projection from the call, then set_all_memory.
|
||||
void set_all_memory_call(Node* call);
|
||||
void set_all_memory_call(Node* call, bool separate_io_proj = false);
|
||||
|
||||
// Create a LoadNode, reading from the parser's memory state.
|
||||
// (Note: require_atomic_access is useful only with T_LONG.)
|
||||
|
@ -543,12 +571,12 @@ class GraphKit : public Phase {
|
|||
// Transform the call, and update the basics: control, i_o, memory.
|
||||
// (The next step is usually to call set_results_for_java_call.)
|
||||
void set_edges_for_java_call(CallJavaNode* call,
|
||||
bool must_throw = false);
|
||||
bool must_throw = false, bool separate_io_proj = false);
|
||||
|
||||
// Finish up a java call that was started by set_edges_for_java_call.
|
||||
// Call add_exception on any throw arising from the call.
|
||||
// Return the call result (transformed).
|
||||
Node* set_results_for_java_call(CallJavaNode* call);
|
||||
Node* set_results_for_java_call(CallJavaNode* call, bool separate_io_proj = false);
|
||||
|
||||
// Similar to set_edges_for_java_call, but simplified for runtime calls.
|
||||
void set_predefined_output_for_runtime_call(Node* call) {
|
||||
|
@ -559,6 +587,11 @@ class GraphKit : public Phase {
|
|||
const TypePtr* hook_mem);
|
||||
Node* set_predefined_input_for_runtime_call(SafePointNode* call);
|
||||
|
||||
// Replace the call with the current state of the kit. Requires
|
||||
// that the call was generated with separate io_projs so that
|
||||
// exceptional control flow can be handled properly.
|
||||
void replace_call(CallNode* call, Node* result);
|
||||
|
||||
// helper functions for statistics
|
||||
void increment_counter(address counter_addr); // increment a debug counter
|
||||
void increment_counter(Node* counter_addr); // increment a debug counter
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue