void ex6(int *A, int *B, int n) {
  for (int i = n; i > 0; --i)
    A[i] += 1;
}


x86 assembly (clang, -O0):
<ex6>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jle    113e <ex6+0x3e>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    1115 <ex6+0x15>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ex6>:
test   %edx,%edx
jle    11ef <ex6+0xef>
mov    %edx,%eax
cmp    $0x8,%edx
jb     11d3 <ex6+0xd3>
mov    %eax,%r8d
and    $0xfffffff8,%r8d
lea    -0x8(%r8),%rcx
mov    %rcx,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rcx,%rcx
je     11f0 <ex6+0xf0>
mov    %r9,%rdx
and    $0xfffffffffffffffe,%rdx
lea    (%rdi,%rax,4),%rcx
add    $0xfffffffffffffff4,%rcx
xor    %esi,%esi
pcmpeqd %xmm0,%xmm0
nopw   0x0(%rax,%rax,1)
movdqu -0x30(%rcx,%rsi,4),%xmm1
movdqu -0x20(%rcx,%rsi,4),%xmm2
movdqu -0x10(%rcx,%rsi,4),%xmm3
movdqu (%rcx,%rsi,4),%xmm4
psubd  %xmm0,%xmm4
psubd  %xmm0,%xmm3
movdqu %xmm4,(%rcx,%rsi,4)
movdqu %xmm3,-0x10(%rcx,%rsi,4)
psubd  %xmm0,%xmm2
psubd  %xmm0,%xmm1
movdqu %xmm2,-0x20(%rcx,%rsi,4)
movdqu %xmm1,-0x30(%rcx,%rsi,4)
add    $0xfffffffffffffff0,%rsi
add    $0xfffffffffffffffe,%rdx
jne    1150 <ex6+0x50>
neg    %rsi
test   $0x1,%r9b
je     11cb <ex6+0xcb>
mov    %rax,%rcx
sub    %rsi,%rcx
movdqu -0x1c(%rdi,%rcx,4),%xmm0
movdqu -0xc(%rdi,%rcx,4),%xmm1
pcmpeqd %xmm2,%xmm2
psubd  %xmm2,%xmm1
psubd  %xmm2,%xmm0
movdqu %xmm1,-0xc(%rdi,%rcx,4)
movdqu %xmm0,-0x1c(%rdi,%rcx,4)
cmp    %rax,%r8
je     11ef <ex6+0xef>
and    $0x7,%eax
add    $0x1,%rax
nopw   0x0(%rax,%rax,1)
addl   $0x1,-0x4(%rdi,%rax,4)
add    $0xffffffffffffffff,%rax
cmp    $0x1,%rax
ja     11e0 <ex6+0xe0>
ret
xor    %esi,%esi
test   $0x1,%r9b
jne    11a1 <ex6+0xa1>
jmp    11cb <ex6+0xcb>

LLVM IR (-O0):
define void @ex6(i32* %0, i32* %1, i32 %2) {
%4 = alloca i32*
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
store i32* %0, i32** %4
store i32* %1, i32** %5
store i32 %2, i32* %6
%8 = load i32, i32* %6
store i32 %8, i32* %7
br label %9
9: ; preds = %19, %3
%10 = load i32, i32* %7
%11 = icmp sgt i32 %10, 0
br i1 %11, label %12, label %22
12: ; preds = %9
%13 = load i32*, i32** %4
%14 = load i32, i32* %7
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i32, i32* %13, i64 %15
%17 = load i32, i32* %16
%18 = add nsw i32 %17, 1
store i32 %18, i32* %16
br label %19
19: ; preds = %12
%20 = load i32, i32* %7
%21 = add nsw i32 %20, -1
store i32 %21, i32* %7
br label %9
22: ; preds = %9
ret void
}

LLVM IR (-O2):
define void @ex6(i32* nocapture %0, i32* nocapture readnone %1, i32 %2) {
%4 = icmp sgt i32 %2, 0
br i1 %4, label %5, label %72
5: ; preds = %3
%6 = zext i32 %2 to i64
%7 = icmp ult i32 %2, 8
br i1 %7, label %70, label %8
8: ; preds = %5
%9 = and i64 %6, 4294967288
%10 = and i64 %6, 7
%11 = add nsw i64 %9, -8
%12 = lshr exact i64 %11, 3
%13 = add nuw nsw i64 %12, 1
%14 = and i64 %13, 1
%15 = icmp eq i64 %11, 0
br i1 %15, label %51, label %16
16: ; preds = %8
%17 = and i64 %13, 4611686018427387902
br label %18
18: ; preds = %18, %16
%19 = phi i64 [ 0, %16 ], [ %48, %18 ]
%20 = phi i64 [ 0, %16 ], [ %49, %18 ]
%21 = sub i64 %6, %19
%22 = getelementptr inbounds i32, i32* %0, i64 %21
%23 = getelementptr inbounds i32, i32* %22, i64 -3
%24 = bitcast i32* %23 to <4 x i32>*
%25 = load <4 x i32>, <4 x i32>* %24
%26 = getelementptr inbounds i32, i32* %22, i64 -4
%27 = getelementptr inbounds i32, i32* %26, i64 -3
%28 = bitcast i32* %27 to <4 x i32>*
%29 = load <4 x i32>, <4 x i32>* %28
%30 = add nsw <4 x i32> %25, <i32 1, i32 1, i32 1, i32 1>
%31 = add nsw <4 x i32> %29, <i32 1, i32 1, i32 1, i32 1>
%32 = bitcast i32* %23 to <4 x i32>*
store <4 x i32> %30, <4 x i32>* %32
%33 = bitcast i32* %27 to <4 x i32>*
store <4 x i32> %31, <4 x i32>* %33
%34 = or i64 %19, 8
%35 = sub i64 %6, %34
%36 = getelementptr inbounds i32, i32* %0, i64 %35
%37 = getelementptr inbounds i32, i32* %36, i64 -3
%38 = bitcast i32* %37 to <4 x i32>*
%39 = load <4 x i32>, <4 x i32>* %38
%40 = getelementptr inbounds i32, i32* %36, i64 -4
%41 = getelementptr inbounds i32, i32* %40, i64 -3
%42 = bitcast i32* %41 to <4 x i32>*
%43 = load <4 x i32>, <4 x i32>* %42
%44 = add nsw <4 x i32> %39, <i32 1, i32 1, i32 1, i32 1>
%45 = add nsw <4 x i32> %43, <i32 1, i32 1, i32 1, i32 1>
%46 = bitcast i32* %37 to <4 x i32>*
store <4 x i32> %44, <4 x i32>* %46
%47 = bitcast i32* %41 to <4 x i32>*
store <4 x i32> %45, <4 x i32>* %47
%48 = add nuw i64 %19, 16
%49 = add i64 %20, 2
%50 = icmp eq i64 %49, %17
br i1 %50, label %51, label %18
51: ; preds = %18, %8
%52 = phi i64 [ 0, %8 ], [ %48, %18 ]
%53 = icmp eq i64 %14, 0
br i1 %53, label %68, label %54
54: ; preds = %51
%55 = sub i64 %6, %52
%56 = getelementptr inbounds i32, i32* %0, i64 %55
%57 = getelementptr inbounds i32, i32* %56, i64 -3
%58 = bitcast i32* %57 to <4 x i32>*
%59 = load <4 x i32>, <4 x i32>* %58
%60 = getelementptr inbounds i32, i32* %56, i64 -4
%61 = getelementptr inbounds i32, i32* %60, i64 -3
%62 = bitcast i32* %61 to <4 x i32>*
%63 = load <4 x i32>, <4 x i32>* %62
%64 = add nsw <4 x i32> %59, <i32 1, i32 1, i32 1, i32 1>
%65 = add nsw <4 x i32> %63, <i32 1, i32 1, i32 1, i32 1>
%66 = bitcast i32* %57 to <4 x i32>*
store <4 x i32> %64, <4 x i32>* %66
%67 = bitcast i32* %61 to <4 x i32>*
store <4 x i32> %65, <4 x i32>* %67
br label %68
68: ; preds = %51, %54
%69 = icmp eq i64 %9, %6
br i1 %69, label %72, label %70
70: ; preds = %5, %68
%71 = phi i64 [ %6, %5 ], [ %10, %68 ]
br label %73
72: ; preds = %73, %68, %3
ret void
73: ; preds = %70, %73
%74 = phi i64 [ %78, %73 ], [ %71, %70 ]
%75 = getelementptr inbounds i32, i32* %0, i64 %74
%76 = load i32, i32* %75
%77 = add nsw i32 %76, 1
store i32 %77, i32* %75
%78 = add nsw i64 %74, -1
%79 = icmp ugt i64 %74, 1
br i1 %79, label %73, label %72
}