diff options
author | Björn Gustavsson <[email protected]> | 2016-04-04 13:43:12 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-04-04 13:43:12 +0200 |
commit | dd4c2581accac3660d93cfb26cb31e6969f4226c (patch) | |
tree | 45fbcaf3e8ce7e6d657fc14b633abaa3dda0e505 /erts/emulator/beam | |
parent | 282f18834468ca36e0e56dc12ac637e8ea82e54a (diff) | |
parent | 7d06e5ecd47ef071eb8c4e58ead70e79fa4b02b2 (diff) | |
download | otp-dd4c2581accac3660d93cfb26cb31e6969f4226c.tar.gz otp-dd4c2581accac3660d93cfb26cb31e6969f4226c.tar.bz2 otp-dd4c2581accac3660d93cfb26cb31e6969f4226c.zip |
Merge branch 'bjorn/erts/clang-opt'
* bjorn/erts/clang-opt:
Fix unsafe transformation of apply/3 with fixed arguments
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/beam_load.c | 7 | ||||
-rw-r--r-- | erts/emulator/beam/ops.tab | 2 |
2 files changed, 8 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index d3d278fb81..16cbdbffea 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -2735,6 +2735,13 @@ same_label(LoaderState* stp, GenOpArg Target, GenOpArg Label) } static int +is_killed_apply(LoaderState* stp, GenOpArg Reg, GenOpArg Live) +{ + return Reg.type == TAG_x && Live.type == TAG_u && + Live.val+2 <= Reg.val; +} + +static int is_killed(LoaderState* stp, GenOpArg Reg, GenOpArg Live) { return Reg.type == TAG_x && Live.type == TAG_u && diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index 9e53b4bfcc..772460c177 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -303,7 +303,7 @@ move_window5 x x x x x y # Swap registers. move R1=x Tmp=x | move R2=xy R1 | move Tmp R2 => swap_temp R1 R2 Tmp -swap_temp R1 R2 Tmp | line Loc | apply Live | is_killed(Tmp, Live) => \ +swap_temp R1 R2 Tmp | line Loc | apply Live | is_killed_apply(Tmp, Live) => \ swap R1 R2 | line Loc | apply Live swap_temp R1 R2 Tmp | line Loc | call Live Addr | is_killed(Tmp, Live) => \ |