Mercurial > hg > truffle
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 } |