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 {