void f2(int a, int b) {
  switch (a && b) {
  case 3:
    break;
  }
  switch ((_Bool)(a && b)) {
  case 3:
    break;
  }
  switch ((a && b) || a) {
  case 3:
    break;
  }
  switch ((int)(a && b))
    break;
  switch ((unsigned int)(a && b))
    break;
  switch ((unsigned short int)(a && b))
    break;
  switch ((char)(a && b))
    break;
}


x86 assembly (clang, -O0):
<f2>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0x9(%rbp)
je     1123 <f2+0x23>
cmpl   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0x9(%rbp)
mov    -0x9(%rbp),%al
mov    $0x1,%al
test   %al,%al
jne    113a <f2+0x3a>
jmp    1135 <f2+0x35>
jmp    113a <f2+0x3a>
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0xa(%rbp)
je     1153 <f2+0x53>
cmpl   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0xa(%rbp)
mov    -0xa(%rbp),%al
mov    $0x1,%al
test   %al,%al
jne    116a <f2+0x6a>
jmp    1165 <f2+0x65>
jmp    116a <f2+0x6a>
cmpl   $0x0,-0x4(%rbp)
je     1183 <f2+0x83>
mov    $0x1,%al
cmpl   $0x0,-0x8(%rbp)
mov    %al,-0xb(%rbp)
jne    118d <f2+0x8d>
cmpl   $0x0,-0x4(%rbp)
setne  %al
mov    %al,-0xb(%rbp)
mov    -0xb(%rbp),%al
mov    $0x1,%al
test   %al,%al
jne    11a4 <f2+0xa4>
jmp    119f <f2+0x9f>
jmp    11a4 <f2+0xa4>
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0xc(%rbp)
je     11bd <f2+0xbd>
cmpl   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0xc(%rbp)
mov    -0xc(%rbp),%al
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0xd(%rbp)
je     11d9 <f2+0xd9>
cmpl   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0xd(%rbp)
mov    -0xd(%rbp),%al
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0xe(%rbp)
je     11f5 <f2+0xf5>
cmpl   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0xe(%rbp)
mov    -0xe(%rbp),%al
xor    %eax,%eax
cmpl   $0x0,-0x4(%rbp)
mov    %al,-0xf(%rbp)
je     1211 <f2+0x111>
cmpl   $0x0,-0x8(%rbp)
setne  %al
mov    %al,-0xf(%rbp)
mov    -0xf(%rbp),%al
pop    %rbp
ret

x86 assembly (clang, -O2):
<f2>:
ret

LLVM IR (-O0):
define void @f2(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%5 = load i32, i32* %3
%6 = icmp ne i32 %5, 0
br i1 %6, label %7, label %10
7: ; preds = %2
%8 = load i32, i32* %4
%9 = icmp ne i32 %8, 0
br label %10
10: ; preds = %7, %2
%11 = phi i1 [ false, %2 ], [ %9, %7 ]
%12 = zext i1 %11 to i32
switch i32 %12, label %14 [
i32 3, label %13
]
13: ; preds = %10
br label %14
14: ; preds = %10, %13
%15 = load i32, i32* %3
%16 = icmp ne i32 %15, 0
br i1 %16, label %17, label %20
17: ; preds = %14
%18 = load i32, i32* %4
%19 = icmp ne i32 %18, 0
br label %20
20: ; preds = %17, %14
%21 = phi i1 [ false, %14 ], [ %19, %17 ]
%22 = zext i1 %21 to i32
switch i32 %22, label %24 [
i32 3, label %23
]
23: ; preds = %20
br label %24
24: ; preds = %20, %23
%25 = load i32, i32* %3
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %30
27: ; preds = %24
%28 = load i32, i32* %4
%29 = icmp ne i32 %28, 0
br i1 %29, label %33, label %30
30: ; preds = %27, %24
%31 = load i32, i32* %3
%32 = icmp ne i32 %31, 0
br label %33
33: ; preds = %30, %27
%34 = phi i1 [ true, %27 ], [ %32, %30 ]
%35 = zext i1 %34 to i32
switch i32 %35, label %37 [
i32 3, label %36
]
36: ; preds = %33
br label %37
37: ; preds = %33, %36
%38 = load i32, i32* %3
%39 = icmp ne i32 %38, 0
br i1 %39, label %40, label %43
40: ; preds = %37
%41 = load i32, i32* %4
%42 = icmp ne i32 %41, 0
br label %43
43: ; preds = %40, %37
%44 = phi i1 [ false, %37 ], [ %42, %40 ]
%45 = zext i1 %44 to i32
switch i32 %45, label %46 [
]
46: ; preds = %43
%47 = load i32, i32* %3
%48 = icmp ne i32 %47, 0
br i1 %48, label %49, label %52
49: ; preds = %46
%50 = load i32, i32* %4
%51 = icmp ne i32 %50, 0
br label %52
52: ; preds = %49, %46
%53 = phi i1 [ false, %46 ], [ %51, %49 ]
%54 = zext i1 %53 to i32
switch i32 %54, label %55 [
]
55: ; preds = %52
%56 = load i32, i32* %3
%57 = icmp ne i32 %56, 0
br i1 %57, label %58, label %61
58: ; preds = %55
%59 = load i32, i32* %4
%60 = icmp ne i32 %59, 0
br label %61
61: ; preds = %58, %55
%62 = phi i1 [ false, %55 ], [ %60, %58 ]
%63 = zext i1 %62 to i32
%64 = trunc i32 %63 to i16
%65 = zext i16 %64 to i32
switch i32 %65, label %66 [
]
66: ; preds = %61
%67 = load i32, i32* %3
%68 = icmp ne i32 %67, 0
br i1 %68, label %69, label %72
69: ; preds = %66
%70 = load i32, i32* %4
%71 = icmp ne i32 %70, 0
br label %72
72: ; preds = %69, %66
%73 = phi i1 [ false, %66 ], [ %71, %69 ]
%74 = zext i1 %73 to i32
%75 = trunc i32 %74 to i8
%76 = sext i8 %75 to i32
switch i32 %76, label %77 [
]
77: ; preds = %72
ret void
}

LLVM IR (-O2):
define void @f2(i32 %0, i32 %1) {
ret void
}