#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 */
typedef int uint8_t;
typedef int uint16_t;
struct can_frame {
  int *data;
};

/* Variables and functions */
int is_expected_canopen_object(const struct can_frame *frame, uint16_t index,
                               uint8_t subindex) {
  return frame->data[1] == (index >> 0 & 0xFF) &&
         frame->data[2] == (index >> 8 & 0xFF) && frame->data[3] == subindex;
}


x86 assembly (clang, -O0):
<is_expected_canopen_object>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    0x4(%rax),%ecx
mov    -0xc(%rbp),%edx
sar    $0x0,%edx
and    $0xff,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x11(%rbp)
jne    1167 <is_expected_canopen_object+0x67>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    0x8(%rax),%ecx
mov    -0xc(%rbp),%edx
sar    $0x8,%edx
and    $0xff,%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x11(%rbp)
jne    1167 <is_expected_canopen_object+0x67>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    0xc(%rax),%eax
cmp    -0x10(%rbp),%eax
sete   %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_expected_canopen_object>:
push   %rbx
mov    %esi,%ebx
mov    (%rdi),%rcx
movzbl %bl,%esi
xor    %eax,%eax
cmp    %esi,0x4(%rcx)
jne    1120 <is_expected_canopen_object+0x20>
movzbl %bh,%esi
cmp    %esi,0x8(%rcx)
jne    1120 <is_expected_canopen_object+0x20>
xor    %eax,%eax
cmp    %edx,0xc(%rcx)
sete   %al
pop    %rbx
ret

LLVM IR (-O0):
%struct.can_frame = type { i32* }
define i32 @is_expected_canopen_object(%struct.can_frame* %0, i32 %1, i32 %2) {
%4 = alloca %struct.can_frame*
%5 = alloca i32
%6 = alloca i32
store %struct.can_frame* %0, %struct.can_frame** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%7 = load %struct.can_frame*, %struct.can_frame** %4
%8 = getelementptr inbounds %struct.can_frame, %struct.can_frame* %7, i32 0, i32 0
%9 = load i32*, i32** %8
%10 = getelementptr inbounds i32, i32* %9, i64 1
%11 = load i32, i32* %10
%12 = load i32, i32* %5
%13 = ashr i32 %12, 0
%14 = and i32 %13, 255
%15 = icmp eq i32 %11, %14
br i1 %15, label %16, label %34
16: ; preds = %3
%17 = load %struct.can_frame*, %struct.can_frame** %4
%18 = getelementptr inbounds %struct.can_frame, %struct.can_frame* %17, i32 0, i32 0
%19 = load i32*, i32** %18
%20 = getelementptr inbounds i32, i32* %19, i64 2
%21 = load i32, i32* %20
%22 = load i32, i32* %5
%23 = ashr i32 %22, 8
%24 = and i32 %23, 255
%25 = icmp eq i32 %21, %24
br i1 %25, label %26, label %34
26: ; preds = %16
%27 = load %struct.can_frame*, %struct.can_frame** %4
%28 = getelementptr inbounds %struct.can_frame, %struct.can_frame* %27, i32 0, i32 0
%29 = load i32*, i32** %28
%30 = getelementptr inbounds i32, i32* %29, i64 3
%31 = load i32, i32* %30
%32 = load i32, i32* %6
%33 = icmp eq i32 %31, %32
br label %34
34: ; preds = %26, %16, %3
%35 = phi i1 [ false, %16 ], [ false, %3 ], [ %33, %26 ]
%36 = zext i1 %35 to i32
ret i32 %36
}

LLVM IR (-O2):
%struct.can_frame = type { i32* }
define i32 @is_expected_canopen_object(%struct.can_frame* nocapture %0, i32 %1, i32 %2) {
%4 = getelementptr inbounds %struct.can_frame, %struct.can_frame* %0, i64 0, i32 0
%5 = load i32*, i32** %4
%6 = getelementptr inbounds i32, i32* %5, i64 1
%7 = load i32, i32* %6
%8 = and i32 %1, 255
%9 = icmp eq i32 %7, %8
br i1 %9, label %10, label %21
10: ; preds = %3
%11 = getelementptr inbounds i32, i32* %5, i64 2
%12 = load i32, i32* %11
%13 = lshr i32 %1, 8
%14 = and i32 %13, 255
%15 = icmp eq i32 %12, %14
br i1 %15, label %16, label %21
16: ; preds = %10
%17 = getelementptr inbounds i32, i32* %5, i64 3
%18 = load i32, i32* %17
%19 = icmp eq i32 %18, %2
%20 = zext i1 %19 to i32
br label %21
21: ; preds = %16, %10, %3
%22 = phi i32 [ 0, %10 ], [ 0, %3 ], [ %20, %16 ]
ret i32 %22
}