int fd_ionize(grid, dielectric, induced, nx, ny, nz, in, out, Z,
              kt) float (*grid)[],
    (*dielectric)[], (*induced)[];
float in, out, Z, kt;
{
  int i;
  float x, xmax, xmin;
  kt = 1. / kt;
  xmax = 0.;
  xmin = 0.;
  for (i = 0; i < nx * ny * nz; i++) {
    if ((*dielectric)[i] != in) {
      x = -(*grid)[i] * Z * kt;
      (*induced)[i] =
          2. * x / (*dielectric)[i] * 4 * 3.1415926535897932384626433;
      if (x > xmax)
        xmax = x;
      if (x < xmin)
        xmin = x;
    }
  }
  printf("%f %f\n", xmax, xmin);
  return 1 == 1;
}


x86 assembly (clang, -O0):
<fd_ionize>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm3,-0x50(%rbp)
movsd  %xmm2,-0x58(%rbp)
movaps %xmm1,%xmm2
movsd  -0x58(%rbp),%xmm1
movaps %xmm0,%xmm3
movsd  -0x50(%rbp),%xmm0
cvtsd2ss %xmm3,%xmm3
cvtsd2ss %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movss  %xmm3,-0x28(%rbp)
movss  %xmm2,-0x2c(%rbp)
movss  %xmm1,-0x30(%rbp)
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe82(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x1c(%rbp),%ecx
imul   -0x20(%rbp),%ecx
imul   -0x24(%rbp),%ecx
cmp    %ecx,%eax
jge    12a4 <fd_ionize+0x194>
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x28(%rbp),%xmm0
jne    11da <fd_ionize+0xca>
jp     11da <fd_ionize+0xca>
jmp    1291 <fd_ionize+0x181>
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  -0x30(%rbp),%xmm0
mulss  -0x34(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe04(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
movsd  0xddb(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xdc7(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x3c(%rbp),%xmm0
ucomiss -0x40(%rbp),%xmm0
jbe    126f <fd_ionize+0x15f>
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x3c(%rbp),%xmm1
movss  -0x44(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    128c <fd_ionize+0x17c>
movss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
jmp    1291 <fd_ionize+0x181>
jmp    1296 <fd_ionize+0x186>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11a2 <fd_ionize+0x92>
movss  -0x40(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x44(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
lea    0xd63(%rip),%rdi
mov    $0x2,%al
call   1030 <printf@plt>
mov    $0x1,%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fd_ionize>:
push   %rax
imul   %r8d,%ecx
imul   %r9d,%ecx
test   %ecx,%ecx
jle    11c9 <fd_ionize+0xb9>
cvtsd2ss %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm1
cvtsd2ss %xmm3,%xmm3
movss  0xecb(%rip),%xmm2
divss  %xmm3,%xmm2
mov    %ecx,%eax
xorps  %xmm6,%xmm6
xor    %ecx,%ecx
movaps 0xec8(%rip),%xmm8
movsd  0xecf(%rip),%xmm9
movsd  0xece(%rip),%xmm10
xorps  %xmm3,%xmm3
jmp    1175 <fd_ionize+0x65>
nop
movaps %xmm3,%xmm4
movaps %xmm6,%xmm7
add    $0x1,%rcx
movaps %xmm7,%xmm6
movaps %xmm4,%xmm3
cmp    %rcx,%rax
je     11cf <fd_ionize+0xbf>
movss  (%rsi,%rcx,4),%xmm4
ucomiss %xmm0,%xmm4
jne    1181 <fd_ionize+0x71>
jnp    1160 <fd_ionize+0x50>
movss  (%rdi,%rcx,4),%xmm7
xorps  %xmm8,%xmm7
mulss  %xmm1,%xmm7
mulss  %xmm2,%xmm7
xorps  %xmm5,%xmm5
cvtss2sd %xmm7,%xmm5
addsd  %xmm5,%xmm5
cvtss2sd %xmm4,%xmm4
divsd  %xmm4,%xmm5
mulsd  %xmm9,%xmm5
mulsd  %xmm10,%xmm5
xorps  %xmm4,%xmm4
cvtsd2ss %xmm5,%xmm4
movss  %xmm4,(%rdx,%rcx,4)
movaps %xmm7,%xmm4
maxss  %xmm3,%xmm4
ucomiss %xmm7,%xmm6
jbe    1163 <fd_ionize+0x53>
jmp    1166 <fd_ionize+0x56>
xorps  %xmm4,%xmm4
xorps  %xmm7,%xmm7
xorps  %xmm0,%xmm0
cvtss2sd %xmm4,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm7,%xmm1
lea    0xe4c(%rip),%rdi
mov    $0x2,%al
call   1030 <printf@plt>
mov    $0x1,%eax
pop    %rcx
ret

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

LLVM IR (-O2):
@.str = [7 x i8] c"%f %f\0A\00"
define i32 @fd_ionize([0 x float]* nocapture %0, [0 x float]* nocapture %1, [0 x float]* nocapture writeonly %2, i32 %3, i32 %4, i32 %5, double %6, double %7, double %8, double %9) {
%11 = fptrunc double %6 to float
%12 = fptrunc double %8 to float
%13 = fptrunc double %9 to float
%14 = fdiv float 1.000000e+00, %13
%15 = mul nsw i32 %4, %3
%16 = mul i32 %15, %5
%17 = icmp sgt i32 %16, 0
br i1 %17, label %18, label %50
18: ; preds = %10
%19 = zext i32 %16 to i64
br label %20
20: ; preds = %18, %45
%21 = phi i64 [ 0, %18 ], [ %48, %45 ]
%22 = phi float [ 0.000000e+00, %18 ], [ %47, %45 ]
%23 = phi float [ 0.000000e+00, %18 ], [ %46, %45 ]
%24 = getelementptr inbounds [0 x float], [0 x float]* %1, i64 0, i64 %21
%25 = load float, float* %24
%26 = fcmp une float %25, %11
br i1 %26, label %27, label %45
27: ; preds = %20
%28 = getelementptr inbounds [0 x float], [0 x float]* %0, i64 0, i64 %21
%29 = load float, float* %28
%30 = fneg float %29
%31 = fmul float %12, %30
%32 = fmul float %14, %31
%33 = fpext float %32 to double
%34 = fmul double %33, 2.000000e+00
%35 = fpext float %25 to double
%36 = fdiv double %34, %35
%37 = fmul double %36, 4.000000e+00
%38 = fmul double %37, 0x400921FB54442D18
%39 = fptrunc double %38 to float
%40 = getelementptr inbounds [0 x float], [0 x float]* %2, i64 0, i64 %21
store float %39, float* %40
%41 = fcmp ogt float %32, %23
%42 = select i1 %41, float %32, float %23
%43 = fcmp olt float %32, %22
br i1 %43, label %44, label %45
44: ; preds = %27
br label %45
45: ; preds = %20, %44, %27
%46 = phi float [ %42, %44 ], [ %42, %27 ], [ %23, %20 ]
%47 = phi float [ %32, %44 ], [ %22, %27 ], [ %22, %20 ]
%48 = add nuw nsw i64 %21, 1
%49 = icmp eq i64 %48, %19
br i1 %49, label %50, label %20
50: ; preds = %45, %10
%51 = phi float [ 0.000000e+00, %10 ], [ %46, %45 ]
%52 = phi float [ 0.000000e+00, %10 ], [ %47, %45 ]
%53 = fpext float %51 to double
%54 = fpext float %52 to double
%55 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0), double %53, double %54)
ret i32 1
}