__attribute__((noipa)) void foo(unsigned short *x) {
  unsigned short i, v;
  unsigned char j;
  for (i = 0; i < 256; i++) {
    v = i << 8;
    for (j = 0; j < 8; j++)
      if (v & 0x8000)
        v = (v << 1) ^ 0x1021;
      else
        v = v << 1;
    x[i] = v;
  }
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movw   $0x0,-0xa(%rbp)
movzwl -0xa(%rbp),%eax
cmp    $0x100,%eax
jge    119e <foo+0x9e>
movzwl -0xa(%rbp),%eax
shl    $0x8,%eax
mov    %ax,-0xc(%rbp)
movb   $0x0,-0xd(%rbp)
movzbl -0xd(%rbp),%eax
cmp    $0x8,%eax
jge    117d <foo+0x7d>
movzwl -0xc(%rbp),%eax
and    $0x8000,%eax
cmp    $0x0,%eax
je     1160 <foo+0x60>
movzwl -0xc(%rbp),%eax
shl    $0x1,%eax
xor    $0x1021,%eax
mov    %ax,-0xc(%rbp)
jmp    116b <foo+0x6b>
movzwl -0xc(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0xc(%rbp)
jmp    1170 <foo+0x70>
mov    -0xd(%rbp),%al
add    $0x1,%al
mov    %al,-0xd(%rbp)
jmp    112c <foo+0x2c>
mov    -0xc(%rbp),%dx
mov    -0x8(%rbp),%rax
movzwl -0xa(%rbp),%ecx
mov    %dx,(%rax,%rcx,2)
mov    -0xa(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xa(%rbp)
jmp    110e <foo+0xe>
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
movdqa 0xef8(%rip),%xmm0
xor    %eax,%eax
movdqa 0xefe(%rip),%xmm1
pcmpeqd %xmm2,%xmm2
movdqa 0xf02(%rip),%xmm3
xchg   %ax,%ax
movdqa %xmm0,%xmm4
psllw  $0x9,%xmm4
movdqa %xmm0,%xmm5
psllw  $0x8,%xmm5
psraw  $0xf,%xmm5
movdqa %xmm5,%xmm6
pandn  %xmm4,%xmm6
pxor   %xmm1,%xmm4
pand   %xmm5,%xmm4
por    %xmm6,%xmm4
movdqa %xmm4,%xmm5
pcmpgtw %xmm2,%xmm5
paddw  %xmm4,%xmm4
movdqa %xmm4,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm5,%xmm4
pandn  %xmm6,%xmm5
por    %xmm4,%xmm5
movdqa %xmm5,%xmm4
pcmpgtw %xmm2,%xmm4
paddw  %xmm5,%xmm5
movdqa %xmm5,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm4,%xmm5
pandn  %xmm6,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,%xmm5
pcmpgtw %xmm2,%xmm5
paddw  %xmm4,%xmm4
movdqa %xmm4,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm5,%xmm4
pandn  %xmm6,%xmm5
por    %xmm4,%xmm5
movdqa %xmm5,%xmm4
pcmpgtw %xmm2,%xmm4
paddw  %xmm5,%xmm5
movdqa %xmm5,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm4,%xmm5
pandn  %xmm6,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,%xmm5
pcmpgtw %xmm2,%xmm5
paddw  %xmm4,%xmm4
movdqa %xmm4,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm5,%xmm4
pandn  %xmm6,%xmm5
por    %xmm4,%xmm5
movdqa %xmm5,%xmm4
pcmpgtw %xmm2,%xmm4
paddw  %xmm5,%xmm5
movdqa %xmm5,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm4,%xmm5
pandn  %xmm6,%xmm4
por    %xmm5,%xmm4
movdqa %xmm4,%xmm5
pcmpgtw %xmm2,%xmm5
paddw  %xmm4,%xmm4
movdqa %xmm4,%xmm6
pxor   %xmm1,%xmm6
pand   %xmm5,%xmm4
pandn  %xmm6,%xmm5
por    %xmm4,%xmm5
movdqu %xmm5,(%rdi,%rax,2)
add    $0x8,%rax
paddw  %xmm3,%xmm0
cmp    $0x100,%rax
jne    1120 <foo+0x20>
ret

LLVM IR (-O0):
define void @foo(i16* %0) {
%2 = alloca i16*
%3 = alloca i16
%4 = alloca i16
%5 = alloca i8
store i16* %0, i16** %2
store i16 0, i16* %3
br label %6
6: ; preds = %45, %1
%7 = load i16, i16* %3
%8 = zext i16 %7 to i32
%9 = icmp slt i32 %8, 256
br i1 %9, label %10, label %48
10: ; preds = %6
%11 = load i16, i16* %3
%12 = zext i16 %11 to i32
%13 = shl i32 %12, 8
%14 = trunc i32 %13 to i16
store i16 %14, i16* %4
store i8 0, i8* %5
br label %15
15: ; preds = %36, %10
%16 = load i8, i8* %5
%17 = zext i8 %16 to i32
%18 = icmp slt i32 %17, 8
br i1 %18, label %19, label %39
19: ; preds = %15
%20 = load i16, i16* %4
%21 = zext i16 %20 to i32
%22 = and i32 %21, 32768
%23 = icmp ne i32 %22, 0
br i1 %23, label %24, label %30
24: ; preds = %19
%25 = load i16, i16* %4
%26 = zext i16 %25 to i32
%27 = shl i32 %26, 1
%28 = xor i32 %27, 4129
%29 = trunc i32 %28 to i16
store i16 %29, i16* %4
br label %35
30: ; preds = %19
%31 = load i16, i16* %4
%32 = zext i16 %31 to i32
%33 = shl i32 %32, 1
%34 = trunc i32 %33 to i16
store i16 %34, i16* %4
br label %35
35: ; preds = %30, %24
br label %36
36: ; preds = %35
%37 = load i8, i8* %5
%38 = add i8 %37, 1
store i8 %38, i8* %5
br label %15
39: ; preds = %15
%40 = load i16, i16* %4
%41 = load i16*, i16** %2
%42 = load i16, i16* %3
%43 = zext i16 %42 to i64
%44 = getelementptr inbounds i16, i16* %41, i64 %43
store i16 %40, i16* %44
br label %45
45: ; preds = %39
%46 = load i16, i16* %3
%47 = add i16 %46, 1
store i16 %47, i16* %3
br label %6
48: ; preds = %6
ret void
}

LLVM IR (-O2):
define void @foo(i16* nocapture writeonly %0) {
br label %2
2: ; preds = %2, %1
%3 = phi i64 [ 0, %1 ], [ %40, %2 ]
%4 = phi <8 x i16> [ <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>, %1 ], [ %41, %2 ]
%5 = and <8 x i16> %4, <i16 128, i16 128, i16 128, i16 128, i16 128, i16 128, i16 128, i16 128>
%6 = icmp eq <8 x i16> %5, zeroinitializer
%7 = shl <8 x i16> %4, <i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9, i16 9>
%8 = xor <8 x i16> %7, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%9 = select <8 x i1> %6, <8 x i16> %7, <8 x i16> %8
%10 = icmp sgt <8 x i16> %9, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%11 = shl <8 x i16> %9, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%12 = xor <8 x i16> %11, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%13 = select <8 x i1> %10, <8 x i16> %11, <8 x i16> %12
%14 = icmp sgt <8 x i16> %13, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%15 = shl <8 x i16> %13, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%16 = xor <8 x i16> %15, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%17 = select <8 x i1> %14, <8 x i16> %15, <8 x i16> %16
%18 = icmp sgt <8 x i16> %17, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%19 = shl <8 x i16> %17, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%20 = xor <8 x i16> %19, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%21 = select <8 x i1> %18, <8 x i16> %19, <8 x i16> %20
%22 = icmp sgt <8 x i16> %21, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%23 = shl <8 x i16> %21, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%24 = xor <8 x i16> %23, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%25 = select <8 x i1> %22, <8 x i16> %23, <8 x i16> %24
%26 = icmp sgt <8 x i16> %25, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%27 = shl <8 x i16> %25, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%28 = xor <8 x i16> %27, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%29 = select <8 x i1> %26, <8 x i16> %27, <8 x i16> %28
%30 = icmp sgt <8 x i16> %29, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%31 = shl <8 x i16> %29, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%32 = xor <8 x i16> %31, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%33 = select <8 x i1> %30, <8 x i16> %31, <8 x i16> %32
%34 = icmp sgt <8 x i16> %33, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%35 = shl <8 x i16> %33, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
%36 = xor <8 x i16> %35, <i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129, i16 4129>
%37 = select <8 x i1> %34, <8 x i16> %35, <8 x i16> %36
%38 = getelementptr inbounds i16, i16* %0, i64 %3
%39 = bitcast i16* %38 to <8 x i16>*
store <8 x i16> %37, <8 x i16>* %39
%40 = add nuw i64 %3, 8
%41 = add <8 x i16> %4, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
%42 = icmp eq i64 %40, 256
br i1 %42, label %43, label %2
43: ; preds = %2
ret void
}