LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 1004-Place-move-S-x0-instructions-at-the-end-of-blocks.patch of Package erlang (Project home:Ledest:erlang:20)

From 1cbc6a430d18d80a0b5e6ad0f7f1010d5394056a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Muska=C5=82a?= <michal@muskala.eu>
Date: Thu, 23 Nov 2017 21:27:40 +0100
Subject: [PATCH] Place move S x0 instructions at the end of blocks

The loader has a lot of fused instructions that include move S x0.
Placing them at the end of blocks makes it possible to take advantage
of this optimization more frequently.
---
 lib/compiler/src/beam_block.erl | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/lib/compiler/src/beam_block.erl b/lib/compiler/src/beam_block.erl
index 6543e05e20..c640af224d 100644
--- a/lib/compiler/src/beam_block.erl
+++ b/lib/compiler/src/beam_block.erl
@@ -219,11 +219,20 @@ alloc_may_pass({set,_,_,{set_tuple_element,_}}) -> false;
 alloc_may_pass({set,_,_,put_list}) -> false;
 alloc_may_pass({set,_,_,put}) -> false;
 alloc_may_pass({set,_,_,_}) -> true.
-    
+
 %% opt([Instruction]) -> [Instruction]
 %%  Optimize the instruction stream inside a basic block.
 
 opt([{set,[X],[X],move}|Is]) -> opt(Is);
+opt([{set,[X],_,move},{set,[X],_,move}=I|Is]) ->
+    opt([I|Is]);
+opt([{set,[{x,0}],[S1],move}=I1,{set,[D2],[{x,0}],move}|Is]) ->
+    opt([I1,{set,[D2],[S1],move}|Is]);
+opt([{set,[{x,0}],[S1],move}=I1,{set,[D2],[S2],move}|Is0]) when S1 =/= D2 ->
+    %% Place move S x0 at the end of move sequences so that
+    %% loader can merge with the following instruction
+    {Ds,Is} = opt_moves([D2], Is0),
+    [{set,Ds,[S2],move}|opt([I1|Is])];
 opt([{set,_,_,{line,_}}=Line1,
      {set,[D1],[{integer,Idx1},Reg],{bif,element,{f,0}}}=I1,
      {set,_,_,{line,_}}=Line2,
-- 
2.15.0