src/share/vm/opto/mulnode.cpp

changeset 4202
67f4c477c9ab
parent 4164
d804e148cff8
child 6479
2113136690bc
     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),

mercurial