#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 */
scalar_t__ isnormal(double);
void scalegraph(double **gp, int *getgraph, int anz, long no, double *zmin,
                double *zmax) {
  int i, init = 0;
  long j;
  double dz, *lgp;
  for (i = 0; (getgraph[i] == 0) && (i < anz); i++)
    ;
  if (i == anz)
    return;
  for (; i < anz; i++) {
    if (getgraph[i] != 0) {
      lgp = gp[i] - 1;
      for (j = 0; j < no; j++) {
        if (init == 0) {
          if (isnormal(*(lgp + 1))) {
            *zmin = *zmax = *(lgp + 1);
            init = 1;
          }
        } else {
          if (*(++lgp) < *zmin)
            if (isnormal(*lgp))
              *zmin = *lgp;
          if (*lgp > *zmax)
            if (isnormal(*lgp))
              *zmax = *lgp;
        }
      }
    }
  }
  dz = (*zmax - *zmin) / 50;
  if (dz == 0)
    dz = 1;
  *zmax += dz;
  *zmin -= dz;
}


x86 assembly (clang, -O0):
<scalegraph>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x10(%rbp),%rcx
movslq -0x34(%rbp),%rdx
xor    %eax,%eax
cmpl   $0x0,(%rcx,%rdx,4)
mov    %al,-0x51(%rbp)
jne    1160 <scalegraph+0x50>
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
setl   %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    1170 <scalegraph+0x60>
jmp    1183 <scalegraph+0x73>
jmp    1175 <scalegraph+0x65>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    113d <scalegraph+0x2d>
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jne    1194 <scalegraph+0x84>
jmp    135b <scalegraph+0x24b>
jmp    1199 <scalegraph+0x89>
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12ef <scalegraph+0x1df>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     12dc <scalegraph+0x1cc>
mov    -0x8(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x50(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    12d7 <scalegraph+0x1c7>
cmpl   $0x0,-0x38(%rbp)
jne    1228 <scalegraph+0x118>
mov    -0x50(%rbp),%rax
movsd  0x8(%rax),%xmm0
call   1030 <isnormal@plt>
cmp    $0x0,%rax
je     1223 <scalegraph+0x113>
mov    -0x50(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x1,-0x38(%rbp)
jmp    12c1 <scalegraph+0x1b1>
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x50(%rbp)
movsd  0x8(%rax),%xmm1
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    127a <scalegraph+0x16a>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
call   1030 <isnormal@plt>
cmp    $0x0,%rax
je     1275 <scalegraph+0x165>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    127a <scalegraph+0x16a>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
ucomisd (%rax),%xmm0
jbe    12bc <scalegraph+0x1ac>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
call   1030 <isnormal@plt>
cmp    $0x0,%rax
je     12b7 <scalegraph+0x1a7>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    12bc <scalegraph+0x1ac>
jmp    12c1 <scalegraph+0x1b1>
jmp    12c6 <scalegraph+0x1b6>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    11d3 <scalegraph+0xc3>
jmp    12dc <scalegraph+0x1cc>
jmp    12e1 <scalegraph+0x1d1>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1199 <scalegraph+0x89>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x28(%rbp),%rax
subsd  (%rax),%xmm0
movsd  0xcf9(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1335 <scalegraph+0x225>
jp     1335 <scalegraph+0x225>
movsd  0xcd8(%rip),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x48(%rbp),%xmm0
mov    -0x30(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<scalegraph>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %r9,%rbx
mov    %r8,(%rsp)
mov    %rcx,%r15
mov    %rdi,0x8(%rsp)
movslq %edx,%rdi
mov    $0xffffffffffffffff,%rbp
nopw   0x0(%rax,%rax,1)
mov    0x4(%rsi,%rbp,4),%eax
add    $0x1,%rbp
test   %eax,%eax
jne    1151 <scalegraph+0x41>
cmp    %rdi,%rbp
jl     1140 <scalegraph+0x30>
cmp    %ebp,%edx
je     12ae <scalegraph+0x19e>
cmp    %edx,%ebp
jge    1262 <scalegraph+0x152>
mov    %edx,%edx
mov    %rdx,0x10(%rsp)
xor    %r13d,%r13d
mov    %r15,0x20(%rsp)
mov    %rsi,0x18(%rsp)
test   %eax,%eax
je     1240 <scalegraph+0x130>
nopl   (%rax)
test   %r15,%r15
jle    1240 <scalegraph+0x130>
mov    0x8(%rsp),%rax
mov    (%rax,%rbp,8),%r14
add    $0xfffffffffffffff8,%r14
jmp    11ad <scalegraph+0x9d>
nopl   0x0(%rax,%rax,1)
mov    %r12,%r14
add    $0xffffffffffffffff,%r15
je     1240 <scalegraph+0x130>
lea    0x8(%r14),%r12
movsd  0x8(%r14),%xmm0
test   %r13d,%r13d
je     1210 <scalegraph+0x100>
mov    (%rsp),%rax
movsd  (%rax),%xmm1
ucomisd %xmm0,%xmm1
jbe    11e2 <scalegraph+0xd2>
call   1030 <isnormal@plt>
test   %rax,%rax
je     11e2 <scalegraph+0xd2>
movsd  (%r12),%xmm0
mov    (%rsp),%rax
movsd  %xmm0,(%rax)
movsd  (%r12),%xmm0
mov    $0x1,%r13d
ucomisd (%rbx),%xmm0
jbe    11a0 <scalegraph+0x90>
call   1030 <isnormal@plt>
test   %rax,%rax
je     11a0 <scalegraph+0x90>
movsd  (%r12),%xmm0
movsd  %xmm0,(%rbx)
jmp    11a0 <scalegraph+0x90>
nopw   0x0(%rax,%rax,1)
call   1030 <isnormal@plt>
test   %rax,%rax
je     1237 <scalegraph+0x127>
movsd  (%r12),%xmm0
movsd  %xmm0,(%rbx)
mov    (%rsp),%rax
movsd  %xmm0,(%rax)
mov    $0x1,%r13d
jmp    11a3 <scalegraph+0x93>
xor    %r13d,%r13d
jmp    11a3 <scalegraph+0x93>
nop
add    $0x1,%rbp
cmp    0x10(%rsp),%rbp
mov    0x20(%rsp),%r15
mov    0x18(%rsp),%rax
je     1262 <scalegraph+0x152>
mov    (%rax,%rbp,4),%eax
test   %eax,%eax
jne    1180 <scalegraph+0x70>
jmp    1240 <scalegraph+0x130>
mov    %rbx,%rax
movsd  (%rbx),%xmm0
movapd %xmm0,%xmm1
mov    (%rsp),%rbx
subsd  (%rbx),%xmm1
divsd  0xd83(%rip),%xmm1
xorpd  %xmm2,%xmm2
cmpeqsd %xmm1,%xmm2
movsd  0xd7a(%rip),%xmm3
andpd  %xmm2,%xmm3
andnpd %xmm1,%xmm2
orpd   %xmm2,%xmm3
addsd  %xmm3,%xmm0
movsd  %xmm0,(%rax)
movsd  (%rbx),%xmm0
subsd  %xmm3,%xmm0
movsd  %xmm0,(%rbx)
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @scalegraph(double** nocapture %0, i32* nocapture %1, i32 %2, i64 %3, double* nocapture %4, double* nocapture %5) {
%7 = sext i32 %2 to i64
br label %8
8: ; preds = %8, %6
%9 = phi i64 [ %15, %8 ], [ 0, %6 ]
%10 = getelementptr inbounds i32, i32* %1, i64 %9
%11 = load i32, i32* %10
%12 = icmp eq i32 %11, 0
%13 = icmp slt i64 %9, %7
%14 = select i1 %12, i1 %13, i1 false
%15 = add nuw nsw i64 %9, 1
br i1 %14, label %8, label %16
16: ; preds = %8
%17 = trunc i64 %9 to i32
%18 = icmp eq i32 %17, %2
br i1 %18, label %85, label %19
19: ; preds = %16
%20 = icmp slt i32 %17, %2
br i1 %20, label %21, label %75
21: ; preds = %19
%22 = icmp slt i64 %3, 1
%23 = zext i32 %2 to i64
br label %24
24: ; preds = %72, %21
%25 = phi i32 [ %11, %21 ], [ %74, %72 ]
%26 = phi i64 [ %9, %21 ], [ %70, %72 ]
%27 = phi i32 [ 0, %21 ], [ %69, %72 ]
%28 = icmp eq i32 %25, 0
%29 = or i1 %28, %22
br i1 %29, label %68, label %30
30: ; preds = %24
%31 = getelementptr inbounds double*, double** %0, i64 %26
%32 = load double*, double** %31
%33 = getelementptr inbounds double, double* %32, i64 -1
br label %34
34: ; preds = %30, %63
%35 = phi double* [ %65, %63 ], [ %33, %30 ]
%36 = phi i64 [ %66, %63 ], [ 0, %30 ]
%37 = phi i32 [ %64, %63 ], [ %27, %30 ]
%38 = icmp eq i32 %37, 0
%39 = getelementptr inbounds double, double* %35, i64 1
%40 = load double, double* %39
br i1 %38, label %41, label %46
41: ; preds = %34
%42 = tail call i64 @isnormal(double %40)
%43 = icmp eq i64 %42, 0
br i1 %43, label %63, label %44
44: ; preds = %41
%45 = load double, double* %39
store double %45, double* %5
store double %45, double* %4
br label %63
46: ; preds = %34
%47 = load double, double* %4
%48 = fcmp olt double %40, %47
br i1 %48, label %49, label %54
49: ; preds = %46
%50 = tail call i64 @isnormal(double %40)
%51 = icmp eq i64 %50, 0
br i1 %51, label %54, label %52
52: ; preds = %49
%53 = load double, double* %39
store double %53, double* %4
br label %54
54: ; preds = %49, %52, %46
%55 = load double, double* %39
%56 = load double, double* %5
%57 = fcmp ogt double %55, %56
br i1 %57, label %58, label %63
58: ; preds = %54
%59 = tail call i64 @isnormal(double %55)
%60 = icmp eq i64 %59, 0
br i1 %60, label %63, label %61
61: ; preds = %58
%62 = load double, double* %39
store double %62, double* %5
br label %63
63: ; preds = %44, %41, %58, %61, %54
%64 = phi i32 [ 1, %44 ], [ 0, %41 ], [ 1, %61 ], [ 1, %58 ], [ 1, %54 ]
%65 = phi double* [ %35, %44 ], [ %35, %41 ], [ %39, %61 ], [ %39, %58 ], [ %39, %54 ]
%66 = add nuw nsw i64 %36, 1
%67 = icmp eq i64 %66, %3
br i1 %67, label %68, label %34
68: ; preds = %63, %24
%69 = phi i32 [ %27, %24 ], [ %64, %63 ]
%70 = add nuw nsw i64 %26, 1
%71 = icmp eq i64 %70, %23
br i1 %71, label %75, label %72
72: ; preds = %68
%73 = getelementptr inbounds i32, i32* %1, i64 %70
%74 = load i32, i32* %73
br label %24
75: ; preds = %68, %19
%76 = load double, double* %5
%77 = load double, double* %4
%78 = fsub double %76, %77
%79 = fdiv double %78, 5.000000e+01
%80 = fcmp oeq double %79, 0.000000e+00
%81 = select i1 %80, double 1.000000e+00, double %79
%82 = fadd double %76, %81
store double %82, double* %5
%83 = load double, double* %4
%84 = fsub double %83, %81
store double %84, double* %4
br label %85
85: ; preds = %16, %75
ret void
}