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 } |