diff options
author | John Högberg <[email protected]> | 2019-06-10 16:38:22 +0200 |
---|---|---|
committer | John Högberg <[email protected]> | 2019-06-10 17:34:28 +0200 |
commit | 5ee02a07b5c31aea4dd464060fa626d6e6ab8ceb (patch) | |
tree | 9070d6fc72c4ae3913d81de756ad873dc3dd8723 /erts/emulator/beam | |
parent | abbe8d424676a473bcebdf3b97996ac7a5a70f16 (diff) | |
download | otp-5ee02a07b5c31aea4dd464060fa626d6e6ab8ceb.tar.gz otp-5ee02a07b5c31aea4dd464060fa626d6e6ab8ceb.tar.bz2 otp-5ee02a07b5c31aea4dd464060fa626d6e6ab8ceb.zip |
erts: Fix bad loader optimization of get_tuple_element
The following sequence would be wrongly optimized into a
i_get_tuple_element2 instruction, reading an element from the
wrong tuple:
{get_tuple_element,{x,0},1,{x,0}}.
{get_tuple_element,{x,0},2,{x,1}}.
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/ops.tab | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index 10ca74cd60..e9107933f9 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 1997-2018. All Rights Reserved. +# Copyright Ericsson AB 1997-2019. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -699,13 +699,18 @@ is_tuple NotTupleFail Tuple=x | is_tagged_tuple WrongRecordFail Tuple Arity Atom is_tagged_tuple_ff f? f? rx A a -get_tuple_element Reg=x P1 D1=x | get_tuple_element Reg=x P2 D2=x | \ +get_tuple_element Reg=x P1 D1=x | \ + get_tuple_element Reg=x P2 D2=x | \ get_tuple_element Reg=x P3 D3=x | \ - succ(P1, P2) | succ(P2, P3) | \ - succ(D1, D2) | succ(D2, D3) => i_get_tuple_element3 Reg P1 D1 - -get_tuple_element Reg=x P1 D1=x | get_tuple_element Reg=x P2 D2=x | \ - succ(P1, P2) | succ(D1, D2) => i_get_tuple_element2 Reg P1 D1 + succ(P1, P2) | succ(P2, P3) | succ(D1, D2) | succ(D2, D3) | \ + distinct(D1, Reg) | distinct(D2, Reg) | distinct(D3, Reg) => \ + i_get_tuple_element3 Reg P1 D1 + +get_tuple_element Reg=x P1 D1=x | \ + get_tuple_element Reg=x P2 D2=x | \ + succ(P1, P2) | succ(D1, D2) | \ + distinct(D1, Reg) => \ + i_get_tuple_element2 Reg P1 D1 get_tuple_element Reg=x P1 D1=x | get_tuple_element Reg=x P2 D2=x | \ succ(P1, P2) | distinct(D1, Reg) => i_get_tuple_element2_dst Reg P1 D1 D2 |