int border(int array[5][5]) {
  int i, sum = 0;
  for (i = 0; i < 5; i++)
    sum += array[0][i] + array[5 - 1][i];
  for (i = 1; i < 5 - 1; i++)
    sum += array[i][0] + array[i][5 - 1];
  return sum;
}


x86 assembly (clang, -O0):
<border>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x5,-0xc(%rbp)
jge    114b <border+0x4b>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
add    0x50(%rcx,%rdx,4),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1116 <border+0x16>
movl   $0x1,-0xc(%rbp)
cmpl   $0x4,-0xc(%rbp)
jge    1193 <border+0x93>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
imul   $0x14,%rcx,%rcx
add    %rcx,%rax
mov    (%rax),%eax
mov    -0x8(%rbp),%rcx
movslq -0xc(%rbp),%rdx
imul   $0x14,%rdx,%rdx
add    %rdx,%rcx
add    0x10(%rcx),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1152 <border+0x52>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<border>:
movdqu 0x50(%rdi),%xmm0
movd   0x10(%rdi),%xmm1
movd   0x14(%rdi),%xmm2
punpckldq %xmm1,%xmm2
movd   0x28(%rdi),%xmm1
movd   0x3c(%rdi),%xmm3
punpckldq %xmm1,%xmm3
punpcklqdq %xmm2,%xmm3
paddd  %xmm0,%xmm3
movd   (%rdi),%xmm0
movd   0x4(%rdi),%xmm1
punpckldq %xmm0,%xmm1
movd   0x8(%rdi),%xmm0
movd   0xc(%rdi),%xmm2
punpckldq %xmm0,%xmm2
punpcklqdq %xmm1,%xmm2
movd   0x4c(%rdi),%xmm0
movd   0x38(%rdi),%xmm1
punpckldq %xmm0,%xmm1
movd   0x24(%rdi),%xmm0
movd   0x60(%rdi),%xmm4
punpckldq %xmm0,%xmm4
punpcklqdq %xmm1,%xmm4
paddd  %xmm2,%xmm4
paddd  %xmm3,%xmm4
pshufd $0xee,%xmm4,%xmm0
paddd  %xmm4,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
ret

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

LLVM IR (-O2):
define i32 @border([5 x i32]* nocapture %0) {
%2 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 0, i64 0
%3 = load i32, i32* %2
%4 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 4, i64 0
%5 = bitcast i32* %4 to <4 x i32>*
%6 = load <4 x i32>, <4 x i32>* %5
%7 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 0, i64 1
%8 = load i32, i32* %7
%9 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 0, i64 2
%10 = load i32, i32* %9
%11 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 0, i64 3
%12 = load i32, i32* %11
%13 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 0, i64 4
%14 = load i32, i32* %13
%15 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 4, i64 4
%16 = load i32, i32* %15
%17 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 1, i64 0
%18 = load i32, i32* %17
%19 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 1, i64 4
%20 = load i32, i32* %19
%21 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 2, i64 0
%22 = load i32, i32* %21
%23 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 2, i64 4
%24 = load i32, i32* %23
%25 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 3, i64 0
%26 = load i32, i32* %25
%27 = getelementptr inbounds [5 x i32], [5 x i32]* %0, i64 3, i64 4
%28 = load i32, i32* %27
%29 = insertelement <16 x i32> poison, i32 %26, i64 0
%30 = insertelement <16 x i32> %29, i32 %22, i64 1
%31 = insertelement <16 x i32> %30, i32 %18, i64 2
%32 = insertelement <16 x i32> %31, i32 %14, i64 3
%33 = insertelement <16 x i32> %32, i32 %12, i64 4
%34 = insertelement <16 x i32> %33, i32 %10, i64 5
%35 = insertelement <16 x i32> %34, i32 %8, i64 6
%36 = insertelement <16 x i32> %35, i32 %3, i64 7
%37 = shufflevector <4 x i32> %6, <4 x i32> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
%38 = shufflevector <16 x i32> %36, <16 x i32> %37, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 undef, i32 undef, i32 undef, i32 undef>
%39 = insertelement <16 x i32> %38, i32 %16, i64 12
%40 = insertelement <16 x i32> %39, i32 %20, i64 13
%41 = insertelement <16 x i32> %40, i32 %24, i64 14
%42 = insertelement <16 x i32> %41, i32 %28, i64 15
%43 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %42)
ret i32 %43
}