aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2012-04-01 09:28:34 +0200
committerBjörn Gustavsson <[email protected]>2015-07-06 13:37:55 +0200
commit6d6fce257cf666113e982c0887121739dff5bf1d (patch)
treeb4aae4f7dd73aefb4c50faba2d2bb5de87ae75ef
parentfad052472def54fff1268b21313b15bd666437c3 (diff)
downloadotp-6d6fce257cf666113e982c0887121739dff5bf1d.tar.gz
otp-6d6fce257cf666113e982c0887121739dff5bf1d.tar.bz2
otp-6d6fce257cf666113e982c0887121739dff5bf1d.zip
Eliminate prefetch for conditional instructions
Not pre-fetching in conditional instructions (instructions that use -fail_action) seems to improve performance slightly. The reason for that is that conditional instructions may jump to the failure label, wasting the pre-fetched instruction. Another reason is that that many conditional instructions do a function call, and the register pressure is therefore high. Avoiding the pre-fetch may reduce the register pressure and pontentially result in more efficient code.
-rw-r--r--erts/emulator/beam/ops.tab2
-rwxr-xr-xerts/emulator/utils/beam_makeops8
2 files changed, 9 insertions, 1 deletions
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab
index bce6bacd5c..3d52da77d3 100644
--- a/erts/emulator/beam/ops.tab
+++ b/erts/emulator/beam/ops.tab
@@ -477,7 +477,7 @@ i_is_ne_exact_literal f x c
i_is_ne_exact_literal f y c
is_eq_exact Lbl Y=y X=x => is_eq_exact Lbl X Y
-%macro: is_eq_exact EqualExact -fail_action
+%macro: is_eq_exact EqualExact -fail_action -pack
is_eq_exact f x x
is_eq_exact f x y
is_eq_exact f s s
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops
index 44977ecffc..06515c6346 100755
--- a/erts/emulator/utils/beam_makeops
+++ b/erts/emulator/utils/beam_makeops
@@ -917,6 +917,7 @@ sub basic_generator {
my($var_decls) = '';
my($gen_dest_arg) = 'StoreSimpleDest';
my($i);
+ my($no_prefetch) = 0;
# The following argument types should be included as macro arguments.
my(%incl_arg) = ('c' => 1,
@@ -1015,6 +1016,7 @@ sub basic_generator {
#
$flags =~ /-fail_action/ and do {
+ $no_prefetch = 1;
if (!defined $fail_type) {
my($i);
for ($i = 0; $i < @f_types; $i++) {
@@ -1061,6 +1063,12 @@ sub basic_generator {
"I += $size + 1;",
"goto $goto;",
"}");
+ } elsif ($no_prefetch) {
+ $code = join("\n",
+ "{ $var_decls",
+ $macro_code,
+ "Next($size);",
+ "}", "");
} else {
$code = join("\n",
"{ $var_decls",