#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 */
float cosf(float);
float fabsf(float);
float sinf(float);
void crta_r(float *sl, int w, int h, float size, float amp, float tilt) {
  int i, j;
  float d, st, ct, g;
  if (size == 0.0)
    return;
  st = sinf(tilt);
  ct = cosf(tilt);
  for (i = 0; i < h; i++)
    for (j = 0; j < w; j++) {
      d = (i - h / 2) * ct + (j - w / 2) * st;
      if (fabsf(d) > size / 2.0) {
        if (d > 0.0)
          sl[i * w + j] = 0.5 - amp / 2.0;
        else
          sl[i * w + j] = 0.5 + amp / 2.0;
      } else {
        if (d > size / 2.0)
          d = size / 2.0;
        g = 0.5 - amp * (d / size);
        sl[i * w + j] = g;
      }
    }
}


x86 assembly (clang, -O0):
<crta_r>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
movss  %xmm1,-0x18(%rbp)
movss  %xmm2,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1162 <crta_r+0x42>
jp     1162 <crta_r+0x42>
jmp    1371 <crta_r+0x251>
movss  -0x1c(%rbp),%xmm0
call   1030 <sinf@plt>
movss  %xmm0,-0x2c(%rbp)
movss  -0x1c(%rbp),%xmm0
call   1040 <cosf@plt>
movss  %xmm0,-0x30(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1371 <crta_r+0x251>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    135e <crta_r+0x23e>
mov    -0x20(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
cvtsi2ss %eax,%xmm0
movss  -0x30(%rbp),%xmm2
mov    -0x24(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x38(%rbp),%eax
sub    %ecx,%eax
cvtsi2ss %eax,%xmm1
mulss  -0x2c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x28(%rbp),%xmm0
movaps 0xe0f(%rip),%xmm1
pand   %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xde6(%rip),%xmm2
divsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    12be <crta_r+0x19e>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    127e <crta_r+0x15e>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdb1(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xdad(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    12b9 <crta_r+0x199>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd71(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xd6d(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    134b <crta_r+0x22b>
movss  -0x28(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd28(%rip),%xmm2
divsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    1304 <crta_r+0x1e4>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd09(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0x18(%rbp),%xmm0
movss  -0x28(%rbp),%xmm1
divss  -0x14(%rbp),%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xce5(%rip),%xmm0
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0xc(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1350 <crta_r+0x230>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    119a <crta_r+0x7a>
jmp    1363 <crta_r+0x243>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1187 <crta_r+0x67>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<crta_r>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
movaps %xmm0,%xmm3
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm3
jne    1142 <crta_r+0x22>
jp     1142 <crta_r+0x22>
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %edx,%r14d
mov    %esi,%r15d
mov    %rdi,%rbx
movaps %xmm2,%xmm0
movss  %xmm1,0x14(%rsp)
movss  %xmm3,0x10(%rsp)
movss  %xmm2,0xc(%rsp)
call   1030 <sinf@plt>
movss  %xmm0,0x8(%rsp)
movss  0xc(%rsp),%xmm0
call   1040 <cosf@plt>
movss  0x8(%rsp),%xmm7
movss  0x10(%rsp),%xmm12
movss  0x14(%rsp),%xmm13
test   %r14d,%r14d
jle    1137 <crta_r+0x17>
xorps  %xmm1,%xmm1
cvtss2sd %xmm12,%xmm1
mov    %r14d,%r8d
shr    %r8d
mov    %r15d,%ecx
shr    $0x1f,%ecx
add    %r15d,%ecx
sar    %ecx
movsd  0xe50(%rip),%xmm2
mulsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm6
xorps  %xmm3,%xmm3
cvtss2sd %xmm13,%xmm3
mulsd  %xmm2,%xmm3
movapd %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvtsd2ss %xmm4,%xmm8
neg    %ecx
subsd  %xmm3,%xmm2
cvtsd2ss %xmm2,%xmm9
movslq %r15d,%rdx
mov    %r14d,%r9d
mov    %edx,%edi
shl    $0x2,%rdx
xor    %eax,%eax
movaps 0xe1f(%rip),%xmm5
xorps  %xmm10,%xmm10
movss  0xe22(%rip),%xmm11
jmp    1210 <crta_r+0xf0>
add    $0x1,%rax
add    %rdx,%rbx
cmp    %r9,%rax
je     1137 <crta_r+0x17>
test   %r15d,%r15d
jle    1200 <crta_r+0xe0>
mov    %eax,%ebp
sub    %r8d,%ebp
xorps  %xmm4,%xmm4
cvtsi2ss %ebp,%xmm4
xor    %ebp,%ebp
jmp    1250 <crta_r+0x130>
cs nopw 0x0(%rax,%rax,1)
nop
divss  %xmm12,%xmm2
mulss  %xmm13,%xmm2
movaps %xmm11,%xmm3
subss  %xmm2,%xmm3
movss  %xmm3,(%rbx,%rbp,4)
add    $0x1,%rbp
cmp    %rbp,%rdi
je     1200 <crta_r+0xe0>
lea    (%rcx,%rbp,1),%esi
xorps  %xmm2,%xmm2
cvtsi2ss %esi,%xmm2
mulss  %xmm7,%xmm2
movaps %xmm4,%xmm3
mulss  %xmm0,%xmm3
addss  %xmm2,%xmm3
movaps %xmm3,%xmm2
andps  %xmm5,%xmm2
cvtss2sd %xmm2,%xmm2
ucomisd %xmm1,%xmm2
jbe    1290 <crta_r+0x170>
ucomiss %xmm10,%xmm3
jbe    12b0 <crta_r+0x190>
movss  %xmm9,(%rbx,%rbp,4)
jmp    1247 <crta_r+0x127>
nopw   0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtss2sd %xmm3,%xmm2
ucomisd %xmm1,%xmm2
movaps %xmm6,%xmm2
ja     1230 <crta_r+0x110>
movaps %xmm3,%xmm2
jmp    1230 <crta_r+0x110>
cs nopw 0x0(%rax,%rax,1)
nop
movss  %xmm8,(%rbx,%rbp,4)
jmp    1247 <crta_r+0x127>

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

LLVM IR (-O2):
define void @crta_r(float* nocapture writeonly %0, i32 %1, i32 %2, float %3, float %4, float %5) {
%7 = fpext float %3 to double
%8 = fcmp oeq float %3, 0.000000e+00
br i1 %8, label %66, label %9
9: ; preds = %6
%10 = tail call float @sinf(float %5)
%11 = tail call float @cosf(float %5)
%12 = icmp sgt i32 %2, 0
br i1 %12, label %13, label %66
13: ; preds = %9
%14 = icmp sgt i32 %1, 0
%15 = lshr i32 %2, 1
%16 = sdiv i32 %1, -2
%17 = fmul double %7, 5.000000e-01
%18 = fptrunc double %17 to float
%19 = fpext float %4 to double
%20 = fmul double %19, 5.000000e-01
%21 = fadd double %20, 5.000000e-01
%22 = fptrunc double %21 to float
%23 = fsub double 5.000000e-01, %20
%24 = fptrunc double %23 to float
%25 = sext i32 %1 to i64
%26 = zext i32 %2 to i64
%27 = zext i32 %1 to i64
br label %28
28: ; preds = %13, %63
%29 = phi i64 [ 0, %13 ], [ %64, %63 ]
br i1 %14, label %30, label %63
30: ; preds = %28
%31 = trunc i64 %29 to i32
%32 = sub i32 %31, %15
%33 = sitofp i32 %32 to float
%34 = mul nsw i64 %29, %25
br label %35
35: ; preds = %30, %60
%36 = phi i64 [ 0, %30 ], [ %61, %60 ]
%37 = trunc i64 %36 to i32
%38 = add i32 %16, %37
%39 = sitofp i32 %38 to float
%40 = fmul float %10, %39
%41 = tail call float @llvm.fmuladd.f32(float %33, float %11, float %40)
%42 = tail call float @llvm.fabs.f32(float %41)
%43 = fpext float %42 to double
%44 = fcmp olt double %17, %43
br i1 %44, label %45, label %51
45: ; preds = %35
%46 = fcmp ogt float %41, 0.000000e+00
%47 = add nsw i64 %36, %34
%48 = getelementptr inbounds float, float* %0, i64 %47
br i1 %46, label %49, label %50
49: ; preds = %45
store float %24, float* %48
br label %60
50: ; preds = %45
store float %22, float* %48
br label %60
51: ; preds = %35
%52 = fpext float %41 to double
%53 = fcmp olt double %17, %52
%54 = select i1 %53, float %18, float %41
%55 = fdiv float %54, %3
%56 = fmul float %55, %4
%57 = fsub float 5.000000e-01, %56
%58 = add nsw i64 %36, %34
%59 = getelementptr inbounds float, float* %0, i64 %58
store float %57, float* %59
br label %60
60: ; preds = %51, %50, %49
%61 = add nuw nsw i64 %36, 1
%62 = icmp eq i64 %61, %27
br i1 %62, label %63, label %35
63: ; preds = %60, %28
%64 = add nuw nsw i64 %29, 1
%65 = icmp eq i64 %64, %26
br i1 %65, label %66, label %28
66: ; preds = %63, %9, %6
ret void
}