Skip to content

Instantly share code, notes, and snippets.

@llllllllll
Last active July 23, 2021 05:41
Show Gist options
  • Save llllllllll/b3ccc744e88c5bf0ee4e2c16c6fcdebf to your computer and use it in GitHub Desktop.
Save llllllllll/b3ccc744e88c5bf0ee4e2c16c6fcdebf to your computer and use it in GitHub Desktop.
msgspec notes

Initial Observations

The provided benchmark script is using Python's timeit module for benchmarking. I noticed that I was getting very different results between runs even with the same compiler, so I first switched to pyperf to attempt to get more stable results.

I am not sure if there is a Python API for pyperf, so I started by writing a small bash wrapper for benchmark:

#!/usr/bin/bash

benchmark="twitter"
do_setup=0
perf=
asan=

while getopts "spab:" o;do
    case "$o" in
        b)
            benchmark="$OPTARG"
            ;;
        s)
            do_setup=1
            ;;
        p)
            perf="perf record --call-graph dwarf -e cycles,cycle_activity.stalls_total"
            ;;
        a)
            asan="env LD_PRELOAD=/usr/lib/libasan.so"
    esac
done

path="$benchmark.json"

if [[ do_setup -ne 0 ]];then
    echo "Downloading $path..."
    curl -L "https://github.com/ijl/orjson/raw/master/data/$path.xz" | \
        xz --decompress > $path
fi

echo "Benchmark: $path"
$perf pyperf timeit -s \
       "import json; d = json.load(open('$path')); import msgspec; f = msgspec.JSONEncoder().encode" \
       'f(d)'

Constant Environment

(venv) [joe@jevnik msgspec]$ python --version
Python 3.9.6
(venv) [joe@jevnik msgspec]$ lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  8
  On-line CPU(s) list:   0-7
Vendor ID:               GenuineIntel
  Model name:            Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
    CPU family:          6
    Model:               94
    Thread(s) per core:  2
    Core(s) per socket:  4
    Socket(s):           1
    Stepping:            3
    CPU max MHz:         4200.0000
    CPU min MHz:         800.0000
    BogoMIPS:            8003.30
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fx
                         sr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts re
                         p_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est
                         tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdr
                         and lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti tpr_shadow vnmi flexpriority e
                         pt vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap
                          clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_
                         act_window hwp_epp
Virtualization features:
  Virtualization:        VT-x
Caches (sum of all):
  L1d:                   128 KiB (4 instances)
  L1i:                   128 KiB (4 instances)
  L2:                    1 MiB (4 instances)
  L3:                    8 MiB (1 instance)
NUMA:
  NUMA node(s):          1
  NUMA node0 CPU(s):     0-7
Vulnerabilities:
  Itlb multihit:         KVM: Mitigation: VMX disabled
  L1tf:                  Mitigation; PTE Inversion; VMX conditional cache flushes, SMT vulnerable
  Mds:                   Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
  Meltdown:              Mitigation; PTI
  Spec store bypass:     Vulnerable
  Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:            Mitigation; Full generic retpoline, STIBP disabled, RSB filling
  Srbds:                 Vulnerable: No microcode
  Tsx async abort:       Vulnerable: Clear CPU buffers attempted, no microcode; SMT vulnerable
(venv) [joe@jevnik msgspec]$ sudo cpupower frequency-set -g performance
Setting cpu: 0
Setting cpu: 1
Setting cpu: 2
Setting cpu: 3
Setting cpu: 4
Setting cpu: 5
Setting cpu: 6
Setting cpu: 7

First runs

Even with a more reliable benchmark, I wanted to run each sequence 5 times to start to prove to myself that I had a stable result.

gcc-11.1.0

gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fPIC -I/home/joe/projects/python/msgspec/venv/include -I/usr/include/python3.9 -c msgspec/core.c -o build/temp.linux-x86_64-3.9/msgspec/core.o

Note

My system gcc is gcc-11.1.0

$ for n in `seq 5`;do ./benchmark -b twitter;done
Benchmark: twitter.json
.....................
Mean +- std dev: 489 us +- 6 us
Benchmark: twitter.json
.....................
Mean +- std dev: 489 us +- 5 us
Benchmark: twitter.json
.....................
Mean +- std dev: 487 us +- 3 us
Benchmark: twitter.json
.....................
Mean +- std dev: 490 us +- 5 us
Benchmark: twitter.json
.....................
Mean +- std dev: 488 us +- 5 us

$ for n in `seq 5`;do ./benchmark -b canada;done
Benchmark: canada.json
.....................
Mean +- std dev: 4.56 ms +- 0.03 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.57 ms +- 0.03 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.57 ms +- 0.05 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.57 ms +- 0.05 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.58 ms +- 0.04 ms

gcc-10.2.0

gcc-10 -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fPIC -I/home/joe/projects/python/msgspec/venv/include -I/usr/include/python3.9 -c msgspec/core.c -o build/temp.linux-x86_64-3.9/msgspec/core.o
$ for n in `seq 5`;do ./benchmark -b twitter;done
Benchmark: twitter.json
.....................
Mean +- std dev: 489 us +- 7 us
Benchmark: twitter.json
.....................
Mean +- std dev: 485 us +- 4 us
Benchmark: twitter.json
.....................
Mean +- std dev: 488 us +- 4 us
Benchmark: twitter.json
.....................
Mean +- std dev: 487 us +- 13 us
Benchmark: twitter.json
.....................
Mean +- std dev: 487 us +- 6 us

$ for n in `seq 5`;do ./benchmark -b canada;done
Benchmark: canada.json
.....................
Mean +- std dev: 4.55 ms +- 0.02 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.56 ms +- 0.04 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.56 ms +- 0.02 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.56 ms +- 0.03 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.57 ms +- 0.05 ms

clang-12.0.1

clang -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fPIC -I/home/joe/projects/python/msgspec/venv/include -I/usr/include/python3.9 -c msgspec/core.c -o build/temp.linux-x86_64-3.9/msgspec/core.o
$ for n in `seq 5`;do ./benchmark -b twitter;done
Benchmark: twitter.json
.....................
Mean +- std dev: 476 us +- 4 us
Benchmark: twitter.json
.....................
Mean +- std dev: 474 us +- 3 us
Benchmark: twitter.json
.....................
Mean +- std dev: 475 us +- 5 us
Benchmark: twitter.json
.....................
Mean +- std dev: 476 us +- 12 us
Benchmark: twitter.json
.....................
Mean +- std dev: 475 us +- 4 us

$ for n in `seq 5`;do ./benchmark -b canada;done
Benchmark: canada.json
.....................
Mean +- std dev: 4.26 ms +- 0.07 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.24 ms +- 0.02 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.25 ms +- 0.06 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.27 ms +- 0.06 ms
Benchmark: canada.json
.....................
Mean +- std dev: 4.26 ms +- 0.05 ms

Next Steps

Before I investigated the code further, I wanted to make sure that the existing code was not using any undefined behavior (UB), so I did a gcc build with address sanitizer (asan) and undefined-behavior sanitizer (ubsan) to ensure that the code was not relying on any UB that the compilers were handling differently.

I changed the compiler flags to:

diff --git a/setup.py b/setup.py
index 844c53c..b0de70f 100644
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,14 @@ import versioneer
 from setuptools import setup
 from setuptools.extension import Extension

-ext_modules = [Extension("msgspec.core", [os.path.join("msgspec", "core.c")])]
+ext_modules = [
+    Extension(
+        "msgspec.core",
+        [os.path.join("msgspec", "core.c")],
+        extra_compile_args=['-fsanitize=address', '-fsanitize=undefined'],
+        extra_link_args=['-lasan', '-lubsan'],
+    )
+]

 setup(
     name="msgspec",

I did an instrumented run with:

$ PYTHONMALLOC=malloc LD_PRELOAD=/usr/lib/libasan.so python -c "import json; d = json.load(open('twitter.json')); import msgspec; f = msgspec.JSONEncoder().encode; f(d)"

There were a few leaks detected, but this is standard in Python and I don't believe it was anything more than odds and ends global structures that Python uses. I did not see any ubsan violations with gcc, so I tried clang and got the same results.

Warnings

I noticed that there were a few warnings that gcc was providing, and also noticed that I was not compiling with -Wextra, so I decided to turn on -Wextra and then disable a few warnings that are annoying when writing CPython extensions:

extra_compile_args=[
    '-Wextra',
    '-Wno-unused-parameter',
    '-Wno-missing-field-initializers',
]

Here is a sample of some warnings that seemed harmless but maybe indicate the code isn't doing what is expected:

msgspec/core.c: In function ‘mp_decode_any’:
msgspec/core.c:3525:25: warning: comparison is always true due to limited range of data type [-Wtype-limits]
 3525 |     if (-32 <= op && op <= 127) {
      |                         ^~
msgspec/core.c:3534:21: warning: comparison is always true due to limited range of data type [-Wtype-limits]
 3534 |     else if ('\x80' <= op && op <= '\x8f') {
      |                     ^~
msgspec/core.c: In function ‘mp_skip’:
msgspec/core.c:3647:25: warning: comparison is always true due to limited range of data type [-Wtype-limits]
 3647 |     if (-32 <= op && op <= 127) {
      |                         ^~
msgspec/core.c:3656:21: warning: comparison is always true due to limited range of data type [-Wtype-limits]
 3656 |     else if ('\x80' <= op && op <= '\x8f') {
      |                     ^~
msgspec/core.c: In function ‘mp_validation_error’:
msgspec/core.c:3761:25: warning: comparison is always true due to limited range of data type [-Wtype-limits]
 3761 |     if (-32 <= op && op <= 127) {

There are also some warnings about possible uninitialized values; however, these seems top be false positives:

msgspec/core.c: In function ‘mp_decode_any’:
msgspec/core.c:3292:12: warning: ‘s’ may be used uninitialized in this function [-Wmaybe-uninitialized]
 3292 |     return PyFloat_FromDouble(_PyFloat_Unpack8((unsigned char *)s, 0));
      |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
msgspec/core.c:3290:11: note: ‘s’ was declared here
 3290 |     char *s;
      |           ^

perf

With stable benchmarks, ubsan passing, and code checked, I decided to dig into the hotspots to see what the major differences were.

I started with the twitter example because I thought I would have the most to offer in the more Python object heavy workload and because ryu already seems pretty well optimized.

I ran the benchmark under perf and recorded the cycles (the default) but also the stalls to see places where we the CPU was not able to make progress because it was waiting for something. You can open the result of perf with perf report; however, I like an open source tool called hotspot to look through perf results. The biggest hotspot by far was json_encode_str, which by itself consumed almost 50% of the total cycles in the run and almost 25% of the stalls.

Now we can focus our search to a single function and see where we might make improvements

Code Analysis

I started by just reading the source for this function. My first impression was that this function has an incredibly "branchy" inner loop for what should be "mostly memcpy". Next I wanted to look through the generated code for this function, which I extracted with:

$ objdump --no-addresses --source --disassemble=json_encode_str msgspec/core.cpython-39-x86_64-linux-gnu.so  > gcc11-json_encode_str

The generated code has lots of jumps inside this hot loop, which is not good. All these jumps will prevent the CPU from doing things as fast as can, because it will end up bottlenecked reading data from main memory, which is slow.

To get some more insight into how the compiler is understanding this function, I needed to dump some of the gcc internal state. gcc can emit information about the code after every pass that it does, and one of the output formats is a graphviz formatted .dot file. The only pass I cared about was the final, fully optimized and inlined pass, so I selected that I wanted this pass with -fdump-rtl-final, which means dump the rtl (register transfer language, the lowest level gcc intermediate representation) pass named "final", which is the last pass unless you have plugins running. I also wanted a graph, not just raw rtl, so I also passed -fdump-tree-optimized-graph=graph which says to dump the optimized passes in a graph format and write the data to a file named graph.dot.

The full command line used was:

gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -march=x86-64 -mtune=generic -O3 -pipe -fno-plt -fPIC -I/home/joe/projects/python/msgspec/venv/include -I/usr/include/python3.9 -c msgspec/core.c -o build/temp.linux-x86_64-3.9/msgspec/core.o -fdump-rtl-final -fdump-tree-optimized-graph=graph

Unfortunately, this writes out all of the functions, so we need to find the cluster for the function we care about. I wrote a little Python to do this:

def isolate_function(in_, out, func):
    start = 'subgraph "cluster_%s" {\n' % func
    end = '}\n'
    with open(in_) as f:
        lines = [
          'digraph "small.graph" {\n',
          'overlap=false;\n',
        ]
        for line in f:
            if line == start:
                lines.append(line)
                break
        for line in f:
            lines.append(line)
            if line == end:
                break
        lines.append(end)
        content = ''.join(lines)
        with open(out, 'w') as f: f.write(content)

The results are shown in original.svg.

This representation breaks down the code into basic blocks and shows the control flow edges between them. Each edge is annotated with a predicted likelihood, where blue edges are unconditional. With a little squinting, we can match this form up with our original source code if we consider what the result of inlining will be.

Optimizations

First Attempt

The first thing to notice is just how many branches we have in this loop, the control flow is not simple! Having a small loop (in terms of generated code size) that fits in cache is very important for optimal performance

The first thing I wanted to do was help the compiler generate better code around mp_write in our loop, so I told gcc to always inline the function to potentially unlock optimizations based on earlier passes before the decision to inline would be made.

To do this, we can annotate mp_write with __attribute__((always_inline)) which is respected by both gcc and clang.

This alone gives us a pretty decent change with gcc11:

Benchmark: twitter.json
.....................
Mean +- std dev: 477 us +- 5 us

A 2.5% speedup from just a one line change!

Looking at the graph from the original code, another thing I noticed was that the compiler was assuming that the required > self->max_output_len condition was being weighed equally, which we know is definitely not true.

To tell the compiler what we know, I used __builtin_expect, a gcc compiler intrinsic. This intrinsic is usually wrapped with LIKELY and UNLIKELY macros, like:

#define MP_LIKELY(pred) __builtin_expect(!!(pred), 1)
#define MP_UNLIKELY(pred) __builtin_expect(!!(pred), 0)

This small change gives another small performance improvement:

Benchmark: twitter.json
.....................
Mean +- std dev: 473 us +- 5 us

The full diff at this point is:

diff --git a/msgspec/core.c b/msgspec/core.c
index 90017f0..f084f4f 100644
--- a/msgspec/core.c
+++ b/msgspec/core.c
@@ -8,6 +8,11 @@

 #include "ryu.h"

+#define MP_LIKELY(pred) __builtin_expect(!!(pred), 1)
+#define MP_UNLIKELY(pred) __builtin_expect(!!(pred), 0)
+
+#define MP_INLINE __attribute__((always_inline))
+
 #if PY_VERSION_HEX < 0x03090000
 #define IS_TRACKED _PyObject_GC_IS_TRACKED
 #define CALL_ONE_ARG(fn, arg) PyObject_CallFunctionObjArgs((fn), (arg), NULL)
@@ -2137,11 +2142,11 @@ mp_ensure_space(EncoderState *self, Py_ssize_t size) {
     return 0;
 }

-static inline int
+MP_INLINE static inline int
 mp_write(EncoderState *self, const char *s, Py_ssize_t n)
 {
     Py_ssize_t required = self->output_len + n;
-    if (required > self->max_output_len) {
+    if (MP_UNLIKELY(required > self->max_output_len)) {
         if (mp_resize(self, required) < 0) return -1;
     }
     memcpy(self->output_buffer_raw + self->output_len, s, n);

These changes yield a noticeably different graph in the dot files, so we know that the compiler does see these as different functions. The graph at this stage is shown in opt-1.svg This at least makes me believe that my understanding of what is going on is correct because we are making progress.

Second Attempt

The next bit of branching that I see in our loop is the type check in the resize code. I am talking about the is_bytes checks in mp_resize. Resizing is unexpected, but it does happen in the loop with a sufficiently large file, so I decided to think about how to remove these conditions.

My thought was that we don't need to branch at all here, instead we just need to remember what kind of buffer we have when we set it. To do this, I added a function pointer in the EncoderState struct which points to a function which either resizes bytes objects or bytearray objects. This function pointer can be used to avoid all the extra branching we have, and further get the resizing code out of the way to make the loop smaller.

The diff to do this was:

diff --git a/msgspec/core.c b/msgspec/core.c
index f084f4f..4ee348c 100644
--- a/msgspec/core.c
+++ b/msgspec/core.c
@@ -1990,6 +1990,8 @@ typedef struct EncoderState {
     char *output_buffer_raw;    /* raw pointer to output_buffer internal buffer */
     Py_ssize_t output_len;      /* Length of output_buffer */
     Py_ssize_t max_output_len;  /* Allocation size of output_buffer */
+
+    char* (*resize_output_buffer)(PyObject**, Py_ssize_t);
 } EncoderState;


@@ -2113,24 +2115,32 @@ enum mp_code {
     MP_EXT32 = '\xc9',
 };

+static char*
+mp_resize_bytes(PyObject** output_buffer, Py_ssize_t size)
+{
+    int status = _PyBytes_Resize(output_buffer, size);
+    if (status < 0) return NULL;
+    return PyBytes_AS_STRING(*output_buffer);
+}
+
+static char*
+mp_resize_bytearray(PyObject** output_buffer, Py_ssize_t size)
+{
+    int status = PyByteArray_Resize(*output_buffer, size);
+    if (status < 0) return NULL;
+    return PyByteArray_AS_STRING(*output_buffer);
+}
+
+
 static int
-mp_resize(EncoderState *self, Py_ssize_t size)
+mp_resize(EncoderState *self, Py_ssize_t size)
 {
-    int status;
-    bool is_bytes = PyBytes_CheckExact(self->output_buffer);
     self->max_output_len = Py_MAX(8, 2 * size);
-    status = (
-        is_bytes ? _PyBytes_Resize(&self->output_buffer, self->max_output_len)
-                 : PyByteArray_Resize(self->output_buffer, self->max_output_len)
-    );
-    if (status < 0) return -1;
-    if (is_bytes) {
-        self->output_buffer_raw = PyBytes_AS_STRING(self->output_buffer);
-    }
-    else {
-        self->output_buffer_raw = PyByteArray_AS_STRING(self->output_buffer);
-    }
-    return status;
+    char* new_buf = self->resize_output_buffer(&self->output_buffer,
+                                               self->max_output_len);
+    if (new_buf == NULL) return -1;
+    self->output_buffer_raw = new_buf;
+    return 0;
 }

 static inline int
@@ -2834,6 +2844,7 @@ Encoder_encode_into(Encoder *self, PyObject *const *args, Py_ssize_t nargs)
     self->state.output_buffer_raw = PyByteArray_AS_STRING(buf);
     self->state.output_len = offset;
     self->state.max_output_len = buf_size;
+    self->state.resize_output_buffer = mp_resize_bytearray;

     status = mp_encode(&(self->state), obj);

@@ -2871,6 +2882,7 @@ encode_common(
         state->output_buffer = PyBytes_FromStringAndSize(NULL, state->max_output_len);
         if (state->output_buffer == NULL) return NULL;
         state->output_buffer_raw = PyBytes_AS_STRING(state->output_buffer);
+        state->resize_output_buffer = mp_resize_bytes;
     }

     status = encode(state, args[0]);
@@ -3022,6 +3034,7 @@ msgspec_encode(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject
     state.output_buffer = PyBytes_FromStringAndSize(NULL, state.max_output_len);
     if (state.output_buffer == NULL) return NULL;
     state.output_buffer_raw = PyBytes_AS_STRING(state.output_buffer);
+    state.resize_output_buffer = mp_resize_bytes;

     status = mp_encode(&state, args[0]);

This change gives a pretty good improvement over our last effort:

Benchmark: twitter.json
.....................
Mean +- std dev: 465 us +- 5 us

The thing that still bothers me about this is I feel like resizing is a rare enough event that we don't even need any of the mp_resize code in our loop, we can just do a call when this uncommon thing happens. We can get the compiler to never inline our function when this happens with a small edit:

diff --git a/msgspec/core.c b/msgspec/core.c
index 4ee348c..78b1917 100644
--- a/msgspec/core.c
+++ b/msgspec/core.c
@@ -12,6 +12,7 @@
 #define MP_UNLIKELY(pred) __builtin_expect(!!(pred), 0)

 #define MP_INLINE __attribute__((always_inline))
+#define MP_NOINLINE __attribute__((noinline))

 #if PY_VERSION_HEX < 0x03090000
 #define IS_TRACKED _PyObject_GC_IS_TRACKED
@@ -2143,6 +2144,12 @@ mp_resize(EncoderState *self, Py_ssize_t size)
     return 0;
 }

+MP_NOINLINE static int
+mp_resize_cold(EncoderState *self, Py_ssize_t size)
+{
+    return mp_resize(self, size);
+}
+
 static inline int
 mp_ensure_space(EncoderState *self, Py_ssize_t size) {
     Py_ssize_t required = self->output_len + size;
@@ -2157,7 +2164,7 @@ mp_write(EncoderState *self, const char *s, Py_ssize_t n)
 {
     Py_ssize_t required = self->output_len + n;
     if (MP_UNLIKELY(required > self->max_output_len)) {
-        if (mp_resize(self, required) < 0) return -1;
+        if (mp_resize_cold(self, required) < 0) return -1;
     }
     memcpy(self->output_buffer_raw + self->output_len, s, n);
     self->output_len += n;

Now, our generated code will push the resizing out of line entirely, which is great!

Benchmark: twitter.json
.....................
Mean +- std dev: 463 us +- 3 us

This isn't a great improvement; however, it is something and it adds up. I also thought it was funny to show a case where disabling inlining is actually a performance improvement.

I also confirmed that the effect we saw earlier was not just dominated by this noinline change, and having both of these is actually still an improvement over just having one by itself.

At this point, we have gotten gcc generating 5.3% faster code, which is faster than our initial clang measurements, so let's make sure we didn't make clang slower:

Benchmark: twitter.json
.....................
Mean +- std dev: 429 us +- 4 us

Clang seems to have done even better with these optimizations! I don't know what the equivalent tree visualizations are for clang, so I am not sure how to look into the clang internal state here.

Third Attempt

Looking at the graph on opt-2.svg, I still see a lot of duplication between the two branches of the two kinds of escaped characters. The two blocks leaving bb 17 are bb 18, the hex-encoded version, and bb 22, the \\ encoded version.

We can actually share a ton of code here by pre-initializing the escaped array with a common prefix: {'\\', escape, '0', '0'}, which also happens to be a single word which can be stored in an immediate (when escape == 'u') which appears right with the instructions.

I did a little shuffling here:

diff --git a/msgspec/core.c b/msgspec/core.c
index 78b1917..3b59be4 100644
--- a/msgspec/core.c
+++ b/msgspec/core.c
@@ -4984,15 +4984,14 @@ json_encode_str(EncoderState *self, PyObject *obj) {
         }

         /* Write the escaped character */
+        size_t size = escape == 'u' ? 6 : 2;
+        char escaped[6] = {'\\', escape, '0', '0'};
         if (escape == 'u') {
-            const char* hex = "0123456789abcdef";
-            char escaped[6] = {'\\', 'u', '0', '0', hex[c >> 4], hex[c & 0xF]};
-            if (mp_write(self, escaped, 6) < 0) return -1;
-        }
-        else {
-            char escaped[2] = {'\\', escape};
-            if (mp_write(self, escaped, 2) < 0) return -1;
+            static const char* const hex = "0123456789abcdef";
+            escaped[4] = hex[c >> 4];
+            escaped[5] = hex[c & 0xF];
         }
+        if (mp_write(self, escaped, size) < 0) return -1;
         start = i + 1;
     }
     /* Write the last unescaped fragment (if any) */

Which let's us share a single mp_write call, and efficiently load the prefix on the escaped array. There is now one bit of dead work, which is the that we will write {'0', '0'} into the buffer for the non-u case; however, this is implemented with a 2-byte store of 0x3030, which will never be read, so it is quite fast.

This is actually a pretty big improvement for gcc, but a pessimization for clang (over the previous best), so I think clang is not doing the same sharing here.

# gcc 11.1.0
Benchmark: twitter.json
.....................
Mean +- std dev: 455 us +- 4 us

# clang-12.0.1
Benchmark: twitter.json
.....................
Mean +- std dev: 449 us +- 4 us

But, now the there isn't much of a difference between the two compilers!

Closing

I didn't exactly help you figure out what the difference between gcc and clang was, but hopefully this helps you think about optimizing C code. This can be continued to keep trying to squeeze performance out of the existing code. Also, the graph visualization then compare generated code can be used to compare what different versions of gcc do with the same code, which is a good way to get a real understanding of how the compilers are treating the code differently.

digraph "small.graph" {
overlap=false;
subgraph "cluster_json_encode_str" {
style="dashed";
color="black";
label="json_encode_str ()";
subgraph cluster_220_1 {
style="filled";
color="darkgreen";
fillcolor="grey88";
label="loop 1";
labeljust=l;
penwidth=2;
fn_220_basic_block_16 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1044213921\<bb\ 16\>:\l\
|#\ start_370\ =\ PHI\ \<start_22(52),\ 0(15)\>\l\
|#\ prephitmp_256\ =\ PHI\ \<prephitmp_346(52),\ _58(15)\>\l\
|#\ prephitmp_253\ =\ PHI\ \<prephitmp_349(52),\ len.49_64(15)\>\l\
|#\ ivtmp.1187_391\ =\ PHI\ \<ivtmp.1187_390(52),\ 0(15)\>\l\
|i_358\ =\ (Py_ssize_t)\ ivtmp.1187_391;\l\
|#\ DEBUG\ start\ =\>\ start_370\l\
|#\ DEBUG\ i\ =\>\ i_358\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c_36\ =\ MEM[(const\ char\ *)_395\ +\ ivtmp.1187_391\ *\ 1];\l\
|#\ DEBUG\ c\ =\>\ c_36\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c.47_4\ =\ (unsigned\ char)\ c_36;\l\
|_5\ =\ (int)\ c.47_4;\l\
|escape_37\ =\ escape_table[_5];\l\
|#\ DEBUG\ escape\ =\>\ escape_37\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_338\ =\ self_35(D)-\>max_output_len;\l\
|if\ (escape_37\ ==\ 0)\l\
\ \ goto\ \<bb\ 17\>;\ [33.00%]\l\
else\l\
\ \ goto\ \<bb\ 18\>;\ [67.00%]\l\
}"];
fn_220_basic_block_17 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:344590592\<bb\ 17\>:\l\
|_386\ =\ ivtmp.1187_391\ +\ 1;\l\
|_385\ =\ (long\ int)\ _386;\l\
goto\ \<bb\ 52\>;\ [100.00%]\l\
}"];
fn_220_basic_block_18 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:699623329\<bb\ 18\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (i_358\ \>\ start_370)\l\
\ \ goto\ \<bb\ 19\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 29\>;\ [50.00%]\l\
}"];
fn_220_basic_block_52 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1043448021\<bb\ 52\>:\l\
|#\ start_22\ =\ PHI\ \<start_370(17),\ _387(51)\>\l\
|#\ prephitmp_349\ =\ PHI\ \<prephitmp_253(17),\ pretmp_312(51)\>\l\
|#\ prephitmp_347\ =\ PHI\ \<_385(17),\ _387(51)\>\l\
|#\ prephitmp_346\ =\ PHI\ \<prephitmp_256(17),\ prephitmp_350(51)\>\l\
|#\ DEBUG\ start\ =\>\ start_22\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ start_22\l\
|#\ DEBUG\ i\ =\>\ i_358\ +\ 1\l\
|#\ DEBUG\ BEGIN_STMT\l\
|ivtmp.1187_390\ =\ ivtmp.1187_391\ +\ 1;\l\
|if\ (prephitmp_347\ \<\ prephitmp_349)\l\
\ \ goto\ \<bb\ 16\>;\ [97.25%]\l\
else\l\
\ \ goto\ \<bb\ 53\>;\ [2.75%]\l\
}"];
fn_220_basic_block_19 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:349811664\<bb\ 19\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_6\ =\ i_358\ -\ start_370;\l\
|start.48_7\ =\ (sizetype)\ start_370;\l\
|_8\ =\ _395\ +\ start.48_7;\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ _8\l\
|#\ DEBUG\ n\ =\>\ _6\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_60\ =\ _6\ +\ prephitmp_256;\l\
|#\ DEBUG\ required\ =\>\ required_60\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_60\ \>\ pretmp_338)\l\
\ \ goto\ \<bb\ 21\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 20\>;\ [90.00%]\l\
}"];
fn_220_basic_block_29 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:699367967\<bb\ 29\>:\l\
|#\ prephitmp_208\ =\ PHI\ \<prephitmp_256(18),\ _72(28)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_306\ =\ self_35(D)-\>max_output_len;\l\
|if\ (escape_37\ ==\ 117)\l\
\ \ goto\ \<bb\ 30\>;\ [34.00%]\l\
else\l\
\ \ goto\ \<bb\ 40\>;\ [66.00%]\l\
}"];
fn_220_basic_block_21 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34981167\<bb\ 21\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ size\ =\>\ required_60\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_179\ =\ self_35(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _179\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_180\ =\ MEM[(const\ struct\ PyObject\ *)_179].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _180\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_181\ =\ required_60\ *\ 2;\l\
|_182\ =\ MAX_EXPR\ \<_181,\ 8\>;\l\
|self_35(D)-\>max_output_len\ =\ _182;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_180\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 22\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 23\>;\ [70.00%]\l\
}"];
fn_220_basic_block_20 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:314830497\<bb\ 20\>:\l\
|pretmp_246\ =\ self_35(D)-\>output_buffer_raw;\l\
goto\ \<bb\ 28\>;\ [100.00%]\l\
}"];
fn_220_basic_block_30 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:237785111\<bb\ 30\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ hex\ =\>\ \"0123456789abcdef\"\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ escaped$0\ =\>\ 92\l\
|#\ DEBUG\ escaped$1\ =\>\ 117\l\
|#\ DEBUG\ escaped$2\ =\>\ 48\l\
|#\ DEBUG\ escaped$3\ =\>\ 48\l\
|_9\ =\ c_36\ \>\>\ 4;\l\
|_10\ =\ (sizetype)\ _9;\l\
|_11\ =\ \"0123456789abcdef\"\ +\ _10;\l\
|_12\ =\ *_11;\l\
|#\ DEBUG\ escaped$4\ =\>\ _12\l\
|_31\ =\ c_36\ &\ 15;\l\
|_13\ =\ (sizetype)\ _31;\l\
|_14\ =\ \"0123456789abcdef\"\ +\ _13;\l\
|_15\ =\ *_14;\l\
|#\ DEBUG\ escaped$5\ =\>\ _15\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ 6\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_74\ =\ prephitmp_208\ +\ 6;\l\
|#\ DEBUG\ required\ =\>\ required_74\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_74\ \>\ pretmp_306)\l\
\ \ goto\ \<bb\ 32\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 31\>;\ [90.00%]\l\
}"];
fn_220_basic_block_40 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:461582855\<bb\ 40\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped[0]\ =\ 92;\l\
|escaped[1]\ =\ escape_37;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ 2\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_87\ =\ prephitmp_208\ +\ 2;\l\
|#\ DEBUG\ required\ =\>\ required_87\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_87\ \>\ pretmp_306)\l\
\ \ goto\ \<bb\ 42\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 41\>;\ [90.00%]\l\
}"];
fn_220_basic_block_22 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10494350\<bb\ 22\>:\l\
|_183\ =\ &self_35(D)-\>output_buffer;\l\
|iftmp.10_184\ =\ _PyBytes_Resize\ (_183,\ _182);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_184\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_184\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 24\>;\ [99.27%]\l\
}"];
fn_220_basic_block_23 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:24486817\<bb\ 23\>:\l\
|iftmp.10_185\ =\ PyByteArray_Resize\ (_179,\ _182);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_185\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_185\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 25\>;\ [99.27%]\l\
}"];
fn_220_basic_block_28 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:349556302\<bb\ 28\>:\l\
|#\ prephitmp_238\ =\ PHI\ \<pretmp_246(20),\ iftmp.11_192(27),\ _188(24)\>\l\
|#\ prephitmp_216\ =\ PHI\ \<prephitmp_256(20),\ pretmp_231(27),\ pretmp_223(24)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_66\ =\ (long\ unsigned\ int)\ _6;\l\
|_69\ =\ (sizetype)\ prephitmp_216;\l\
|_70\ =\ prephitmp_238\ +\ _69;\l\
|memcpy\ (_70,\ _8,\ n.9_66);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_71\ =\ self_35(D)-\>output_len;\l\
|_72\ =\ _6\ +\ _71;\l\
|self_35(D)-\>output_len\ =\ _72;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
}"];
fn_220_basic_block_32 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:23778511\<bb\ 32\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ size\ =\>\ required_74\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_194\ =\ self_35(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _194\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_195\ =\ MEM[(const\ struct\ PyObject\ *)_194].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _195\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_196\ =\ required_74\ *\ 2;\l\
|_197\ =\ MAX_EXPR\ \<_196,\ 8\>;\l\
|self_35(D)-\>max_output_len\ =\ _197;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_195\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 33\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 34\>;\ [70.00%]\l\
}"];
fn_220_basic_block_31 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:214006600\<bb\ 31\>:\l\
|pretmp_352\ =\ self_35(D)-\>output_buffer_raw;\l\
goto\ \<bb\ 39\>;\ [100.00%]\l\
}"];
fn_220_basic_block_42 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:46158286\<bb\ 42\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ size\ =\>\ required_87\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_209\ =\ self_35(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _209\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_210\ =\ MEM[(const\ struct\ PyObject\ *)_209].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _210\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_211\ =\ required_87\ *\ 2;\l\
|_212\ =\ MAX_EXPR\ \<_211,\ 8\>;\l\
|self_35(D)-\>max_output_len\ =\ _212;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_210\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 43\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 45\>;\ [70.00%]\l\
}"];
fn_220_basic_block_41 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:415424569\<bb\ 41\>:\l\
|pretmp_171\ =\ self_35(D)-\>output_buffer_raw;\l\
goto\ \<bb\ 50\>;\ [100.00%]\l\
}"];
fn_220_basic_block_24 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10417741\<bb\ 24\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_187\ =\ self_35(D)-\>output_buffer;\l\
|_188\ =\ &MEM[(struct\ PyBytesObject\ *)_187].ob_sval;\l\
|self_35(D)-\>output_buffer_raw\ =\ _188;\l\
|pretmp_223\ =\ self_35(D)-\>output_len;\l\
goto\ \<bb\ 28\>;\ [100.00%]\l\
}"];
fn_220_basic_block_25 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:24308063\<bb\ 25\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_189\ =\ self_35(D)-\>output_buffer;\l\
|_190\ =\ MEM[(struct\ PyVarObject\ *)_189].ob_size;\l\
|if\ (_190\ !=\ 0)\l\
\ \ goto\ \<bb\ 26\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 27\>;\ [50.00%]\l\
}"];
fn_220_basic_block_33 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:7133553\<bb\ 33\>:\l\
|_198\ =\ &self_35(D)-\>output_buffer;\l\
|iftmp.10_199\ =\ _PyBytes_Resize\ (_198,\ _197);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_199\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_199\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 35\>;\ [99.27%]\l\
}"];
fn_220_basic_block_34 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:16644958\<bb\ 34\>:\l\
|iftmp.10_200\ =\ PyByteArray_Resize\ (_194,\ _197);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_200\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_200\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 36\>;\ [99.27%]\l\
}"];
fn_220_basic_block_39 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:237611528\<bb\ 39\>:\l\
|#\ prephitmp_351\ =\ PHI\ \<pretmp_352(31),\ iftmp.11_207(38),\ _203(35)\>\l\
|#\ prephitmp_313\ =\ PHI\ \<prephitmp_208(31),\ pretmp_314(38),\ pretmp_324(35)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_82\ =\ (sizetype)\ prephitmp_313;\l\
|_83\ =\ prephitmp_351\ +\ _82;\l\
|MEM\ \<unsigned\ int\>\ [(char\ *\ \{ref-all\})_83]\ =\ 808482140;\l\
|MEM[(char\ *\ \{ref-all\})_83\ +\ 4B]\ =\ _12;\l\
|MEM[(char\ *\ \{ref-all\})_83\ +\ 5B]\ =\ _15;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_84\ =\ self_35(D)-\>output_len;\l\
|_85\ =\ _84\ +\ 6;\l\
|self_35(D)-\>output_len\ =\ _85;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ escaped$0\ =\>\ NULL\l\
|#\ DEBUG\ escaped$1\ =\>\ NULL\l\
|#\ DEBUG\ escaped$2\ =\>\ NULL\l\
|#\ DEBUG\ escaped$3\ =\>\ NULL\l\
|#\ DEBUG\ escaped$4\ =\>\ NULL\l\
|#\ DEBUG\ escaped$5\ =\>\ NULL\l\
goto\ \<bb\ 51\>;\ [100.00%]\l\
}"];
fn_220_basic_block_43 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:13847486\<bb\ 43\>:\l\
|_213\ =\ &self_35(D)-\>output_buffer;\l\
|iftmp.10_214\ =\ _PyBytes_Resize\ (_213,\ _212);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_214\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_214\ \<\ 0)\l\
\ \ goto\ \<bb\ 44\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 46\>;\ [99.27%]\l\
}"];
fn_220_basic_block_45 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:32310800\<bb\ 45\>:\l\
|iftmp.10_215\ =\ PyByteArray_Resize\ (_209,\ _212);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_215\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_215\ \<\ 0)\l\
\ \ goto\ \<bb\ 44\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 47\>;\ [99.27%]\l\
}"];
fn_220_basic_block_50 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:461245900\<bb\ 50\>:\l\
|#\ prephitmp_355\ =\ PHI\ \<pretmp_171(41),\ iftmp.11_222(49),\ _218(46)\>\l\
|#\ prephitmp_353\ =\ PHI\ \<prephitmp_208(41),\ pretmp_315(49),\ pretmp_354(46)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_95\ =\ (sizetype)\ prephitmp_353;\l\
|_96\ =\ prephitmp_355\ +\ _95;\l\
|_34\ =\ MEM\ \<short\ unsigned\ int\>\ [(char\ *\ \{ref-all\})&escaped];\l\
|MEM\ \<short\ unsigned\ int\>\ [(char\ *\ \{ref-all\})_96]\ =\ _34;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_97\ =\ self_35(D)-\>output_len;\l\
|_98\ =\ _97\ +\ 2;\l\
|self_35(D)-\>output_len\ =\ _98;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
}"];
fn_220_basic_block_26 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:12154032\<bb\ 26\>:\l\
|iftmp.11_191\ =\ MEM[(struct\ PyByteArrayObject\ *)_189].ob_start;\l\
}"];
fn_220_basic_block_27 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:24308063\<bb\ 27\>:\l\
|#\ iftmp.11_192\ =\ PHI\ \<&_PyByteArray_empty_string(25),\ iftmp.11_191(26)\>\l\
|self_35(D)-\>output_buffer_raw\ =\ iftmp.11_192;\l\
|pretmp_231\ =\ self_35(D)-\>output_len;\l\
}"];
fn_220_basic_block_35 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:7081478\<bb\ 35\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_202\ =\ self_35(D)-\>output_buffer;\l\
|_203\ =\ &MEM[(struct\ PyBytesObject\ *)_202].ob_sval;\l\
|self_35(D)-\>output_buffer_raw\ =\ _203;\l\
|pretmp_324\ =\ self_35(D)-\>output_len;\l\
goto\ \<bb\ 39\>;\ [100.00%]\l\
}"];
fn_220_basic_block_36 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:16523450\<bb\ 36\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_204\ =\ self_35(D)-\>output_buffer;\l\
|_205\ =\ MEM[(struct\ PyVarObject\ *)_204].ob_size;\l\
|if\ (_205\ !=\ 0)\l\
\ \ goto\ \<bb\ 37\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 38\>;\ [50.00%]\l\
}"];
fn_220_basic_block_51 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:698857428\<bb\ 51\>:\l\
|#\ prephitmp_350\ =\ PHI\ \<_85(39),\ _98(50)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_389\ =\ ivtmp.1187_391\ +\ 1;\l\
|_387\ =\ (long\ int)\ _389;\l\
|#\ DEBUG\ start\ =\>\ _387\l\
|pretmp_312\ =\ len;\l\
}"];
fn_220_basic_block_46 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:13746399\<bb\ 46\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_217\ =\ self_35(D)-\>output_buffer;\l\
|_218\ =\ &MEM[(struct\ PyBytesObject\ *)_217].ob_sval;\l\
|self_35(D)-\>output_buffer_raw\ =\ _218;\l\
|pretmp_354\ =\ self_35(D)-\>output_len;\l\
goto\ \<bb\ 50\>;\ [100.00%]\l\
}"];
fn_220_basic_block_47 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:32074932\<bb\ 47\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_219\ =\ self_35(D)-\>output_buffer;\l\
|_220\ =\ MEM[(struct\ PyVarObject\ *)_219].ob_size;\l\
|if\ (_220\ !=\ 0)\l\
\ \ goto\ \<bb\ 48\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 49\>;\ [50.00%]\l\
}"];
fn_220_basic_block_37 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:8261725\<bb\ 37\>:\l\
|iftmp.11_206\ =\ MEM[(struct\ PyByteArrayObject\ *)_204].ob_start;\l\
}"];
fn_220_basic_block_38 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:16523450\<bb\ 38\>:\l\
|#\ iftmp.11_207\ =\ PHI\ \<&_PyByteArray_empty_string(36),\ iftmp.11_206(37)\>\l\
|self_35(D)-\>output_buffer_raw\ =\ iftmp.11_207;\l\
|pretmp_314\ =\ self_35(D)-\>output_len;\l\
}"];
fn_220_basic_block_48 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:16037466\<bb\ 48\>:\l\
|iftmp.11_221\ =\ MEM[(struct\ PyByteArrayObject\ *)_219].ob_start;\l\
}"];
fn_220_basic_block_49 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:32074932\<bb\ 49\>:\l\
|#\ iftmp.11_222\ =\ PHI\ \<&_PyByteArray_empty_string(47),\ iftmp.11_221(48)\>\l\
|self_35(D)-\>output_buffer_raw\ =\ iftmp.11_222;\l\
|pretmp_315\ =\ self_35(D)-\>output_len;\l\
}"];
}
fn_220_basic_block_0 [shape=Mdiamond,style=filled,fillcolor=white,label="ENTRY"];
fn_220_basic_block_1 [shape=Mdiamond,style=filled,fillcolor=white,label="EXIT"];
fn_220_basic_block_2 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30452973\<bb\ 2\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ str\ =\>\ obj_33(D)\l\
|#\ DEBUG\ size\ =\>\ &len\l\
|#\ DEBUG\ INLINE_ENTRY\ unicode_str_and_size\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_126\ =\ BIT_FIELD_REF\ \<MEM[(struct\ PyASCIIObject\ *)obj_33(D)],\ 8,\ 256\>;\l\
|_127\ =\ _126\ &\ 96;\l\
|if\ (_127\ ==\ 96)\l\
\ \ goto\ \<bb\ 3\>;\ [35.01%]\l\
else\l\
\ \ goto\ \<bb\ 4\>;\ [64.99%]\l\
}"];
fn_220_basic_block_3 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10661586\<bb\ 3\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_128\ =\ MEM[(struct\ PyASCIIObject\ *)obj_33(D)].length;\l\
|len\ =\ _128;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_129\ =\ obj_33(D)\ +\ 48;\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _129\l\
|#\ DEBUG\ BEGIN_STMT\l\
goto\ \<bb\ 6\>;\ [100.00%]\l\
}"];
fn_220_basic_block_4 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19791387\<bb\ 4\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_130\ =\ PyUnicode_AsUTF8AndSize\ (obj_33(D),\ &len);\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _130\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_130\ ==\ 0B)\l\
\ \ goto\ \<bb\ 5\>;\ [0.69%]\l\
else\l\
\ \ goto\ \<bb\ 6\>;\ [99.31%]\l\
}"];
fn_220_basic_block_5 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:623883\<bb\ 5\>:\l\
goto\ \<bb\ 74\>;\ [100.00%]\l\
}"];
fn_220_basic_block_6 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30315935\<bb\ 6\>:\l\
|#\ _395\ =\ PHI\ \<_130(4),\ _129(3)\>\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _395\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_46\ =\ self_35(D)-\>output_len;\l\
|required_47\ =\ _46\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_47\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_48\ =\ self_35(D)-\>max_output_len;\l\
|if\ (required_47\ \>\ _48)\l\
\ \ goto\ \<bb\ 8\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 7\>;\ [90.00%]\l\
}"];
fn_220_basic_block_7 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:27284341\<bb\ 7\>:\l\
|pretmp_262\ =\ self_35(D)-\>output_buffer_raw;\l\
goto\ \<bb\ 15\>;\ [100.00%]\l\
}"];
fn_220_basic_block_8 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3031594\<bb\ 8\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ size\ =\>\ required_47\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_164\ =\ self_35(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _164\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_165\ =\ MEM[(const\ struct\ PyObject\ *)_164].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _165\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_166\ =\ required_47\ *\ 2;\l\
|_167\ =\ MAX_EXPR\ \<_166,\ 8\>;\l\
|self_35(D)-\>max_output_len\ =\ _167;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_165\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 9\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 10\>;\ [70.00%]\l\
}"];
fn_220_basic_block_9 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:909478\<bb\ 9\>:\l\
|_168\ =\ &self_35(D)-\>output_buffer;\l\
|iftmp.10_169\ =\ _PyBytes_Resize\ (_168,\ _167);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_169\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_169\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 11\>;\ [99.27%]\l\
}"];
fn_220_basic_block_10 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2122115\<bb\ 10\>:\l\
|iftmp.10_170\ =\ PyByteArray_Resize\ (_164,\ _167);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_170\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_170\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 12\>;\ [99.27%]\l\
}"];
fn_220_basic_block_11 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:902839\<bb\ 11\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_172\ =\ self_35(D)-\>output_buffer;\l\
|_173\ =\ &MEM[(struct\ PyBytesObject\ *)_172].ob_sval;\l\
|self_35(D)-\>output_buffer_raw\ =\ _173;\l\
|pretmp_259\ =\ self_35(D)-\>output_len;\l\
goto\ \<bb\ 15\>;\ [100.00%]\l\
}"];
fn_220_basic_block_12 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2106624\<bb\ 12\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_174\ =\ self_35(D)-\>output_buffer;\l\
|_175\ =\ MEM[(struct\ PyVarObject\ *)_174].ob_size;\l\
|if\ (_175\ !=\ 0)\l\
\ \ goto\ \<bb\ 13\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 14\>;\ [50.00%]\l\
}"];
fn_220_basic_block_13 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1053312\<bb\ 13\>:\l\
|iftmp.11_176\ =\ MEM[(struct\ PyByteArrayObject\ *)_174].ob_start;\l\
}"];
fn_220_basic_block_14 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2106624\<bb\ 14\>:\l\
|#\ iftmp.11_177\ =\ PHI\ \<&_PyByteArray_empty_string(12),\ iftmp.11_176(13)\>\l\
|self_35(D)-\>output_buffer_raw\ =\ iftmp.11_177;\l\
|pretmp_260\ =\ self_35(D)-\>output_len;\l\
}"];
fn_220_basic_block_15 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30293804\<bb\ 15\>:\l\
|#\ prephitmp_261\ =\ PHI\ \<pretmp_262(7),\ iftmp.11_177(14),\ _173(11)\>\l\
|#\ prephitmp_258\ =\ PHI\ \<_46(7),\ pretmp_260(14),\ pretmp_259(11)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_55\ =\ (sizetype)\ prephitmp_258;\l\
|_56\ =\ prephitmp_261\ +\ _55;\l\
|memcpy\ (_56,\ \"\\\"\",\ 1);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_57\ =\ self_35(D)-\>output_len;\l\
|_58\ =\ _57\ +\ 1;\l\
|self_35(D)-\>output_len\ =\ _58;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ i\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|len.49_64\ =\ len;\l\
|if\ (len.49_64\ \>\ 0)\l\
\ \ goto\ \<bb\ 16\>;\ [97.25%]\l\
else\l\
\ \ goto\ \<bb\ 53\>;\ [2.75%]\l\
}"];
fn_220_basic_block_44 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:336955\<bb\ 44\>:\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 74\>;\ [100.00%]\l\
}"];
fn_220_basic_block_53 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29527904\<bb\ 53\>:\l\
|#\ len.49_104\ =\ PHI\ \<prephitmp_349(52),\ len.49_64(15)\>\l\
|#\ i_364\ =\ PHI\ \<prephitmp_347(52),\ 0(15)\>\l\
|#\ start_376\ =\ PHI\ \<start_22(52),\ 0(15)\>\l\
|#\ prephitmp_356\ =\ PHI\ \<prephitmp_346(52),\ _58(15)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_340\ =\ self_35(D)-\>max_output_len;\l\
|if\ (len.49_104\ !=\ start_376)\l\
\ \ goto\ \<bb\ 54\>;\ [66.00%]\l\
else\l\
\ \ goto\ \<bb\ 64\>;\ [34.00%]\l\
}"];
fn_220_basic_block_54 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19488417\<bb\ 54\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_18\ =\ i_364\ -\ start_376;\l\
|start.51_19\ =\ (sizetype)\ start_376;\l\
|_20\ =\ _395\ +\ start.51_19;\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ _20\l\
|#\ DEBUG\ n\ =\>\ _18\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_100\ =\ _18\ +\ prephitmp_356;\l\
|#\ DEBUG\ required\ =\>\ required_100\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_100\ \>\ pretmp_340)\l\
\ \ goto\ \<bb\ 56\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 55\>;\ [90.00%]\l\
}"];
fn_220_basic_block_55 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:17539575\<bb\ 55\>:\l\
|pretmp_79\ =\ self_35(D)-\>output_buffer_raw;\l\
goto\ \<bb\ 63\>;\ [100.00%]\l\
}"];
fn_220_basic_block_56 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1948842\<bb\ 56\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ size\ =\>\ required_100\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_224\ =\ self_35(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _224\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_225\ =\ MEM[(const\ struct\ PyObject\ *)_224].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _225\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_226\ =\ required_100\ *\ 2;\l\
|_227\ =\ MAX_EXPR\ \<_226,\ 8\>;\l\
|self_35(D)-\>max_output_len\ =\ _227;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_225\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 57\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 58\>;\ [70.00%]\l\
}"];
fn_220_basic_block_57 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:584652\<bb\ 57\>:\l\
|_228\ =\ &self_35(D)-\>output_buffer;\l\
|iftmp.10_229\ =\ _PyBytes_Resize\ (_228,\ _227);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_229\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_229\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 59\>;\ [99.27%]\l\
}"];
fn_220_basic_block_58 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1364189\<bb\ 58\>:\l\
|iftmp.10_230\ =\ PyByteArray_Resize\ (_224,\ _227);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_230\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_230\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 60\>;\ [99.27%]\l\
}"];
fn_220_basic_block_59 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:580385\<bb\ 59\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_232\ =\ self_35(D)-\>output_buffer;\l\
|_233\ =\ &MEM[(struct\ PyBytesObject\ *)_232].ob_sval;\l\
|self_35(D)-\>output_buffer_raw\ =\ _233;\l\
|pretmp_309\ =\ self_35(D)-\>output_len;\l\
goto\ \<bb\ 63\>;\ [100.00%]\l\
}"];
fn_220_basic_block_60 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1354231\<bb\ 60\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_234\ =\ self_35(D)-\>output_buffer;\l\
|_235\ =\ MEM[(struct\ PyVarObject\ *)_234].ob_size;\l\
|if\ (_235\ !=\ 0)\l\
\ \ goto\ \<bb\ 61\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 62\>;\ [50.00%]\l\
}"];
fn_220_basic_block_61 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:677115\<bb\ 61\>:\l\
|iftmp.11_236\ =\ MEM[(struct\ PyByteArrayObject\ *)_234].ob_start;\l\
}"];
fn_220_basic_block_62 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1354231\<bb\ 62\>:\l\
|#\ iftmp.11_237\ =\ PHI\ \<&_PyByteArray_empty_string(60),\ iftmp.11_236(61)\>\l\
|self_35(D)-\>output_buffer_raw\ =\ iftmp.11_237;\l\
|pretmp_345\ =\ self_35(D)-\>output_len;\l\
}"];
fn_220_basic_block_63 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19474190\<bb\ 63\>:\l\
|#\ prephitmp_65\ =\ PHI\ \<pretmp_79(55),\ iftmp.11_237(62),\ _233(59)\>\l\
|#\ prephitmp_344\ =\ PHI\ \<prephitmp_356(55),\ pretmp_345(62),\ pretmp_309(59)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_106\ =\ (long\ unsigned\ int)\ _18;\l\
|_109\ =\ (sizetype)\ prephitmp_344;\l\
|_110\ =\ prephitmp_65\ +\ _109;\l\
|memcpy\ (_110,\ _20,\ n.9_106);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_111\ =\ self_35(D)-\>output_len;\l\
|_112\ =\ _18\ +\ _111;\l\
|self_35(D)-\>output_len\ =\ _112;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
}"];
fn_220_basic_block_64 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29513677\<bb\ 64\>:\l\
|#\ prephitmp_343\ =\ PHI\ \<prephitmp_356(53),\ _112(63)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_114\ =\ prephitmp_343\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_114\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_115\ =\ self_35(D)-\>max_output_len;\l\
|if\ (required_114\ \>\ _115)\l\
\ \ goto\ \<bb\ 66\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 65\>;\ [90.00%]\l\
}"];
fn_220_basic_block_65 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:26562309\<bb\ 65\>:\l\
|pretmp_308\ =\ self_35(D)-\>output_buffer_raw;\l\
goto\ \<bb\ 73\>;\ [100.00%]\l\
}"];
fn_220_basic_block_66 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2951368\<bb\ 66\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ size\ =\>\ required_114\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_239\ =\ self_35(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _239\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_240\ =\ MEM[(const\ struct\ PyObject\ *)_239].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _240\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_241\ =\ required_114\ *\ 2;\l\
|_242\ =\ MAX_EXPR\ \<_241,\ 8\>;\l\
|self_35(D)-\>max_output_len\ =\ _242;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_240\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 67\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 68\>;\ [70.00%]\l\
}"];
fn_220_basic_block_67 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:885410\<bb\ 67\>:\l\
|_243\ =\ &self_35(D)-\>output_buffer;\l\
|iftmp.10_244\ =\ _PyBytes_Resize\ (_243,\ _242);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_244\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_244\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 69\>;\ [99.27%]\l\
}"];
fn_220_basic_block_68 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2065957\<bb\ 68\>:\l\
|iftmp.10_245\ =\ PyByteArray_Resize\ (_239,\ _242);\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_245\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_245\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 70\>;\ [99.27%]\l\
}"];
fn_220_basic_block_69 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:878947\<bb\ 69\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_247\ =\ self_35(D)-\>output_buffer;\l\
|_248\ =\ &MEM[(struct\ PyBytesObject\ *)_247].ob_sval;\l\
|self_35(D)-\>output_buffer_raw\ =\ _248;\l\
|pretmp_317\ =\ self_35(D)-\>output_len;\l\
goto\ \<bb\ 73\>;\ [100.00%]\l\
}"];
fn_220_basic_block_70 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2050876\<bb\ 70\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_249\ =\ self_35(D)-\>output_buffer;\l\
|_250\ =\ MEM[(struct\ PyVarObject\ *)_249].ob_size;\l\
|if\ (_250\ !=\ 0)\l\
\ \ goto\ \<bb\ 71\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 72\>;\ [50.00%]\l\
}"];
fn_220_basic_block_71 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1025438\<bb\ 71\>:\l\
|iftmp.11_251\ =\ MEM[(struct\ PyByteArrayObject\ *)_249].ob_start;\l\
}"];
fn_220_basic_block_72 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2050876\<bb\ 72\>:\l\
|#\ iftmp.11_252\ =\ PHI\ \<&_PyByteArray_empty_string(70),\ iftmp.11_251(71)\>\l\
|self_35(D)-\>output_buffer_raw\ =\ iftmp.11_252;\l\
|pretmp_307\ =\ self_35(D)-\>output_len;\l\
}"];
fn_220_basic_block_73 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29492133\<bb\ 73\>:\l\
|#\ prephitmp_322\ =\ PHI\ \<pretmp_308(65),\ iftmp.11_252(72),\ _248(69)\>\l\
|#\ prephitmp_321\ =\ PHI\ \<prephitmp_343(65),\ pretmp_307(72),\ pretmp_317(69)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_122\ =\ (sizetype)\ prephitmp_321;\l\
|_123\ =\ prephitmp_322\ +\ _122;\l\
|memcpy\ (_123,\ \"\\\"\",\ 1);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_124\ =\ self_35(D)-\>output_len;\l\
|_125\ =\ _124\ +\ 1;\l\
|self_35(D)-\>output_len\ =\ _125;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_74 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30452974\<bb\ 74\>:\l\
|#\ _24\ =\ PHI\ \<-1(5),\ -1(44),\ 0(73)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ escaped$0\ =\>\ NULL\l\
|#\ DEBUG\ escaped$1\ =\>\ NULL\l\
|#\ DEBUG\ escaped$2\ =\>\ NULL\l\
|#\ DEBUG\ escaped$3\ =\>\ NULL\l\
|#\ DEBUG\ escaped$4\ =\>\ NULL\l\
|#\ DEBUG\ escaped$5\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|len\ =\{v\}\ \{CLOBBER\};\l\
|return\ _24;\l\
}"];
fn_220_basic_block_0:s -> fn_220_basic_block_2:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_2:s -> fn_220_basic_block_3:n [style="solid,bold",color=black,weight=10,constraint=true,label="[35%]"];
fn_220_basic_block_2:s -> fn_220_basic_block_4:n [style="solid,bold",color=black,weight=10,constraint=true,label="[64%]"];
fn_220_basic_block_3:s -> fn_220_basic_block_6:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_4:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_4:s -> fn_220_basic_block_6:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_5:s -> fn_220_basic_block_74:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_6:s -> fn_220_basic_block_8:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_220_basic_block_6:s -> fn_220_basic_block_7:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_220_basic_block_7:s -> fn_220_basic_block_15:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_8:s -> fn_220_basic_block_9:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_8:s -> fn_220_basic_block_10:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_9:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_9:s -> fn_220_basic_block_11:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_10:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_10:s -> fn_220_basic_block_12:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_11:s -> fn_220_basic_block_15:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_12:s -> fn_220_basic_block_13:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_12:s -> fn_220_basic_block_14:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_13:s -> fn_220_basic_block_14:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_14:s -> fn_220_basic_block_15:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_15:s -> fn_220_basic_block_16:n [style="solid,bold",color=black,weight=10,constraint=true,label="[97%]"];
fn_220_basic_block_15:s -> fn_220_basic_block_53:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_220_basic_block_16:s -> fn_220_basic_block_17:n [style="solid,bold",color=black,weight=10,constraint=true,label="[33%]"];
fn_220_basic_block_16:s -> fn_220_basic_block_18:n [style="solid,bold",color=black,weight=10,constraint=true,label="[67%]"];
fn_220_basic_block_17:s -> fn_220_basic_block_52:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_18:s -> fn_220_basic_block_19:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_18:s -> fn_220_basic_block_29:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_19:s -> fn_220_basic_block_21:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_220_basic_block_19:s -> fn_220_basic_block_20:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_220_basic_block_20:s -> fn_220_basic_block_28:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_21:s -> fn_220_basic_block_22:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_21:s -> fn_220_basic_block_23:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_22:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_22:s -> fn_220_basic_block_24:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_23:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_23:s -> fn_220_basic_block_25:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_24:s -> fn_220_basic_block_28:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_25:s -> fn_220_basic_block_26:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_25:s -> fn_220_basic_block_27:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_26:s -> fn_220_basic_block_27:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_27:s -> fn_220_basic_block_28:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_28:s -> fn_220_basic_block_29:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_29:s -> fn_220_basic_block_30:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_220_basic_block_29:s -> fn_220_basic_block_40:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_220_basic_block_30:s -> fn_220_basic_block_32:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_220_basic_block_30:s -> fn_220_basic_block_31:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_220_basic_block_31:s -> fn_220_basic_block_39:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_32:s -> fn_220_basic_block_33:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_32:s -> fn_220_basic_block_34:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_33:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_33:s -> fn_220_basic_block_35:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_34:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_34:s -> fn_220_basic_block_36:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_35:s -> fn_220_basic_block_39:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_36:s -> fn_220_basic_block_37:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_36:s -> fn_220_basic_block_38:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_37:s -> fn_220_basic_block_38:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_38:s -> fn_220_basic_block_39:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_39:s -> fn_220_basic_block_51:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_40:s -> fn_220_basic_block_42:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_220_basic_block_40:s -> fn_220_basic_block_41:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_220_basic_block_41:s -> fn_220_basic_block_50:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_42:s -> fn_220_basic_block_43:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_42:s -> fn_220_basic_block_45:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_43:s -> fn_220_basic_block_44:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_43:s -> fn_220_basic_block_46:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_44:s -> fn_220_basic_block_74:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_45:s -> fn_220_basic_block_44:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_45:s -> fn_220_basic_block_47:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_46:s -> fn_220_basic_block_50:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_47:s -> fn_220_basic_block_48:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_47:s -> fn_220_basic_block_49:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_48:s -> fn_220_basic_block_49:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_49:s -> fn_220_basic_block_50:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_50:s -> fn_220_basic_block_51:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_51:s -> fn_220_basic_block_52:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_52:s -> fn_220_basic_block_16:n [style="dotted,bold",color=blue,weight=10,constraint=false,label="[97%]"];
fn_220_basic_block_52:s -> fn_220_basic_block_53:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_220_basic_block_53:s -> fn_220_basic_block_54:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_220_basic_block_53:s -> fn_220_basic_block_64:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_220_basic_block_54:s -> fn_220_basic_block_56:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_220_basic_block_54:s -> fn_220_basic_block_55:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_220_basic_block_55:s -> fn_220_basic_block_63:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_56:s -> fn_220_basic_block_57:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_56:s -> fn_220_basic_block_58:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_57:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_57:s -> fn_220_basic_block_59:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_58:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_58:s -> fn_220_basic_block_60:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_59:s -> fn_220_basic_block_63:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_60:s -> fn_220_basic_block_61:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_60:s -> fn_220_basic_block_62:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_61:s -> fn_220_basic_block_62:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_62:s -> fn_220_basic_block_63:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_63:s -> fn_220_basic_block_64:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_64:s -> fn_220_basic_block_66:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_220_basic_block_64:s -> fn_220_basic_block_65:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_220_basic_block_65:s -> fn_220_basic_block_73:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_66:s -> fn_220_basic_block_67:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_66:s -> fn_220_basic_block_68:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_67:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_67:s -> fn_220_basic_block_69:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_68:s -> fn_220_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_68:s -> fn_220_basic_block_70:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_69:s -> fn_220_basic_block_73:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_70:s -> fn_220_basic_block_71:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_70:s -> fn_220_basic_block_72:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_71:s -> fn_220_basic_block_72:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_72:s -> fn_220_basic_block_73:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_73:s -> fn_220_basic_block_74:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_74:s -> fn_220_basic_block_1:n [style="solid,bold",color=black,weight=10,constraint=true,label="[100%]"];
fn_220_basic_block_0:s -> fn_220_basic_block_1:n [style="invis",constraint=true];
}
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
digraph "small.graph" {
overlap=false;
subgraph "cluster_json_encode_str" {
style="dashed";
color="black";
label="json_encode_str ()";
subgraph cluster_223_1 {
style="filled";
color="darkgreen";
fillcolor="grey88";
label="loop 1";
labeljust=l;
penwidth=2;
fn_223_basic_block_10 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1044213921\<bb\ 10\>:\l\
|#\ start_102\ =\ PHI\ \<start_22(28),\ 0(9)\>\l\
|#\ prephitmp_196\ =\ PHI\ \<prephitmp_212(28),\ _58(9)\>\l\
|#\ prephitmp_199\ =\ PHI\ \<prephitmp_209(28),\ len.47_49(9)\>\l\
|#\ ivtmp.754_197\ =\ PHI\ \<ivtmp.754_192(28),\ 0(9)\>\l\
|i_116\ =\ (Py_ssize_t)\ ivtmp.754_197;\l\
|#\ DEBUG\ start\ =\>\ start_102\l\
|#\ DEBUG\ i\ =\>\ i_116\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c_36\ =\ MEM[(const\ char\ *)_184\ +\ ivtmp.754_197\ *\ 1];\l\
|#\ DEBUG\ c\ =\>\ c_36\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c.45_4\ =\ (unsigned\ char)\ c_36;\l\
|_5\ =\ (int)\ c.45_4;\l\
|escape_37\ =\ escape_table[_5];\l\
|#\ DEBUG\ escape\ =\>\ escape_37\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_225\ =\ self_35(D)-\>max_output_len;\l\
|if\ (escape_37\ ==\ 0)\l\
\ \ goto\ \<bb\ 11\>;\ [33.00%]\l\
else\l\
\ \ goto\ \<bb\ 12\>;\ [67.00%]\l\
}"];
fn_223_basic_block_11 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:344590592\<bb\ 11\>:\l\
|_189\ =\ ivtmp.754_197\ +\ 1;\l\
|_188\ =\ (long\ int)\ _189;\l\
goto\ \<bb\ 28\>;\ [100.00%]\l\
}"];
fn_223_basic_block_12 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:699623329\<bb\ 12\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (start_102\ \<\ i_116)\l\
\ \ goto\ \<bb\ 13\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 17\>;\ [50.00%]\l\
}"];
fn_223_basic_block_28 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1043448021\<bb\ 28\>:\l\
|#\ start_22\ =\ PHI\ \<start_102(11),\ _190(27)\>\l\
|#\ prephitmp_209\ =\ PHI\ \<prephitmp_199(11),\ pretmp_208(27)\>\l\
|#\ prephitmp_211\ =\ PHI\ \<_188(11),\ _190(27)\>\l\
|#\ prephitmp_212\ =\ PHI\ \<prephitmp_196(11),\ prephitmp_207(27)\>\l\
|#\ DEBUG\ start\ =\>\ start_22\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ start_22\l\
|#\ DEBUG\ i\ =\>\ i_116\ +\ 1\l\
|#\ DEBUG\ BEGIN_STMT\l\
|ivtmp.754_192\ =\ ivtmp.754_197\ +\ 1;\l\
|if\ (prephitmp_209\ \>\ prephitmp_211)\l\
\ \ goto\ \<bb\ 10\>;\ [97.25%]\l\
else\l\
\ \ goto\ \<bb\ 29\>;\ [2.75%]\l\
}"];
fn_223_basic_block_13 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:349811664\<bb\ 13\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_6\ =\ i_116\ -\ start_102;\l\
|start.46_7\ =\ (sizetype)\ start_102;\l\
|_8\ =\ _184\ +\ start.46_7;\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ _8\l\
|#\ DEBUG\ n\ =\>\ _6\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_60\ =\ _6\ +\ prephitmp_196;\l\
|#\ DEBUG\ required\ =\>\ required_60\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_60\ \>\ pretmp_225)\l\
\ \ goto\ \<bb\ 14\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 16\>;\ [90.00%]\l\
}"];
fn_223_basic_block_17 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:699367967\<bb\ 17\>:\l\
|#\ prephitmp_202\ =\ PHI\ \<prephitmp_196(12),\ _72(16)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_223\ =\ self_35(D)-\>max_output_len;\l\
|if\ (escape_37\ ==\ 117)\l\
\ \ goto\ \<bb\ 18\>;\ [34.00%]\l\
else\l\
\ \ goto\ \<bb\ 22\>;\ [66.00%]\l\
}"];
fn_223_basic_block_14 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34981167\<bb\ 14\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_65\ =\ mp_resize_cold\ (self_35(D),\ required_60);\l\
|if\ (_65\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 15\>;\ [99.27%]\l\
}"];
fn_223_basic_block_16 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:349556302\<bb\ 16\>:\l\
|#\ prephitmp_201\ =\ PHI\ \<prephitmp_196(13),\ pretmp_200(15)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_66\ =\ (long\ unsigned\ int)\ _6;\l\
|_67\ =\ self_35(D)-\>output_buffer_raw;\l\
|_69\ =\ (sizetype)\ prephitmp_201;\l\
|_70\ =\ _67\ +\ _69;\l\
|memcpy\ (_70,\ _8,\ n.9_66);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_71\ =\ self_35(D)-\>output_len;\l\
|_72\ =\ _6\ +\ _71;\l\
|self_35(D)-\>output_len\ =\ _72;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
}"];
fn_223_basic_block_18 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:237785111\<bb\ 18\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ hex\ =\>\ \"0123456789abcdef\"\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ escaped$0\ =\>\ 92\l\
|#\ DEBUG\ escaped$1\ =\>\ 117\l\
|#\ DEBUG\ escaped$2\ =\>\ 48\l\
|#\ DEBUG\ escaped$3\ =\>\ 48\l\
|_9\ =\ c_36\ \>\>\ 4;\l\
|_10\ =\ (sizetype)\ _9;\l\
|_11\ =\ \"0123456789abcdef\"\ +\ _10;\l\
|_12\ =\ *_11;\l\
|#\ DEBUG\ escaped$4\ =\>\ _12\l\
|_31\ =\ c_36\ &\ 15;\l\
|_13\ =\ (sizetype)\ _31;\l\
|_14\ =\ \"0123456789abcdef\"\ +\ _13;\l\
|_15\ =\ *_14;\l\
|#\ DEBUG\ escaped$5\ =\>\ _15\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ 6\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_74\ =\ prephitmp_202\ +\ 6;\l\
|#\ DEBUG\ required\ =\>\ required_74\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_74\ \>\ pretmp_223)\l\
\ \ goto\ \<bb\ 19\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 21\>;\ [90.00%]\l\
}"];
fn_223_basic_block_22 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:461582855\<bb\ 22\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped[0]\ =\ 92;\l\
|escaped[1]\ =\ escape_37;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ 2\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_87\ =\ prephitmp_202\ +\ 2;\l\
|#\ DEBUG\ required\ =\>\ required_87\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_87\ \>\ pretmp_223)\l\
\ \ goto\ \<bb\ 23\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 25\>;\ [90.00%]\l\
}"];
fn_223_basic_block_15 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34725805\<bb\ 15\>:\l\
|pretmp_200\ =\ self_35(D)-\>output_len;\l\
}"];
fn_223_basic_block_19 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:23778511\<bb\ 19\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_79\ =\ mp_resize_cold\ (self_35(D),\ required_74);\l\
|if\ (_79\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 20\>;\ [99.27%]\l\
}"];
fn_223_basic_block_21 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:237611528\<bb\ 21\>:\l\
|#\ prephitmp_206\ =\ PHI\ \<prephitmp_202(18),\ pretmp_205(20)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_80\ =\ self_35(D)-\>output_buffer_raw;\l\
|_82\ =\ (sizetype)\ prephitmp_206;\l\
|_83\ =\ _80\ +\ _82;\l\
|MEM\ \<unsigned\ int\>\ [(char\ *\ \{ref-all\})_83]\ =\ 808482140;\l\
|MEM[(char\ *\ \{ref-all\})_83\ +\ 4B]\ =\ _12;\l\
|MEM[(char\ *\ \{ref-all\})_83\ +\ 5B]\ =\ _15;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_84\ =\ self_35(D)-\>output_len;\l\
|_85\ =\ _84\ +\ 6;\l\
|self_35(D)-\>output_len\ =\ _85;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ escaped$0\ =\>\ NULL\l\
|#\ DEBUG\ escaped$1\ =\>\ NULL\l\
|#\ DEBUG\ escaped$2\ =\>\ NULL\l\
|#\ DEBUG\ escaped$3\ =\>\ NULL\l\
|#\ DEBUG\ escaped$4\ =\>\ NULL\l\
|#\ DEBUG\ escaped$5\ =\>\ NULL\l\
goto\ \<bb\ 27\>;\ [100.00%]\l\
}"];
fn_223_basic_block_23 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:46158286\<bb\ 23\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_92\ =\ mp_resize_cold\ (self_35(D),\ required_87);\l\
|if\ (_92\ \<\ 0)\l\
\ \ goto\ \<bb\ 26\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 24\>;\ [99.27%]\l\
}"];
fn_223_basic_block_25 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:461245900\<bb\ 25\>:\l\
|#\ prephitmp_204\ =\ PHI\ \<prephitmp_202(22),\ pretmp_203(24)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_93\ =\ self_35(D)-\>output_buffer_raw;\l\
|_95\ =\ (sizetype)\ prephitmp_204;\l\
|_96\ =\ _93\ +\ _95;\l\
|_34\ =\ MEM\ \<short\ unsigned\ int\>\ [(char\ *\ \{ref-all\})&escaped];\l\
|MEM\ \<short\ unsigned\ int\>\ [(char\ *\ \{ref-all\})_96]\ =\ _34;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_97\ =\ self_35(D)-\>output_len;\l\
|_98\ =\ _97\ +\ 2;\l\
|self_35(D)-\>output_len\ =\ _98;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 27\>;\ [100.00%]\l\
}"];
fn_223_basic_block_20 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:23604928\<bb\ 20\>:\l\
|pretmp_205\ =\ self_35(D)-\>output_len;\l\
}"];
fn_223_basic_block_27 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:698857428\<bb\ 27\>:\l\
|#\ prephitmp_207\ =\ PHI\ \<_85(21),\ _98(25)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_191\ =\ ivtmp.754_197\ +\ 1;\l\
|_190\ =\ (long\ int)\ _191;\l\
|#\ DEBUG\ start\ =\>\ _190\l\
|pretmp_208\ =\ len;\l\
}"];
fn_223_basic_block_24 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:45821331\<bb\ 24\>:\l\
|pretmp_203\ =\ self_35(D)-\>output_len;\l\
}"];
}
fn_223_basic_block_0 [shape=Mdiamond,style=filled,fillcolor=white,label="ENTRY"];
fn_223_basic_block_1 [shape=Mdiamond,style=filled,fillcolor=white,label="EXIT"];
fn_223_basic_block_2 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30452973\<bb\ 2\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ str\ =\>\ obj_33(D)\l\
|#\ DEBUG\ size\ =\>\ &len\l\
|#\ DEBUG\ INLINE_ENTRY\ unicode_str_and_size\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_126\ =\ BIT_FIELD_REF\ \<MEM[(struct\ PyASCIIObject\ *)obj_33(D)],\ 8,\ 256\>;\l\
|_127\ =\ _126\ &\ 96;\l\
|if\ (_127\ ==\ 96)\l\
\ \ goto\ \<bb\ 3\>;\ [35.01%]\l\
else\l\
\ \ goto\ \<bb\ 4\>;\ [64.99%]\l\
}"];
fn_223_basic_block_3 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10661586\<bb\ 3\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_128\ =\ MEM[(struct\ PyASCIIObject\ *)obj_33(D)].length;\l\
|len\ =\ _128;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_129\ =\ obj_33(D)\ +\ 48;\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _129\l\
|#\ DEBUG\ BEGIN_STMT\l\
goto\ \<bb\ 6\>;\ [100.00%]\l\
}"];
fn_223_basic_block_4 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19791387\<bb\ 4\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_130\ =\ PyUnicode_AsUTF8AndSize\ (obj_33(D),\ &len);\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _130\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_130\ ==\ 0B)\l\
\ \ goto\ \<bb\ 5\>;\ [0.69%]\l\
else\l\
\ \ goto\ \<bb\ 6\>;\ [99.31%]\l\
}"];
fn_223_basic_block_5 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:623886\<bb\ 5\>:\l\
goto\ \<bb\ 38\>;\ [100.00%]\l\
}"];
fn_223_basic_block_6 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30315935\<bb\ 6\>:\l\
|#\ _184\ =\ PHI\ \<_130(4),\ _129(3)\>\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _184\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_46\ =\ self_35(D)-\>output_len;\l\
|required_47\ =\ _46\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_47\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_48\ =\ self_35(D)-\>max_output_len;\l\
|if\ (required_47\ \>\ _48)\l\
\ \ goto\ \<bb\ 7\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 9\>;\ [90.00%]\l\
}"];
fn_223_basic_block_7 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3031594\<bb\ 7\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_52\ =\ mp_resize_cold\ (self_35(D),\ required_47);\l\
|if\ (_52\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 8\>;\ [99.27%]\l\
}"];
fn_223_basic_block_8 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3009463\<bb\ 8\>:\l\
|pretmp_193\ =\ self_35(D)-\>output_len;\l\
}"];
fn_223_basic_block_9 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30293804\<bb\ 9\>:\l\
|#\ prephitmp_194\ =\ PHI\ \<_46(6),\ pretmp_193(8)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_53\ =\ self_35(D)-\>output_buffer_raw;\l\
|_55\ =\ (sizetype)\ prephitmp_194;\l\
|_56\ =\ _53\ +\ _55;\l\
|memcpy\ (_56,\ \"\\\"\",\ 1);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_57\ =\ self_35(D)-\>output_len;\l\
|_58\ =\ _57\ +\ 1;\l\
|self_35(D)-\>output_len\ =\ _58;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ i\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|len.47_49\ =\ len;\l\
|if\ (len.47_49\ \>\ 0)\l\
\ \ goto\ \<bb\ 10\>;\ [97.25%]\l\
else\l\
\ \ goto\ \<bb\ 29\>;\ [2.75%]\l\
}"];
fn_223_basic_block_26 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:336955\<bb\ 26\>:\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 38\>;\ [100.00%]\l\
}"];
fn_223_basic_block_29 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29527904\<bb\ 29\>:\l\
|#\ len.47_50\ =\ PHI\ \<prephitmp_209(28),\ len.47_49(9)\>\l\
|#\ i_117\ =\ PHI\ \<prephitmp_211(28),\ 0(9)\>\l\
|#\ start_103\ =\ PHI\ \<start_22(28),\ 0(9)\>\l\
|#\ prephitmp_216\ =\ PHI\ \<prephitmp_212(28),\ _58(9)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_222\ =\ self_35(D)-\>max_output_len;\l\
|if\ (len.47_50\ !=\ start_103)\l\
\ \ goto\ \<bb\ 30\>;\ [66.00%]\l\
else\l\
\ \ goto\ \<bb\ 34\>;\ [34.00%]\l\
}"];
fn_223_basic_block_30 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19488417\<bb\ 30\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_18\ =\ i_117\ -\ start_103;\l\
|start.49_19\ =\ (sizetype)\ start_103;\l\
|_20\ =\ _184\ +\ start.49_19;\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ _20\l\
|#\ DEBUG\ n\ =\>\ _18\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_100\ =\ _18\ +\ prephitmp_216;\l\
|#\ DEBUG\ required\ =\>\ required_100\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_100\ \>\ pretmp_222)\l\
\ \ goto\ \<bb\ 31\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 33\>;\ [90.00%]\l\
}"];
fn_223_basic_block_31 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1948842\<bb\ 31\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_105\ =\ mp_resize_cold\ (self_35(D),\ required_100);\l\
|if\ (_105\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 32\>;\ [99.27%]\l\
}"];
fn_223_basic_block_32 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1934615\<bb\ 32\>:\l\
|pretmp_217\ =\ self_35(D)-\>output_len;\l\
}"];
fn_223_basic_block_33 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19474190\<bb\ 33\>:\l\
|#\ prephitmp_218\ =\ PHI\ \<prephitmp_216(30),\ pretmp_217(32)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_106\ =\ (long\ unsigned\ int)\ _18;\l\
|_107\ =\ self_35(D)-\>output_buffer_raw;\l\
|_109\ =\ (sizetype)\ prephitmp_218;\l\
|_110\ =\ _107\ +\ _109;\l\
|memcpy\ (_110,\ _20,\ n.9_106);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_111\ =\ self_35(D)-\>output_len;\l\
|_112\ =\ _18\ +\ _111;\l\
|self_35(D)-\>output_len\ =\ _112;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
}"];
fn_223_basic_block_34 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29513677\<bb\ 34\>:\l\
|#\ prephitmp_219\ =\ PHI\ \<prephitmp_216(29),\ _112(33)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_35(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_114\ =\ prephitmp_219\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_114\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_115\ =\ self_35(D)-\>max_output_len;\l\
|if\ (required_114\ \>\ _115)\l\
\ \ goto\ \<bb\ 35\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 37\>;\ [90.00%]\l\
}"];
fn_223_basic_block_35 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2951368\<bb\ 35\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_119\ =\ mp_resize_cold\ (self_35(D),\ required_114);\l\
|if\ (_119\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 36\>;\ [99.27%]\l\
}"];
fn_223_basic_block_36 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2929823\<bb\ 36\>:\l\
|pretmp_220\ =\ self_35(D)-\>output_len;\l\
}"];
fn_223_basic_block_37 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29492133\<bb\ 37\>:\l\
|#\ prephitmp_221\ =\ PHI\ \<prephitmp_219(34),\ pretmp_220(36)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_120\ =\ self_35(D)-\>output_buffer_raw;\l\
|_122\ =\ (sizetype)\ prephitmp_221;\l\
|_123\ =\ _120\ +\ _122;\l\
|memcpy\ (_123,\ \"\\\"\",\ 1);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_124\ =\ self_35(D)-\>output_len;\l\
|_125\ =\ _124\ +\ 1;\l\
|self_35(D)-\>output_len\ =\ _125;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_223_basic_block_38 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:30452974\<bb\ 38\>:\l\
|#\ _24\ =\ PHI\ \<-1(5),\ -1(26),\ 0(37)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ escaped$0\ =\>\ NULL\l\
|#\ DEBUG\ escaped$1\ =\>\ NULL\l\
|#\ DEBUG\ escaped$2\ =\>\ NULL\l\
|#\ DEBUG\ escaped$3\ =\>\ NULL\l\
|#\ DEBUG\ escaped$4\ =\>\ NULL\l\
|#\ DEBUG\ escaped$5\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|len\ =\{v\}\ \{CLOBBER\};\l\
|return\ _24;\l\
}"];
fn_223_basic_block_0:s -> fn_223_basic_block_2:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_2:s -> fn_223_basic_block_3:n [style="solid,bold",color=black,weight=10,constraint=true,label="[35%]"];
fn_223_basic_block_2:s -> fn_223_basic_block_4:n [style="solid,bold",color=black,weight=10,constraint=true,label="[64%]"];
fn_223_basic_block_3:s -> fn_223_basic_block_6:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_4:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_4:s -> fn_223_basic_block_6:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_5:s -> fn_223_basic_block_38:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_6:s -> fn_223_basic_block_7:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_6:s -> fn_223_basic_block_9:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_7:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_7:s -> fn_223_basic_block_8:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_8:s -> fn_223_basic_block_9:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_9:s -> fn_223_basic_block_10:n [style="solid,bold",color=black,weight=10,constraint=true,label="[97%]"];
fn_223_basic_block_9:s -> fn_223_basic_block_29:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_223_basic_block_10:s -> fn_223_basic_block_11:n [style="solid,bold",color=black,weight=10,constraint=true,label="[33%]"];
fn_223_basic_block_10:s -> fn_223_basic_block_12:n [style="solid,bold",color=black,weight=10,constraint=true,label="[67%]"];
fn_223_basic_block_11:s -> fn_223_basic_block_28:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_12:s -> fn_223_basic_block_13:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_223_basic_block_12:s -> fn_223_basic_block_17:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_223_basic_block_13:s -> fn_223_basic_block_14:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_13:s -> fn_223_basic_block_16:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_14:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_14:s -> fn_223_basic_block_15:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_15:s -> fn_223_basic_block_16:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_16:s -> fn_223_basic_block_17:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_17:s -> fn_223_basic_block_18:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_223_basic_block_17:s -> fn_223_basic_block_22:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_223_basic_block_18:s -> fn_223_basic_block_19:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_18:s -> fn_223_basic_block_21:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_19:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_19:s -> fn_223_basic_block_20:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_20:s -> fn_223_basic_block_21:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_21:s -> fn_223_basic_block_27:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_22:s -> fn_223_basic_block_23:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_22:s -> fn_223_basic_block_25:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_23:s -> fn_223_basic_block_26:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_23:s -> fn_223_basic_block_24:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_24:s -> fn_223_basic_block_25:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_25:s -> fn_223_basic_block_27:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_26:s -> fn_223_basic_block_38:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_27:s -> fn_223_basic_block_28:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_28:s -> fn_223_basic_block_10:n [style="dotted,bold",color=blue,weight=10,constraint=false,label="[97%]"];
fn_223_basic_block_28:s -> fn_223_basic_block_29:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_223_basic_block_29:s -> fn_223_basic_block_30:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_223_basic_block_29:s -> fn_223_basic_block_34:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_223_basic_block_30:s -> fn_223_basic_block_31:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_30:s -> fn_223_basic_block_33:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_31:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_31:s -> fn_223_basic_block_32:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_32:s -> fn_223_basic_block_33:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_33:s -> fn_223_basic_block_34:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_34:s -> fn_223_basic_block_35:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_34:s -> fn_223_basic_block_37:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_35:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_35:s -> fn_223_basic_block_36:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_36:s -> fn_223_basic_block_37:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_37:s -> fn_223_basic_block_38:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_38:s -> fn_223_basic_block_1:n [style="solid,bold",color=black,weight=10,constraint=true,label="[100%]"];
fn_223_basic_block_0:s -> fn_223_basic_block_1:n [style="invis",constraint=true];
}
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
digraph "small.graph" {
overlap=false;
subgraph "cluster_json_encode_str" {
style="dashed";
color="black";
label="json_encode_str ()";
subgraph cluster_223_1 {
style="filled";
color="darkgreen";
fillcolor="grey88";
label="loop 1";
labeljust=l;
penwidth=2;
fn_223_basic_block_10 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1034442873\<bb\ 10\>:\l\
|#\ start_97\ =\ PHI\ \<start_22(23),\ 0(9)\>\l\
|#\ prephitmp_185\ =\ PHI\ \<prephitmp_196(23),\ _66(9)\>\l\
|#\ ivtmp.750_50\ =\ PHI\ \<ivtmp.750_48(23),\ 0(9)\>\l\
|i_111\ =\ (Py_ssize_t)\ ivtmp.750_50;\l\
|#\ DEBUG\ start\ =\>\ start_97\l\
|#\ DEBUG\ i\ =\>\ i_111\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c_37\ =\ MEM[(const\ char\ *)_169\ +\ ivtmp.750_50\ *\ 1];\l\
|#\ DEBUG\ c\ =\>\ c_37\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c.45_3\ =\ (unsigned\ char)\ c_37;\l\
|_4\ =\ (int)\ c.45_3;\l\
|escape_38\ =\ escape_table[_4];\l\
|#\ DEBUG\ escape\ =\>\ escape_38\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_208\ =\ self_36(D)-\>max_output_len;\l\
|if\ (escape_38\ ==\ 0)\l\
\ \ goto\ \<bb\ 11\>;\ [33.00%]\l\
else\l\
\ \ goto\ \<bb\ 12\>;\ [67.00%]\l\
}"];
fn_223_basic_block_11 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:341366146\<bb\ 11\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_197\ =\ ivtmp.750_50\ +\ 1;\l\
|_187\ =\ (long\ int)\ _197;\l\
goto\ \<bb\ 23\>;\ [100.00%]\l\
}"];
fn_223_basic_block_12 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:693076727\<bb\ 12\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (start_97\ \<\ i_111)\l\
\ \ goto\ \<bb\ 13\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 17\>;\ [50.00%]\l\
}"];
fn_223_basic_block_23 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1033684139\<bb\ 23\>:\l\
|#\ start_22\ =\ PHI\ \<_198(21),\ start_97(11)\>\l\
|#\ prephitmp_195\ =\ PHI\ \<_198(21),\ _187(11)\>\l\
|#\ prephitmp_196\ =\ PHI\ \<_93(21),\ prephitmp_185(11)\>\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
|#\ DEBUG\ start\ =\>\ start_22\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ start_22\l\
|#\ DEBUG\ i\ =\>\ i_111\ +\ 1\l\
|#\ DEBUG\ BEGIN_STMT\l\
|len.49_16\ =\ len;\l\
|ivtmp.750_48\ =\ ivtmp.750_50\ +\ 1;\l\
|if\ (len.49_16\ \>\ prephitmp_195)\l\
\ \ goto\ \<bb\ 10\>;\ [96.34%]\l\
else\l\
\ \ goto\ \<bb\ 24\>;\ [3.66%]\l\
}"];
fn_223_basic_block_13 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:346538363\<bb\ 13\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_5\ =\ i_111\ -\ start_97;\l\
|start.46_6\ =\ (sizetype)\ start_97;\l\
|_7\ =\ _169\ +\ start.46_6;\l\
|#\ DEBUG\ self\ =\>\ self_36(D)\l\
|#\ DEBUG\ s\ =\>\ _7\l\
|#\ DEBUG\ n\ =\>\ _5\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_68\ =\ _5\ +\ prephitmp_185;\l\
|#\ DEBUG\ required\ =\>\ required_68\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_68\ \>\ pretmp_208)\l\
\ \ goto\ \<bb\ 14\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 16\>;\ [90.00%]\l\
}"];
fn_223_basic_block_17 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:692823754\<bb\ 17\>:\l\
|#\ prephitmp_190\ =\ PHI\ \<prephitmp_185(12),\ _80(16)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (escape_38\ ==\ 117)\l\
\ \ goto\ \<bb\ 34\>;\ [34.00%]\l\
else\l\
\ \ goto\ \<bb\ 35\>;\ [66.00%]\l\
}"];
fn_223_basic_block_14 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34653837\<bb\ 14\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_73\ =\ mp_resize_cold\ (self_36(D),\ required_68);\l\
|if\ (_73\ \<\ 0)\l\
\ \ goto\ \<bb\ 22\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 15\>;\ [99.27%]\l\
}"];
fn_223_basic_block_16 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:346285390\<bb\ 16\>:\l\
|#\ prephitmp_189\ =\ PHI\ \<prephitmp_185(13),\ pretmp_188(15)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_74\ =\ (long\ unsigned\ int)\ _5;\l\
|_75\ =\ self_36(D)-\>output_buffer_raw;\l\
|_77\ =\ (sizetype)\ prephitmp_189;\l\
|_78\ =\ _75\ +\ _77;\l\
|memcpy\ (_78,\ _7,\ n.9_74);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_79\ =\ self_36(D)-\>output_len;\l\
|_80\ =\ _5\ +\ _79;\l\
|self_36(D)-\>output_len\ =\ _80;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
}"];
fn_223_basic_block_34 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:235560079\<bb\ 34\>:\l\
|#\ DEBUG\ size\ =\>\ 6\l\
|#\ DEBUG\ BEGIN_STMT\l\
|MEM\ \<unsigned\ int\>\ [(char\ *)&escaped]\ =\ 808482140;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ size\ =\>\ 6\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ hex\ =\>\ \"0123456789abcdef\"\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_8\ =\ c_37\ \>\>\ 4;\l\
|_9\ =\ (sizetype)\ _8;\l\
|_10\ =\ \"0123456789abcdef\"\ +\ _9;\l\
|_11\ =\ *_10;\l\
|escaped[4]\ =\ _11;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_33\ =\ c_37\ &\ 15;\l\
|_12\ =\ (sizetype)\ _33;\l\
|_13\ =\ \"0123456789abcdef\"\ +\ _12;\l\
|_14\ =\ *_13;\l\
|escaped[5]\ =\ _14;\l\
goto\ \<bb\ 18\>;\ [100.00%]\l\
}"];
fn_223_basic_block_35 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:457263675\<bb\ 35\>:\l\
|#\ DEBUG\ size\ =\>\ 2\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped[0]\ =\ 92;\l\
|escaped[1]\ =\ escape_38;\l\
|MEM\ \<unsigned\ int\>\ [(void\ *)&escaped\ +\ 2B]\ =\ 12336;\l\
|#\ DEBUG\ BEGIN_STMT\l\
goto\ \<bb\ 18\>;\ [100.00%]\l\
}"];
fn_223_basic_block_15 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34400864\<bb\ 15\>:\l\
|pretmp_188\ =\ self_36(D)-\>output_len;\l\
}"];
fn_223_basic_block_18 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:692823754\<bb\ 18\>:\l\
|#\ iftmp.47_165\ =\ PHI\ \<2(35),\ 6(34)\>\l\
|#\ prephitmp_191\ =\ PHI\ \<2(35),\ 6(34)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_36(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ (long\ int)\ iftmp.47_165\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_82\ =\ prephitmp_190\ +\ prephitmp_191;\l\
|#\ DEBUG\ required\ =\>\ required_82\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_83\ =\ self_36(D)-\>max_output_len;\l\
|if\ (required_82\ \>\ _83)\l\
\ \ goto\ \<bb\ 19\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 21\>;\ [90.00%]\l\
}"];
fn_223_basic_block_19 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:69282376\<bb\ 19\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_87\ =\ mp_resize_cold\ (self_36(D),\ required_82);\l\
|if\ (_87\ \<\ 0)\l\
\ \ goto\ \<bb\ 22\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 20\>;\ [99.27%]\l\
}"];
fn_223_basic_block_21 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:692317992\<bb\ 21\>:\l\
|#\ prephitmp_193\ =\ PHI\ \<prephitmp_190(18),\ pretmp_192(20)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_88\ =\ self_36(D)-\>output_buffer_raw;\l\
|_90\ =\ (sizetype)\ prephitmp_193;\l\
|_91\ =\ _88\ +\ _90;\l\
|memcpy\ (_91,\ &escaped,\ iftmp.47_165);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_92\ =\ self_36(D)-\>output_len;\l\
|_93\ =\ _92\ +\ prephitmp_191;\l\
|self_36(D)-\>output_len\ =\ _93;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_199\ =\ ivtmp.750_50\ +\ 1;\l\
|_198\ =\ (long\ int)\ _199;\l\
|#\ DEBUG\ start\ =\>\ _198\l\
goto\ \<bb\ 23\>;\ [100.00%]\l\
}"];
fn_223_basic_block_20 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:68776615\<bb\ 20\>:\l\
|pretmp_192\ =\ self_36(D)-\>output_len;\l\
}"];
}
fn_223_basic_block_0 [shape=Mdiamond,style=filled,fillcolor=white,label="ENTRY"];
fn_223_basic_block_1 [shape=Mdiamond,style=filled,fillcolor=white,label="EXIT"];
fn_223_basic_block_2 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:40268156\<bb\ 2\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ str\ =\>\ obj_35(D)\l\
|#\ DEBUG\ size\ =\>\ &len\l\
|#\ DEBUG\ INLINE_ENTRY\ unicode_str_and_size\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_121\ =\ BIT_FIELD_REF\ \<MEM[(struct\ PyASCIIObject\ *)obj_35(D)],\ 8,\ 256\>;\l\
|_122\ =\ _121\ &\ 96;\l\
|if\ (_122\ ==\ 96)\l\
\ \ goto\ \<bb\ 3\>;\ [35.01%]\l\
else\l\
\ \ goto\ \<bb\ 4\>;\ [64.99%]\l\
}"];
fn_223_basic_block_3 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:14097882\<bb\ 3\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_123\ =\ MEM[(struct\ PyASCIIObject\ *)obj_35(D)].length;\l\
|len\ =\ _123;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_124\ =\ obj_35(D)\ +\ 48;\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _124\l\
|#\ DEBUG\ BEGIN_STMT\l\
goto\ \<bb\ 6\>;\ [100.00%]\l\
}"];
fn_223_basic_block_4 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:26170275\<bb\ 4\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_125\ =\ PyUnicode_AsUTF8AndSize\ (obj_35(D),\ &len);\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _125\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_125\ ==\ 0B)\l\
\ \ goto\ \<bb\ 5\>;\ [0.69%]\l\
else\l\
\ \ goto\ \<bb\ 6\>;\ [99.31%]\l\
}"];
fn_223_basic_block_5 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:258078\<bb\ 5\>:\l\
goto\ \<bb\ 33\>;\ [100.00%]\l\
}"];
fn_223_basic_block_6 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:40086950\<bb\ 6\>:\l\
|#\ _169\ =\ PHI\ \<_125(4),\ _124(3)\>\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _169\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_36(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_53\ =\ self_36(D)-\>output_len;\l\
|required_54\ =\ _53\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_54\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_55\ =\ self_36(D)-\>max_output_len;\l\
|if\ (required_54\ \>\ _55)\l\
\ \ goto\ \<bb\ 7\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 9\>;\ [90.00%]\l\
}"];
fn_223_basic_block_7 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:4008695\<bb\ 7\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_59\ =\ mp_resize_cold\ (self_36(D),\ required_54);\l\
|if\ (_59\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 8\>;\ [99.27%]\l\
}"];
fn_223_basic_block_8 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3979432\<bb\ 8\>:\l\
|pretmp_182\ =\ self_36(D)-\>output_len;\l\
}"];
fn_223_basic_block_9 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:40057686\<bb\ 9\>:\l\
|#\ prephitmp_183\ =\ PHI\ \<_53(6),\ pretmp_182(8)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_61\ =\ self_36(D)-\>output_buffer_raw;\l\
|_63\ =\ (sizetype)\ prephitmp_183;\l\
|_64\ =\ _61\ +\ _63;\l\
|memcpy\ (_64,\ \"\\\"\",\ 1);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_65\ =\ self_36(D)-\>output_len;\l\
|_66\ =\ _65\ +\ 1;\l\
|self_36(D)-\>output_len\ =\ _66;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ i\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|len.49_56\ =\ len;\l\
|if\ (len.49_56\ \>\ 0)\l\
\ \ goto\ \<bb\ 10\>;\ [96.34%]\l\
else\l\
\ \ goto\ \<bb\ 24\>;\ [3.66%]\l\
}"];
fn_223_basic_block_22 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:758734\<bb\ 22\>:\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 33\>;\ [100.00%]\l\
}"];
fn_223_basic_block_24 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:39298952\<bb\ 24\>:\l\
|#\ len.49_57\ =\ PHI\ \<len.49_16(23),\ len.49_56(9)\>\l\
|#\ i_112\ =\ PHI\ \<prephitmp_195(23),\ 0(9)\>\l\
|#\ start_98\ =\ PHI\ \<start_22(23),\ 0(9)\>\l\
|#\ prephitmp_200\ =\ PHI\ \<prephitmp_196(23),\ _66(9)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|pretmp_206\ =\ self_36(D)-\>max_output_len;\l\
|if\ (len.49_57\ !=\ start_98)\l\
\ \ goto\ \<bb\ 25\>;\ [66.00%]\l\
else\l\
\ \ goto\ \<bb\ 29\>;\ [34.00%]\l\
}"];
fn_223_basic_block_25 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:25937308\<bb\ 25\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_18\ =\ i_112\ -\ start_98;\l\
|start.51_19\ =\ (sizetype)\ start_98;\l\
|_20\ =\ _169\ +\ start.51_19;\l\
|#\ DEBUG\ self\ =\>\ self_36(D)\l\
|#\ DEBUG\ s\ =\>\ _20\l\
|#\ DEBUG\ n\ =\>\ _18\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_95\ =\ _18\ +\ prephitmp_200;\l\
|#\ DEBUG\ required\ =\>\ required_95\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (required_95\ \>\ pretmp_206)\l\
\ \ goto\ \<bb\ 26\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 28\>;\ [90.00%]\l\
}"];
fn_223_basic_block_26 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2593731\<bb\ 26\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_100\ =\ mp_resize_cold\ (self_36(D),\ required_95);\l\
|if\ (_100\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 27\>;\ [99.27%]\l\
}"];
fn_223_basic_block_27 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2574797\<bb\ 27\>:\l\
|pretmp_201\ =\ self_36(D)-\>output_len;\l\
}"];
fn_223_basic_block_28 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:25918374\<bb\ 28\>:\l\
|#\ prephitmp_202\ =\ PHI\ \<prephitmp_200(25),\ pretmp_201(27)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_101\ =\ (long\ unsigned\ int)\ _18;\l\
|_102\ =\ self_36(D)-\>output_buffer_raw;\l\
|_104\ =\ (sizetype)\ prephitmp_202;\l\
|_105\ =\ _102\ +\ _104;\l\
|memcpy\ (_105,\ _20,\ n.9_101);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_106\ =\ self_36(D)-\>output_len;\l\
|_107\ =\ _18\ +\ _106;\l\
|self_36(D)-\>output_len\ =\ _107;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
}"];
fn_223_basic_block_29 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:39280018\<bb\ 29\>:\l\
|#\ prephitmp_203\ =\ PHI\ \<prephitmp_200(24),\ _107(28)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_36(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|required_109\ =\ prephitmp_203\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_109\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_110\ =\ self_36(D)-\>max_output_len;\l\
|if\ (required_109\ \>\ _110)\l\
\ \ goto\ \<bb\ 30\>;\ [10.00%]\l\
else\l\
\ \ goto\ \<bb\ 32\>;\ [90.00%]\l\
}"];
fn_223_basic_block_30 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3928002\<bb\ 30\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_114\ =\ mp_resize_cold\ (self_36(D),\ required_109);\l\
|if\ (_114\ \<\ 0)\l\
\ \ goto\ \<bb\ 5\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 31\>;\ [99.27%]\l\
}"];
fn_223_basic_block_31 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3899328\<bb\ 31\>:\l\
|pretmp_204\ =\ self_36(D)-\>output_len;\l\
}"];
fn_223_basic_block_32 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:39251343\<bb\ 32\>:\l\
|#\ prephitmp_205\ =\ PHI\ \<prephitmp_203(29),\ pretmp_204(31)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_115\ =\ self_36(D)-\>output_buffer_raw;\l\
|_117\ =\ (sizetype)\ prephitmp_205;\l\
|_118\ =\ _115\ +\ _117;\l\
|memcpy\ (_118,\ \"\\\"\",\ 1);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_119\ =\ self_36(D)-\>output_len;\l\
|_120\ =\ _119\ +\ 1;\l\
|self_36(D)-\>output_len\ =\ _120;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_223_basic_block_33 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:40268156\<bb\ 33\>:\l\
|#\ _24\ =\ PHI\ \<-1(5),\ 0(32),\ -1(22)\>\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|len\ =\{v\}\ \{CLOBBER\};\l\
|return\ _24;\l\
}"];
fn_223_basic_block_0:s -> fn_223_basic_block_2:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_2:s -> fn_223_basic_block_3:n [style="solid,bold",color=black,weight=10,constraint=true,label="[35%]"];
fn_223_basic_block_2:s -> fn_223_basic_block_4:n [style="solid,bold",color=black,weight=10,constraint=true,label="[64%]"];
fn_223_basic_block_3:s -> fn_223_basic_block_6:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_4:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_4:s -> fn_223_basic_block_6:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_5:s -> fn_223_basic_block_33:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_6:s -> fn_223_basic_block_7:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_6:s -> fn_223_basic_block_9:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_7:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_7:s -> fn_223_basic_block_8:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_8:s -> fn_223_basic_block_9:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_9:s -> fn_223_basic_block_10:n [style="solid,bold",color=black,weight=10,constraint=true,label="[96%]"];
fn_223_basic_block_9:s -> fn_223_basic_block_24:n [style="solid,bold",color=black,weight=10,constraint=true,label="[3%]"];
fn_223_basic_block_10:s -> fn_223_basic_block_11:n [style="solid,bold",color=black,weight=10,constraint=true,label="[33%]"];
fn_223_basic_block_10:s -> fn_223_basic_block_12:n [style="solid,bold",color=black,weight=10,constraint=true,label="[67%]"];
fn_223_basic_block_11:s -> fn_223_basic_block_23:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_12:s -> fn_223_basic_block_13:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_223_basic_block_12:s -> fn_223_basic_block_17:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_223_basic_block_13:s -> fn_223_basic_block_14:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_13:s -> fn_223_basic_block_16:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_14:s -> fn_223_basic_block_22:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_14:s -> fn_223_basic_block_15:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_15:s -> fn_223_basic_block_16:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_16:s -> fn_223_basic_block_17:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_17:s -> fn_223_basic_block_34:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_223_basic_block_17:s -> fn_223_basic_block_35:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_223_basic_block_18:s -> fn_223_basic_block_19:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_18:s -> fn_223_basic_block_21:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_19:s -> fn_223_basic_block_22:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_19:s -> fn_223_basic_block_20:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_20:s -> fn_223_basic_block_21:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_21:s -> fn_223_basic_block_23:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_22:s -> fn_223_basic_block_33:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_23:s -> fn_223_basic_block_10:n [style="dotted,bold",color=blue,weight=10,constraint=false,label="[96%]"];
fn_223_basic_block_23:s -> fn_223_basic_block_24:n [style="solid,bold",color=black,weight=10,constraint=true,label="[3%]"];
fn_223_basic_block_24:s -> fn_223_basic_block_25:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_223_basic_block_24:s -> fn_223_basic_block_29:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_223_basic_block_25:s -> fn_223_basic_block_26:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_25:s -> fn_223_basic_block_28:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_26:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_26:s -> fn_223_basic_block_27:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_27:s -> fn_223_basic_block_28:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_28:s -> fn_223_basic_block_29:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_29:s -> fn_223_basic_block_30:n [style="solid,bold",color=black,weight=10,constraint=true,label="[10%]"];
fn_223_basic_block_29:s -> fn_223_basic_block_32:n [style="solid,bold",color=black,weight=10,constraint=true,label="[90%]"];
fn_223_basic_block_30:s -> fn_223_basic_block_5:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_223_basic_block_30:s -> fn_223_basic_block_31:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_223_basic_block_31:s -> fn_223_basic_block_32:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_32:s -> fn_223_basic_block_33:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_33:s -> fn_223_basic_block_1:n [style="solid,bold",color=black,weight=10,constraint=true,label="[100%]"];
fn_223_basic_block_34:s -> fn_223_basic_block_18:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_35:s -> fn_223_basic_block_18:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_223_basic_block_0:s -> fn_223_basic_block_1:n [style="invis",constraint=true];
}
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
digraph "small.graph" {
overlap=false;
subgraph "cluster_json_encode_str" {
style="dashed";
color="black";
label="json_encode_str ()";
subgraph cluster_220_1 {
style="filled";
color="darkgreen";
fillcolor="grey88";
label="loop 1";
labeljust=l;
penwidth=2;
fn_220_basic_block_68 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1073741862\<bb\ 68\>:\l\
|#\ i_25\ =\ PHI\ \<0(18),\ i_62(67)\>\l\
|#\ start_27\ =\ PHI\ \<0(18),\ start_26(67)\>\l\
|#\ DEBUG\ start\ =\>\ start_27\l\
|#\ DEBUG\ i\ =\>\ i_25\l\
|#\ DEBUG\ BEGIN_STMT\l\
|len.49_19\ =\ len;\l\
|if\ (len.49_19\ \>\ i_25)\l\
\ \ goto\ \<bb\ 19\>;\ [97.25%]\l\
else\l\
\ \ goto\ \<bb\ 69\>;\ [2.75%]\l\
}"];
fn_220_basic_block_19 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1044213958\<bb\ 19\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|i.46_2\ =\ (sizetype)\ i_25;\l\
|_3\ =\ _69\ +\ i.46_2;\l\
|c_44\ =\ *_3;\l\
|#\ DEBUG\ c\ =\>\ c_44\l\
|#\ DEBUG\ BEGIN_STMT\l\
|c.47_4\ =\ (unsigned\ char)\ c_44;\l\
|_5\ =\ (int)\ c.47_4;\l\
|escape_45\ =\ escape_table[_5];\l\
|#\ DEBUG\ escape\ =\>\ escape_45\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (escape_45\ ==\ 0)\l\
\ \ goto\ \<bb\ 20\>;\ [33.00%]\l\
else\l\
\ \ goto\ \<bb\ 21\>;\ [67.00%]\l\
}"];
fn_220_basic_block_20 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:344590604\<bb\ 20\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|//\ predicted\ unlikely\ by\ continue\ predictor.\l\
goto\ \<bb\ 67\>;\ [100.00%]\l\
}"];
fn_220_basic_block_21 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:699623355\<bb\ 21\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (i_25\ \>\ start_27)\l\
\ \ goto\ \<bb\ 22\>;\ [33.00%]\l\
else\l\
\ \ goto\ \<bb\ 35\>;\ [67.00%]\l\
}"];
fn_220_basic_block_67 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:1018799833\<bb\ 67\>:\l\
|#\ start_26\ =\ PHI\ \<start_27(20),\ start_61(66)\>\l\
|#\ DEBUG\ start\ =\>\ start_26\l\
|#\ DEBUG\ BEGIN_STMT\l\
|i_62\ =\ i_25\ +\ 1;\l\
|#\ DEBUG\ i\ =\>\ i_62\l\
}"];
fn_220_basic_block_22 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:230875705\<bb\ 22\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_6\ =\ i_25\ -\ start_27;\l\
|start.48_7\ =\ (sizetype)\ start_27;\l\
|_8\ =\ _69\ +\ start.48_7;\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ s\ =\>\ _8\l\
|#\ DEBUG\ n\ =\>\ _6\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_101\ =\ self_39(D)-\>output_len;\l\
|required_102\ =\ _6\ +\ _101;\l\
|#\ DEBUG\ required\ =\>\ required_102\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_103\ =\ self_39(D)-\>max_output_len;\l\
|if\ (required_102\ \>\ _103)\l\
\ \ goto\ \<bb\ 23\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 33\>;\ [50.00%]\l\
}"];
fn_220_basic_block_35 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:693274272\<bb\ 35\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (escape_45\ ==\ 117)\l\
\ \ goto\ \<bb\ 36\>;\ [34.00%]\l\
else\l\
\ \ goto\ \<bb\ 51\>;\ [66.00%]\l\
}"];
fn_220_basic_block_23 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:115437853\<bb\ 23\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ size\ =\>\ required_102\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_113\ =\ self_39(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _113\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_114\ =\ MEM[(const\ struct\ PyObject\ *)_113].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _114\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_115\ =\ required_102\ *\ 2;\l\
|_116\ =\ MAX_EXPR\ \<_115,\ 8\>;\l\
|self_39(D)-\>max_output_len\ =\ _116;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_114\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 24\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 25\>;\ [70.00%]\l\
}"];
fn_220_basic_block_33 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:230033009\<bb\ 33\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_105\ =\ (long\ unsigned\ int)\ _6;\l\
|_106\ =\ self_39(D)-\>output_buffer_raw;\l\
|_107\ =\ self_39(D)-\>output_len;\l\
|_108\ =\ (sizetype)\ _107;\l\
|_109\ =\ _106\ +\ _108;\l\
|memcpy\ (_109,\ _8,\ n.9_105);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_110\ =\ self_39(D)-\>output_len;\l\
|_111\ =\ _6\ +\ _110;\l\
|self_39(D)-\>output_len\ =\ _111;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_36 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:235713254\<bb\ 36\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ hex\ =\>\ \"0123456789abcdef\"\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped[0]\ =\ 92;\l\
|escaped[1]\ =\ 117;\l\
|escaped[2]\ =\ 48;\l\
|escaped[3]\ =\ 48;\l\
|_10\ =\ c_44\ \>\>\ 4;\l\
|_11\ =\ (sizetype)\ _10;\l\
|_12\ =\ \"0123456789abcdef\"\ +\ _11;\l\
|_13\ =\ *_12;\l\
|escaped[4]\ =\ _13;\l\
|_35\ =\ c_44\ &\ 15;\l\
|_14\ =\ (sizetype)\ _35;\l\
|_15\ =\ \"0123456789abcdef\"\ +\ _14;\l\
|_16\ =\ *_15;\l\
|escaped[5]\ =\ _16;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ 6\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_128\ =\ self_39(D)-\>output_len;\l\
|required_129\ =\ _128\ +\ 6;\l\
|#\ DEBUG\ required\ =\>\ required_129\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_130\ =\ self_39(D)-\>max_output_len;\l\
|if\ (required_129\ \>\ _130)\l\
\ \ goto\ \<bb\ 37\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 47\>;\ [50.00%]\l\
}"];
fn_220_basic_block_51 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:457561017\<bb\ 51\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped[0]\ =\ 92;\l\
|escaped[1]\ =\ escape_45;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ s\ =\>\ &escaped\l\
|#\ DEBUG\ n\ =\>\ 2\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_155\ =\ self_39(D)-\>output_len;\l\
|required_156\ =\ _155\ +\ 2;\l\
|#\ DEBUG\ required\ =\>\ required_156\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_157\ =\ self_39(D)-\>max_output_len;\l\
|if\ (required_156\ \>\ _157)\l\
\ \ goto\ \<bb\ 52\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 62\>;\ [50.00%]\l\
}"];
fn_220_basic_block_24 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34631355\<bb\ 24\>:\l\
|_117\ =\ &self_39(D)-\>output_buffer;\l\
|iftmp.10_118\ =\ _PyBytes_Resize\ (_117,\ _116);\l\
goto\ \<bb\ 26\>;\ [100.00%]\l\
}"];
fn_220_basic_block_25 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:80806497\<bb\ 25\>:\l\
|iftmp.10_119\ =\ PyByteArray_Resize\ (_113,\ _116);\l\
}"];
fn_220_basic_block_34 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:230875705\<bb\ 34\>:\l\
|#\ _112\ =\ PHI\ \<-1(32),\ 0(33)\>\l\
|_295\ =\ _112;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|_9\ =\ _295;\l\
|if\ (_9\ \<\ 0)\l\
\ \ goto\ \<bb\ 96\>;\ [2.75%]\l\
else\l\
\ \ goto\ \<bb\ 35\>;\ [97.25%]\l\
}"];
fn_220_basic_block_37 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:117856627\<bb\ 37\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ size\ =\>\ required_129\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_140\ =\ self_39(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _140\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_141\ =\ MEM[(const\ struct\ PyObject\ *)_140].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _141\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_142\ =\ required_129\ *\ 2;\l\
|_143\ =\ MAX_EXPR\ \<_142,\ 8\>;\l\
|self_39(D)-\>max_output_len\ =\ _143;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_141\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 38\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 39\>;\ [70.00%]\l\
}"];
fn_220_basic_block_47 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:234852901\<bb\ 47\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_132\ =\ 6;\l\
|_133\ =\ self_39(D)-\>output_buffer_raw;\l\
|_134\ =\ self_39(D)-\>output_len;\l\
|_135\ =\ (sizetype)\ _134;\l\
|_136\ =\ _133\ +\ _135;\l\
|memcpy\ (_136,\ &escaped,\ n.9_132);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_137\ =\ self_39(D)-\>output_len;\l\
|_138\ =\ _137\ +\ 6;\l\
|self_39(D)-\>output_len\ =\ _138;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_52 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:228780508\<bb\ 52\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ size\ =\>\ required_156\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_167\ =\ self_39(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _167\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_168\ =\ MEM[(const\ struct\ PyObject\ *)_167].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _168\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_169\ =\ required_156\ *\ 2;\l\
|_170\ =\ MAX_EXPR\ \<_169,\ 8\>;\l\
|self_39(D)-\>max_output_len\ =\ _170;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_168\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 53\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 54\>;\ [70.00%]\l\
}"];
fn_220_basic_block_62 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:455890921\<bb\ 62\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_159\ =\ 2;\l\
|_160\ =\ self_39(D)-\>output_buffer_raw;\l\
|_161\ =\ self_39(D)-\>output_len;\l\
|_162\ =\ (sizetype)\ _161;\l\
|_163\ =\ _160\ +\ _162;\l\
|memcpy\ (_163,\ &escaped,\ n.9_159);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_164\ =\ self_39(D)-\>output_len;\l\
|_165\ =\ _164\ +\ 2;\l\
|self_39(D)-\>output_len\ =\ _165;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_26 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:115437853\<bb\ 26\>:\l\
|#\ iftmp.10_120\ =\ PHI\ \<iftmp.10_118(24),\ iftmp.10_119(25)\>\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_120\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_120\ \<\ 0)\l\
\ \ goto\ \<bb\ 32\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 27\>;\ [99.27%]\l\
}"];
fn_220_basic_block_38 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:35356988\<bb\ 38\>:\l\
|_144\ =\ &self_39(D)-\>output_buffer;\l\
|iftmp.10_145\ =\ _PyBytes_Resize\ (_144,\ _143);\l\
goto\ \<bb\ 40\>;\ [100.00%]\l\
}"];
fn_220_basic_block_39 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:82499640\<bb\ 39\>:\l\
|iftmp.10_146\ =\ PyByteArray_Resize\ (_140,\ _143);\l\
}"];
fn_220_basic_block_48 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:235713254\<bb\ 48\>:\l\
|#\ _139\ =\ PHI\ \<-1(46),\ 0(47)\>\l\
|_313\ =\ _139;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|_17\ =\ _313;\l\
|if\ (_17\ \<\ 0)\l\
\ \ goto\ \<bb\ 49\>;\ [2.75%]\l\
else\l\
\ \ goto\ \<bb\ 50\>;\ [97.25%]\l\
}"];
fn_220_basic_block_53 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:68634151\<bb\ 53\>:\l\
|_171\ =\ &self_39(D)-\>output_buffer;\l\
|iftmp.10_172\ =\ _PyBytes_Resize\ (_171,\ _170);\l\
goto\ \<bb\ 55\>;\ [100.00%]\l\
}"];
fn_220_basic_block_54 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:160146357\<bb\ 54\>:\l\
|iftmp.10_173\ =\ PyByteArray_Resize\ (_167,\ _170);\l\
}"];
fn_220_basic_block_63 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:457561017\<bb\ 63\>:\l\
|#\ _166\ =\ PHI\ \<-1(61),\ 0(62)\>\l\
|_304\ =\ _166;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|_18\ =\ _304;\l\
|if\ (_18\ \<\ 0)\l\
\ \ goto\ \<bb\ 64\>;\ [2.75%]\l\
else\l\
\ \ goto\ \<bb\ 65\>;\ [97.25%]\l\
}"];
fn_220_basic_block_32 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:115437853\<bb\ 32\>:\l\
|#\ _127\ =\ PHI\ \<-1(26),\ iftmp.10_120(28),\ iftmp.10_120(31)\>\l\
|_292\ =\ _127;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|_104\ =\ _292;\l\
|if\ (_104\ \<\ 0)\l\
\ \ goto\ \<bb\ 34\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 33\>;\ [99.27%]\l\
}"];
fn_220_basic_block_27 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:114595157\<bb\ 27\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_114\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 28\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 29\>;\ [70.00%]\l\
}"];
fn_220_basic_block_40 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:117856627\<bb\ 40\>:\l\
|#\ iftmp.10_147\ =\ PHI\ \<iftmp.10_145(38),\ iftmp.10_146(39)\>\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_147\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_147\ \<\ 0)\l\
\ \ goto\ \<bb\ 46\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 41\>;\ [99.27%]\l\
}"];
fn_220_basic_block_50 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:229231139\<bb\ 50\>:\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 66\>;\ [100.00%]\l\
}"];
fn_220_basic_block_55 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:228780508\<bb\ 55\>:\l\
|#\ iftmp.10_174\ =\ PHI\ \<iftmp.10_172(53),\ iftmp.10_173(54)\>\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_174\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_174\ \<\ 0)\l\
\ \ goto\ \<bb\ 61\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 56\>;\ [99.27%]\l\
}"];
fn_220_basic_block_65 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:444978088\<bb\ 65\>:\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
}"];
fn_220_basic_block_28 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:34378546\<bb\ 28\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_121\ =\ self_39(D)-\>output_buffer;\l\
|_122\ =\ &MEM[(struct\ PyBytesObject\ *)_121].ob_sval;\l\
|self_39(D)-\>output_buffer_raw\ =\ _122;\l\
goto\ \<bb\ 32\>;\ [100.00%]\l\
}"];
fn_220_basic_block_29 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:80216610\<bb\ 29\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_123\ =\ self_39(D)-\>output_buffer;\l\
|_124\ =\ MEM[(struct\ PyVarObject\ *)_123].ob_size;\l\
|if\ (_124\ !=\ 0)\l\
\ \ goto\ \<bb\ 30\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 31\>;\ [50.00%]\l\
}"];
fn_220_basic_block_46 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:117856627\<bb\ 46\>:\l\
|#\ _154\ =\ PHI\ \<-1(40),\ iftmp.10_147(42),\ iftmp.10_147(45)\>\l\
|_310\ =\ _154;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|_131\ =\ _310;\l\
|if\ (_131\ \<\ 0)\l\
\ \ goto\ \<bb\ 48\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 47\>;\ [99.27%]\l\
}"];
fn_220_basic_block_41 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:116996274\<bb\ 41\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_141\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 42\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 43\>;\ [70.00%]\l\
}"];
fn_220_basic_block_66 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:674209228\<bb\ 66\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|start_61\ =\ i_25\ +\ 1;\l\
|#\ DEBUG\ start\ =\>\ start_61\l\
}"];
fn_220_basic_block_61 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:228780509\<bb\ 61\>:\l\
|#\ _181\ =\ PHI\ \<-1(55),\ iftmp.10_174(57),\ iftmp.10_174(60)\>\l\
|_301\ =\ _181;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|_158\ =\ _301;\l\
|if\ (_158\ \<\ 0)\l\
\ \ goto\ \<bb\ 63\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 62\>;\ [99.27%]\l\
}"];
fn_220_basic_block_56 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:227110411\<bb\ 56\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_168\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 57\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 58\>;\ [70.00%]\l\
}"];
fn_220_basic_block_30 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:40108305\<bb\ 30\>:\l\
|iftmp.11_125\ =\ MEM[(struct\ PyByteArrayObject\ *)_123].ob_start;\l\
}"];
fn_220_basic_block_31 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:80216610\<bb\ 31\>:\l\
|#\ iftmp.11_126\ =\ PHI\ \<&_PyByteArray_empty_string(29),\ iftmp.11_125(30)\>\l\
|self_39(D)-\>output_buffer_raw\ =\ iftmp.11_126;\l\
}"];
fn_220_basic_block_42 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:35098882\<bb\ 42\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_148\ =\ self_39(D)-\>output_buffer;\l\
|_149\ =\ &MEM[(struct\ PyBytesObject\ *)_148].ob_sval;\l\
|self_39(D)-\>output_buffer_raw\ =\ _149;\l\
goto\ \<bb\ 46\>;\ [100.00%]\l\
}"];
fn_220_basic_block_43 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:81897392\<bb\ 43\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_150\ =\ self_39(D)-\>output_buffer;\l\
|_151\ =\ MEM[(struct\ PyVarObject\ *)_150].ob_size;\l\
|if\ (_151\ !=\ 0)\l\
\ \ goto\ \<bb\ 44\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 45\>;\ [50.00%]\l\
}"];
fn_220_basic_block_57 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:68133122\<bb\ 57\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_175\ =\ self_39(D)-\>output_buffer;\l\
|_176\ =\ &MEM[(struct\ PyBytesObject\ *)_175].ob_sval;\l\
|self_39(D)-\>output_buffer_raw\ =\ _176;\l\
goto\ \<bb\ 61\>;\ [100.00%]\l\
}"];
fn_220_basic_block_58 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:158977289\<bb\ 58\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_177\ =\ self_39(D)-\>output_buffer;\l\
|_178\ =\ MEM[(struct\ PyVarObject\ *)_177].ob_size;\l\
|if\ (_178\ !=\ 0)\l\
\ \ goto\ \<bb\ 59\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 60\>;\ [50.00%]\l\
}"];
fn_220_basic_block_44 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:40948696\<bb\ 44\>:\l\
|iftmp.11_152\ =\ MEM[(struct\ PyByteArrayObject\ *)_150].ob_start;\l\
}"];
fn_220_basic_block_45 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:81897392\<bb\ 45\>:\l\
|#\ iftmp.11_153\ =\ PHI\ \<&_PyByteArray_empty_string(43),\ iftmp.11_152(44)\>\l\
|self_39(D)-\>output_buffer_raw\ =\ iftmp.11_153;\l\
}"];
fn_220_basic_block_59 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:79488645\<bb\ 59\>:\l\
|iftmp.11_179\ =\ MEM[(struct\ PyByteArrayObject\ *)_177].ob_start;\l\
}"];
fn_220_basic_block_60 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:158977289\<bb\ 60\>:\l\
|#\ iftmp.11_180\ =\ PHI\ \<&_PyByteArray_empty_string(58),\ iftmp.11_179(59)\>\l\
|self_39(D)-\>output_buffer_raw\ =\ iftmp.11_180;\l\
}"];
}
fn_220_basic_block_0 [shape=Mdiamond,style=filled,fillcolor=white,label="ENTRY"];
fn_220_basic_block_1 [shape=Mdiamond,style=filled,fillcolor=white,label="EXIT"];
fn_220_basic_block_2 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:55854330\<bb\ 2\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ start\ =\>\ 0\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ str\ =\>\ obj_37(D)\l\
|#\ DEBUG\ size\ =\>\ &len\l\
|#\ DEBUG\ INLINE_ENTRY\ unicode_str_and_size\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_64\ =\ BIT_FIELD_REF\ \<MEM[(struct\ PyASCIIObject\ *)obj_37(D)],\ 8,\ 256\>;\l\
|_65\ =\ _64\ &\ 96;\l\
|if\ (_65\ ==\ 96)\l\
\ \ goto\ \<bb\ 3\>;\ [35.01%]\l\
else\l\
\ \ goto\ \<bb\ 4\>;\ [64.99%]\l\
}"];
fn_220_basic_block_3 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19554601\<bb\ 3\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_66\ =\ MEM[(struct\ PyASCIIObject\ *)obj_37(D)].length;\l\
|len\ =\ _66;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_67\ =\ obj_37(D)\ +\ 48;\l\
goto\ \<bb\ 5\>;\ [100.00%]\l\
}"];
fn_220_basic_block_4 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:36299729\<bb\ 4\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_68\ =\ PyUnicode_AsUTF8AndSize\ (obj_37(D),\ &len);\l\
}"];
fn_220_basic_block_5 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:55854330\<bb\ 5\>:\l\
|#\ _69\ =\ PHI\ \<_67(3),\ _68(4)\>\l\
|#\ DEBUG\ str\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|#\ DEBUG\ buf\ =\>\ _69\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_69\ ==\ 0B)\l\
\ \ goto\ \<bb\ 96\>;\ [0.91%]\l\
else\l\
\ \ goto\ \<bb\ 6\>;\ [99.09%]\l\
}"];
fn_220_basic_block_6 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:55346056\<bb\ 6\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_74\ =\ self_39(D)-\>output_len;\l\
|required_75\ =\ _74\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_75\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_76\ =\ self_39(D)-\>max_output_len;\l\
|if\ (required_75\ \>\ _76)\l\
\ \ goto\ \<bb\ 7\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 17\>;\ [50.00%]\l\
}"];
fn_220_basic_block_7 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:27673028\<bb\ 7\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ size\ =\>\ required_75\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_86\ =\ self_39(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _86\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_87\ =\ MEM[(const\ struct\ PyObject\ *)_86].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _87\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_88\ =\ required_75\ *\ 2;\l\
|_89\ =\ MAX_EXPR\ \<_88,\ 8\>;\l\
|self_39(D)-\>max_output_len\ =\ _89;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_87\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 8\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 9\>;\ [70.00%]\l\
}"];
fn_220_basic_block_8 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:8301908\<bb\ 8\>:\l\
|_90\ =\ &self_39(D)-\>output_buffer;\l\
|iftmp.10_91\ =\ _PyBytes_Resize\ (_90,\ _89);\l\
goto\ \<bb\ 10\>;\ [100.00%]\l\
}"];
fn_220_basic_block_9 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19371120\<bb\ 9\>:\l\
|iftmp.10_92\ =\ PyByteArray_Resize\ (_86,\ _89);\l\
}"];
fn_220_basic_block_10 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:27673028\<bb\ 10\>:\l\
|#\ iftmp.10_93\ =\ PHI\ \<iftmp.10_91(8),\ iftmp.10_92(9)\>\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_93\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_93\ \<\ 0)\l\
\ \ goto\ \<bb\ 16\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 11\>;\ [99.27%]\l\
}"];
fn_220_basic_block_11 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:27471015\<bb\ 11\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_87\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 12\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 13\>;\ [70.00%]\l\
}"];
fn_220_basic_block_12 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:8241304\<bb\ 12\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_94\ =\ self_39(D)-\>output_buffer;\l\
|_95\ =\ &MEM[(struct\ PyBytesObject\ *)_94].ob_sval;\l\
|self_39(D)-\>output_buffer_raw\ =\ _95;\l\
goto\ \<bb\ 16\>;\ [100.00%]\l\
}"];
fn_220_basic_block_13 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19229711\<bb\ 13\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_96\ =\ self_39(D)-\>output_buffer;\l\
|_97\ =\ MEM[(struct\ PyVarObject\ *)_96].ob_size;\l\
|if\ (_97\ !=\ 0)\l\
\ \ goto\ \<bb\ 14\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 15\>;\ [50.00%]\l\
}"];
fn_220_basic_block_14 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:9614855\<bb\ 14\>:\l\
|iftmp.11_98\ =\ MEM[(struct\ PyByteArrayObject\ *)_96].ob_start;\l\
}"];
fn_220_basic_block_15 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19229711\<bb\ 15\>:\l\
|#\ iftmp.11_99\ =\ PHI\ \<&_PyByteArray_empty_string(13),\ iftmp.11_98(14)\>\l\
|self_39(D)-\>output_buffer_raw\ =\ iftmp.11_99;\l\
}"];
fn_220_basic_block_16 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:27673028\<bb\ 16\>:\l\
|#\ _100\ =\ PHI\ \<-1(10),\ iftmp.10_93(12),\ iftmp.10_93(15)\>\l\
|_265\ =\ _100;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|_77\ =\ _265;\l\
|if\ (_77\ \<\ 0)\l\
\ \ goto\ \<bb\ 18\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 17\>;\ [99.27%]\l\
}"];
fn_220_basic_block_17 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:55144043\<bb\ 17\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_78\ =\ 1;\l\
|_79\ =\ self_39(D)-\>output_buffer_raw;\l\
|_80\ =\ self_39(D)-\>output_len;\l\
|_81\ =\ (sizetype)\ _80;\l\
|_82\ =\ _79\ +\ _81;\l\
|memcpy\ (_82,\ \"\\\"\",\ n.9_78);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_83\ =\ self_39(D)-\>output_len;\l\
|_84\ =\ _83\ +\ 1;\l\
|self_39(D)-\>output_len\ =\ _84;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_18 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:55346056\<bb\ 18\>:\l\
|#\ _85\ =\ PHI\ \<-1(16),\ 0(17)\>\l\
|_268\ =\ _85;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|_1\ =\ _268;\l\
|if\ (_1\ \<\ 0)\l\
\ \ goto\ \<bb\ 96\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 68\>;\ [99.27%]\l\
}"];
fn_220_basic_block_49 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:6482115\<bb\ 49\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 96\>;\ [100.00%]\l\
}"];
fn_220_basic_block_64 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:12582929\<bb\ 64\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|escaped\ =\{v\}\ \{CLOBBER\};\l\
goto\ \<bb\ 96\>;\ [100.00%]\l\
}"];
fn_220_basic_block_69 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29527905\<bb\ 69\>:\l\
|#\ len.49_20\ =\ PHI\ \<len.49_19(68)\>\l\
|#\ i_73\ =\ PHI\ \<i_25(68)\>\l\
|#\ start_38\ =\ PHI\ \<start_27(68)\>\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (len.49_20\ !=\ start_38)\l\
\ \ goto\ \<bb\ 70\>;\ [66.00%]\l\
else\l\
\ \ goto\ \<bb\ 83\>;\ [34.00%]\l\
}"];
fn_220_basic_block_70 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19488418\<bb\ 70\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_21\ =\ i_73\ -\ start_38;\l\
|start.51_22\ =\ (sizetype)\ start_38;\l\
|_23\ =\ _69\ +\ start.51_22;\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ s\ =\>\ _23\l\
|#\ DEBUG\ n\ =\>\ _21\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_182\ =\ self_39(D)-\>output_len;\l\
|required_183\ =\ _21\ +\ _182;\l\
|#\ DEBUG\ required\ =\>\ required_183\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_184\ =\ self_39(D)-\>max_output_len;\l\
|if\ (required_183\ \>\ _184)\l\
\ \ goto\ \<bb\ 71\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 81\>;\ [50.00%]\l\
}"];
fn_220_basic_block_71 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:9744208\<bb\ 71\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ size\ =\>\ required_183\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_194\ =\ self_39(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _194\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_195\ =\ MEM[(const\ struct\ PyObject\ *)_194].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _195\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_196\ =\ required_183\ *\ 2;\l\
|_197\ =\ MAX_EXPR\ \<_196,\ 8\>;\l\
|self_39(D)-\>max_output_len\ =\ _197;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_195\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 72\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 73\>;\ [70.00%]\l\
}"];
fn_220_basic_block_72 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2923262\<bb\ 72\>:\l\
|_198\ =\ &self_39(D)-\>output_buffer;\l\
|iftmp.10_199\ =\ _PyBytes_Resize\ (_198,\ _197);\l\
goto\ \<bb\ 74\>;\ [100.00%]\l\
}"];
fn_220_basic_block_73 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:6820946\<bb\ 73\>:\l\
|iftmp.10_200\ =\ PyByteArray_Resize\ (_194,\ _197);\l\
}"];
fn_220_basic_block_74 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:9744208\<bb\ 74\>:\l\
|#\ iftmp.10_201\ =\ PHI\ \<iftmp.10_199(72),\ iftmp.10_200(73)\>\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_201\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_201\ \<\ 0)\l\
\ \ goto\ \<bb\ 80\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 75\>;\ [99.27%]\l\
}"];
fn_220_basic_block_75 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:9673076\<bb\ 75\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_195\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 76\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 77\>;\ [70.00%]\l\
}"];
fn_220_basic_block_76 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:2901923\<bb\ 76\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_202\ =\ self_39(D)-\>output_buffer;\l\
|_203\ =\ &MEM[(struct\ PyBytesObject\ *)_202].ob_sval;\l\
|self_39(D)-\>output_buffer_raw\ =\ _203;\l\
goto\ \<bb\ 80\>;\ [100.00%]\l\
}"];
fn_220_basic_block_77 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:6771153\<bb\ 77\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_204\ =\ self_39(D)-\>output_buffer;\l\
|_205\ =\ MEM[(struct\ PyVarObject\ *)_204].ob_size;\l\
|if\ (_205\ !=\ 0)\l\
\ \ goto\ \<bb\ 78\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 79\>;\ [50.00%]\l\
}"];
fn_220_basic_block_78 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:3385576\<bb\ 78\>:\l\
|iftmp.11_206\ =\ MEM[(struct\ PyByteArrayObject\ *)_204].ob_start;\l\
}"];
fn_220_basic_block_79 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:6771153\<bb\ 79\>:\l\
|#\ iftmp.11_207\ =\ PHI\ \<&_PyByteArray_empty_string(77),\ iftmp.11_206(78)\>\l\
|self_39(D)-\>output_buffer_raw\ =\ iftmp.11_207;\l\
}"];
fn_220_basic_block_80 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:9744208\<bb\ 80\>:\l\
|#\ _208\ =\ PHI\ \<-1(74),\ iftmp.10_201(76),\ iftmp.10_201(79)\>\l\
|_274\ =\ _208;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|_185\ =\ _274;\l\
|if\ (_185\ \<\ 0)\l\
\ \ goto\ \<bb\ 82\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 81\>;\ [99.27%]\l\
}"];
fn_220_basic_block_81 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19417285\<bb\ 81\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_186\ =\ (long\ unsigned\ int)\ _21;\l\
|_187\ =\ self_39(D)-\>output_buffer_raw;\l\
|_188\ =\ self_39(D)-\>output_len;\l\
|_189\ =\ (sizetype)\ _188;\l\
|_190\ =\ _187\ +\ _189;\l\
|memcpy\ (_190,\ _23,\ n.9_186);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_191\ =\ self_39(D)-\>output_len;\l\
|_192\ =\ _21\ +\ _191;\l\
|self_39(D)-\>output_len\ =\ _192;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_82 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:19488418\<bb\ 82\>:\l\
|#\ _193\ =\ PHI\ \<-1(80),\ 0(81)\>\l\
|_277\ =\ _193;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|_24\ =\ _277;\l\
|if\ (_24\ \<\ 0)\l\
\ \ goto\ \<bb\ 96\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 83\>;\ [99.27%]\l\
}"];
fn_220_basic_block_83 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29385640\<bb\ 83\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ s\ =\>\ \"\\\"\"\l\
|#\ DEBUG\ n\ =\>\ 1\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_write\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_209\ =\ self_39(D)-\>output_len;\l\
|required_210\ =\ _209\ +\ 1;\l\
|#\ DEBUG\ required\ =\>\ required_210\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_211\ =\ self_39(D)-\>max_output_len;\l\
|if\ (required_210\ \>\ _211)\l\
\ \ goto\ \<bb\ 84\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 94\>;\ [50.00%]\l\
}"];
fn_220_basic_block_84 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:14692820\<bb\ 84\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ self\ =\>\ self_39(D)\l\
|#\ DEBUG\ size\ =\>\ required_210\l\
|#\ DEBUG\ INLINE_ENTRY\ mp_resize\l\
|#\ DEBUG\ BEGIN_STMT\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_221\ =\ self_39(D)-\>output_buffer;\l\
|#\ DEBUG\ ob\ =\>\ _221\l\
|#\ DEBUG\ type\ =\>\ &PyBytes_Type\l\
|#\ DEBUG\ INLINE_ENTRY\ _Py_IS_TYPE\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_222\ =\ MEM[(const\ struct\ PyObject\ *)_221].ob_type;\l\
|#\ DEBUG\ ob\ =\>\ NULL\l\
|#\ DEBUG\ type\ =\>\ NULL\l\
|#\ DEBUG\ is_bytes\ =\>\ _222\ ==\ &PyBytes_Type\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_223\ =\ required_210\ *\ 2;\l\
|_224\ =\ MAX_EXPR\ \<_223,\ 8\>;\l\
|self_39(D)-\>max_output_len\ =\ _224;\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_222\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 85\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 86\>;\ [70.00%]\l\
}"];
fn_220_basic_block_85 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:4407846\<bb\ 85\>:\l\
|_225\ =\ &self_39(D)-\>output_buffer;\l\
|iftmp.10_226\ =\ _PyBytes_Resize\ (_225,\ _224);\l\
goto\ \<bb\ 87\>;\ [100.00%]\l\
}"];
fn_220_basic_block_86 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10284974\<bb\ 86\>:\l\
|iftmp.10_227\ =\ PyByteArray_Resize\ (_221,\ _224);\l\
}"];
fn_220_basic_block_87 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:14692820\<bb\ 87\>:\l\
|#\ iftmp.10_228\ =\ PHI\ \<iftmp.10_226(85),\ iftmp.10_227(86)\>\l\
|#\ DEBUG\ status\ =\>\ iftmp.10_228\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (iftmp.10_228\ \<\ 0)\l\
\ \ goto\ \<bb\ 93\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 88\>;\ [99.27%]\l\
}"];
fn_220_basic_block_88 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:14585563\<bb\ 88\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|if\ (_222\ ==\ &PyBytes_Type)\l\
\ \ goto\ \<bb\ 89\>;\ [30.00%]\l\
else\l\
\ \ goto\ \<bb\ 90\>;\ [70.00%]\l\
}"];
fn_220_basic_block_89 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:4375668\<bb\ 89\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_229\ =\ self_39(D)-\>output_buffer;\l\
|_230\ =\ &MEM[(struct\ PyBytesObject\ *)_229].ob_sval;\l\
|self_39(D)-\>output_buffer_raw\ =\ _230;\l\
goto\ \<bb\ 93\>;\ [100.00%]\l\
}"];
fn_220_basic_block_90 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10209893\<bb\ 90\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_231\ =\ self_39(D)-\>output_buffer;\l\
|_232\ =\ MEM[(struct\ PyVarObject\ *)_231].ob_size;\l\
|if\ (_232\ !=\ 0)\l\
\ \ goto\ \<bb\ 91\>;\ [50.00%]\l\
else\l\
\ \ goto\ \<bb\ 92\>;\ [50.00%]\l\
}"];
fn_220_basic_block_91 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:5104947\<bb\ 91\>:\l\
|iftmp.11_233\ =\ MEM[(struct\ PyByteArrayObject\ *)_231].ob_start;\l\
}"];
fn_220_basic_block_92 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:10209893\<bb\ 92\>:\l\
|#\ iftmp.11_234\ =\ PHI\ \<&_PyByteArray_empty_string(90),\ iftmp.11_233(91)\>\l\
|self_39(D)-\>output_buffer_raw\ =\ iftmp.11_234;\l\
}"];
fn_220_basic_block_93 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:14692820\<bb\ 93\>:\l\
|#\ _235\ =\ PHI\ \<-1(87),\ iftmp.10_228(89),\ iftmp.10_228(92)\>\l\
|_283\ =\ _235;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ size\ =\>\ NULL\l\
|_212\ =\ _283;\l\
|if\ (_212\ \<\ 0)\l\
\ \ goto\ \<bb\ 95\>;\ [0.73%]\l\
else\l\
\ \ goto\ \<bb\ 94\>;\ [99.27%]\l\
}"];
fn_220_basic_block_94 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29278382\<bb\ 94\>:\l\
|#\ DEBUG\ BEGIN_STMT\l\
|n.9_213\ =\ 1;\l\
|_214\ =\ self_39(D)-\>output_buffer_raw;\l\
|_215\ =\ self_39(D)-\>output_len;\l\
|_216\ =\ (sizetype)\ _215;\l\
|_217\ =\ _214\ +\ _216;\l\
|memcpy\ (_217,\ \"\\\"\",\ n.9_213);\l\
|#\ DEBUG\ BEGIN_STMT\l\
|_218\ =\ self_39(D)-\>output_len;\l\
|_219\ =\ _218\ +\ 1;\l\
|self_39(D)-\>output_len\ =\ _219;\l\
|#\ DEBUG\ BEGIN_STMT\l\
}"];
fn_220_basic_block_95 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:29385640\<bb\ 95\>:\l\
|#\ _220\ =\ PHI\ \<-1(93),\ 0(94)\>\l\
|_286\ =\ _220;\l\
|#\ DEBUG\ self\ =\>\ NULL\l\
|#\ DEBUG\ s\ =\>\ NULL\l\
|#\ DEBUG\ n\ =\>\ NULL\l\
|#\ DEBUG\ required\ =\>\ NULL\l\
|_43\ =\ _286;\l\
}"];
fn_220_basic_block_96 [shape=record,style=filled,fillcolor=lightgrey,label="{COUNT:55854333\<bb\ 96\>:\l\
|#\ _28\ =\ PHI\ \<-1(5),\ -1(18),\ -1(34),\ -1(49),\ -1(64),\ -1(82),\ _43(95)\>\l\
|len\ =\{v\}\ \{CLOBBER\};\l\
|return\ _28;\l\
}"];
fn_220_basic_block_0:s -> fn_220_basic_block_2:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_2:s -> fn_220_basic_block_3:n [style="solid,bold",color=black,weight=10,constraint=true,label="[35%]"];
fn_220_basic_block_2:s -> fn_220_basic_block_4:n [style="solid,bold",color=black,weight=10,constraint=true,label="[64%]"];
fn_220_basic_block_3:s -> fn_220_basic_block_5:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_4:s -> fn_220_basic_block_5:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_5:s -> fn_220_basic_block_96:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_5:s -> fn_220_basic_block_6:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_6:s -> fn_220_basic_block_7:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_6:s -> fn_220_basic_block_17:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_7:s -> fn_220_basic_block_8:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_7:s -> fn_220_basic_block_9:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_8:s -> fn_220_basic_block_10:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_9:s -> fn_220_basic_block_10:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_10:s -> fn_220_basic_block_16:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_10:s -> fn_220_basic_block_11:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_11:s -> fn_220_basic_block_12:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_11:s -> fn_220_basic_block_13:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_12:s -> fn_220_basic_block_16:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_13:s -> fn_220_basic_block_14:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_13:s -> fn_220_basic_block_15:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_14:s -> fn_220_basic_block_15:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_15:s -> fn_220_basic_block_16:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_16:s -> fn_220_basic_block_18:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_16:s -> fn_220_basic_block_17:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_17:s -> fn_220_basic_block_18:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_18:s -> fn_220_basic_block_96:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_18:s -> fn_220_basic_block_68:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_19:s -> fn_220_basic_block_20:n [style="solid,bold",color=black,weight=10,constraint=true,label="[33%]"];
fn_220_basic_block_19:s -> fn_220_basic_block_21:n [style="solid,bold",color=black,weight=10,constraint=true,label="[67%]"];
fn_220_basic_block_20:s -> fn_220_basic_block_67:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_21:s -> fn_220_basic_block_22:n [style="solid,bold",color=black,weight=10,constraint=true,label="[33%]"];
fn_220_basic_block_21:s -> fn_220_basic_block_35:n [style="solid,bold",color=black,weight=10,constraint=true,label="[67%]"];
fn_220_basic_block_22:s -> fn_220_basic_block_23:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_22:s -> fn_220_basic_block_33:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_23:s -> fn_220_basic_block_24:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_23:s -> fn_220_basic_block_25:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_24:s -> fn_220_basic_block_26:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_25:s -> fn_220_basic_block_26:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_26:s -> fn_220_basic_block_32:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_26:s -> fn_220_basic_block_27:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_27:s -> fn_220_basic_block_28:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_27:s -> fn_220_basic_block_29:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_28:s -> fn_220_basic_block_32:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_29:s -> fn_220_basic_block_30:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_29:s -> fn_220_basic_block_31:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_30:s -> fn_220_basic_block_31:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_31:s -> fn_220_basic_block_32:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_32:s -> fn_220_basic_block_34:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_32:s -> fn_220_basic_block_33:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_33:s -> fn_220_basic_block_34:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_34:s -> fn_220_basic_block_96:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_220_basic_block_34:s -> fn_220_basic_block_35:n [style="solid,bold",color=black,weight=10,constraint=true,label="[97%]"];
fn_220_basic_block_35:s -> fn_220_basic_block_36:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_220_basic_block_35:s -> fn_220_basic_block_51:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_220_basic_block_36:s -> fn_220_basic_block_37:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_36:s -> fn_220_basic_block_47:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_37:s -> fn_220_basic_block_38:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_37:s -> fn_220_basic_block_39:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_38:s -> fn_220_basic_block_40:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_39:s -> fn_220_basic_block_40:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_40:s -> fn_220_basic_block_46:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_40:s -> fn_220_basic_block_41:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_41:s -> fn_220_basic_block_42:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_41:s -> fn_220_basic_block_43:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_42:s -> fn_220_basic_block_46:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_43:s -> fn_220_basic_block_44:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_43:s -> fn_220_basic_block_45:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_44:s -> fn_220_basic_block_45:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_45:s -> fn_220_basic_block_46:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_46:s -> fn_220_basic_block_48:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_46:s -> fn_220_basic_block_47:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_47:s -> fn_220_basic_block_48:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_48:s -> fn_220_basic_block_49:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_220_basic_block_48:s -> fn_220_basic_block_50:n [style="solid,bold",color=black,weight=10,constraint=true,label="[97%]"];
fn_220_basic_block_49:s -> fn_220_basic_block_96:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_50:s -> fn_220_basic_block_66:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_51:s -> fn_220_basic_block_52:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_51:s -> fn_220_basic_block_62:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_52:s -> fn_220_basic_block_53:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_52:s -> fn_220_basic_block_54:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_53:s -> fn_220_basic_block_55:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_54:s -> fn_220_basic_block_55:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_55:s -> fn_220_basic_block_61:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_55:s -> fn_220_basic_block_56:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_56:s -> fn_220_basic_block_57:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_56:s -> fn_220_basic_block_58:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_57:s -> fn_220_basic_block_61:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_58:s -> fn_220_basic_block_59:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_58:s -> fn_220_basic_block_60:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_59:s -> fn_220_basic_block_60:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_60:s -> fn_220_basic_block_61:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_61:s -> fn_220_basic_block_63:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_61:s -> fn_220_basic_block_62:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_62:s -> fn_220_basic_block_63:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_63:s -> fn_220_basic_block_64:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_220_basic_block_63:s -> fn_220_basic_block_65:n [style="solid,bold",color=black,weight=10,constraint=true,label="[97%]"];
fn_220_basic_block_64:s -> fn_220_basic_block_96:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_65:s -> fn_220_basic_block_66:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_66:s -> fn_220_basic_block_67:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_67:s -> fn_220_basic_block_68:n [style="dotted,bold",color=blue,weight=10,constraint=false,label="[100%]"];
fn_220_basic_block_68:s -> fn_220_basic_block_19:n [style="solid,bold",color=black,weight=10,constraint=true,label="[97%]"];
fn_220_basic_block_68:s -> fn_220_basic_block_69:n [style="solid,bold",color=black,weight=10,constraint=true,label="[2%]"];
fn_220_basic_block_69:s -> fn_220_basic_block_70:n [style="solid,bold",color=black,weight=10,constraint=true,label="[66%]"];
fn_220_basic_block_69:s -> fn_220_basic_block_83:n [style="solid,bold",color=black,weight=10,constraint=true,label="[34%]"];
fn_220_basic_block_70:s -> fn_220_basic_block_71:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_70:s -> fn_220_basic_block_81:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_71:s -> fn_220_basic_block_72:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_71:s -> fn_220_basic_block_73:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_72:s -> fn_220_basic_block_74:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_73:s -> fn_220_basic_block_74:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_74:s -> fn_220_basic_block_80:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_74:s -> fn_220_basic_block_75:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_75:s -> fn_220_basic_block_76:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_75:s -> fn_220_basic_block_77:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_76:s -> fn_220_basic_block_80:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_77:s -> fn_220_basic_block_78:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_77:s -> fn_220_basic_block_79:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_78:s -> fn_220_basic_block_79:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_79:s -> fn_220_basic_block_80:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_80:s -> fn_220_basic_block_82:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_80:s -> fn_220_basic_block_81:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_81:s -> fn_220_basic_block_82:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_82:s -> fn_220_basic_block_96:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_82:s -> fn_220_basic_block_83:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_83:s -> fn_220_basic_block_84:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_83:s -> fn_220_basic_block_94:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_84:s -> fn_220_basic_block_85:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_84:s -> fn_220_basic_block_86:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_85:s -> fn_220_basic_block_87:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_86:s -> fn_220_basic_block_87:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_87:s -> fn_220_basic_block_93:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_87:s -> fn_220_basic_block_88:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_88:s -> fn_220_basic_block_89:n [style="solid,bold",color=black,weight=10,constraint=true,label="[30%]"];
fn_220_basic_block_88:s -> fn_220_basic_block_90:n [style="solid,bold",color=black,weight=10,constraint=true,label="[70%]"];
fn_220_basic_block_89:s -> fn_220_basic_block_93:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_90:s -> fn_220_basic_block_91:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_90:s -> fn_220_basic_block_92:n [style="solid,bold",color=black,weight=10,constraint=true,label="[50%]"];
fn_220_basic_block_91:s -> fn_220_basic_block_92:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_92:s -> fn_220_basic_block_93:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_93:s -> fn_220_basic_block_95:n [style="solid,bold",color=black,weight=10,constraint=true,label="[0%]"];
fn_220_basic_block_93:s -> fn_220_basic_block_94:n [style="solid,bold",color=black,weight=10,constraint=true,label="[99%]"];
fn_220_basic_block_94:s -> fn_220_basic_block_95:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_95:s -> fn_220_basic_block_96:n [style="solid,bold",color=blue,weight=100,constraint=true,label="[100%]"];
fn_220_basic_block_96:s -> fn_220_basic_block_1:n [style="solid,bold",color=black,weight=10,constraint=true,label="[100%]"];
fn_220_basic_block_0:s -> fn_220_basic_block_1:n [style="invis",constraint=true];
}
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@llllllllll
Copy link
Author

Regarding the compiler flags: I usually have set the flags explicitly. The default is "whatever your CPython is compiled with", which might not be optimal for your program. -fno-plt changes how this library will resolve calls to function in other shared objects (CPython), usually making them more efficient. Your library isn't bottlenecked on lots of calls to small functions, so I wouldn't expect to see a huge improvement. As for noise in your tests: make sure you've disabled frequency scaling and try to kill any expensive programs that might be taking up a lot of resources, or may take up resources at a random time. The $ sudo cpupower frequency-set -g performance command is what I use to make sure that my CPU isnot downclocking to save electricity. I also usually watch htop while running benchmarks to make sure that some systemd timer hasn't fired and done some expensive task while I am trying to benchmark things. Even still, I run many runs just to smooth all of this out.

Understanding perf output on a line-by-line basis is not always easy. For gcc, perf reported that the most stalls and the most cycles were spent on if (escape == 0) continue. However, there isn't really anything to optimize there. I thought about some simd lookup table stuff, and other tricks to maybe speed up the escaped lookup, but they didn't really help. Modern CPUs are incredibly complicated and it makes it hard to attribute performance to a single line or even instruction without thinking deeply about the whole execution pipeline. If you are targeting a single architecture it might be worth doing that analysis, but for a library like this it is almost always better to just look at the function as a whole.

I can't find any good resources right now, but I will keep looking and let you know if I find something. I do know that playing around with gcc jit (https://gcc.gnu.org/onlinedocs/jit/) helped me understand a bit about how GCC thinks about program structure. The form shown is the basic block control graph. At this stage, the code will be in SSA (Static Single Assignment https://gcc.gnu.org/onlinedocs/gccint/SSA.html) form. This means that variables always hold a single value (with some rules for passing values between blocks for things like loops). You will also see a bunch of tmp variables because all of the expressions are decomposed in this form. Basic blocks always end by jumping to another block, or returning. They can also conditionally jump as most of these blocks do, but inside a block there is no branching or complex control flow. GCC also implements most control flow as gotos at this point, so you will see something like:

if (a) {
    b;
}
c;

turn into something like:

if (a) {
    goto label_0;
}
else {
    goto label_1;
}
label_0:
b;
goto label_1;
label1:
c;
return;

This is really verbose, but also simple because it means there is only 1 kind of jump to think about. The main insights I get from this representation are:

  • how many branches do we have and what is the basic program structure (after inlining and optimizations which can look very different from the source)
  • how are things being inlined and optimized after inlining
  • what's gcc's guess on the likelihood of various conditions

generally, it's good to aim to minimize the branches because that gives the compiler more room to optimize and also generally is better for the actual processor.

This was fun to look at, and the code looks very good. Happy to chat more about this any time.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment