void foo(unsigned f, long v, unsigned *w, unsigned a, unsigned b, unsigned e,
         unsigned c, unsigned d) {
  unsigned h = v / 4, x[16];
  while (f < h) {
    unsigned i;
    f++;
    a |= (a >> 30);
    d = (d << 30) | ((unsigned)d >> 30);
    c = (c << 30) | ((unsigned)c >> 30);
    b = 30 | ((unsigned)b >> 30);
    d += a = (a << 30) | ((unsigned)a >> 2);
    c += ((d << 5) | (d >> 27)) + ((e & (a ^ b))) + 0x5a827999 + x[12];
    a += (c & e);
    c = 30 | ((unsigned)c);
    i = x[5] ^ x[7] ^ x[8] ^ x[3];
    x[5] = (i << 1) | ((unsigned)i >> 31);
    i = x[6] ^ x[2] ^ x[14] ^ x[13];
    x[6] = (i << 1) | (i >> 31);
    b += (c | (c >> 5)) + (d ^ e) + 0x6ed9eba1 +
         (x[7] = (i << 1) | ((unsigned)i >> 31));
    x[8] = i | 1;
    e += (a | 5) + b + (i = x[9] ^ x[6], x[10] = (i << (unsigned)i));
    e = 30 | ((unsigned)e >> 30);
    i = x[12] ^ x[14] ^ x[12] ^ x[12], (x[12] = 1 | ((unsigned)i));
    i = x[13] ^ x[5] ^ x[10], (x[13] = (i << (unsigned)1));
    i = x[2] ^ x[7] ^ x[12], (x[15] = i | ((unsigned)i >> 1));
    i = x[2] ^ x[0] ^ x[13], (x[0] = (i << 1) | 31);
    e = (e << 30) | 2;
    i = x[14] ^ x[2] ^ x[15], (x[2] = i | 1);
    x[3] = i | ((unsigned)i);
    i = x[14] ^ x[12] ^ x[4], (x[4] = 1 | ((unsigned)i >> 1));
    x[5] = i | 1;
    e = (e << 30) | 30;
    b += (5 | ((unsigned)e >> 5)) + 0x8f1bbcdc +
         (x[9] = (i | ((unsigned)i >> 1)));
    i = x[2] ^ (x[10] = ((i << 1) | (i >> 1)));
    x[13] = (i | ((unsigned)i >> 1));
    (i = x[14] ^ x[0] ^ x[14], (x[14] = ((i << 1) | 31)));
    a = *w += a;
  }
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    $0x4,%ecx
cqto
idiv   %rcx
mov    %eax,-0x28(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x28(%rbp),%eax
jae    13ae <foo+0x2ae>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
mov    -0x1c(%rbp),%eax
shr    $0x1e,%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    0x18(%rbp),%eax
shl    $0x1e,%eax
mov    0x18(%rbp),%ecx
shr    $0x1e,%ecx
or     %ecx,%eax
mov    %eax,0x18(%rbp)
mov    0x10(%rbp),%eax
shl    $0x1e,%eax
mov    0x10(%rbp),%ecx
shr    $0x1e,%ecx
or     %ecx,%eax
mov    %eax,0x10(%rbp)
mov    -0x20(%rbp),%eax
shr    $0x1e,%eax
or     $0x1e,%eax
mov    %eax,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x1e,%eax
mov    -0x1c(%rbp),%ecx
shr    $0x2,%ecx
or     %ecx,%eax
mov    %eax,-0x1c(%rbp)
add    0x18(%rbp),%eax
mov    %eax,0x18(%rbp)
mov    0x18(%rbp),%eax
shl    $0x5,%eax
mov    0x18(%rbp),%ecx
shr    $0x1b,%ecx
or     %ecx,%eax
mov    -0x24(%rbp),%ecx
mov    -0x1c(%rbp),%edx
xor    -0x20(%rbp),%edx
and    %edx,%ecx
add    %ecx,%eax
add    $0x5a827999,%eax
add    -0x40(%rbp),%eax
add    0x10(%rbp),%eax
mov    %eax,0x10(%rbp)
mov    0x10(%rbp),%eax
and    -0x24(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    0x10(%rbp),%eax
or     $0x1e,%eax
mov    %eax,0x10(%rbp)
mov    -0x5c(%rbp),%eax
xor    -0x54(%rbp),%eax
xor    -0x50(%rbp),%eax
xor    -0x64(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
shl    $0x1,%eax
mov    -0x74(%rbp),%ecx
shr    $0x1f,%ecx
or     %ecx,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x58(%rbp),%eax
xor    -0x68(%rbp),%eax
xor    -0x38(%rbp),%eax
xor    -0x3c(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
shl    $0x1,%eax
mov    -0x74(%rbp),%ecx
shr    $0x1f,%ecx
or     %ecx,%eax
mov    %eax,-0x58(%rbp)
mov    0x10(%rbp),%eax
mov    0x10(%rbp),%ecx
shr    $0x5,%ecx
or     %ecx,%eax
mov    0x18(%rbp),%ecx
xor    -0x24(%rbp),%ecx
add    %ecx,%eax
add    $0x6ed9eba1,%eax
mov    -0x74(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x74(%rbp),%edx
shr    $0x1f,%edx
or     %edx,%ecx
mov    %ecx,-0x54(%rbp)
add    %ecx,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x74(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x50(%rbp)
mov    -0x1c(%rbp),%eax
or     $0x5,%eax
add    -0x20(%rbp),%eax
mov    -0x4c(%rbp),%ecx
xor    -0x58(%rbp),%ecx
mov    %ecx,-0x74(%rbp)
mov    -0x74(%rbp),%edx
mov    -0x74(%rbp),%ecx
shl    %cl,%edx
mov    %edx,%ecx
mov    %ecx,-0x48(%rbp)
add    %ecx,%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shr    $0x1e,%eax
or     $0x1e,%eax
mov    %eax,-0x24(%rbp)
mov    -0x40(%rbp),%eax
xor    -0x38(%rbp),%eax
xor    -0x40(%rbp),%eax
xor    -0x40(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x3c(%rbp),%eax
xor    -0x5c(%rbp),%eax
xor    -0x48(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x68(%rbp),%eax
xor    -0x54(%rbp),%eax
xor    -0x40(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
mov    -0x74(%rbp),%ecx
shr    $0x1,%ecx
or     %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x68(%rbp),%eax
xor    -0x70(%rbp),%eax
xor    -0x3c(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
shl    $0x1,%eax
or     $0x1f,%eax
mov    %eax,-0x70(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1e,%eax
or     $0x2,%eax
mov    %eax,-0x24(%rbp)
mov    -0x38(%rbp),%eax
xor    -0x68(%rbp),%eax
xor    -0x34(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x68(%rbp)
mov    -0x74(%rbp),%eax
or     -0x74(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x38(%rbp),%eax
xor    -0x40(%rbp),%eax
xor    -0x60(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
shr    $0x1,%eax
or     $0x1,%eax
mov    %eax,-0x60(%rbp)
mov    -0x74(%rbp),%eax
or     $0x1,%eax
mov    %eax,-0x5c(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x1e,%eax
or     $0x1e,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shr    $0x5,%eax
or     $0x5,%eax
add    $0x8f1bbcdc,%eax
mov    -0x74(%rbp),%ecx
mov    -0x74(%rbp),%edx
shr    $0x1,%edx
or     %edx,%ecx
mov    %ecx,-0x4c(%rbp)
add    %ecx,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x68(%rbp),%eax
mov    -0x74(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x74(%rbp),%edx
shr    $0x1,%edx
or     %edx,%ecx
mov    %ecx,-0x48(%rbp)
xor    %ecx,%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
mov    -0x74(%rbp),%ecx
shr    $0x1,%ecx
or     %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
xor    -0x70(%rbp),%eax
xor    -0x38(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
shl    $0x1,%eax
or     $0x1f,%eax
mov    %eax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x18(%rbp),%rcx
add    (%rcx),%eax
mov    %eax,(%rcx)
mov    %eax,-0x1c(%rbp)
jmp    1131 <foo+0x31>
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
lea    0x3(%rsi),%rax
test   %rsi,%rsi
cmovns %rsi,%rax
shr    $0x2,%rax
sub    %edi,%eax
jbe    12a7 <foo+0x1a7>
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %ecx,%r15d
mov    0x40(%rsp),%r12d
mov    0x38(%rsp),%ebx
mov    %rdx,-0x10(%rsp)
mov    (%rdx),%ecx
mov    %ecx,-0x24(%rsp)
mov    %rax,%rsi
mov    %r9d,-0x28(%rsp)
mov    %rsi,-0x8(%rsp)
xor    %edx,%eax
mov    %r15d,%esi
shr    $0x1e,%esi
or     %r15d,%esi
mov    %r12d,%edi
shl    $0x1e,%edi
shr    $0x1e,%r12d
or     %edi,%r12d
mov    %ebx,%edi
shl    $0x1e,%edi
shr    $0x1e,%ebx
or     %edi,%ebx
shld   $0x1e,%r15d,%esi
shr    $0x1e,%r8d
add    %esi,%r12d
mov    %r12d,-0x1c(%rsp)
mov    %r12d,%edi
rol    $0x5,%edi
or     $0x1e,%r8d
mov    %esi,%edx
xor    %r8d,%edx
mov    -0x28(%rsp),%r15d
and    %r15d,%edx
add    -0x20(%rsp),%ebx
mov    -0x1c(%rsp),%r12d
add    %edx,%ebx
add    %ebx,%edi
add    $0x5a827999,%edi
mov    %edi,%edx
and    %r15d,%edx
add    %esi,%edx
add    %edx,-0x24(%rsp)
mov    %edi,%ebx
or     $0x1e,%ebx
xor    %r11d,%r10d
xor    %eax,%r10d
add    %r10d,%r10d
mov    %r13d,%esi
mov    -0x14(%rsp),%eax
xor    %eax,%esi
mov    %eax,%edx
xor    %r9d,%r11d
xor    %esi,%r11d
mov    %r11d,%eax
rol    %r11d
shr    $0x5,%edi
or     %ebx,%edi
xor    %r11d,%ecx
shl    %cl,%ecx
xor    %r12d,%r15d
mov    %r15d,-0x28(%rsp)
or     $0x1,%eax
mov    %eax,-0x18(%rsp)
mov    -0x20(%rsp),%eax
xor    %edx,%eax
mov    %edx,%r15d
or     $0x1,%eax
mov    %eax,%edx
xor    %r9d,%r10d
xor    %ecx,%r10d
xor    %r13d,%r14d
xor    %eax,%r13d
xor    %r11d,%r13d
mov    %r13d,%eax
shr    %eax
or     %r13d,%eax
shl    $0x2,%r10d
add    %r14d,%r14d
xor    %r10d,%r14d
or     $0x1f,%r14d
xor    %esi,%eax
mov    %eax,%r13d
or     $0x1,%r13d
xor    %r15d,%ebp
mov    %edx,-0x20(%rsp)
xor    %edx,%ebp
mov    %ebp,%esi
shr    %esi
mov    %ebp,%edx
mov    %esi,%ecx
or     %ebp,%ecx
add    %ebp,%ebp
or     %esi,%ebp
or     $0x1,%esi
or     $0x1,%edx
add    %ecx,%r8d
add    %r11d,%r8d
add    -0x28(%rsp),%r8d
add    %edi,%r8d
add    $0x1f5a882,%r8d
xor    %r13d,%ebp
mov    %ebp,%r9d
shr    %r9d
or     %ebp,%r9d
lea    (%r14,%r14,1),%edi
or     $0x1f,%edi
mov    %edi,-0x14(%rsp)
movl   $0x8000001e,-0x28(%rsp)
80
mov    -0x24(%rsp),%r15d
mov    %esi,%ebp
mov    -0x8(%rsp),%rsi
mov    -0x18(%rsp),%r10d
add    $0xffffffff,%esi
jne    1140 <foo+0x40>
mov    -0x10(%rsp),%rax
mov    -0x24(%rsp),%ecx
mov    %ecx,(%rax)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @foo(i32 %0, i64 %1, i32* %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7) {
%9 = alloca i32
%10 = alloca i64
%11 = alloca i32*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca [16 x i32]
%19 = alloca i32
store i32 %0, i32* %9
store i64 %1, i64* %10
store i32* %2, i32** %11
store i32 %3, i32* %12
store i32 %4, i32* %13
store i32 %5, i32* %14
store i32 %6, i32* %15
store i32 %7, i32* %16
%20 = load i64, i64* %10
%21 = sdiv i64 %20, 4
%22 = trunc i64 %21 to i32
store i32 %22, i32* %17
br label %23
23: ; preds = %27, %8
%24 = load i32, i32* %9
%25 = load i32, i32* %17
%26 = icmp ult i32 %24, %25
br i1 %26, label %27, label %280
27: ; preds = %23
%28 = load i32, i32* %9
%29 = add i32 %28, 1
store i32 %29, i32* %9
%30 = load i32, i32* %12
%31 = lshr i32 %30, 30
%32 = load i32, i32* %12
%33 = or i32 %32, %31
store i32 %33, i32* %12
%34 = load i32, i32* %16
%35 = shl i32 %34, 30
%36 = load i32, i32* %16
%37 = lshr i32 %36, 30
%38 = or i32 %35, %37
store i32 %38, i32* %16
%39 = load i32, i32* %15
%40 = shl i32 %39, 30
%41 = load i32, i32* %15
%42 = lshr i32 %41, 30
%43 = or i32 %40, %42
store i32 %43, i32* %15
%44 = load i32, i32* %13
%45 = lshr i32 %44, 30
%46 = or i32 30, %45
store i32 %46, i32* %13
%47 = load i32, i32* %12
%48 = shl i32 %47, 30
%49 = load i32, i32* %12
%50 = lshr i32 %49, 2
%51 = or i32 %48, %50
store i32 %51, i32* %12
%52 = load i32, i32* %16
%53 = add i32 %52, %51
store i32 %53, i32* %16
%54 = load i32, i32* %16
%55 = shl i32 %54, 5
%56 = load i32, i32* %16
%57 = lshr i32 %56, 27
%58 = or i32 %55, %57
%59 = load i32, i32* %14
%60 = load i32, i32* %12
%61 = load i32, i32* %13
%62 = xor i32 %60, %61
%63 = and i32 %59, %62
%64 = add i32 %58, %63
%65 = add i32 %64, 1518500249
%66 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
%67 = load i32, i32* %66
%68 = add i32 %65, %67
%69 = load i32, i32* %15
%70 = add i32 %69, %68
store i32 %70, i32* %15
%71 = load i32, i32* %15
%72 = load i32, i32* %14
%73 = and i32 %71, %72
%74 = load i32, i32* %12
%75 = add i32 %74, %73
store i32 %75, i32* %12
%76 = load i32, i32* %15
%77 = or i32 30, %76
store i32 %77, i32* %15
%78 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 5
%79 = load i32, i32* %78
%80 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 7
%81 = load i32, i32* %80
%82 = xor i32 %79, %81
%83 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 8
%84 = load i32, i32* %83
%85 = xor i32 %82, %84
%86 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 3
%87 = load i32, i32* %86
%88 = xor i32 %85, %87
store i32 %88, i32* %19
%89 = load i32, i32* %19
%90 = shl i32 %89, 1
%91 = load i32, i32* %19
%92 = lshr i32 %91, 31
%93 = or i32 %90, %92
%94 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 5
store i32 %93, i32* %94
%95 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 6
%96 = load i32, i32* %95
%97 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 2
%98 = load i32, i32* %97
%99 = xor i32 %96, %98
%100 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
%101 = load i32, i32* %100
%102 = xor i32 %99, %101
%103 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 13
%104 = load i32, i32* %103
%105 = xor i32 %102, %104
store i32 %105, i32* %19
%106 = load i32, i32* %19
%107 = shl i32 %106, 1
%108 = load i32, i32* %19
%109 = lshr i32 %108, 31
%110 = or i32 %107, %109
%111 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 6
store i32 %110, i32* %111
%112 = load i32, i32* %15
%113 = load i32, i32* %15
%114 = lshr i32 %113, 5
%115 = or i32 %112, %114
%116 = load i32, i32* %16
%117 = load i32, i32* %14
%118 = xor i32 %116, %117
%119 = add i32 %115, %118
%120 = add i32 %119, 1859775393
%121 = load i32, i32* %19
%122 = shl i32 %121, 1
%123 = load i32, i32* %19
%124 = lshr i32 %123, 31
%125 = or i32 %122, %124
%126 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 7
store i32 %125, i32* %126
%127 = add i32 %120, %125
%128 = load i32, i32* %13
%129 = add i32 %128, %127
store i32 %129, i32* %13
%130 = load i32, i32* %19
%131 = or i32 %130, 1
%132 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 8
store i32 %131, i32* %132
%133 = load i32, i32* %12
%134 = or i32 %133, 5
%135 = load i32, i32* %13
%136 = add i32 %134, %135
%137 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 9
%138 = load i32, i32* %137
%139 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 6
%140 = load i32, i32* %139
%141 = xor i32 %138, %140
store i32 %141, i32* %19
%142 = load i32, i32* %19
%143 = load i32, i32* %19
%144 = shl i32 %142, %143
%145 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 10
store i32 %144, i32* %145
%146 = add i32 %136, %144
%147 = load i32, i32* %14
%148 = add i32 %147, %146
store i32 %148, i32* %14
%149 = load i32, i32* %14
%150 = lshr i32 %149, 30
%151 = or i32 30, %150
store i32 %151, i32* %14
%152 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
%153 = load i32, i32* %152
%154 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
%155 = load i32, i32* %154
%156 = xor i32 %153, %155
%157 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
%158 = load i32, i32* %157
%159 = xor i32 %156, %158
%160 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
%161 = load i32, i32* %160
%162 = xor i32 %159, %161
store i32 %162, i32* %19
%163 = load i32, i32* %19
%164 = or i32 1, %163
%165 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
store i32 %164, i32* %165
%166 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 13
%167 = load i32, i32* %166
%168 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 5
%169 = load i32, i32* %168
%170 = xor i32 %167, %169
%171 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 10
%172 = load i32, i32* %171
%173 = xor i32 %170, %172
store i32 %173, i32* %19
%174 = load i32, i32* %19
%175 = shl i32 %174, 1
%176 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 13
store i32 %175, i32* %176
%177 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 2
%178 = load i32, i32* %177
%179 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 7
%180 = load i32, i32* %179
%181 = xor i32 %178, %180
%182 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
%183 = load i32, i32* %182
%184 = xor i32 %181, %183
store i32 %184, i32* %19
%185 = load i32, i32* %19
%186 = load i32, i32* %19
%187 = lshr i32 %186, 1
%188 = or i32 %185, %187
%189 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 15
store i32 %188, i32* %189
%190 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 2
%191 = load i32, i32* %190
%192 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 0
%193 = load i32, i32* %192
%194 = xor i32 %191, %193
%195 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 13
%196 = load i32, i32* %195
%197 = xor i32 %194, %196
store i32 %197, i32* %19
%198 = load i32, i32* %19
%199 = shl i32 %198, 1
%200 = or i32 %199, 31
%201 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 0
store i32 %200, i32* %201
%202 = load i32, i32* %14
%203 = shl i32 %202, 30
%204 = or i32 %203, 2
store i32 %204, i32* %14
%205 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
%206 = load i32, i32* %205
%207 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 2
%208 = load i32, i32* %207
%209 = xor i32 %206, %208
%210 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 15
%211 = load i32, i32* %210
%212 = xor i32 %209, %211
store i32 %212, i32* %19
%213 = load i32, i32* %19
%214 = or i32 %213, 1
%215 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 2
store i32 %214, i32* %215
%216 = load i32, i32* %19
%217 = load i32, i32* %19
%218 = or i32 %216, %217
%219 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 3
store i32 %218, i32* %219
%220 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
%221 = load i32, i32* %220
%222 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 12
%223 = load i32, i32* %222
%224 = xor i32 %221, %223
%225 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 4
%226 = load i32, i32* %225
%227 = xor i32 %224, %226
store i32 %227, i32* %19
%228 = load i32, i32* %19
%229 = lshr i32 %228, 1
%230 = or i32 1, %229
%231 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 4
store i32 %230, i32* %231
%232 = load i32, i32* %19
%233 = or i32 %232, 1
%234 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 5
store i32 %233, i32* %234
%235 = load i32, i32* %14
%236 = shl i32 %235, 30
%237 = or i32 %236, 30
store i32 %237, i32* %14
%238 = load i32, i32* %14
%239 = lshr i32 %238, 5
%240 = or i32 5, %239
%241 = add i32 %240, -1894007588
%242 = load i32, i32* %19
%243 = load i32, i32* %19
%244 = lshr i32 %243, 1
%245 = or i32 %242, %244
%246 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 9
store i32 %245, i32* %246
%247 = add i32 %241, %245
%248 = load i32, i32* %13
%249 = add i32 %248, %247
store i32 %249, i32* %13
%250 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 2
%251 = load i32, i32* %250
%252 = load i32, i32* %19
%253 = shl i32 %252, 1
%254 = load i32, i32* %19
%255 = lshr i32 %254, 1
%256 = or i32 %253, %255
%257 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 10
store i32 %256, i32* %257
%258 = xor i32 %251, %256
store i32 %258, i32* %19
%259 = load i32, i32* %19
%260 = load i32, i32* %19
%261 = lshr i32 %260, 1
%262 = or i32 %259, %261
%263 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 13
store i32 %262, i32* %263
%264 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
%265 = load i32, i32* %264
%266 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 0
%267 = load i32, i32* %266
%268 = xor i32 %265, %267
%269 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
%270 = load i32, i32* %269
%271 = xor i32 %268, %270
store i32 %271, i32* %19
%272 = load i32, i32* %19
%273 = shl i32 %272, 1
%274 = or i32 %273, 31
%275 = getelementptr inbounds [16 x i32], [16 x i32]* %18, i64 0, i64 14
store i32 %274, i32* %275
%276 = load i32, i32* %12
%277 = load i32*, i32** %11
%278 = load i32, i32* %277
%279 = add i32 %278, %276
store i32 %279, i32* %277
store i32 %279, i32* %12
br label %23
280: ; preds = %23
ret void
}

LLVM IR (-O2):
define void @foo(i32 %0, i64 %1, i32* nocapture %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7) {
%9 = sdiv i64 %1, 4
%10 = trunc i64 %9 to i32
%11 = icmp ugt i32 %10, %0
br i1 %11, label %12, label %106
12: ; preds = %8
%13 = load i32, i32* %2
br label %14
14: ; preds = %12, %14
%15 = phi i32 [ %13, %12 ], [ %103, %14 ]
%16 = phi i32 [ %0, %12 ], [ %33, %14 ]
%17 = phi i32 [ undef, %12 ], [ %82, %14 ]
%18 = phi i32 [ %3, %12 ], [ %103, %14 ]
%19 = phi i32 [ undef, %12 ], [ %84, %14 ]
%20 = phi i32 [ undef, %12 ], [ %83, %14 ]
%21 = phi i32 [ undef, %12 ], [ %88, %14 ]
%22 = phi i32 [ undef, %12 ], [ %89, %14 ]
%23 = phi i32 [ undef, %12 ], [ %63, %14 ]
%24 = phi i32 [ undef, %12 ], [ %67, %14 ]
%25 = phi i32 [ undef, %12 ], [ %90, %14 ]
%26 = phi i32 [ %4, %12 ], [ %95, %14 ]
%27 = phi i32 [ %5, %12 ], [ -2147483618, %14 ]
%28 = phi i32 [ undef, %12 ], [ %71, %14 ]
%29 = phi i32 [ undef, %12 ], [ %100, %14 ]
%30 = phi i32 [ undef, %12 ], [ %102, %14 ]
%31 = phi i32 [ %6, %12 ], [ %55, %14 ]
%32 = phi i32 [ %7, %12 ], [ %44, %14 ]
%33 = add nuw i32 %16, 1
%34 = lshr i32 %18, 30
%35 = or i32 %34, %18
%36 = shl i32 %32, 30
%37 = lshr i32 %32, 30
%38 = or i32 %36, %37
%39 = shl i32 %31, 30
%40 = lshr i32 %31, 30
%41 = lshr i32 %26, 30
%42 = or i32 %41, 30
%43 = tail call i32 @llvm.fshl.i32(i32 %35, i32 %18, i32 30)
%44 = add i32 %38, %43
%45 = tail call i32 @llvm.fshl.i32(i32 %44, i32 %44, i32 5)
%46 = xor i32 %43, %42
%47 = and i32 %46, %27
%48 = add nuw nsw i32 %40, 1518500249
%49 = add i32 %48, %39
%50 = add i32 %49, %28
%51 = add i32 %50, %47
%52 = add i32 %51, %45
%53 = and i32 %52, %27
%54 = add i32 %53, %43
%55 = or i32 %52, 30
%56 = xor i32 %23, %24
%57 = xor i32 %56, %22
%58 = xor i32 %57, %20
%59 = shl i32 %58, 1
%60 = xor i32 %19, %30
%61 = xor i32 %60, %29
%62 = xor i32 %61, %23
%63 = tail call i32 @llvm.fshl.i32(i32 %62, i32 %62, i32 1)
%64 = lshr i32 %52, 5
%65 = or i32 %55, %64
%66 = xor i32 %44, %27
%67 = or i32 %62, 1
%68 = xor i32 %63, %25
%69 = shl i32 %68, %68
%70 = xor i32 %28, %30
%71 = or i32 %70, 1
%72 = xor i32 %59, %29
%73 = xor i32 %72, %69
%74 = xor i32 %19, %71
%75 = xor i32 %74, %63
%76 = lshr i32 %75, 1
%77 = or i32 %76, %75
%78 = xor i32 %17, %19
%79 = shl i32 %73, 2
%80 = shl i32 %78, 1
%81 = xor i32 %79, %80
%82 = or i32 %81, 31
%83 = xor i32 %60, %77
%84 = or i32 %83, 1
%85 = xor i32 %71, %30
%86 = xor i32 %85, %21
%87 = lshr i32 %86, 1
%88 = or i32 %87, 1
%89 = or i32 %86, 1
%90 = or i32 %87, %86
%91 = add nuw nsw i32 %42, 32876674
%92 = add i32 %91, %90
%93 = add i32 %92, %63
%94 = add i32 %93, %66
%95 = add i32 %94, %65
%96 = shl i32 %86, 1
%97 = or i32 %96, %87
%98 = xor i32 %84, %97
%99 = lshr i32 %98, 1
%100 = or i32 %99, %98
%101 = shl i32 %82, 1
%102 = or i32 %101, 31
%103 = add i32 %54, %15
%104 = icmp eq i32 %33, %10
br i1 %104, label %105, label %14
105: ; preds = %14
store i32 %103, i32* %2
br label %106
106: ; preds = %105, %8
ret void
}