Mercurial > hg > graal-compiler
comparison src/share/vm/opto/library_call.cpp @ 8048:8b3da8d14c93
7197327: 40% regression on 8 b41 comp 8 b40 on specjvm2008.mpegaudio on oob
Summary: Add support for expensive nodes.
Reviewed-by: kvn
author | roland |
---|---|
date | Tue, 12 Feb 2013 12:56:11 +0100 |
parents | b30b3c2a0cf2 |
children | c59b7900a2bd |
comparison
equal
deleted
inserted
replaced
8047:1e5e28bac299 | 8048:8b3da8d14c93 |
---|---|
1651 //------------------------------inline_exp------------------------------------- | 1651 //------------------------------inline_exp------------------------------------- |
1652 // Inline exp instructions, if possible. The Intel hardware only misses | 1652 // Inline exp instructions, if possible. The Intel hardware only misses |
1653 // really odd corner cases (+/- Infinity). Just uncommon-trap them. | 1653 // really odd corner cases (+/- Infinity). Just uncommon-trap them. |
1654 bool LibraryCallKit::inline_exp() { | 1654 bool LibraryCallKit::inline_exp() { |
1655 Node* arg = round_double_node(argument(0)); | 1655 Node* arg = round_double_node(argument(0)); |
1656 Node* n = _gvn.transform(new (C) ExpDNode(0, arg)); | 1656 Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg)); |
1657 | 1657 |
1658 finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); | 1658 finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); |
1659 | 1659 |
1660 C->set_has_split_ifs(true); // Has chance for split-if optimization | 1660 C->set_has_split_ifs(true); // Has chance for split-if optimization |
1661 return true; | 1661 return true; |
1686 | 1686 |
1687 Node* result = NULL; | 1687 Node* result = NULL; |
1688 | 1688 |
1689 if (!too_many_traps(Deoptimization::Reason_intrinsic)) { | 1689 if (!too_many_traps(Deoptimization::Reason_intrinsic)) { |
1690 // Short form: skip the fancy tests and just check for NaN result. | 1690 // Short form: skip the fancy tests and just check for NaN result. |
1691 result = _gvn.transform(new (C) PowDNode(0, x, y)); | 1691 result = _gvn.transform(new (C) PowDNode(C, control(), x, y)); |
1692 } else { | 1692 } else { |
1693 // If this inlining ever returned NaN in the past, include all | 1693 // If this inlining ever returned NaN in the past, include all |
1694 // checks + call to the runtime. | 1694 // checks + call to the runtime. |
1695 | 1695 |
1696 // Set the merge point for If node with condition of (x <= 0.0) | 1696 // Set the merge point for If node with condition of (x <= 0.0) |
1713 | 1713 |
1714 // Fast path not-taken, i.e. slow path | 1714 // Fast path not-taken, i.e. slow path |
1715 Node *complex_path = _gvn.transform( new (C) IfTrueNode(if1) ); | 1715 Node *complex_path = _gvn.transform( new (C) IfTrueNode(if1) ); |
1716 | 1716 |
1717 // Set fast path result | 1717 // Set fast path result |
1718 Node *fast_result = _gvn.transform( new (C) PowDNode(0, x, y) ); | 1718 Node *fast_result = _gvn.transform( new (C) PowDNode(C, control(), x, y) ); |
1719 phi->init_req(3, fast_result); | 1719 phi->init_req(3, fast_result); |
1720 | 1720 |
1721 // Complex path | 1721 // Complex path |
1722 // Build the second if node (if y is long) | 1722 // Build the second if node (if y is long) |
1723 // Node for (long)y | 1723 // Node for (long)y |
1773 // Check if (1&(long)y)!=0?, if so the result is negative | 1773 // Check if (1&(long)y)!=0?, if so the result is negative |
1774 Node *bol3 = _gvn.transform( new (C) BoolNode( cmpeq1, BoolTest::ne ) ); | 1774 Node *bol3 = _gvn.transform( new (C) BoolNode( cmpeq1, BoolTest::ne ) ); |
1775 // abs(x) | 1775 // abs(x) |
1776 Node *absx=_gvn.transform( new (C) AbsDNode(x)); | 1776 Node *absx=_gvn.transform( new (C) AbsDNode(x)); |
1777 // abs(x)^y | 1777 // abs(x)^y |
1778 Node *absxpowy = _gvn.transform( new (C) PowDNode(0, absx, y) ); | 1778 Node *absxpowy = _gvn.transform( new (C) PowDNode(C, control(), absx, y) ); |
1779 // -abs(x)^y | 1779 // -abs(x)^y |
1780 Node *negabsxpowy = _gvn.transform(new (C) NegDNode (absxpowy)); | 1780 Node *negabsxpowy = _gvn.transform(new (C) NegDNode (absxpowy)); |
1781 // (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y) | 1781 // (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y) |
1782 Node *signresult = NULL; | 1782 Node *signresult = NULL; |
1783 if (ConditionalMoveLimit != 0) { | 1783 if (ConditionalMoveLimit != 0) { |