#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);
float norm1(float *wvf, int nz, int nx) {
  int ix, iz, ioff;
  float sum = 0.f;
  for (ix = 1; ix < nx - 1; ix++) {
    for (iz = 1; iz < nz - 1; iz++) {
      ioff = iz + ix * nz;
      sum += fabs(wvf[ioff]);
    }
  }
  return sum / (nx * nz);
}


x86 assembly (clang, -O0):
<norm1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    11ab <norm1+0x9b>
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1198 <norm1+0x88>
mov    -0x18(%rbp),%eax
mov    -0x14(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
call   1030 <fabs@plt>
cvtsi2ss %rax,%xmm0
addss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1149 <norm1+0x39>
jmp    119d <norm1+0x8d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1131 <norm1+0x21>
movss  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%eax
imul   -0xc(%rbp),%eax
cvtsi2ss %eax,%xmm1
divss  %xmm1,%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<norm1>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %rsi,0x10(%rsp)
mov    %rdi,0x28(%rsp)
xorps  %xmm0,%xmm0
mov    %rdx,0x20(%rsp)
cmp    $0x3,%edx
jl     12d1 <norm1+0x1c1>
mov    0x20(%rsp),%rax
add    $0xffffffff,%eax
mov    %rax,0x48(%rsp)
mov    0x10(%rsp),%rax
lea    -0x1(%rax),%ecx
movslq %eax,%rdx
lea    -0x1(%rcx),%r15
add    $0xfffffffffffffffe,%rcx
mov    %rcx,0x30(%rsp)
mov    %r15d,%r14d
and    $0x3,%r14d
and    $0xfffffffffffffffc,%r15
mov    0x28(%rsp),%rax
lea    (%rax,%rdx,4),%r13
add    $0x10,%r13
lea    0x0(,%rdx,4),%rax
mov    %rax,0x38(%rsp)
xorps  %xmm0,%xmm0
mov    $0x1,%eax
mov    %rdx,0x40(%rsp)
mov    %rdx,0x18(%rsp)
jmp    11c8 <norm1+0xb8>
nopw   0x0(%rax,%rax,1)
mov    0x50(%rsp),%rax
add    $0x1,%rax
add    0x38(%rsp),%r13
mov    0x18(%rsp),%rcx
add    0x40(%rsp),%rcx
mov    %rcx,0x18(%rsp)
cmp    0x48(%rsp),%rax
je     12d1 <norm1+0x1c1>
cmpl   $0x3,0x10(%rsp)
mov    %rax,0x50(%rsp)
jl     11a0 <norm1+0x90>
mov    $0x1,%r12d
cmpq   $0x3,0x30(%rsp)
jb     1281 <norm1+0x171>
xor    %r12d,%r12d
nopl   0x0(%rax)
movss  %xmm0,0xc(%rsp)
movss  -0xc(%r13,%r12,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
addss  0xc(%rsp),%xmm0
movss  %xmm0,0xc(%rsp)
movss  -0x8(%r13,%r12,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
addss  0xc(%rsp),%xmm0
movss  %xmm0,0xc(%rsp)
movss  -0x4(%r13,%r12,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
addss  0xc(%rsp),%xmm0
movss  %xmm0,0xc(%rsp)
movss  0x0(%r13,%r12,4),%xmm0
call   1030 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %rax,%xmm0
addss  0xc(%rsp),%xmm0
add    $0x4,%r12
cmp    %r12,%r15
jne    11f0 <norm1+0xe0>
add    $0x1,%r12
test   %r14,%r14
je     11a0 <norm1+0x90>
add    0x18(%rsp),%r12
mov    0x28(%rsp),%rax
lea    (%rax,%r12,4),%rbp
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movss  %xmm0,0xc(%rsp)
movss  0x0(%rbp,%rbx,4),%xmm0
call   1030 <fabs@plt>
movss  0xc(%rsp),%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %rax,%xmm1
addss  %xmm1,%xmm0
add    $0x1,%rbx
cmp    %rbx,%r14
jne    12a0 <norm1+0x190>
jmp    11a0 <norm1+0x90>
mov    0x20(%rsp),%rax
imul   0x10(%rsp),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
divss  %xmm1,%xmm0
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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