int maxUD(int *nums) {
  int cur = 0;
  int max = 0;
  for (int p = 0; p + 60 < 400; p++) {
    cur = nums[p] * nums[p + 20] * nums[p + 40] * nums[p + 60];
    if (cur > max)
      max = cur;
  }
  return max;
}


x86 assembly (clang, -O0):
<maxUD>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0x3c,%eax
cmp    $0x190,%eax
jge    1194 <maxUD+0x94>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    $0x14,%edx
movslq %edx,%rdx
imul   (%rcx,%rdx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    $0x28,%edx
movslq %edx,%rdx
imul   (%rcx,%rdx,4),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    $0x3c,%edx
movslq %edx,%rdx
imul   (%rcx,%rdx,4),%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jle    1181 <maxUD+0x81>
mov    -0xc(%rbp),%eax
mov    %eax,-0x10(%rbp)
jmp    1186 <maxUD+0x86>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    111d <maxUD+0x1d>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<maxUD>:
pxor   %xmm0,%xmm0
mov    $0x40,%eax
pxor   %xmm1,%xmm1
nopl   (%rax)
movdqu -0x100(%rdi,%rax,4),%xmm3
ff ff
movdqu -0xf0(%rdi,%rax,4),%xmm4
ff ff
movdqu -0xb0(%rdi,%rax,4),%xmm5
ff ff
movdqu -0xa0(%rdi,%rax,4),%xmm2
ff ff
pshufd $0xf5,%xmm3,%xmm6
pshufd $0xf5,%xmm5,%xmm7
pmuludq %xmm6,%xmm7
pmuludq %xmm3,%xmm5
pshufd $0xf5,%xmm4,%xmm3
pshufd $0xf5,%xmm2,%xmm6
pmuludq %xmm3,%xmm6
pmuludq %xmm4,%xmm2
movdqu -0x60(%rdi,%rax,4),%xmm3
movdqu -0x50(%rdi,%rax,4),%xmm8
pshufd $0xf5,%xmm3,%xmm4
pmuludq %xmm7,%xmm4
pmuludq %xmm3,%xmm5
pshufd $0xf5,%xmm8,%xmm3
pmuludq %xmm6,%xmm3
pmuludq %xmm8,%xmm2
movdqu -0x10(%rdi,%rax,4),%xmm6
movdqu (%rdi,%rax,4),%xmm7
pmuludq %xmm6,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pshufd $0xf5,%xmm6,%xmm6
pmuludq %xmm4,%xmm6
pshufd $0xe8,%xmm6,%xmm4
punpckldq %xmm4,%xmm5
pmuludq %xmm7,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm7,%xmm4
pmuludq %xmm3,%xmm4
pshufd $0xe8,%xmm4,%xmm3
punpckldq %xmm3,%xmm2
movdqa %xmm5,%xmm3
pcmpgtd %xmm0,%xmm3
pand   %xmm3,%xmm5
pandn  %xmm0,%xmm3
movdqa %xmm3,%xmm0
por    %xmm5,%xmm0
movdqa %xmm2,%xmm3
pcmpgtd %xmm1,%xmm3
pand   %xmm3,%xmm2
pandn  %xmm1,%xmm3
movdqa %xmm3,%xmm1
por    %xmm2,%xmm1
add    $0x8,%rax
cmp    $0x190,%rax
jne    1110 <maxUD+0x10>
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,%eax
mov    0x590(%rdi),%ecx
imul   0x540(%rdi),%ecx
imul   0x5e0(%rdi),%ecx
mov    0x594(%rdi),%edx
imul   0x630(%rdi),%ecx
cmp    %eax,%ecx
cmovle %eax,%ecx
imul   0x544(%rdi),%edx
imul   0x5e4(%rdi),%edx
imul   0x634(%rdi),%edx
cmp    %ecx,%edx
cmovle %ecx,%edx
mov    0x598(%rdi),%ecx
imul   0x548(%rdi),%ecx
imul   0x5e8(%rdi),%ecx
imul   0x638(%rdi),%ecx
cmp    %edx,%ecx
cmovle %edx,%ecx
mov    0x59c(%rdi),%eax
imul   0x54c(%rdi),%eax
imul   0x5ec(%rdi),%eax
imul   0x63c(%rdi),%eax
cmp    %ecx,%eax
cmovle %ecx,%eax
ret

LLVM IR (-O0):
define i32 @maxUD(i32* %0) {
%2 = alloca i32*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32* %0, i32** %2
store i32 0, i32* %3
store i32 0, i32* %4
store i32 0, i32* %5
br label %6
6: ; preds = %43, %1
%7 = load i32, i32* %5
%8 = add nsw i32 %7, 60
%9 = icmp slt i32 %8, 400
br i1 %9, label %10, label %46
10: ; preds = %6
%11 = load i32*, i32** %2
%12 = load i32, i32* %5
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i32, i32* %11, i64 %13
%15 = load i32, i32* %14
%16 = load i32*, i32** %2
%17 = load i32, i32* %5
%18 = add nsw i32 %17, 20
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %16, i64 %19
%21 = load i32, i32* %20
%22 = mul nsw i32 %15, %21
%23 = load i32*, i32** %2
%24 = load i32, i32* %5
%25 = add nsw i32 %24, 40
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i32, i32* %23, i64 %26
%28 = load i32, i32* %27
%29 = mul nsw i32 %22, %28
%30 = load i32*, i32** %2
%31 = load i32, i32* %5
%32 = add nsw i32 %31, 60
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i32, i32* %30, i64 %33
%35 = load i32, i32* %34
%36 = mul nsw i32 %29, %35
store i32 %36, i32* %3
%37 = load i32, i32* %3
%38 = load i32, i32* %4
%39 = icmp sgt i32 %37, %38
br i1 %39, label %40, label %42
40: ; preds = %10
%41 = load i32, i32* %3
store i32 %41, i32* %4
br label %42
42: ; preds = %40, %10
br label %43
43: ; preds = %42
%44 = load i32, i32* %5
%45 = add nsw i32 %44, 1
store i32 %45, i32* %5
br label %6
46: ; preds = %6
%47 = load i32, i32* %4
ret i32 %47
}

LLVM IR (-O2):
define i32 @maxUD(i32* nocapture %0) {
br label %2
2: ; preds = %2, %1
%3 = phi i64 [ 0, %1 ], [ %43, %2 ]
%4 = phi <4 x i32> [ zeroinitializer, %1 ], [ %41, %2 ]
%5 = phi <4 x i32> [ zeroinitializer, %1 ], [ %42, %2 ]
%6 = add nuw nsw i64 %3, 60
%7 = getelementptr inbounds i32, i32* %0, i64 %3
%8 = bitcast i32* %7 to <4 x i32>*
%9 = load <4 x i32>, <4 x i32>* %8
%10 = getelementptr inbounds i32, i32* %7, i64 4
%11 = bitcast i32* %10 to <4 x i32>*
%12 = load <4 x i32>, <4 x i32>* %11
%13 = add nuw nsw i64 %3, 20
%14 = getelementptr inbounds i32, i32* %0, i64 %13
%15 = bitcast i32* %14 to <4 x i32>*
%16 = load <4 x i32>, <4 x i32>* %15
%17 = getelementptr inbounds i32, i32* %14, i64 4
%18 = bitcast i32* %17 to <4 x i32>*
%19 = load <4 x i32>, <4 x i32>* %18
%20 = mul nsw <4 x i32> %16, %9
%21 = mul nsw <4 x i32> %19, %12
%22 = add nuw nsw i64 %3, 40
%23 = getelementptr inbounds i32, i32* %0, i64 %22
%24 = bitcast i32* %23 to <4 x i32>*
%25 = load <4 x i32>, <4 x i32>* %24
%26 = getelementptr inbounds i32, i32* %23, i64 4
%27 = bitcast i32* %26 to <4 x i32>*
%28 = load <4 x i32>, <4 x i32>* %27
%29 = mul nsw <4 x i32> %20, %25
%30 = mul nsw <4 x i32> %21, %28
%31 = getelementptr inbounds i32, i32* %0, i64 %6
%32 = bitcast i32* %31 to <4 x i32>*
%33 = load <4 x i32>, <4 x i32>* %32
%34 = getelementptr inbounds i32, i32* %31, i64 4
%35 = bitcast i32* %34 to <4 x i32>*
%36 = load <4 x i32>, <4 x i32>* %35
%37 = mul nsw <4 x i32> %29, %33
%38 = mul nsw <4 x i32> %30, %36
%39 = icmp sgt <4 x i32> %37, %4
%40 = icmp sgt <4 x i32> %38, %5
%41 = select <4 x i1> %39, <4 x i32> %37, <4 x i32> %4
%42 = select <4 x i1> %40, <4 x i32> %38, <4 x i32> %5
%43 = add nuw i64 %3, 8
%44 = icmp eq i64 %43, 336
br i1 %44, label %45, label %2
45: ; preds = %2
%46 = icmp sgt <4 x i32> %41, %42
%47 = select <4 x i1> %46, <4 x i32> %41, <4 x i32> %42
%48 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %47)
%49 = getelementptr inbounds i32, i32* %0, i64 336
%50 = load i32, i32* %49
%51 = getelementptr inbounds i32, i32* %0, i64 356
%52 = load i32, i32* %51
%53 = mul nsw i32 %52, %50
%54 = getelementptr inbounds i32, i32* %0, i64 376
%55 = load i32, i32* %54
%56 = mul nsw i32 %53, %55
%57 = getelementptr inbounds i32, i32* %0, i64 396
%58 = load i32, i32* %57
%59 = mul nsw i32 %56, %58
%60 = icmp sgt i32 %59, %48
%61 = select i1 %60, i32 %59, i32 %48
%62 = getelementptr inbounds i32, i32* %0, i64 337
%63 = load i32, i32* %62
%64 = getelementptr inbounds i32, i32* %0, i64 357
%65 = load i32, i32* %64
%66 = mul nsw i32 %65, %63
%67 = getelementptr inbounds i32, i32* %0, i64 377
%68 = load i32, i32* %67
%69 = mul nsw i32 %66, %68
%70 = getelementptr inbounds i32, i32* %0, i64 397
%71 = load i32, i32* %70
%72 = mul nsw i32 %69, %71
%73 = icmp sgt i32 %72, %61
%74 = select i1 %73, i32 %72, i32 %61
%75 = getelementptr inbounds i32, i32* %0, i64 338
%76 = load i32, i32* %75
%77 = getelementptr inbounds i32, i32* %0, i64 358
%78 = load i32, i32* %77
%79 = mul nsw i32 %78, %76
%80 = getelementptr inbounds i32, i32* %0, i64 378
%81 = load i32, i32* %80
%82 = mul nsw i32 %79, %81
%83 = getelementptr inbounds i32, i32* %0, i64 398
%84 = load i32, i32* %83
%85 = mul nsw i32 %82, %84
%86 = icmp sgt i32 %85, %74
%87 = select i1 %86, i32 %85, i32 %74
%88 = getelementptr inbounds i32, i32* %0, i64 339
%89 = load i32, i32* %88
%90 = getelementptr inbounds i32, i32* %0, i64 359
%91 = load i32, i32* %90
%92 = mul nsw i32 %91, %89
%93 = getelementptr inbounds i32, i32* %0, i64 379
%94 = load i32, i32* %93
%95 = mul nsw i32 %92, %94
%96 = getelementptr inbounds i32, i32* %0, i64 399
%97 = load i32, i32* %96
%98 = mul nsw i32 %95, %97
%99 = icmp sgt i32 %98, %87
%100 = select i1 %99, i32 %98, i32 %87
ret i32 %100
}