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.
@jcrist
Copy link

jcrist commented Jul 22, 2021

Thanks for this excellent writeup! I definitely learned a few things here.

A few questions:

  • Your compiler flags differed from mine, with the addition of -O3 -fno-plt -fno-semantic-interposition -march=x86-64 -mtune=generic. I found that of these, the only one that made any difference (on my hardware) was -fno-plt, which resulted in a measurable speedup on all compilers tested. After reading a bit about this flag, I'm not sure if I should enable it or not? My understanding is it has something to do with how functions in dynamic libraries are called by the code being compiled? (edit: I no longer can reproduce this flag having any affect on benchmarks. May have been measurement error before, or some other change has negated it 🤷)
  • I noticed you only used perf to find hot functions, but not to analyze line-by-line the contents of any specific function. Over the weekend I spent a bit of time trying to use perf report to annotate different versions of the same function to try and gain some insights, and found the line annotations less useful than I would have hoped (though this is likely due to my lack of experience). Do you ever use perf to look at costs within a function, or only to hone in on which functions are hot spots?
  • Google doesn't turn up many resources for how to read the dot graphs above. I think I get the gist of what's going on here, but a resource (if you have one) for how to best use this output would be welcome.

Thanks again for the time you took to look into this and write this up!

@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