#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 */

/* Variables and functions */
scalar_t__ malloc(int);
double *range(double lo, double hi, int n, int open) {
  int i;
  double *returnval;
  returnval = (double *)malloc(n * sizeof(double));
  if (open) {
    for (i = 0; i < n; i++) {
      returnval[i] = lo + (hi - lo) * (0.5 + i) / n;
    }
  } else {
    if (n < 0)
      n = (int)(hi - lo);
    for (i = 0; i < n; i++) {
      returnval[i] = lo + (hi - lo) * i / (n - 1);
    }
  }
  return (double *)returnval;
}


x86 assembly (clang, -O0):
<range>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %esi,-0x18(%rbp)
movslq -0x14(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1030 <malloc@plt>
mov    %rax,-0x28(%rbp)
cmpl   $0x0,-0x18(%rbp)
je     11a9 <range+0x99>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11a4 <range+0x94>
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
subsd  -0x8(%rbp),%xmm1
cvtsi2sdl -0x1c(%rbp),%xmm3
movsd  0xe8c(%rip),%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
cvtsi2sdl -0x14(%rbp),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    114c <range+0x3c>
jmp    1221 <range+0x111>
cmpl   $0x0,-0x14(%rbp)
jge    11c4 <range+0xb4>
movsd  -0x10(%rbp),%xmm0
subsd  -0x8(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    121c <range+0x10c>
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
subsd  -0x8(%rbp),%xmm1
cvtsi2sdl -0x1c(%rbp),%xmm2
mulsd  %xmm2,%xmm1
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11cb <range+0xbb>
jmp    1221 <range+0x111>
mov    -0x28(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<range>:
push   %rbp
push   %rbx
sub    $0x28,%rsp
mov    %esi,%ebp
mov    %edi,%ebx
movapd %xmm1,0x10(%rsp)
movapd %xmm0,(%rsp)
lea    0x0(,%rbx,8),%edi
call   1030 <malloc@plt>
test   %ebp,%ebp
je     1161 <range+0x51>
test   %ebx,%ebx
movapd 0x10(%rsp),%xmm7
movapd (%rsp),%xmm5
jle    13b2 <range+0x2a2>
subsd  %xmm5,%xmm7
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
mov    %ebx,%ecx
cmp    $0x1,%ebx
jne    11a0 <range+0x90>
xor    %edx,%edx
jmp    1279 <range+0x169>
movapd 0x10(%rsp),%xmm10
movapd (%rsp),%xmm6
subsd  %xmm6,%xmm10
cvttsd2si %xmm10,%edx
test   %ebx,%ebx
cmovns %ebx,%edx
test   %edx,%edx
jle    13b2 <range+0x2a2>
lea    -0x1(%rdx),%ecx
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
mov    %edx,%ecx
cmp    $0x1,%edx
jne    12ba <range+0x1aa>
xor    %edx,%edx
jmp    1390 <range+0x280>
mov    %ecx,%edx
and    $0xfffffffe,%edx
movapd %xmm7,%xmm1
unpcklpd %xmm7,%xmm1
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
movapd %xmm5,%xmm3
unpcklpd %xmm5,%xmm3
lea    -0x2(%rdx),%rsi
mov    %rsi,%rbp
shr    %rbp
add    $0x1,%rbp
test   %rsi,%rsi
je     13b9 <range+0x2a9>
mov    %rbp,%rsi
and    $0xfffffffffffffffe,%rsi
movdqa 0xe2d(%rip),%xmm4
xor    %edi,%edi
movapd 0xe32(%rip),%xmm10
movdqa 0xe39(%rip),%xmm8
movdqa 0xe40(%rip),%xmm9
cvtdq2pd %xmm4,%xmm6
addpd  %xmm10,%xmm6
mulpd  %xmm1,%xmm6
divpd  %xmm2,%xmm6
addpd  %xmm3,%xmm6
movupd %xmm6,(%rax,%rdi,8)
movdqa %xmm4,%xmm6
paddd  %xmm8,%xmm6
cvtdq2pd %xmm6,%xmm6
addpd  %xmm10,%xmm6
mulpd  %xmm1,%xmm6
divpd  %xmm2,%xmm6
addpd  %xmm3,%xmm6
movupd %xmm6,0x10(%rax,%rdi,8)
add    $0x4,%rdi
paddd  %xmm9,%xmm4
add    $0xfffffffffffffffe,%rsi
jne    1200 <range+0xf0>
cvtdq2pd %xmm4,%xmm4
addpd  0xdc7(%rip),%xmm4
test   $0x1,%bpl
je     1270 <range+0x160>
mulpd  %xmm4,%xmm1
divpd  %xmm2,%xmm1
addpd  %xmm3,%xmm1
movupd %xmm1,(%rax,%rdi,8)
cmp    %rcx,%rdx
je     13b2 <range+0x2a2>
movsd  0xdcf(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
addsd  %xmm1,%xmm2
mulsd  %xmm7,%xmm2
divsd  %xmm0,%xmm2
addsd  %xmm5,%xmm2
movsd  %xmm2,(%rax,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    1290 <range+0x180>
jmp    13b2 <range+0x2a2>
mov    %ecx,%edx
and    $0xfffffffe,%edx
movapd %xmm10,%xmm1
unpcklpd %xmm10,%xmm1
movapd %xmm0,%xmm2
unpcklpd %xmm0,%xmm2
movapd %xmm6,%xmm3
unpcklpd %xmm6,%xmm3
lea    -0x2(%rdx),%rsi
mov    %rsi,%rbp
shr    %rbp
add    $0x1,%rbp
test   %rsi,%rsi
je     13d2 <range+0x2c2>
mov    %rbp,%rsi
and    $0xfffffffffffffffe,%rsi
movdqa 0xd11(%rip),%xmm5
xor    %edi,%edi
movdqa 0xd26(%rip),%xmm8
movdqa 0xd2d(%rip),%xmm9
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cvtdq2pd %xmm5,%xmm7
mulpd  %xmm1,%xmm7
divpd  %xmm2,%xmm7
addpd  %xmm3,%xmm7
movdqa %xmm5,%xmm4
paddd  %xmm8,%xmm4
cvtdq2pd %xmm4,%xmm4
movupd %xmm7,(%rax,%rdi,8)
mulpd  %xmm1,%xmm4
divpd  %xmm2,%xmm4
addpd  %xmm3,%xmm4
movupd %xmm4,0x10(%rax,%rdi,8)
add    $0x4,%rdi
paddd  %xmm9,%xmm5
add    $0xfffffffffffffffe,%rsi
jne    1320 <range+0x210>
cvtdq2pd %xmm5,%xmm4
test   $0x1,%bpl
je     137e <range+0x26e>
mulpd  %xmm4,%xmm1
divpd  %xmm2,%xmm1
addpd  %xmm3,%xmm1
movupd %xmm1,(%rax,%rdi,8)
cmp    %rcx,%rdx
je     13b2 <range+0x2a2>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xorps  %xmm1,%xmm1
cvtsi2sd %edx,%xmm1
mulsd  %xmm10,%xmm1
divsd  %xmm0,%xmm1
addsd  %xmm6,%xmm1
movsd  %xmm1,(%rax,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%rcx
jne    1390 <range+0x280>
add    $0x28,%rsp
pop    %rbx
pop    %rbp
ret
movapd 0xc3f(%rip),%xmm4
xor    %edi,%edi
test   $0x1,%bpl
jne    125f <range+0x14f>
jmp    1270 <range+0x160>
xorpd  %xmm4,%xmm4
movhpd 0xc7a(%rip),%xmm4
xor    %edi,%edi
test   $0x1,%bpl
jne    136d <range+0x25d>
jmp    137e <range+0x26e>

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

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