Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_LIR.hpp @ 8860:46f6f063b272
7153771: array bound check elimination for c1
Summary: when possible optimize out array bound checks, inserting predicates when needed.
Reviewed-by: never, kvn, twisti
Contributed-by: thomaswue <thomas.wuerthinger@oracle.com>
author | roland |
---|---|
date | Thu, 21 Mar 2013 09:27:54 +0100 |
parents | 47bc9800972c |
children | acadb114c818 |
comparison
equal
deleted
inserted
replaced
8780:98f3af397705 | 8860:46f6f063b272 |
---|---|
879 class LIR_OpArrayCopy; | 879 class LIR_OpArrayCopy; |
880 class LIR_OpLock; | 880 class LIR_OpLock; |
881 class LIR_OpTypeCheck; | 881 class LIR_OpTypeCheck; |
882 class LIR_OpCompareAndSwap; | 882 class LIR_OpCompareAndSwap; |
883 class LIR_OpProfileCall; | 883 class LIR_OpProfileCall; |
884 class LIR_OpAssert; | |
884 | 885 |
885 | 886 |
886 // LIR operation codes | 887 // LIR operation codes |
887 enum LIR_Code { | 888 enum LIR_Code { |
888 lir_none | 889 lir_none |
998 , lir_cas_int | 999 , lir_cas_int |
999 , end_opCompareAndSwap | 1000 , end_opCompareAndSwap |
1000 , begin_opMDOProfile | 1001 , begin_opMDOProfile |
1001 , lir_profile_call | 1002 , lir_profile_call |
1002 , end_opMDOProfile | 1003 , end_opMDOProfile |
1004 , begin_opAssert | |
1005 , lir_assert | |
1006 , end_opAssert | |
1003 }; | 1007 }; |
1004 | 1008 |
1005 | 1009 |
1006 enum LIR_Condition { | 1010 enum LIR_Condition { |
1007 lir_cond_equal | 1011 lir_cond_equal |
1133 virtual LIR_Op3* as_Op3() { return NULL; } | 1137 virtual LIR_Op3* as_Op3() { return NULL; } |
1134 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; } | 1138 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; } |
1135 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; } | 1139 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; } |
1136 virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; } | 1140 virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; } |
1137 virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; } | 1141 virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; } |
1142 virtual LIR_OpAssert* as_OpAssert() { return NULL; } | |
1138 | 1143 |
1139 virtual void verify() const {} | 1144 virtual void verify() const {} |
1140 }; | 1145 }; |
1141 | 1146 |
1142 // for calls | 1147 // for calls |
1621 , _tmp1(LIR_OprFact::illegalOpr) | 1626 , _tmp1(LIR_OprFact::illegalOpr) |
1622 , _tmp2(LIR_OprFact::illegalOpr) | 1627 , _tmp2(LIR_OprFact::illegalOpr) |
1623 , _tmp3(LIR_OprFact::illegalOpr) | 1628 , _tmp3(LIR_OprFact::illegalOpr) |
1624 , _tmp4(LIR_OprFact::illegalOpr) | 1629 , _tmp4(LIR_OprFact::illegalOpr) |
1625 , _tmp5(LIR_OprFact::illegalOpr) { | 1630 , _tmp5(LIR_OprFact::illegalOpr) { |
1626 assert(code == lir_cmp, "code check"); | 1631 assert(code == lir_cmp || code == lir_assert, "code check"); |
1627 } | 1632 } |
1628 | 1633 |
1629 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) | 1634 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) |
1630 : LIR_Op(code, result, NULL) | 1635 : LIR_Op(code, result, NULL) |
1631 , _opr1(opr1) | 1636 , _opr1(opr1) |
1681 LIR_Opr tmp2_opr() const { return _tmp2; } | 1686 LIR_Opr tmp2_opr() const { return _tmp2; } |
1682 LIR_Opr tmp3_opr() const { return _tmp3; } | 1687 LIR_Opr tmp3_opr() const { return _tmp3; } |
1683 LIR_Opr tmp4_opr() const { return _tmp4; } | 1688 LIR_Opr tmp4_opr() const { return _tmp4; } |
1684 LIR_Opr tmp5_opr() const { return _tmp5; } | 1689 LIR_Opr tmp5_opr() const { return _tmp5; } |
1685 LIR_Condition condition() const { | 1690 LIR_Condition condition() const { |
1686 assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); return _condition; | 1691 assert(code() == lir_cmp || code() == lir_cmove || code() == lir_assert, "only valid for cmp and cmove and assert"); return _condition; |
1687 } | 1692 } |
1688 void set_condition(LIR_Condition condition) { | 1693 void set_condition(LIR_Condition condition) { |
1689 assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); _condition = condition; | 1694 assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); _condition = condition; |
1690 } | 1695 } |
1691 | 1696 |
1821 void print_instr(outputStream* out) const PRODUCT_RETURN; | 1826 void print_instr(outputStream* out) const PRODUCT_RETURN; |
1822 LIR_Op* delay_op() const { return _op; } | 1827 LIR_Op* delay_op() const { return _op; } |
1823 CodeEmitInfo* call_info() const { return info(); } | 1828 CodeEmitInfo* call_info() const { return info(); } |
1824 }; | 1829 }; |
1825 | 1830 |
1831 #ifdef ASSERT | |
1832 // LIR_OpAssert | |
1833 class LIR_OpAssert : public LIR_Op2 { | |
1834 friend class LIR_OpVisitState; | |
1835 | |
1836 private: | |
1837 const char* _msg; | |
1838 bool _halt; | |
1839 | |
1840 public: | |
1841 LIR_OpAssert(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, const char* msg, bool halt) | |
1842 : LIR_Op2(lir_assert, condition, opr1, opr2) | |
1843 , _halt(halt) | |
1844 , _msg(msg) { | |
1845 } | |
1846 | |
1847 const char* msg() const { return _msg; } | |
1848 bool halt() const { return _halt; } | |
1849 | |
1850 virtual void emit_code(LIR_Assembler* masm); | |
1851 virtual LIR_OpAssert* as_OpAssert() { return this; } | |
1852 virtual void print_instr(outputStream* out) const PRODUCT_RETURN; | |
1853 }; | |
1854 #endif | |
1826 | 1855 |
1827 // LIR_OpCompareAndSwap | 1856 // LIR_OpCompareAndSwap |
1828 class LIR_OpCompareAndSwap : public LIR_Op { | 1857 class LIR_OpCompareAndSwap : public LIR_Op { |
1829 friend class LIR_OpVisitState; | 1858 friend class LIR_OpVisitState; |
1830 | 1859 |
2194 append(new LIR_OpProfileCall(lir_profile_call, method, bci, callee, mdo, recv, t1, cha_klass)); | 2223 append(new LIR_OpProfileCall(lir_profile_call, method, bci, callee, mdo, recv, t1, cha_klass)); |
2195 } | 2224 } |
2196 | 2225 |
2197 void xadd(LIR_Opr src, LIR_Opr add, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xadd, src, add, res, tmp)); } | 2226 void xadd(LIR_Opr src, LIR_Opr add, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xadd, src, add, res, tmp)); } |
2198 void xchg(LIR_Opr src, LIR_Opr set, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xchg, src, set, res, tmp)); } | 2227 void xchg(LIR_Opr src, LIR_Opr set, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xchg, src, set, res, tmp)); } |
2228 #ifdef ASSERT | |
2229 void lir_assert(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, const char* msg, bool halt) { append(new LIR_OpAssert(condition, opr1, opr2, msg, halt)); } | |
2230 #endif | |
2199 }; | 2231 }; |
2200 | 2232 |
2201 void print_LIR(BlockList* blocks); | 2233 void print_LIR(BlockList* blocks); |
2202 | 2234 |
2203 class LIR_InsertionBuffer : public CompilationResourceObj { | 2235 class LIR_InsertionBuffer : public CompilationResourceObj { |