char *get_str(char *s, char *d) {
  while ((*s == ' ') || (*s == '\t') || (*s == ','))
    s++;
  while (*s && (*s != ' ') && (*s != '\t') && (*s != ',') && (*s != '=') &&
         (*s != ')')) {
    *d++ = *s++;
  }
  while (*s && (*s != ',') && (*s != '=') && (*s != ')')) {
    if (*s == '+') {
      *d++ = *s++;
      while ((*s == ' ') || (*s == '\t') || (*s == ','))
        s++;
      while (*s && (*s != ' ') && (*s != '\t') && (*s != ',') && (*s != '=') &&
             (*s != ')')) {
        *d++ = *s++;
      }
    } else
      s++;
  }
  *d = 0;
  return s;
}


x86 assembly (clang, -O0):
<get_str>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x11(%rbp)
je     1146 <get_str+0x46>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x11(%rbp)
je     1146 <get_str+0x46>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
sete   %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
test   $0x1,%al
jne    1156 <get_str+0x56>
jmp    1167 <get_str+0x67>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    110c <get_str+0xc>
jmp    116c <get_str+0x6c>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x12(%rbp)
je     11e5 <get_str+0xe5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x12(%rbp)
je     11e5 <get_str+0xe5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x9,%ecx
mov    %al,-0x12(%rbp)
je     11e5 <get_str+0xe5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2c,%ecx
mov    %al,-0x12(%rbp)
je     11e5 <get_str+0xe5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x3d,%ecx
mov    %al,-0x12(%rbp)
je     11e5 <get_str+0xe5>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x29,%eax
setne  %al
mov    %al,-0x12(%rbp)
mov    -0x12(%rbp),%al
test   $0x1,%al
jne    11f5 <get_str+0xf5>
jmp    121c <get_str+0x11c>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    116c <get_str+0x6c>
jmp    1221 <get_str+0x121>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x13(%rbp)
je     1270 <get_str+0x170>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2c,%ecx
mov    %al,-0x13(%rbp)
je     1270 <get_str+0x170>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x3d,%ecx
mov    %al,-0x13(%rbp)
je     1270 <get_str+0x170>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x29,%eax
setne  %al
mov    %al,-0x13(%rbp)
mov    -0x13(%rbp),%al
test   $0x1,%al
jne    1280 <get_str+0x180>
jmp    13d8 <get_str+0x2d8>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    13c7 <get_str+0x2c7>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x14(%rbp)
je     12ec <get_str+0x1ec>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x14(%rbp)
je     12ec <get_str+0x1ec>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
sete   %al
mov    %al,-0x14(%rbp)
mov    -0x14(%rbp),%al
test   $0x1,%al
jne    12fc <get_str+0x1fc>
jmp    130d <get_str+0x20d>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    12b2 <get_str+0x1b2>
jmp    1312 <get_str+0x212>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x15(%rbp)
je     138b <get_str+0x28b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x15(%rbp)
je     138b <get_str+0x28b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x9,%ecx
mov    %al,-0x15(%rbp)
je     138b <get_str+0x28b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2c,%ecx
mov    %al,-0x15(%rbp)
je     138b <get_str+0x28b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x3d,%ecx
mov    %al,-0x15(%rbp)
je     138b <get_str+0x28b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x29,%eax
setne  %al
mov    %al,-0x15(%rbp)
mov    -0x15(%rbp),%al
test   $0x1,%al
jne    139b <get_str+0x29b>
jmp    13c2 <get_str+0x2c2>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1312 <get_str+0x212>
jmp    13d3 <get_str+0x2d3>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1221 <get_str+0x121>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_str>:
movabs $0x100100000200,%r10
nopw   0x0(%rax,%rax,1)
movzbl (%rdi),%edx
cmp    $0x2c,%rdx
ja     113e <get_str+0x3e>
bt     %rdx,%r10
jae    113e <get_str+0x3e>
add    $0x1,%rdi
jmp    1110 <get_str+0x10>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %dl,(%rsi)
add    $0x1,%rsi
movzbl 0x1(%rdi),%edx
add    $0x1,%rdi
cmp    $0x3d,%dl
ja     1130 <get_str+0x30>
movzbl %dl,%eax
movabs $0x2000120100000201,%r8
bt     %rax,%r8
jae    1130 <get_str+0x30>
lea    0xea3(%rip),%r9
mov    %rdi,%rax
add    $0x1,%rdi
jmp    1180 <get_str+0x80>
cs nopw 0x0(%rax,%rax,1)
test   %dl,%dl
je     11e1 <get_str+0xe1>
movzbl 0x1(%rax),%edx
add    $0x1,%rax
add    $0x1,%rdi
lea    -0x29(%rdx),%ecx
cmp    $0x14,%cl
ja     1170 <get_str+0x70>
movzbl %cl,%ecx
movslq (%r9,%rcx,4),%rcx
add    %r9,%rcx
jmp    *%rcx
movb   $0x2b,(%rsi)
nopw   0x0(%rax,%rax,1)
movzbl (%rdi),%edx
cmp    $0x2c,%rdx
ja     11ca <get_str+0xca>
bt     %rdx,%r10
jae    11ca <get_str+0xca>
add    $0x1,%rdi
jmp    11a0 <get_str+0xa0>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %dl,(%rsi)
movzbl 0x1(%rdi),%edx
add    $0x1,%rdi
add    $0x1,%rsi
cmp    $0x3d,%dl
ja     11c0 <get_str+0xc0>
movzbl %dl,%eax
bt     %rax,%r8
jae    11c0 <get_str+0xc0>
jmp    115d <get_str+0x5d>
movb   $0x0,(%rsi)
ret

LLVM IR (-O0):
define i8* @get_str(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 = %22, %2
%6 = load i8*, i8** %3
%7 = load i8, i8* %6
%8 = sext i8 %7 to i32
%9 = icmp eq i32 %8, 32
br i1 %9, label %20, label %10
10: ; preds = %5
%11 = load i8*, i8** %3
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
%14 = icmp eq i32 %13, 9
br i1 %14, label %20, label %15
15: ; preds = %10
%16 = load i8*, i8** %3
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
%19 = icmp eq i32 %18, 44
br label %20
20: ; preds = %15, %10, %5
%21 = phi i1 [ true, %10 ], [ true, %5 ], [ %19, %15 ]
br i1 %21, label %22, label %25
22: ; preds = %20
%23 = load i8*, i8** %3
%24 = getelementptr inbounds i8, i8* %23, i32 1
store i8* %24, i8** %3
br label %5
25: ; preds = %20
br label %26
26: ; preds = %58, %25
%27 = load i8*, i8** %3
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = icmp ne i32 %29, 0
br i1 %30, label %31, label %56
31: ; preds = %26
%32 = load i8*, i8** %3
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp ne i32 %34, 32
br i1 %35, label %36, label %56
36: ; preds = %31
%37 = load i8*, i8** %3
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp ne i32 %39, 9
br i1 %40, label %41, label %56
41: ; preds = %36
%42 = load i8*, i8** %3
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = icmp ne i32 %44, 44
br i1 %45, label %46, label %56
46: ; preds = %41
%47 = load i8*, i8** %3
%48 = load i8, i8* %47
%49 = sext i8 %48 to i32
%50 = icmp ne i32 %49, 61
br i1 %50, label %51, label %56
51: ; preds = %46
%52 = load i8*, i8** %3
%53 = load i8, i8* %52
%54 = sext i8 %53 to i32
%55 = icmp ne i32 %54, 41
br label %56
56: ; preds = %51, %46, %41, %36, %31, %26
%57 = phi i1 [ false, %46 ], [ false, %41 ], [ false, %36 ], [ false, %31 ], [ false, %26 ], [ %55, %51 ]
br i1 %57, label %58, label %64
58: ; preds = %56
%59 = load i8*, i8** %3
%60 = getelementptr inbounds i8, i8* %59, i32 1
store i8* %60, i8** %3
%61 = load i8, i8* %59
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %4
store i8 %61, i8* %62
br label %26
64: ; preds = %56
br label %65
65: ; preds = %161, %64
%66 = load i8*, i8** %3
%67 = load i8, i8* %66
%68 = sext i8 %67 to i32
%69 = icmp ne i32 %68, 0
br i1 %69, label %70, label %85
70: ; preds = %65
%71 = load i8*, i8** %3
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp ne i32 %73, 44
br i1 %74, label %75, label %85
75: ; preds = %70
%76 = load i8*, i8** %3
%77 = load i8, i8* %76
%78 = sext i8 %77 to i32
%79 = icmp ne i32 %78, 61
br i1 %79, label %80, label %85
80: ; preds = %75
%81 = load i8*, i8** %3
%82 = load i8, i8* %81
%83 = sext i8 %82 to i32
%84 = icmp ne i32 %83, 41
br label %85
85: ; preds = %80, %75, %70, %65
%86 = phi i1 [ false, %75 ], [ false, %70 ], [ false, %65 ], [ %84, %80 ]
br i1 %86, label %87, label %162
87: ; preds = %85
%88 = load i8*, i8** %3
%89 = load i8, i8* %88
%90 = sext i8 %89 to i32
%91 = icmp eq i32 %90, 43
br i1 %91, label %92, label %158
92: ; preds = %87
%93 = load i8*, i8** %3
%94 = getelementptr inbounds i8, i8* %93, i32 1
store i8* %94, i8** %3
%95 = load i8, i8* %93
%96 = load i8*, i8** %4
%97 = getelementptr inbounds i8, i8* %96, i32 1
store i8* %97, i8** %4
store i8 %95, i8* %96
br label %98
98: ; preds = %115, %92
%99 = load i8*, i8** %3
%100 = load i8, i8* %99
%101 = sext i8 %100 to i32
%102 = icmp eq i32 %101, 32
br i1 %102, label %113, label %103
103: ; preds = %98
%104 = load i8*, i8** %3
%105 = load i8, i8* %104
%106 = sext i8 %105 to i32
%107 = icmp eq i32 %106, 9
br i1 %107, label %113, label %108
108: ; preds = %103
%109 = load i8*, i8** %3
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp eq i32 %111, 44
br label %113
113: ; preds = %108, %103, %98
%114 = phi i1 [ true, %103 ], [ true, %98 ], [ %112, %108 ]
br i1 %114, label %115, label %118
115: ; preds = %113
%116 = load i8*, i8** %3
%117 = getelementptr inbounds i8, i8* %116, i32 1
store i8* %117, i8** %3
br label %98
118: ; preds = %113
br label %119
119: ; preds = %151, %118
%120 = load i8*, i8** %3
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = icmp ne i32 %122, 0
br i1 %123, label %124, label %149
124: ; preds = %119
%125 = load i8*, i8** %3
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp ne i32 %127, 32
br i1 %128, label %129, label %149
129: ; preds = %124
%130 = load i8*, i8** %3
%131 = load i8, i8* %130
%132 = sext i8 %131 to i32
%133 = icmp ne i32 %132, 9
br i1 %133, label %134, label %149
134: ; preds = %129
%135 = load i8*, i8** %3
%136 = load i8, i8* %135
%137 = sext i8 %136 to i32
%138 = icmp ne i32 %137, 44
br i1 %138, label %139, label %149
139: ; preds = %134
%140 = load i8*, i8** %3
%141 = load i8, i8* %140
%142 = sext i8 %141 to i32
%143 = icmp ne i32 %142, 61
br i1 %143, label %144, label %149
144: ; preds = %139
%145 = load i8*, i8** %3
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp ne i32 %147, 41
br label %149
149: ; preds = %144, %139, %134, %129, %124, %119
%150 = phi i1 [ false, %139 ], [ false, %134 ], [ false, %129 ], [ false, %124 ], [ false, %119 ], [ %148, %144 ]
br i1 %150, label %151, label %157
151: ; preds = %149
%152 = load i8*, i8** %3
%153 = getelementptr inbounds i8, i8* %152, i32 1
store i8* %153, i8** %3
%154 = load i8, i8* %152
%155 = load i8*, i8** %4
%156 = getelementptr inbounds i8, i8* %155, i32 1
store i8* %156, i8** %4
store i8 %154, i8* %155
br label %119
157: ; preds = %149
br label %161
158: ; preds = %87
%159 = load i8*, i8** %3
%160 = getelementptr inbounds i8, i8* %159, i32 1
store i8* %160, i8** %3
br label %161
161: ; preds = %158, %157
br label %65
162: ; preds = %85
%163 = load i8*, i8** %4
store i8 0, i8* %163
%164 = load i8*, i8** %3
ret i8* %164
}

LLVM IR (-O2):
define i8* @get_str(i8* %0, i8* nocapture writeonly %1) {
br label %3
3: ; preds = %6, %2
%4 = phi i8* [ %0, %2 ], [ %7, %6 ]
%5 = load i8, i8* %4
switch i8 %5, label %8 [
i8 32, label %6
i8 9, label %6
i8 44, label %6
]
6: ; preds = %3, %3, %3
%7 = getelementptr inbounds i8, i8* %4, i64 1
br label %3
8: ; preds = %3, %13
%9 = phi i8 [ %16, %13 ], [ %5, %3 ]
%10 = phi i8* [ %14, %13 ], [ %4, %3 ]
%11 = phi i8* [ %15, %13 ], [ %1, %3 ]
switch i8 %9, label %13 [
i8 0, label %12
i8 32, label %12
i8 9, label %12
i8 44, label %12
i8 61, label %12
i8 41, label %12
]
12: ; preds = %8, %8, %8, %8, %8, %8
br label %18
13: ; preds = %8
%14 = getelementptr inbounds i8, i8* %10, i64 1
%15 = getelementptr inbounds i8, i8* %11, i64 1
store i8 %9, i8* %11
%16 = load i8, i8* %14
br label %8
17: ; preds = %31, %31, %31, %31, %31, %31
br label %18
18: ; preds = %12, %17
%19 = phi i8 [ %9, %12 ], [ %32, %17 ]
%20 = phi i8* [ %10, %12 ], [ %33, %17 ]
%21 = phi i8* [ %11, %12 ], [ %35, %17 ]
br label %22
22: ; preds = %18, %39
%23 = phi i8 [ %41, %39 ], [ %19, %18 ]
%24 = phi i8* [ %40, %39 ], [ %20, %18 ]
switch i8 %23, label %39 [
i8 0, label %42
i8 44, label %42
i8 61, label %42
i8 41, label %42
i8 43, label %25
]
25: ; preds = %22
store i8 43, i8* %21
br label %26
26: ; preds = %30, %25
%27 = phi i8* [ %24, %25 ], [ %28, %30 ]
%28 = getelementptr inbounds i8, i8* %27, i64 1
%29 = load i8, i8* %28
switch i8 %29, label %31 [
i8 32, label %30
i8 9, label %30
i8 44, label %30
]
30: ; preds = %26, %26, %26
br label %26
31: ; preds = %26, %36
%32 = phi i8 [ %38, %36 ], [ %29, %26 ]
%33 = phi i8* [ %37, %36 ], [ %28, %26 ]
%34 = phi i8* [ %35, %36 ], [ %21, %26 ]
%35 = getelementptr inbounds i8, i8* %34, i64 1
switch i8 %32, label %36 [
i8 0, label %17
i8 32, label %17
i8 9, label %17
i8 44, label %17
i8 61, label %17
i8 41, label %17
]
36: ; preds = %31
%37 = getelementptr inbounds i8, i8* %33, i64 1
store i8 %32, i8* %35
%38 = load i8, i8* %37
br label %31
39: ; preds = %22
%40 = getelementptr inbounds i8, i8* %24, i64 1
%41 = load i8, i8* %40
br label %22
42: ; preds = %22, %22, %22, %22
store i8 0, i8* %21
ret i8* %24
}