#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 */
char *emalloc(size_t);
char *mark(size_t pos, char *str) {
  size_t i;
  char *res;
  res = emalloc(pos + 2);
  for (i = 0; i < pos; i++) {
    if ((res[i] = str[i]) != '\t')
      res[i] = ' ';
  }
  res[pos] = '^';
  res[++pos] = '\0';
  return res;
}


x86 assembly (clang, -O0):
<mark>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
add    $0x2,%rdi
call   1030 <emalloc@plt>
mov    %rax,-0x20(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x8(%rbp),%rax
jae    118b <mark+0x7b>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    -0x20(%rbp),%rcx
mov    -0x18(%rbp),%rdx
mov    %al,(%rcx,%rdx,1)
movsbl %al,%eax
cmp    $0x9,%eax
je     1175 <mark+0x65>
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%rcx
movb   $0x20,(%rax,%rcx,1)
jmp    117a <mark+0x6a>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1139 <mark+0x29>
mov    -0x20(%rbp),%rax
mov    -0x8(%rbp),%rcx
movb   $0x5e,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
movb   $0x0,0x1(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<mark>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%r14
add    $0x2,%rdi
call   1030 <emalloc@plt>
test   %r14,%r14
je     11ef <mark+0xdf>
cmp    $0x8,%r14
jb     114e <mark+0x3e>
lea    (%rbx,%r14,1),%rcx
cmp    %rcx,%rax
jae    11fe <mark+0xee>
mov    %rax,%rcx
add    %r14,%rcx
cmp    %rbx,%rcx
jbe    11fe <mark+0xee>
xor    %ecx,%ecx
mov    %rcx,%r8
not    %r8
add    %r14,%r8
mov    %r14,%rsi
and    $0x3,%rsi
je     1189 <mark+0x79>
mov    $0x9,%edi
nopw   0x0(%rax,%rax,1)
cmpb   $0x9,(%rbx,%rcx,1)
mov    $0x20,%edx
cmove  %edi,%edx
mov    %dl,(%rax,%rcx,1)
add    $0x1,%rcx
add    $0xffffffffffffffff,%rsi
jne    1170 <mark+0x60>
cmp    $0x3,%r8
jb     11ef <mark+0xdf>
mov    $0x9,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cmpb   $0x9,(%rbx,%rcx,1)
mov    $0x20,%esi
cmove  %edx,%esi
mov    %sil,(%rax,%rcx,1)
cmpb   $0x9,0x1(%rbx,%rcx,1)
mov    $0x20,%esi
cmove  %edx,%esi
mov    %sil,0x1(%rax,%rcx,1)
cmpb   $0x9,0x2(%rbx,%rcx,1)
mov    $0x20,%esi
cmove  %edx,%esi
mov    %sil,0x2(%rax,%rcx,1)
cmpb   $0x9,0x3(%rbx,%rcx,1)
mov    $0x20,%esi
cmove  %edx,%esi
mov    %sil,0x3(%rax,%rcx,1)
add    $0x4,%rcx
cmp    %rcx,%r14
jne    11a0 <mark+0x90>
movw   $0x5e,(%rax,%r14,1)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
cmp    $0x20,%r14
jae    120b <mark+0xfb>
xor    %ecx,%ecx
jmp    1343 <mark+0x233>
mov    %r14,%rcx
and    $0xffffffffffffffe0,%rcx
lea    -0x20(%rcx),%rdx
mov    %rdx,%rsi
shr    $0x5,%rsi
add    $0x1,%rsi
test   %rdx,%rdx
je     1395 <mark+0x285>
mov    %rsi,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %edx,%edx
movdqa 0xdc5(%rip),%xmm0
movdqa 0xdcd(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%rbx,%rdx,1),%xmm2
movdqu 0x10(%rbx,%rdx,1),%xmm3
pcmpeqb %xmm0,%xmm2
pcmpeqb %xmm0,%xmm3
movdqa %xmm2,%xmm4
pandn  %xmm1,%xmm4
pand   %xmm0,%xmm2
por    %xmm4,%xmm2
movdqa %xmm3,%xmm4
pandn  %xmm1,%xmm4
pand   %xmm0,%xmm3
por    %xmm4,%xmm3
movdqu %xmm2,(%rax,%rdx,1)
movdqu %xmm3,0x10(%rax,%rdx,1)
movdqu 0x20(%rbx,%rdx,1),%xmm2
movdqu 0x30(%rbx,%rdx,1),%xmm3
pcmpeqb %xmm0,%xmm2
pcmpeqb %xmm0,%xmm3
movdqa %xmm2,%xmm4
pandn  %xmm1,%xmm4
pand   %xmm0,%xmm2
por    %xmm4,%xmm2
movdqa %xmm3,%xmm4
pandn  %xmm1,%xmm4
pand   %xmm0,%xmm3
por    %xmm4,%xmm3
movdqu %xmm2,0x20(%rax,%rdx,1)
movdqu %xmm3,0x30(%rax,%rdx,1)
add    $0x40,%rdx
add    $0xfffffffffffffffe,%rdi
jne    1250 <mark+0x140>
test   $0x1,%sil
je     1330 <mark+0x220>
movdqu (%rbx,%rdx,1),%xmm0
movdqu 0x10(%rbx,%rdx,1),%xmm1
movdqa 0xd0b(%rip),%xmm2
pcmpeqb %xmm2,%xmm0
pcmpeqb %xmm2,%xmm1
movdqa 0xd0b(%rip),%xmm3
movdqa %xmm0,%xmm4
pandn  %xmm3,%xmm4
pand   %xmm2,%xmm0
por    %xmm4,%xmm0
movdqa %xmm1,%xmm4
pandn  %xmm3,%xmm4
pand   %xmm2,%xmm1
por    %xmm4,%xmm1
movdqu %xmm0,(%rax,%rdx,1)
movdqu %xmm1,0x10(%rax,%rdx,1)
cmp    %r14,%rcx
je     11ef <mark+0xdf>
test   $0x18,%r14b
je     1150 <mark+0x40>
mov    %rcx,%rdx
mov    %r14,%rcx
and    $0xfffffffffffffff8,%rcx
movdqa 0xccb(%rip),%xmm0
movdqa 0xcd3(%rip),%xmm1
nopl   (%rax)
movq   (%rbx,%rdx,1),%xmm2
pcmpeqb %xmm0,%xmm2
movdqa %xmm2,%xmm3
pand   %xmm0,%xmm3
pandn  %xmm1,%xmm2
por    %xmm3,%xmm2
movq   %xmm2,(%rax,%rdx,1)
add    $0x8,%rdx
cmp    %rdx,%rcx
jne    1360 <mark+0x250>
cmp    %r14,%rcx
je     11ef <mark+0xdf>
jmp    1150 <mark+0x40>
xor    %edx,%edx
test   $0x1,%sil
jne    12e2 <mark+0x1d2>
jmp    1330 <mark+0x220>

LLVM IR (-O0):
define i8* @mark(i64 %0, i8* %1) {
%3 = alloca i64
%4 = alloca i8*
%5 = alloca i64
%6 = alloca i8*
store i64 %0, i64* %3
store i8* %1, i8** %4
%7 = load i64, i64* %3
%8 = add i64 %7, 2
%9 = call i8* @emalloc(i64 %8)
store i8* %9, i8** %6
store i64 0, i64* %5
br label %10
10: ; preds = %29, %2
%11 = load i64, i64* %5
%12 = load i64, i64* %3
%13 = icmp ult i64 %11, %12
br i1 %13, label %14, label %32
14: ; preds = %10
%15 = load i8*, i8** %4
%16 = load i64, i64* %5
%17 = getelementptr inbounds i8, i8* %15, i64 %16
%18 = load i8, i8* %17
%19 = load i8*, i8** %6
%20 = load i64, i64* %5
%21 = getelementptr inbounds i8, i8* %19, i64 %20
store i8 %18, i8* %21
%22 = sext i8 %18 to i32
%23 = icmp ne i32 %22, 9
br i1 %23, label %24, label %28
24: ; preds = %14
%25 = load i8*, i8** %6
%26 = load i64, i64* %5
%27 = getelementptr inbounds i8, i8* %25, i64 %26
store i8 32, i8* %27
br label %28
28: ; preds = %24, %14
br label %29
29: ; preds = %28
%30 = load i64, i64* %5
%31 = add i64 %30, 1
store i64 %31, i64* %5
br label %10
32: ; preds = %10
%33 = load i8*, i8** %6
%34 = load i64, i64* %3
%35 = getelementptr inbounds i8, i8* %33, i64 %34
store i8 94, i8* %35
%36 = load i8*, i8** %6
%37 = load i64, i64* %3
%38 = add i64 %37, 1
store i64 %38, i64* %3
%39 = getelementptr inbounds i8, i8* %36, i64 %38
store i8 0, i8* %39
%40 = load i8*, i8** %6
ret i8* %40
}

LLVM IR (-O2):
define i8* @mark(i64 %0, i8* nocapture %1) {
%3 = add i64 %0, 2
%4 = tail call i8* @emalloc(i64 %3)
%5 = icmp eq i64 %0, 0
br i1 %5, label %146, label %6
6: ; preds = %2
%7 = icmp ult i64 %0, 8
br i1 %7, label %99, label %8
8: ; preds = %6
%9 = getelementptr i8, i8* %4, i64 %0
%10 = getelementptr i8, i8* %1, i64 %0
%11 = icmp ult i8* %4, %10
%12 = icmp ugt i8* %9, %1
%13 = and i1 %11, %12
br i1 %13, label %99, label %14
14: ; preds = %8
%15 = icmp ult i64 %0, 32
br i1 %15, label %83, label %16
16: ; preds = %14
%17 = and i64 %0, -32
%18 = add i64 %17, -32
%19 = lshr exact i64 %18, 5
%20 = add nuw nsw i64 %19, 1
%21 = and i64 %20, 1
%22 = icmp eq i64 %18, 0
br i1 %22, label %60, label %23
23: ; preds = %16
%24 = and i64 %20, 1152921504606846974
br label %25
25: ; preds = %25, %23
%26 = phi i64 [ 0, %23 ], [ %57, %25 ]
%27 = phi i64 [ 0, %23 ], [ %58, %25 ]
%28 = getelementptr inbounds i8, i8* %1, i64 %26
%29 = bitcast i8* %28 to <16 x i8>*
%30 = load <16 x i8>, <16 x i8>* %29
%31 = getelementptr inbounds i8, i8* %28, i64 16
%32 = bitcast i8* %31 to <16 x i8>*
%33 = load <16 x i8>, <16 x i8>* %32
%34 = getelementptr inbounds i8, i8* %4, i64 %26
%35 = icmp eq <16 x i8> %30, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%36 = icmp eq <16 x i8> %33, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%37 = select <16 x i1> %35, <16 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <16 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%38 = select <16 x i1> %36, <16 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <16 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%39 = bitcast i8* %34 to <16 x i8>*
store <16 x i8> %37, <16 x i8>* %39
%40 = getelementptr inbounds i8, i8* %34, i64 16
%41 = bitcast i8* %40 to <16 x i8>*
store <16 x i8> %38, <16 x i8>* %41
%42 = or i64 %26, 32
%43 = getelementptr inbounds i8, i8* %1, i64 %42
%44 = bitcast i8* %43 to <16 x i8>*
%45 = load <16 x i8>, <16 x i8>* %44
%46 = getelementptr inbounds i8, i8* %43, i64 16
%47 = bitcast i8* %46 to <16 x i8>*
%48 = load <16 x i8>, <16 x i8>* %47
%49 = getelementptr inbounds i8, i8* %4, i64 %42
%50 = icmp eq <16 x i8> %45, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%51 = icmp eq <16 x i8> %48, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%52 = select <16 x i1> %50, <16 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <16 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%53 = select <16 x i1> %51, <16 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <16 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%54 = bitcast i8* %49 to <16 x i8>*
store <16 x i8> %52, <16 x i8>* %54
%55 = getelementptr inbounds i8, i8* %49, i64 16
%56 = bitcast i8* %55 to <16 x i8>*
store <16 x i8> %53, <16 x i8>* %56
%57 = add nuw i64 %26, 64
%58 = add i64 %27, 2
%59 = icmp eq i64 %58, %24
br i1 %59, label %60, label %25
60: ; preds = %25, %16
%61 = phi i64 [ 0, %16 ], [ %57, %25 ]
%62 = icmp eq i64 %21, 0
br i1 %62, label %78, label %63
63: ; preds = %60
%64 = getelementptr inbounds i8, i8* %1, i64 %61
%65 = bitcast i8* %64 to <16 x i8>*
%66 = load <16 x i8>, <16 x i8>* %65
%67 = getelementptr inbounds i8, i8* %64, i64 16
%68 = bitcast i8* %67 to <16 x i8>*
%69 = load <16 x i8>, <16 x i8>* %68
%70 = getelementptr inbounds i8, i8* %4, i64 %61
%71 = icmp eq <16 x i8> %66, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%72 = icmp eq <16 x i8> %69, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%73 = select <16 x i1> %71, <16 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <16 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%74 = select <16 x i1> %72, <16 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <16 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%75 = bitcast i8* %70 to <16 x i8>*
store <16 x i8> %73, <16 x i8>* %75
%76 = getelementptr inbounds i8, i8* %70, i64 16
%77 = bitcast i8* %76 to <16 x i8>*
store <16 x i8> %74, <16 x i8>* %77
br label %78
78: ; preds = %60, %63
%79 = icmp eq i64 %17, %0
br i1 %79, label %146, label %80
80: ; preds = %78
%81 = and i64 %0, 24
%82 = icmp eq i64 %81, 0
br i1 %82, label %99, label %83
83: ; preds = %14, %80
%84 = phi i64 [ %17, %80 ], [ 0, %14 ]
%85 = and i64 %0, -8
br label %86
86: ; preds = %86, %83
%87 = phi i64 [ %84, %83 ], [ %95, %86 ]
%88 = getelementptr inbounds i8, i8* %1, i64 %87
%89 = bitcast i8* %88 to <8 x i8>*
%90 = load <8 x i8>, <8 x i8>* %89
%91 = getelementptr inbounds i8, i8* %4, i64 %87
%92 = icmp eq <8 x i8> %90, <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>
%93 = select <8 x i1> %92, <8 x i8> <i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9, i8 9>, <8 x i8> <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%94 = bitcast i8* %91 to <8 x i8>*
store <8 x i8> %93, <8 x i8>* %94
%95 = add nuw i64 %87, 8
%96 = icmp eq i64 %95, %85
br i1 %96, label %97, label %86
97: ; preds = %86
%98 = icmp eq i64 %85, %0
br i1 %98, label %146, label %99
99: ; preds = %8, %6, %80, %97
%100 = phi i64 [ 0, %6 ], [ 0, %8 ], [ %17, %80 ], [ %85, %97 ]
%101 = xor i64 %100, -1
%102 = add i64 %101, %0
%103 = and i64 %0, 3
%104 = icmp eq i64 %103, 0
br i1 %104, label %116, label %105
105: ; preds = %99, %105
%106 = phi i64 [ %113, %105 ], [ %100, %99 ]
%107 = phi i64 [ %114, %105 ], [ 0, %99 ]
%108 = getelementptr inbounds i8, i8* %1, i64 %106
%109 = load i8, i8* %108
%110 = getelementptr inbounds i8, i8* %4, i64 %106
%111 = icmp eq i8 %109, 9
%112 = select i1 %111, i8 9, i8 32
store i8 %112, i8* %110
%113 = add nuw i64 %106, 1
%114 = add i64 %107, 1
%115 = icmp eq i64 %114, %103
br i1 %115, label %116, label %105
116: ; preds = %105, %99
%117 = phi i64 [ %100, %99 ], [ %113, %105 ]
%118 = icmp ult i64 %102, 3
br i1 %118, label %146, label %119
119: ; preds = %116, %119
%120 = phi i64 [ %144, %119 ], [ %117, %116 ]
%121 = getelementptr inbounds i8, i8* %1, i64 %120
%122 = load i8, i8* %121
%123 = getelementptr inbounds i8, i8* %4, i64 %120
%124 = icmp eq i8 %122, 9
%125 = select i1 %124, i8 9, i8 32
store i8 %125, i8* %123
%126 = add nuw i64 %120, 1
%127 = getelementptr inbounds i8, i8* %1, i64 %126
%128 = load i8, i8* %127
%129 = getelementptr inbounds i8, i8* %4, i64 %126
%130 = icmp eq i8 %128, 9
%131 = select i1 %130, i8 9, i8 32
store i8 %131, i8* %129
%132 = add nuw i64 %120, 2
%133 = getelementptr inbounds i8, i8* %1, i64 %132
%134 = load i8, i8* %133
%135 = getelementptr inbounds i8, i8* %4, i64 %132
%136 = icmp eq i8 %134, 9
%137 = select i1 %136, i8 9, i8 32
store i8 %137, i8* %135
%138 = add nuw i64 %120, 3
%139 = getelementptr inbounds i8, i8* %1, i64 %138
%140 = load i8, i8* %139
%141 = getelementptr inbounds i8, i8* %4, i64 %138
%142 = icmp eq i8 %140, 9
%143 = select i1 %142, i8 9, i8 32
store i8 %143, i8* %141
%144 = add nuw i64 %120, 4
%145 = icmp eq i64 %144, %0
br i1 %145, label %146, label %119
146: ; preds = %116, %119, %78, %97, %2
%147 = getelementptr inbounds i8, i8* %4, i64 %0
store i8 94, i8* %147
%148 = add i64 %0, 1
%149 = getelementptr inbounds i8, i8* %4, i64 %148
store i8 0, i8* %149
ret i8* %4
}