void polyadd(double *r, double *p, double *q) {
  int i;
  for (i = 0; i <= 100 - 1; i++) {
    if (p[i] != 99999999) {
      r[i] = p[i];
    } else {
      r[i] = 99999999;
    }
  }
  for (i = 0; i <= 100 - 1 && q[i] != 99999999; i++) {
    if (r[i] != 99999999) {
      r[i] += q[i];
    } else {
      r[i] = q[i];
    }
  }
}


x86 assembly (clang, -O0):
<polyadd>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x63,-0x1c(%rbp)
jg     1192 <polyadd+0x92>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xeca(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    114b <polyadd+0x4b>
jp     114b <polyadd+0x4b>
jmp    116a <polyadd+0x6a>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    117f <polyadd+0x7f>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  0xe86(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    1184 <polyadd+0x84>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1117 <polyadd+0x17>
movl   $0x0,-0x1c(%rbp)
xor    %eax,%eax
cmpl   $0x63,-0x1c(%rbp)
mov    %al,-0x1d(%rbp)
jg     11cc <polyadd+0xcc>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xe43(%rip),%xmm1
ucomisd %xmm1,%xmm0
setne  %al
setp   %cl
or     %cl,%al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    11dc <polyadd+0xdc>
jmp    1257 <polyadd+0x157>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xe0f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1206 <polyadd+0x106>
jp     1206 <polyadd+0x106>
jmp    122a <polyadd+0x12a>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    1244 <polyadd+0x144>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1249 <polyadd+0x149>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1199 <polyadd+0x99>
pop    %rbp
ret

x86 assembly (clang, -O2):
<polyadd>:
lea    0x320(%rsi),%rax
cmp    %rdi,%rax
jbe    1166 <polyadd+0x66>
lea    0x320(%rdi),%rax
cmp    %rsi,%rax
jbe    1166 <polyadd+0x66>
mov    $0x4,%eax
nopl   (%rax)
movsd  -0x20(%rsi,%rax,8),%xmm0
movsd  %xmm0,-0x20(%rdi,%rax,8)
movsd  -0x18(%rsi,%rax,8),%xmm0
movsd  %xmm0,-0x18(%rdi,%rax,8)
movsd  -0x10(%rsi,%rax,8),%xmm0
movsd  %xmm0,-0x10(%rdi,%rax,8)
movsd  -0x8(%rsi,%rax,8),%xmm0
movsd  %xmm0,-0x8(%rdi,%rax,8)
movsd  (%rsi,%rax,8),%xmm0
movsd  %xmm0,(%rdi,%rax,8)
add    $0x5,%rax
cmp    $0x68,%rax
jne    1120 <polyadd+0x20>
jmp    11aa <polyadd+0xaa>
mov    $0x8,%eax
nopl   0x0(%rax,%rax,1)
movups -0x40(%rsi,%rax,8),%xmm0
movups %xmm0,-0x40(%rdi,%rax,8)
movups -0x30(%rsi,%rax,8),%xmm0
movups %xmm0,-0x30(%rdi,%rax,8)
movups -0x20(%rsi,%rax,8),%xmm0
movups %xmm0,-0x20(%rdi,%rax,8)
movups -0x10(%rsi,%rax,8),%xmm0
movups %xmm0,-0x10(%rdi,%rax,8)
movups (%rsi,%rax,8),%xmm0
movups %xmm0,(%rdi,%rax,8)
add    $0xa,%rax
cmp    $0x6c,%rax
jne    1170 <polyadd+0x70>
mov    $0x1,%eax
movsd  0xe49(%rip),%xmm0
movsd  0xe49(%rip),%xmm1
nop
movsd  -0x8(%rdx,%rax,8),%xmm2
ucomisd %xmm0,%xmm2
jne    11ce <polyadd+0xce>
jnp    122d <polyadd+0x12d>
movsd  -0x8(%rdi,%rax,8),%xmm3
movapd %xmm3,%xmm4
cmpneqsd %xmm0,%xmm4
andpd  %xmm4,%xmm3
andnpd %xmm1,%xmm4
orpd   %xmm3,%xmm4
addsd  %xmm4,%xmm2
movsd  %xmm2,-0x8(%rdi,%rax,8)
movsd  (%rdx,%rax,8),%xmm2
ucomisd %xmm0,%xmm2
jne    1200 <polyadd+0x100>
jnp    122d <polyadd+0x12d>
movsd  (%rdi,%rax,8),%xmm3
movapd %xmm3,%xmm4
cmpneqsd %xmm0,%xmm4
andpd  %xmm4,%xmm3
andnpd %xmm1,%xmm4
orpd   %xmm3,%xmm4
addsd  %xmm4,%xmm2
movsd  %xmm2,(%rdi,%rax,8)
add    $0x2,%rax
cmp    $0x65,%rax
jne    11c0 <polyadd+0xc0>
ret

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

LLVM IR (-O2):
define void @polyadd(double* nocapture %0, double* nocapture %1, double* nocapture %2) {
%4 = getelementptr double, double* %0, i64 100
%5 = getelementptr double, double* %1, i64 100
%6 = icmp ugt double* %5, %0
%7 = icmp ugt double* %4, %1
%8 = and i1 %6, %7
br i1 %8, label %42, label %9
9: ; preds = %3, %9
%10 = phi i64 [ %40, %9 ], [ 0, %3 ]
%11 = getelementptr inbounds double, double* %1, i64 %10
%12 = bitcast double* %11 to <2 x double>*
%13 = load <2 x double>, <2 x double>* %12
%14 = getelementptr inbounds double, double* %0, i64 %10
%15 = bitcast double* %14 to <2 x double>*
store <2 x double> %13, <2 x double>* %15
%16 = add nuw nsw i64 %10, 2
%17 = getelementptr inbounds double, double* %1, i64 %16
%18 = bitcast double* %17 to <2 x double>*
%19 = load <2 x double>, <2 x double>* %18
%20 = getelementptr inbounds double, double* %0, i64 %16
%21 = bitcast double* %20 to <2 x double>*
store <2 x double> %19, <2 x double>* %21
%22 = add nuw nsw i64 %10, 4
%23 = getelementptr inbounds double, double* %1, i64 %22
%24 = bitcast double* %23 to <2 x double>*
%25 = load <2 x double>, <2 x double>* %24
%26 = getelementptr inbounds double, double* %0, i64 %22
%27 = bitcast double* %26 to <2 x double>*
store <2 x double> %25, <2 x double>* %27
%28 = add nuw nsw i64 %10, 6
%29 = getelementptr inbounds double, double* %1, i64 %28
%30 = bitcast double* %29 to <2 x double>*
%31 = load <2 x double>, <2 x double>* %30
%32 = getelementptr inbounds double, double* %0, i64 %28
%33 = bitcast double* %32 to <2 x double>*
store <2 x double> %31, <2 x double>* %33
%34 = add nuw nsw i64 %10, 8
%35 = getelementptr inbounds double, double* %1, i64 %34
%36 = bitcast double* %35 to <2 x double>*
%37 = load <2 x double>, <2 x double>* %36
%38 = getelementptr inbounds double, double* %0, i64 %34
%39 = bitcast double* %38 to <2 x double>*
store <2 x double> %37, <2 x double>* %39
%40 = add nuw nsw i64 %10, 10
%41 = icmp eq i64 %40, 100
br i1 %41, label %65, label %9
42: ; preds = %3, %42
%43 = phi i64 [ %63, %42 ], [ 0, %3 ]
%44 = getelementptr inbounds double, double* %1, i64 %43
%45 = load double, double* %44
%46 = getelementptr inbounds double, double* %0, i64 %43
store double %45, double* %46
%47 = add nuw nsw i64 %43, 1
%48 = getelementptr inbounds double, double* %1, i64 %47
%49 = load double, double* %48
%50 = getelementptr inbounds double, double* %0, i64 %47
store double %49, double* %50
%51 = add nuw nsw i64 %43, 2
%52 = getelementptr inbounds double, double* %1, i64 %51
%53 = load double, double* %52
%54 = getelementptr inbounds double, double* %0, i64 %51
store double %53, double* %54
%55 = add nuw nsw i64 %43, 3
%56 = getelementptr inbounds double, double* %1, i64 %55
%57 = load double, double* %56
%58 = getelementptr inbounds double, double* %0, i64 %55
store double %57, double* %58
%59 = add nuw nsw i64 %43, 4
%60 = getelementptr inbounds double, double* %1, i64 %59
%61 = load double, double* %60
%62 = getelementptr inbounds double, double* %0, i64 %59
store double %61, double* %62
%63 = add nuw nsw i64 %43, 5
%64 = icmp eq i64 %63, 100
br i1 %64, label %65, label %42
65: ; preds = %9, %42
br label %66
66: ; preds = %81, %65
%67 = phi i64 [ 0, %65 ], [ %87, %81 ]
%68 = getelementptr inbounds double, double* %2, i64 %67
%69 = load double, double* %68
%70 = fcmp une double %69, 0x4197D783FC000000
br i1 %70, label %71, label %89
71: ; preds = %66
%72 = getelementptr inbounds double, double* %0, i64 %67
%73 = load double, double* %72
%74 = fcmp une double %73, 0x4197D783FC000000
%75 = select i1 %74, double %73, double -0.000000e+00
%76 = fadd double %69, %75
store double %76, double* %72
%77 = or i64 %67, 1
%78 = getelementptr inbounds double, double* %2, i64 %77
%79 = load double, double* %78
%80 = fcmp une double %79, 0x4197D783FC000000
br i1 %80, label %81, label %89
81: ; preds = %71
%82 = getelementptr inbounds double, double* %0, i64 %77
%83 = load double, double* %82
%84 = fcmp une double %83, 0x4197D783FC000000
%85 = select i1 %84, double %83, double -0.000000e+00
%86 = fadd double %79, %85
store double %86, double* %82
%87 = add nuw nsw i64 %67, 2
%88 = icmp eq i64 %87, 100
br i1 %88, label %89, label %66
89: ; preds = %81, %71, %66
ret void
}