]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46528: Simplify BUILD_TUPLE/UNPACK_SEQUENCE folding (GH-31039)
authorBrandt Bucher <brandt@python.org>
Tue, 1 Feb 2022 21:41:32 +0000 (13:41 -0800)
committerGitHub <noreply@github.com>
Tue, 1 Feb 2022 21:41:32 +0000 (13:41 -0800)
Lib/test/test_peepholer.py
Python/compile.c

index 659f654b5c6769c4c896a39995c240f71a38e128..2df5883ce7918fe2459c83dea825d269e2852b78 100644 (file)
@@ -126,7 +126,7 @@ class TestTranforms(BytecodeTestCase):
                 code = compile(line,'','single')
                 self.assertInBytecode(code, elem)
                 self.assertNotInBytecode(code, 'BUILD_TUPLE')
-                self.assertNotInBytecode(code, 'UNPACK_TUPLE')
+                self.assertNotInBytecode(code, 'UNPACK_SEQUENCE')
                 self.check_lnotab(code)
 
     def test_folding_of_tuples_of_constants(self):
index eda708e21f16ab45e11cb10ec56ecf63161c650f..1d2d567e85e93e41498784d7277cf10ef813642d 100644 (file)
@@ -8661,29 +8661,22 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
             }
 
                 /* Try to fold tuples of constants.
-                   Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
-                   Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
-                   Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
+                   Skip over BUILD_TUPLE(1) UNPACK_SEQUENCE(1).
+                   Replace BUILD_TUPLE(2) UNPACK_SEQUENCE(2) with SWAP(2).
+                   Replace BUILD_TUPLE(3) UNPACK_SEQUENCE(3) with SWAP(3). */
             case BUILD_TUPLE:
                 if (nextop == UNPACK_SEQUENCE && oparg == bb->b_instr[i+1].i_oparg) {
                     switch(oparg) {
                         case 1:
                             inst->i_opcode = NOP;
                             bb->b_instr[i+1].i_opcode = NOP;
-                            break;
+                            continue;
                         case 2:
-                            inst->i_opcode = SWAP;
-                            inst->i_oparg = 2;
-                            bb->b_instr[i+1].i_opcode = NOP;
-                            i--;
-                            break;
                         case 3:
-                            inst->i_opcode = SWAP;
-                            inst->i_oparg = 3;
-                            bb->b_instr[i+1].i_opcode = NOP;
-                            i--;
+                            inst->i_opcode = NOP;
+                            bb->b_instr[i+1].i_opcode = SWAP;
+                            continue;
                     }
-                    break;
                 }
                 if (i >= oparg) {
                     if (fold_tuple_on_constants(c, inst-oparg, oparg, consts)) {