#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__ fabs(float const);
double pow(float const, int);
double sqrt(double);
double fvec_norm(const float *v, long n, double norm) {
  long i;
  double s = 0;
  if (norm == 0)
    return n;
  if (norm == 1) {
    for (i = 0; i < n; i++) {
      s += fabs(v[i]);
    }
    return s;
  }
  if (norm == 2) {
    for (i = 0; i < n; i++) {
      s += v[i] * v[i];
    }
    return sqrt(s);
  }
  for (i = 0; i < n; i++) {
    s += pow(v[i], norm);
  }
  return pow(s, 1 / norm);
}


x86 assembly (clang, -O0):
<fvec_norm>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1175 <fvec_norm+0x45>
jp     1175 <fvec_norm+0x45>
cvtsi2sdq -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12d5 <fvec_norm+0x1a5>
movsd  -0x20(%rbp),%xmm0
movsd  0xe7e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11e9 <fvec_norm+0xb9>
jp     11e9 <fvec_norm+0xb9>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    11da <fvec_norm+0xaa>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
call   1030 <fabs@plt>
cvtsi2sd %rax,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    119a <fvec_norm+0x6a>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12d5 <fvec_norm+0x1a5>
movsd  -0x20(%rbp),%xmm0
movsd  0xe12(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1269 <fvec_norm+0x139>
jp     1269 <fvec_norm+0x139>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    1255 <fvec_norm+0x125>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    120e <fvec_norm+0xde>
movsd  -0x30(%rbp),%xmm0
call   1050 <sqrt@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    12d5 <fvec_norm+0x1a5>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    12b1 <fvec_norm+0x181>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvttsd2si -0x20(%rbp),%edi
call   1040 <pow@plt>
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1271 <fvec_norm+0x141>
movsd  -0x30(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movsd  0xd3e(%rip),%xmm1
divsd  -0x20(%rbp),%xmm1
cvttsd2si %xmm1,%edi
call   1040 <pow@plt>
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fvec_norm>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
movapd %xmm0,%xmm2
mov    %rsi,%r14
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
jne    1164 <fvec_norm+0x34>
jp     1164 <fvec_norm+0x34>
xorps  %xmm0,%xmm0
cvtsi2sd %r14,%xmm0
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rdi,%rbx
ucomisd 0xe91(%rip),%xmm2
jne    1194 <fvec_norm+0x64>
jp     1194 <fvec_norm+0x64>
test   %r14,%r14
jle    11d8 <fvec_norm+0xa8>
lea    -0x1(%r14),%rax
mov    %r14d,%r15d
and    $0x3,%r15d
cmp    $0x3,%rax
jae    11e1 <fvec_norm+0xb1>
xorpd  %xmm0,%xmm0
xor    %ebp,%ebp
jmp    126c <fvec_norm+0x13c>
ucomisd 0xe6c(%rip),%xmm2
jne    12b8 <fvec_norm+0x188>
jp     12b8 <fvec_norm+0x188>
xorpd  %xmm1,%xmm1
xorpd  %xmm0,%xmm0
test   %r14,%r14
jle    137a <fvec_norm+0x24a>
lea    -0x1(%r14),%rcx
mov    %r14d,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    12ec <fvec_norm+0x1bc>
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
jmp    1353 <fvec_norm+0x223>
xorpd  %xmm0,%xmm0
jmp    1157 <fvec_norm+0x27>
and    $0xfffffffffffffffc,%r14
xorpd  %xmm0,%xmm0
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
movsd  %xmm0,(%rsp)
movss  (%rbx,%rbp,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movss  0x4(%rbx,%rbp,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movss  0x8(%rbx,%rbp,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movss  0xc(%rbx,%rbp,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  (%rsp),%xmm0
add    $0x4,%rbp
cmp    %rbp,%r14
jne    11f0 <fvec_norm+0xc0>
test   %r15,%r15
je     1157 <fvec_norm+0x27>
lea    (%rbx,%rbp,4),%rbx
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
movsd  %xmm0,(%rsp)
movss  (%rbx,%rbp,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
movsd  (%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rsp)
movsd  (%rsp),%xmm0
add    $0x1,%rbp
cmp    %rbp,%r15
jne    1280 <fvec_norm+0x150>
jmp    1157 <fvec_norm+0x27>
test   %r14,%r14
jle    139a <fvec_norm+0x26a>
movsd  %xmm2,0x8(%rsp)
cvttsd2si %xmm2,%r12d
lea    -0x1(%r14),%rax
mov    %r14d,%r15d
and    $0x3,%r15d
cmp    $0x3,%rax
jae    13a3 <fvec_norm+0x273>
xorpd  %xmm0,%xmm0
xor    %ebp,%ebp
jmp    1418 <fvec_norm+0x2e8>
and    $0xfffffffffffffffc,%r14
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
movss  (%rbx,%rcx,4),%xmm2
movss  0x4(%rbx,%rcx,4),%xmm3
mulss  %xmm2,%xmm2
cvtss2sd %xmm2,%xmm2
addsd  %xmm0,%xmm2
mulss  %xmm3,%xmm3
xorps  %xmm0,%xmm0
cvtss2sd %xmm3,%xmm0
addsd  %xmm2,%xmm0
movss  0x8(%rbx,%rcx,4),%xmm2
mulss  %xmm2,%xmm2
cvtss2sd %xmm2,%xmm2
addsd  %xmm0,%xmm2
movss  0xc(%rbx,%rcx,4),%xmm0
mulss  %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm2,%xmm0
add    $0x4,%rcx
cmp    %rcx,%r14
jne    1300 <fvec_norm+0x1d0>
test   %rax,%rax
je     137a <fvec_norm+0x24a>
lea    (%rbx,%rcx,4),%rcx
xor    %edx,%edx
xchg   %ax,%ax
movss  (%rcx,%rdx,4),%xmm2
mulss  %xmm2,%xmm2
cvtss2sd %xmm2,%xmm2
addsd  %xmm2,%xmm0
add    $0x1,%rdx
cmp    %rdx,%rax
jne    1360 <fvec_norm+0x230>
ucomisd %xmm1,%xmm0
jb     1389 <fvec_norm+0x259>
sqrtsd %xmm0,%xmm0
jmp    1157 <fvec_norm+0x27>
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1050 <sqrt@plt>
xorpd  %xmm0,%xmm0
jmp    1468 <fvec_norm+0x338>
and    $0xfffffffffffffffc,%r14
xorpd  %xmm0,%xmm0
xor    %ebp,%ebp
nopl   (%rax)
movsd  %xmm0,(%rsp)
movss  (%rbx,%rbp,4),%xmm0
mov    %r12d,%edi
call   1040 <pow@plt>
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movss  0x4(%rbx,%rbp,4),%xmm0
mov    %r12d,%edi
call   1040 <pow@plt>
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movss  0x8(%rbx,%rbp,4),%xmm0
mov    %r12d,%edi
call   1040 <pow@plt>
addsd  (%rsp),%xmm0
movsd  %xmm0,(%rsp)
movss  0xc(%rbx,%rbp,4),%xmm0
mov    %r12d,%edi
call   1040 <pow@plt>
addsd  (%rsp),%xmm0
add    $0x4,%rbp
cmp    %rbp,%r14
jne    13b0 <fvec_norm+0x280>
test   %r15,%r15
je     145e <fvec_norm+0x32e>
lea    (%rbx,%rbp,4),%rbx
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  %xmm0,(%rsp)
movss  (%rbx,%rbp,4),%xmm0
mov    %r12d,%edi
call   1040 <pow@plt>
movsd  (%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rsp)
movsd  (%rsp),%xmm0
add    $0x1,%rbp
cmp    %rbp,%r15
jne    1430 <fvec_norm+0x300>
cvtsd2ss %xmm0,%xmm0
movsd  0x8(%rsp),%xmm2
movsd  0xb90(%rip),%xmm1
divsd  %xmm2,%xmm1
cvttsd2si %xmm1,%edi
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
jmp    1040 <pow@plt>

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

LLVM IR (-O2):
define double @fvec_norm(float* nocapture %0, i64 %1, double %2) {
%4 = fcmp oeq double %2, 0.000000e+00
br i1 %4, label %5, label %7
5: ; preds = %3
%6 = sitofp i64 %1 to double
br label %182
7: ; preds = %3
%8 = fcmp oeq double %2, 1.000000e+00
br i1 %8, label %9, label %47
9: ; preds = %7
%10 = icmp sgt i64 %1, 0
br i1 %10, label %11, label %182
11: ; preds = %9
%12 = add i64 %1, -1
%13 = and i64 %1, 3
%14 = icmp ult i64 %12, 3
br i1 %14, label %165, label %15
15: ; preds = %11
%16 = and i64 %1, -4
br label %17
17: ; preds = %17, %15
%18 = phi double [ 0.000000e+00, %15 ], [ %43, %17 ]
%19 = phi i64 [ 0, %15 ], [ %44, %17 ]
%20 = phi i64 [ 0, %15 ], [ %45, %17 ]
%21 = getelementptr inbounds float, float* %0, i64 %19
%22 = load float, float* %21
%23 = tail call i64 @fabs(float %22)
%24 = sitofp i64 %23 to double
%25 = fadd double %18, %24
%26 = or i64 %19, 1
%27 = getelementptr inbounds float, float* %0, i64 %26
%28 = load float, float* %27
%29 = tail call i64 @fabs(float %28)
%30 = sitofp i64 %29 to double
%31 = fadd double %25, %30
%32 = or i64 %19, 2
%33 = getelementptr inbounds float, float* %0, i64 %32
%34 = load float, float* %33
%35 = tail call i64 @fabs(float %34)
%36 = sitofp i64 %35 to double
%37 = fadd double %31, %36
%38 = or i64 %19, 3
%39 = getelementptr inbounds float, float* %0, i64 %38
%40 = load float, float* %39
%41 = tail call i64 @fabs(float %40)
%42 = sitofp i64 %41 to double
%43 = fadd double %37, %42
%44 = add nuw nsw i64 %19, 4
%45 = add i64 %20, 4
%46 = icmp eq i64 %45, %16
br i1 %46, label %165, label %17
47: ; preds = %7
%48 = fcmp oeq double %2, 2.000000e+00
%49 = icmp sgt i64 %1, 0
br i1 %48, label %58, label %50
50: ; preds = %47
br i1 %49, label %51, label %160
51: ; preds = %50
%52 = fptosi double %2 to i32
%53 = add i64 %1, -1
%54 = and i64 %1, 3
%55 = icmp ult i64 %53, 3
br i1 %55, label %141, label %56
56: ; preds = %51
%57 = and i64 %1, -4
br label %115
58: ; preds = %47
br i1 %49, label %59, label %112
59: ; preds = %58
%60 = add i64 %1, -1
%61 = and i64 %1, 3
%62 = icmp ult i64 %60, 3
br i1 %62, label %95, label %63
63: ; preds = %59
%64 = and i64 %1, -4
br label %65
65: ; preds = %65, %63
%66 = phi double [ 0.000000e+00, %63 ], [ %91, %65 ]
%67 = phi i64 [ 0, %63 ], [ %92, %65 ]
%68 = phi i64 [ 0, %63 ], [ %93, %65 ]
%69 = getelementptr inbounds float, float* %0, i64 %67
%70 = load float, float* %69
%71 = fmul float %70, %70
%72 = fpext float %71 to double
%73 = fadd double %66, %72
%74 = or i64 %67, 1
%75 = getelementptr inbounds float, float* %0, i64 %74
%76 = load float, float* %75
%77 = fmul float %76, %76
%78 = fpext float %77 to double
%79 = fadd double %73, %78
%80 = or i64 %67, 2
%81 = getelementptr inbounds float, float* %0, i64 %80
%82 = load float, float* %81
%83 = fmul float %82, %82
%84 = fpext float %83 to double
%85 = fadd double %79, %84
%86 = or i64 %67, 3
%87 = getelementptr inbounds float, float* %0, i64 %86
%88 = load float, float* %87
%89 = fmul float %88, %88
%90 = fpext float %89 to double
%91 = fadd double %85, %90
%92 = add nuw nsw i64 %67, 4
%93 = add i64 %68, 4
%94 = icmp eq i64 %93, %64
br i1 %94, label %95, label %65
95: ; preds = %65, %59
%96 = phi double [ undef, %59 ], [ %91, %65 ]
%97 = phi double [ 0.000000e+00, %59 ], [ %91, %65 ]
%98 = phi i64 [ 0, %59 ], [ %92, %65 ]
%99 = icmp eq i64 %61, 0
br i1 %99, label %112, label %100
100: ; preds = %95, %100
%101 = phi double [ %108, %100 ], [ %97, %95 ]
%102 = phi i64 [ %109, %100 ], [ %98, %95 ]
%103 = phi i64 [ %110, %100 ], [ 0, %95 ]
%104 = getelementptr inbounds float, float* %0, i64 %102
%105 = load float, float* %104
%106 = fmul float %105, %105
%107 = fpext float %106 to double
%108 = fadd double %101, %107
%109 = add nuw nsw i64 %102, 1
%110 = add i64 %103, 1
%111 = icmp eq i64 %110, %61
br i1 %111, label %112, label %100
112: ; preds = %95, %100, %58
%113 = phi double [ 0.000000e+00, %58 ], [ %96, %95 ], [ %108, %100 ]
%114 = tail call double @sqrt(double %113)
br label %182
115: ; preds = %115, %56
%116 = phi double [ 0.000000e+00, %56 ], [ %137, %115 ]
%117 = phi i64 [ 0, %56 ], [ %138, %115 ]
%118 = phi i64 [ 0, %56 ], [ %139, %115 ]
%119 = getelementptr inbounds float, float* %0, i64 %117
%120 = load float, float* %119
%121 = tail call double @pow(float %120, i32 %52)
%122 = fadd double %116, %121
%123 = or i64 %117, 1
%124 = getelementptr inbounds float, float* %0, i64 %123
%125 = load float, float* %124
%126 = tail call double @pow(float %125, i32 %52)
%127 = fadd double %122, %126
%128 = or i64 %117, 2
%129 = getelementptr inbounds float, float* %0, i64 %128
%130 = load float, float* %129
%131 = tail call double @pow(float %130, i32 %52)
%132 = fadd double %127, %131
%133 = or i64 %117, 3
%134 = getelementptr inbounds float, float* %0, i64 %133
%135 = load float, float* %134
%136 = tail call double @pow(float %135, i32 %52)
%137 = fadd double %132, %136
%138 = add nuw nsw i64 %117, 4
%139 = add i64 %118, 4
%140 = icmp eq i64 %139, %57
br i1 %140, label %141, label %115
141: ; preds = %115, %51
%142 = phi double [ undef, %51 ], [ %137, %115 ]
%143 = phi double [ 0.000000e+00, %51 ], [ %137, %115 ]
%144 = phi i64 [ 0, %51 ], [ %138, %115 ]
%145 = icmp eq i64 %54, 0
br i1 %145, label %157, label %146
146: ; preds = %141, %146
%147 = phi double [ %153, %146 ], [ %143, %141 ]
%148 = phi i64 [ %154, %146 ], [ %144, %141 ]
%149 = phi i64 [ %155, %146 ], [ 0, %141 ]
%150 = getelementptr inbounds float, float* %0, i64 %148
%151 = load float, float* %150
%152 = tail call double @pow(float %151, i32 %52)
%153 = fadd double %147, %152
%154 = add nuw nsw i64 %148, 1
%155 = add i64 %149, 1
%156 = icmp eq i64 %155, %54
br i1 %156, label %157, label %146
157: ; preds = %146, %141
%158 = phi double [ %142, %141 ], [ %153, %146 ]
%159 = fptrunc double %158 to float
br label %160
160: ; preds = %157, %50
%161 = phi float [ 0.000000e+00, %50 ], [ %159, %157 ]
%162 = fdiv double 1.000000e+00, %2
%163 = fptosi double %162 to i32
%164 = tail call double @pow(float %161, i32 %163)
br label %182
165: ; preds = %17, %11
%166 = phi double [ undef, %11 ], [ %43, %17 ]
%167 = phi double [ 0.000000e+00, %11 ], [ %43, %17 ]
%168 = phi i64 [ 0, %11 ], [ %44, %17 ]
%169 = icmp eq i64 %13, 0
br i1 %169, label %182, label %170
170: ; preds = %165, %170
%171 = phi double [ %178, %170 ], [ %167, %165 ]
%172 = phi i64 [ %179, %170 ], [ %168, %165 ]
%173 = phi i64 [ %180, %170 ], [ 0, %165 ]
%174 = getelementptr inbounds float, float* %0, i64 %172
%175 = load float, float* %174
%176 = tail call i64 @fabs(float %175)
%177 = sitofp i64 %176 to double
%178 = fadd double %171, %177
%179 = add nuw nsw i64 %172, 1
%180 = add i64 %173, 1
%181 = icmp eq i64 %180, %13
br i1 %181, label %182, label %170
182: ; preds = %165, %170, %9, %160, %112, %5
%183 = phi double [ %6, %5 ], [ %114, %112 ], [ %164, %160 ], [ 0.000000e+00, %9 ], [ %166, %165 ], [ %178, %170 ]
ret double %183
}