aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/utils/beam_makeops
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2010-09-29 10:24:29 +0200
committerBjörn Gustavsson <bjorn@erlang.org>2011-01-17 15:23:38 +0100
commit7738e604909c52ebac606eed5f6314291747e938 (patch)
tree50f499f73372aea2760f2c27a753b1df185f6483 /erts/emulator/utils/beam_makeops
parent7062f8dff2ddd110ec95c1b162273ea63c37897f (diff)
downloadotp-7738e604909c52ebac606eed5f6314291747e938.tar.gz
otp-7738e604909c52ebac606eed5f6314291747e938.tar.bz2
otp-7738e604909c52ebac606eed5f6314291747e938.zip
BEAM loader: Omit type tests for instructions that don't need them
Diffstat (limited to 'erts/emulator/utils/beam_makeops')
-rwxr-xr-xerts/emulator/utils/beam_makeops21
1 files changed, 15 insertions, 6 deletions
diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops
index c2fb101846..8a5b8047eb 100755
--- a/erts/emulator/utils/beam_makeops
+++ b/erts/emulator/utils/beam_makeops
@@ -1301,13 +1301,22 @@ sub tr_gen_from {
my($var, $type, $type_val, $cond, $val) = @$op;
if ($type ne '' && $type ne '*') {
- my($types) = '';
- my($type_mask) = 0;
- foreach (split('', $type)) {
- $types .= "$_ ";
- $type_mask |= $type_bit{$_};
+ #
+ # The is_bif, is_not_bif, and is_func instructions have
+ # their own built-in type test and don't need to
+ # be guarded with a type test instruction.
+ #
+ unless ($cond eq 'is_bif' or
+ $cond eq 'is_not_bif' or
+ $cond eq 'is_func') {
+ my($types) = '';
+ my($type_mask) = 0;
+ foreach (split('', $type)) {
+ $types .= "$_ ";
+ $type_mask |= $type_bit{$_};
+ }
+ push(@code, &make_op($types, 'is_type', $type_mask));
}
- push(@code, &make_op($types, 'is_type', $type_mask));
}
if ($cond eq 'is_func') {