void _remove_option_in_av(int *ac, char ***av, int *idx_in_av_for_remove,
                          int size_of_tab) {
  int i;
  int j;
  for (i = 0; i < size_of_tab; ++i) {
    for (j = idx_in_av_for_remove[i]; j < *ac; ++j)
      (*av)[j] = (*av)[j + 1];
    --(*ac);
    for (j = i + 1; j < size_of_tab; ++j)
      --idx_in_av_for_remove[j];
  }
}


x86 assembly (clang, -O0):
<_remove_option_in_av>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11c6 <_remove_option_in_av+0xc6>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x8(%rbp),%rcx
cmp    (%rcx),%eax
jge    1174 <_remove_option_in_av+0x74>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    -0x24(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1134 <_remove_option_in_av+0x34>
mov    -0x8(%rbp),%rax
mov    (%rax),%ecx
add    $0xffffffff,%ecx
mov    %ecx,(%rax)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11b3 <_remove_option_in_av+0xb3>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0xffffffff,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1188 <_remove_option_in_av+0x88>
jmp    11b8 <_remove_option_in_av+0xb8>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    111a <_remove_option_in_av+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_remove_option_in_av>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %ecx,%ecx
jle    12e2 <_remove_option_in_av+0x1e2>
mov    %ecx,%r15d
lea    0x34(%rdx),%r12
lea    -0x9(%r15),%r8
mov    $0x1,%r9d
xor    %r10d,%r10d
pcmpeqd %xmm0,%xmm0
jmp    1145 <_remove_option_in_av+0x45>
nopl   0x0(%rax)
add    $0x1,%r9
add    $0x4,%r12
add    $0xffffffffffffffff,%r8
cmp    %r15,%r10
je     12e2 <_remove_option_in_av+0x1e2>
mov    %r10,%r11
movslq (%rdx,%r10,4),%rbx
movslq (%rdi),%r10
cmp    %r10d,%ebx
jge    11cf <_remove_option_in_av+0xcf>
mov    %r10d,%ecx
sub    %ebx,%ecx
mov    %rbx,%r14
not    %r14
add    %r10,%r14
and    $0x3,%rcx
je     1214 <_remove_option_in_av+0x114>
nopl   0x0(%rax)
mov    (%rsi),%r13
lea    0x1(%rbx),%rax
mov    0x8(%r13,%rbx,8),%rbp
mov    %rbp,0x0(%r13,%rbx,8)
mov    %rax,%rbx
add    $0xffffffffffffffff,%rcx
jne    1170 <_remove_option_in_av+0x70>
cmp    $0x3,%r14
jb     11cf <_remove_option_in_av+0xcf>
mov    (%rsi),%rcx
mov    0x8(%rcx,%rax,8),%rbx
mov    %rbx,(%rcx,%rax,8)
mov    (%rsi),%rcx
mov    0x10(%rcx,%rax,8),%rbx
mov    %rbx,0x8(%rcx,%rax,8)
mov    (%rsi),%rcx
mov    0x18(%rcx,%rax,8),%rbx
mov    %rbx,0x10(%rcx,%rax,8)
mov    (%rsi),%rcx
mov    0x20(%rcx,%rax,8),%rbx
mov    %rbx,0x18(%rcx,%rax,8)
lea    0x4(%rax),%rcx
mov    %rcx,%rax
cmp    %rcx,%r10
jne    1190 <_remove_option_in_av+0x90>
add    $0xffffffff,%r10d
mov    %r10d,(%rdi)
lea    0x1(%r11),%r10
cmp    %r15,%r10
jae    1130 <_remove_option_in_av+0x30>
not    %r11
lea    (%r11,%r15,1),%r14
mov    %r9,%rax
cmp    $0x8,%r14
jb     12d0 <_remove_option_in_av+0x1d0>
lea    (%r11,%r15,1),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,%r11
shr    $0x3,%r11
add    $0x1,%r11
cmp    $0x8,%rax
jae    1223 <_remove_option_in_av+0x123>
xor    %ebx,%ebx
jmp    1290 <_remove_option_in_av+0x190>
mov    %rbx,%rax
cmp    $0x3,%r14
jae    1190 <_remove_option_in_av+0x90>
jmp    11cf <_remove_option_in_av+0xcf>
mov    %r8,%rax
shr    $0x3,%rax
add    $0x1,%rax
and    $0xfffffffffffffffe,%rax
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqu -0x30(%r12,%rbx,4),%xmm1
movdqu -0x20(%r12,%rbx,4),%xmm2
movdqu -0x10(%r12,%rbx,4),%xmm3
movdqu (%r12,%rbx,4),%xmm4
paddd  %xmm0,%xmm1
paddd  %xmm0,%xmm2
movdqu %xmm1,-0x30(%r12,%rbx,4)
movdqu %xmm2,-0x20(%r12,%rbx,4)
paddd  %xmm0,%xmm3
paddd  %xmm0,%xmm4
movdqu %xmm3,-0x10(%r12,%rbx,4)
movdqu %xmm4,(%r12,%rbx,4)
add    $0x10,%rbx
add    $0xfffffffffffffffe,%rax
jne    1240 <_remove_option_in_av+0x140>
mov    %r14,%rax
and    $0xfffffffffffffff8,%rax
test   $0x1,%r11b
je     12be <_remove_option_in_av+0x1be>
add    %r9,%rbx
movdqu (%rdx,%rbx,4),%xmm1
movdqu 0x10(%rdx,%rbx,4),%xmm2
paddd  %xmm0,%xmm1
paddd  %xmm0,%xmm2
movdqu %xmm1,(%rdx,%rbx,4)
movdqu %xmm2,0x10(%rdx,%rbx,4)
cmp    %rax,%r14
je     1130 <_remove_option_in_av+0x30>
add    %r9,%rax
nopw   0x0(%rax,%rax,1)
addl   $0xffffffff,(%rdx,%rax,4)
add    $0x1,%rax
cmp    %rax,%r15
jne    12d0 <_remove_option_in_av+0x1d0>
jmp    1130 <_remove_option_in_av+0x30>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @_remove_option_in_av(i32* %0, i8*** %1, i32* %2, i32 %3) {
%5 = alloca i32*
%6 = alloca i8***
%7 = alloca i32*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i32* %0, i32** %5
store i8*** %1, i8**** %6
store i32* %2, i32** %7
store i32 %3, i32* %8
store i32 0, i32* %9
br label %11
11: ; preds = %63, %4
%12 = load i32, i32* %9
%13 = load i32, i32* %8
%14 = icmp slt i32 %12, %13
br i1 %14, label %15, label %66
15: ; preds = %11
%16 = load i32*, i32** %7
%17 = load i32, i32* %9
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i32, i32* %16, i64 %18
%20 = load i32, i32* %19
store i32 %20, i32* %10
br label %21
21: ; preds = %39, %15
%22 = load i32, i32* %10
%23 = load i32*, i32** %5
%24 = load i32, i32* %23
%25 = icmp slt i32 %22, %24
br i1 %25, label %26, label %42
26: ; preds = %21
%27 = load i8***, i8**** %6
%28 = load i8**, i8*** %27
%29 = load i32, i32* %10
%30 = add nsw i32 %29, 1
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8*, i8** %28, i64 %31
%33 = load i8*, i8** %32
%34 = load i8***, i8**** %6
%35 = load i8**, i8*** %34
%36 = load i32, i32* %10
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8*, i8** %35, i64 %37
store i8* %33, i8** %38
br label %39
39: ; preds = %26
%40 = load i32, i32* %10
%41 = add nsw i32 %40, 1
store i32 %41, i32* %10
br label %21
42: ; preds = %21
%43 = load i32*, i32** %5
%44 = load i32, i32* %43
%45 = add nsw i32 %44, -1
store i32 %45, i32* %43
%46 = load i32, i32* %9
%47 = add nsw i32 %46, 1
store i32 %47, i32* %10
br label %48
48: ; preds = %59, %42
%49 = load i32, i32* %10
%50 = load i32, i32* %8
%51 = icmp slt i32 %49, %50
br i1 %51, label %52, label %62
52: ; preds = %48
%53 = load i32*, i32** %7
%54 = load i32, i32* %10
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i32, i32* %53, i64 %55
%57 = load i32, i32* %56
%58 = add nsw i32 %57, -1
store i32 %58, i32* %56
br label %59
59: ; preds = %52
%60 = load i32, i32* %10
%61 = add nsw i32 %60, 1
store i32 %61, i32* %10
br label %48
62: ; preds = %48
br label %63
63: ; preds = %62
%64 = load i32, i32* %9
%65 = add nsw i32 %64, 1
store i32 %65, i32* %9
br label %11
66: ; preds = %11
ret void
}

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