diff options
author | Sverker Eriksson <[email protected]> | 2015-04-21 15:33:32 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2015-04-21 15:41:56 +0200 |
commit | e40aab7e9fb9d622e9879efa43af2ce30b287450 (patch) | |
tree | 3a5c69da567670d3baaed8265875f2a6d1029cc8 /lib | |
parent | 91fb6636f95f882b75170fb77c412ccc4a9b75f4 (diff) | |
download | otp-e40aab7e9fb9d622e9879efa43af2ce30b287450.tar.gz otp-e40aab7e9fb9d622e9879efa43af2ce30b287450.tar.bz2 otp-e40aab7e9fb9d622e9879efa43af2ce30b287450.zip |
erts,hipe: Optimize away calls to emasculate_binary
Only call emasculate_binary if ProcBin.flags is set,
which means it's a writable binary.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hipe/rtl/hipe_rtl_binary_match.erl | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/hipe/rtl/hipe_rtl_binary_match.erl b/lib/hipe/rtl/hipe_rtl_binary_match.erl index c906286cb4..a36a024980 100644 --- a/lib/hipe/rtl/hipe_rtl_binary_match.erl +++ b/lib/hipe/rtl/hipe_rtl_binary_match.erl @@ -697,14 +697,22 @@ get_binary_bytes(Binary, BinSize, Base, Offset, Orig, %%%%%%%%%%%%%%%%%%%%%%%%% UTILS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_base(Orig,Base) -> - [HeapLbl,REFCLbl,EndLbl] = create_lbls(3), + [HeapLbl,REFCLbl,WritableLbl,NotWritableLbl,EndLbl] = create_lbls(5), + Flags = hipe_rtl:mk_new_reg_gcsafe(), + [hipe_tagscheme:test_heap_binary(Orig, hipe_rtl:label_name(HeapLbl), hipe_rtl:label_name(REFCLbl)), HeapLbl, hipe_rtl:mk_alu(Base, Orig, 'add', hipe_rtl:mk_imm(?HEAP_BIN_DATA-2)), hipe_rtl:mk_goto(hipe_rtl:label_name(EndLbl)), REFCLbl, + get_field_from_term({proc_bin, flags}, Orig, Flags), + hipe_rtl:mk_branch(Flags, 'ne', hipe_rtl:mk_imm(0), + hipe_rtl:label_name(WritableLbl), + hipe_rtl:label_name(NotWritableLbl)), + WritableLbl, hipe_rtl:mk_call([], emasculate_binary, [Orig], [], [], 'not_remote'), + NotWritableLbl, hipe_rtl:mk_load(Base, Orig, hipe_rtl:mk_imm(?PROC_BIN_BYTES-2)), EndLbl]. |