#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 */

/* Variables and functions */
int /*<<< orphan*/ printf(char *, int, int);
void out(double **result, int images_num, int results_num) {
  int i, j, m;
  for (i = 0; i < images_num; i++) {
    m = result[i][0];
    for (j = 0; j < results_num; j++) {
      if (result[i][j] > result[i][m]) {
        m = j;
      }
    }
    printf("Image %d is symbol %d.\n", i, m);
  }
}


x86 assembly (clang, -O0):
<out>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11c4 <out+0xb4>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11a4 <out+0x94>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1191 <out+0x81>
mov    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1196 <out+0x86>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    114f <out+0x3f>
mov    -0x14(%rbp),%esi
mov    -0x1c(%rbp),%edx
lea    0xe4f(%rip),%rdi
call   1030 <printf@plt>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1129 <out+0x19>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<out>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
test   %esi,%esi
jle    123d <out+0x12d>
mov    %edx,%ebp
mov    %rdi,%r14
mov    %esi,%r12d
mov    %edx,%eax
lea    -0x1(%rax),%r13
add    $0xfffffffffffffffe,%rax
mov    %rax,(%rsp)
mov    %r13d,%r15d
and    $0x3,%r15d
and    $0xfffffffffffffffc,%r13
xor    %ebx,%ebx
jmp    116b <out+0x5b>
nopl   0x0(%rax,%rax,1)
lea    0xea9(%rip),%rdi
mov    %ebx,%esi
call   1030 <printf@plt>
add    $0x1,%rbx
cmp    %r12,%rbx
je     123d <out+0x12d>
mov    (%r14,%rbx,8),%rax
movsd  (%rax),%xmm0
cvttsd2si %xmm0,%edx
test   %ebp,%ebp
jle    1150 <out+0x40>
movslq %edx,%rdx
ucomisd (%rax,%rdx,8),%xmm0
mov    $0x0,%ecx
cmova  %ecx,%edx
cmp    $0x1,%ebp
je     1150 <out+0x40>
mov    $0x1,%ecx
cmpq   $0x3,(%rsp)
jae    11d1 <out+0xc1>
mov    %edx,%esi
mov    %esi,%edx
test   %r15,%r15
je     1150 <out+0x40>
mov    %r15,%rdi
jmp    11bc <out+0xac>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rcx
mov    %edx,%esi
add    $0xffffffffffffffff,%rdi
je     1150 <out+0x40>
movsd  (%rax,%rcx,8),%xmm0
movslq %esi,%rdx
ucomisd (%rax,%rdx,8),%xmm0
mov    %ecx,%edx
ja     11b0 <out+0xa0>
mov    %esi,%edx
jmp    11b0 <out+0xa0>
mov    $0x1,%ecx
xor    %edi,%edi
jmp    11ef <out+0xdf>
nopw   0x0(%rax,%rax,1)
add    $0x4,%rcx
add    $0x4,%rdi
mov    %esi,%edx
cmp    %r13,%rdi
je     119e <out+0x8e>
movslq %edx,%rsi
movsd  (%rax,%rcx,8),%xmm0
ucomisd (%rax,%rsi,8),%xmm0
mov    %ecx,%esi
ja     1202 <out+0xf2>
mov    %edx,%esi
movsd  0x8(%rax,%rcx,8),%xmm0
movslq %esi,%rdx
ucomisd (%rax,%rdx,8),%xmm0
jbe    1215 <out+0x105>
lea    0x1(%rcx),%esi
movsd  0x10(%rax,%rcx,8),%xmm0
movslq %esi,%rdx
ucomisd (%rax,%rdx,8),%xmm0
jbe    1228 <out+0x118>
lea    0x2(%rcx),%esi
movsd  0x18(%rax,%rcx,8),%xmm0
movslq %esi,%rdx
ucomisd (%rax,%rdx,8),%xmm0
jbe    11e0 <out+0xd0>
lea    0x3(%rcx),%esi
jmp    11e0 <out+0xd0>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [24 x i8] c"Image %d is symbol %d.\0A\00"
define void @out(double** nocapture %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %96
5: ; preds = %3
%6 = icmp sgt i32 %2, 0
%7 = zext i32 %1 to i64
%8 = zext i32 %2 to i64
%9 = add nsw i64 %8, -1
%10 = add nsw i64 %8, -2
%11 = icmp eq i32 %2, 1
%12 = and i64 %9, 3
%13 = icmp ult i64 %10, 3
%14 = and i64 %9, -4
%15 = icmp eq i64 %12, 0
br label %16
16: ; preds = %5, %90
%17 = phi i64 [ 0, %5 ], [ %94, %90 ]
%18 = getelementptr inbounds double*, double** %0, i64 %17
%19 = load double*, double** %18
%20 = load double, double* %19
%21 = fptosi double %20 to i32
br i1 %6, label %22, label %90
22: ; preds = %16
%23 = sext i32 %21 to i64
%24 = getelementptr inbounds double, double* %19, i64 %23
%25 = load double, double* %24
%26 = fcmp ogt double %20, %25
%27 = select i1 %26, i32 0, i32 %21
br i1 %11, label %90, label %28
28: ; preds = %22
br i1 %13, label %71, label %29
29: ; preds = %28, %29
%30 = phi i64 [ %68, %29 ], [ 1, %28 ]
%31 = phi i32 [ %67, %29 ], [ %27, %28 ]
%32 = phi i64 [ %69, %29 ], [ 0, %28 ]
%33 = getelementptr inbounds double, double* %19, i64 %30
%34 = load double, double* %33
%35 = sext i32 %31 to i64
%36 = getelementptr inbounds double, double* %19, i64 %35
%37 = load double, double* %36
%38 = fcmp ogt double %34, %37
%39 = trunc i64 %30 to i32
%40 = select i1 %38, i32 %39, i32 %31
%41 = add nuw nsw i64 %30, 1
%42 = getelementptr inbounds double, double* %19, i64 %41
%43 = load double, double* %42
%44 = sext i32 %40 to i64
%45 = getelementptr inbounds double, double* %19, i64 %44
%46 = load double, double* %45
%47 = fcmp ogt double %43, %46
%48 = trunc i64 %41 to i32
%49 = select i1 %47, i32 %48, i32 %40
%50 = add nuw nsw i64 %30, 2
%51 = getelementptr inbounds double, double* %19, i64 %50
%52 = load double, double* %51
%53 = sext i32 %49 to i64
%54 = getelementptr inbounds double, double* %19, i64 %53
%55 = load double, double* %54
%56 = fcmp ogt double %52, %55
%57 = trunc i64 %50 to i32
%58 = select i1 %56, i32 %57, i32 %49
%59 = add nuw nsw i64 %30, 3
%60 = getelementptr inbounds double, double* %19, i64 %59
%61 = load double, double* %60
%62 = sext i32 %58 to i64
%63 = getelementptr inbounds double, double* %19, i64 %62
%64 = load double, double* %63
%65 = fcmp ogt double %61, %64
%66 = trunc i64 %59 to i32
%67 = select i1 %65, i32 %66, i32 %58
%68 = add nuw nsw i64 %30, 4
%69 = add i64 %32, 4
%70 = icmp eq i64 %69, %14
br i1 %70, label %71, label %29
71: ; preds = %29, %28
%72 = phi i32 [ undef, %28 ], [ %67, %29 ]
%73 = phi i64 [ 1, %28 ], [ %68, %29 ]
%74 = phi i32 [ %27, %28 ], [ %67, %29 ]
br i1 %15, label %90, label %75
75: ; preds = %71, %75
%76 = phi i64 [ %87, %75 ], [ %73, %71 ]
%77 = phi i32 [ %86, %75 ], [ %74, %71 ]
%78 = phi i64 [ %88, %75 ], [ 0, %71 ]
%79 = getelementptr inbounds double, double* %19, i64 %76
%80 = load double, double* %79
%81 = sext i32 %77 to i64
%82 = getelementptr inbounds double, double* %19, i64 %81
%83 = load double, double* %82
%84 = fcmp ogt double %80, %83
%85 = trunc i64 %76 to i32
%86 = select i1 %84, i32 %85, i32 %77
%87 = add nuw nsw i64 %76, 1
%88 = add i64 %78, 1
%89 = icmp eq i64 %88, %12
br i1 %89, label %90, label %75
90: ; preds = %71, %75, %22, %16
%91 = phi i32 [ %21, %16 ], [ %27, %22 ], [ %72, %71 ], [ %86, %75 ]
%92 = trunc i64 %17 to i32
%93 = tail call i32 @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str, i64 0, i64 0), i32 %92, i32 %91)
%94 = add nuw nsw i64 %17, 1
%95 = icmp eq i64 %94, %7
br i1 %95, label %96, label %16
96: ; preds = %90, %3
ret void
}