void limit_merge(int arr[], int copy[], int low, int mid, int high, int size) {
  int i, j, k, l, s = size;
  l = low;
  i = 0;
  j = mid + 1;
  while ((l <= mid) && (j <= high) && (s > 0)) {
    if (arr[l] <= arr[j]) {
      copy[i] = arr[l];
      l++;
    } else {
      copy[i] = arr[j];
      j++;
    }
    i++;
    s--;
  }
  if (s != 0) {
    if (l > mid) {
      for (k = j; k <= high; k++) {
        copy[i] = arr[k];
        i++;
        s--;
        if (s > 0)
          break;
      }
    } else {
      for (k = l; k <= mid; k++) {
        copy[i] = arr[k];
        i++;
        s--;
        if (s > 0)
          break;
      }
    }
  }
}


x86 assembly (clang, -O0):
<limit_merge>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x30(%rbp),%ecx
xor    %eax,%eax
cmp    -0x18(%rbp),%ecx
mov    %al,-0x35(%rbp)
jg     1162 <limit_merge+0x62>
mov    -0x28(%rbp),%ecx
xor    %eax,%eax
cmp    -0x1c(%rbp),%ecx
mov    %al,-0x35(%rbp)
jg     1162 <limit_merge+0x62>
cmpl   $0x0,-0x34(%rbp)
setg   %al
mov    %al,-0x35(%rbp)
mov    -0x35(%rbp),%al
test   $0x1,%al
jne    1172 <limit_merge+0x72>
jmp    11e8 <limit_merge+0xe8>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0x28(%rbp),%rdx
cmp    (%rcx,%rdx,4),%eax
jg     11b2 <limit_merge+0xb2>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11d1 <limit_merge+0xd1>
mov    -0x8(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
jmp    1136 <limit_merge+0x36>
cmpl   $0x0,-0x34(%rbp)
je     12c5 <limit_merge+0x1c5>
mov    -0x30(%rbp),%eax
cmp    -0x18(%rbp),%eax
jle    125f <limit_merge+0x15f>
mov    -0x28(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jg     125a <limit_merge+0x15a>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jle    1247 <limit_merge+0x147>
jmp    125a <limit_merge+0x15a>
jmp    124c <limit_merge+0x14c>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1204 <limit_merge+0x104>
jmp    12c0 <limit_merge+0x1c0>
mov    -0x30(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jg     12bb <limit_merge+0x1bb>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jle    12a8 <limit_merge+0x1a8>
jmp    12bb <limit_merge+0x1bb>
jmp    12ad <limit_merge+0x1ad>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1265 <limit_merge+0x165>
jmp    12c0 <limit_merge+0x1c0>
jmp    12c5 <limit_merge+0x1c5>
pop    %rbp
ret

x86 assembly (clang, -O2):
<limit_merge>:
push   %rbp
push   %r15
push   %r14
push   %rbx
lea    0x1(%rcx),%r11d
xor    %r10d,%r10d
cmp    %ecx,%edx
jle    1120 <limit_merge+0x20>
test   %r9d,%r9d
jne    1171 <limit_merge+0x71>
jmp    11d4 <limit_merge+0xd4>
nopl   0x0(%rax,%rax,1)
cmp    %r8d,%r11d
setle  %bl
test   %r9d,%r9d
setg   %al
and    %bl,%al
cmp    $0x1,%al
jne    1168 <limit_merge+0x68>
movslq %edx,%rdx
mov    (%rdi,%rdx,4),%ebp
movslq %r11d,%rbx
mov    (%rdi,%rbx,4),%r14d
xor    %r15d,%r15d
xor    %ebx,%ebx
cmp    %r14d,%ebp
setle  %r15b
setg   %bl
cmovg  %r14d,%ebp
add    %ebx,%r11d
add    %r15d,%edx
mov    %ebp,(%rsi,%r10,4)
add    $0x1,%r10
add    $0xffffffff,%r9d
cmp    %ecx,%edx
jle    1120 <limit_merge+0x20>
test   %r9d,%r9d
je     11d4 <limit_merge+0xd4>
test   %al,%al
je     11a7 <limit_merge+0xa7>
cmp    %r8d,%r11d
jg     11d4 <limit_merge+0xd4>
movslq %r11d,%rcx
mov    %r10d,%eax
lea    (%rsi,%rax,4),%rax
lea    (%rdi,%rcx,4),%rcx
sub    %r11d,%r8d
add    $0x1,%r8d
xor    %edx,%edx
nopl   (%rax)
mov    (%rcx,%rdx,4),%esi
mov    %esi,(%rax,%rdx,4)
cmp    $0x1,%r9d
jg     11d4 <limit_merge+0xd4>
add    $0x1,%rdx
cmp    %edx,%r8d
jne    1190 <limit_merge+0x90>
jmp    11d4 <limit_merge+0xd4>
cmp    %ecx,%edx
jg     11d4 <limit_merge+0xd4>
movslq %edx,%rbp
mov    %r10d,%eax
lea    (%rsi,%rax,4),%rax
lea    (%rdi,%rbp,4),%rsi
sub    %edx,%ecx
add    $0x1,%ecx
xor    %edx,%edx
mov    (%rsi,%rdx,4),%edi
mov    %edi,(%rax,%rdx,4)
cmp    $0x1,%r9d
jg     11d4 <limit_merge+0xd4>
add    $0x1,%rdx
cmp    %edx,%ecx
jne    11c0 <limit_merge+0xc0>
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @limit_merge(i32* nocapture %0, i32* nocapture writeonly %1, i32 %2, i32 %3, i32 %4, i32 %5) {
%7 = add i32 %3, 1
%8 = icmp sgt i32 %2, %3
br i1 %8, label %45, label %9
9: ; preds = %6, %18
%10 = phi i64 [ %33, %18 ], [ 0, %6 ]
%11 = phi i32 [ %35, %18 ], [ %5, %6 ]
%12 = phi i32 [ %31, %18 ], [ %2, %6 ]
%13 = phi i32 [ %28, %18 ], [ %7, %6 ]
%14 = phi i32 [ %34, %18 ], [ 0, %6 ]
%15 = icmp sle i32 %13, %4
%16 = icmp sgt i32 %11, 0
%17 = select i1 %15, i1 %16, i1 false
br i1 %17, label %18, label %37
18: ; preds = %9
%19 = sext i32 %12 to i64
%20 = getelementptr inbounds i32, i32* %0, i64 %19
%21 = load i32, i32* %20
%22 = sext i32 %13 to i64
%23 = getelementptr inbounds i32, i32* %0, i64 %22
%24 = load i32, i32* %23
%25 = icmp sgt i32 %21, %24
%26 = select i1 %25, i32 %24, i32 %21
%27 = zext i1 %25 to i32
%28 = add nsw i32 %13, %27
%29 = xor i1 %25, true
%30 = zext i1 %29 to i32
%31 = add nsw i32 %12, %30
%32 = getelementptr inbounds i32, i32* %1, i64 %10
store i32 %26, i32* %32
%33 = add nuw nsw i64 %10, 1
%34 = add nuw nsw i32 %14, 1
%35 = add nsw i32 %11, -1
%36 = icmp sgt i32 %31, %3
br i1 %36, label %39, label %9
37: ; preds = %9
%38 = trunc i64 %10 to i32
br label %39
39: ; preds = %18, %37
%40 = phi i32 [ %38, %37 ], [ %34, %18 ]
%41 = phi i32 [ %13, %37 ], [ %28, %18 ]
%42 = phi i32 [ %12, %37 ], [ %31, %18 ]
%43 = phi i32 [ %11, %37 ], [ %35, %18 ]
%44 = icmp eq i32 %43, 0
br i1 %44, label %86, label %47
45: ; preds = %6
%46 = icmp eq i32 %5, 0
br i1 %46, label %86, label %54
47: ; preds = %39
br i1 %17, label %54, label %48
48: ; preds = %47
%49 = icmp sgt i32 %42, %3
br i1 %49, label %86, label %50
50: ; preds = %48
%51 = sext i32 %42 to i64
%52 = zext i32 %40 to i64
%53 = icmp sgt i32 %43, 1
br label %75
54: ; preds = %45, %47
%55 = phi i32 [ %40, %47 ], [ 0, %45 ]
%56 = phi i32 [ %41, %47 ], [ %7, %45 ]
%57 = phi i32 [ %43, %47 ], [ %5, %45 ]
%58 = icmp sgt i32 %56, %4
br i1 %58, label %86, label %59
59: ; preds = %54
%60 = sext i32 %56 to i64
%61 = zext i32 %55 to i64
%62 = add i32 %4, 1
%63 = icmp sgt i32 %57, 1
br label %64
64: ; preds = %59, %70
%65 = phi i64 [ %61, %59 ], [ %71, %70 ]
%66 = phi i64 [ %60, %59 ], [ %72, %70 ]
%67 = getelementptr inbounds i32, i32* %0, i64 %66
%68 = load i32, i32* %67
%69 = getelementptr inbounds i32, i32* %1, i64 %65
store i32 %68, i32* %69
br i1 %63, label %86, label %70
70: ; preds = %64
%71 = add nuw nsw i64 %65, 1
%72 = add nsw i64 %66, 1
%73 = trunc i64 %72 to i32
%74 = icmp eq i32 %62, %73
br i1 %74, label %86, label %64
75: ; preds = %50, %81
%76 = phi i64 [ %52, %50 ], [ %82, %81 ]
%77 = phi i64 [ %51, %50 ], [ %83, %81 ]
%78 = getelementptr inbounds i32, i32* %0, i64 %77
%79 = load i32, i32* %78
%80 = getelementptr inbounds i32, i32* %1, i64 %76
store i32 %79, i32* %80
br i1 %53, label %86, label %81
81: ; preds = %75
%82 = add nuw nsw i64 %76, 1
%83 = add nsw i64 %77, 1
%84 = trunc i64 %83 to i32
%85 = icmp eq i32 %7, %84
br i1 %85, label %86, label %75
86: ; preds = %81, %75, %70, %64, %45, %48, %54, %39
ret void
}