Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_LIR.hpp @ 12875:d13d7aba8c12
8023657: New type profiling points: arguments to call
Summary: x86 interpreter and c1 type profiling for arguments at calls
Reviewed-by: kvn, twisti
author | roland |
---|---|
date | Wed, 09 Oct 2013 16:32:21 +0200 |
parents | f98f5d48f511 |
children | 15766b73dc1d |
comparison
equal
deleted
inserted
replaced
12874:46ef27bcacb3 | 12875:d13d7aba8c12 |
---|---|
880 class LIR_OpUpdateCRC32; | 880 class LIR_OpUpdateCRC32; |
881 class LIR_OpLock; | 881 class LIR_OpLock; |
882 class LIR_OpTypeCheck; | 882 class LIR_OpTypeCheck; |
883 class LIR_OpCompareAndSwap; | 883 class LIR_OpCompareAndSwap; |
884 class LIR_OpProfileCall; | 884 class LIR_OpProfileCall; |
885 class LIR_OpProfileType; | |
885 #ifdef ASSERT | 886 #ifdef ASSERT |
886 class LIR_OpAssert; | 887 class LIR_OpAssert; |
887 #endif | 888 #endif |
888 | 889 |
889 // LIR operation codes | 890 // LIR operation codes |
1003 , lir_cas_obj | 1004 , lir_cas_obj |
1004 , lir_cas_int | 1005 , lir_cas_int |
1005 , end_opCompareAndSwap | 1006 , end_opCompareAndSwap |
1006 , begin_opMDOProfile | 1007 , begin_opMDOProfile |
1007 , lir_profile_call | 1008 , lir_profile_call |
1009 , lir_profile_type | |
1008 , end_opMDOProfile | 1010 , end_opMDOProfile |
1009 , begin_opAssert | 1011 , begin_opAssert |
1010 , lir_assert | 1012 , lir_assert |
1011 , end_opAssert | 1013 , end_opAssert |
1012 }; | 1014 }; |
1143 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; } | 1145 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; } |
1144 virtual LIR_OpUpdateCRC32* as_OpUpdateCRC32() { return NULL; } | 1146 virtual LIR_OpUpdateCRC32* as_OpUpdateCRC32() { return NULL; } |
1145 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; } | 1147 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; } |
1146 virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; } | 1148 virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; } |
1147 virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; } | 1149 virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; } |
1150 virtual LIR_OpProfileType* as_OpProfileType() { return NULL; } | |
1148 #ifdef ASSERT | 1151 #ifdef ASSERT |
1149 virtual LIR_OpAssert* as_OpAssert() { return NULL; } | 1152 virtual LIR_OpAssert* as_OpAssert() { return NULL; } |
1150 #endif | 1153 #endif |
1151 | 1154 |
1152 virtual void verify() const {} | 1155 virtual void verify() const {} |
1923 LIR_Opr _tmp1; | 1926 LIR_Opr _tmp1; |
1924 ciKlass* _known_holder; | 1927 ciKlass* _known_holder; |
1925 | 1928 |
1926 public: | 1929 public: |
1927 // Destroys recv | 1930 // Destroys recv |
1928 LIR_OpProfileCall(LIR_Code code, ciMethod* profiled_method, int profiled_bci, ciMethod* profiled_callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* known_holder) | 1931 LIR_OpProfileCall(ciMethod* profiled_method, int profiled_bci, ciMethod* profiled_callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* known_holder) |
1929 : LIR_Op(code, LIR_OprFact::illegalOpr, NULL) // no result, no info | 1932 : LIR_Op(lir_profile_call, LIR_OprFact::illegalOpr, NULL) // no result, no info |
1930 , _profiled_method(profiled_method) | 1933 , _profiled_method(profiled_method) |
1931 , _profiled_bci(profiled_bci) | 1934 , _profiled_bci(profiled_bci) |
1932 , _profiled_callee(profiled_callee) | 1935 , _profiled_callee(profiled_callee) |
1933 , _mdo(mdo) | 1936 , _mdo(mdo) |
1934 , _recv(recv) | 1937 , _recv(recv) |
1943 LIR_Opr tmp1() const { return _tmp1; } | 1946 LIR_Opr tmp1() const { return _tmp1; } |
1944 ciKlass* known_holder() const { return _known_holder; } | 1947 ciKlass* known_holder() const { return _known_holder; } |
1945 | 1948 |
1946 virtual void emit_code(LIR_Assembler* masm); | 1949 virtual void emit_code(LIR_Assembler* masm); |
1947 virtual LIR_OpProfileCall* as_OpProfileCall() { return this; } | 1950 virtual LIR_OpProfileCall* as_OpProfileCall() { return this; } |
1951 virtual void print_instr(outputStream* out) const PRODUCT_RETURN; | |
1952 }; | |
1953 | |
1954 // LIR_OpProfileType | |
1955 class LIR_OpProfileType : public LIR_Op { | |
1956 friend class LIR_OpVisitState; | |
1957 | |
1958 private: | |
1959 LIR_Opr _mdp; | |
1960 LIR_Opr _obj; | |
1961 LIR_Opr _tmp; | |
1962 ciKlass* _exact_klass; // non NULL if we know the klass statically (no need to load it from _obj) | |
1963 intptr_t _current_klass; // what the profiling currently reports | |
1964 bool _not_null; // true if we know statically that _obj cannot be null | |
1965 bool _no_conflict; // true if we're profling parameters, _exact_klass is not NULL and we know | |
1966 // _exact_klass it the only possible type for this parameter in any context. | |
1967 | |
1968 public: | |
1969 // Destroys recv | |
1970 LIR_OpProfileType(LIR_Opr mdp, LIR_Opr obj, ciKlass* exact_klass, intptr_t current_klass, LIR_Opr tmp, bool not_null, bool no_conflict) | |
1971 : LIR_Op(lir_profile_type, LIR_OprFact::illegalOpr, NULL) // no result, no info | |
1972 , _mdp(mdp) | |
1973 , _obj(obj) | |
1974 , _exact_klass(exact_klass) | |
1975 , _current_klass(current_klass) | |
1976 , _tmp(tmp) | |
1977 , _not_null(not_null) | |
1978 , _no_conflict(no_conflict) { } | |
1979 | |
1980 LIR_Opr mdp() const { return _mdp; } | |
1981 LIR_Opr obj() const { return _obj; } | |
1982 LIR_Opr tmp() const { return _tmp; } | |
1983 ciKlass* exact_klass() const { return _exact_klass; } | |
1984 intptr_t current_klass() const { return _current_klass; } | |
1985 bool not_null() const { return _not_null; } | |
1986 bool no_conflict() const { return _no_conflict; } | |
1987 | |
1988 virtual void emit_code(LIR_Assembler* masm); | |
1989 virtual LIR_OpProfileType* as_OpProfileType() { return this; } | |
1948 virtual void print_instr(outputStream* out) const PRODUCT_RETURN; | 1990 virtual void print_instr(outputStream* out) const PRODUCT_RETURN; |
1949 }; | 1991 }; |
1950 | 1992 |
1951 class LIR_InsertionBuffer; | 1993 class LIR_InsertionBuffer; |
1952 | 1994 |
2245 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check, | 2287 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check, |
2246 CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub, | 2288 CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub, |
2247 ciMethod* profiled_method, int profiled_bci); | 2289 ciMethod* profiled_method, int profiled_bci); |
2248 // MethodData* profiling | 2290 // MethodData* profiling |
2249 void profile_call(ciMethod* method, int bci, ciMethod* callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* cha_klass) { | 2291 void profile_call(ciMethod* method, int bci, ciMethod* callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* cha_klass) { |
2250 append(new LIR_OpProfileCall(lir_profile_call, method, bci, callee, mdo, recv, t1, cha_klass)); | 2292 append(new LIR_OpProfileCall(method, bci, callee, mdo, recv, t1, cha_klass)); |
2293 } | |
2294 void profile_type(LIR_Address* mdp, LIR_Opr obj, ciKlass* exact_klass, intptr_t current_klass, LIR_Opr tmp, bool not_null, bool no_conflict) { | |
2295 append(new LIR_OpProfileType(LIR_OprFact::address(mdp), obj, exact_klass, current_klass, tmp, not_null, no_conflict)); | |
2251 } | 2296 } |
2252 | 2297 |
2253 void xadd(LIR_Opr src, LIR_Opr add, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xadd, src, add, res, tmp)); } | 2298 void xadd(LIR_Opr src, LIR_Opr add, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xadd, src, add, res, tmp)); } |
2254 void xchg(LIR_Opr src, LIR_Opr set, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xchg, src, set, res, tmp)); } | 2299 void xchg(LIR_Opr src, LIR_Opr set, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xchg, src, set, res, tmp)); } |
2255 #ifdef ASSERT | 2300 #ifdef ASSERT |