void make_subgoal(double *goal, double *subgoal, int nsets, int cube_or_mesh,
                  int nsets_tot, int mesh_dims[3], int set,
                  double sub_vwgt_sum) {
  double tweight;
  double ratio;
  int index;
  int sub_nsets;
  int xstart, xwidth;
  int i, j, x;
  if (!cube_or_mesh) {
    tweight = 0;
    for (j = 0, i = set; i < nsets_tot; i += nsets, j++) {
      subgoal[j] = goal[i];
      tweight += goal[i];
    }
    sub_nsets = nsets_tot / nsets;
  } else {
    if (set == 0) {
      xstart = 0;
      xwidth = mesh_dims[0] - mesh_dims[0] / 2;
    } else {
      xwidth = mesh_dims[0] / 2;
      xstart = mesh_dims[0] - mesh_dims[0] / 2;
    }
    i = 0;
    tweight = 0;
    index = xstart;
    for (x = xstart; x < xstart + xwidth; x++) {
      subgoal[i] = goal[index++];
      tweight += subgoal[i++];
    }
    sub_nsets = xwidth;
  }
  ratio = sub_vwgt_sum / tweight;
  for (i = 0; i < sub_nsets; i++) {
    subgoal[i] *= ratio;
  }
}


x86 assembly (clang, -O0):
<make_subgoal>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9,-0x28(%rbp)
movsd  %xmm0,-0x30(%rbp)
cmpl   $0x0,-0x18(%rbp)
jne    11a4 <make_subgoal+0xa4>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x0,-0x58(%rbp)
mov    0x10(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1195 <make_subgoal+0x95>
mov    -0x8(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x58(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x14(%rbp),%eax
add    -0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1141 <make_subgoal+0x41>
mov    -0x1c(%rbp),%eax
cltd
idivl  -0x14(%rbp)
mov    %eax,-0x48(%rbp)
jmp    1292 <make_subgoal+0x192>
cmpl   $0x0,0x10(%rbp)
jne    11db <make_subgoal+0xdb>
movl   $0x0,-0x4c(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x60(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x60(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x50(%rbp)
jmp    120d <make_subgoal+0x10d>
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x64(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x64(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4c(%rbp)
movl   $0x0,-0x54(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    -0x4c(%rbp),%ecx
add    -0x50(%rbp),%ecx
cmp    %ecx,%eax
jge    128c <make_subgoal+0x18c>
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x44(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x54(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x54(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1228 <make_subgoal+0x128>
mov    -0x50(%rbp),%eax
mov    %eax,-0x48(%rbp)
movsd  -0x30(%rbp),%xmm0
divsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x48(%rbp),%eax
jge    12d9 <make_subgoal+0x1d9>
movsd  -0x40(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x54(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    12a8 <make_subgoal+0x1a8>
pop    %rbp
ret

x86 assembly (clang, -O2):
<make_subgoal>:
mov    %edx,%r10d
mov    0x8(%rsp),%edx
test   %ecx,%ecx
je     112a <make_subgoal+0x2a>
mov    (%r9),%eax
test   %edx,%edx
je     1173 <make_subgoal+0x73>
mov    %eax,%edx
shr    $0x1f,%edx
add    %eax,%edx
sar    %edx
sub    %edx,%eax
mov    %eax,%ecx
mov    %edx,%eax
test   %eax,%eax
jg     1188 <make_subgoal+0x88>
jmp    12a7 <make_subgoal+0x1a7>
xorpd  %xmm1,%xmm1
cmp    %r8d,%edx
jge    116a <make_subgoal+0x6a>
movslq %edx,%rax
movslq %r10d,%r9
movslq %r8d,%rdx
xorpd  %xmm1,%xmm1
mov    %rsi,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%rdi,%rax,8),%xmm2
movsd  %xmm2,(%rcx)
addsd  (%rdi,%rax,8),%xmm1
add    %r9,%rax
add    $0x8,%rcx
cmp    %rdx,%rax
jl     1150 <make_subgoal+0x50>
mov    %r8d,%eax
cltd
idiv   %r10d
jmp    11bb <make_subgoal+0xbb>
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
sub    %ecx,%eax
xor    %ecx,%ecx
test   %eax,%eax
jle    12a7 <make_subgoal+0x1a7>
lea    (%rax,%rcx,1),%r8d
movslq %ecx,%rcx
lea    (%rdi,%rcx,8),%r9
mov    %ecx,%edi
xorpd  %xmm1,%xmm1
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movsd  (%r9,%rcx,8),%xmm2
movsd  %xmm2,(%rsi,%rcx,8)
add    $0x1,%rcx
addsd  %xmm2,%xmm1
lea    (%rdi,%rcx,1),%edx
cmp    %edx,%r8d
jg     11a0 <make_subgoal+0xa0>
test   %eax,%eax
jle    12a7 <make_subgoal+0x1a7>
divsd  %xmm1,%xmm0
mov    %eax,%ecx
cmp    $0x4,%eax
jae    11d5 <make_subgoal+0xd5>
xor    %eax,%eax
jmp    1290 <make_subgoal+0x190>
mov    %ecx,%eax
and    $0xfffffffc,%eax
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%rax),%rdx
mov    %rdx,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rdx,%rdx
je     12a8 <make_subgoal+0x1a8>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movupd (%rsi,%rdx,8),%xmm2
movupd 0x10(%rsi,%rdx,8),%xmm3
movupd 0x20(%rsi,%rdx,8),%xmm4
movupd 0x30(%rsi,%rdx,8),%xmm5
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rsi,%rdx,8)
movupd %xmm3,0x10(%rsi,%rdx,8)
mulpd  %xmm1,%xmm4
mulpd  %xmm1,%xmm5
movupd %xmm4,0x20(%rsi,%rdx,8)
movupd %xmm5,0x30(%rsi,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rdi
jne    1210 <make_subgoal+0x110>
test   $0x1,%r8b
je     127c <make_subgoal+0x17c>
movupd (%rsi,%rdx,8),%xmm2
movupd 0x10(%rsi,%rdx,8),%xmm3
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rsi,%rdx,8)
movupd %xmm3,0x10(%rsi,%rdx,8)
cmp    %rcx,%rax
je     12a7 <make_subgoal+0x1a7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rsi,%rax,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rax,8)
add    $0x1,%rax
cmp    %rax,%rcx
jne    1290 <make_subgoal+0x190>
ret
xor    %edx,%edx
test   $0x1,%r8b
jne    125e <make_subgoal+0x15e>
jmp    127c <make_subgoal+0x17c>

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

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