Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/mulnode.cpp @ 6891:67f4c477c9ab
8000805: JMM issue: short loads are non-atomic
Summary: perform transforms during IGVN phase when Load has a single user.
Reviewed-by: jrose, kvn, twisti
author | vlivanov |
---|---|
date | Mon, 22 Oct 2012 11:44:30 -0700 |
parents | d804e148cff8 |
children | 2113136690bc |
comparison
equal
deleted
inserted
replaced
6890:aaeb9add1ab3 | 6891:67f4c477c9ab |
---|---|
477 if( lop == Op_LoadUS && | 477 if( lop == Op_LoadUS && |
478 (mask & 0xFFFF0000) ) // Can we make a smaller mask? | 478 (mask & 0xFFFF0000) ) // Can we make a smaller mask? |
479 return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF)); | 479 return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF)); |
480 | 480 |
481 // Masking bits off of a Short? Loading a Character does some masking | 481 // Masking bits off of a Short? Loading a Character does some masking |
482 if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { | 482 if (can_reshape && |
483 Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), | 483 load->outcnt() == 1 && load->unique_out() == this) { |
484 load->in(MemNode::Memory), | 484 if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { |
485 load->in(MemNode::Address), | 485 Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), |
486 load->adr_type()); | 486 load->in(MemNode::Memory), |
487 ldus = phase->transform(ldus); | 487 load->in(MemNode::Address), |
488 return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); | 488 load->adr_type()); |
489 } | 489 ldus = phase->transform(ldus); |
490 | 490 return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); |
491 // Masking sign bits off of a Byte? Do an unsigned byte load plus | 491 } |
492 // an and. | 492 |
493 if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { | 493 // Masking sign bits off of a Byte? Do an unsigned byte load plus |
494 Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), | 494 // an and. |
495 load->in(MemNode::Memory), | 495 if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { |
496 load->in(MemNode::Address), | 496 Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), |
497 load->adr_type()); | 497 load->in(MemNode::Memory), |
498 ldub = phase->transform(ldub); | 498 load->in(MemNode::Address), |
499 return new (phase->C) AndINode(ldub, phase->intcon(mask)); | 499 load->adr_type()); |
500 ldub = phase->transform(ldub); | |
501 return new (phase->C) AndINode(ldub, phase->intcon(mask)); | |
502 } | |
500 } | 503 } |
501 | 504 |
502 // Masking off sign bits? Dont make them! | 505 // Masking off sign bits? Dont make them! |
503 if( lop == Op_RShiftI ) { | 506 if( lop == Op_RShiftI ) { |
504 const TypeInt *t12 = phase->type(load->in(2))->isa_int(); | 507 const TypeInt *t12 = phase->type(load->in(2))->isa_int(); |
921 // combined optimization requires Identity only return direct inputs. | 924 // combined optimization requires Identity only return direct inputs. |
922 set_req(1, ld); | 925 set_req(1, ld); |
923 set_req(2, phase->intcon(0)); | 926 set_req(2, phase->intcon(0)); |
924 return this; | 927 return this; |
925 } | 928 } |
926 else if( ld->Opcode() == Op_LoadUS ) | 929 else if( can_reshape && |
930 ld->Opcode() == Op_LoadUS && | |
931 ld->outcnt() == 1 && ld->unique_out() == shl) | |
927 // Replace zero-extension-load with sign-extension-load | 932 // Replace zero-extension-load with sign-extension-load |
928 return new (phase->C) LoadSNode( ld->in(MemNode::Control), | 933 return new (phase->C) LoadSNode( ld->in(MemNode::Control), |
929 ld->in(MemNode::Memory), | 934 ld->in(MemNode::Memory), |
930 ld->in(MemNode::Address), | 935 ld->in(MemNode::Address), |
931 ld->adr_type()); | 936 ld->adr_type()); |