https://github.com/python/cpython/commit/c4f21d7c7c415a85a975fb878a1e578c12969d82
commit: c4f21d7c7c415a85a975fb878a1e578c12969d82
branch: main
author: Donghee Na <[email protected]>
committer: corona10 <[email protected]>
date: 2025-09-24T14:19:17+09:00
summary:

gh-133171: Re-enable JUMP_BACKWARD to free-threading build (gh-137800)

files:
M .github/workflows/jit.yml
M Include/internal/pycore_stackref.h
M Python/bytecodes.c
M Python/generated_cases.c.h
M Python/optimizer.c
M configure
M configure.ac

diff --git a/.github/workflows/jit.yml b/.github/workflows/jit.yml
index 52f7d0d2b3df95..80e4ae603a2614 100644
--- a/.github/workflows/jit.yml
+++ b/.github/workflows/jit.yml
@@ -134,6 +134,34 @@ jobs:
           make all --jobs 4
           ./python -m test --multiprocess 0 --timeout 4500 --verbose2 
--verbose3
 
+  jit-with-disabled-gil:
+    name: Free-Threaded (Debug)
+    needs: interpreter
+    runs-on: ubuntu-24.04
+    timeout-minutes: 90
+    strategy:
+      fail-fast: false
+      matrix:
+        llvm:
+          - 19
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          persist-credentials: false
+      - uses: actions/setup-python@v5
+        with:
+          python-version: '3.11'
+      - name: Build with JIT enabled and GIL disabled
+        run: |
+          sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ./llvm.sh 
${{ matrix.llvm }}
+          export PATH="$(llvm-config-${{ matrix.llvm }} --bindir):$PATH"
+          ./configure --enable-experimental-jit --with-pydebug --disable-gil
+          make all --jobs 4
+      - name: Run tests
+        run: |
+          ./python -m test --multiprocess 0 --timeout 4500 --verbose2 
--verbose3
+        continue-on-error: true
+
   no-opt-jit:
     name: JIT without optimizations (Debug)
     needs: interpreter
@@ -160,31 +188,3 @@ jobs:
       - name: Run tests without optimizations
         run: |
           PYTHON_UOPS_OPTIMIZE=0 ./python -m test --multiprocess 0 --timeout 
4500 --verbose2 --verbose3
-
-  # XXX: GH-133171
-  # jit-with-disabled-gil:
-  #   name: Free-Threaded (Debug)
-  #   needs: interpreter
-  #   runs-on: ubuntu-24.04
-  #   timeout-minutes: 90
-  #   strategy:
-  #     fail-fast: false
-  #     matrix:
-  #       llvm:
-  #         - 19
-  #   steps:
-  #     - uses: actions/checkout@v4
-  #       with:
-  #         persist-credentials: false
-  #     - uses: actions/setup-python@v5
-  #       with:
-  #         python-version: '3.11'
-  #     - name: Build with JIT enabled and GIL disabled
-  #       run: |
-  #         sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ./llvm.sh 
${{ matrix.llvm }}
-  #         export PATH="$(llvm-config-${{ matrix.llvm }} --bindir):$PATH"
-  #         ./configure --enable-experimental-jit --with-pydebug --disable-gil
-  #         make all --jobs 4
-  #     - name: Run tests
-  #       run: |
-  #         ./python -m test --multiprocess 0 --timeout 4500 --verbose2 
--verbose3
diff --git a/Include/internal/pycore_stackref.h 
b/Include/internal/pycore_stackref.h
index c4e8f10fe05276..062834368bcd29 100644
--- a/Include/internal/pycore_stackref.h
+++ b/Include/internal/pycore_stackref.h
@@ -464,6 +464,12 @@ PyStackRef_CLOSE_SPECIALIZED(_PyStackRef ref, destructor 
destruct)
     PyStackRef_CLOSE(ref);
 }
 
+static inline int
+PyStackRef_RefcountOnObject(_PyStackRef ref)
+{
+    return (ref.bits & Py_TAG_REFCNT) == 0;
+}
+
 static inline _PyStackRef
 PyStackRef_DUP(_PyStackRef stackref)
 {
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 9b993188fb73c7..f9f14322df0a5e 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -2940,9 +2940,10 @@ dummy_func(
         };
 
         tier1 op(_SPECIALIZE_JUMP_BACKWARD, (--)) {
-        #if ENABLE_SPECIALIZATION
+        #if ENABLE_SPECIALIZATION_FT
             if (this_instr->op.code == JUMP_BACKWARD) {
-                this_instr->op.code = tstate->interp->jit ? JUMP_BACKWARD_JIT 
: JUMP_BACKWARD_NO_JIT;
+                uint8_t desired = tstate->interp->jit ? JUMP_BACKWARD_JIT : 
JUMP_BACKWARD_NO_JIT;
+                FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, desired);
                 // Need to re-dispatch so the warmup counter isn't off by one:
                 next_instr = this_instr;
                 DISPATCH_SAME_OPARG();
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index e33d15f2e51e16..79328a7b725613 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -7589,9 +7589,10 @@
             /* Skip 1 cache entry */
             // _SPECIALIZE_JUMP_BACKWARD
             {
-                #if ENABLE_SPECIALIZATION
+                #if ENABLE_SPECIALIZATION_FT
                 if (this_instr->op.code == JUMP_BACKWARD) {
-                    this_instr->op.code = tstate->interp->jit ? 
JUMP_BACKWARD_JIT : JUMP_BACKWARD_NO_JIT;
+                    uint8_t desired = tstate->interp->jit ? JUMP_BACKWARD_JIT 
: JUMP_BACKWARD_NO_JIT;
+                    FT_ATOMIC_STORE_UINT8_RELAXED(this_instr->op.code, 
desired);
                     next_instr = this_instr;
                     DISPATCH_SAME_OPARG();
                 }
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 53f1500f3989a4..7b76cddeabff44 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -119,6 +119,7 @@ _PyOptimizer_Optimize(
     PyInterpreterState *interp = _PyInterpreterState_GET();
     assert(interp->jit);
     assert(!interp->compiling);
+#ifndef Py_GIL_DISABLED
     interp->compiling = true;
     // The first executor in a chain and the MAX_CHAIN_DEPTH'th executor *must*
     // make progress in order to avoid infinite loops or excessively-long
@@ -160,6 +161,9 @@ _PyOptimizer_Optimize(
     assert((*executor_ptr)->vm_data.valid);
     interp->compiling = false;
     return 1;
+#else
+    return 0;
+#endif
 }
 
 static _PyExecutorObject *
diff --git a/configure b/configure
index cd8f2f19c0b92c..7624cbf0d2ae3d 100755
--- a/configure
+++ b/configure
@@ -10891,7 +10891,8 @@ printf "%s\n" "$tier2_flags $jit_flags" >&6; }
 if test "$disable_gil" = "yes" -a "$enable_experimental_jit" != "no"; then
   # GH-133171: This configuration builds the JIT but never actually uses it,
   # which is surprising (and strictly worse than not building it at all):
-  as_fn_error $? "--enable-experimental-jit cannot be used with 
--disable-gil." "$LINENO" 5
+  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 
--enable-experimental-jit does not work correctly with --disable-gil." >&5
+printf "%s\n" "$as_me: WARNING: --enable-experimental-jit does not work 
correctly with --disable-gil." >&2;}
 fi
 
 case "$ac_cv_cc_name" in
diff --git a/configure.ac b/configure.ac
index 8312dc55084333..7a7e32d42945b9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2799,7 +2799,7 @@ AC_MSG_RESULT([$tier2_flags $jit_flags])
 if test "$disable_gil" = "yes" -a "$enable_experimental_jit" != "no"; then
   # GH-133171: This configuration builds the JIT but never actually uses it,
   # which is surprising (and strictly worse than not building it at all):
-  AC_MSG_ERROR([--enable-experimental-jit cannot be used with --disable-gil.])
+  AC_MSG_WARN([--enable-experimental-jit does not work correctly with 
--disable-gil.])
 fi
 
 case "$ac_cv_cc_name" in

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to