#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*/ abort();
int main() {
  unsigned short A[16] = {36, 39, 42, 45, 43, 32, 21, 12,
                          23, 34, 45, 56, 67, 78, 89, 11};
  unsigned short B[16] = {0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 3, 14, 25, 36, 47, 0};
  unsigned int i, j;
  unsigned m;
  for (i = 0; i < 16; i++) {
    m = A[i];
    A[i] = (unsigned short)(m >= 42 ? m - 42 : 0);
  }
  for (i = 0; i < 16; i++)
    if (A[i] != B[i])
      abort();
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movl   $0x0,-0x4(%rbp)
mov    0xeda(%rip),%rax
mov    %rax,-0x30(%rbp)
mov    0xed7(%rip),%rax
mov    %rax,-0x28(%rbp)
mov    0xed4(%rip),%rax
mov    %rax,-0x20(%rbp)
mov    0xed1(%rip),%rax
mov    %rax,-0x18(%rbp)
mov    0xece(%rip),%rax
mov    %rax,-0x50(%rbp)
mov    0xecb(%rip),%rax
mov    %rax,-0x48(%rbp)
mov    0xec8(%rip),%rax
mov    %rax,-0x40(%rbp)
mov    0xec5(%rip),%rax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x54(%rbp)
cmpl   $0x10,-0x54(%rbp)
jae    11d1 <main+0xc1>
mov    -0x54(%rbp),%eax
movzwl -0x30(%rbp,%rax,2),%eax
mov    %eax,-0x5c(%rbp)
cmpl   $0x2a,-0x5c(%rbp)
jb     11ab <main+0x9b>
mov    -0x5c(%rbp),%eax
sub    $0x2a,%eax
mov    %eax,-0x60(%rbp)
jmp    11b5 <main+0xa5>
xor    %eax,%eax
mov    %eax,-0x60(%rbp)
jmp    11b5 <main+0xa5>
mov    -0x60(%rbp),%eax
mov    %ax,%cx
mov    -0x54(%rbp),%eax
mov    %cx,-0x30(%rbp,%rax,2)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    117e <main+0x6e>
movl   $0x0,-0x54(%rbp)
cmpl   $0x10,-0x54(%rbp)
jae    1214 <main+0x104>
mov    -0x54(%rbp),%eax
movzwl -0x30(%rbp,%rax,2),%eax
mov    -0x54(%rbp),%ecx
movzwl -0x50(%rbp,%rcx,2),%ecx
cmp    %ecx,%eax
je     1201 <main+0xf1>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    1206 <main+0xf6>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11d8 <main+0xc8>
xor    %eax,%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
xor    %eax,%eax
ret

LLVM IR (-O0):
@__const.main.A = [16 x i16] [i16 36, i16 39, i16 42, i16 45, i16 43, i16 32, i16 21, i16 12, i16 23, i16 34, i16 45, i16 56, i16 67, i16 78, i16 89, i16 11]
@__const.main.B = [16 x i16] [i16 0, i16 0, i16 0, i16 3, i16 1, i16 0, i16 0, i16 0, i16 0, i16 0, i16 3, i16 14, i16 25, i16 36, i16 47, i16 0]
define i32 @main() {
%1 = alloca i32
%2 = alloca [16 x i16]
%3 = alloca [16 x i16]
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store i32 0, i32* %1
%7 = bitcast [16 x i16]* %2 to i8*
%8 = bitcast [16 x i16]* %3 to i8*
store i32 0, i32* %4
br label %9
9: ; preds = %30, %0
%10 = load i32, i32* %4
%11 = icmp ult i32 %10, 16
br i1 %11, label %12, label %33
12: ; preds = %9
%13 = load i32, i32* %4
%14 = zext i32 %13 to i64
%15 = getelementptr inbounds [16 x i16], [16 x i16]* %2, i64 0, i64 %14
%16 = load i16, i16* %15
%17 = zext i16 %16 to i32
store i32 %17, i32* %6
%18 = load i32, i32* %6
%19 = icmp uge i32 %18, 42
br i1 %19, label %20, label %23
20: ; preds = %12
%21 = load i32, i32* %6
%22 = sub i32 %21, 42
br label %24
23: ; preds = %12
br label %24
24: ; preds = %23, %20
%25 = phi i32 [ %22, %20 ], [ 0, %23 ]
%26 = trunc i32 %25 to i16
%27 = load i32, i32* %4
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds [16 x i16], [16 x i16]* %2, i64 0, i64 %28
store i16 %26, i16* %29
br label %30
30: ; preds = %24
%31 = load i32, i32* %4
%32 = add i32 %31, 1
store i32 %32, i32* %4
br label %9
33: ; preds = %9
store i32 0, i32* %4
br label %34
34: ; preds = %52, %33
%35 = load i32, i32* %4
%36 = icmp ult i32 %35, 16
br i1 %36, label %37, label %55
37: ; preds = %34
%38 = load i32, i32* %4
%39 = zext i32 %38 to i64
%40 = getelementptr inbounds [16 x i16], [16 x i16]* %2, i64 0, i64 %39
%41 = load i16, i16* %40
%42 = zext i16 %41 to i32
%43 = load i32, i32* %4
%44 = zext i32 %43 to i64
%45 = getelementptr inbounds [16 x i16], [16 x i16]* %3, i64 0, i64 %44
%46 = load i16, i16* %45
%47 = zext i16 %46 to i32
%48 = icmp ne i32 %42, %47
br i1 %48, label %49, label %51
49: ; preds = %37
%50 = call i32 (...) @abort()
unreachable
51: ; preds = %37
br label %52
52: ; preds = %51
%53 = load i32, i32* %4
%54 = add i32 %53, 1
store i32 %54, i32* %4
br label %34
55: ; preds = %34
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
ret i32 0
}