int main() {
  unsigned short int a, b, c, d, e, f, g, h, i, j;
  a = 0xFFFF;
  b = 0xFFFF;
  c = a | b;
  c = 0;
  d = a & b;
  d = 0;
  e = a ^ b;
  e = 0;
  f = ~(a | b);
  f = 0;
  g = ~(a & b);
  g = 0;
  h = ~(a ^ b);
  h = 0;
  i = ~a;
  i = 0;
  j = ~b;
  j = 0;
  a = 0x0F0F;
  b = 0xF0F0;
  c = a | b;
  c = 0;
  d = a & b;
  d = 0;
  e = a ^ b;
  e = 0;
  f = ~(a | b);
  f = 0;
  g = ~(a & b);
  g = 0;
  h = ~(a ^ b);
  h = 0;
  i = ~a;
  i = 0;
  j = ~b;
  j = 0;
  a = 0xFFFF;
  b = 0x0000;
  c = a | b;
  c = 0;
  d = a & b;
  d = 0;
  e = a ^ b;
  e = 0;
  f = ~(a | b);
  f = 0;
  g = ~(a & b);
  g = 0;
  h = ~(a ^ b);
  h = 0;
  i = ~a;
  i = 0;
  j = ~b;
  j = 0;
  a = 0x5555;
  b = 0xAAAA;
  c = a | b;
  c = 0;
  d = a & b;
  d = 0;
  e = a ^ b;
  e = 0;
  f = ~(a | b);
  f = 0;
  g = ~(a & b);
  g = 0;
  h = ~(a ^ b);
  h = 0;
  i = ~a;
  i = 0;
  j = ~b;
  j = 0;
  a = 0x0000;
  b = 0x0000;
  c = a | b;
  c = 0;
  d = a & b;
  d = 0;
  e = a ^ b;
  e = 0;
  f = ~(a | b);
  f = 0;
  g = ~(a & b);
  g = 0;
  h = ~(a ^ b);
  h = 0;
  i = ~a;
  i = 0;
  j = ~b;
  j = 0;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
movw   $0xffff,-0x6(%rbp)
movw   $0xffff,-0x8(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
mov    %ax,-0xa(%rbp)
movw   $0x0,-0xa(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
mov    %ax,-0xc(%rbp)
movw   $0x0,-0xc(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xe(%rbp)
movw   $0x0,-0xe(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x10(%rbp)
movw   $0x0,-0x10(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x12(%rbp)
movw   $0x0,-0x12(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x14(%rbp)
movw   $0x0,-0x14(%rbp)
movzwl -0x6(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x16(%rbp)
movw   $0x0,-0x16(%rbp)
movzwl -0x8(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x18(%rbp)
movw   $0x0,-0x18(%rbp)
movw   $0xf0f,-0x6(%rbp)
movw   $0xf0f0,-0x8(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
mov    %ax,-0xa(%rbp)
movw   $0x0,-0xa(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
mov    %ax,-0xc(%rbp)
movw   $0x0,-0xc(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xe(%rbp)
movw   $0x0,-0xe(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x10(%rbp)
movw   $0x0,-0x10(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x12(%rbp)
movw   $0x0,-0x12(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x14(%rbp)
movw   $0x0,-0x14(%rbp)
movzwl -0x6(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x16(%rbp)
movw   $0x0,-0x16(%rbp)
movzwl -0x8(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x18(%rbp)
movw   $0x0,-0x18(%rbp)
movw   $0xffff,-0x6(%rbp)
movw   $0x0,-0x8(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
mov    %ax,-0xa(%rbp)
movw   $0x0,-0xa(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
mov    %ax,-0xc(%rbp)
movw   $0x0,-0xc(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xe(%rbp)
movw   $0x0,-0xe(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x10(%rbp)
movw   $0x0,-0x10(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x12(%rbp)
movw   $0x0,-0x12(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x14(%rbp)
movw   $0x0,-0x14(%rbp)
movzwl -0x6(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x16(%rbp)
movw   $0x0,-0x16(%rbp)
movzwl -0x8(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x18(%rbp)
movw   $0x0,-0x18(%rbp)
movw   $0x5555,-0x6(%rbp)
movw   $0xaaaa,-0x8(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
mov    %ax,-0xa(%rbp)
movw   $0x0,-0xa(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
mov    %ax,-0xc(%rbp)
movw   $0x0,-0xc(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xe(%rbp)
movw   $0x0,-0xe(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x10(%rbp)
movw   $0x0,-0x10(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x12(%rbp)
movw   $0x0,-0x12(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x14(%rbp)
movw   $0x0,-0x14(%rbp)
movzwl -0x6(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x16(%rbp)
movw   $0x0,-0x16(%rbp)
movzwl -0x8(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x18(%rbp)
movw   $0x0,-0x18(%rbp)
movw   $0x0,-0x6(%rbp)
movw   $0x0,-0x8(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
mov    %ax,-0xa(%rbp)
movw   $0x0,-0xa(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
mov    %ax,-0xc(%rbp)
movw   $0x0,-0xc(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
mov    %ax,-0xe(%rbp)
movw   $0x0,-0xe(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
or     %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x10(%rbp)
movw   $0x0,-0x10(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
and    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x12(%rbp)
movw   $0x0,-0x12(%rbp)
movzwl -0x6(%rbp),%eax
movzwl -0x8(%rbp),%ecx
xor    %ecx,%eax
xor    $0xffffffff,%eax
mov    %ax,-0x14(%rbp)
movw   $0x0,-0x14(%rbp)
movzwl -0x6(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x16(%rbp)
movw   $0x0,-0x16(%rbp)
movzwl -0x8(%rbp),%eax
xor    $0xffffffff,%eax
mov    %ax,-0x18(%rbp)
movw   $0x0,-0x18(%rbp)
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca i16
%3 = alloca i16
%4 = alloca i16
%5 = alloca i16
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = alloca i16
%11 = alloca i16
store i32 0, i32* %1
store i16 -1, i16* %2
store i16 -1, i16* %3
%12 = load i16, i16* %2
%13 = zext i16 %12 to i32
%14 = load i16, i16* %3
%15 = zext i16 %14 to i32
%16 = or i32 %13, %15
%17 = trunc i32 %16 to i16
store i16 %17, i16* %4
store i16 0, i16* %4
%18 = load i16, i16* %2
%19 = zext i16 %18 to i32
%20 = load i16, i16* %3
%21 = zext i16 %20 to i32
%22 = and i32 %19, %21
%23 = trunc i32 %22 to i16
store i16 %23, i16* %5
store i16 0, i16* %5
%24 = load i16, i16* %2
%25 = zext i16 %24 to i32
%26 = load i16, i16* %3
%27 = zext i16 %26 to i32
%28 = xor i32 %25, %27
%29 = trunc i32 %28 to i16
store i16 %29, i16* %6
store i16 0, i16* %6
%30 = load i16, i16* %2
%31 = zext i16 %30 to i32
%32 = load i16, i16* %3
%33 = zext i16 %32 to i32
%34 = or i32 %31, %33
%35 = xor i32 %34, -1
%36 = trunc i32 %35 to i16
store i16 %36, i16* %7
store i16 0, i16* %7
%37 = load i16, i16* %2
%38 = zext i16 %37 to i32
%39 = load i16, i16* %3
%40 = zext i16 %39 to i32
%41 = and i32 %38, %40
%42 = xor i32 %41, -1
%43 = trunc i32 %42 to i16
store i16 %43, i16* %8
store i16 0, i16* %8
%44 = load i16, i16* %2
%45 = zext i16 %44 to i32
%46 = load i16, i16* %3
%47 = zext i16 %46 to i32
%48 = xor i32 %45, %47
%49 = xor i32 %48, -1
%50 = trunc i32 %49 to i16
store i16 %50, i16* %9
store i16 0, i16* %9
%51 = load i16, i16* %2
%52 = zext i16 %51 to i32
%53 = xor i32 %52, -1
%54 = trunc i32 %53 to i16
store i16 %54, i16* %10
store i16 0, i16* %10
%55 = load i16, i16* %3
%56 = zext i16 %55 to i32
%57 = xor i32 %56, -1
%58 = trunc i32 %57 to i16
store i16 %58, i16* %11
store i16 0, i16* %11
store i16 3855, i16* %2
store i16 -3856, i16* %3
%59 = load i16, i16* %2
%60 = zext i16 %59 to i32
%61 = load i16, i16* %3
%62 = zext i16 %61 to i32
%63 = or i32 %60, %62
%64 = trunc i32 %63 to i16
store i16 %64, i16* %4
store i16 0, i16* %4
%65 = load i16, i16* %2
%66 = zext i16 %65 to i32
%67 = load i16, i16* %3
%68 = zext i16 %67 to i32
%69 = and i32 %66, %68
%70 = trunc i32 %69 to i16
store i16 %70, i16* %5
store i16 0, i16* %5
%71 = load i16, i16* %2
%72 = zext i16 %71 to i32
%73 = load i16, i16* %3
%74 = zext i16 %73 to i32
%75 = xor i32 %72, %74
%76 = trunc i32 %75 to i16
store i16 %76, i16* %6
store i16 0, i16* %6
%77 = load i16, i16* %2
%78 = zext i16 %77 to i32
%79 = load i16, i16* %3
%80 = zext i16 %79 to i32
%81 = or i32 %78, %80
%82 = xor i32 %81, -1
%83 = trunc i32 %82 to i16
store i16 %83, i16* %7
store i16 0, i16* %7
%84 = load i16, i16* %2
%85 = zext i16 %84 to i32
%86 = load i16, i16* %3
%87 = zext i16 %86 to i32
%88 = and i32 %85, %87
%89 = xor i32 %88, -1
%90 = trunc i32 %89 to i16
store i16 %90, i16* %8
store i16 0, i16* %8
%91 = load i16, i16* %2
%92 = zext i16 %91 to i32
%93 = load i16, i16* %3
%94 = zext i16 %93 to i32
%95 = xor i32 %92, %94
%96 = xor i32 %95, -1
%97 = trunc i32 %96 to i16
store i16 %97, i16* %9
store i16 0, i16* %9
%98 = load i16, i16* %2
%99 = zext i16 %98 to i32
%100 = xor i32 %99, -1
%101 = trunc i32 %100 to i16
store i16 %101, i16* %10
store i16 0, i16* %10
%102 = load i16, i16* %3
%103 = zext i16 %102 to i32
%104 = xor i32 %103, -1
%105 = trunc i32 %104 to i16
store i16 %105, i16* %11
store i16 0, i16* %11
store i16 -1, i16* %2
store i16 0, i16* %3
%106 = load i16, i16* %2
%107 = zext i16 %106 to i32
%108 = load i16, i16* %3
%109 = zext i16 %108 to i32
%110 = or i32 %107, %109
%111 = trunc i32 %110 to i16
store i16 %111, i16* %4
store i16 0, i16* %4
%112 = load i16, i16* %2
%113 = zext i16 %112 to i32
%114 = load i16, i16* %3
%115 = zext i16 %114 to i32
%116 = and i32 %113, %115
%117 = trunc i32 %116 to i16
store i16 %117, i16* %5
store i16 0, i16* %5
%118 = load i16, i16* %2
%119 = zext i16 %118 to i32
%120 = load i16, i16* %3
%121 = zext i16 %120 to i32
%122 = xor i32 %119, %121
%123 = trunc i32 %122 to i16
store i16 %123, i16* %6
store i16 0, i16* %6
%124 = load i16, i16* %2
%125 = zext i16 %124 to i32
%126 = load i16, i16* %3
%127 = zext i16 %126 to i32
%128 = or i32 %125, %127
%129 = xor i32 %128, -1
%130 = trunc i32 %129 to i16
store i16 %130, i16* %7
store i16 0, i16* %7
%131 = load i16, i16* %2
%132 = zext i16 %131 to i32
%133 = load i16, i16* %3
%134 = zext i16 %133 to i32
%135 = and i32 %132, %134
%136 = xor i32 %135, -1
%137 = trunc i32 %136 to i16
store i16 %137, i16* %8
store i16 0, i16* %8
%138 = load i16, i16* %2
%139 = zext i16 %138 to i32
%140 = load i16, i16* %3
%141 = zext i16 %140 to i32
%142 = xor i32 %139, %141
%143 = xor i32 %142, -1
%144 = trunc i32 %143 to i16
store i16 %144, i16* %9
store i16 0, i16* %9
%145 = load i16, i16* %2
%146 = zext i16 %145 to i32
%147 = xor i32 %146, -1
%148 = trunc i32 %147 to i16
store i16 %148, i16* %10
store i16 0, i16* %10
%149 = load i16, i16* %3
%150 = zext i16 %149 to i32
%151 = xor i32 %150, -1
%152 = trunc i32 %151 to i16
store i16 %152, i16* %11
store i16 0, i16* %11
store i16 21845, i16* %2
store i16 -21846, i16* %3
%153 = load i16, i16* %2
%154 = zext i16 %153 to i32
%155 = load i16, i16* %3
%156 = zext i16 %155 to i32
%157 = or i32 %154, %156
%158 = trunc i32 %157 to i16
store i16 %158, i16* %4
store i16 0, i16* %4
%159 = load i16, i16* %2
%160 = zext i16 %159 to i32
%161 = load i16, i16* %3
%162 = zext i16 %161 to i32
%163 = and i32 %160, %162
%164 = trunc i32 %163 to i16
store i16 %164, i16* %5
store i16 0, i16* %5
%165 = load i16, i16* %2
%166 = zext i16 %165 to i32
%167 = load i16, i16* %3
%168 = zext i16 %167 to i32
%169 = xor i32 %166, %168
%170 = trunc i32 %169 to i16
store i16 %170, i16* %6
store i16 0, i16* %6
%171 = load i16, i16* %2
%172 = zext i16 %171 to i32
%173 = load i16, i16* %3
%174 = zext i16 %173 to i32
%175 = or i32 %172, %174
%176 = xor i32 %175, -1
%177 = trunc i32 %176 to i16
store i16 %177, i16* %7
store i16 0, i16* %7
%178 = load i16, i16* %2
%179 = zext i16 %178 to i32
%180 = load i16, i16* %3
%181 = zext i16 %180 to i32
%182 = and i32 %179, %181
%183 = xor i32 %182, -1
%184 = trunc i32 %183 to i16
store i16 %184, i16* %8
store i16 0, i16* %8
%185 = load i16, i16* %2
%186 = zext i16 %185 to i32
%187 = load i16, i16* %3
%188 = zext i16 %187 to i32
%189 = xor i32 %186, %188
%190 = xor i32 %189, -1
%191 = trunc i32 %190 to i16
store i16 %191, i16* %9
store i16 0, i16* %9
%192 = load i16, i16* %2
%193 = zext i16 %192 to i32
%194 = xor i32 %193, -1
%195 = trunc i32 %194 to i16
store i16 %195, i16* %10
store i16 0, i16* %10
%196 = load i16, i16* %3
%197 = zext i16 %196 to i32
%198 = xor i32 %197, -1
%199 = trunc i32 %198 to i16
store i16 %199, i16* %11
store i16 0, i16* %11
store i16 0, i16* %2
store i16 0, i16* %3
%200 = load i16, i16* %2
%201 = zext i16 %200 to i32
%202 = load i16, i16* %3
%203 = zext i16 %202 to i32
%204 = or i32 %201, %203
%205 = trunc i32 %204 to i16
store i16 %205, i16* %4
store i16 0, i16* %4
%206 = load i16, i16* %2
%207 = zext i16 %206 to i32
%208 = load i16, i16* %3
%209 = zext i16 %208 to i32
%210 = and i32 %207, %209
%211 = trunc i32 %210 to i16
store i16 %211, i16* %5
store i16 0, i16* %5
%212 = load i16, i16* %2
%213 = zext i16 %212 to i32
%214 = load i16, i16* %3
%215 = zext i16 %214 to i32
%216 = xor i32 %213, %215
%217 = trunc i32 %216 to i16
store i16 %217, i16* %6
store i16 0, i16* %6
%218 = load i16, i16* %2
%219 = zext i16 %218 to i32
%220 = load i16, i16* %3
%221 = zext i16 %220 to i32
%222 = or i32 %219, %221
%223 = xor i32 %222, -1
%224 = trunc i32 %223 to i16
store i16 %224, i16* %7
store i16 0, i16* %7
%225 = load i16, i16* %2
%226 = zext i16 %225 to i32
%227 = load i16, i16* %3
%228 = zext i16 %227 to i32
%229 = and i32 %226, %228
%230 = xor i32 %229, -1
%231 = trunc i32 %230 to i16
store i16 %231, i16* %8
store i16 0, i16* %8
%232 = load i16, i16* %2
%233 = zext i16 %232 to i32
%234 = load i16, i16* %3
%235 = zext i16 %234 to i32
%236 = xor i32 %233, %235
%237 = xor i32 %236, -1
%238 = trunc i32 %237 to i16
store i16 %238, i16* %9
store i16 0, i16* %9
%239 = load i16, i16* %2
%240 = zext i16 %239 to i32
%241 = xor i32 %240, -1
%242 = trunc i32 %241 to i16
store i16 %242, i16* %10
store i16 0, i16* %10
%243 = load i16, i16* %3
%244 = zext i16 %243 to i32
%245 = xor i32 %244, -1
%246 = trunc i32 %245 to i16
store i16 %246, i16* %11
store i16 0, i16* %11
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
ret i32 0
}