< prev index next >

src/hotspot/share/opto/mulnode.cpp

`rev 50962 : [mq]: 8207011`
 ``` `````` 30 #include "opto/memnode.hpp" 31 #include "opto/mulnode.hpp" 32 #include "opto/phaseX.hpp" 33 #include "opto/subnode.hpp" 34 35 // Portions of code courtesy of Clifford Click 36 37 38 //============================================================================= 39 //------------------------------hash------------------------------------------- 40 // Hash function over MulNodes. Needs to be commutative; i.e., I swap 41 // (commute) inputs to MulNodes willy-nilly so the hash function must return 42 // the same value in the presence of edge swapping. 43 uint MulNode::hash() const { 44 return (uintptr_t)in(1) + (uintptr_t)in(2) + Opcode(); 45 } 46 47 //------------------------------Identity--------------------------------------- 48 // Multiplying a one preserves the other argument 49 Node* MulNode::Identity(PhaseGVN* phase) { 50 register const Type *one = mul_id(); // The multiplicative identity 51 if( phase->type( in(1) )->higher_equal( one ) ) return in(2); 52 if( phase->type( in(2) )->higher_equal( one ) ) return in(1); 53 54 return this; 55 } 56 57 //------------------------------Ideal------------------------------------------ 58 // We also canonicalize the Node, moving constants to the right input, 59 // and flatten expressions (so that 1+x+2 becomes x+3). 60 Node *MulNode::Ideal(PhaseGVN *phase, bool can_reshape) { 61 const Type *t1 = phase->type( in(1) ); 62 const Type *t2 = phase->type( in(2) ); 63 Node *progress = NULL; // Progress flag 64 // We are OK if right is a constant, or right is a load and 65 // left is a non-constant. 66 if( !(t2->singleton() || 67 (in(2)->is_Load() && !(t1->singleton() || in(1)->is_Load())) ) ) { 68 if( t1->singleton() || // Left input is a constant? 69 // Otherwise, sort inputs (commutativity) to help value numbering. 70 (in(1)->_idx > in(2)->_idx) ) { ``` ``` `````` 30 #include "opto/memnode.hpp" 31 #include "opto/mulnode.hpp" 32 #include "opto/phaseX.hpp" 33 #include "opto/subnode.hpp" 34 35 // Portions of code courtesy of Clifford Click 36 37 38 //============================================================================= 39 //------------------------------hash------------------------------------------- 40 // Hash function over MulNodes. Needs to be commutative; i.e., I swap 41 // (commute) inputs to MulNodes willy-nilly so the hash function must return 42 // the same value in the presence of edge swapping. 43 uint MulNode::hash() const { 44 return (uintptr_t)in(1) + (uintptr_t)in(2) + Opcode(); 45 } 46 47 //------------------------------Identity--------------------------------------- 48 // Multiplying a one preserves the other argument 49 Node* MulNode::Identity(PhaseGVN* phase) { 50 const Type *one = mul_id(); // The multiplicative identity 51 if( phase->type( in(1) )->higher_equal( one ) ) return in(2); 52 if( phase->type( in(2) )->higher_equal( one ) ) return in(1); 53 54 return this; 55 } 56 57 //------------------------------Ideal------------------------------------------ 58 // We also canonicalize the Node, moving constants to the right input, 59 // and flatten expressions (so that 1+x+2 becomes x+3). 60 Node *MulNode::Ideal(PhaseGVN *phase, bool can_reshape) { 61 const Type *t1 = phase->type( in(1) ); 62 const Type *t2 = phase->type( in(2) ); 63 Node *progress = NULL; // Progress flag 64 // We are OK if right is a constant, or right is a load and 65 // left is a non-constant. 66 if( !(t2->singleton() || 67 (in(2)->is_Load() && !(t1->singleton() || in(1)->is_Load())) ) ) { 68 if( t1->singleton() || // Left input is a constant? 69 // Otherwise, sort inputs (commutativity) to help value numbering. 70 (in(1)->_idx > in(2)->_idx) ) { ```