#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 */
typedef int /*<<< orphan*/ a;

/* Variables and functions */
int abs(int);
int /*<<< orphan*/ printf(char *, int);
int main(int argc, char *argv[]) {
  int a[] = {3, 2, 5, 6, 11, 13, 40, 66, 34, 12, 90, 100, 78, 44, 34, 22, 25};
  int size = sizeof(a) / sizeof(a[0]);
  int max = 0;
  for (int i = 0; i < size; i++)
    for (int j = i + 1; j < size; j++)
      if (abs(a[i] - a[j]) > max)
        max = abs(a[i] - a[j]);
  printf("Max Gap is %d\n", max);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    -0x60(%rbp),%rdi
lea    0xeaf(%rip),%rsi
mov    $0x44,%edx
call   1050 <memcpy@plt>
movl   $0x11,-0x64(%rbp)
movl   $0x0,-0x68(%rbp)
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    11ed <main+0xbd>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    11da <main+0xaa>
movslq -0x6c(%rbp),%rax
mov    -0x60(%rbp,%rax,4),%edi
movslq -0x70(%rbp),%rax
sub    -0x60(%rbp,%rax,4),%edi
call   1030 <abs@plt>
cmp    -0x68(%rbp),%eax
jle    11c7 <main+0x97>
movslq -0x6c(%rbp),%rax
mov    -0x60(%rbp,%rax,4),%edi
movslq -0x70(%rbp),%rax
sub    -0x60(%rbp,%rax,4),%edi
call   1030 <abs@plt>
mov    %eax,-0x68(%rbp)
jmp    11cc <main+0x9c>
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
jmp    1185 <main+0x55>
jmp    11df <main+0xaf>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1170 <main+0x40>
mov    -0x68(%rbp),%esi
lea    0xe4d(%rip),%rdi
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r14
push   %rbx
xor    %r8d,%r8d
mov    $0x1,%edi
mov    $0x10,%r9d
lea    0xeeb(%rip),%rdx
lea    0xed0(%rip),%r10
xor    %esi,%esi
jmp    1156 <main+0x46>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rdi
add    $0xffffffffffffffff,%r9
add    $0x4,%rdx
cmp    $0x11,%r8
je     12a3 <main+0x193>
mov    %r8,%rax
add    $0x1,%r8
cmp    $0xf,%rax
ja     1140 <main+0x30>
mov    $0x10,%r11d
sub    %rax,%r11
mov    (%r10,%rax,4),%ebp
cmp    $0x8,%r11
jae    1180 <main+0x70>
mov    %rdi,%rax
jmp    1279 <main+0x169>
xchg   %ax,%ax
mov    %r9,%rbx
and    $0xfffffffffffffff8,%rbx
mov    %r11,%r14
and    $0xfffffffffffffff8,%r14
lea    (%rdi,%r14,1),%rax
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm0
movd   %ebp,%xmm1
pshufd $0x0,%xmm1,%xmm2
xor    %esi,%esi
movdqa %xmm0,%xmm1
nopw   0x0(%rax,%rax,1)
movdqu -0x10(%rdx,%rsi,4),%xmm3
movdqu (%rdx,%rsi,4),%xmm4
movdqa %xmm2,%xmm5
psubd  %xmm3,%xmm5
movdqa %xmm2,%xmm3
psubd  %xmm4,%xmm3
movdqa %xmm5,%xmm4
psrad  $0x1f,%xmm4
paddd  %xmm4,%xmm5
pxor   %xmm4,%xmm5
movdqa %xmm3,%xmm4
psrad  $0x1f,%xmm4
paddd  %xmm4,%xmm3
pxor   %xmm4,%xmm3
movdqa %xmm5,%xmm4
pcmpgtd %xmm0,%xmm4
pand   %xmm4,%xmm5
pandn  %xmm0,%xmm4
movdqa %xmm4,%xmm0
por    %xmm5,%xmm0
movdqa %xmm3,%xmm4
pcmpgtd %xmm1,%xmm4
pand   %xmm4,%xmm3
pandn  %xmm1,%xmm4
movdqa %xmm4,%xmm1
por    %xmm3,%xmm1
add    $0x8,%rsi
cmp    %rsi,%rbx
jne    11b0 <main+0xa0>
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm0
pandn  %xmm1,%xmm2
por    %xmm0,%xmm2
pshufd $0xee,%xmm2,%xmm0
movdqa %xmm2,%xmm1
pcmpgtd %xmm0,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm0,%xmm1
por    %xmm2,%xmm1
pshufd $0x55,%xmm1,%xmm0
movdqa %xmm1,%xmm2
pcmpgtd %xmm0,%xmm2
pand   %xmm2,%xmm1
pandn  %xmm0,%xmm2
por    %xmm1,%xmm2
movd   %xmm2,%esi
cmp    %r14,%r11
je     1140 <main+0x30>
shl    $0x2,%rax
mov    %esi,%ebx
nop
mov    %ebp,%ecx
sub    (%rax,%r10,1),%ecx
mov    %ecx,%esi
neg    %esi
cmovs  %ecx,%esi
cmp    %ebx,%esi
cmovle %ebx,%esi
add    $0x4,%rax
mov    %esi,%ebx
cmp    $0x44,%rax
jne    1280 <main+0x170>
jmp    1140 <main+0x30>
lea    0xd9a(%rip),%rdi
call   1030 <printf@plt>
xor    %eax,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
@__const.main.a = [17 x i32] [i32 3, i32 2, i32 5, i32 6, i32 11, i32 13, i32 40, i32 66, i32 34, i32 12, i32 90, i32 100, i32 78, i32 44, i32 34, i32 22, i32 25]
@.str = [15 x i8] c"Max Gap is %d\0A\00"
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca [17 x i32]
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%11 = bitcast [17 x i32]* %6 to i8*
store i32 17, i32* %7
store i32 0, i32* %8
store i32 0, i32* %9
br label %12
12: ; preds = %52, %2
%13 = load i32, i32* %9
%14 = load i32, i32* %7
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %55
16: ; preds = %12
%17 = load i32, i32* %9
%18 = add nsw i32 %17, 1
store i32 %18, i32* %10
br label %19
19: ; preds = %48, %16
%20 = load i32, i32* %10
%21 = load i32, i32* %7
%22 = icmp slt i32 %20, %21
br i1 %22, label %23, label %51
23: ; preds = %19
%24 = load i32, i32* %9
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [17 x i32], [17 x i32]* %6, i64 0, i64 %25
%27 = load i32, i32* %26
%28 = load i32, i32* %10
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [17 x i32], [17 x i32]* %6, i64 0, i64 %29
%31 = load i32, i32* %30
%32 = sub nsw i32 %27, %31
%33 = call i32 @abs(i32 %32)
%34 = load i32, i32* %8
%35 = icmp sgt i32 %33, %34
br i1 %35, label %36, label %47
36: ; preds = %23
%37 = load i32, i32* %9
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds [17 x i32], [17 x i32]* %6, i64 0, i64 %38
%40 = load i32, i32* %39
%41 = load i32, i32* %10
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds [17 x i32], [17 x i32]* %6, i64 0, i64 %42
%44 = load i32, i32* %43
%45 = sub nsw i32 %40, %44
%46 = call i32 @abs(i32 %45)
store i32 %46, i32* %8
br label %47
47: ; preds = %36, %23
br label %48
48: ; preds = %47
%49 = load i32, i32* %10
%50 = add nsw i32 %49, 1
store i32 %50, i32* %10
br label %19
51: ; preds = %19
br label %52
52: ; preds = %51
%53 = load i32, i32* %9
%54 = add nsw i32 %53, 1
store i32 %54, i32* %9
br label %12
55: ; preds = %12
%56 = load i32, i32* %8
%57 = call i32 @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0), i32 %56)
ret i32 0
}

LLVM IR (-O2):
@__const.main.a = [17 x i32] [i32 3, i32 2, i32 5, i32 6, i32 11, i32 13, i32 40, i32 66, i32 34, i32 12, i32 90, i32 100, i32 78, i32 44, i32 34, i32 22, i32 25]
@.str = [15 x i8] c"Max Gap is %d\0A\00"
define i32 @main(i32 %0, i8** nocapture readnone %1) {
br label %9
3: ; preds = %58, %50, %9
%4 = phi i32 [ %12, %9 ], [ %53, %50 ], [ %66, %58 ]
%5 = add nuw nsw i64 %11, 1
%6 = icmp eq i64 %14, 17
br i1 %6, label %7, label %9
7: ; preds = %3
%8 = tail call i32 @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0), i32 %4)
ret i32 0
9: ; preds = %2, %3
%10 = phi i64 [ 0, %2 ], [ %14, %3 ]
%11 = phi i64 [ 1, %2 ], [ %5, %3 ]
%12 = phi i32 [ 0, %2 ], [ %4, %3 ]
%13 = sub nsw i64 16, %10
%14 = add nuw nsw i64 %10, 1
%15 = icmp ult i64 %10, 16
br i1 %15, label %16, label %3
16: ; preds = %9
%17 = getelementptr inbounds [17 x i32], [17 x i32]* @__const.main.a, i64 0, i64 %10
%18 = load i32, i32* %17
%19 = icmp ult i64 %13, 8
br i1 %19, label %55, label %20
20: ; preds = %16
%21 = and i64 %13, -8
%22 = add i64 %11, %21
%23 = insertelement <4 x i32> poison, i32 %12, i64 0
%24 = shufflevector <4 x i32> %23, <4 x i32> poison, <4 x i32> zeroinitializer
%25 = insertelement <4 x i32> poison, i32 %18, i64 0
%26 = shufflevector <4 x i32> %25, <4 x i32> poison, <4 x i32> zeroinitializer
%27 = insertelement <4 x i32> poison, i32 %18, i64 0
%28 = shufflevector <4 x i32> %27, <4 x i32> poison, <4 x i32> zeroinitializer
br label %29
29: ; preds = %29, %20
%30 = phi i64 [ 0, %20 ], [ %48, %29 ]
%31 = phi <4 x i32> [ %24, %20 ], [ %46, %29 ]
%32 = phi <4 x i32> [ %24, %20 ], [ %47, %29 ]
%33 = add i64 %11, %30
%34 = getelementptr inbounds [17 x i32], [17 x i32]* @__const.main.a, i64 0, i64 %33
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = getelementptr inbounds i32, i32* %34, i64 4
%38 = bitcast i32* %37 to <4 x i32>*
%39 = load <4 x i32>, <4 x i32>* %38
%40 = sub nsw <4 x i32> %26, %36
%41 = sub nsw <4 x i32> %28, %39
%42 = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %40, i1 true)
%43 = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %41, i1 true)
%44 = icmp sgt <4 x i32> %42, %31
%45 = icmp sgt <4 x i32> %43, %32
%46 = select <4 x i1> %44, <4 x i32> %42, <4 x i32> %31
%47 = select <4 x i1> %45, <4 x i32> %43, <4 x i32> %32
%48 = add nuw i64 %30, 8
%49 = icmp eq i64 %48, %21
br i1 %49, label %50, label %29
50: ; preds = %29
%51 = icmp sgt <4 x i32> %46, %47
%52 = select <4 x i1> %51, <4 x i32> %46, <4 x i32> %47
%53 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %52)
%54 = icmp eq i64 %13, %21
br i1 %54, label %3, label %55
55: ; preds = %16, %50
%56 = phi i64 [ %11, %16 ], [ %22, %50 ]
%57 = phi i32 [ %12, %16 ], [ %53, %50 ]
br label %58
58: ; preds = %55, %58
%59 = phi i64 [ %67, %58 ], [ %56, %55 ]
%60 = phi i32 [ %66, %58 ], [ %57, %55 ]
%61 = getelementptr inbounds [17 x i32], [17 x i32]* @__const.main.a, i64 0, i64 %59
%62 = load i32, i32* %61
%63 = sub nsw i32 %18, %62
%64 = tail call i32 @llvm.abs.i32(i32 %63, i1 true)
%65 = icmp sgt i32 %64, %60
%66 = select i1 %65, i32 %64, i32 %60
%67 = add nuw nsw i64 %59, 1
%68 = icmp eq i64 %67, 17
br i1 %68, label %3, label %58
}