1.1 --- a/src/share/vm/opto/mulnode.cpp Fri Oct 19 14:21:09 2012 -0400 1.2 +++ b/src/share/vm/opto/mulnode.cpp Mon Oct 22 11:44:30 2012 -0700 1.3 @@ -479,24 +479,27 @@ 1.4 return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF)); 1.5 1.6 // Masking bits off of a Short? Loading a Character does some masking 1.7 - if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { 1.8 - Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), 1.9 - load->in(MemNode::Memory), 1.10 - load->in(MemNode::Address), 1.11 - load->adr_type()); 1.12 - ldus = phase->transform(ldus); 1.13 - return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); 1.14 - } 1.15 + if (can_reshape && 1.16 + load->outcnt() == 1 && load->unique_out() == this) { 1.17 + if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { 1.18 + Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), 1.19 + load->in(MemNode::Memory), 1.20 + load->in(MemNode::Address), 1.21 + load->adr_type()); 1.22 + ldus = phase->transform(ldus); 1.23 + return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); 1.24 + } 1.25 1.26 - // Masking sign bits off of a Byte? Do an unsigned byte load plus 1.27 - // an and. 1.28 - if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { 1.29 - Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), 1.30 - load->in(MemNode::Memory), 1.31 - load->in(MemNode::Address), 1.32 - load->adr_type()); 1.33 - ldub = phase->transform(ldub); 1.34 - return new (phase->C) AndINode(ldub, phase->intcon(mask)); 1.35 + // Masking sign bits off of a Byte? Do an unsigned byte load plus 1.36 + // an and. 1.37 + if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { 1.38 + Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), 1.39 + load->in(MemNode::Memory), 1.40 + load->in(MemNode::Address), 1.41 + load->adr_type()); 1.42 + ldub = phase->transform(ldub); 1.43 + return new (phase->C) AndINode(ldub, phase->intcon(mask)); 1.44 + } 1.45 } 1.46 1.47 // Masking off sign bits? Dont make them! 1.48 @@ -923,7 +926,9 @@ 1.49 set_req(2, phase->intcon(0)); 1.50 return this; 1.51 } 1.52 - else if( ld->Opcode() == Op_LoadUS ) 1.53 + else if( can_reshape && 1.54 + ld->Opcode() == Op_LoadUS && 1.55 + ld->outcnt() == 1 && ld->unique_out() == shl) 1.56 // Replace zero-extension-load with sign-extension-load 1.57 return new (phase->C) LoadSNode( ld->in(MemNode::Control), 1.58 ld->in(MemNode::Memory),