void replace_plus(char *src, char *last) {
  for (; src != last; src++) {
    if (*src == '+') {
      *src = ' ';
    }
  }
}


x86 assembly (clang, -O0):
<replace_plus>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     1147 <replace_plus+0x47>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1131 <replace_plus+0x31>
mov    -0x8(%rbp),%rax
movb   $0x20,(%rax)
jmp    1136 <replace_plus+0x36>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    110c <replace_plus+0xc>
pop    %rbp
ret

x86 assembly (clang, -O2):
<replace_plus>:
cmp    %rsi,%rdi
je     12cb <replace_plus+0x1cb>
mov    %rsi,%r8
sub    %rdi,%r8
cmp    $0x10,%r8
jae    111d <replace_plus+0x1d>
mov    %rdi,%rax
jmp    12d9 <replace_plus+0x1d9>
mov    %r8,%r9
and    $0xfffffffffffffff0,%r9
lea    (%rdi,%r9,1),%rax
xor    %ecx,%ecx
movdqa 0xece(%rip),%xmm0
movdqa 0xed6(%rip),%xmm1
jmp    114d <replace_plus+0x4d>
nopl   0x0(%rax)
add    $0x10,%rcx
cmp    %rcx,%r9
je     12c6 <replace_plus+0x1c6>
movq   (%rdi,%rcx,1),%xmm3
movdqa %xmm3,%xmm2
pcmpeqb %xmm0,%xmm2
movd   %xmm2,%edx
test   $0x1,%dl
je     1167 <replace_plus+0x67>
movb   $0x20,(%rdi,%rcx,1)
movdqa %xmm2,%xmm4
pslld  $0x8,%xmm4
movd   %xmm4,%edx
shr    $0x10,%edx
test   $0x1,%dl
je     1181 <replace_plus+0x81>
movb   $0x20,0x1(%rdi,%rcx,1)
pshuflw $0x55,%xmm3,%xmm4
pcmpeqb %xmm0,%xmm4
pextrw $0x2,%xmm4,%edx
test   $0x1,%dl
je     1199 <replace_plus+0x99>
movb   $0x20,0x2(%rdi,%rcx,1)
movdqa %xmm2,%xmm4
psllq  $0x18,%xmm4
pextrw $0x3,%xmm4,%edx
test   $0x1,%dl
je     11b1 <replace_plus+0xb1>
movb   $0x20,0x3(%rdi,%rcx,1)
pshufd $0x55,%xmm3,%xmm3
pcmpeqb %xmm1,%xmm3
pextrw $0x4,%xmm3,%edx
test   $0x1,%dl
je     11c9 <replace_plus+0xc9>
movb   $0x20,0x4(%rdi,%rcx,1)
movdqa %xmm2,%xmm3
pslldq $0x5,%xmm3
pextrw $0x5,%xmm3,%edx
test   $0x1,%dl
je     11e1 <replace_plus+0xe1>
movb   $0x20,0x5(%rdi,%rcx,1)
pextrw $0x3,%xmm2,%edx
test   $0x1,%dl
je     11f0 <replace_plus+0xf0>
movb   $0x20,0x6(%rdi,%rcx,1)
pslldq $0x7,%xmm2
pextrw $0x7,%xmm2,%edx
test   $0x1,%dl
je     1204 <replace_plus+0x104>
movb   $0x20,0x7(%rdi,%rcx,1)
movq   0x8(%rdi,%rcx,1),%xmm3
movdqa %xmm3,%xmm2
pcmpeqb %xmm0,%xmm2
movd   %xmm2,%edx
test   $0x1,%dl
je     1220 <replace_plus+0x120>
movb   $0x20,0x8(%rdi,%rcx,1)
movdqa %xmm2,%xmm4
pslld  $0x8,%xmm4
movd   %xmm4,%edx
shr    $0x10,%edx
test   $0x1,%dl
je     123a <replace_plus+0x13a>
movb   $0x20,0x9(%rdi,%rcx,1)
pshuflw $0x55,%xmm3,%xmm4
pcmpeqb %xmm0,%xmm4
pextrw $0x2,%xmm4,%edx
test   $0x1,%dl
je     1252 <replace_plus+0x152>
movb   $0x20,0xa(%rdi,%rcx,1)
movdqa %xmm2,%xmm4
psllq  $0x18,%xmm4
pextrw $0x3,%xmm4,%edx
test   $0x1,%dl
je     126a <replace_plus+0x16a>
movb   $0x20,0xb(%rdi,%rcx,1)
pshufd $0x55,%xmm3,%xmm3
pcmpeqb %xmm1,%xmm3
pextrw $0x4,%xmm3,%edx
test   $0x1,%dl
je     1282 <replace_plus+0x182>
movb   $0x20,0xc(%rdi,%rcx,1)
movdqa %xmm2,%xmm3
pslldq $0x5,%xmm3
pextrw $0x5,%xmm3,%edx
test   $0x1,%dl
je     129a <replace_plus+0x19a>
movb   $0x20,0xd(%rdi,%rcx,1)
pextrw $0x3,%xmm2,%edx
test   $0x1,%dl
je     12a9 <replace_plus+0x1a9>
movb   $0x20,0xe(%rdi,%rcx,1)
pslldq $0x7,%xmm2
pextrw $0x7,%xmm2,%edx
test   $0x1,%dl
je     1140 <replace_plus+0x40>
movb   $0x20,0xf(%rdi,%rcx,1)
jmp    1140 <replace_plus+0x40>
cmp    %r9,%r8
jne    12d9 <replace_plus+0x1d9>
ret
nopl   0x0(%rax)
add    $0x1,%rax
cmp    %rsi,%rax
je     12cb <replace_plus+0x1cb>
cmpb   $0x2b,(%rax)
jne    12d0 <replace_plus+0x1d0>
movb   $0x20,(%rax)
jmp    12d0 <replace_plus+0x1d0>

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

LLVM IR (-O2):
define void @replace_plus(i8* %0, i8* readnone %1) {
%3 = icmp eq i8* %0, %1
br i1 %3, label %114, label %4
4: ; preds = %2
%5 = ptrtoint i8* %1 to i64
%6 = ptrtoint i8* %0 to i64
%7 = sub i64 %5, %6
%8 = icmp ult i64 %7, 16
br i1 %8, label %104, label %9
9: ; preds = %4
%10 = and i64 %7, -16
%11 = getelementptr i8, i8* %0, i64 %10
br label %12
12: ; preds = %99, %9
%13 = phi i64 [ 0, %9 ], [ %100, %99 ]
%14 = getelementptr i8, i8* %0, i64 %13
%15 = bitcast i8* %14 to <8 x i8>*
%16 = load <8 x i8>, <8 x i8>* %15
%17 = getelementptr i8, i8* %14, i64 8
%18 = bitcast i8* %17 to <8 x i8>*
%19 = load <8 x i8>, <8 x i8>* %18
%20 = icmp eq <8 x i8> %16, <i8 43, i8 43, i8 43, i8 43, i8 43, i8 43, i8 43, i8 43>
%21 = icmp eq <8 x i8> %19, <i8 43, i8 43, i8 43, i8 43, i8 43, i8 43, i8 43, i8 43>
%22 = extractelement <8 x i1> %20, i64 0
br i1 %22, label %23, label %24
23: ; preds = %12
store i8 32, i8* %14
br label %24
24: ; preds = %23, %12
%25 = extractelement <8 x i1> %20, i64 1
br i1 %25, label %26, label %29
26: ; preds = %24
%27 = or i64 %13, 1
%28 = getelementptr i8, i8* %0, i64 %27
store i8 32, i8* %28
br label %29
29: ; preds = %26, %24
%30 = extractelement <8 x i1> %20, i64 2
br i1 %30, label %31, label %34
31: ; preds = %29
%32 = or i64 %13, 2
%33 = getelementptr i8, i8* %0, i64 %32
store i8 32, i8* %33
br label %34
34: ; preds = %31, %29
%35 = extractelement <8 x i1> %20, i64 3
br i1 %35, label %36, label %39
36: ; preds = %34
%37 = or i64 %13, 3
%38 = getelementptr i8, i8* %0, i64 %37
store i8 32, i8* %38
br label %39
39: ; preds = %36, %34
%40 = extractelement <8 x i1> %20, i64 4
br i1 %40, label %41, label %44
41: ; preds = %39
%42 = or i64 %13, 4
%43 = getelementptr i8, i8* %0, i64 %42
store i8 32, i8* %43
br label %44
44: ; preds = %41, %39
%45 = extractelement <8 x i1> %20, i64 5
br i1 %45, label %46, label %49
46: ; preds = %44
%47 = or i64 %13, 5
%48 = getelementptr i8, i8* %0, i64 %47
store i8 32, i8* %48
br label %49
49: ; preds = %46, %44
%50 = extractelement <8 x i1> %20, i64 6
br i1 %50, label %51, label %54
51: ; preds = %49
%52 = or i64 %13, 6
%53 = getelementptr i8, i8* %0, i64 %52
store i8 32, i8* %53
br label %54
54: ; preds = %51, %49
%55 = extractelement <8 x i1> %20, i64 7
br i1 %55, label %56, label %59
56: ; preds = %54
%57 = or i64 %13, 7
%58 = getelementptr i8, i8* %0, i64 %57
store i8 32, i8* %58
br label %59
59: ; preds = %56, %54
%60 = extractelement <8 x i1> %21, i64 0
br i1 %60, label %61, label %64
61: ; preds = %59
%62 = or i64 %13, 8
%63 = getelementptr i8, i8* %0, i64 %62
store i8 32, i8* %63
br label %64
64: ; preds = %61, %59
%65 = extractelement <8 x i1> %21, i64 1
br i1 %65, label %66, label %69
66: ; preds = %64
%67 = or i64 %13, 9
%68 = getelementptr i8, i8* %0, i64 %67
store i8 32, i8* %68
br label %69
69: ; preds = %66, %64
%70 = extractelement <8 x i1> %21, i64 2
br i1 %70, label %71, label %74
71: ; preds = %69
%72 = or i64 %13, 10
%73 = getelementptr i8, i8* %0, i64 %72
store i8 32, i8* %73
br label %74
74: ; preds = %71, %69
%75 = extractelement <8 x i1> %21, i64 3
br i1 %75, label %76, label %79
76: ; preds = %74
%77 = or i64 %13, 11
%78 = getelementptr i8, i8* %0, i64 %77
store i8 32, i8* %78
br label %79
79: ; preds = %76, %74
%80 = extractelement <8 x i1> %21, i64 4
br i1 %80, label %81, label %84
81: ; preds = %79
%82 = or i64 %13, 12
%83 = getelementptr i8, i8* %0, i64 %82
store i8 32, i8* %83
br label %84
84: ; preds = %81, %79
%85 = extractelement <8 x i1> %21, i64 5
br i1 %85, label %86, label %89
86: ; preds = %84
%87 = or i64 %13, 13
%88 = getelementptr i8, i8* %0, i64 %87
store i8 32, i8* %88
br label %89
89: ; preds = %86, %84
%90 = extractelement <8 x i1> %21, i64 6
br i1 %90, label %91, label %94
91: ; preds = %89
%92 = or i64 %13, 14
%93 = getelementptr i8, i8* %0, i64 %92
store i8 32, i8* %93
br label %94
94: ; preds = %91, %89
%95 = extractelement <8 x i1> %21, i64 7
br i1 %95, label %96, label %99
96: ; preds = %94
%97 = or i64 %13, 15
%98 = getelementptr i8, i8* %0, i64 %97
store i8 32, i8* %98
br label %99
99: ; preds = %96, %94
%100 = add nuw i64 %13, 16
%101 = icmp eq i64 %100, %10
br i1 %101, label %102, label %12
102: ; preds = %99
%103 = icmp eq i64 %7, %10
br i1 %103, label %114, label %104
104: ; preds = %4, %102
%105 = phi i8* [ %0, %4 ], [ %11, %102 ]
br label %106
106: ; preds = %104, %111
%107 = phi i8* [ %112, %111 ], [ %105, %104 ]
%108 = load i8, i8* %107
%109 = icmp eq i8 %108, 43
br i1 %109, label %110, label %111
110: ; preds = %106
store i8 32, i8* %107
br label %111
111: ; preds = %106, %110
%112 = getelementptr inbounds i8, i8* %107, i64 1
%113 = icmp eq i8* %112, %1
br i1 %113, label %114, label %106
114: ; preds = %111, %102, %2
ret void
}