mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
7199654: Remove LoadUI2LNode
Removed LoadUI2L node from Ideal nodes, use match rule in .ad files instead. Reviewed-by: kvn
This commit is contained in:
parent
61eb5a0549
commit
6674423523
10 changed files with 7 additions and 40 deletions
|
@ -5885,8 +5885,8 @@ instruct loadI2L_immI(iRegL dst, memory mem, immI mask, iRegL tmp) %{
|
||||||
%}
|
%}
|
||||||
|
|
||||||
// Load Unsigned Integer into a Long Register
|
// Load Unsigned Integer into a Long Register
|
||||||
instruct loadUI2L(iRegL dst, memory mem) %{
|
instruct loadUI2L(iRegL dst, memory mem, immL_32bits mask) %{
|
||||||
match(Set dst (LoadUI2L mem));
|
match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
|
||||||
ins_cost(MEMORY_REF_COST);
|
ins_cost(MEMORY_REF_COST);
|
||||||
|
|
||||||
size(4);
|
size(4);
|
||||||
|
|
|
@ -1558,9 +1558,6 @@ const RegMask Matcher::method_handle_invoke_SP_save_mask() {
|
||||||
// Returns true if the high 32 bits of the value is known to be zero.
|
// Returns true if the high 32 bits of the value is known to be zero.
|
||||||
bool is_operand_hi32_zero(Node* n) {
|
bool is_operand_hi32_zero(Node* n) {
|
||||||
int opc = n->Opcode();
|
int opc = n->Opcode();
|
||||||
if (opc == Op_LoadUI2L) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (opc == Op_AndL) {
|
if (opc == Op_AndL) {
|
||||||
Node* o2 = n->in(2);
|
Node* o2 = n->in(2);
|
||||||
if (o2->is_Con() && (o2->get_long() & 0xFFFFFFFF00000000LL) == 0LL) {
|
if (o2->is_Con() && (o2->get_long() & 0xFFFFFFFF00000000LL) == 0LL) {
|
||||||
|
@ -6152,8 +6149,8 @@ instruct loadI2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
|
||||||
%}
|
%}
|
||||||
|
|
||||||
// Load Unsigned Integer into Long Register
|
// Load Unsigned Integer into Long Register
|
||||||
instruct loadUI2L(eRegL dst, memory mem, eFlagsReg cr) %{
|
instruct loadUI2L(eRegL dst, memory mem, immL_32bits mask, eFlagsReg cr) %{
|
||||||
match(Set dst (LoadUI2L mem));
|
match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
|
||||||
effect(KILL cr);
|
effect(KILL cr);
|
||||||
|
|
||||||
ins_cost(250);
|
ins_cost(250);
|
||||||
|
|
|
@ -5200,9 +5200,9 @@ instruct loadI2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{
|
||||||
%}
|
%}
|
||||||
|
|
||||||
// Load Unsigned Integer into Long Register
|
// Load Unsigned Integer into Long Register
|
||||||
instruct loadUI2L(rRegL dst, memory mem)
|
instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask)
|
||||||
%{
|
%{
|
||||||
match(Set dst (LoadUI2L mem));
|
match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
|
||||||
|
|
||||||
ins_cost(125);
|
ins_cost(125);
|
||||||
format %{ "movl $dst, $mem\t# uint -> long" %}
|
format %{ "movl $dst, $mem\t# uint -> long" %}
|
||||||
|
|
|
@ -256,7 +256,6 @@ Form::DataType Form::is_load_from_memory(const char *opType) const {
|
||||||
if( strcmp(opType,"LoadD_unaligned")==0 ) return Form::idealD;
|
if( strcmp(opType,"LoadD_unaligned")==0 ) return Form::idealD;
|
||||||
if( strcmp(opType,"LoadF")==0 ) return Form::idealF;
|
if( strcmp(opType,"LoadF")==0 ) return Form::idealF;
|
||||||
if( strcmp(opType,"LoadI")==0 ) return Form::idealI;
|
if( strcmp(opType,"LoadI")==0 ) return Form::idealI;
|
||||||
if( strcmp(opType,"LoadUI2L")==0 ) return Form::idealI;
|
|
||||||
if( strcmp(opType,"LoadKlass")==0 ) return Form::idealP;
|
if( strcmp(opType,"LoadKlass")==0 ) return Form::idealP;
|
||||||
if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealNKlass;
|
if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealNKlass;
|
||||||
if( strcmp(opType,"LoadL")==0 ) return Form::idealL;
|
if( strcmp(opType,"LoadL")==0 ) return Form::idealL;
|
||||||
|
|
|
@ -3395,7 +3395,7 @@ int MatchNode::needs_ideal_memory_edge(FormDict &globals) const {
|
||||||
static const char *needs_ideal_memory_list[] = {
|
static const char *needs_ideal_memory_list[] = {
|
||||||
"StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" ,
|
"StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" ,
|
||||||
"StoreB","StoreC","Store" ,"StoreFP",
|
"StoreB","StoreC","Store" ,"StoreFP",
|
||||||
"LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" ,
|
"LoadI", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" ,
|
||||||
"LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
|
"LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" ,
|
||||||
"StoreVector", "LoadVector",
|
"StoreVector", "LoadVector",
|
||||||
"LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
|
"LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
|
||||||
|
|
|
@ -150,7 +150,6 @@ macro(LoadD)
|
||||||
macro(LoadD_unaligned)
|
macro(LoadD_unaligned)
|
||||||
macro(LoadF)
|
macro(LoadF)
|
||||||
macro(LoadI)
|
macro(LoadI)
|
||||||
macro(LoadUI2L)
|
|
||||||
macro(LoadKlass)
|
macro(LoadKlass)
|
||||||
macro(LoadNKlass)
|
macro(LoadNKlass)
|
||||||
macro(LoadL)
|
macro(LoadL)
|
||||||
|
|
|
@ -2293,7 +2293,6 @@ static void final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc ) {
|
||||||
case Op_LoadUB:
|
case Op_LoadUB:
|
||||||
case Op_LoadUS:
|
case Op_LoadUS:
|
||||||
case Op_LoadI:
|
case Op_LoadI:
|
||||||
case Op_LoadUI2L:
|
|
||||||
case Op_LoadKlass:
|
case Op_LoadKlass:
|
||||||
case Op_LoadNKlass:
|
case Op_LoadNKlass:
|
||||||
case Op_LoadL:
|
case Op_LoadL:
|
||||||
|
|
|
@ -274,18 +274,6 @@ public:
|
||||||
virtual BasicType memory_type() const { return T_INT; }
|
virtual BasicType memory_type() const { return T_INT; }
|
||||||
};
|
};
|
||||||
|
|
||||||
//------------------------------LoadUI2LNode-----------------------------------
|
|
||||||
// Load an unsigned integer into long from memory
|
|
||||||
class LoadUI2LNode : public LoadNode {
|
|
||||||
public:
|
|
||||||
LoadUI2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong* t = TypeLong::UINT)
|
|
||||||
: LoadNode(c, mem, adr, at, t) {}
|
|
||||||
virtual int Opcode() const;
|
|
||||||
virtual uint ideal_reg() const { return Op_RegL; }
|
|
||||||
virtual int store_Opcode() const { return Op_StoreL; }
|
|
||||||
virtual BasicType memory_type() const { return T_LONG; }
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------LoadRangeNode----------------------------------
|
//------------------------------LoadRangeNode----------------------------------
|
||||||
// Load an array length from the array
|
// Load an array length from the array
|
||||||
class LoadRangeNode : public LoadINode {
|
class LoadRangeNode : public LoadINode {
|
||||||
|
|
|
@ -599,20 +599,6 @@ Node *AndLNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||||
Node* in1 = in(1);
|
Node* in1 = in(1);
|
||||||
uint op = in1->Opcode();
|
uint op = in1->Opcode();
|
||||||
|
|
||||||
// Masking sign bits off of an integer? Do an unsigned integer to
|
|
||||||
// long load.
|
|
||||||
// NOTE: This check must be *before* we try to convert the AndLNode
|
|
||||||
// to an AndINode and commute it with ConvI2LNode because
|
|
||||||
// 0xFFFFFFFFL masks the whole integer and we get a sign extension,
|
|
||||||
// which is wrong.
|
|
||||||
if (op == Op_ConvI2L && in1->in(1)->Opcode() == Op_LoadI && mask == CONST64(0x00000000FFFFFFFF)) {
|
|
||||||
Node* load = in1->in(1);
|
|
||||||
return new (phase->C) LoadUI2LNode(load->in(MemNode::Control),
|
|
||||||
load->in(MemNode::Memory),
|
|
||||||
load->in(MemNode::Address),
|
|
||||||
load->adr_type());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Are we masking a long that was converted from an int with a mask
|
// Are we masking a long that was converted from an int with a mask
|
||||||
// that fits in 32-bits? Commute them and use an AndINode. Don't
|
// that fits in 32-bits? Commute them and use an AndINode. Don't
|
||||||
// convert masks which would cause a sign extension of the integer
|
// convert masks which would cause a sign extension of the integer
|
||||||
|
|
|
@ -179,7 +179,6 @@ void SuperWord::find_adjacent_refs() {
|
||||||
for (int i = 0; i < _block.length(); i++) {
|
for (int i = 0; i < _block.length(); i++) {
|
||||||
Node* n = _block.at(i);
|
Node* n = _block.at(i);
|
||||||
if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) &&
|
if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) &&
|
||||||
n->Opcode() != Op_LoadUI2L &&
|
|
||||||
is_java_primitive(n->as_Mem()->memory_type())) {
|
is_java_primitive(n->as_Mem()->memory_type())) {
|
||||||
int align = memory_alignment(n->as_Mem(), 0);
|
int align = memory_alignment(n->as_Mem(), 0);
|
||||||
if (align != bottom_align) {
|
if (align != bottom_align) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue