#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 */
typedef int int64_t;

/* Variables and functions */
void c_dfill(const int64_t N, const double alpha, double *X,
             const int64_t stride) {
  int64_t ix;
  int64_t m;
  int64_t i;
  if (N <= 0) {
    return;
  }
  if (stride == 1) {
    m = N % 8;
    if (m > 0) {
      for (i = 0; i < m; i++) {
        X[i] = alpha;
      }
    }
    if (N < 8) {
      return;
    }
    for (i = m; i < N; i += 8) {
      X[i] = alpha;
      X[i + 1] = alpha;
      X[i + 2] = alpha;
      X[i + 3] = alpha;
      X[i + 4] = alpha;
      X[i + 5] = alpha;
      X[i + 6] = alpha;
      X[i + 7] = alpha;
    }
    return;
  }
  if (stride < 0) {
    ix = (1 - N) * stride;
  } else {
    ix = 0;
  }
  for (i = 0; i < N; i++) {
    X[ix] = alpha;
    ix += stride;
  }
  return;
}


x86 assembly (clang, -O0):
<c_dfill>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     1122 <c_dfill+0x22>
jmp    12c9 <c_dfill+0x1c9>
cmpl   $0x1,-0x1c(%rbp)
jne    1263 <c_dfill+0x163>
mov    -0x4(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    %edx,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    117c <c_dfill+0x7c>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1177 <c_dfill+0x77>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    114b <c_dfill+0x4b>
jmp    117c <c_dfill+0x7c>
cmpl   $0x8,-0x4(%rbp)
jge    118b <c_dfill+0x8b>
jmp    12c9 <c_dfill+0x1c9>
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    125e <c_dfill+0x15e>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x7,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x28(%rbp)
jmp    1191 <c_dfill+0x91>
jmp    12c9 <c_dfill+0x1c9>
cmpl   $0x0,-0x1c(%rbp)
jge    1281 <c_dfill+0x181>
mov    $0x1,%eax
sub    -0x4(%rbp),%eax
imul   -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    1288 <c_dfill+0x188>
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    12c4 <c_dfill+0x1c4>
movsd  -0x10(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    128f <c_dfill+0x18f>
jmp    12c9 <c_dfill+0x1c9>
pop    %rbp
ret

x86 assembly (clang, -O2):
<c_dfill>:
push   %r14
push   %rbx
test   %edi,%edi
jle    13b8 <c_dfill+0x2b8>
cmp    $0x1,%edx
jne    11c0 <c_dfill+0xc0>
mov    %edi,%eax
and    $0x7,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,(%rsi)
cmp    $0x1,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,0x8(%rsi)
cmp    $0x2,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,0x10(%rsi)
cmp    $0x3,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,0x18(%rsi)
cmp    $0x4,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,0x20(%rsi)
cmp    $0x5,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,0x28(%rsi)
cmp    $0x6,%eax
je     115b <c_dfill+0x5b>
movsd  %xmm0,0x30(%rsi)
cmp    $0x8,%edi
jl     13b8 <c_dfill+0x2b8>
mov    %edi,%r10d
lea    0x8(%rax),%rcx
cmp    %r10,%rcx
cmovbe %r10,%rcx
mov    %rax,%r9
not    %r9
add    %rcx,%r9
cmp    $0x8,%r9
jb     1380 <c_dfill+0x280>
shr    $0x3,%r9
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffffe,%r8
lea    -0x2(%r8),%rcx
mov    %rcx,%r14
shr    %r14
add    $0x1,%r14
mov    %r14d,%r11d
and    $0x3,%r11d
movaps %xmm0,%xmm1
movlhps %xmm0,%xmm1
cmp    $0x6,%rcx
jae    1254 <c_dfill+0x154>
xor    %edx,%edx
jmp    1337 <c_dfill+0x237>
mov    $0x1,%eax
sub    %edi,%eax
imul   %edx,%eax
movslq %edx,%r8
sar    $0x1f,%edx
and    %eax,%edx
movslq %edx,%rcx
lea    -0x1(%rdi),%eax
mov    %edi,%ebx
xor    %edx,%edx
and    $0x3,%ebx
je     11ff <c_dfill+0xff>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  %xmm0,(%rsi,%rcx,8)
add    %r8,%rcx
add    $0x1,%edx
cmp    %edx,%ebx
jne    11f0 <c_dfill+0xf0>
cmp    $0x3,%eax
jb     13b8 <c_dfill+0x2b8>
lea    (%rsi,%rcx,8),%rbx
mov    %r8,%r10
shl    $0x5,%r10
lea    0x0(,%r8,8),%rax
lea    (%rax,%rax,2),%r9
add    %r8,%rcx
shl    $0x4,%r8
lea    (%rsi,%rcx,8),%rcx
sub    %edx,%edi
nopl   0x0(%rax)
movsd  %xmm0,(%rbx)
movsd  %xmm0,(%rcx)
movsd  %xmm0,(%rbx,%r8,1)
movsd  %xmm0,(%rbx,%r9,1)
add    %r10,%rbx
add    %r10,%rcx
add    $0xfffffffc,%edi
jne    1230 <c_dfill+0x130>
jmp    13b8 <c_dfill+0x2b8>
and    $0xfffffffffffffffc,%r14
xor    %edi,%edi
xor    %edx,%edx
nopl   0x0(%rax)
mov    %rdi,%rcx
or     %rax,%rcx
lea    0x0(,%rcx,8),%rbx
movups %xmm1,0x10(%rsi,%rcx,8)
movups %xmm1,(%rsi,%rcx,8)
movups %xmm1,0x20(%rsi,%rcx,8)
movups %xmm1,0x30(%rsi,%rcx,8)
movups %xmm1,0x40(%rsi,%rcx,8)
movups %xmm1,0x50(%rsi,%rcx,8)
movups %xmm1,0x60(%rsi,%rcx,8)
movups %xmm1,0x70(%rsi,%rcx,8)
mov    %rbx,%rcx
or     $0x80,%rcx
movups %xmm1,0x70(%rsi,%rcx,1)
movups %xmm1,0x40(%rsi,%rcx,1)
movups %xmm1,0x50(%rsi,%rcx,1)
movups %xmm1,0x20(%rsi,%rcx,1)
movups %xmm1,0x30(%rsi,%rcx,1)
movups %xmm1,(%rsi,%rcx,1)
movups %xmm1,0x10(%rsi,%rcx,1)
movups %xmm1,0x60(%rsi,%rcx,1)
mov    %rbx,%rcx
or     $0x100,%rcx
movups %xmm1,0x70(%rsi,%rcx,1)
movups %xmm1,0x40(%rsi,%rcx,1)
movups %xmm1,0x50(%rsi,%rcx,1)
movups %xmm1,0x20(%rsi,%rcx,1)
movups %xmm1,0x30(%rsi,%rcx,1)
movups %xmm1,(%rsi,%rcx,1)
movups %xmm1,0x10(%rsi,%rcx,1)
movups %xmm1,0x60(%rsi,%rcx,1)
or     $0x180,%rbx
movups %xmm1,0x60(%rsi,%rbx,1)
movups %xmm1,0x70(%rsi,%rbx,1)
movups %xmm1,0x40(%rsi,%rbx,1)
movups %xmm1,0x50(%rsi,%rbx,1)
movups %xmm1,0x20(%rsi,%rbx,1)
movups %xmm1,0x30(%rsi,%rbx,1)
movups %xmm1,(%rsi,%rbx,1)
movups %xmm1,0x10(%rsi,%rbx,1)
add    $0x8,%rdx
add    $0x40,%rdi
add    $0xfffffffffffffffc,%r14
jne    1260 <c_dfill+0x160>
test   %r11,%r11
je     1377 <c_dfill+0x277>
shl    $0x3,%rdx
mov    %rdx,%rcx
or     %rax,%rcx
movups %xmm1,0x10(%rsi,%rcx,8)
movups %xmm1,(%rsi,%rcx,8)
movups %xmm1,0x20(%rsi,%rcx,8)
movups %xmm1,0x30(%rsi,%rcx,8)
movups %xmm1,0x40(%rsi,%rcx,8)
movups %xmm1,0x50(%rsi,%rcx,8)
movups %xmm1,0x60(%rsi,%rcx,8)
movups %xmm1,0x70(%rsi,%rcx,8)
add    $0x10,%rdx
add    $0xffffffffffffffff,%r11
jne    1340 <c_dfill+0x240>
cmp    %r8,%r9
je     13b8 <c_dfill+0x2b8>
lea    (%rax,%r8,8),%rax
movsd  %xmm0,(%rsi,%rax,8)
movsd  %xmm0,0x8(%rsi,%rax,8)
movsd  %xmm0,0x10(%rsi,%rax,8)
movsd  %xmm0,0x18(%rsi,%rax,8)
movsd  %xmm0,0x20(%rsi,%rax,8)
movsd  %xmm0,0x28(%rsi,%rax,8)
movsd  %xmm0,0x30(%rsi,%rax,8)
movsd  %xmm0,0x38(%rsi,%rax,8)
add    $0x8,%rax
cmp    %r10,%rax
jb     1380 <c_dfill+0x280>
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @c_dfill(i32 %0, double %1, double* nocapture writeonly %2, i32 %3) {
%5 = icmp slt i32 %0, 1
br i1 %5, label %158, label %6
6: ; preds = %4
%7 = icmp eq i32 %3, 1
br i1 %7, label %8, label %122
8: ; preds = %6
%9 = and i32 %0, 7
%10 = icmp eq i32 %9, 0
br i1 %10, label %30, label %11
11: ; preds = %8
store double %1, double* %2
%12 = icmp eq i32 %9, 1
br i1 %12, label %30, label %13
13: ; preds = %11
%14 = getelementptr inbounds double, double* %2, i64 1
store double %1, double* %14
%15 = icmp eq i32 %9, 2
br i1 %15, label %30, label %16
16: ; preds = %13
%17 = getelementptr inbounds double, double* %2, i64 2
store double %1, double* %17
%18 = icmp eq i32 %9, 3
br i1 %18, label %30, label %19
19: ; preds = %16
%20 = getelementptr inbounds double, double* %2, i64 3
store double %1, double* %20
%21 = icmp eq i32 %9, 4
br i1 %21, label %30, label %22
22: ; preds = %19
%23 = getelementptr inbounds double, double* %2, i64 4
store double %1, double* %23
%24 = icmp eq i32 %9, 5
br i1 %24, label %30, label %25
25: ; preds = %22
%26 = getelementptr inbounds double, double* %2, i64 5
store double %1, double* %26
%27 = icmp eq i32 %9, 6
br i1 %27, label %30, label %28
28: ; preds = %25
%29 = getelementptr inbounds double, double* %2, i64 6
store double %1, double* %29
br label %30
30: ; preds = %11, %13, %16, %19, %22, %25, %28, %8
%31 = icmp sgt i32 %0, 7
br i1 %31, label %32, label %158
32: ; preds = %30
%33 = and i32 %0, 7
%34 = zext i32 %33 to i64
%35 = zext i32 %0 to i64
%36 = or i64 %34, 8
%37 = call i64 @llvm.umax.i64(i64 %36, i64 %35)
%38 = xor i64 %34, -1
%39 = add nsw i64 %37, %38
%40 = lshr i64 %39, 3
%41 = add nuw nsw i64 %40, 1
%42 = icmp ult i64 %39, 8
br i1 %42, label %101, label %43
43: ; preds = %32
%44 = and i64 %41, 4611686018427387902
%45 = shl i64 %44, 3
%46 = or i64 %45, %34
%47 = insertelement <2 x double> poison, double %1, i64 0
%48 = add nsw i64 %44, -2
%49 = lshr exact i64 %48, 1
%50 = add nuw i64 %49, 1
%51 = and i64 %50, 3
%52 = icmp ult i64 %48, 6
br i1 %52, label %84, label %53
53: ; preds = %43
%54 = and i64 %50, -4
%55 = shufflevector <2 x double> %47, <2 x double> poison, <16 x i32> zeroinitializer
%56 = shufflevector <2 x double> %47, <2 x double> poison, <16 x i32> zeroinitializer
%57 = shufflevector <2 x double> %47, <2 x double> poison, <16 x i32> zeroinitializer
%58 = shufflevector <2 x double> %47, <2 x double> poison, <16 x i32> zeroinitializer
br label %59
59: ; preds = %59, %53
%60 = phi i64 [ 0, %53 ], [ %81, %59 ]
%61 = phi i64 [ 0, %53 ], [ %82, %59 ]
%62 = shl i64 %60, 3
%63 = or i64 %62, %34
%64 = getelementptr inbounds double, double* %2, i64 %63
%65 = bitcast double* %64 to <16 x double>*
store <16 x double> %55, <16 x double>* %65
%66 = shl i64 %60, 3
%67 = or i64 %66, %34
%68 = or i64 %67, 16
%69 = getelementptr inbounds double, double* %2, i64 %68
%70 = bitcast double* %69 to <16 x double>*
store <16 x double> %56, <16 x double>* %70
%71 = shl i64 %60, 3
%72 = or i64 %71, %34
%73 = or i64 %72, 32
%74 = getelementptr inbounds double, double* %2, i64 %73
%75 = bitcast double* %74 to <16 x double>*
store <16 x double> %57, <16 x double>* %75
%76 = shl i64 %60, 3
%77 = or i64 %76, %34
%78 = or i64 %77, 48
%79 = getelementptr inbounds double, double* %2, i64 %78
%80 = bitcast double* %79 to <16 x double>*
store <16 x double> %58, <16 x double>* %80
%81 = add nuw i64 %60, 8
%82 = add i64 %61, 4
%83 = icmp eq i64 %82, %54
br i1 %83, label %84, label %59
84: ; preds = %59, %43
%85 = phi i64 [ 0, %43 ], [ %81, %59 ]
%86 = icmp eq i64 %51, 0
br i1 %86, label %99, label %87
87: ; preds = %84
%88 = shufflevector <2 x double> %47, <2 x double> poison, <16 x i32> zeroinitializer
br label %89
89: ; preds = %89, %87
%90 = phi i64 [ %85, %87 ], [ %96, %89 ]
%91 = phi i64 [ 0, %87 ], [ %97, %89 ]
%92 = shl i64 %90, 3
%93 = or i64 %92, %34
%94 = getelementptr inbounds double, double* %2, i64 %93
%95 = bitcast double* %94 to <16 x double>*
store <16 x double> %88, <16 x double>* %95
%96 = add nuw i64 %90, 2
%97 = add i64 %91, 1
%98 = icmp eq i64 %97, %51
br i1 %98, label %99, label %89
99: ; preds = %89, %84
%100 = icmp eq i64 %41, %44
br i1 %100, label %158, label %101
101: ; preds = %32, %99
%102 = phi i64 [ %34, %32 ], [ %46, %99 ]
br label %103
103: ; preds = %101, %103
%104 = phi i64 [ %120, %103 ], [ %102, %101 ]
%105 = getelementptr inbounds double, double* %2, i64 %104
store double %1, double* %105
%106 = add nuw nsw i64 %104, 1
%107 = getelementptr inbounds double, double* %2, i64 %106
store double %1, double* %107
%108 = add nuw nsw i64 %104, 2
%109 = getelementptr inbounds double, double* %2, i64 %108
store double %1, double* %109
%110 = add nuw nsw i64 %104, 3
%111 = getelementptr inbounds double, double* %2, i64 %110
store double %1, double* %111
%112 = add nuw nsw i64 %104, 4
%113 = getelementptr inbounds double, double* %2, i64 %112
store double %1, double* %113
%114 = add nuw nsw i64 %104, 5
%115 = getelementptr inbounds double, double* %2, i64 %114
store double %1, double* %115
%116 = add nuw nsw i64 %104, 6
%117 = getelementptr inbounds double, double* %2, i64 %116
store double %1, double* %117
%118 = add nuw nsw i64 %104, 7
%119 = getelementptr inbounds double, double* %2, i64 %118
store double %1, double* %119
%120 = add nuw nsw i64 %104, 8
%121 = icmp ult i64 %120, %35
br i1 %121, label %103, label %158
122: ; preds = %6
%123 = icmp slt i32 %3, 0
%124 = sub nsw i32 1, %0
%125 = mul nsw i32 %124, %3
%126 = select i1 %123, i32 %125, i32 0
%127 = sext i32 %126 to i64
%128 = sext i32 %3 to i64
%129 = add i32 %0, -1
%130 = and i32 %0, 3
%131 = icmp eq i32 %130, 0
br i1 %131, label %141, label %132
132: ; preds = %122, %132
%133 = phi i64 [ %137, %132 ], [ %127, %122 ]
%134 = phi i32 [ %138, %132 ], [ 0, %122 ]
%135 = phi i32 [ %139, %132 ], [ 0, %122 ]
%136 = getelementptr inbounds double, double* %2, i64 %133
store double %1, double* %136
%137 = add i64 %133, %128
%138 = add nuw nsw i32 %134, 1
%139 = add i32 %135, 1
%140 = icmp eq i32 %139, %130
br i1 %140, label %141, label %132
141: ; preds = %132, %122
%142 = phi i64 [ %127, %122 ], [ %137, %132 ]
%143 = phi i32 [ 0, %122 ], [ %138, %132 ]
%144 = icmp ult i32 %129, 3
br i1 %144, label %158, label %145
145: ; preds = %141, %145
%146 = phi i64 [ %155, %145 ], [ %142, %141 ]
%147 = phi i32 [ %156, %145 ], [ %143, %141 ]
%148 = getelementptr inbounds double, double* %2, i64 %146
store double %1, double* %148
%149 = add i64 %146, %128
%150 = getelementptr inbounds double, double* %2, i64 %149
store double %1, double* %150
%151 = add i64 %149, %128
%152 = getelementptr inbounds double, double* %2, i64 %151
store double %1, double* %152
%153 = add i64 %151, %128
%154 = getelementptr inbounds double, double* %2, i64 %153
store double %1, double* %154
%155 = add i64 %153, %128
%156 = add nuw nsw i32 %147, 4
%157 = icmp eq i32 %156, %0
br i1 %157, label %158, label %145
158: ; preds = %141, %145, %103, %99, %30, %4
ret void
}