int scg_translate(int nV, double *Vertex, double x, double y, double z) {
  int i;
  if (x != 0)
    for (i = 0; i < nV; i++)
      Vertex[i * 3] += x;
  if (y != 0)
    for (i = 0; i < nV; i++)
      Vertex[i * 3 + 1] += y;
  if (z != 0)
    for (i = 0; i < nV; i++)
      Vertex[i * 3 + 2] += z;
  return 0;
}


x86 assembly (clang, -O0):
<scg_translate>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
movsd  %xmm2,-0x28(%rbp)
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1137 <scg_translate+0x37>
jp     1137 <scg_translate+0x37>
jmp    1177 <scg_translate+0x77>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1172 <scg_translate+0x72>
movsd  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x2c(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    113e <scg_translate+0x3e>
jmp    1177 <scg_translate+0x77>
movsd  -0x20(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1194 <scg_translate+0x94>
jp     1194 <scg_translate+0x94>
jmp    11d7 <scg_translate+0xd7>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11d2 <scg_translate+0xd2>
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    119b <scg_translate+0x9b>
jmp    11d7 <scg_translate+0xd7>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11f4 <scg_translate+0xf4>
jp     11f4 <scg_translate+0xf4>
jmp    1237 <scg_translate+0x137>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1232 <scg_translate+0x132>
movsd  -0x28(%rbp),%xmm0
mov    -0x10(%rbp),%rax
imul   $0x3,-0x2c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11fb <scg_translate+0xfb>
jmp    1237 <scg_translate+0x137>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<scg_translate>:
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm0
mov    %edi,%r8d
jne    1113 <scg_translate+0x13>
jnp    11b7 <scg_translate+0xb7>
test   %edi,%edi
jle    11b7 <scg_translate+0xb7>
lea    -0x1(%r8),%rax
mov    %r8d,%r9d
and    $0x3,%r9d
cmp    $0x3,%rax
jae    1130 <scg_translate+0x30>
xor    %edx,%edx
jmp    1183 <scg_translate+0x83>
mov    %r8d,%eax
and    $0xfffffffc,%eax
xor    %edx,%edx
mov    %rsi,%rcx
nopl   0x0(%rax,%rax,1)
movsd  (%rcx),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,(%rcx)
movsd  0x18(%rcx),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,0x18(%rcx)
movsd  0x30(%rcx),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,0x30(%rcx)
movsd  0x48(%rcx),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,0x48(%rcx)
add    $0x4,%rdx
add    $0x60,%rcx
cmp    %rdx,%rax
jne    1140 <scg_translate+0x40>
test   %r9,%r9
je     11b7 <scg_translate+0xb7>
lea    (%rdx,%rdx,2),%rax
lea    (%rsi,%rax,8),%rax
shl    $0x3,%r9
lea    (%r9,%r9,2),%rcx
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
movsd  (%rax,%rdx,1),%xmm4
addsd  %xmm0,%xmm4
movsd  %xmm4,(%rax,%rdx,1)
add    $0x18,%rdx
cmp    %rdx,%rcx
jne    11a0 <scg_translate+0xa0>
ucomisd %xmm3,%xmm1
jne    11bf <scg_translate+0xbf>
jnp    1218 <scg_translate+0x118>
test   %edi,%edi
jle    1218 <scg_translate+0x118>
mov    $0x1,%ecx
cmp    $0x1,%edi
je     1208 <scg_translate+0x108>
mov    %r8d,%eax
and    $0xfffffffe,%eax
mov    $0x1,%ecx
nopl   0x0(%rax,%rax,1)
movsd  (%rsi,%rcx,8),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rsi,%rcx,8)
movsd  0x18(%rsi,%rcx,8),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rsi,%rcx,8)
add    $0x6,%rcx
add    $0xfffffffffffffffe,%rax
jne    11e0 <scg_translate+0xe0>
test   $0x1,%r8b
je     1218 <scg_translate+0x118>
addsd  (%rsi,%rcx,8),%xmm1
movsd  %xmm1,(%rsi,%rcx,8)
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
jne    1224 <scg_translate+0x124>
jnp    1278 <scg_translate+0x178>
test   %edi,%edi
jle    1278 <scg_translate+0x178>
mov    $0x2,%ecx
cmp    $0x1,%edi
je     1268 <scg_translate+0x168>
mov    %r8d,%eax
and    $0xfffffffe,%eax
mov    $0x2,%ecx
nopl   (%rax)
movsd  (%rsi,%rcx,8),%xmm0
addsd  %xmm2,%xmm0
movsd  %xmm0,(%rsi,%rcx,8)
movsd  0x18(%rsi,%rcx,8),%xmm0
addsd  %xmm2,%xmm0
movsd  %xmm0,0x18(%rsi,%rcx,8)
add    $0x6,%rcx
add    $0xfffffffffffffffe,%rax
jne    1240 <scg_translate+0x140>
test   $0x1,%r8b
je     1278 <scg_translate+0x178>
addsd  (%rsi,%rcx,8),%xmm2
movsd  %xmm2,(%rsi,%rcx,8)
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @scg_translate(i32 %0, double* %1, double %2, double %3, double %4) {
%6 = alloca i32
%7 = alloca double*
%8 = alloca double
%9 = alloca double
%10 = alloca double
%11 = alloca i32
store i32 %0, i32* %6
store double* %1, double** %7
store double %2, double* %8
store double %3, double* %9
store double %4, double* %10
%12 = load double, double* %8
%13 = fcmp une double %12, 0.000000e+00
br i1 %13, label %14, label %32
14: ; preds = %5
store i32 0, i32* %11
br label %15
15: ; preds = %28, %14
%16 = load i32, i32* %11
%17 = load i32, i32* %6
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %31
19: ; preds = %15
%20 = load double, double* %8
%21 = load double*, double** %7
%22 = load i32, i32* %11
%23 = mul nsw i32 %22, 3
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds double, double* %21, i64 %24
%26 = load double, double* %25
%27 = fadd double %26, %20
store double %27, double* %25
br label %28
28: ; preds = %19
%29 = load i32, i32* %11
%30 = add nsw i32 %29, 1
store i32 %30, i32* %11
br label %15
31: ; preds = %15
br label %32
32: ; preds = %31, %5
%33 = load double, double* %9
%34 = fcmp une double %33, 0.000000e+00
br i1 %34, label %35, label %54
35: ; preds = %32
store i32 0, i32* %11
br label %36
36: ; preds = %50, %35
%37 = load i32, i32* %11
%38 = load i32, i32* %6
%39 = icmp slt i32 %37, %38
br i1 %39, label %40, label %53
40: ; preds = %36
%41 = load double, double* %9
%42 = load double*, double** %7
%43 = load i32, i32* %11
%44 = mul nsw i32 %43, 3
%45 = add nsw i32 %44, 1
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double, double* %42, i64 %46
%48 = load double, double* %47
%49 = fadd double %48, %41
store double %49, double* %47
br label %50
50: ; preds = %40
%51 = load i32, i32* %11
%52 = add nsw i32 %51, 1
store i32 %52, i32* %11
br label %36
53: ; preds = %36
br label %54
54: ; preds = %53, %32
%55 = load double, double* %10
%56 = fcmp une double %55, 0.000000e+00
br i1 %56, label %57, label %76
57: ; preds = %54
store i32 0, i32* %11
br label %58
58: ; preds = %72, %57
%59 = load i32, i32* %11
%60 = load i32, i32* %6
%61 = icmp slt i32 %59, %60
br i1 %61, label %62, label %75
62: ; preds = %58
%63 = load double, double* %10
%64 = load double*, double** %7
%65 = load i32, i32* %11
%66 = mul nsw i32 %65, 3
%67 = add nsw i32 %66, 2
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds double, double* %64, i64 %68
%70 = load double, double* %69
%71 = fadd double %70, %63
store double %71, double* %69
br label %72
72: ; preds = %62
%73 = load i32, i32* %11
%74 = add nsw i32 %73, 1
store i32 %74, i32* %11
br label %58
75: ; preds = %58
br label %76
76: ; preds = %75, %54
ret i32 0
}

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