#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 */
struct pci_dev {
  int dummy;
};

/* Variables and functions */
unsigned int __VERIFIER_nondet_uint();
unsigned short __VERIFIER_nondet_ushort();
int pci_enable_device(struct pci_dev *dev) {
  int i;
  unsigned int tmp;
  unsigned short tmp___0;
  unsigned long __cil_tmp5;
  unsigned long __cil_tmp6;
  unsigned long __cil_tmp7;
  unsigned long __cil_tmp8;
  unsigned long __cil_tmp9;
  unsigned long __cil_tmp10;
  unsigned long __cil_tmp11;
  unsigned long __cil_tmp12;
  unsigned long __cil_tmp13;
  unsigned long __cil_tmp14;
  unsigned long __cil_tmp15;
  unsigned long __cil_tmp16;
  unsigned long __cil_tmp17;
  unsigned long __cil_tmp18;
  unsigned long __cil_tmp19;
  unsigned long __cil_tmp20;
  unsigned long __cil_tmp21;
  unsigned long __cil_tmp22;
  unsigned long __cil_tmp23;
  unsigned long __cil_tmp24;
  unsigned long __cil_tmp25;
  unsigned long __cil_tmp26;
  {
    i = 0;
    {
      while (1) {
      while_continue:;
        if (i < 12) {
        } else {
          goto while_break;
        }
        {
          __cil_tmp5 = i * 32UL;
          __cil_tmp6 = __cil_tmp5 + 24;
          __cil_tmp7 = 56 + __cil_tmp6;
          __cil_tmp8 = (unsigned long)dev;
          __cil_tmp9 = __cil_tmp8 + __cil_tmp7;
          *((unsigned long *)__cil_tmp9) = 256UL;
          tmp = __VERIFIER_nondet_uint();
          __cil_tmp10 = i * 32UL;
          __cil_tmp11 = __cil_tmp10 + 8;
          __cil_tmp12 = 56 + __cil_tmp11;
          __cil_tmp13 = (unsigned long)dev;
          __cil_tmp14 = __cil_tmp13 + __cil_tmp12;
          *((unsigned long *)__cil_tmp14) = (unsigned long)tmp;
          tmp___0 = __VERIFIER_nondet_ushort();
          __cil_tmp15 = i * 32UL;
          __cil_tmp16 = __cil_tmp15 + 16;
          __cil_tmp17 = 56 + __cil_tmp16;
          __cil_tmp18 = (unsigned long)dev;
          __cil_tmp19 = __cil_tmp18 + __cil_tmp17;
          __cil_tmp20 = (unsigned long)tmp___0;
          __cil_tmp21 = i * 32UL;
          __cil_tmp22 = __cil_tmp21 + 8;
          __cil_tmp23 = 56 + __cil_tmp22;
          __cil_tmp24 = (unsigned long)dev;
          __cil_tmp25 = __cil_tmp24 + __cil_tmp23;
          __cil_tmp26 = *((unsigned long *)__cil_tmp25);
          *((unsigned long *)__cil_tmp19) = __cil_tmp26 + __cil_tmp20;
          i = i + 1;
        }
      }
    while_break:;
    }
    return (0);
  }
}


x86 assembly (clang, -O0):
<pci_enable_device>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
jmp    113b <pci_enable_device+0x1b>
cmpl   $0xc,-0xc(%rbp)
jge    114a <pci_enable_device+0x2a>
jmp    114f <pci_enable_device+0x2f>
jmp    12c1 <pci_enable_device+0x1a1>
movslq -0xc(%rbp),%rax
shl    $0x5,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0x18,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
add    $0x38,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movq   $0x100,(%rax)
mov    $0x0,%al
call   1040 <__VERIFIER_nondet_uint@plt>
mov    %eax,-0x10(%rbp)
movslq -0xc(%rbp),%rax
shl    $0x5,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
add    $0x38,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x60(%rbp),%rax
add    -0x58(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,%ecx
mov    -0x68(%rbp),%rax
mov    %rcx,(%rax)
mov    $0x0,%al
call   1030 <__VERIFIER_nondet_ushort@plt>
mov    %ax,-0x12(%rbp)
movslq -0xc(%rbp),%rax
shl    $0x5,%rax
mov    %rax,-0x70(%rbp)
mov    -0x70(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x78(%rbp)
mov    -0x78(%rbp),%rax
add    $0x38,%rax
mov    %rax,-0x80(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x88(%rbp),%rax
add    -0x80(%rbp),%rax
mov    %rax,-0x90(%rbp)
movzwl -0x12(%rbp),%eax
mov    %rax,-0x98(%rbp)
movslq -0xc(%rbp),%rax
shl    $0x5,%rax
mov    %rax,-0xa0(%rbp)
mov    -0xa0(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0xa8(%rbp)
mov    -0xa8(%rbp),%rax
add    $0x38,%rax
mov    %rax,-0xb0(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0xb8(%rbp)
mov    -0xb8(%rbp),%rax
add    -0xb0(%rbp),%rax
mov    %rax,-0xc0(%rbp)
mov    -0xc0(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0xc8(%rbp)
mov    -0xc8(%rbp),%rcx
add    -0x98(%rbp),%rcx
mov    -0x90(%rbp),%rax
mov    %rcx,(%rax)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1136 <pci_enable_device+0x16>
xor    %eax,%eax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pci_enable_device>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%rbx
add    $0x50,%rbx
mov    $0xc,%r14d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movq   $0x100,(%rbx)
xor    %eax,%eax
call   1040 <__VERIFIER_nondet_uint@plt>
mov    %eax,%eax
mov    %rax,-0x10(%rbx)
xor    %eax,%eax
call   1030 <__VERIFIER_nondet_ushort@plt>
movzwl %ax,%eax
add    -0x10(%rbx),%rax
mov    %rax,-0x8(%rbx)
add    $0x20,%rbx
add    $0xffffffffffffffff,%r14
jne    1140 <pci_enable_device+0x20>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
%struct.pci_dev = type { i32 }
define i32 @pci_enable_device(%struct.pci_dev* %0) {
%2 = alloca %struct.pci_dev*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i16
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
%14 = alloca i64
%15 = alloca i64
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca i64
%20 = alloca i64
%21 = alloca i64
%22 = alloca i64
%23 = alloca i64
%24 = alloca i64
%25 = alloca i64
%26 = alloca i64
%27 = alloca i64
store %struct.pci_dev* %0, %struct.pci_dev** %2
store i32 0, i32* %3
br label %28
28: ; preds = %1, %34
br label %29
29: ; preds = %28
%30 = load i32, i32* %3
%31 = icmp slt i32 %30, 12
br i1 %31, label %32, label %33
32: ; preds = %29
br label %34
33: ; preds = %29
br label %103
34: ; preds = %32
%35 = load i32, i32* %3
%36 = sext i32 %35 to i64
%37 = mul i64 %36, 32
store i64 %37, i64* %6
%38 = load i64, i64* %6
%39 = add i64 %38, 24
store i64 %39, i64* %7
%40 = load i64, i64* %7
%41 = add i64 56, %40
store i64 %41, i64* %8
%42 = load %struct.pci_dev*, %struct.pci_dev** %2
%43 = ptrtoint %struct.pci_dev* %42 to i64
store i64 %43, i64* %9
%44 = load i64, i64* %9
%45 = load i64, i64* %8
%46 = add i64 %44, %45
store i64 %46, i64* %10
%47 = load i64, i64* %10
%48 = inttoptr i64 %47 to i64*
store i64 256, i64* %48
%49 = call i32 (...) @__VERIFIER_nondet_uint()
store i32 %49, i32* %4
%50 = load i32, i32* %3
%51 = sext i32 %50 to i64
%52 = mul i64 %51, 32
store i64 %52, i64* %11
%53 = load i64, i64* %11
%54 = add i64 %53, 8
store i64 %54, i64* %12
%55 = load i64, i64* %12
%56 = add i64 56, %55
store i64 %56, i64* %13
%57 = load %struct.pci_dev*, %struct.pci_dev** %2
%58 = ptrtoint %struct.pci_dev* %57 to i64
store i64 %58, i64* %14
%59 = load i64, i64* %14
%60 = load i64, i64* %13
%61 = add i64 %59, %60
store i64 %61, i64* %15
%62 = load i32, i32* %4
%63 = zext i32 %62 to i64
%64 = load i64, i64* %15
%65 = inttoptr i64 %64 to i64*
store i64 %63, i64* %65
%66 = call zeroext i16 (...) @__VERIFIER_nondet_ushort()
store i16 %66, i16* %5
%67 = load i32, i32* %3
%68 = sext i32 %67 to i64
%69 = mul i64 %68, 32
store i64 %69, i64* %16
%70 = load i64, i64* %16
%71 = add i64 %70, 16
store i64 %71, i64* %17
%72 = load i64, i64* %17
%73 = add i64 56, %72
store i64 %73, i64* %18
%74 = load %struct.pci_dev*, %struct.pci_dev** %2
%75 = ptrtoint %struct.pci_dev* %74 to i64
store i64 %75, i64* %19
%76 = load i64, i64* %19
%77 = load i64, i64* %18
%78 = add i64 %76, %77
store i64 %78, i64* %20
%79 = load i16, i16* %5
%80 = zext i16 %79 to i64
store i64 %80, i64* %21
%81 = load i32, i32* %3
%82 = sext i32 %81 to i64
%83 = mul i64 %82, 32
store i64 %83, i64* %22
%84 = load i64, i64* %22
%85 = add i64 %84, 8
store i64 %85, i64* %23
%86 = load i64, i64* %23
%87 = add i64 56, %86
store i64 %87, i64* %24
%88 = load %struct.pci_dev*, %struct.pci_dev** %2
%89 = ptrtoint %struct.pci_dev* %88 to i64
store i64 %89, i64* %25
%90 = load i64, i64* %25
%91 = load i64, i64* %24
%92 = add i64 %90, %91
store i64 %92, i64* %26
%93 = load i64, i64* %26
%94 = inttoptr i64 %93 to i64*
%95 = load i64, i64* %94
store i64 %95, i64* %27
%96 = load i64, i64* %27
%97 = load i64, i64* %21
%98 = add i64 %96, %97
%99 = load i64, i64* %20
%100 = inttoptr i64 %99 to i64*
store i64 %98, i64* %100
%101 = load i32, i32* %3
%102 = add nsw i32 %101, 1
store i32 %102, i32* %3
br label %28
103: ; preds = %33
ret i32 0
}

LLVM IR (-O2):
%struct.pci_dev = type { i32 }
define i32 @pci_enable_device(%struct.pci_dev* %0) {
%2 = ptrtoint %struct.pci_dev* %0 to i64
br label %3
3: ; preds = %1, %3
%4 = phi i64 [ 0, %1 ], [ %19, %3 ]
%5 = shl nuw nsw i64 %4, 5
%6 = add i64 %5, %2
%7 = add i64 %6, 80
%8 = inttoptr i64 %7 to i64*
store i64 256, i64* %8
%9 = tail call i32 (...) @__VERIFIER_nondet_uint()
%10 = add i64 %6, 64
%11 = zext i32 %9 to i64
%12 = inttoptr i64 %10 to i64*
store i64 %11, i64* %12
%13 = tail call zeroext i16 (...) @__VERIFIER_nondet_ushort()
%14 = add i64 %6, 72
%15 = zext i16 %13 to i64
%16 = load i64, i64* %12
%17 = add i64 %16, %15
%18 = inttoptr i64 %14 to i64*
store i64 %17, i64* %18
%19 = add nuw nsw i64 %4, 1
%20 = icmp eq i64 %19, 12
br i1 %20, label %21, label %3
21: ; preds = %3
ret i32 0
}