comparison src/share/vm/opto/parse1.cpp @ 1609:4311f23817fd

6959430: Make sure raw loads have control edge Summary: check that raw loads have control edge Reviewed-by: never, twisti
author kvn
date Tue, 15 Jun 2010 18:07:27 -0700
parents c18cbe5936b8
children f95d63e2154a
comparison
equal deleted inserted replaced
1608:2389669474a6 1609:4311f23817fd
86 BasicType bt, 86 BasicType bt,
87 Node *local_addrs, 87 Node *local_addrs,
88 Node *local_addrs_base) { 88 Node *local_addrs_base) {
89 Node *mem = memory(Compile::AliasIdxRaw); 89 Node *mem = memory(Compile::AliasIdxRaw);
90 Node *adr = basic_plus_adr( local_addrs_base, local_addrs, -index*wordSize ); 90 Node *adr = basic_plus_adr( local_addrs_base, local_addrs, -index*wordSize );
91 Node *ctl = control();
91 92
92 // Very similar to LoadNode::make, except we handle un-aligned longs and 93 // Very similar to LoadNode::make, except we handle un-aligned longs and
93 // doubles on Sparc. Intel can handle them just fine directly. 94 // doubles on Sparc. Intel can handle them just fine directly.
94 Node *l; 95 Node *l;
95 switch( bt ) { // Signature is flattened 96 switch( bt ) { // Signature is flattened
96 case T_INT: l = new (C, 3) LoadINode( 0, mem, adr, TypeRawPtr::BOTTOM ); break; 97 case T_INT: l = new (C, 3) LoadINode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break;
97 case T_FLOAT: l = new (C, 3) LoadFNode( 0, mem, adr, TypeRawPtr::BOTTOM ); break; 98 case T_FLOAT: l = new (C, 3) LoadFNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break;
98 case T_ADDRESS: l = new (C, 3) LoadPNode( 0, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); break; 99 case T_ADDRESS: l = new (C, 3) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); break;
99 case T_OBJECT: l = new (C, 3) LoadPNode( 0, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break; 100 case T_OBJECT: l = new (C, 3) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break;
100 case T_LONG: 101 case T_LONG:
101 case T_DOUBLE: { 102 case T_DOUBLE: {
102 // Since arguments are in reverse order, the argument address 'adr' 103 // Since arguments are in reverse order, the argument address 'adr'
103 // refers to the back half of the long/double. Recompute adr. 104 // refers to the back half of the long/double. Recompute adr.
104 adr = basic_plus_adr( local_addrs_base, local_addrs, -(index+1)*wordSize ); 105 adr = basic_plus_adr( local_addrs_base, local_addrs, -(index+1)*wordSize );
105 if( Matcher::misaligned_doubles_ok ) { 106 if( Matcher::misaligned_doubles_ok ) {
106 l = (bt == T_DOUBLE) 107 l = (bt == T_DOUBLE)
107 ? (Node*)new (C, 3) LoadDNode( 0, mem, adr, TypeRawPtr::BOTTOM ) 108 ? (Node*)new (C, 3) LoadDNode( ctl, mem, adr, TypeRawPtr::BOTTOM )
108 : (Node*)new (C, 3) LoadLNode( 0, mem, adr, TypeRawPtr::BOTTOM ); 109 : (Node*)new (C, 3) LoadLNode( ctl, mem, adr, TypeRawPtr::BOTTOM );
109 } else { 110 } else {
110 l = (bt == T_DOUBLE) 111 l = (bt == T_DOUBLE)
111 ? (Node*)new (C, 3) LoadD_unalignedNode( 0, mem, adr, TypeRawPtr::BOTTOM ) 112 ? (Node*)new (C, 3) LoadD_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM )
112 : (Node*)new (C, 3) LoadL_unalignedNode( 0, mem, adr, TypeRawPtr::BOTTOM ); 113 : (Node*)new (C, 3) LoadL_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM );
113 } 114 }
114 break; 115 break;
115 } 116 }
116 default: ShouldNotReachHere(); 117 default: ShouldNotReachHere();
117 } 118 }