int foo(int x, int y, unsigned u) {
  if (u < ((x = -22) / 33))
    return x;
  if (u < ((x = 22) / 33))
    return x;
  if (u < ((x = 22) / (y = 33)))
    return x;
  if (u < (((x & 0x10000) ? 128 : 64) / ((y & 0x10000) ? 8 : 4)))
    return x;
  if (u < ((x = -22) % 33))
    return x;
  if (u < ((x = 22) % -33))
    return x;
  if (u < ((x == y) % -33))
    return x;
  if (u < (((x = 22) / 33) % -33))
    return x;
  return 0;
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
movl   $0xffffffea,-0x8(%rbp)
cmp    $0x0,%eax
jae    112b <foo+0x2b>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
movl   $0x16,-0x8(%rbp)
cmp    $0x0,%eax
jae    1149 <foo+0x49>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
movl   $0x16,-0x8(%rbp)
movl   $0x21,-0xc(%rbp)
cmp    $0x0,%eax
jae    116e <foo+0x6e>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%edx
and    $0x10000,%edx
mov    $0x40,%eax
mov    $0x80,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    -0xc(%rbp),%esi
and    $0x10000,%esi
mov    $0x4,%ecx
mov    $0x8,%edx
cmp    $0x0,%esi
cmovne %edx,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x14(%rbp),%eax
cmp    %ecx,%eax
jae    11c1 <foo+0xc1>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
movl   $0xffffffea,-0x8(%rbp)
cmp    $0xffffffea,%eax
jae    11df <foo+0xdf>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
movl   $0x16,-0x8(%rbp)
cmp    $0x16,%eax
jae    11fd <foo+0xfd>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0xc(%rbp),%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    $0xffffffdf,%ecx
cltd
idiv   %ecx
mov    -0x18(%rbp),%eax
cmp    %edx,%eax
jae    122f <foo+0x12f>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
mov    -0x10(%rbp),%eax
movl   $0x16,-0x8(%rbp)
cmp    $0x0,%eax
jae    124d <foo+0x14d>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1254 <foo+0x154>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
xor    %eax,%eax
cmp    $0xffffffea,%edx
mov    $0xffffffea,%ecx
cmovae %eax,%ecx
cmp    $0x10,%edx
mov    $0x16,%eax
cmovae %ecx,%eax
ret

LLVM IR (-O0):
define i32 @foo(i32 %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%8 = load i32, i32* %7
store i32 -22, i32* %5
%9 = icmp ult i32 %8, 0
br i1 %9, label %10, label %12
10: ; preds = %3
%11 = load i32, i32* %5
store i32 %11, i32* %4
br label %64
12: ; preds = %3
%13 = load i32, i32* %7
store i32 22, i32* %5
%14 = icmp ult i32 %13, 0
br i1 %14, label %15, label %17
15: ; preds = %12
%16 = load i32, i32* %5
store i32 %16, i32* %4
br label %64
17: ; preds = %12
%18 = load i32, i32* %7
store i32 22, i32* %5
store i32 33, i32* %6
%19 = icmp ult i32 %18, 0
br i1 %19, label %20, label %22
20: ; preds = %17
%21 = load i32, i32* %5
store i32 %21, i32* %4
br label %64
22: ; preds = %17
%23 = load i32, i32* %7
%24 = load i32, i32* %5
%25 = and i32 %24, 65536
%26 = icmp ne i32 %25, 0
%27 = zext i1 %26 to i64
%28 = select i1 %26, i32 128, i32 64
%29 = load i32, i32* %6
%30 = and i32 %29, 65536
%31 = icmp ne i32 %30, 0
%32 = zext i1 %31 to i64
%33 = select i1 %31, i32 8, i32 4
%34 = sdiv i32 %28, %33
%35 = icmp ult i32 %23, %34
br i1 %35, label %36, label %38
36: ; preds = %22
%37 = load i32, i32* %5
store i32 %37, i32* %4
br label %64
38: ; preds = %22
%39 = load i32, i32* %7
store i32 -22, i32* %5
%40 = icmp ult i32 %39, -22
br i1 %40, label %41, label %43
41: ; preds = %38
%42 = load i32, i32* %5
store i32 %42, i32* %4
br label %64
43: ; preds = %38
%44 = load i32, i32* %7
store i32 22, i32* %5
%45 = icmp ult i32 %44, 22
br i1 %45, label %46, label %48
46: ; preds = %43
%47 = load i32, i32* %5
store i32 %47, i32* %4
br label %64
48: ; preds = %43
%49 = load i32, i32* %7
%50 = load i32, i32* %5
%51 = load i32, i32* %6
%52 = icmp eq i32 %50, %51
%53 = zext i1 %52 to i32
%54 = srem i32 %53, -33
%55 = icmp ult i32 %49, %54
br i1 %55, label %56, label %58
56: ; preds = %48
%57 = load i32, i32* %5
store i32 %57, i32* %4
br label %64
58: ; preds = %48
%59 = load i32, i32* %7
store i32 22, i32* %5
%60 = icmp ult i32 %59, 0
br i1 %60, label %61, label %63
61: ; preds = %58
%62 = load i32, i32* %5
store i32 %62, i32* %4
br label %64
63: ; preds = %58
store i32 0, i32* %4
br label %64
64: ; preds = %63, %61, %56, %46, %41, %36, %20, %15, %10
%65 = load i32, i32* %4
ret i32 %65
}

LLVM IR (-O2):
define i32 @foo(i32 %0, i32 %1, i32 %2) {
%4 = icmp ult i32 %2, 16
%5 = icmp ult i32 %2, -22
%6 = select i1 %5, i32 -22, i32 0
%7 = select i1 %4, i32 22, i32 %6
ret i32 %7
}