Mercurial > hg > truffle
comparison src/share/vm/opto/multnode.cpp @ 12956:3213ba4d3dff
8024069: replace_in_map() should operate on parent maps
Summary: type information gets lost because replace_in_map() doesn't update parent maps
Reviewed-by: kvn, twisti
author | roland |
---|---|
date | Sat, 19 Oct 2013 12:16:43 +0200 |
parents | c9ccd7b85f20 |
children | de6a9e811145 |
comparison
equal
deleted
inserted
replaced
12955:252d541466ea | 12956:3213ba4d3dff |
---|---|
22 * | 22 * |
23 */ | 23 */ |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "opto/callnode.hpp" | 26 #include "opto/callnode.hpp" |
27 #include "opto/cfgnode.hpp" | |
27 #include "opto/matcher.hpp" | 28 #include "opto/matcher.hpp" |
28 #include "opto/mathexactnode.hpp" | 29 #include "opto/mathexactnode.hpp" |
29 #include "opto/multnode.hpp" | 30 #include "opto/multnode.hpp" |
30 #include "opto/opcodes.hpp" | 31 #include "opto/opcodes.hpp" |
31 #include "opto/phaseX.hpp" | 32 #include "opto/phaseX.hpp" |
148 | 149 |
149 //------------------------------ideal_reg-------------------------------------- | 150 //------------------------------ideal_reg-------------------------------------- |
150 uint ProjNode::ideal_reg() const { | 151 uint ProjNode::ideal_reg() const { |
151 return bottom_type()->ideal_reg(); | 152 return bottom_type()->ideal_reg(); |
152 } | 153 } |
154 | |
155 //-------------------------------is_uncommon_trap_proj---------------------------- | |
156 // Return true if proj is the form of "proj->[region->..]call_uct" | |
157 bool ProjNode::is_uncommon_trap_proj(Deoptimization::DeoptReason reason) { | |
158 int path_limit = 10; | |
159 Node* out = this; | |
160 for (int ct = 0; ct < path_limit; ct++) { | |
161 out = out->unique_ctrl_out(); | |
162 if (out == NULL) | |
163 return false; | |
164 if (out->is_CallStaticJava()) { | |
165 int req = out->as_CallStaticJava()->uncommon_trap_request(); | |
166 if (req != 0) { | |
167 Deoptimization::DeoptReason trap_reason = Deoptimization::trap_request_reason(req); | |
168 if (trap_reason == reason || reason == Deoptimization::Reason_none) { | |
169 return true; | |
170 } | |
171 } | |
172 return false; // don't do further after call | |
173 } | |
174 if (out->Opcode() != Op_Region) | |
175 return false; | |
176 } | |
177 return false; | |
178 } | |
179 | |
180 //-------------------------------is_uncommon_trap_if_pattern------------------------- | |
181 // Return true for "if(test)-> proj -> ... | |
182 // | | |
183 // V | |
184 // other_proj->[region->..]call_uct" | |
185 // | |
186 // "must_reason_predicate" means the uct reason must be Reason_predicate | |
187 bool ProjNode::is_uncommon_trap_if_pattern(Deoptimization::DeoptReason reason) { | |
188 Node *in0 = in(0); | |
189 if (!in0->is_If()) return false; | |
190 // Variation of a dead If node. | |
191 if (in0->outcnt() < 2) return false; | |
192 IfNode* iff = in0->as_If(); | |
193 | |
194 // we need "If(Conv2B(Opaque1(...)))" pattern for reason_predicate | |
195 if (reason != Deoptimization::Reason_none) { | |
196 if (iff->in(1)->Opcode() != Op_Conv2B || | |
197 iff->in(1)->in(1)->Opcode() != Op_Opaque1) { | |
198 return false; | |
199 } | |
200 } | |
201 | |
202 ProjNode* other_proj = iff->proj_out(1-_con)->as_Proj(); | |
203 if (other_proj->is_uncommon_trap_proj(reason)) { | |
204 assert(reason == Deoptimization::Reason_none || | |
205 Compile::current()->is_predicate_opaq(iff->in(1)->in(1)), "should be on the list"); | |
206 return true; | |
207 } | |
208 return false; | |
209 } |