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