Tue, 09 Oct 2012 12:40:05 -0700
7199654: Remove LoadUI2LNode
Summary: Removed LoadUI2L node from Ideal nodes, use match rule in .ad files instead.
Reviewed-by: kvn
1.1 --- a/src/cpu/sparc/vm/sparc.ad Tue Oct 09 10:11:38 2012 +0200 1.2 +++ b/src/cpu/sparc/vm/sparc.ad Tue Oct 09 12:40:05 2012 -0700 1.3 @@ -5885,8 +5885,8 @@ 1.4 %} 1.5 1.6 // Load Unsigned Integer into a Long Register 1.7 -instruct loadUI2L(iRegL dst, memory mem) %{ 1.8 - match(Set dst (LoadUI2L mem)); 1.9 +instruct loadUI2L(iRegL dst, memory mem, immL_32bits mask) %{ 1.10 + match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); 1.11 ins_cost(MEMORY_REF_COST); 1.12 1.13 size(4);
2.1 --- a/src/cpu/x86/vm/x86_32.ad Tue Oct 09 10:11:38 2012 +0200 2.2 +++ b/src/cpu/x86/vm/x86_32.ad Tue Oct 09 12:40:05 2012 -0700 2.3 @@ -1558,9 +1558,6 @@ 2.4 // Returns true if the high 32 bits of the value is known to be zero. 2.5 bool is_operand_hi32_zero(Node* n) { 2.6 int opc = n->Opcode(); 2.7 - if (opc == Op_LoadUI2L) { 2.8 - return true; 2.9 - } 2.10 if (opc == Op_AndL) { 2.11 Node* o2 = n->in(2); 2.12 if (o2->is_Con() && (o2->get_long() & 0xFFFFFFFF00000000LL) == 0LL) { 2.13 @@ -6152,8 +6149,8 @@ 2.14 %} 2.15 2.16 // Load Unsigned Integer into Long Register 2.17 -instruct loadUI2L(eRegL dst, memory mem, eFlagsReg cr) %{ 2.18 - match(Set dst (LoadUI2L mem)); 2.19 +instruct loadUI2L(eRegL dst, memory mem, immL_32bits mask, eFlagsReg cr) %{ 2.20 + match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); 2.21 effect(KILL cr); 2.22 2.23 ins_cost(250);
3.1 --- a/src/cpu/x86/vm/x86_64.ad Tue Oct 09 10:11:38 2012 +0200 3.2 +++ b/src/cpu/x86/vm/x86_64.ad Tue Oct 09 12:40:05 2012 -0700 3.3 @@ -5200,9 +5200,9 @@ 3.4 %} 3.5 3.6 // Load Unsigned Integer into Long Register 3.7 -instruct loadUI2L(rRegL dst, memory mem) 3.8 -%{ 3.9 - match(Set dst (LoadUI2L mem)); 3.10 +instruct loadUI2L(rRegL dst, memory mem, immL_32bits mask) 3.11 +%{ 3.12 + match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); 3.13 3.14 ins_cost(125); 3.15 format %{ "movl $dst, $mem\t# uint -> long" %}
4.1 --- a/src/share/vm/adlc/forms.cpp Tue Oct 09 10:11:38 2012 +0200 4.2 +++ b/src/share/vm/adlc/forms.cpp Tue Oct 09 12:40:05 2012 -0700 4.3 @@ -256,7 +256,6 @@ 4.4 if( strcmp(opType,"LoadD_unaligned")==0 ) return Form::idealD; 4.5 if( strcmp(opType,"LoadF")==0 ) return Form::idealF; 4.6 if( strcmp(opType,"LoadI")==0 ) return Form::idealI; 4.7 - if( strcmp(opType,"LoadUI2L")==0 ) return Form::idealI; 4.8 if( strcmp(opType,"LoadKlass")==0 ) return Form::idealP; 4.9 if( strcmp(opType,"LoadNKlass")==0 ) return Form::idealNKlass; 4.10 if( strcmp(opType,"LoadL")==0 ) return Form::idealL;
5.1 --- a/src/share/vm/adlc/formssel.cpp Tue Oct 09 10:11:38 2012 +0200 5.2 +++ b/src/share/vm/adlc/formssel.cpp Tue Oct 09 12:40:05 2012 -0700 5.3 @@ -3395,7 +3395,7 @@ 5.4 static const char *needs_ideal_memory_list[] = { 5.5 "StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" , 5.6 "StoreB","StoreC","Store" ,"StoreFP", 5.7 - "LoadI", "LoadUI2L", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , 5.8 + "LoadI", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , 5.9 "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" , 5.10 "StoreVector", "LoadVector", 5.11 "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned",
6.1 --- a/src/share/vm/opto/classes.hpp Tue Oct 09 10:11:38 2012 +0200 6.2 +++ b/src/share/vm/opto/classes.hpp Tue Oct 09 12:40:05 2012 -0700 6.3 @@ -150,7 +150,6 @@ 6.4 macro(LoadD_unaligned) 6.5 macro(LoadF) 6.6 macro(LoadI) 6.7 -macro(LoadUI2L) 6.8 macro(LoadKlass) 6.9 macro(LoadNKlass) 6.10 macro(LoadL)
7.1 --- a/src/share/vm/opto/compile.cpp Tue Oct 09 10:11:38 2012 +0200 7.2 +++ b/src/share/vm/opto/compile.cpp Tue Oct 09 12:40:05 2012 -0700 7.3 @@ -2293,7 +2293,6 @@ 7.4 case Op_LoadUB: 7.5 case Op_LoadUS: 7.6 case Op_LoadI: 7.7 - case Op_LoadUI2L: 7.8 case Op_LoadKlass: 7.9 case Op_LoadNKlass: 7.10 case Op_LoadL:
8.1 --- a/src/share/vm/opto/memnode.hpp Tue Oct 09 10:11:38 2012 +0200 8.2 +++ b/src/share/vm/opto/memnode.hpp Tue Oct 09 12:40:05 2012 -0700 8.3 @@ -274,18 +274,6 @@ 8.4 virtual BasicType memory_type() const { return T_INT; } 8.5 }; 8.6 8.7 -//------------------------------LoadUI2LNode----------------------------------- 8.8 -// Load an unsigned integer into long from memory 8.9 -class LoadUI2LNode : public LoadNode { 8.10 -public: 8.11 - LoadUI2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong* t = TypeLong::UINT) 8.12 - : LoadNode(c, mem, adr, at, t) {} 8.13 - virtual int Opcode() const; 8.14 - virtual uint ideal_reg() const { return Op_RegL; } 8.15 - virtual int store_Opcode() const { return Op_StoreL; } 8.16 - virtual BasicType memory_type() const { return T_LONG; } 8.17 -}; 8.18 - 8.19 //------------------------------LoadRangeNode---------------------------------- 8.20 // Load an array length from the array 8.21 class LoadRangeNode : public LoadINode {
9.1 --- a/src/share/vm/opto/mulnode.cpp Tue Oct 09 10:11:38 2012 +0200 9.2 +++ b/src/share/vm/opto/mulnode.cpp Tue Oct 09 12:40:05 2012 -0700 9.3 @@ -599,20 +599,6 @@ 9.4 Node* in1 = in(1); 9.5 uint op = in1->Opcode(); 9.6 9.7 - // Masking sign bits off of an integer? Do an unsigned integer to 9.8 - // long load. 9.9 - // NOTE: This check must be *before* we try to convert the AndLNode 9.10 - // to an AndINode and commute it with ConvI2LNode because 9.11 - // 0xFFFFFFFFL masks the whole integer and we get a sign extension, 9.12 - // which is wrong. 9.13 - if (op == Op_ConvI2L && in1->in(1)->Opcode() == Op_LoadI && mask == CONST64(0x00000000FFFFFFFF)) { 9.14 - Node* load = in1->in(1); 9.15 - return new (phase->C) LoadUI2LNode(load->in(MemNode::Control), 9.16 - load->in(MemNode::Memory), 9.17 - load->in(MemNode::Address), 9.18 - load->adr_type()); 9.19 - } 9.20 - 9.21 // Are we masking a long that was converted from an int with a mask 9.22 // that fits in 32-bits? Commute them and use an AndINode. Don't 9.23 // convert masks which would cause a sign extension of the integer
10.1 --- a/src/share/vm/opto/superword.cpp Tue Oct 09 10:11:38 2012 +0200 10.2 +++ b/src/share/vm/opto/superword.cpp Tue Oct 09 12:40:05 2012 -0700 10.3 @@ -179,7 +179,6 @@ 10.4 for (int i = 0; i < _block.length(); i++) { 10.5 Node* n = _block.at(i); 10.6 if (n->is_Mem() && !n->is_LoadStore() && in_bb(n) && 10.7 - n->Opcode() != Op_LoadUI2L && 10.8 is_java_primitive(n->as_Mem()->memory_type())) { 10.9 int align = memory_alignment(n->as_Mem(), 0); 10.10 if (align != bottom_align) {