void f3(unsigned int a) {
  _Bool v1 = (a <= 31);
  _Bool v2 = (a >= 64 && a <= 95);
  _Bool v3 = (a >= 128 && a <= 159);
  _Bool v4 = (a >= 192 && a <= 223);
  if (v1 || v2 || v3 || v4)
    foo();
}


x86 assembly (clang, -O0):
<f3>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
cmpl   $0x1f,-0x4(%rbp)
setbe  %al
and    $0x1,%al
mov    %al,-0x5(%rbp)
xor    %eax,%eax
cmpl   $0x40,-0x4(%rbp)
mov    %al,-0x9(%rbp)
jb     1140 <f3+0x30>
cmpl   $0x5f,-0x4(%rbp)
setbe  %al
mov    %al,-0x9(%rbp)
mov    -0x9(%rbp),%al
and    $0x1,%al
mov    %al,-0x6(%rbp)
xor    %eax,%eax
cmpl   $0x80,-0x4(%rbp)
mov    %al,-0xa(%rbp)
jb     1167 <f3+0x57>
cmpl   $0x9f,-0x4(%rbp)
setbe  %al
mov    %al,-0xa(%rbp)
mov    -0xa(%rbp),%al
and    $0x1,%al
mov    %al,-0x7(%rbp)
xor    %eax,%eax
cmpl   $0xc0,-0x4(%rbp)
mov    %al,-0xb(%rbp)
jb     118e <f3+0x7e>
cmpl   $0xdf,-0x4(%rbp)
setbe  %al
mov    %al,-0xb(%rbp)
mov    -0xb(%rbp),%al
and    $0x1,%al
mov    %al,-0x8(%rbp)
testb  $0x1,-0x5(%rbp)
jne    11be <f3+0xae>
testb  $0x1,-0x6(%rbp)
jne    11be <f3+0xae>
testb  $0x1,-0x7(%rbp)
jne    11be <f3+0xae>
testb  $0x1,-0x8(%rbp)
je     11c5 <f3+0xb5>
mov    $0x0,%al
call   1030 <foo@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f3>:
cmp    $0x20,%edi
jb     112d <f3+0x1d>
and    $0xffffffe0,%edi
cmp    $0x40,%edi
je     112d <f3+0x1d>
cmp    $0xc0,%edi
je     112d <f3+0x1d>
cmp    $0x80,%edi
jne    1134 <f3+0x24>
xor    %eax,%eax
jmp    1030 <foo@plt>
ret

LLVM IR (-O0):
define void @f3(i32 %0) {
%2 = alloca i32
%3 = alloca i8
%4 = alloca i8
%5 = alloca i8
%6 = alloca i8
store i32 %0, i32* %2
%7 = load i32, i32* %2
%8 = icmp ule i32 %7, 31
%9 = zext i1 %8 to i8
store i8 %9, i8* %3
%10 = load i32, i32* %2
%11 = icmp uge i32 %10, 64
br i1 %11, label %12, label %15
12: ; preds = %1
%13 = load i32, i32* %2
%14 = icmp ule i32 %13, 95
br label %15
15: ; preds = %12, %1
%16 = phi i1 [ false, %1 ], [ %14, %12 ]
%17 = zext i1 %16 to i8
store i8 %17, i8* %4
%18 = load i32, i32* %2
%19 = icmp uge i32 %18, 128
br i1 %19, label %20, label %23
20: ; preds = %15
%21 = load i32, i32* %2
%22 = icmp ule i32 %21, 159
br label %23
23: ; preds = %20, %15
%24 = phi i1 [ false, %15 ], [ %22, %20 ]
%25 = zext i1 %24 to i8
store i8 %25, i8* %5
%26 = load i32, i32* %2
%27 = icmp uge i32 %26, 192
br i1 %27, label %28, label %31
28: ; preds = %23
%29 = load i32, i32* %2
%30 = icmp ule i32 %29, 223
br label %31
31: ; preds = %28, %23
%32 = phi i1 [ false, %23 ], [ %30, %28 ]
%33 = zext i1 %32 to i8
store i8 %33, i8* %6
%34 = load i8, i8* %3
%35 = trunc i8 %34 to i1
br i1 %35, label %45, label %36
36: ; preds = %31
%37 = load i8, i8* %4
%38 = trunc i8 %37 to i1
br i1 %38, label %45, label %39
39: ; preds = %36
%40 = load i8, i8* %5
%41 = trunc i8 %40 to i1
br i1 %41, label %45, label %42
42: ; preds = %39
%43 = load i8, i8* %6
%44 = trunc i8 %43 to i1
br i1 %44, label %45, label %47
45: ; preds = %42, %39, %36, %31
%46 = call i32 (...) @foo()
br label %47
47: ; preds = %45, %42
ret void
}

LLVM IR (-O2):
define void @f3(i32 %0) {
%2 = icmp ult i32 %0, 32
br i1 %2, label %5, label %3
3: ; preds = %1
%4 = and i32 %0, -32
switch i32 %4, label %7 [
i32 192, label %5
i32 128, label %5
i32 64, label %5
]
5: ; preds = %3, %3, %3, %1
%6 = tail call i32 (...) @foo()
br label %7
7: ; preds = %3, %5
ret void
}