#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int floor(int /*<<< orphan*/);
int /*<<< orphan*/ log10(int);
char *malloc(int);
int /*<<< orphan*/ sprintf(char *, char *, int);
int strlen(char *);
char *rdo_postgres_params_inject_markers(char *stmt) {
  int len = strlen(stmt);
  char *buf = malloc(sizeof(char) * len ? (len * (floor(log10(len)) + 2)) : 0);
  char *s = stmt;
  char *b = buf;
  int n = 0;
  int instr = 0;
  int inident = 0;
  int inslcmt = 0;
  int inmlcmt = 0;
  for (; *s; ++s, ++b) {
    switch (*s) {
    case '/':
      if (!instr && !inident && !inslcmt && *(s + 1) == '*') {
        ++inmlcmt;
        *b = *s;
        *(++b) = *(++s);
      } else {
        *b = *s;
      }
      break;
    case '*':
      if (inmlcmt && *(s + 1) == '/') {
        --inmlcmt;
        *b = *s;
        *(++b) = *(++s);
      } else {
        *b = *s;
      }
      break;
    case '-':
      if (!instr && !inident && !inmlcmt && *(s + 1) == '-') {
        inslcmt = 1;
        *b = *s;
        *(++b) = *(++s);
      } else {
        *b = *s;
      }
      break;
    case '\n':
    case '\r':
      inslcmt = 0;
      *b = *s;
      break;
    case '\'':
      if (!inident && !inmlcmt && !inslcmt) {
        instr = !instr;
        *b = *s;
      } else {
        *b = *s;
      }
      break;
    case '\\':
      if (!instr && !inident && !inmlcmt && !inslcmt && *(s + 1) == '?')
        ++s;
      *b = *s;
      break;
    case '"':
      if (!instr && !inmlcmt && !inslcmt) {
        inident = !inident;
        *b = *s;
      } else {
        *b = *s;
      }
      break;
    case '?':
      if (!instr && !inident && !inmlcmt && !inslcmt) {
        sprintf(b, "$%i", ++n);
        b += (n > 0 ? (int)floor(log10(n)) + 2 : 2) - 1;
      } else {
        *b = *s;
      }
      break;
    default:
      *b = *s;
      break;
    }
  }
  *b = '\0';
  return buf;
}


x86 assembly (clang, -O0):
<rdo_postgres_params_inject_markers>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0xc(%rbp)
movslq -0xc(%rbp),%rax
shl    $0x0,%rax
cmp    $0x0,%rax
je     11a2 <rdo_postgres_params_inject_markers+0x52>
mov    -0xc(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0xc(%rbp),%edi
call   1050 <log10@plt>
mov    %eax,%edi
call   1070 <floor@plt>
mov    %eax,%ecx
mov    -0x44(%rbp),%eax
add    $0x2,%ecx
imul   %ecx,%eax
mov    %eax,-0x40(%rbp)
jmp    11ac <rdo_postgres_params_inject_markers+0x5c>
xor    %eax,%eax
mov    %eax,-0x40(%rbp)
jmp    11ac <rdo_postgres_params_inject_markers+0x5c>
mov    -0x40(%rbp),%edi
call   1040 <malloc@plt>
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x20(%rbp),%rax
cmpb   $0x0,(%rax)
je     1563 <rdo_postgres_params_inject_markers+0x413>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
add    $0xfffffff6,%eax
mov    %eax,%ecx
mov    %rcx,-0x50(%rbp)
sub    $0x52,%eax
ja     1535 <rdo_postgres_params_inject_markers+0x3e5>
mov    -0x50(%rbp),%rax
lea    0xde4(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x0,-0x30(%rbp)
jne    1292 <rdo_postgres_params_inject_markers+0x142>
cmpl   $0x0,-0x34(%rbp)
jne    1292 <rdo_postgres_params_inject_markers+0x142>
cmpl   $0x0,-0x38(%rbp)
jne    1292 <rdo_postgres_params_inject_markers+0x142>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2a,%eax
jne    1292 <rdo_postgres_params_inject_markers+0x142>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    0x1(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,0x1(%rax)
jmp    129e <rdo_postgres_params_inject_markers+0x14e>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
cmpl   $0x0,-0x3c(%rbp)
je     12fc <rdo_postgres_params_inject_markers+0x1ac>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    12fc <rdo_postgres_params_inject_markers+0x1ac>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    0x1(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,0x1(%rax)
jmp    1308 <rdo_postgres_params_inject_markers+0x1b8>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
cmpl   $0x0,-0x30(%rbp)
jne    1378 <rdo_postgres_params_inject_markers+0x228>
cmpl   $0x0,-0x34(%rbp)
jne    1378 <rdo_postgres_params_inject_markers+0x228>
cmpl   $0x0,-0x3c(%rbp)
jne    1378 <rdo_postgres_params_inject_markers+0x228>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2d,%eax
jne    1378 <rdo_postgres_params_inject_markers+0x228>
movl   $0x1,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    0x1(%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,0x1(%rax)
jmp    1384 <rdo_postgres_params_inject_markers+0x234>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
movl   $0x0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
cmpl   $0x0,-0x34(%rbp)
jne    13e1 <rdo_postgres_params_inject_markers+0x291>
cmpl   $0x0,-0x3c(%rbp)
jne    13e1 <rdo_postgres_params_inject_markers+0x291>
cmpl   $0x0,-0x38(%rbp)
jne    13e1 <rdo_postgres_params_inject_markers+0x291>
cmpl   $0x0,-0x30(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    13ed <rdo_postgres_params_inject_markers+0x29d>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
cmpl   $0x0,-0x30(%rbp)
jne    1437 <rdo_postgres_params_inject_markers+0x2e7>
cmpl   $0x0,-0x34(%rbp)
jne    1437 <rdo_postgres_params_inject_markers+0x2e7>
cmpl   $0x0,-0x3c(%rbp)
jne    1437 <rdo_postgres_params_inject_markers+0x2e7>
cmpl   $0x0,-0x38(%rbp)
jne    1437 <rdo_postgres_params_inject_markers+0x2e7>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x3f,%eax
jne    1437 <rdo_postgres_params_inject_markers+0x2e7>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
cmpl   $0x0,-0x30(%rbp)
jne    1488 <rdo_postgres_params_inject_markers+0x338>
cmpl   $0x0,-0x3c(%rbp)
jne    1488 <rdo_postgres_params_inject_markers+0x338>
cmpl   $0x0,-0x38(%rbp)
jne    1488 <rdo_postgres_params_inject_markers+0x338>
cmpl   $0x0,-0x34(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1494 <rdo_postgres_params_inject_markers+0x344>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
cmpl   $0x0,-0x30(%rbp)
jne    1524 <rdo_postgres_params_inject_markers+0x3d4>
cmpl   $0x0,-0x34(%rbp)
jne    1524 <rdo_postgres_params_inject_markers+0x3d4>
cmpl   $0x0,-0x3c(%rbp)
jne    1524 <rdo_postgres_params_inject_markers+0x3d4>
cmpl   $0x0,-0x38(%rbp)
jne    1524 <rdo_postgres_params_inject_markers+0x3d4>
mov    -0x28(%rbp),%rdi
mov    -0x2c(%rbp),%edx
add    $0x1,%edx
mov    %edx,-0x2c(%rbp)
lea    0xc77(%rip),%rsi
call   1060 <sprintf@plt>
cmpl   $0x0,-0x2c(%rbp)
jle    14fe <rdo_postgres_params_inject_markers+0x3ae>
mov    -0x2c(%rbp),%edi
call   1050 <log10@plt>
mov    %eax,%edi
call   1070 <floor@plt>
add    $0x2,%eax
mov    %eax,-0x54(%rbp)
jmp    150b <rdo_postgres_params_inject_markers+0x3bb>
mov    $0x2,%eax
mov    %eax,-0x54(%rbp)
jmp    150b <rdo_postgres_params_inject_markers+0x3bb>
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    1530 <rdo_postgres_params_inject_markers+0x3e0>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1541 <rdo_postgres_params_inject_markers+0x3f1>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %cl,(%rax)
jmp    1546 <rdo_postgres_params_inject_markers+0x3f6>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    11eb <rdo_postgres_params_inject_markers+0x9b>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rdo_postgres_params_inject_markers>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdi,%r12
call   1030 <strlen@plt>
test   %eax,%eax
je     1181 <rdo_postgres_params_inject_markers+0x31>
mov    %eax,%ebx
mov    %eax,%edi
call   1050 <log10@plt>
mov    %eax,%edi
call   1070 <floor@plt>
mov    %eax,%edi
add    $0x2,%edi
imul   %ebx,%edi
jmp    1183 <rdo_postgres_params_inject_markers+0x33>
xor    %edi,%edi
call   1040 <malloc@plt>
mov    %rax,%r14
mov    (%r12),%dl
mov    %rax,%rbx
test   %dl,%dl
je     1381 <rdo_postgres_params_inject_markers+0x231>
xor    %ecx,%ecx
lea    0xe5d(%rip),%r13
xor    %esi,%esi
xor    %edi,%edi
xor    %eax,%eax
xor    %r15d,%r15d
mov    %r14,%rbx
jmp    11d8 <rdo_postgres_params_inject_markers+0x88>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %dl,(%rbx)
add    $0x1,%rbx
movzbl 0x1(%r12),%edx
add    $0x1,%r12
test   %dl,%dl
je     1381 <rdo_postgres_params_inject_markers+0x231>
movsbl %dl,%ebp
add    $0xfffffff6,%ebp
cmp    $0x52,%ebp
ja     11c0 <rdo_postgres_params_inject_markers+0x70>
movslq 0x0(%r13,%rbp,4),%rbp
add    %r13,%rbp
jmp    *%rbp
mov    %dl,(%rbx)
xor    %esi,%esi
jmp    11c2 <rdo_postgres_params_inject_markers+0x72>
test   %eax,%eax
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %ecx,%ecx
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %esi,%esi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
xor    %ecx,%ecx
test   %edi,%edi
sete   %cl
mov    %dl,(%rbx)
xor    %eax,%eax
mov    %ecx,%edi
jmp    1378 <rdo_postgres_params_inject_markers+0x228>
test   %edi,%edi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %ecx,%ecx
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %esi,%esi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
xor    %ecx,%ecx
test   %eax,%eax
sete   %cl
mov    %dl,(%rbx)
xor    %edi,%edi
mov    %ecx,%eax
jmp    1378 <rdo_postgres_params_inject_markers+0x228>
test   %ecx,%ecx
je     11c0 <rdo_postgres_params_inject_markers+0x70>
cmpb   $0x2f,0x1(%r12)
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
add    $0x1,%r12
add    $0xffffffff,%ecx
mov    %dl,(%rbx)
movzbl (%r12),%edx
mov    %dl,0x1(%rbx)
add    $0x1,%rbx
jmp    11c2 <rdo_postgres_params_inject_markers+0x72>
test   %eax,%eax
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %edi,%edi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %ecx,%ecx
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
cmpb   $0x2d,0x1(%r12)
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
add    $0x1,%r12
mov    %dl,(%rbx)
movzbl (%r12),%eax
mov    %al,0x1(%rbx)
add    $0x1,%rbx
mov    $0x1,%esi
xor    %eax,%eax
xor    %edi,%edi
jmp    137a <rdo_postgres_params_inject_markers+0x22a>
test   %eax,%eax
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %edi,%edi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %esi,%esi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
cmpb   $0x2a,0x1(%r12)
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
add    $0x1,%r12
add    $0x1,%ecx
mov    %dl,(%rbx)
movzbl (%r12),%eax
mov    %al,0x1(%rbx)
add    $0x1,%rbx
xor    %eax,%eax
xor    %edi,%edi
xor    %esi,%esi
jmp    11c2 <rdo_postgres_params_inject_markers+0x72>
test   %eax,%eax
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %edi,%edi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %ecx,%ecx
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %esi,%esi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
lea    0x1(%r15),%ebp
mov    %rbx,%rdi
lea    0xe41(%rip),%rsi
mov    %ebp,%edx
call   1060 <sprintf@plt>
test   %r15d,%r15d
js     1363 <rdo_postgres_params_inject_markers+0x213>
mov    %ebp,%edi
call   1050 <log10@plt>
mov    %eax,%edi
call   1070 <floor@plt>
add    $0x2,%eax
jmp    1368 <rdo_postgres_params_inject_markers+0x218>
test   %eax,%eax
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %edi,%edi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %ecx,%ecx
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
test   %esi,%esi
jne    11c0 <rdo_postgres_params_inject_markers+0x70>
cmpb   $0x3f,0x1(%r12)
lea    0x1(%r12),%rdx
cmove  %rdx,%r12
movzbl (%r12),%edx
jmp    11c0 <rdo_postgres_params_inject_markers+0x70>
mov    $0x2,%eax
cltq
add    %rax,%rbx
add    $0xffffffffffffffff,%rbx
xor    %eax,%eax
mov    %ebp,%r15d
xor    %edi,%edi
xor    %esi,%esi
xor    %ecx,%ecx
jmp    11c2 <rdo_postgres_params_inject_markers+0x72>
movb   $0x0,(%rbx)
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [4 x i8] c"$%i\00"
define i8* @rdo_postgres_params_inject_markers(i8* %0) {
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i8* %0, i8** %2
%12 = load i8*, i8** %2
%13 = call i32 @strlen(i8* %12)
store i32 %13, i32* %3
%14 = load i32, i32* %3
%15 = sext i32 %14 to i64
%16 = mul i64 1, %15
%17 = icmp ne i64 %16, 0
br i1 %17, label %18, label %25
18: ; preds = %1
%19 = load i32, i32* %3
%20 = load i32, i32* %3
%21 = call i32 @log10(i32 %20)
%22 = call i32 @floor(i32 %21)
%23 = add nsw i32 %22, 2
%24 = mul nsw i32 %19, %23
br label %26
25: ; preds = %1
br label %26
26: ; preds = %25, %18
%27 = phi i32 [ %24, %18 ], [ 0, %25 ]
%28 = call i8* @malloc(i32 %27)
store i8* %28, i8** %4
%29 = load i8*, i8** %2
store i8* %29, i8** %5
%30 = load i8*, i8** %4
store i8* %30, i8** %6
store i32 0, i32* %7
store i32 0, i32* %8
store i32 0, i32* %9
store i32 0, i32* %10
store i32 0, i32* %11
br label %31
31: ; preds = %238, %26
%32 = load i8*, i8** %5
%33 = load i8, i8* %32
%34 = icmp ne i8 %33, 0
br i1 %34, label %35, label %243
35: ; preds = %31
%36 = load i8*, i8** %5
%37 = load i8, i8* %36
%38 = sext i8 %37 to i32
switch i32 %38, label %233 [
i32 47, label %39
i32 42, label %70
i32 45, label %95
i32 10, label %124
i32 13, label %124
i32 39, label %128
i32 92, label %150
i32 34, label %175
i32 63, label %197
]
39: ; preds = %35
%40 = load i32, i32* %8
%41 = icmp ne i32 %40, 0
br i1 %41, label %65, label %42
42: ; preds = %39
%43 = load i32, i32* %9
%44 = icmp ne i32 %43, 0
br i1 %44, label %65, label %45
45: ; preds = %42
%46 = load i32, i32* %10
%47 = icmp ne i32 %46, 0
br i1 %47, label %65, label %48
48: ; preds = %45
%49 = load i8*, i8** %5
%50 = getelementptr inbounds i8, i8* %49, i64 1
%51 = load i8, i8* %50
%52 = sext i8 %51 to i32
%53 = icmp eq i32 %52, 42
br i1 %53, label %54, label %65
54: ; preds = %48
%55 = load i32, i32* %11
%56 = add nsw i32 %55, 1
store i32 %56, i32* %11
%57 = load i8*, i8** %5
%58 = load i8, i8* %57
%59 = load i8*, i8** %6
store i8 %58, i8* %59
%60 = load i8*, i8** %5
%61 = getelementptr inbounds i8, i8* %60, i32 1
store i8* %61, i8** %5
%62 = load i8, i8* %61
%63 = load i8*, i8** %6
%64 = getelementptr inbounds i8, i8* %63, i32 1
store i8* %64, i8** %6
store i8 %62, i8* %64
br label %69
65: ; preds = %48, %45, %42, %39
%66 = load i8*, i8** %5
%67 = load i8, i8* %66
%68 = load i8*, i8** %6
store i8 %67, i8* %68
br label %69
69: ; preds = %65, %54
br label %237
70: ; preds = %35
%71 = load i32, i32* %11
%72 = icmp ne i32 %71, 0
br i1 %72, label %73, label %90
73: ; preds = %70
%74 = load i8*, i8** %5
%75 = getelementptr inbounds i8, i8* %74, i64 1
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 47
br i1 %78, label %79, label %90
79: ; preds = %73
%80 = load i32, i32* %11
%81 = add nsw i32 %80, -1
store i32 %81, i32* %11
%82 = load i8*, i8** %5
%83 = load i8, i8* %82
%84 = load i8*, i8** %6
store i8 %83, i8* %84
%85 = load i8*, i8** %5
%86 = getelementptr inbounds i8, i8* %85, i32 1
store i8* %86, i8** %5
%87 = load i8, i8* %86
%88 = load i8*, i8** %6
%89 = getelementptr inbounds i8, i8* %88, i32 1
store i8* %89, i8** %6
store i8 %87, i8* %89
br label %94
90: ; preds = %73, %70
%91 = load i8*, i8** %5
%92 = load i8, i8* %91
%93 = load i8*, i8** %6
store i8 %92, i8* %93
br label %94
94: ; preds = %90, %79
br label %237
95: ; preds = %35
%96 = load i32, i32* %8
%97 = icmp ne i32 %96, 0
br i1 %97, label %119, label %98
98: ; preds = %95
%99 = load i32, i32* %9
%100 = icmp ne i32 %99, 0
br i1 %100, label %119, label %101
101: ; preds = %98
%102 = load i32, i32* %11
%103 = icmp ne i32 %102, 0
br i1 %103, label %119, label %104
104: ; preds = %101
%105 = load i8*, i8** %5
%106 = getelementptr inbounds i8, i8* %105, i64 1
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = icmp eq i32 %108, 45
br i1 %109, label %110, label %119
110: ; preds = %104
store i32 1, i32* %10
%111 = load i8*, i8** %5
%112 = load i8, i8* %111
%113 = load i8*, i8** %6
store i8 %112, i8* %113
%114 = load i8*, i8** %5
%115 = getelementptr inbounds i8, i8* %114, i32 1
store i8* %115, i8** %5
%116 = load i8, i8* %115
%117 = load i8*, i8** %6
%118 = getelementptr inbounds i8, i8* %117, i32 1
store i8* %118, i8** %6
store i8 %116, i8* %118
br label %123
119: ; preds = %104, %101, %98, %95
%120 = load i8*, i8** %5
%121 = load i8, i8* %120
%122 = load i8*, i8** %6
store i8 %121, i8* %122
br label %123
123: ; preds = %119, %110
br label %237
124: ; preds = %35, %35
store i32 0, i32* %10
%125 = load i8*, i8** %5
%126 = load i8, i8* %125
%127 = load i8*, i8** %6
store i8 %126, i8* %127
br label %237
128: ; preds = %35
%129 = load i32, i32* %9
%130 = icmp ne i32 %129, 0
br i1 %130, label %145, label %131
131: ; preds = %128
%132 = load i32, i32* %11
%133 = icmp ne i32 %132, 0
br i1 %133, label %145, label %134
134: ; preds = %131
%135 = load i32, i32* %10
%136 = icmp ne i32 %135, 0
br i1 %136, label %145, label %137
137: ; preds = %134
%138 = load i32, i32* %8
%139 = icmp ne i32 %138, 0
%140 = xor i1 %139, true
%141 = zext i1 %140 to i32
store i32 %141, i32* %8
%142 = load i8*, i8** %5
%143 = load i8, i8* %142
%144 = load i8*, i8** %6
store i8 %143, i8* %144
br label %149
145: ; preds = %134, %131, %128
%146 = load i8*, i8** %5
%147 = load i8, i8* %146
%148 = load i8*, i8** %6
store i8 %147, i8* %148
br label %149
149: ; preds = %145, %137
br label %237
150: ; preds = %35
%151 = load i32, i32* %8
%152 = icmp ne i32 %151, 0
br i1 %152, label %171, label %153
153: ; preds = %150
%154 = load i32, i32* %9
%155 = icmp ne i32 %154, 0
br i1 %155, label %171, label %156
156: ; preds = %153
%157 = load i32, i32* %11
%158 = icmp ne i32 %157, 0
br i1 %158, label %171, label %159
159: ; preds = %156
%160 = load i32, i32* %10
%161 = icmp ne i32 %160, 0
br i1 %161, label %171, label %162
162: ; preds = %159
%163 = load i8*, i8** %5
%164 = getelementptr inbounds i8, i8* %163, i64 1
%165 = load i8, i8* %164
%166 = sext i8 %165 to i32
%167 = icmp eq i32 %166, 63
br i1 %167, label %168, label %171
168: ; preds = %162
%169 = load i8*, i8** %5
%170 = getelementptr inbounds i8, i8* %169, i32 1
store i8* %170, i8** %5
br label %171
171: ; preds = %168, %162, %159, %156, %153, %150
%172 = load i8*, i8** %5
%173 = load i8, i8* %172
%174 = load i8*, i8** %6
store i8 %173, i8* %174
br label %237
175: ; preds = %35
%176 = load i32, i32* %8
%177 = icmp ne i32 %176, 0
br i1 %177, label %192, label %178
178: ; preds = %175
%179 = load i32, i32* %11
%180 = icmp ne i32 %179, 0
br i1 %180, label %192, label %181
181: ; preds = %178
%182 = load i32, i32* %10
%183 = icmp ne i32 %182, 0
br i1 %183, label %192, label %184
184: ; preds = %181
%185 = load i32, i32* %9
%186 = icmp ne i32 %185, 0
%187 = xor i1 %186, true
%188 = zext i1 %187 to i32
store i32 %188, i32* %9
%189 = load i8*, i8** %5
%190 = load i8, i8* %189
%191 = load i8*, i8** %6
store i8 %190, i8* %191
br label %196
192: ; preds = %181, %178, %175
%193 = load i8*, i8** %5
%194 = load i8, i8* %193
%195 = load i8*, i8** %6
store i8 %194, i8* %195
br label %196
196: ; preds = %192, %184
br label %237
197: ; preds = %35
%198 = load i32, i32* %8
%199 = icmp ne i32 %198, 0
br i1 %199, label %228, label %200
200: ; preds = %197
%201 = load i32, i32* %9
%202 = icmp ne i32 %201, 0
br i1 %202, label %228, label %203
203: ; preds = %200
%204 = load i32, i32* %11
%205 = icmp ne i32 %204, 0
br i1 %205, label %228, label %206
206: ; preds = %203
%207 = load i32, i32* %10
%208 = icmp ne i32 %207, 0
br i1 %208, label %228, label %209
209: ; preds = %206
%210 = load i8*, i8** %6
%211 = load i32, i32* %7
%212 = add nsw i32 %211, 1
store i32 %212, i32* %7
%213 = call i32 @sprintf(i8* %210, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %212)
%214 = load i32, i32* %7
%215 = icmp sgt i32 %214, 0
br i1 %215, label %216, label %221
216: ; preds = %209
%217 = load i32, i32* %7
%218 = call i32 @log10(i32 %217)
%219 = call i32 @floor(i32 %218)
%220 = add nsw i32 %219, 2
br label %222
221: ; preds = %209
br label %222
222: ; preds = %221, %216
%223 = phi i32 [ %220, %216 ], [ 2, %221 ]
%224 = sub nsw i32 %223, 1
%225 = load i8*, i8** %6
%226 = sext i32 %224 to i64
%227 = getelementptr inbounds i8, i8* %225, i64 %226
store i8* %227, i8** %6
br label %232
228: ; preds = %206, %203, %200, %197
%229 = load i8*, i8** %5
%230 = load i8, i8* %229
%231 = load i8*, i8** %6
store i8 %230, i8* %231
br label %232
232: ; preds = %228, %222
br label %237
233: ; preds = %35
%234 = load i8*, i8** %5
%235 = load i8, i8* %234
%236 = load i8*, i8** %6
store i8 %235, i8* %236
br label %237
237: ; preds = %233, %232, %196, %171, %149, %124, %123, %94, %69
br label %238
238: ; preds = %237
%239 = load i8*, i8** %5
%240 = getelementptr inbounds i8, i8* %239, i32 1
store i8* %240, i8** %5
%241 = load i8*, i8** %6
%242 = getelementptr inbounds i8, i8* %241, i32 1
store i8* %242, i8** %6
br label %31
243: ; preds = %31
%244 = load i8*, i8** %6
store i8 0, i8* %244
%245 = load i8*, i8** %4
ret i8* %245
}

LLVM IR (-O2):
@.str = [4 x i8] c"$%i\00"
define i8* @rdo_postgres_params_inject_markers(i8* %0) {
%2 = tail call i32 @strlen(i8* %0)
%3 = icmp eq i32 %2, 0
br i1 %3, label %9, label %4
4: ; preds = %1
%5 = tail call i32 @log10(i32 %2)
%6 = tail call i32 @floor(i32 %5)
%7 = add nsw i32 %6, 2
%8 = mul nsw i32 %7, %2
br label %9
9: ; preds = %1, %4
%10 = phi i32 [ %8, %4 ], [ 0, %1 ]
%11 = tail call i8* @malloc(i32 %10)
%12 = load i8, i8* %0
%13 = icmp eq i8 %12, 0
br i1 %13, label %137, label %14
14: ; preds = %9, %125
%15 = phi i8 [ %135, %125 ], [ %12, %9 ]
%16 = phi i32 [ %132, %125 ], [ 0, %9 ]
%17 = phi i32 [ %131, %125 ], [ 0, %9 ]
%18 = phi i32 [ %130, %125 ], [ 0, %9 ]
%19 = phi i32 [ %129, %125 ], [ 0, %9 ]
%20 = phi i32 [ %128, %125 ], [ 0, %9 ]
%21 = phi i8* [ %134, %125 ], [ %11, %9 ]
%22 = phi i8* [ %133, %125 ], [ %0, %9 ]
%23 = sext i8 %15 to i32
switch i32 %23, label %124 [
i32 47, label %24
i32 42, label %39
i32 45, label %50
i32 10, label %64
i32 13, label %64
i32 39, label %65
i32 92, label %75
i32 34, label %92
i32 63, label %102
]
24: ; preds = %14
%25 = icmp ne i32 %19, 0
%26 = icmp ne i32 %18, 0
%27 = select i1 %25, i1 true, i1 %26
%28 = icmp ne i32 %17, 0
%29 = select i1 %27, i1 true, i1 %28
br i1 %29, label %38, label %30
30: ; preds = %24
%31 = getelementptr inbounds i8, i8* %22, i64 1
%32 = load i8, i8* %31
%33 = icmp eq i8 %32, 42
br i1 %33, label %34, label %38
34: ; preds = %30
%35 = add nsw i32 %16, 1
store i8 %15, i8* %21
%36 = load i8, i8* %31
%37 = getelementptr inbounds i8, i8* %21, i64 1
store i8 %36, i8* %37
br label %125
38: ; preds = %30, %24
store i8 %15, i8* %21
br label %125
39: ; preds = %14
%40 = icmp eq i32 %16, 0
br i1 %40, label %49, label %41
41: ; preds = %39
%42 = getelementptr inbounds i8, i8* %22, i64 1
%43 = load i8, i8* %42
%44 = icmp eq i8 %43, 47
br i1 %44, label %45, label %49
45: ; preds = %41
%46 = add nsw i32 %16, -1
store i8 %15, i8* %21
%47 = load i8, i8* %42
%48 = getelementptr inbounds i8, i8* %21, i64 1
store i8 %47, i8* %48
br label %125
49: ; preds = %41, %39
store i8 %15, i8* %21
br label %125
50: ; preds = %14
%51 = icmp ne i32 %19, 0
%52 = icmp ne i32 %18, 0
%53 = select i1 %51, i1 true, i1 %52
%54 = icmp ne i32 %16, 0
%55 = select i1 %53, i1 true, i1 %54
br i1 %55, label %63, label %56
56: ; preds = %50
%57 = getelementptr inbounds i8, i8* %22, i64 1
%58 = load i8, i8* %57
%59 = icmp eq i8 %58, 45
br i1 %59, label %60, label %63
60: ; preds = %56
store i8 %15, i8* %21
%61 = load i8, i8* %57
%62 = getelementptr inbounds i8, i8* %21, i64 1
store i8 %61, i8* %62
br label %125
63: ; preds = %56, %50
store i8 %15, i8* %21
br label %125
64: ; preds = %14, %14
store i8 %15, i8* %21
br label %125
65: ; preds = %14
%66 = icmp ne i32 %18, 0
%67 = icmp ne i32 %16, 0
%68 = select i1 %66, i1 true, i1 %67
%69 = icmp ne i32 %17, 0
%70 = select i1 %68, i1 true, i1 %69
br i1 %70, label %74, label %71
71: ; preds = %65
%72 = icmp eq i32 %19, 0
%73 = zext i1 %72 to i32
store i8 %15, i8* %21
br label %125
74: ; preds = %65
store i8 %15, i8* %21
br label %125
75: ; preds = %14
%76 = icmp ne i32 %19, 0
%77 = icmp ne i32 %18, 0
%78 = select i1 %76, i1 true, i1 %77
%79 = icmp ne i32 %16, 0
%80 = select i1 %78, i1 true, i1 %79
%81 = icmp ne i32 %17, 0
%82 = select i1 %80, i1 true, i1 %81
br i1 %82, label %89, label %83
83: ; preds = %75
%84 = getelementptr inbounds i8, i8* %22, i64 1
%85 = load i8, i8* %84
%86 = icmp eq i8 %85, 63
%87 = select i1 %86, i8* %84, i8* %22
%88 = load i8, i8* %87
br label %89
89: ; preds = %83, %75
%90 = phi i8 [ %15, %75 ], [ %88, %83 ]
%91 = phi i8* [ %22, %75 ], [ %87, %83 ]
store i8 %90, i8* %21
br label %125
92: ; preds = %14
%93 = icmp ne i32 %19, 0
%94 = icmp ne i32 %16, 0
%95 = select i1 %93, i1 true, i1 %94
%96 = icmp ne i32 %17, 0
%97 = select i1 %95, i1 true, i1 %96
br i1 %97, label %101, label %98
98: ; preds = %92
%99 = icmp eq i32 %18, 0
%100 = zext i1 %99 to i32
store i8 %15, i8* %21
br label %125
101: ; preds = %92
store i8 %15, i8* %21
br label %125
102: ; preds = %14
%103 = icmp ne i32 %19, 0
%104 = icmp ne i32 %18, 0
%105 = select i1 %103, i1 true, i1 %104
%106 = icmp ne i32 %16, 0
%107 = select i1 %105, i1 true, i1 %106
%108 = icmp ne i32 %17, 0
%109 = select i1 %107, i1 true, i1 %108
br i1 %109, label %123, label %110
110: ; preds = %102
%111 = add nsw i32 %20, 1
%112 = tail call i32 @sprintf(i8* dereferenceable(1) %21, i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %111)
%113 = icmp sgt i32 %20, -1
br i1 %113, label %114, label %118
114: ; preds = %110
%115 = tail call i32 @log10(i32 %111)
%116 = tail call i32 @floor(i32 %115)
%117 = add nsw i32 %116, 2
br label %118
118: ; preds = %110, %114
%119 = phi i32 [ %117, %114 ], [ 2, %110 ]
%120 = add nsw i32 %119, -1
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %21, i64 %121
br label %125
123: ; preds = %102
store i8 %15, i8* %21
br label %125
124: ; preds = %14
store i8 %15, i8* %21
br label %125
125: ; preds = %64, %89, %124, %38, %34, %49, %45, %63, %60, %74, %71, %101, %98, %123, %118
%126 = phi i8* [ %22, %124 ], [ %22, %123 ], [ %22, %118 ], [ %22, %101 ], [ %22, %98 ], [ %91, %89 ], [ %22, %74 ], [ %22, %71 ], [ %22, %64 ], [ %22, %63 ], [ %57, %60 ], [ %42, %45 ], [ %22, %49 ], [ %22, %38 ], [ %31, %34 ]
%127 = phi i8* [ %21, %124 ], [ %21, %123 ], [ %122, %118 ], [ %21, %101 ], [ %21, %98 ], [ %21, %89 ], [ %21, %74 ], [ %21, %71 ], [ %21, %64 ], [ %21, %63 ], [ %62, %60 ], [ %48, %45 ], [ %21, %49 ], [ %21, %38 ], [ %37, %34 ]
%128 = phi i32 [ %20, %124 ], [ %20, %123 ], [ %111, %118 ], [ %20, %101 ], [ %20, %98 ], [ %20, %89 ], [ %20, %74 ], [ %20, %71 ], [ %20, %64 ], [ %20, %63 ], [ %20, %60 ], [ %20, %45 ], [ %20, %49 ], [ %20, %38 ], [ %20, %34 ]
%129 = phi i32 [ %19, %124 ], [ %19, %123 ], [ 0, %118 ], [ %19, %101 ], [ 0, %98 ], [ %19, %89 ], [ %19, %74 ], [ %73, %71 ], [ %19, %64 ], [ %19, %63 ], [ 0, %60 ], [ %19, %45 ], [ %19, %49 ], [ %19, %38 ], [ 0, %34 ]
%130 = phi i32 [ %18, %124 ], [ %18, %123 ], [ 0, %118 ], [ %18, %101 ], [ %100, %98 ], [ %18, %89 ], [ %18, %74 ], [ 0, %71 ], [ %18, %64 ], [ %18, %63 ], [ 0, %60 ], [ %18, %45 ], [ %18, %49 ], [ %18, %38 ], [ 0, %34 ]
%131 = phi i32 [ %17, %124 ], [ %17, %123 ], [ 0, %118 ], [ %17, %101 ], [ 0, %98 ], [ %17, %89 ], [ %17, %74 ], [ 0, %71 ], [ 0, %64 ], [ %17, %63 ], [ 1, %60 ], [ %17, %45 ], [ %17, %49 ], [ %17, %38 ], [ 0, %34 ]
%132 = phi i32 [ %16, %124 ], [ %16, %123 ], [ 0, %118 ], [ %16, %101 ], [ 0, %98 ], [ %16, %89 ], [ %16, %74 ], [ 0, %71 ], [ %16, %64 ], [ %16, %63 ], [ 0, %60 ], [ %46, %45 ], [ %16, %49 ], [ %16, %38 ], [ %35, %34 ]
%133 = getelementptr inbounds i8, i8* %126, i64 1
%134 = getelementptr inbounds i8, i8* %127, i64 1
%135 = load i8, i8* %133
%136 = icmp eq i8 %135, 0
br i1 %136, label %137, label %14
137: ; preds = %125, %9
%138 = phi i8* [ %11, %9 ], [ %134, %125 ]
store i8 0, i8* %138
ret i8* %11
}