void fillStr(char *ar, int sz) {
  *(ar + sz) = '\0';
  --sz;
  while (sz > 0) {
    *(ar + sz) = ('A' + sz);
    --sz;
  }
}


x86 assembly (clang, -O0):
<fillStr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
jle    114b <fillStr+0x4b>
mov    -0xc(%rbp),%eax
add    $0x41,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
jmp    1120 <fillStr+0x20>
pop    %rbp
ret

x86 assembly (clang, -O2):
<fillStr>:
movslq %esi,%rax
movb   $0x0,(%rdi,%rax,1)
cmp    $0x2,%eax
jl     1153 <fillStr+0x53>
mov    %esi,%eax
xor    %r8d,%r8d
mov    %rax,%rcx
sub    $0x2,%rcx
mov    $0x0,%r10d
cmovae %rcx,%r10
add    $0x1,%r10
cmp    $0x10,%r10
jae    1154 <fillStr+0x54>
mov    %rax,%rcx
add    $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    -0x2(%rcx),%eax
lea    0x3f(%rcx),%edx
mov    %dl,(%rdi,%rax,1)
add    $0xffffffffffffffff,%rcx
cmp    $0x2,%rcx
ja     1140 <fillStr+0x40>
ret
mov    %rax,%rcx
sub    $0x2,%rcx
mov    $0x0,%r9d
cmovae %rcx,%r9
mov    %eax,%ecx
sub    $0x2,%ecx
cmovb  %r8d,%ecx
lea    -0x1(%rsi),%edx
cmp    %ecx,%edx
jb     112c <fillStr+0x2c>
shr    $0x20,%r9
jne    112c <fillStr+0x2c>
mov    %r10,%r8
and    $0xfffffffffffffff0,%r8
mov    %rax,%rcx
sub    %r8,%rcx
movd   %esi,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
paddb  0xe5e(%rip),%xmm0
add    $0xffffffffffffffff,%rax
movdqa 0xe62(%rip),%xmm1
pxor   %xmm2,%xmm2
movdqa 0xe66(%rip),%xmm3
mov    %r8,%rsi
nopl   (%rax)
movdqa %xmm0,%xmm4
paddb  %xmm1,%xmm4
mov    %eax,%edx
movdqa %xmm4,%xmm5
punpcklbw %xmm2,%xmm5
pshufd $0x4e,%xmm5,%xmm5
pshuflw $0x1b,%xmm5,%xmm5
pshufhw $0x1b,%xmm5,%xmm5
punpckhbw %xmm2,%xmm4
pshufd $0x4e,%xmm4,%xmm4
pshuflw $0x1b,%xmm4,%xmm4
pshufhw $0x1b,%xmm4,%xmm4
packuswb %xmm5,%xmm4
movdqu %xmm4,-0xf(%rdi,%rdx,1)
paddb  %xmm3,%xmm0
add    $0xfffffffffffffff0,%rax
add    $0xfffffffffffffff0,%rsi
jne    11c0 <fillStr+0xc0>
cmp    %r8,%r10
jne    112f <fillStr+0x2f>
jmp    1153 <fillStr+0x53>

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

LLVM IR (-O2):
define void @fillStr(i8* nocapture writeonly %0, i32 %1) {
%3 = sext i32 %1 to i64
%4 = getelementptr inbounds i8, i8* %0, i64 %3
store i8 0, i8* %4
%5 = icmp sgt i32 %1, 1
br i1 %5, label %6, label %53
6: ; preds = %2
%7 = zext i32 %1 to i64
%8 = add nuw nsw i64 %7, 1
%9 = call i64 @llvm.umin.i64(i64 %7, i64 2)
%10 = sub nsw i64 %8, %9
%11 = icmp ult i64 %10, 16
br i1 %11, label %43, label %12
12: ; preds = %6
%13 = call i64 @llvm.umin.i64(i64 %7, i64 2)
%14 = sub nsw i64 %7, %13
%15 = add i32 %1, -1
%16 = trunc i64 %14 to i32
%17 = icmp ult i32 %15, %16
%18 = icmp ugt i64 %14, 4294967295
%19 = or i1 %17, %18
br i1 %19, label %43, label %20
20: ; preds = %12
%21 = and i64 %10, -16
%22 = sub nsw i64 %7, %21
%23 = trunc i32 %1 to i8
%24 = insertelement <16 x i8> poison, i8 %23, i64 0
%25 = shufflevector <16 x i8> %24, <16 x i8> poison, <16 x i32> zeroinitializer
%26 = add <16 x i8> %25, <i8 0, i8 -1, i8 -2, i8 -3, i8 -4, i8 -5, i8 -6, i8 -7, i8 -8, i8 -9, i8 -10, i8 -11, i8 -12, i8 -13, i8 -14, i8 -15>
%27 = getelementptr inbounds i8, i8* %0, i64 -15
br label %28
28: ; preds = %28, %20
%29 = phi i64 [ 0, %20 ], [ %38, %28 ]
%30 = phi <16 x i8> [ %26, %20 ], [ %39, %28 ]
%31 = xor i64 %29, -1
%32 = add i64 %31, %7
%33 = add <16 x i8> %30, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
%34 = and i64 %32, 4294967295
%35 = shufflevector <16 x i8> %33, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%36 = getelementptr inbounds i8, i8* %27, i64 %34
%37 = bitcast i8* %36 to <16 x i8>*
store <16 x i8> %35, <16 x i8>* %37
%38 = add nuw i64 %29, 16
%39 = add <16 x i8> %30, <i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16, i8 -16>
%40 = icmp eq i64 %38, %21
br i1 %40, label %41, label %28
41: ; preds = %28
%42 = icmp eq i64 %10, %21
br i1 %42, label %53, label %43
43: ; preds = %12, %6, %41
%44 = phi i64 [ %7, %12 ], [ %7, %6 ], [ %22, %41 ]
br label %45
45: ; preds = %43, %45
%46 = phi i64 [ %47, %45 ], [ %44, %43 ]
%47 = add nsw i64 %46, -1
%48 = trunc i64 %46 to i8
%49 = add i8 %48, 64
%50 = and i64 %47, 4294967295
%51 = getelementptr inbounds i8, i8* %0, i64 %50
store i8 %49, i8* %51
%52 = icmp ugt i64 %46, 2
br i1 %52, label %45, label %53
53: ; preds = %45, %41, %2
ret void
}