unsigned int test(const short p16[6 * 64]) {
  unsigned int i = 6;
  unsigned int ret = 0;
  do {
    unsigned long long *p64 = (unsigned long long *)p16;
    unsigned int *p32 = (unsigned int *)p16;
    ret += ret;
    if (p16[1] || p32[1])
      ret++;
    else if (p64[1] | p64[2] | p64[3])
      ret++;
    p16 += 64;
    i--;
  } while (i != 0);
  return ret;
}


x86 assembly (clang, -O0):
<test>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x6,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%eax
add    -0x10(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movswl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    114e <test+0x4e>
mov    -0x20(%rbp),%rax
cmpl   $0x0,0x4(%rax)
je     115c <test+0x5c>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    118c <test+0x8c>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rax
mov    -0x18(%rbp),%rcx
or     0x10(%rcx),%rax
mov    -0x18(%rbp),%rcx
or     0x18(%rcx),%rax
cmp    $0x0,%rax
je     1187 <test+0x87>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    118c <test+0x8c>
mov    -0x8(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x8(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jne    1116 <test+0x16>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<test>:
mov    $0x2,%eax
cmpw   $0x0,0x2(%rdi)
jne    1125 <test+0x25>
cmpl   $0x0,0x4(%rdi)
jne    1125 <test+0x25>
mov    0x10(%rdi),%rcx
or     0x8(%rdi),%rcx
xor    %eax,%eax
or     0x18(%rdi),%rcx
setne  %al
add    %eax,%eax
mov    $0x1,%r8d
cmpw   $0x0,0x82(%rdi)
jne    115a <test+0x5a>
cmpl   $0x0,0x84(%rdi)
jne    115a <test+0x5a>
mov    0x90(%rdi),%rcx
or     0x88(%rdi),%rcx
xor    %r8d,%r8d
or     0x98(%rdi),%rcx
setne  %r8b
mov    $0x2,%r9d
cmpw   $0x0,0x102(%rdi)
jne    1192 <test+0x92>
cmpl   $0x0,0x104(%rdi)
jne    1192 <test+0x92>
mov    0x110(%rdi),%rcx
or     0x108(%rdi),%rcx
xor    %r9d,%r9d
or     0x118(%rdi),%rcx
setne  %r9b
add    %r9d,%r9d
mov    $0x1,%esi
cmpw   $0x0,0x182(%rdi)
jne    11c5 <test+0xc5>
cmpl   $0x0,0x184(%rdi)
jne    11c5 <test+0xc5>
mov    0x190(%rdi),%rcx
or     0x188(%rdi),%rcx
xor    %esi,%esi
or     0x198(%rdi),%rcx
setne  %sil
mov    $0x2,%ecx
cmpw   $0x0,0x202(%rdi)
jne    11f9 <test+0xf9>
cmpl   $0x0,0x204(%rdi)
jne    11f9 <test+0xf9>
mov    0x210(%rdi),%rdx
or     0x208(%rdi),%rdx
xor    %ecx,%ecx
or     0x218(%rdi),%rdx
setne  %cl
add    %ecx,%ecx
mov    $0x1,%edx
cmpw   $0x0,0x282(%rdi)
jne    122b <test+0x12b>
cmpl   $0x0,0x284(%rdi)
jne    122b <test+0x12b>
mov    0x290(%rdi),%r10
or     0x288(%rdi),%r10
xor    %edx,%edx
or     0x298(%rdi),%r10
setne  %dl
or     %r8d,%eax
lea    (%r9,%rax,4),%eax
or     %esi,%eax
lea    (%rcx,%rax,4),%eax
or     %edx,%eax
ret

LLVM IR (-O0):
define i32 @test(i16* %0) {
%2 = alloca i16*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i64*
%6 = alloca i32*
store i16* %0, i16** %2
store i32 6, i32* %3
store i32 0, i32* %4
br label %7
7: ; preds = %50, %1
%8 = load i16*, i16** %2
%9 = bitcast i16* %8 to i64*
store i64* %9, i64** %5
%10 = load i16*, i16** %2
%11 = bitcast i16* %10 to i32*
store i32* %11, i32** %6
%12 = load i32, i32* %4
%13 = load i32, i32* %4
%14 = add i32 %13, %12
store i32 %14, i32* %4
%15 = load i16*, i16** %2
%16 = getelementptr inbounds i16, i16* %15, i64 1
%17 = load i16, i16* %16
%18 = sext i16 %17 to i32
%19 = icmp ne i32 %18, 0
br i1 %19, label %25, label %20
20: ; preds = %7
%21 = load i32*, i32** %6
%22 = getelementptr inbounds i32, i32* %21, i64 1
%23 = load i32, i32* %22
%24 = icmp ne i32 %23, 0
br i1 %24, label %25, label %28
25: ; preds = %20, %7
%26 = load i32, i32* %4
%27 = add i32 %26, 1
store i32 %27, i32* %4
br label %45
28: ; preds = %20
%29 = load i64*, i64** %5
%30 = getelementptr inbounds i64, i64* %29, i64 1
%31 = load i64, i64* %30
%32 = load i64*, i64** %5
%33 = getelementptr inbounds i64, i64* %32, i64 2
%34 = load i64, i64* %33
%35 = or i64 %31, %34
%36 = load i64*, i64** %5
%37 = getelementptr inbounds i64, i64* %36, i64 3
%38 = load i64, i64* %37
%39 = or i64 %35, %38
%40 = icmp ne i64 %39, 0
br i1 %40, label %41, label %44
41: ; preds = %28
%42 = load i32, i32* %4
%43 = add i32 %42, 1
store i32 %43, i32* %4
br label %44
44: ; preds = %41, %28
br label %45
45: ; preds = %44, %25
%46 = load i16*, i16** %2
%47 = getelementptr inbounds i16, i16* %46, i64 64
store i16* %47, i16** %2
%48 = load i32, i32* %3
%49 = add i32 %48, -1
store i32 %49, i32* %3
br label %50
50: ; preds = %45
%51 = load i32, i32* %3
%52 = icmp ne i32 %51, 0
br i1 %52, label %7, label %53
53: ; preds = %50
%54 = load i32, i32* %4
ret i32 %54
}

LLVM IR (-O2):
define i32 @test(i16* nocapture %0) {
%2 = getelementptr inbounds i16, i16* %0, i64 1
%3 = load i16, i16* %2
%4 = icmp eq i16 %3, 0
br i1 %4, label %5, label %24
5: ; preds = %1
%6 = getelementptr inbounds i16, i16* %0, i64 2
%7 = bitcast i16* %6 to i32*
%8 = load i32, i32* %7
%9 = icmp eq i32 %8, 0
br i1 %9, label %10, label %24
10: ; preds = %5
%11 = getelementptr inbounds i16, i16* %0, i64 4
%12 = bitcast i16* %11 to i64*
%13 = load i64, i64* %12
%14 = getelementptr inbounds i16, i16* %0, i64 8
%15 = bitcast i16* %14 to i64*
%16 = load i64, i64* %15
%17 = or i64 %16, %13
%18 = getelementptr inbounds i16, i16* %0, i64 12
%19 = bitcast i16* %18 to i64*
%20 = load i64, i64* %19
%21 = or i64 %17, %20
%22 = icmp eq i64 %21, 0
%23 = select i1 %22, i32 0, i32 2
br label %24
24: ; preds = %1, %5, %10
%25 = phi i32 [ %23, %10 ], [ 2, %5 ], [ 2, %1 ]
%26 = getelementptr inbounds i16, i16* %0, i64 65
%27 = load i16, i16* %26
%28 = icmp eq i16 %27, 0
br i1 %28, label %29, label %48
29: ; preds = %24
%30 = getelementptr inbounds i16, i16* %0, i64 66
%31 = bitcast i16* %30 to i32*
%32 = load i32, i32* %31
%33 = icmp eq i32 %32, 0
br i1 %33, label %34, label %48
34: ; preds = %29
%35 = getelementptr inbounds i16, i16* %0, i64 68
%36 = bitcast i16* %35 to i64*
%37 = load i64, i64* %36
%38 = getelementptr inbounds i16, i16* %0, i64 72
%39 = bitcast i16* %38 to i64*
%40 = load i64, i64* %39
%41 = or i64 %40, %37
%42 = getelementptr inbounds i16, i16* %0, i64 76
%43 = bitcast i16* %42 to i64*
%44 = load i64, i64* %43
%45 = or i64 %41, %44
%46 = icmp ne i64 %45, 0
%47 = zext i1 %46 to i32
br label %48
48: ; preds = %24, %29, %34
%49 = phi i32 [ %47, %34 ], [ 1, %29 ], [ 1, %24 ]
%50 = getelementptr inbounds i16, i16* %0, i64 129
%51 = load i16, i16* %50
%52 = icmp eq i16 %51, 0
br i1 %52, label %53, label %72
53: ; preds = %48
%54 = getelementptr inbounds i16, i16* %0, i64 130
%55 = bitcast i16* %54 to i32*
%56 = load i32, i32* %55
%57 = icmp eq i32 %56, 0
br i1 %57, label %58, label %72
58: ; preds = %53
%59 = getelementptr inbounds i16, i16* %0, i64 132
%60 = bitcast i16* %59 to i64*
%61 = load i64, i64* %60
%62 = getelementptr inbounds i16, i16* %0, i64 136
%63 = bitcast i16* %62 to i64*
%64 = load i64, i64* %63
%65 = or i64 %64, %61
%66 = getelementptr inbounds i16, i16* %0, i64 140
%67 = bitcast i16* %66 to i64*
%68 = load i64, i64* %67
%69 = or i64 %65, %68
%70 = icmp eq i64 %69, 0
%71 = select i1 %70, i32 0, i32 2
br label %72
72: ; preds = %48, %53, %58
%73 = phi i32 [ %71, %58 ], [ 2, %53 ], [ 2, %48 ]
%74 = getelementptr inbounds i16, i16* %0, i64 193
%75 = load i16, i16* %74
%76 = icmp eq i16 %75, 0
br i1 %76, label %77, label %96
77: ; preds = %72
%78 = getelementptr inbounds i16, i16* %0, i64 194
%79 = bitcast i16* %78 to i32*
%80 = load i32, i32* %79
%81 = icmp eq i32 %80, 0
br i1 %81, label %82, label %96
82: ; preds = %77
%83 = getelementptr inbounds i16, i16* %0, i64 196
%84 = bitcast i16* %83 to i64*
%85 = load i64, i64* %84
%86 = getelementptr inbounds i16, i16* %0, i64 200
%87 = bitcast i16* %86 to i64*
%88 = load i64, i64* %87
%89 = or i64 %88, %85
%90 = getelementptr inbounds i16, i16* %0, i64 204
%91 = bitcast i16* %90 to i64*
%92 = load i64, i64* %91
%93 = or i64 %89, %92
%94 = icmp ne i64 %93, 0
%95 = zext i1 %94 to i32
br label %96
96: ; preds = %72, %77, %82
%97 = phi i32 [ %95, %82 ], [ 1, %77 ], [ 1, %72 ]
%98 = getelementptr inbounds i16, i16* %0, i64 257
%99 = load i16, i16* %98
%100 = icmp eq i16 %99, 0
br i1 %100, label %101, label %120
101: ; preds = %96
%102 = getelementptr inbounds i16, i16* %0, i64 258
%103 = bitcast i16* %102 to i32*
%104 = load i32, i32* %103
%105 = icmp eq i32 %104, 0
br i1 %105, label %106, label %120
106: ; preds = %101
%107 = getelementptr inbounds i16, i16* %0, i64 260
%108 = bitcast i16* %107 to i64*
%109 = load i64, i64* %108
%110 = getelementptr inbounds i16, i16* %0, i64 264
%111 = bitcast i16* %110 to i64*
%112 = load i64, i64* %111
%113 = or i64 %112, %109
%114 = getelementptr inbounds i16, i16* %0, i64 268
%115 = bitcast i16* %114 to i64*
%116 = load i64, i64* %115
%117 = or i64 %113, %116
%118 = icmp eq i64 %117, 0
%119 = select i1 %118, i32 0, i32 2
br label %120
120: ; preds = %96, %101, %106
%121 = phi i32 [ %119, %106 ], [ 2, %101 ], [ 2, %96 ]
%122 = getelementptr inbounds i16, i16* %0, i64 321
%123 = load i16, i16* %122
%124 = icmp eq i16 %123, 0
br i1 %124, label %125, label %144
125: ; preds = %120
%126 = getelementptr inbounds i16, i16* %0, i64 322
%127 = bitcast i16* %126 to i32*
%128 = load i32, i32* %127
%129 = icmp eq i32 %128, 0
br i1 %129, label %130, label %144
130: ; preds = %125
%131 = getelementptr inbounds i16, i16* %0, i64 324
%132 = bitcast i16* %131 to i64*
%133 = load i64, i64* %132
%134 = getelementptr inbounds i16, i16* %0, i64 328
%135 = bitcast i16* %134 to i64*
%136 = load i64, i64* %135
%137 = or i64 %136, %133
%138 = getelementptr inbounds i16, i16* %0, i64 332
%139 = bitcast i16* %138 to i64*
%140 = load i64, i64* %139
%141 = or i64 %137, %140
%142 = icmp ne i64 %141, 0
%143 = zext i1 %142 to i32
br label %144
144: ; preds = %120, %125, %130
%145 = phi i32 [ %143, %130 ], [ 1, %125 ], [ 1, %120 ]
%146 = or i32 %25, %49
%147 = shl nuw nsw i32 %146, 2
%148 = or i32 %147, %73
%149 = or i32 %148, %97
%150 = shl nuw nsw i32 %149, 2
%151 = or i32 %150, %121
%152 = or i32 %151, %145
ret i32 %152
}