#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 */
int /*<<< orphan*/ Initialize();
int main(void) {
  int j;
  Initialize();
  (*((volatile unsigned long *)0xE0028008)) |= 0x04000000;
  (*((volatile unsigned long *)0xE0028004)) = 0x04000000;
  (*((volatile unsigned long *)0xE002800C)) = 0x04000000;
  while (1) {
    {
      (*((volatile unsigned long *)0xE002800C)) = 0x04000000;
      for (j = 0; j < 300000; j++)
        ;
      (*((volatile unsigned long *)0xE0028004)) = 0x04000000;
      for (j = 0; j < 200000; j++)
        ;
    }
  }
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x0,%al
call   1030 <Initialize@plt>
mov    $0xe0028008,%eax
mov    (%rax),%rcx
or     $0x4000000,%rcx
mov    $0xe0028008,%eax
mov    %rcx,(%rax)
mov    $0xe0028004,%eax
movq   $0x4000000,(%rax)
mov    $0xe002800c,%eax
movq   $0x4000000,(%rax)
mov    $0xe002800c,%eax
movq   $0x4000000,(%rax)
movl   $0x0,-0x8(%rbp)
cmpl   $0x493e0,-0x8(%rbp)
jge    1188 <main+0x78>
jmp    117a <main+0x6a>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1168 <main+0x58>
mov    $0xe0028004,%eax
movq   $0x4000000,(%rax)
movl   $0x0,-0x8(%rbp)
cmpl   $0x30d40,-0x8(%rbp)
jge    11bb <main+0xab>
jmp    11ad <main+0x9d>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    119b <main+0x8b>
jmp    1155 <main+0x45>

x86 assembly (clang, -O2):
<main>:
push   %rbx
mov    $0xe0028004,%ebx
xor    %eax,%eax
call   1030 <Initialize@plt>
orq    $0x4000000,0x4(%rbx)
04
movq   $0x4000000,(%rbx)
movq   $0x4000000,0x8(%rbx)
04
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movq   $0x4000000,0x8(%rbx)
04
movq   $0x4000000,(%rbx)
jmp    1140 <main+0x30>

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
store i32 0, i32* %1
%3 = call i32 (...) @Initialize()
%4 = load volatile i64, i64* inttoptr (i64 3758260232 to i64*)
%5 = or i64 %4, 67108864
store volatile i64 %5, i64* inttoptr (i64 3758260232 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758260228 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758260236 to i64*)
br label %6
6: ; preds = %0, %22
store volatile i64 67108864, i64* inttoptr (i64 3758260236 to i64*)
store i32 0, i32* %2
br label %7
7: ; preds = %11, %6
%8 = load i32, i32* %2
%9 = icmp slt i32 %8, 300000
br i1 %9, label %10, label %14
10: ; preds = %7
br label %11
11: ; preds = %10
%12 = load i32, i32* %2
%13 = add nsw i32 %12, 1
store i32 %13, i32* %2
br label %7
14: ; preds = %7
store volatile i64 67108864, i64* inttoptr (i64 3758260228 to i64*)
store i32 0, i32* %2
br label %15
15: ; preds = %19, %14
%16 = load i32, i32* %2
%17 = icmp slt i32 %16, 200000
br i1 %17, label %18, label %22
18: ; preds = %15
br label %19
19: ; preds = %18
%20 = load i32, i32* %2
%21 = add nsw i32 %20, 1
store i32 %21, i32* %2
br label %15
22: ; preds = %15
br label %6
}

LLVM IR (-O2):
define i32 @main() {
%1 = tail call i32 (...) @Initialize()
%2 = load volatile i64, i64* inttoptr (i64 3758260232 to i64*)
%3 = or i64 %2, 67108864
store volatile i64 %3, i64* inttoptr (i64 3758260232 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758260228 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758260236 to i64*)
br label %4
4: ; preds = %4, %0
store volatile i64 67108864, i64* inttoptr (i64 3758260236 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758260228 to i64*)
br label %4
}