#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__ ceil(float);
double fabs(double);
scalar_t__ floor(float);
int iyrange2(float wy1, float wy2, double cos_rot, double sin_rot, int npx,
             int npy, float yoff, int *iymin, int *iymax) {
  float y0, y1, y2, y3;
  float ymin, ymax;
  if (fabs(cos_rot) < 1.0e-5) {
    *iymin = 0;
    *iymax = npy - 1;
    return 0;
  }
  y0 = (wy1 - yoff) / cos_rot;
  y1 = (wy2 - yoff) / cos_rot;
  y2 = (wy1 - npx * sin_rot - yoff) / cos_rot;
  y3 = (wy2 - npx * sin_rot - yoff) / cos_rot;
  ymin = y0;
  if (y1 < ymin)
    ymin = y1;
  if (y2 < ymin)
    ymin = y2;
  if (y3 < ymin)
    ymin = y3;
  if (ymin < 0)
    ymin = 0;
  ymax = y0;
  if (y1 > ymax)
    ymax = y1;
  if (y2 > ymax)
    ymax = y2;
  if (y3 > ymax)
    ymax = y3;
  if (ymax > npy - 1)
    ymax = (float)(npy - 1);
  *iymin = (int)floor(ymin);
  *iymax = (int)ceil(ymax);
  if (*iymin <= *iymax)
    return 0;
  else
    return 1;
}


x86 assembly (clang, -O0):
<iyrange2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
mov    %edi,-0x24(%rbp)
mov    %esi,-0x28(%rbp)
movss  %xmm4,-0x2c(%rbp)
mov    %rdx,-0x38(%rbp)
mov    %rcx,-0x40(%rbp)
movsd  -0x18(%rbp),%xmm1
movaps 0xeb5(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  0xe99(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1193 <iyrange2+0x73>
mov    -0x38(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    13a0 <iyrange2+0x280>
movss  -0x8(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x18(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0xc(%rbp),%xmm0
subss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x18(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
cvtsi2sdl -0x24(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  -0x2c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
divsd  -0x18(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
cvtsi2sdl -0x24(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movss  -0x2c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
divsd  -0x18(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x48(%rbp),%xmm1
movss  -0x54(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    128c <iyrange2+0x16c>
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x4c(%rbp),%xmm1
movss  -0x54(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12a9 <iyrange2+0x189>
movss  -0x4c(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x50(%rbp),%xmm1
movss  -0x54(%rbp),%xmm0
ucomiss %xmm1,%xmm0
jbe    12c6 <iyrange2+0x1a6>
movss  -0x50(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x54(%rbp),%xmm0
jbe    12db <iyrange2+0x1bb>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x48(%rbp),%xmm0
ucomiss -0x58(%rbp),%xmm0
jbe    12fe <iyrange2+0x1de>
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x4c(%rbp),%xmm0
ucomiss -0x58(%rbp),%xmm0
jbe    1317 <iyrange2+0x1f7>
movss  -0x4c(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x50(%rbp),%xmm0
ucomiss -0x58(%rbp),%xmm0
jbe    1330 <iyrange2+0x210>
movss  -0x50(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x58(%rbp),%xmm0
mov    -0x28(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm1
ucomiss %xmm1,%xmm0
jbe    1357 <iyrange2+0x237>
mov    -0x28(%rbp),%eax
sub    $0x1,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x54(%rbp),%xmm0
call   1040 <floor@plt>
mov    %eax,%ecx
mov    -0x38(%rbp),%rax
mov    %ecx,(%rax)
movss  -0x58(%rbp),%xmm0
call   1030 <ceil@plt>
mov    %eax,%ecx
mov    -0x40(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x38(%rbp),%rax
mov    (%rax),%eax
mov    -0x40(%rbp),%rcx
cmp    (%rcx),%eax
jg     1399 <iyrange2+0x279>
movl   $0x0,-0x4(%rbp)
jmp    13a0 <iyrange2+0x280>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<iyrange2>:
push   %r14
push   %rbx
push   %rax
mov    %rcx,%r14
mov    %rdx,%rbx
movapd 0xece(%rip),%xmm5
andpd  %xmm2,%xmm5
movsd  0xee2(%rip),%xmm6
ucomisd %xmm5,%xmm6
jbe    1157 <iyrange2+0x37>
movl   $0x0,(%rbx)
add    $0xffffffff,%esi
mov    %esi,(%r14)
xor    %eax,%eax
jmp    1225 <iyrange2+0x105>
movaps %xmm1,%xmm5
unpcklps %xmm0,%xmm5
xorps  %xmm6,%xmm6
cvtss2sd %xmm4,%xmm6
shufps $0x0,%xmm4,%xmm4
subps  %xmm4,%xmm5
cvtps2pd %xmm5,%xmm4
movapd %xmm2,%xmm5
unpcklpd %xmm2,%xmm5
divpd  %xmm5,%xmm4
cvtpd2ps %xmm4,%xmm4
cvtss2sd %xmm0,%xmm0
xorps  %xmm5,%xmm5
cvtsi2sd %edi,%xmm5
xorpd  0xe7f(%rip),%xmm5
mulsd  %xmm3,%xmm5
addsd  %xmm5,%xmm0
subsd  %xmm6,%xmm0
divsd  %xmm2,%xmm0
xorps  %xmm3,%xmm3
cvtsd2ss %xmm0,%xmm3
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
addsd  %xmm5,%xmm0
subsd  %xmm6,%xmm0
divsd  %xmm2,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
movapd %xmm4,%xmm2
shufps $0x55,%xmm4,%xmm2
movaps %xmm4,%xmm0
minss  %xmm2,%xmm0
movaps %xmm3,%xmm5
minss  %xmm0,%xmm5
movaps %xmm1,%xmm6
minss  %xmm5,%xmm6
xorps  %xmm0,%xmm0
maxss  %xmm6,%xmm0
maxss  %xmm2,%xmm4
maxss  %xmm4,%xmm3
maxss  %xmm3,%xmm1
add    $0xffffffff,%esi
xorps  %xmm2,%xmm2
cvtsi2ss %esi,%xmm2
minss  %xmm1,%xmm2
movss  %xmm2,0x4(%rsp)
call   1040 <floor@plt>
mov    %eax,(%rbx)
movss  0x4(%rsp),%xmm0
call   1030 <ceil@plt>
mov    %rax,%rcx
mov    %ecx,(%r14)
xor    %eax,%eax
cmp    %ecx,(%rbx)
setg   %al
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define i32 @iyrange2(float %0, float %1, double %2, double %3, i32 %4, i32 %5, float %6, i32* nocapture %7, i32* nocapture writeonly %8) {
%10 = tail call double @llvm.fabs.f64(double %2)
%11 = fcmp olt double %10, 1.000000e-05
br i1 %11, label %12, label %14
12: ; preds = %9
store i32 0, i32* %7
%13 = add nsw i32 %5, -1
store i32 %13, i32* %8
br label %65
14: ; preds = %9
%15 = insertelement <2 x float> poison, float %1, i64 0
%16 = insertelement <2 x float> %15, float %0, i64 1
%17 = insertelement <2 x float> poison, float %6, i64 0
%18 = shufflevector <2 x float> %17, <2 x float> poison, <2 x i32> zeroinitializer
%19 = fsub <2 x float> %16, %18
%20 = fpext <2 x float> %19 to <2 x double>
%21 = insertelement <2 x double> poison, double %2, i64 0
%22 = shufflevector <2 x double> %21, <2 x double> poison, <2 x i32> zeroinitializer
%23 = fdiv <2 x double> %20, %22
%24 = fptrunc <2 x double> %23 to <2 x float>
%25 = fpext float %0 to double
%26 = sitofp i32 %4 to double
%27 = fneg double %26
%28 = tail call double @llvm.fmuladd.f64(double %27, double %3, double %25)
%29 = fpext float %6 to double
%30 = fsub double %28, %29
%31 = fdiv double %30, %2
%32 = fptrunc double %31 to float
%33 = fpext float %1 to double
%34 = tail call double @llvm.fmuladd.f64(double %27, double %3, double %33)
%35 = fsub double %34, %29
%36 = fdiv double %35, %2
%37 = fptrunc double %36 to float
%38 = extractelement <2 x float> %24, i64 0
%39 = extractelement <2 x float> %24, i64 1
%40 = fcmp olt float %38, %39
%41 = select i1 %40, float %38, float %39
%42 = fcmp ogt float %41, %32
%43 = select i1 %42, float %32, float %41
%44 = fcmp ogt float %43, %37
%45 = select i1 %44, float %37, float %43
%46 = fcmp olt float %45, 0.000000e+00
%47 = select i1 %46, float 0.000000e+00, float %45
%48 = fcmp ogt float %38, %39
%49 = select i1 %48, float %38, float %39
%50 = fcmp olt float %49, %32
%51 = select i1 %50, float %32, float %49
%52 = fcmp olt float %51, %37
%53 = select i1 %52, float %37, float %51
%54 = add nsw i32 %5, -1
%55 = sitofp i32 %54 to float
%56 = fcmp ogt float %53, %55
%57 = select i1 %56, float %55, float %53
%58 = tail call i64 @floor(float %47)
%59 = trunc i64 %58 to i32
store i32 %59, i32* %7
%60 = tail call i64 @ceil(float %57)
%61 = trunc i64 %60 to i32
store i32 %61, i32* %8
%62 = load i32, i32* %7
%63 = icmp sgt i32 %62, %61
%64 = zext i1 %63 to i32
br label %65
65: ; preds = %14, %12
%66 = phi i32 [ 0, %12 ], [ %64, %14 ]
ret i32 %66
}