#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 */
struct dyn_string_str {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ dyn_strcat(struct dyn_string_str *, char *);
int /*<<< orphan*/ sprintf(char *, char *, char, char, long, char, char, long,
                           char);
void add_annot_code(int have_ann, char sp0, char sp1, char ann_aa0_i0,
                    char ann_aa1_i1, long q_off_pos, long l_off_pos,
                    char sim_sym_code, struct dyn_string_str *ann_code_dyn) {
  char ann_ch0, ann_ch1;
  char tmp_astr[512];
  ann_ch0 = ann_ch1 = '\0';
  if (have_ann == 3 && (ann_aa0_i0 != ' ' || ann_aa1_i1 != ' ')) {
    ann_ch0 = ann_aa0_i0;
    if (ann_ch0 == ' ')
      ann_ch0 = 'X';
    ann_ch1 = ann_aa1_i1;
    if (ann_ch1 == ' ')
      ann_ch1 = 'X';
  } else if ((have_ann & 2) == 0 && ann_aa0_i0 != ' ') {
    ann_ch0 = ann_aa0_i0;
    ann_ch1 = 'X';
  } else if ((have_ann & 1) == 0 && ann_aa1_i1 != ' ') {
    ann_ch0 = 'X';
    ann_ch1 = ann_aa1_i1;
  }
  if (ann_ch0 &&
      !(ann_ch1 == '[' || ann_ch1 == ']' || ann_ch0 == '[' || ann_ch0 == ']')) {
    sprintf(tmp_astr, "|%c%c:%ld%c%c%ld%c", ann_ch0, ann_ch1, q_off_pos + 1,
            sp0, sim_sym_code, l_off_pos + 1, sp1);
    dyn_strcat(ann_code_dyn, tmp_astr);
  }
}


x86 assembly (clang, -O0):
<add_annot_code>:
push   %rbp
mov    %rsp,%rbp
sub    $0x240,%rsp
mov    %r8b,%al
mov    0x20(%rbp),%r8
mov    0x18(%rbp),%r8b
mov    0x10(%rbp),%r8
mov    %edi,-0x4(%rbp)
mov    %sil,-0x5(%rbp)
mov    %dl,-0x6(%rbp)
mov    %cl,-0x7(%rbp)
mov    %al,-0x8(%rbp)
mov    %r9,-0x10(%rbp)
movb   $0x0,-0x12(%rbp)
movb   $0x0,-0x11(%rbp)
cmpl   $0x3,-0x4(%rbp)
jne    11ad <add_annot_code+0x8d>
movsbl -0x7(%rbp),%eax
cmp    $0x20,%eax
jne    117a <add_annot_code+0x5a>
movsbl -0x8(%rbp),%eax
cmp    $0x20,%eax
je     11ad <add_annot_code+0x8d>
mov    -0x7(%rbp),%al
mov    %al,-0x11(%rbp)
movsbl -0x11(%rbp),%eax
cmp    $0x20,%eax
jne    1191 <add_annot_code+0x71>
movb   $0x58,-0x11(%rbp)
mov    -0x8(%rbp),%al
mov    %al,-0x12(%rbp)
movsbl -0x12(%rbp),%eax
cmp    $0x20,%eax
jne    11a8 <add_annot_code+0x88>
movb   $0x58,-0x12(%rbp)
jmp    1208 <add_annot_code+0xe8>
mov    -0x4(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
jne    11d8 <add_annot_code+0xb8>
movsbl -0x7(%rbp),%eax
cmp    $0x20,%eax
je     11d8 <add_annot_code+0xb8>
mov    -0x7(%rbp),%al
mov    %al,-0x11(%rbp)
movb   $0x58,-0x12(%rbp)
jmp    1203 <add_annot_code+0xe3>
mov    -0x4(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    11fe <add_annot_code+0xde>
movsbl -0x8(%rbp),%eax
cmp    $0x20,%eax
je     11fe <add_annot_code+0xde>
movb   $0x58,-0x11(%rbp)
mov    -0x8(%rbp),%al
mov    %al,-0x12(%rbp)
jmp    1203 <add_annot_code+0xe3>
jmp    1208 <add_annot_code+0xe8>
movsbl -0x11(%rbp),%eax
cmp    $0x0,%eax
je     12a9 <add_annot_code+0x189>
movsbl -0x12(%rbp),%eax
cmp    $0x5b,%eax
je     12a9 <add_annot_code+0x189>
movsbl -0x12(%rbp),%eax
cmp    $0x5d,%eax
je     12a9 <add_annot_code+0x189>
movsbl -0x11(%rbp),%eax
cmp    $0x5b,%eax
je     12a9 <add_annot_code+0x189>
movsbl -0x11(%rbp),%eax
cmp    $0x5d,%eax
je     12a9 <add_annot_code+0x189>
lea    -0x220(%rbp),%rdi
mov    -0x11(%rbp),%dl
mov    -0x12(%rbp),%cl
mov    -0x10(%rbp),%r8
add    $0x1,%r8
mov    -0x5(%rbp),%r9b
mov    0x18(%rbp),%r10b
mov    0x10(%rbp),%rax
add    $0x1,%rax
lea    0xd8b(%rip),%rsi
movsbl %dl,%edx
movsbl %cl,%ecx
movsbl %r9b,%r9d
movsbl %r10b,%r10d
mov    %r10d,(%rsp)
mov    %rax,0x8(%rsp)
movsbl -0x6(%rbp),%eax
mov    %eax,0x10(%rsp)
call   1040 <sprintf@plt>
mov    0x20(%rbp),%rdi
lea    -0x220(%rbp),%rsi
call   1030 <dyn_strcat@plt>
add    $0x240,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<add_annot_code>:
cmp    $0x3,%edi
jne    1144 <add_annot_code+0x24>
cmp    $0x20,%cl
jne    1130 <add_annot_code+0x10>
cmp    $0x20,%r8b
je     1151 <add_annot_code+0x31>
cmp    $0x20,%cl
movzbl %cl,%ecx
mov    $0x58,%edi
cmove  %edi,%ecx
cmp    $0x20,%r8b
jmp    116b <add_annot_code+0x4b>
test   $0x2,%dil
jne    1151 <add_annot_code+0x31>
mov    $0x58,%al
cmp    $0x20,%cl
jne    1172 <add_annot_code+0x52>
test   $0x1,%dil
sete   %al
cmp    $0x20,%r8b
setne  %cl
xor    %edi,%edi
test   %cl,%al
mov    $0x58,%ecx
cmove  %edi,%ecx
movzbl %r8b,%eax
cmove  %edi,%eax
cmp    $0x5d,%cl
je     1214 <add_annot_code+0xf4>
cmp    $0x5b,%cl
je     1214 <add_annot_code+0xf4>
cmp    $0x5d,%al
je     1214 <add_annot_code+0xf4>
test   %cl,%cl
je     1214 <add_annot_code+0xf4>
cmp    $0x5b,%al
je     1214 <add_annot_code+0xf4>
push   %r15
push   %r14
push   %rbx
sub    $0x200,%rsp
mov    0x230(%rsp),%r14
mov    0x228(%rsp),%dil
mov    0x220(%rsp),%rbx
add    $0x1,%r9
add    $0x1,%rbx
sub    $0x8,%rsp
movsbl %dl,%r10d
movsbl %dil,%r11d
movsbl %cl,%edx
movsbl %al,%ecx
movsbl %sil,%eax
lea    0xe1f(%rip),%rsi
lea    0x8(%rsp),%r15
mov    %r15,%rdi
mov    %r9,%r8
mov    %eax,%r9d
push   %r10
push   %rbx
push   %r11
call   1040 <sprintf@plt>
add    $0x20,%rsp
mov    %r14,%rdi
mov    %r15,%rsi
call   1030 <dyn_strcat@plt>
add    $0x200,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
%struct.dyn_string_str = type { i32 }
@.str = [19 x i8] c"|%c%c:%ld%c%c%ld%c\00"
define void @add_annot_code(i32 %0, i8 signext %1, i8 signext %2, i8 signext %3, i8 signext %4, i64 %5, i64 %6, i8 signext %7, %struct.dyn_string_str* %8) {
%10 = alloca i32
%11 = alloca i8
%12 = alloca i8
%13 = alloca i8
%14 = alloca i8
%15 = alloca i64
%16 = alloca i64
%17 = alloca i8
%18 = alloca %struct.dyn_string_str*
%19 = alloca i8
%20 = alloca i8
%21 = alloca [512 x i8]
store i32 %0, i32* %10
store i8 %1, i8* %11
store i8 %2, i8* %12
store i8 %3, i8* %13
store i8 %4, i8* %14
store i64 %5, i64* %15
store i64 %6, i64* %16
store i8 %7, i8* %17
store %struct.dyn_string_str* %8, %struct.dyn_string_str** %18
store i8 0, i8* %20
store i8 0, i8* %19
%22 = load i32, i32* %10
%23 = icmp eq i32 %22, 3
br i1 %23, label %24, label %45
24: ; preds = %9
%25 = load i8, i8* %13
%26 = sext i8 %25 to i32
%27 = icmp ne i32 %26, 32
br i1 %27, label %32, label %28
28: ; preds = %24
%29 = load i8, i8* %14
%30 = sext i8 %29 to i32
%31 = icmp ne i32 %30, 32
br i1 %31, label %32, label %45
32: ; preds = %28, %24
%33 = load i8, i8* %13
store i8 %33, i8* %19
%34 = load i8, i8* %19
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 32
br i1 %36, label %37, label %38
37: ; preds = %32
store i8 88, i8* %19
br label %38
38: ; preds = %37, %32
%39 = load i8, i8* %14
store i8 %39, i8* %20
%40 = load i8, i8* %20
%41 = sext i8 %40 to i32
%42 = icmp eq i32 %41, 32
br i1 %42, label %43, label %44
43: ; preds = %38
store i8 88, i8* %20
br label %44
44: ; preds = %43, %38
br label %67
45: ; preds = %28, %9
%46 = load i32, i32* %10
%47 = and i32 %46, 2
%48 = icmp eq i32 %47, 0
br i1 %48, label %49, label %55
49: ; preds = %45
%50 = load i8, i8* %13
%51 = sext i8 %50 to i32
%52 = icmp ne i32 %51, 32
br i1 %52, label %53, label %55
53: ; preds = %49
%54 = load i8, i8* %13
store i8 %54, i8* %19
store i8 88, i8* %20
br label %66
55: ; preds = %49, %45
%56 = load i32, i32* %10
%57 = and i32 %56, 1
%58 = icmp eq i32 %57, 0
br i1 %58, label %59, label %65
59: ; preds = %55
%60 = load i8, i8* %14
%61 = sext i8 %60 to i32
%62 = icmp ne i32 %61, 32
br i1 %62, label %63, label %65
63: ; preds = %59
store i8 88, i8* %19
%64 = load i8, i8* %14
store i8 %64, i8* %20
br label %65
65: ; preds = %63, %59, %55
br label %66
66: ; preds = %65, %53
br label %67
67: ; preds = %66, %44
%68 = load i8, i8* %19
%69 = sext i8 %68 to i32
%70 = icmp ne i32 %69, 0
br i1 %70, label %71, label %102
71: ; preds = %67
%72 = load i8, i8* %20
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 91
br i1 %74, label %102, label %75
75: ; preds = %71
%76 = load i8, i8* %20
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 93
br i1 %78, label %102, label %79
79: ; preds = %75
%80 = load i8, i8* %19
%81 = sext i8 %80 to i32
%82 = icmp eq i32 %81, 91
br i1 %82, label %102, label %83
83: ; preds = %79
%84 = load i8, i8* %19
%85 = sext i8 %84 to i32
%86 = icmp eq i32 %85, 93
br i1 %86, label %102, label %87
87: ; preds = %83
%88 = getelementptr inbounds [512 x i8], [512 x i8]* %21, i64 0, i64 0
%89 = load i8, i8* %19
%90 = load i8, i8* %20
%91 = load i64, i64* %15
%92 = add nsw i64 %91, 1
%93 = load i8, i8* %11
%94 = load i8, i8* %17
%95 = load i64, i64* %16
%96 = add nsw i64 %95, 1
%97 = load i8, i8* %12
%98 = call i32 @sprintf(i8* %88, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i64 0, i64 0), i8 signext %89, i8 signext %90, i64 %92, i8 signext %93, i8 signext %94, i64 %96, i8 signext %97)
%99 = load %struct.dyn_string_str*, %struct.dyn_string_str** %18
%100 = getelementptr inbounds [512 x i8], [512 x i8]* %21, i64 0, i64 0
%101 = call i32 @dyn_strcat(%struct.dyn_string_str* %99, i8* %100)
br label %102
102: ; preds = %87, %83, %79, %75, %71, %67
ret void
}

LLVM IR (-O2):
%struct.dyn_string_str = type { i32 }
@.str = [19 x i8] c"|%c%c:%ld%c%c%ld%c\00"
define void @add_annot_code(i32 %0, i8 signext %1, i8 signext %2, i8 signext %3, i8 signext %4, i64 %5, i64 %6, i8 signext %7, %struct.dyn_string_str* %8) {
%10 = alloca [512 x i8]
%11 = getelementptr inbounds [512 x i8], [512 x i8]* %10, i64 0, i64 0
%12 = icmp eq i32 %0, 3
br i1 %12, label %13, label %22
13: ; preds = %9
%14 = icmp ne i8 %3, 32
%15 = icmp ne i8 %4, 32
%16 = or i1 %14, %15
br i1 %16, label %17, label %27
17: ; preds = %13
%18 = icmp eq i8 %3, 32
%19 = select i1 %18, i8 88, i8 %3
%20 = icmp eq i8 %4, 32
%21 = select i1 %20, i8 88, i8 %4
br label %34
22: ; preds = %9
%23 = and i32 %0, 2
%24 = icmp eq i32 %23, 0
%25 = icmp ne i8 %3, 32
%26 = and i1 %24, %25
br i1 %26, label %34, label %27
27: ; preds = %13, %22
%28 = and i32 %0, 1
%29 = icmp eq i32 %28, 0
%30 = icmp ne i8 %4, 32
%31 = and i1 %29, %30
%32 = select i1 %31, i8 88, i8 0
%33 = select i1 %31, i8 %4, i8 0
br label %34
34: ; preds = %27, %22, %17
%35 = phi i8 [ %19, %17 ], [ %3, %22 ], [ %32, %27 ]
%36 = phi i8 [ %21, %17 ], [ 88, %22 ], [ %33, %27 ]
%37 = icmp eq i8 %35, 0
%38 = icmp eq i8 %36, 91
%39 = or i1 %37, %38
%40 = icmp eq i8 %36, 93
%41 = or i1 %40, %39
%42 = icmp eq i8 %35, 91
%43 = or i1 %42, %41
%44 = icmp eq i8 %35, 93
%45 = or i1 %44, %43
br i1 %45, label %51, label %46
46: ; preds = %34
%47 = add nsw i64 %5, 1
%48 = add nsw i64 %6, 1
%49 = call i32 @sprintf(i8* %11, i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i64 0, i64 0), i8 signext %35, i8 signext %36, i64 %47, i8 signext %1, i8 signext %7, i64 %48, i8 signext %2)
%50 = call i32 @dyn_strcat(%struct.dyn_string_str* %8, i8* %11)
br label %51
51: ; preds = %46, %34
ret void
}