#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 */
float fabs(double);
int idamax(int n, float dx[], int incx) {
  float dmax;
  int i, ix, itemp;
  if (n < 1)
    return (-1);
  if (n == 1)
    return (0);
  if (incx != 1) {
    ix = 1;
    dmax = fabs((double)dx[0]);
    ix = ix + incx;
    for (i = 1; i < n; i++) {
      if (fabs((double)dx[ix]) > dmax) {
        itemp = i;
        dmax = fabs((double)dx[ix]);
      }
      ix = ix + incx;
    }
  } else {
    itemp = 0;
    dmax = fabs((double)dx[0]);
    for (i = 1; i < n; i++) {
      if (fabs((double)dx[i]) > dmax) {
        itemp = i;
        dmax = fabs((double)dx[i]);
      }
    }
  }
  return (itemp);
}


x86 assembly (clang, -O0):
<idamax>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cmpl   $0x1,-0x8(%rbp)
jge    1138 <idamax+0x28>
movl   $0xffffffff,-0x4(%rbp)
jmp    127d <idamax+0x16d>
cmpl   $0x1,-0x8(%rbp)
jne    114e <idamax+0x3e>
movl   $0x0,-0x4(%rbp)
jmp    127d <idamax+0x16d>
cmpl   $0x1,-0x14(%rbp)
je     11ee <idamax+0xde>
movl   $0x1,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11e9 <idamax+0xd9>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss -0x18(%rbp),%xmm0
jbe    11d2 <idamax+0xc2>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1185 <idamax+0x75>
jmp    1277 <idamax+0x167>
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1272 <idamax+0x162>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss -0x18(%rbp),%xmm0
jbe    125f <idamax+0x14f>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x18(%rbp)
jmp    1264 <idamax+0x154>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1212 <idamax+0x102>
jmp    1277 <idamax+0x167>
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<idamax>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
test   %edi,%edi
jle    1192 <idamax+0x82>
mov    %edi,%ebp
xor    %ebx,%ebx
cmp    $0x1,%edi
je     1197 <idamax+0x87>
mov    %edx,%r15d
mov    %rsi,%r13
movss  (%rsi),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
cmp    $0x1,%r15d
jne    11a8 <idamax+0x98>
mov    %ebp,%r15d
add    $0xffffffffffffffff,%r15
cmp    $0x2,%ebp
jne    11d6 <idamax+0xc6>
xor    %ebx,%ebx
mov    $0x1,%ebp
test   $0x1,%r15b
je     1197 <idamax+0x87>
movss  %xmm0,0xc(%rsp)
movss  0x0(%r13,%rbp,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss 0xc(%rsp),%xmm0
jbe    1197 <idamax+0x87>
movss  0x0(%r13,%rbp,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
mov    %ebp,%ebx
jmp    1197 <idamax+0x87>
mov    $0xffffffff,%ebx
mov    %ebx,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0x1(%r15),%eax
movslq %eax,%r14
lea    -0x1(%rbp),%eax
cmp    $0x2,%ebp
mov    %eax,0x14(%rsp)
jne    1276 <idamax+0x166>
mov    $0x1,%r15d
testb  $0x1,0x14(%rsp)
jne    134e <idamax+0x23e>
mov    0x10(%rsp),%ebx
jmp    1197 <idamax+0x87>
mov    %r15,%r14
and    $0xfffffffffffffffe,%r14
neg    %r14
xor    %ebx,%ebx
mov    $0x1,%ebp
jmp    1206 <idamax+0xf6>
nopl   0x0(%rax)
lea    (%r14,%rbp,1),%rax
add    $0x2,%rax
add    $0x2,%rbp
cmp    $0x1,%rax
je     115b <idamax+0x4b>
movss  %xmm0,0xc(%rsp)
movss  0x0(%r13,%rbp,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss 0xc(%rsp),%xmm0
movss  0xc(%rsp),%xmm0
jbe    123b <idamax+0x12b>
movss  0x0(%r13,%rbp,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
mov    %ebp,%ebx
movss  %xmm0,0xc(%rsp)
movss  0x4(%r13,%rbp,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss 0xc(%rsp),%xmm0
movss  0xc(%rsp),%xmm0
jbe    11f0 <idamax+0xe0>
movss  0x4(%r13,%rbp,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
lea    0x1(%rbp),%ebx
jmp    11f0 <idamax+0xe0>
movslq %r15d,%rbp
lea    0x0(,%rbp,4),%rcx
add    %r13,%rcx
mov    %rcx,0x18(%rsp)
and    $0xfffffffe,%eax
neg    %eax
mov    %rax,0x20(%rsp)
mov    $0x1,%r12d
mov    %r14,%rbx
jmp    12c4 <idamax+0x1b4>
xchg   %ax,%ax
add    %rbp,%r14
mov    %r12d,%r15d
add    $0x2,%r15d
mov    0x20(%rsp),%rax
add    %r12d,%eax
add    $0x2,%eax
mov    %r14,%rbx
mov    %r15d,%r12d
cmp    $0x1,%eax
je     11c5 <idamax+0xb5>
movss  %xmm0,0xc(%rsp)
movss  0x0(%r13,%rbx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss 0xc(%rsp),%xmm0
movss  0xc(%rsp),%xmm0
jbe    12ff <idamax+0x1ef>
movss  0x0(%r13,%rbx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
mov    %r12d,%eax
mov    %r12d,0x10(%rsp)
movss  %xmm0,0xc(%rsp)
lea    (%rbx,%rbp,1),%r14
mov    0x18(%rsp),%rax
movss  (%rax,%rbx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss 0xc(%rsp),%xmm0
movss  0xc(%rsp),%xmm0
jbe    12a0 <idamax+0x190>
lea    0x1(%r12),%eax
mov    %eax,0x10(%rsp)
mov    0x18(%rsp),%rax
movss  (%rax,%rbx,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
jmp    12a0 <idamax+0x190>
movss  %xmm0,0xc(%rsp)
movss  0x0(%r13,%r14,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
ucomiss 0xc(%rsp),%xmm0
mov    0x10(%rsp),%ebx
jbe    1197 <idamax+0x87>
movss  0x0(%r13,%r14,4),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <fabs@plt>
mov    %r15d,%ebx
jmp    1197 <idamax+0x87>

LLVM IR (-O0):
define i32 @idamax(i32 %0, float* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca float*
%7 = alloca i32
%8 = alloca float
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i32 %0, i32* %5
store float* %1, float** %6
store i32 %2, i32* %7
%12 = load i32, i32* %5
%13 = icmp slt i32 %12, 1
br i1 %13, label %14, label %15
14: ; preds = %3
store i32 -1, i32* %4
br label %98
15: ; preds = %3
%16 = load i32, i32* %5
%17 = icmp eq i32 %16, 1
br i1 %17, label %18, label %19
18: ; preds = %15
store i32 0, i32* %4
br label %98
19: ; preds = %15
%20 = load i32, i32* %7
%21 = icmp ne i32 %20, 1
br i1 %21, label %22, label %62
22: ; preds = %19
store i32 1, i32* %10
%23 = load float*, float** %6
%24 = getelementptr inbounds float, float* %23, i64 0
%25 = load float, float* %24
%26 = fpext float %25 to double
%27 = call float @fabs(double %26)
store float %27, float* %8
%28 = load i32, i32* %10
%29 = load i32, i32* %7
%30 = add nsw i32 %28, %29
store i32 %30, i32* %10
store i32 1, i32* %9
br label %31
31: ; preds = %58, %22
%32 = load i32, i32* %9
%33 = load i32, i32* %5
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %61
35: ; preds = %31
%36 = load float*, float** %6
%37 = load i32, i32* %10
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds float, float* %36, i64 %38
%40 = load float, float* %39
%41 = fpext float %40 to double
%42 = call float @fabs(double %41)
%43 = load float, float* %8
%44 = fcmp ogt float %42, %43
br i1 %44, label %45, label %54
45: ; preds = %35
%46 = load i32, i32* %9
store i32 %46, i32* %11
%47 = load float*, float** %6
%48 = load i32, i32* %10
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds float, float* %47, i64 %49
%51 = load float, float* %50
%52 = fpext float %51 to double
%53 = call float @fabs(double %52)
store float %53, float* %8
br label %54
54: ; preds = %45, %35
%55 = load i32, i32* %10
%56 = load i32, i32* %7
%57 = add nsw i32 %55, %56
store i32 %57, i32* %10
br label %58
58: ; preds = %54
%59 = load i32, i32* %9
%60 = add nsw i32 %59, 1
store i32 %60, i32* %9
br label %31
61: ; preds = %31
br label %96
62: ; preds = %19
store i32 0, i32* %11
%63 = load float*, float** %6
%64 = getelementptr inbounds float, float* %63, i64 0
%65 = load float, float* %64
%66 = fpext float %65 to double
%67 = call float @fabs(double %66)
store float %67, float* %8
store i32 1, i32* %9
br label %68
68: ; preds = %92, %62
%69 = load i32, i32* %9
%70 = load i32, i32* %5
%71 = icmp slt i32 %69, %70
br i1 %71, label %72, label %95
72: ; preds = %68
%73 = load float*, float** %6
%74 = load i32, i32* %9
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds float, float* %73, i64 %75
%77 = load float, float* %76
%78 = fpext float %77 to double
%79 = call float @fabs(double %78)
%80 = load float, float* %8
%81 = fcmp ogt float %79, %80
br i1 %81, label %82, label %91
82: ; preds = %72
%83 = load i32, i32* %9
store i32 %83, i32* %11
%84 = load float*, float** %6
%85 = load i32, i32* %9
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds float, float* %84, i64 %86
%88 = load float, float* %87
%89 = fpext float %88 to double
%90 = call float @fabs(double %89)
store float %90, float* %8
br label %91
91: ; preds = %82, %72
br label %92
92: ; preds = %91
%93 = load i32, i32* %9
%94 = add nsw i32 %93, 1
store i32 %94, i32* %9
br label %68
95: ; preds = %68
br label %96
96: ; preds = %95, %61
%97 = load i32, i32* %11
store i32 %97, i32* %4
br label %98
98: ; preds = %96, %18, %14
%99 = load i32, i32* %4
ret i32 %99
}

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