#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 NAN;
float getpixel_nan(float *x, int w, int h, int i, int j) {
  if (i < 0 || i >= w || j < 0 || j >= h)
    return NAN;
  return x[i + j * w];
}


x86 assembly (clang, -O0):
<getpixel_nan>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jl     1141 <getpixel_nan+0x41>
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1141 <getpixel_nan+0x41>
cmpl   $0x0,-0x20(%rbp)
jl     1141 <getpixel_nan+0x41>
mov    -0x20(%rbp),%eax
cmp    -0x18(%rbp),%eax
jl     1156 <getpixel_nan+0x56>
mov    0x2eb0(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1173 <getpixel_nan+0x73>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    -0x20(%rbp),%edx
imul   -0x14(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<getpixel_nan>:
mov    0x2ef1(%rip),%rax
test   %ecx,%ecx
js     1127 <getpixel_nan+0x27>
cmp    %edx,%r8d
jge    1127 <getpixel_nan+0x27>
cmp    %esi,%ecx
jge    1127 <getpixel_nan+0x27>
test   %r8d,%r8d
js     1127 <getpixel_nan+0x27>
imul   %esi,%r8d
add    %ecx,%r8d
movslq %r8d,%rax
lea    (%rdi,%rax,4),%rax
movss  (%rax),%xmm0
ret

LLVM IR (-O0):
@NAN = global float 0.000000e+00
define float @getpixel_nan(float* %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca float
%7 = alloca float*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store float* %0, float** %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store i32 %4, i32* %11
%12 = load i32, i32* %10
%13 = icmp slt i32 %12, 0
br i1 %13, label %25, label %14
14: ; preds = %5
%15 = load i32, i32* %10
%16 = load i32, i32* %8
%17 = icmp sge i32 %15, %16
br i1 %17, label %25, label %18
18: ; preds = %14
%19 = load i32, i32* %11
%20 = icmp slt i32 %19, 0
br i1 %20, label %25, label %21
21: ; preds = %18
%22 = load i32, i32* %11
%23 = load i32, i32* %9
%24 = icmp sge i32 %22, %23
br i1 %24, label %25, label %27
25: ; preds = %21, %18, %14, %5
%26 = load float, float* @NAN
store float %26, float* %6
br label %37
27: ; preds = %21
%28 = load float*, float** %7
%29 = load i32, i32* %10
%30 = load i32, i32* %11
%31 = load i32, i32* %8
%32 = mul nsw i32 %30, %31
%33 = add nsw i32 %29, %32
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds float, float* %28, i64 %34
%36 = load float, float* %35
store float %36, float* %6
br label %37
37: ; preds = %27, %25
%38 = load float, float* %6
ret float %38
}

LLVM IR (-O2):
@NAN = global float 0.000000e+00
define float @getpixel_nan(float* nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = icmp slt i32 %3, 0
br i1 %6, label %18, label %7
7: ; preds = %5
%8 = icmp slt i32 %3, %1
%9 = icmp sgt i32 %4, -1
%10 = and i1 %8, %9
%11 = icmp slt i32 %4, %2
%12 = and i1 %11, %10
br i1 %12, label %13, label %18
13: ; preds = %7
%14 = mul nsw i32 %4, %1
%15 = add nsw i32 %14, %3
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds float, float* %0, i64 %16
br label %18
18: ; preds = %5, %7, %13
%19 = phi float* [ %17, %13 ], [ @NAN, %7 ], [ @NAN, %5 ]
%20 = load float, float* %19
ret float %20
}