#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 *smileDsp_winTri(long _N) {
  long i;
  double *ret = (double *)malloc(sizeof(double) * _N);
  double *x = ret;
  for (i = 0; i < _N / 2; i++) {
    *x = 2.0 * (double)(i + 1) / (double)_N;
    x++;
  }
  for (i = _N / 2; i < _N; i++) {
    *x = 2.0 * (double)(_N - i) / (double)_N;
    x++;
  }
  return ret;
}


x86 assembly (clang, -O0):
<smileDsp_winTri>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1030 <malloc@plt>
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
movq   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,%rcx
mov    -0x28(%rbp),%rax
cmp    %rcx,%rax
jge    11ad <smileDsp_winTri+0x9d>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
cvtsi2sd %rax,%xmm1
movsd  0xe86(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdq -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    113f <smileDsp_winTri+0x2f>
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    1215 <smileDsp_winTri+0x105>
mov    -0x8(%rbp),%rax
sub    -0x10(%rbp),%rax
cvtsi2sd %rax,%xmm1
movsd  0xe1e(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsi2sdq -0x8(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11bf <smileDsp_winTri+0xaf>
mov    -0x18(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<smileDsp_winTri>:
push   %rbx
mov    %rdi,%rbx
lea    0x0(,%rdi,8),%edi
call   1030 <malloc@plt>
mov    %rbx,%r11
shr    $0x3f,%r11
add    %rbx,%r11
sar    %r11
mov    %rax,%rdx
cmp    $0x2,%rbx
jl     12aa <smileDsp_winTri+0x19a>
cvtsi2sd %rbx,%xmm0
cmp    $0x2,%r11
jae    114f <smileDsp_winTri+0x3f>
xor    %esi,%esi
mov    %rax,%rdx
jmp    1270 <smileDsp_winTri+0x160>
mov    %r11,%rsi
and    $0xfffffffffffffffe,%rsi
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x2(%rsi),%rdx
mov    %rdx,%r8
shr    %r8
add    $0x1,%r8
test   %rdx,%rdx
je     1420 <smileDsp_winTri+0x310>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
movdqa 0xe8c(%rip),%xmm2
xor    %edi,%edi
pcmpeqd %xmm8,%xmm8
movdqa 0xe8c(%rip),%xmm9
movdqa 0xe94(%rip),%xmm6
nopl   0x0(%rax)
movdqa %xmm2,%xmm5
movdqa %xmm2,%xmm7
psubq  %xmm8,%xmm7
movq   %xmm7,%rcx
xorps  %xmm3,%xmm3
cvtsi2sd %rcx,%xmm3
pshufd $0xee,%xmm7,%xmm7
movq   %xmm7,%rcx
xorps  %xmm7,%xmm7
cvtsi2sd %rcx,%xmm7
unpcklpd %xmm7,%xmm3
addpd  %xmm3,%xmm3
divpd  %xmm1,%xmm3
movdqa %xmm2,%xmm7
paddq  %xmm9,%xmm7
movq   %xmm7,%rcx
xorps  %xmm4,%xmm4
cvtsi2sd %rcx,%xmm4
pshufd $0xee,%xmm7,%xmm7
movq   %xmm7,%rcx
xorps  %xmm7,%xmm7
cvtsi2sd %rcx,%xmm7
movupd %xmm3,(%rax,%rdi,8)
unpcklpd %xmm7,%xmm4
addpd  %xmm4,%xmm4
divpd  %xmm1,%xmm4
movupd %xmm4,0x10(%rax,%rdi,8)
add    $0x4,%rdi
paddq  %xmm6,%xmm2
add    $0xfffffffffffffffe,%rdx
jne    11a0 <smileDsp_winTri+0x90>
paddq  0xe0f(%rip),%xmm5
movq   %xmm5,%rcx
xorps  %xmm2,%xmm2
cvtsi2sd %rcx,%xmm2
pshufd $0xee,%xmm5,%xmm3
movq   %xmm3,%rcx
xorps  %xmm3,%xmm3
cvtsi2sd %rcx,%xmm3
unpcklpd %xmm3,%xmm2
addpd  %xmm2,%xmm2
test   $0x1,%r8b
je     1267 <smileDsp_winTri+0x157>
divpd  %xmm1,%xmm2
movupd %xmm2,(%rax,%rdi,8)
lea    (%rax,%rsi,8),%rdx
cmp    %rsi,%r11
je     12aa <smileDsp_winTri+0x19a>
mov    %r11,%rdi
neg    %rdi
add    $0x1,%rsi
nopw   0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsi2sd %rsi,%xmm1
addsd  %xmm1,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx)
add    $0x8,%rdx
lea    (%rdi,%rsi,1),%rcx
add    $0x1,%rcx
add    $0x1,%rsi
cmp    $0x1,%rcx
jne    1280 <smileDsp_winTri+0x170>
cmp    %rbx,%r11
jge    141e <smileDsp_winTri+0x30e>
xorps  %xmm0,%xmm0
cvtsi2sd %rbx,%xmm0
mov    %rbx,%r10
sub    %r11,%r10
cmp    $0x2,%r10
jb     13f2 <smileDsp_winTri+0x2e2>
mov    %r10,%r8
movq   %r11,%xmm1
pshufd $0x44,%xmm1,%xmm2
paddq  0xd30(%rip),%xmm2
and    $0xfffffffffffffffe,%r8
movq   %rbx,%xmm1
pshufd $0x44,%xmm1,%xmm3
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x2(%r8),%rcx
mov    %rcx,%r9
shr    %r9
add    $0x1,%r9
test   %rcx,%rcx
je     1439 <smileDsp_winTri+0x329>
mov    %r9,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %edi,%edi
movdqa 0xd31(%rip),%xmm8
movdqa 0xd09(%rip),%xmm5
nopw   0x0(%rax,%rax,1)
movdqa %xmm3,%xmm6
psubq  %xmm2,%xmm6
movq   %xmm6,%rcx
xorps  %xmm7,%xmm7
cvtsi2sd %rcx,%xmm7
pshufd $0xee,%xmm6,%xmm4
movq   %xmm4,%rcx
xorps  %xmm4,%xmm4
cvtsi2sd %rcx,%xmm4
unpcklpd %xmm4,%xmm7
addpd  %xmm7,%xmm7
divpd  %xmm1,%xmm7
psubq  %xmm8,%xmm6
movq   %xmm6,%rcx
xorps  %xmm4,%xmm4
cvtsi2sd %rcx,%xmm4
pshufd $0xee,%xmm6,%xmm6
movq   %xmm6,%rcx
xorps  %xmm6,%xmm6
cvtsi2sd %rcx,%xmm6
movupd %xmm7,(%rdx,%rdi,8)
unpcklpd %xmm6,%xmm4
addpd  %xmm4,%xmm4
divpd  %xmm1,%xmm4
movupd %xmm4,0x10(%rdx,%rdi,8)
add    $0x4,%rdi
paddq  %xmm5,%xmm2
add    $0xfffffffffffffffe,%rsi
jne    1330 <smileDsp_winTri+0x220>
test   $0x1,%r9b
je     13e6 <smileDsp_winTri+0x2d6>
psubq  %xmm2,%xmm3
movq   %xmm3,%rcx
xorps  %xmm2,%xmm2
cvtsi2sd %rcx,%xmm2
pshufd $0xee,%xmm3,%xmm3
movq   %xmm3,%rcx
xorps  %xmm3,%xmm3
cvtsi2sd %rcx,%xmm3
unpcklpd %xmm3,%xmm2
addpd  %xmm2,%xmm2
divpd  %xmm1,%xmm2
movupd %xmm2,(%rdx,%rdi,8)
cmp    %r8,%r10
je     141e <smileDsp_winTri+0x30e>
lea    (%rdx,%r8,8),%rdx
add    %r8,%r11
sub    %r11,%rbx
cs nopw 0x0(%rax,%rax,1)
nop
xorps  %xmm1,%xmm1
cvtsi2sd %rbx,%xmm1
addsd  %xmm1,%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx)
add    $0x8,%rdx
add    $0xffffffffffffffff,%rbx
jne    1400 <smileDsp_winTri+0x2f0>
pop    %rbx
ret
movapd 0xbd8(%rip),%xmm2
xor    %edi,%edi
test   $0x1,%r8b
jne    125e <smileDsp_winTri+0x14e>
jmp    1267 <smileDsp_winTri+0x157>
xor    %edi,%edi
test   $0x1,%r9b
jne    13b2 <smileDsp_winTri+0x2a2>
jmp    13e6 <smileDsp_winTri+0x2d6>

LLVM IR (-O0):
define double* @smileDsp_winTri(i64 %0) {
%2 = alloca i64
%3 = alloca i64
%4 = alloca double*
%5 = alloca double*
store i64 %0, i64* %2
%6 = load i64, i64* %2
%7 = mul i64 8, %6
%8 = trunc i64 %7 to i32
%9 = call i64 @malloc(i32 %8)
%10 = inttoptr i64 %9 to double*
store double* %10, double** %4
%11 = load double*, double** %4
store double* %11, double** %5
store i64 0, i64* %3
br label %12
12: ; preds = %28, %1
%13 = load i64, i64* %3
%14 = load i64, i64* %2
%15 = sdiv i64 %14, 2
%16 = icmp slt i64 %13, %15
br i1 %16, label %17, label %31
17: ; preds = %12
%18 = load i64, i64* %3
%19 = add nsw i64 %18, 1
%20 = sitofp i64 %19 to double
%21 = fmul double 2.000000e+00, %20
%22 = load i64, i64* %2
%23 = sitofp i64 %22 to double
%24 = fdiv double %21, %23
%25 = load double*, double** %5
store double %24, double* %25
%26 = load double*, double** %5
%27 = getelementptr inbounds double, double* %26, i32 1
store double* %27, double** %5
br label %28
28: ; preds = %17
%29 = load i64, i64* %3
%30 = add nsw i64 %29, 1
store i64 %30, i64* %3
br label %12
31: ; preds = %12
%32 = load i64, i64* %2
%33 = sdiv i64 %32, 2
store i64 %33, i64* %3
br label %34
34: ; preds = %50, %31
%35 = load i64, i64* %3
%36 = load i64, i64* %2
%37 = icmp slt i64 %35, %36
br i1 %37, label %38, label %53
38: ; preds = %34
%39 = load i64, i64* %2
%40 = load i64, i64* %3
%41 = sub nsw i64 %39, %40
%42 = sitofp i64 %41 to double
%43 = fmul double 2.000000e+00, %42
%44 = load i64, i64* %2
%45 = sitofp i64 %44 to double
%46 = fdiv double %43, %45
%47 = load double*, double** %5
store double %46, double* %47
%48 = load double*, double** %5
%49 = getelementptr inbounds double, double* %48, i32 1
store double* %49, double** %5
br label %50
50: ; preds = %38
%51 = load i64, i64* %3
%52 = add nsw i64 %51, 1
store i64 %52, i64* %3
br label %34
53: ; preds = %34
%54 = load double*, double** %4
ret double* %54
}

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