int check(int *a, int j) {
  int *b;
  for (b = a; b < a + 100; ++b) {
    if (*b)
      j = j + 1;
  }
  return j;
}


x86 assembly (clang, -O0):
<check>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x8(%rbp),%rcx
add    $0x190,%rcx
cmp    %rcx,%rax
jae    1157 <check+0x57>
mov    -0x18(%rbp),%rax
cmpl   $0x0,(%rax)
je     1141 <check+0x41>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1146 <check+0x46>
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
jmp    1113 <check+0x13>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<check>:
movd   %esi,%xmm1
pxor   %xmm0,%xmm0
movdqu (%rdi),%xmm2
movdqu 0x10(%rdi),%xmm3
movdqu 0x20(%rdi),%xmm4
movdqu 0x30(%rdi),%xmm5
pcmpeqd %xmm0,%xmm2
paddd  %xmm1,%xmm2
pcmpeqd %xmm0,%xmm3
pcmpeqd %xmm0,%xmm4
paddd  %xmm3,%xmm4
paddd  %xmm2,%xmm4
pcmpeqd %xmm0,%xmm5
movdqu 0x40(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
paddd  %xmm5,%xmm1
movdqu 0x50(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm1,%xmm2
paddd  %xmm4,%xmm2
movdqu 0x60(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
movdqu 0x70(%rdi),%xmm3
pcmpeqd %xmm0,%xmm3
paddd  %xmm1,%xmm3
movdqu 0x80(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
paddd  %xmm3,%xmm1
movdqu 0x90(%rdi),%xmm3
pcmpeqd %xmm0,%xmm3
paddd  %xmm1,%xmm3
paddd  %xmm2,%xmm3
movdqu 0xa0(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
movdqu 0xb0(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm1,%xmm2
movdqu 0xc0(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
paddd  %xmm2,%xmm1
movdqu 0xd0(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm1,%xmm2
movdqu 0xe0(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
paddd  %xmm2,%xmm1
paddd  %xmm3,%xmm1
movdqu 0xf0(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
movdqu 0x100(%rdi),%xmm3
pcmpeqd %xmm0,%xmm3
paddd  %xmm2,%xmm3
movdqu 0x110(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm3,%xmm2
movdqu 0x120(%rdi),%xmm3
pcmpeqd %xmm0,%xmm3
paddd  %xmm2,%xmm3
movdqu 0x130(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm3,%xmm2
movdqu 0x140(%rdi),%xmm3
pcmpeqd %xmm0,%xmm3
paddd  %xmm2,%xmm3
paddd  %xmm1,%xmm3
movdqu 0x150(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
movdqu 0x160(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm1,%xmm2
movdqu 0x170(%rdi),%xmm1
pcmpeqd %xmm0,%xmm1
paddd  %xmm2,%xmm1
movdqu 0x180(%rdi),%xmm2
pcmpeqd %xmm0,%xmm2
paddd  %xmm1,%xmm2
paddd  %xmm3,%xmm2
paddd  0xd79(%rip),%xmm2
pshufd $0xee,%xmm2,%xmm0
paddd  %xmm2,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%eax
ret

LLVM IR (-O0):
define i32 @check(i32* %0, i32 %1) {
%3 = alloca i32*
%4 = alloca i32
%5 = alloca i32*
store i32* %0, i32** %3
store i32 %1, i32* %4
%6 = load i32*, i32** %3
store i32* %6, i32** %5
br label %7
7: ; preds = %20, %2
%8 = load i32*, i32** %5
%9 = load i32*, i32** %3
%10 = getelementptr inbounds i32, i32* %9, i64 100
%11 = icmp ult i32* %8, %10
br i1 %11, label %12, label %23
12: ; preds = %7
%13 = load i32*, i32** %5
%14 = load i32, i32* %13
%15 = icmp ne i32 %14, 0
br i1 %15, label %16, label %19
16: ; preds = %12
%17 = load i32, i32* %4
%18 = add nsw i32 %17, 1
store i32 %18, i32* %4
br label %19
19: ; preds = %16, %12
br label %20
20: ; preds = %19
%21 = load i32*, i32** %5
%22 = getelementptr inbounds i32, i32* %21, i32 1
store i32* %22, i32** %5
br label %7
23: ; preds = %7
%24 = load i32, i32* %4
ret i32 %24
}

LLVM IR (-O2):
define i32 @check(i32* nocapture %0, i32 %1) {
%3 = insertelement <4 x i32> <i32 poison, i32 0, i32 0, i32 0>, i32 %1, i64 0
%4 = bitcast i32* %0 to <4 x i32>*
%5 = load <4 x i32>, <4 x i32>* %4
%6 = icmp ne <4 x i32> %5, zeroinitializer
%7 = zext <4 x i1> %6 to <4 x i32>
%8 = add <4 x i32> %3, %7
%9 = getelementptr inbounds i32, i32* %0, i64 4
%10 = bitcast i32* %9 to <4 x i32>*
%11 = load <4 x i32>, <4 x i32>* %10
%12 = icmp ne <4 x i32> %11, zeroinitializer
%13 = zext <4 x i1> %12 to <4 x i32>
%14 = add <4 x i32> %8, %13
%15 = getelementptr inbounds i32, i32* %0, i64 8
%16 = bitcast i32* %15 to <4 x i32>*
%17 = load <4 x i32>, <4 x i32>* %16
%18 = icmp ne <4 x i32> %17, zeroinitializer
%19 = zext <4 x i1> %18 to <4 x i32>
%20 = add <4 x i32> %14, %19
%21 = getelementptr inbounds i32, i32* %0, i64 12
%22 = bitcast i32* %21 to <4 x i32>*
%23 = load <4 x i32>, <4 x i32>* %22
%24 = icmp ne <4 x i32> %23, zeroinitializer
%25 = zext <4 x i1> %24 to <4 x i32>
%26 = add <4 x i32> %20, %25
%27 = getelementptr inbounds i32, i32* %0, i64 16
%28 = bitcast i32* %27 to <4 x i32>*
%29 = load <4 x i32>, <4 x i32>* %28
%30 = icmp ne <4 x i32> %29, zeroinitializer
%31 = zext <4 x i1> %30 to <4 x i32>
%32 = add <4 x i32> %26, %31
%33 = getelementptr inbounds i32, i32* %0, i64 20
%34 = bitcast i32* %33 to <4 x i32>*
%35 = load <4 x i32>, <4 x i32>* %34
%36 = icmp ne <4 x i32> %35, zeroinitializer
%37 = zext <4 x i1> %36 to <4 x i32>
%38 = add <4 x i32> %32, %37
%39 = getelementptr inbounds i32, i32* %0, i64 24
%40 = bitcast i32* %39 to <4 x i32>*
%41 = load <4 x i32>, <4 x i32>* %40
%42 = icmp ne <4 x i32> %41, zeroinitializer
%43 = zext <4 x i1> %42 to <4 x i32>
%44 = add <4 x i32> %38, %43
%45 = getelementptr inbounds i32, i32* %0, i64 28
%46 = bitcast i32* %45 to <4 x i32>*
%47 = load <4 x i32>, <4 x i32>* %46
%48 = icmp ne <4 x i32> %47, zeroinitializer
%49 = zext <4 x i1> %48 to <4 x i32>
%50 = add <4 x i32> %44, %49
%51 = getelementptr inbounds i32, i32* %0, i64 32
%52 = bitcast i32* %51 to <4 x i32>*
%53 = load <4 x i32>, <4 x i32>* %52
%54 = icmp ne <4 x i32> %53, zeroinitializer
%55 = zext <4 x i1> %54 to <4 x i32>
%56 = add <4 x i32> %50, %55
%57 = getelementptr inbounds i32, i32* %0, i64 36
%58 = bitcast i32* %57 to <4 x i32>*
%59 = load <4 x i32>, <4 x i32>* %58
%60 = icmp ne <4 x i32> %59, zeroinitializer
%61 = zext <4 x i1> %60 to <4 x i32>
%62 = add <4 x i32> %56, %61
%63 = getelementptr inbounds i32, i32* %0, i64 40
%64 = bitcast i32* %63 to <4 x i32>*
%65 = load <4 x i32>, <4 x i32>* %64
%66 = icmp ne <4 x i32> %65, zeroinitializer
%67 = zext <4 x i1> %66 to <4 x i32>
%68 = add <4 x i32> %62, %67
%69 = getelementptr inbounds i32, i32* %0, i64 44
%70 = bitcast i32* %69 to <4 x i32>*
%71 = load <4 x i32>, <4 x i32>* %70
%72 = icmp ne <4 x i32> %71, zeroinitializer
%73 = zext <4 x i1> %72 to <4 x i32>
%74 = add <4 x i32> %68, %73
%75 = getelementptr inbounds i32, i32* %0, i64 48
%76 = bitcast i32* %75 to <4 x i32>*
%77 = load <4 x i32>, <4 x i32>* %76
%78 = icmp ne <4 x i32> %77, zeroinitializer
%79 = zext <4 x i1> %78 to <4 x i32>
%80 = add <4 x i32> %74, %79
%81 = getelementptr inbounds i32, i32* %0, i64 52
%82 = bitcast i32* %81 to <4 x i32>*
%83 = load <4 x i32>, <4 x i32>* %82
%84 = icmp ne <4 x i32> %83, zeroinitializer
%85 = zext <4 x i1> %84 to <4 x i32>
%86 = add <4 x i32> %80, %85
%87 = getelementptr inbounds i32, i32* %0, i64 56
%88 = bitcast i32* %87 to <4 x i32>*
%89 = load <4 x i32>, <4 x i32>* %88
%90 = icmp ne <4 x i32> %89, zeroinitializer
%91 = zext <4 x i1> %90 to <4 x i32>
%92 = add <4 x i32> %86, %91
%93 = getelementptr inbounds i32, i32* %0, i64 60
%94 = bitcast i32* %93 to <4 x i32>*
%95 = load <4 x i32>, <4 x i32>* %94
%96 = icmp ne <4 x i32> %95, zeroinitializer
%97 = zext <4 x i1> %96 to <4 x i32>
%98 = add <4 x i32> %92, %97
%99 = getelementptr inbounds i32, i32* %0, i64 64
%100 = bitcast i32* %99 to <4 x i32>*
%101 = load <4 x i32>, <4 x i32>* %100
%102 = icmp ne <4 x i32> %101, zeroinitializer
%103 = zext <4 x i1> %102 to <4 x i32>
%104 = add <4 x i32> %98, %103
%105 = getelementptr inbounds i32, i32* %0, i64 68
%106 = bitcast i32* %105 to <4 x i32>*
%107 = load <4 x i32>, <4 x i32>* %106
%108 = icmp ne <4 x i32> %107, zeroinitializer
%109 = zext <4 x i1> %108 to <4 x i32>
%110 = add <4 x i32> %104, %109
%111 = getelementptr inbounds i32, i32* %0, i64 72
%112 = bitcast i32* %111 to <4 x i32>*
%113 = load <4 x i32>, <4 x i32>* %112
%114 = icmp ne <4 x i32> %113, zeroinitializer
%115 = zext <4 x i1> %114 to <4 x i32>
%116 = add <4 x i32> %110, %115
%117 = getelementptr inbounds i32, i32* %0, i64 76
%118 = bitcast i32* %117 to <4 x i32>*
%119 = load <4 x i32>, <4 x i32>* %118
%120 = icmp ne <4 x i32> %119, zeroinitializer
%121 = zext <4 x i1> %120 to <4 x i32>
%122 = add <4 x i32> %116, %121
%123 = getelementptr inbounds i32, i32* %0, i64 80
%124 = bitcast i32* %123 to <4 x i32>*
%125 = load <4 x i32>, <4 x i32>* %124
%126 = icmp ne <4 x i32> %125, zeroinitializer
%127 = zext <4 x i1> %126 to <4 x i32>
%128 = add <4 x i32> %122, %127
%129 = getelementptr inbounds i32, i32* %0, i64 84
%130 = bitcast i32* %129 to <4 x i32>*
%131 = load <4 x i32>, <4 x i32>* %130
%132 = icmp ne <4 x i32> %131, zeroinitializer
%133 = zext <4 x i1> %132 to <4 x i32>
%134 = add <4 x i32> %128, %133
%135 = getelementptr inbounds i32, i32* %0, i64 88
%136 = bitcast i32* %135 to <4 x i32>*
%137 = load <4 x i32>, <4 x i32>* %136
%138 = icmp ne <4 x i32> %137, zeroinitializer
%139 = zext <4 x i1> %138 to <4 x i32>
%140 = add <4 x i32> %134, %139
%141 = getelementptr inbounds i32, i32* %0, i64 92
%142 = bitcast i32* %141 to <4 x i32>*
%143 = load <4 x i32>, <4 x i32>* %142
%144 = icmp ne <4 x i32> %143, zeroinitializer
%145 = zext <4 x i1> %144 to <4 x i32>
%146 = add <4 x i32> %140, %145
%147 = getelementptr inbounds i32, i32* %0, i64 96
%148 = bitcast i32* %147 to <4 x i32>*
%149 = load <4 x i32>, <4 x i32>* %148
%150 = icmp ne <4 x i32> %149, zeroinitializer
%151 = zext <4 x i1> %150 to <4 x i32>
%152 = add <4 x i32> %146, %151
%153 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %152)
ret i32 %153
}