aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2015-04-21 15:33:32 +0200
committerSverker Eriksson <[email protected]>2015-04-21 15:41:56 +0200
commite40aab7e9fb9d622e9879efa43af2ce30b287450 (patch)
tree3a5c69da567670d3baaed8265875f2a6d1029cc8
parent91fb6636f95f882b75170fb77c412ccc4a9b75f4 (diff)
downloadotp-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.
-rw-r--r--erts/emulator/hipe/hipe_bif0.c6
-rw-r--r--lib/hipe/rtl/hipe_rtl_binary_match.erl10
2 files changed, 12 insertions, 4 deletions
diff --git a/erts/emulator/hipe/hipe_bif0.c b/erts/emulator/hipe/hipe_bif0.c
index de2ea0ecde..bb61e71b14 100644
--- a/erts/emulator/hipe/hipe_bif0.c
+++ b/erts/emulator/hipe/hipe_bif0.c
@@ -1031,9 +1031,9 @@ void hipe_emulate_fpe(Process* p)
void hipe_emasculate_binary(Eterm bin)
{
ProcBin* pb = (ProcBin *) boxed_val(bin);
- if (pb->thing_word == HEADER_PROC_BIN && pb->flags != 0) {
- erts_emasculate_writable_binary(pb);
- }
+ ASSERT(pb->thing_word == HEADER_PROC_BIN);
+ ASSERT(pb->flags != 0);
+ erts_emasculate_writable_binary(pb);
}
#if 0 /* XXX: unused */
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].