LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 1033-beam_dead-Improve-creation-of-select_val-from-is_eq_.patch of Package erlang (Project home:Ledest:erlang:20)

From 633b02c1f8ef85d46e206af169f8500472ed5269 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 4 Dec 2017 06:02:59 +0100
Subject: [PATCH 4/5] beam_dead: Improve creation of select_val from
 is_eq_exact

When converting a comparison BIF (such as '=:=') to a test
instruction, run the other optimizations on the result.

When trying to combine is_eq_exact tests, handle the case
that is_eq_exact is followed by a jump instead of a label
to handle a test that has been newly converted from a BIF.

Taken together, those changes will coalesce more is_eq_exact
instructions into select_val instructions.
---
 lib/compiler/src/beam_dead.erl | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/compiler/src/beam_dead.erl b/lib/compiler/src/beam_dead.erl
index d379fdc4eb..1b152a2d6f 100644
--- a/lib/compiler/src/beam_dead.erl
+++ b/lib/compiler/src/beam_dead.erl
@@ -272,7 +272,8 @@ backward([{jump,{f,To0}},{move,Src,Reg}=Move|Is], D, Acc) ->
     end;
 backward([{jump,{f,To}}=J|[{bif,Op,{f,BifFail},Ops,Reg}|Is]=Is0], D, Acc) ->
     try replace_comp_op(To, Reg, Op, Ops, D) of
-	I -> backward(Is, D, I++Acc)
+	{Test,Jump} ->
+            backward([Jump,Test|Is], D, Acc)
     catch
 	throw:not_possible ->
 	    case To =:= BifFail of
@@ -446,7 +447,7 @@ prune_redundant([], _) -> [].
 replace_comp_op(To, Reg, Op, Ops, D) ->
     False = comp_op_find_shortcut(To, Reg, {atom,false}, D),
     True = comp_op_find_shortcut(To, Reg, {atom,true}, D),
-    [bif_to_test(Op, Ops, False),{jump,{f,True}}].
+    {bif_to_test(Op, Ops, False),{jump,{f,True}}}.
 
 comp_op_find_shortcut(To0, Reg, Val, D) ->
     case shortcut_select_label(To0, Reg, Val, D) of
@@ -483,15 +484,22 @@ not_possible() -> throw(not_possible).
 %%   F1:  is_eq_exact F2 Reg Lit2          F1: is_eq_exact F2 Reg Lit2
 %%   L2:  ....				   L2:
 %%
-combine_eqs(To, [Reg,{Type,_}=Lit1]=Ops, D, [{label,L1}|_])
-  when Type =:= atom; Type =:= integer ->
+combine_eqs(To, [Reg,{Type,_}=Lit1]=Ops, D, Acc)
+    when Type =:= atom; Type =:= integer ->
+    Next = case Acc of
+               [{label,Lbl}|_] -> Lbl;
+               [{jump,{f,Lbl}}|_] -> Lbl
+           end,
     case beam_utils:code_at(To, D) of
 	[{test,is_eq_exact,{f,F2},[Reg,{Type,_}=Lit2]},
 	 {label,L2}|_] when Lit1 =/= Lit2 ->
-	    {select,select_val,Reg,{f,F2},[Lit1,{f,L1},Lit2,{f,L2}]};
+	    {select,select_val,Reg,{f,F2},[Lit1,{f,Next},Lit2,{f,L2}]};
+	[{test,is_eq_exact,{f,F2},[Reg,{Type,_}=Lit2]},
+	 {jump,{f,L2}}|_] when Lit1 =/= Lit2 ->
+	    {select,select_val,Reg,{f,F2},[Lit1,{f,Next},Lit2,{f,L2}]};
 	[{select,select_val,Reg,{f,F2},[{Type,_}|_]=List0}|_] ->
 	    List = remove_from_list(Lit1, List0),
-	    {select,select_val,Reg,{f,F2},[Lit1,{f,L1}|List]};
+	    {select,select_val,Reg,{f,F2},[Lit1,{f,Next}|List]};
 	_Is ->
 	    {test,is_eq_exact,{f,To},Ops}
 	end;
-- 
2.15.1