Mercurial > hg > truffle
comparison src/share/vm/opto/parse2.cpp @ 366:8261ee795323
6711100: 64bit fastdebug server vm crashes with assert(_base == Int,"Not an Int")
Summary: insert CastII nodes to narrow type of load_array_length() node
Reviewed-by: never, kvn
author | rasbold |
---|---|
date | Wed, 17 Sep 2008 08:29:17 -0700 |
parents | 3e333d6f35dd |
children | 98cb887364d3 |
comparison
equal
deleted
inserted
replaced
333:7484fa4b8825 | 366:8261ee795323 |
---|---|
98 return top(); | 98 return top(); |
99 } | 99 } |
100 | 100 |
101 // Do the range check | 101 // Do the range check |
102 if (GenerateRangeChecks && need_range_check) { | 102 if (GenerateRangeChecks && need_range_check) { |
103 // Range is constant in array-oop, so we can use the original state of mem | |
104 Node* len = load_array_length(ary); | |
105 Node* tst; | 103 Node* tst; |
106 if (sizetype->_hi <= 0) { | 104 if (sizetype->_hi <= 0) { |
107 // If the greatest array bound is negative, we can conclude that we're | 105 // The greatest array bound is negative, so we can conclude that we're |
108 // compiling unreachable code, but the unsigned compare trick used below | 106 // compiling unreachable code, but the unsigned compare trick used below |
109 // only works with non-negative lengths. Instead, hack "tst" to be zero so | 107 // only works with non-negative lengths. Instead, hack "tst" to be zero so |
110 // the uncommon_trap path will always be taken. | 108 // the uncommon_trap path will always be taken. |
111 tst = _gvn.intcon(0); | 109 tst = _gvn.intcon(0); |
112 } else { | 110 } else { |
111 // Range is constant in array-oop, so we can use the original state of mem | |
112 Node* len = load_array_length(ary); | |
113 | |
113 // Test length vs index (standard trick using unsigned compare) | 114 // Test length vs index (standard trick using unsigned compare) |
114 Node* chk = _gvn.transform( new (C, 3) CmpUNode(idx, len) ); | 115 Node* chk = _gvn.transform( new (C, 3) CmpUNode(idx, len) ); |
115 BoolTest::mask btest = BoolTest::lt; | 116 BoolTest::mask btest = BoolTest::lt; |
116 tst = _gvn.transform( new (C, 2) BoolNode(chk, btest) ); | 117 tst = _gvn.transform( new (C, 2) BoolNode(chk, btest) ); |
117 } | 118 } |
135 } | 136 } |
136 } | 137 } |
137 // Check for always knowing you are throwing a range-check exception | 138 // Check for always knowing you are throwing a range-check exception |
138 if (stopped()) return top(); | 139 if (stopped()) return top(); |
139 | 140 |
140 Node* ptr = array_element_address( ary, idx, type, sizetype); | 141 Node* ptr = array_element_address(ary, idx, type, sizetype); |
141 | 142 |
142 if (result2 != NULL) *result2 = elemtype; | 143 if (result2 != NULL) *result2 = elemtype; |
144 | |
145 assert(ptr != top(), "top should go hand-in-hand with stopped"); | |
146 | |
143 return ptr; | 147 return ptr; |
144 } | 148 } |
145 | 149 |
146 | 150 |
147 // returns IfNode | 151 // returns IfNode |