int func_unroll4() {
  int i, res = 0;
L1:
  for (i = 0; i < 128; i++)
    res += (i & (i + 1)) - (i & (i - 1));
L2:
  return (res == 0) ? (&&L2 - &&L1) : 0;
}


x86 assembly (clang, -O0):
<func_unroll4>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x8(%rbp)
movl   $0x0,-0x4(%rbp)
cmpl   $0x80,-0x4(%rbp)
jge    114b <func_unroll4+0x4b>
mov    -0x4(%rbp),%eax
mov    -0x4(%rbp),%ecx
add    $0x1,%ecx
and    %ecx,%eax
mov    -0x4(%rbp),%ecx
mov    -0x4(%rbp),%edx
sub    $0x1,%edx
and    %edx,%ecx
sub    %ecx,%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1112 <func_unroll4+0x12>
jmp    1150 <func_unroll4+0x50>
xor    %eax,%eax
mov    -0x8(%rbp),%edx
lea    -0x51(%rip),%rax
lea    -0x13(%rip),%rcx
sub    %rax,%rcx
xor    %eax,%eax
test   %edx,%edx
cmove  %rcx,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<func_unroll4>:
movdqa 0xef8(%rip),%xmm7
pxor   %xmm0,%xmm0
mov    $0x80,%eax
movdqa 0xef6(%rip),%xmm8
pcmpeqd %xmm9,%xmm9
movdqa 0xef8(%rip),%xmm10
movdqa 0xeff(%rip),%xmm11
movdqa 0xf06(%rip),%xmm12
movdqa 0xf0d(%rip),%xmm13
pxor   %xmm5,%xmm5
nopw   0x0(%rax,%rax,1)
movdqa %xmm7,%xmm2
paddd  %xmm8,%xmm2
movdqa %xmm7,%xmm4
psubd  %xmm9,%xmm4
movdqa %xmm7,%xmm6
paddd  %xmm10,%xmm6
pand   %xmm7,%xmm4
pand   %xmm2,%xmm6
movdqa %xmm7,%xmm1
paddd  %xmm11,%xmm1
movdqa %xmm7,%xmm3
paddd  %xmm12,%xmm3
pand   %xmm7,%xmm1
psubd  %xmm1,%xmm0
paddd  %xmm4,%xmm0
pand   %xmm2,%xmm3
psubd  %xmm3,%xmm5
paddd  %xmm6,%xmm5
paddd  %xmm13,%xmm7
add    $0xfffffff8,%eax
jne    1150 <func_unroll4+0x50>
paddd  %xmm0,%xmm5
pshufd $0xee,%xmm5,%xmm0
paddd  %xmm5,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%ecx
lea    -0x21(%rip),%rdx
add    $0xffffffff,%edx
xor    %eax,%eax
test   %ecx,%ecx
cmove  %edx,%eax
ret

LLVM IR (-O0):
define i32 @func_unroll4() {
%1 = alloca i32
%2 = alloca i32
store i32 0, i32* %2
br label %3
3: ; preds = %29, %0
store i32 0, i32* %1
br label %4
4: ; preds = %19, %3
%5 = load i32, i32* %1
%6 = icmp slt i32 %5, 128
br i1 %6, label %7, label %22
7: ; preds = %4
%8 = load i32, i32* %1
%9 = load i32, i32* %1
%10 = add nsw i32 %9, 1
%11 = and i32 %8, %10
%12 = load i32, i32* %1
%13 = load i32, i32* %1
%14 = sub nsw i32 %13, 1
%15 = and i32 %12, %14
%16 = sub nsw i32 %11, %15
%17 = load i32, i32* %2
%18 = add nsw i32 %17, %16
store i32 %18, i32* %2
br label %19
19: ; preds = %7
%20 = load i32, i32* %1
%21 = add nsw i32 %20, 1
store i32 %21, i32* %1
br label %4
22: ; preds = %4
br label %23
23: ; preds = %29, %22
%24 = load i32, i32* %2
%25 = icmp eq i32 %24, 0
%26 = zext i1 %25 to i64
%27 = select i1 %25, i64 sub (i64 ptrtoint (i8* blockaddress(@func_unroll4, %23) to i64), i64 ptrtoint (i8* blockaddress(@func_unroll4, %3) to i64)), i64 0
%28 = trunc i64 %27 to i32
ret i32 %28
29: ; No predecessors!
indirectbr i8* undef, [label %23, label %3]
}

LLVM IR (-O2):
define i32 @func_unroll4() {
br label %1
1: ; preds = %1, %0
%2 = phi i32 [ 0, %0 ], [ %19, %1 ]
%3 = phi <4 x i32> [ zeroinitializer, %0 ], [ %17, %1 ]
%4 = phi <4 x i32> [ zeroinitializer, %0 ], [ %18, %1 ]
%5 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %0 ], [ %20, %1 ]
%6 = add <4 x i32> %5, <i32 4, i32 4, i32 4, i32 4>
%7 = add nuw nsw <4 x i32> %5, <i32 1, i32 1, i32 1, i32 1>
%8 = add <4 x i32> %5, <i32 5, i32 5, i32 5, i32 5>
%9 = and <4 x i32> %7, %5
%10 = and <4 x i32> %8, %6
%11 = add nuw <4 x i32> %5, <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>
%12 = add <4 x i32> %5, <i32 -2147483645, i32 -2147483645, i32 -2147483645, i32 -2147483645>
%13 = and <4 x i32> %11, %5
%14 = and <4 x i32> %12, %6
%15 = sub <4 x i32> %3, %13
%16 = sub <4 x i32> %4, %14
%17 = add <4 x i32> %15, %9
%18 = add <4 x i32> %16, %10
%19 = add nuw i32 %2, 8
%20 = add <4 x i32> %5, <i32 8, i32 8, i32 8, i32 8>
%21 = icmp eq i32 %19, 128
br i1 %21, label %22, label %1
22: ; preds = %1
%23 = add <4 x i32> %18, %17
%24 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %23)
%25 = icmp eq i32 %24, 0
%26 = select i1 %25, i32 trunc (i64 sub (i64 ptrtoint (i8* blockaddress(@func_unroll4, %22) to i64), i64 1) to i32), i32 0
ret i32 %26
}