void foo(int *__restrict__ pInput, int *__restrict__ pOutput,
         int *__restrict__ pInput2, int *__restrict__ pOutput2) {
  int i, a, b, c, d;
  for (i = 0; i < 16 / 3; i++) {
    a = *pInput++;
    b = *pInput++;
    c = *pInput++;
    d = *pInput2++;
    *pOutput++ = 100 * a + 1322 * b + 74 * c;
    *pOutput++ = 216 * a + 13 * b + 191 * c;
    *pOutput++ = 23 * a + 27271 * b + 500 * c;
    *pOutput2++ = 405 * d;
  }
}


x86 assembly (clang, -O0):
<foo>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x5,-0x24(%rbp)
jge    120d <foo+0x10d>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
imul   $0x64,-0x28(%rbp),%ecx
imul   $0x52a,-0x2c(%rbp),%eax
add    %eax,%ecx
imul   $0x4a,-0x30(%rbp),%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x10(%rbp)
mov    %ecx,(%rax)
imul   $0xd8,-0x28(%rbp),%ecx
imul   $0xd,-0x2c(%rbp),%eax
add    %eax,%ecx
imul   $0xbf,-0x30(%rbp),%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x10(%rbp)
mov    %ecx,(%rax)
imul   $0x17,-0x28(%rbp),%ecx
imul   $0x6a87,-0x2c(%rbp),%eax
add    %eax,%ecx
imul   $0x1f4,-0x30(%rbp),%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x10(%rbp)
mov    %ecx,(%rax)
imul   $0x195,-0x34(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x4,%rdx
mov    %rdx,-0x20(%rbp)
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    111b <foo+0x1b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<foo>:
push   %rbx
mov    (%rdi),%r11d
mov    0x4(%rdi),%r8d
mov    0x8(%rdi),%r9d
imul   $0x64,%r11d,%r10d
imul   $0x52a,%r8d,%ebx
add    %r10d,%ebx
imul   $0x4a,%r9d,%eax
add    %ebx,%eax
mov    %eax,(%rsi)
imul   $0xd8,%r11d,%eax
lea    (%r8,%r8,2),%ebx
lea    (%r8,%rbx,4),%ebx
add    %eax,%ebx
imul   $0xbf,%r9d,%eax
add    %ebx,%eax
mov    %eax,0x4(%rsi)
lea    (%r11,%r11,2),%eax
shl    $0x3,%eax
sub    %r11d,%eax
imul   $0x6a87,%r8d,%ebx
add    %eax,%ebx
imul   $0x1f4,%r9d,%eax
add    %ebx,%eax
mov    %eax,0x8(%rsi)
mov    0xc(%rdi),%r10d
mov    0x10(%rdi),%r11d
mov    0x14(%rdi),%r8d
imul   $0x64,%r10d,%r9d
imul   $0x52a,%r11d,%eax
add    %r9d,%eax
imul   $0x4a,%r8d,%ebx
add    %eax,%ebx
mov    %ebx,0xc(%rsi)
imul   $0xd8,%r10d,%eax
lea    (%r11,%r11,2),%ebx
lea    (%r11,%rbx,4),%ebx
add    %eax,%ebx
imul   $0xbf,%r8d,%eax
add    %ebx,%eax
mov    %eax,0x10(%rsi)
lea    (%r10,%r10,2),%eax
shl    $0x3,%eax
sub    %r10d,%eax
imul   $0x6a87,%r11d,%ebx
add    %eax,%ebx
imul   $0x1f4,%r8d,%eax
add    %ebx,%eax
mov    %eax,0x14(%rsi)
mov    0x18(%rdi),%r10d
mov    0x1c(%rdi),%r11d
mov    0x20(%rdi),%r8d
imul   $0x64,%r10d,%r9d
imul   $0x52a,%r11d,%eax
add    %r9d,%eax
imul   $0x4a,%r8d,%ebx
add    %eax,%ebx
mov    %ebx,0x18(%rsi)
imul   $0xd8,%r10d,%eax
lea    (%r11,%r11,2),%ebx
lea    (%r11,%rbx,4),%ebx
add    %eax,%ebx
imul   $0xbf,%r8d,%eax
add    %ebx,%eax
mov    %eax,0x1c(%rsi)
lea    (%r10,%r10,2),%eax
shl    $0x3,%eax
sub    %r10d,%eax
imul   $0x6a87,%r11d,%ebx
add    %eax,%ebx
imul   $0x1f4,%r8d,%eax
add    %ebx,%eax
mov    %eax,0x20(%rsi)
mov    0x24(%rdi),%r10d
mov    0x28(%rdi),%r11d
mov    0x2c(%rdi),%r8d
movdqu (%rdx),%xmm0
imul   $0x64,%r10d,%r9d
imul   $0x52a,%r11d,%eax
add    %r9d,%eax
imul   $0x4a,%r8d,%ebx
add    %eax,%ebx
mov    %ebx,0x24(%rsi)
imul   $0xd8,%r10d,%eax
lea    (%r11,%r11,2),%ebx
lea    (%r11,%rbx,4),%ebx
add    %eax,%ebx
imul   $0xbf,%r8d,%eax
add    %ebx,%eax
mov    %eax,0x28(%rsi)
lea    (%r10,%r10,2),%eax
shl    $0x3,%eax
sub    %r10d,%eax
imul   $0x6a87,%r11d,%ebx
add    %eax,%ebx
imul   $0x1f4,%r8d,%eax
add    %ebx,%eax
mov    %eax,0x2c(%rsi)
movdqa 0xd79(%rip),%xmm1
pshufd $0xf5,%xmm0,%xmm2
pmuludq %xmm1,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm1,%xmm2
pshufd $0xe8,%xmm2,%xmm1
punpckldq %xmm1,%xmm0
movdqu %xmm0,(%rcx)
mov    0x30(%rdi),%r10d
mov    0x34(%rdi),%ebx
mov    0x38(%rdi),%r9d
imul   $0x64,%r10d,%r8d
imul   $0x52a,%ebx,%edi
add    %r8d,%edi
imul   $0x4a,%r9d,%eax
add    %edi,%eax
imul   $0x195,0x10(%rdx),%edx
mov    %eax,0x30(%rsi)
imul   $0xd8,%r10d,%eax
lea    (%rbx,%rbx,2),%edi
lea    (%rbx,%rdi,4),%edi
add    %eax,%edi
imul   $0xbf,%r9d,%eax
add    %edi,%eax
mov    %eax,0x34(%rsi)
lea    (%r10,%r10,2),%eax
shl    $0x3,%eax
sub    %r10d,%eax
imul   $0x6a87,%ebx,%edi
add    %eax,%edi
imul   $0x1f4,%r9d,%eax
add    %edi,%eax
mov    %eax,0x38(%rsi)
mov    %edx,0x10(%rcx)
pop    %rbx
ret

LLVM IR (-O0):
define void @foo(i32* noalias %0, i32* noalias %1, i32* noalias %2, i32* noalias %3) {
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i32* %0, i32** %5
store i32* %1, i32** %6
store i32* %2, i32** %7
store i32* %3, i32** %8
store i32 0, i32* %9
br label %14
14: ; preds = %64, %4
%15 = load i32, i32* %9
%16 = icmp slt i32 %15, 5
br i1 %16, label %17, label %67
17: ; preds = %14
%18 = load i32*, i32** %5
%19 = getelementptr inbounds i32, i32* %18, i32 1
store i32* %19, i32** %5
%20 = load i32, i32* %18
store i32 %20, i32* %10
%21 = load i32*, i32** %5
%22 = getelementptr inbounds i32, i32* %21, i32 1
store i32* %22, i32** %5
%23 = load i32, i32* %21
store i32 %23, i32* %11
%24 = load i32*, i32** %5
%25 = getelementptr inbounds i32, i32* %24, i32 1
store i32* %25, i32** %5
%26 = load i32, i32* %24
store i32 %26, i32* %12
%27 = load i32*, i32** %7
%28 = getelementptr inbounds i32, i32* %27, i32 1
store i32* %28, i32** %7
%29 = load i32, i32* %27
store i32 %29, i32* %13
%30 = load i32, i32* %10
%31 = mul nsw i32 100, %30
%32 = load i32, i32* %11
%33 = mul nsw i32 1322, %32
%34 = add nsw i32 %31, %33
%35 = load i32, i32* %12
%36 = mul nsw i32 74, %35
%37 = add nsw i32 %34, %36
%38 = load i32*, i32** %6
%39 = getelementptr inbounds i32, i32* %38, i32 1
store i32* %39, i32** %6
store i32 %37, i32* %38
%40 = load i32, i32* %10
%41 = mul nsw i32 216, %40
%42 = load i32, i32* %11
%43 = mul nsw i32 13, %42
%44 = add nsw i32 %41, %43
%45 = load i32, i32* %12
%46 = mul nsw i32 191, %45
%47 = add nsw i32 %44, %46
%48 = load i32*, i32** %6
%49 = getelementptr inbounds i32, i32* %48, i32 1
store i32* %49, i32** %6
store i32 %47, i32* %48
%50 = load i32, i32* %10
%51 = mul nsw i32 23, %50
%52 = load i32, i32* %11
%53 = mul nsw i32 27271, %52
%54 = add nsw i32 %51, %53
%55 = load i32, i32* %12
%56 = mul nsw i32 500, %55
%57 = add nsw i32 %54, %56
%58 = load i32*, i32** %6
%59 = getelementptr inbounds i32, i32* %58, i32 1
store i32* %59, i32** %6
store i32 %57, i32* %58
%60 = load i32, i32* %13
%61 = mul nsw i32 405, %60
%62 = load i32*, i32** %8
%63 = getelementptr inbounds i32, i32* %62, i32 1
store i32* %63, i32** %8
store i32 %61, i32* %62
br label %64
64: ; preds = %17
%65 = load i32, i32* %9
%66 = add nsw i32 %65, 1
store i32 %66, i32* %9
br label %14
67: ; preds = %14
ret void
}

LLVM IR (-O2):
define void @foo(i32* noalias nocapture %0, i32* noalias nocapture writeonly %1, i32* noalias nocapture %2, i32* noalias nocapture writeonly %3) {
%5 = getelementptr inbounds i32, i32* %0, i64 1
%6 = load i32, i32* %0
%7 = getelementptr inbounds i32, i32* %0, i64 2
%8 = load i32, i32* %5
%9 = getelementptr inbounds i32, i32* %0, i64 3
%10 = load i32, i32* %7
%11 = mul nsw i32 %6, 100
%12 = mul nsw i32 %8, 1322
%13 = add nsw i32 %12, %11
%14 = mul nsw i32 %10, 74
%15 = add nsw i32 %13, %14
%16 = getelementptr inbounds i32, i32* %1, i64 1
store i32 %15, i32* %1
%17 = mul nsw i32 %6, 216
%18 = mul nsw i32 %8, 13
%19 = add nsw i32 %18, %17
%20 = mul nsw i32 %10, 191
%21 = add nsw i32 %19, %20
%22 = getelementptr inbounds i32, i32* %1, i64 2
store i32 %21, i32* %16
%23 = mul nsw i32 %6, 23
%24 = mul nsw i32 %8, 27271
%25 = add nsw i32 %24, %23
%26 = mul nsw i32 %10, 500
%27 = add nsw i32 %25, %26
%28 = getelementptr inbounds i32, i32* %1, i64 3
store i32 %27, i32* %22
%29 = getelementptr inbounds i32, i32* %0, i64 4
%30 = load i32, i32* %9
%31 = getelementptr inbounds i32, i32* %0, i64 5
%32 = load i32, i32* %29
%33 = getelementptr inbounds i32, i32* %0, i64 6
%34 = load i32, i32* %31
%35 = mul nsw i32 %30, 100
%36 = mul nsw i32 %32, 1322
%37 = add nsw i32 %36, %35
%38 = mul nsw i32 %34, 74
%39 = add nsw i32 %37, %38
%40 = getelementptr inbounds i32, i32* %1, i64 4
store i32 %39, i32* %28
%41 = mul nsw i32 %30, 216
%42 = mul nsw i32 %32, 13
%43 = add nsw i32 %42, %41
%44 = mul nsw i32 %34, 191
%45 = add nsw i32 %43, %44
%46 = getelementptr inbounds i32, i32* %1, i64 5
store i32 %45, i32* %40
%47 = mul nsw i32 %30, 23
%48 = mul nsw i32 %32, 27271
%49 = add nsw i32 %48, %47
%50 = mul nsw i32 %34, 500
%51 = add nsw i32 %49, %50
%52 = getelementptr inbounds i32, i32* %1, i64 6
store i32 %51, i32* %46
%53 = getelementptr inbounds i32, i32* %0, i64 7
%54 = load i32, i32* %33
%55 = getelementptr inbounds i32, i32* %0, i64 8
%56 = load i32, i32* %53
%57 = getelementptr inbounds i32, i32* %0, i64 9
%58 = load i32, i32* %55
%59 = mul nsw i32 %54, 100
%60 = mul nsw i32 %56, 1322
%61 = add nsw i32 %60, %59
%62 = mul nsw i32 %58, 74
%63 = add nsw i32 %61, %62
%64 = getelementptr inbounds i32, i32* %1, i64 7
store i32 %63, i32* %52
%65 = mul nsw i32 %54, 216
%66 = mul nsw i32 %56, 13
%67 = add nsw i32 %66, %65
%68 = mul nsw i32 %58, 191
%69 = add nsw i32 %67, %68
%70 = getelementptr inbounds i32, i32* %1, i64 8
store i32 %69, i32* %64
%71 = mul nsw i32 %54, 23
%72 = mul nsw i32 %56, 27271
%73 = add nsw i32 %72, %71
%74 = mul nsw i32 %58, 500
%75 = add nsw i32 %73, %74
%76 = getelementptr inbounds i32, i32* %1, i64 9
store i32 %75, i32* %70
%77 = getelementptr inbounds i32, i32* %0, i64 10
%78 = load i32, i32* %57
%79 = getelementptr inbounds i32, i32* %0, i64 11
%80 = load i32, i32* %77
%81 = getelementptr inbounds i32, i32* %0, i64 12
%82 = load i32, i32* %79
%83 = getelementptr inbounds i32, i32* %2, i64 4
%84 = bitcast i32* %2 to <4 x i32>*
%85 = load <4 x i32>, <4 x i32>* %84
%86 = mul nsw i32 %78, 100
%87 = mul nsw i32 %80, 1322
%88 = add nsw i32 %87, %86
%89 = mul nsw i32 %82, 74
%90 = add nsw i32 %88, %89
%91 = getelementptr inbounds i32, i32* %1, i64 10
store i32 %90, i32* %76
%92 = mul nsw i32 %78, 216
%93 = mul nsw i32 %80, 13
%94 = add nsw i32 %93, %92
%95 = mul nsw i32 %82, 191
%96 = add nsw i32 %94, %95
%97 = getelementptr inbounds i32, i32* %1, i64 11
store i32 %96, i32* %91
%98 = mul nsw i32 %78, 23
%99 = mul nsw i32 %80, 27271
%100 = add nsw i32 %99, %98
%101 = mul nsw i32 %82, 500
%102 = add nsw i32 %100, %101
%103 = getelementptr inbounds i32, i32* %1, i64 12
store i32 %102, i32* %97
%104 = mul nsw <4 x i32> %85, <i32 405, i32 405, i32 405, i32 405>
%105 = getelementptr inbounds i32, i32* %3, i64 4
%106 = bitcast i32* %3 to <4 x i32>*
store <4 x i32> %104, <4 x i32>* %106
%107 = getelementptr inbounds i32, i32* %0, i64 13
%108 = load i32, i32* %81
%109 = getelementptr inbounds i32, i32* %0, i64 14
%110 = load i32, i32* %107
%111 = load i32, i32* %109
%112 = load i32, i32* %83
%113 = mul nsw i32 %108, 100
%114 = mul nsw i32 %110, 1322
%115 = add nsw i32 %114, %113
%116 = mul nsw i32 %111, 74
%117 = add nsw i32 %115, %116
%118 = getelementptr inbounds i32, i32* %1, i64 13
store i32 %117, i32* %103
%119 = mul nsw i32 %108, 216
%120 = mul nsw i32 %110, 13
%121 = add nsw i32 %120, %119
%122 = mul nsw i32 %111, 191
%123 = add nsw i32 %121, %122
%124 = getelementptr inbounds i32, i32* %1, i64 14
store i32 %123, i32* %118
%125 = mul nsw i32 %108, 23
%126 = mul nsw i32 %110, 27271
%127 = add nsw i32 %126, %125
%128 = mul nsw i32 %111, 500
%129 = add nsw i32 %127, %128
store i32 %129, i32* %124
%130 = mul nsw i32 %112, 405
store i32 %130, i32* %105
ret void
}