src/share/vm/opto/compile.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/opto/compile.cpp
src/share/vm/opto/compile.cpp
Print this page
rev 5400 : 8025657: compiler/intrinsics/mathexact/ConstantTest.java fails on assert in lcm.cpp on solaris x64
Reviewed-by: duke
*** 45,54 ****
--- 45,55 ----
#include "opto/idealGraphPrinter.hpp"
#include "opto/loopnode.hpp"
#include "opto/machnode.hpp"
#include "opto/macro.hpp"
#include "opto/matcher.hpp"
+ #include "opto/mathexactnode.hpp"
#include "opto/memnode.hpp"
#include "opto/mulnode.hpp"
#include "opto/node.hpp"
#include "opto/opcodes.hpp"
#include "opto/output.hpp"
*** 2984,2993 ****
--- 2985,3020 ----
// confuses register allocation.
if (n->req() > MemBarNode::Precedent) {
n->set_req(MemBarNode::Precedent, top());
}
break;
+ // Must set a control edge on all nodes that produce a FlagsProj
+ // so they can't escape the block that consumes the flags.
+ // Must also set the non throwing branch as the control
+ // for all nodes that depends on the result. Unless the node
+ // already have a control that isn't the control of the
+ // flag producer
+ case Op_FlagsProj:
+ {
+ MathExactNode* math = (MathExactNode*) n->in(0);
+ Node* ctrl = math->control_node();
+ Node* non_throwing = math->non_throwing_branch();
+ math->set_req(0, ctrl);
+
+ Node* result = math->result_node();
+ if (result != NULL) {
+ for (DUIterator_Fast jmax, j = result->fast_outs(jmax); j < jmax; j++) {
+ Node* out = result->fast_out(j);
+ if (out->in(0) == NULL) {
+ out->set_req(0, non_throwing);
+ } else if (out->in(0) == ctrl) {
+ out->set_req(0, non_throwing);
+ }
+ }
+ }
+ }
+ break;
default:
assert( !n->is_Call(), "" );
assert( !n->is_Mem(), "" );
break;
}
src/share/vm/opto/compile.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File