#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ calloc(int, int);
int strlen(char *);
int /*<<< orphan*/ strncpy(char *, char *, int);
char *strip_with_chars(char *string, char *chars) {
  char *ret_val = NULL, *offset = NULL, *limit = NULL;
  int i, x, found = 0;
  int string_length = 0, chars_length = 0;
  if (string == NULL || chars == NULL) {
    goto error_exit;
  }
  string_length = strlen(string);
  chars_length = strlen(chars);
  if (string_length == 0 || chars_length == 0) {
    goto error_exit;
  }
  for (i = 0; i < string_length; i++) {
    for (x = 0; x < chars_length; x++) {
      if (string[i] == chars[x]) {
        found = 1;
      }
    }
    if (!found) {
      offset = string + i;
      break;
    }
    found = 0;
  }
  found = 0;
  for (i = string_length - 1; i >= 0; i--) {
    for (x = 0; x < chars_length; x++) {
      if (string[i] == chars[x]) {
        found = 1;
      }
    }
    if (!found) {
      limit = string + i;
      break;
    }
    found = 0;
  }
  ret_val = (char *)calloc(limit - offset + 2, sizeof(char));
  if (ret_val == NULL) {
    goto error_exit;
  }
  strncpy(ret_val, offset, limit - offset + 1);
  return ret_val;
error_exit:
  return ret_val;
}


x86 assembly (clang, -O0):
<strip_with_chars>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1183 <strip_with_chars+0x53>
cmpq   $0x0,-0x18(%rbp)
jne    1188 <strip_with_chars+0x58>
jmp    1340 <strip_with_chars+0x210>
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x40(%rbp)
mov    -0x18(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,-0x44(%rbp)
cmpl   $0x0,-0x40(%rbp)
je     11b4 <strip_with_chars+0x84>
cmpl   $0x0,-0x44(%rbp)
jne    11b9 <strip_with_chars+0x89>
jmp    1340 <strip_with_chars+0x210>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    124c <strip_with_chars+0x11c>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x44(%rbp),%eax
jge    1219 <strip_with_chars+0xe9>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%rcx
movslq -0x38(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    1206 <strip_with_chars+0xd6>
movl   $0x1,-0x3c(%rbp)
jmp    120b <strip_with_chars+0xdb>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11d3 <strip_with_chars+0xa3>
cmpl   $0x0,-0x3c(%rbp)
jne    1237 <strip_with_chars+0x107>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    124c <strip_with_chars+0x11c>
movl   $0x0,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11c0 <strip_with_chars+0x90>
movl   $0x0,-0x3c(%rbp)
mov    -0x40(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jl     12e6 <strip_with_chars+0x1b6>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x44(%rbp),%eax
jge    12b3 <strip_with_chars+0x183>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%rcx
movslq -0x38(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    12a0 <strip_with_chars+0x170>
movl   $0x1,-0x3c(%rbp)
jmp    12a5 <strip_with_chars+0x175>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    126d <strip_with_chars+0x13d>
cmpl   $0x0,-0x3c(%rbp)
jne    12d1 <strip_with_chars+0x1a1>
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    12e6 <strip_with_chars+0x1b6>
movl   $0x0,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
jmp    125c <strip_with_chars+0x12c>
mov    -0x30(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    %rcx,%rax
add    $0x2,%rax
mov    %eax,%edi
mov    $0x1,%esi
call   1050 <calloc@plt>
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    1315 <strip_with_chars+0x1e5>
jmp    1340 <strip_with_chars+0x210>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rsi
mov    -0x30(%rbp),%rax
mov    -0x28(%rbp),%rcx
sub    %rcx,%rax
add    $0x1,%rax
mov    %eax,%edx
call   1030 <strncpy@plt>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1348 <strip_with_chars+0x218>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<strip_with_chars>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
xor    %ebp,%ebp
test   %rdi,%rdi
je     15a4 <strip_with_chars+0x474>
mov    %rsi,%rbx
test   %rsi,%rsi
je     15a4 <strip_with_chars+0x474>
mov    %rdi,%r14
call   1040 <strlen@plt>
mov    %eax,%r12d
mov    %rbx,%rdi
call   1040 <strlen@plt>
xor    %ebp,%ebp
test   %r12d,%r12d
je     15a4 <strip_with_chars+0x474>
test   %eax,%eax
je     15a4 <strip_with_chars+0x474>
movabs $0x3ffffffffffffffe,%r13
ff ff 3f
mov    %eax,%edx
test   %r12d,%r12d
jle    1381 <strip_with_chars+0x251>
mov    %r12d,%r11d
mov    %edx,%r8d
and    $0xfffffff8,%r8d
lea    -0x8(%r8),%rsi
mov    %r13,%rcx
mov    %rsi,0x10(%rsp)
mov    %rsi,%r13
shr    $0x3,%r13
add    $0x1,%r13
mov    %r13,%rsi
and    %rcx,%rsi
mov    %rsi,0x8(%rsp)
mov    $0x1,%ebp
pxor   %xmm8,%xmm8
movdqa 0xe32(%rip),%xmm1
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %eax,%eax
jle    1379 <strip_with_chars+0x249>
mov    (%r14,%r10,1),%cl
cmp    $0x8,%eax
jae    1200 <strip_with_chars+0xd0>
xor    %esi,%esi
xor    %edi,%edi
jmp    1340 <strip_with_chars+0x210>
nopw   0x0(%rax,%rax,1)
movzbl %cl,%esi
movd   %esi,%xmm2
punpcklbw %xmm2,%xmm2
pshuflw $0x0,%xmm2,%xmm2
cmpq   $0x0,0x10(%rsp)
je     1362 <strip_with_chars+0x232>
pxor   %xmm6,%xmm6
mov    0x8(%rsp),%r9
xor    %r15d,%r15d
pxor   %xmm5,%xmm5
nopl   0x0(%rax)
movd   (%rbx,%r15,1),%xmm3
movd   0x4(%rbx,%r15,1),%xmm4
pcmpeqb %xmm2,%xmm3
pcmpeqb %xmm2,%xmm4
movd   0x8(%rbx,%r15,1),%xmm7
movd   0xc(%rbx,%r15,1),%xmm0
pcmpeqb %xmm2,%xmm7
por    %xmm3,%xmm7
punpcklbw %xmm7,%xmm3
punpcklwd %xmm3,%xmm3
pcmpeqb %xmm2,%xmm0
por    %xmm4,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm4
psrad  $0x18,%xmm3
movdqa %xmm3,%xmm0
pandn  %xmm6,%xmm0
pand   %xmm1,%xmm3
por    %xmm0,%xmm3
psrad  $0x18,%xmm4
movdqa %xmm4,%xmm0
pandn  %xmm5,%xmm0
pand   %xmm1,%xmm4
por    %xmm0,%xmm4
add    $0x10,%r15
movdqa %xmm3,%xmm6
movdqa %xmm4,%xmm5
add    $0xfffffffffffffffe,%r9
jne    1230 <strip_with_chars+0x100>
test   $0x1,%r13b
je     130c <strip_with_chars+0x1dc>
movd   (%rbx,%r15,1),%xmm0
movd   0x4(%rbx,%r15,1),%xmm5
pcmpeqb %xmm2,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x18,%xmm0
pcmpeqb %xmm2,%xmm5
punpcklbw %xmm5,%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x18,%xmm2
movdqa %xmm0,%xmm5
pandn  %xmm3,%xmm5
pand   %xmm1,%xmm0
por    %xmm5,%xmm0
movdqa %xmm2,%xmm3
pandn  %xmm4,%xmm3
pand   %xmm1,%xmm2
por    %xmm3,%xmm2
movdqa %xmm0,%xmm3
movdqa %xmm2,%xmm4
movdqa %xmm3,%xmm0
pcmpeqd %xmm8,%xmm0
pand   %xmm0,%xmm4
pandn  %xmm3,%xmm0
por    %xmm4,%xmm0
pcmpeqd %xmm8,%xmm0
movmskps %xmm0,%esi
xor    %edi,%edi
cmp    $0xf,%esi
setne  %dil
mov    %r8,%rsi
cmp    %rdx,%r8
je     134f <strip_with_chars+0x21f>
nopw   0x0(%rax,%rax,1)
cmp    (%rbx,%rsi,1),%cl
cmove  %ebp,%edi
add    $0x1,%rsi
cmp    %rsi,%rdx
jne    1340 <strip_with_chars+0x210>
test   %edi,%edi
je     1379 <strip_with_chars+0x249>
add    $0x1,%r10
cmp    %r11,%r10
jne    11e0 <strip_with_chars+0xb0>
jmp    1386 <strip_with_chars+0x256>
pxor   %xmm3,%xmm3
xor    %r15d,%r15d
pxor   %xmm4,%xmm4
test   $0x1,%r13b
jne    12b5 <strip_with_chars+0x185>
jmp    130c <strip_with_chars+0x1dc>
mov    %r10d,%r15d
add    %r14,%r15
jmp    1389 <strip_with_chars+0x259>
xor    %r15d,%r15d
jmp    1393 <strip_with_chars+0x263>
xor    %r15d,%r15d
movabs $0x3ffffffffffffffe,%r13
ff ff 3f
movslq %r12d,%r8
mov    %edx,%r11d
and    $0xfffffff8,%r11d
lea    -0x8(%r11),%r9
mov    %r9,%r10
shr    $0x3,%r10
add    $0x1,%r10
and    %r10,%r13
mov    $0x1,%ebp
pxor   %xmm8,%xmm8
movdqa 0xc3f(%rip),%xmm1
jmp    13d8 <strip_with_chars+0x2a8>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
test   %esi,%esi
je     156a <strip_with_chars+0x43a>
test   %r8,%r8
jle    1572 <strip_with_chars+0x442>
add    $0xffffffffffffffff,%r8
test   %eax,%eax
jle    156a <strip_with_chars+0x43a>
mov    (%r14,%r8,1),%cl
cmp    $0x8,%eax
jae    1400 <strip_with_chars+0x2d0>
xor    %edi,%edi
xor    %esi,%esi
jmp    1540 <strip_with_chars+0x410>
nop
movzbl %cl,%esi
movd   %esi,%xmm2
punpcklbw %xmm2,%xmm2
pshuflw $0x0,%xmm2,%xmm2
test   %r9,%r9
je     1554 <strip_with_chars+0x424>
pxor   %xmm6,%xmm6
mov    %r13,%rsi
xor    %edi,%edi
pxor   %xmm5,%xmm5
cs nopw 0x0(%rax,%rax,1)
movd   (%rbx,%rdi,1),%xmm3
movd   0x4(%rbx,%rdi,1),%xmm4
pcmpeqb %xmm2,%xmm3
pcmpeqb %xmm2,%xmm4
movd   0x8(%rbx,%rdi,1),%xmm7
movd   0xc(%rbx,%rdi,1),%xmm0
pcmpeqb %xmm2,%xmm7
por    %xmm3,%xmm7
punpcklbw %xmm7,%xmm3
punpcklwd %xmm3,%xmm3
pcmpeqb %xmm2,%xmm0
por    %xmm4,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm4
psrad  $0x18,%xmm3
movdqa %xmm3,%xmm0
pandn  %xmm6,%xmm0
pand   %xmm1,%xmm3
por    %xmm0,%xmm3
psrad  $0x18,%xmm4
movdqa %xmm4,%xmm0
pandn  %xmm5,%xmm0
pand   %xmm1,%xmm4
por    %xmm0,%xmm4
add    $0x10,%rdi
movdqa %xmm3,%xmm6
movdqa %xmm4,%xmm5
add    $0xfffffffffffffffe,%rsi
jne    1430 <strip_with_chars+0x300>
test   $0x1,%r10b
je     1506 <strip_with_chars+0x3d6>
movd   (%rbx,%rdi,1),%xmm0
movd   0x4(%rbx,%rdi,1),%xmm5
pcmpeqb %xmm2,%xmm0
punpcklbw %xmm0,%xmm0
punpcklwd %xmm0,%xmm0
psrad  $0x18,%xmm0
pcmpeqb %xmm2,%xmm5
punpcklbw %xmm5,%xmm2
punpcklwd %xmm2,%xmm2
psrad  $0x18,%xmm2
movdqa %xmm0,%xmm5
pandn  %xmm3,%xmm5
pand   %xmm1,%xmm0
por    %xmm5,%xmm0
movdqa %xmm2,%xmm3
pandn  %xmm4,%xmm3
pand   %xmm1,%xmm2
por    %xmm3,%xmm2
movdqa %xmm0,%xmm3
movdqa %xmm2,%xmm4
movdqa %xmm3,%xmm0
pcmpeqd %xmm8,%xmm0
pand   %xmm0,%xmm4
pandn  %xmm3,%xmm0
por    %xmm4,%xmm0
pcmpeqd %xmm8,%xmm0
movmskps %xmm0,%edi
xor    %esi,%esi
cmp    $0xf,%edi
setne  %sil
mov    %r11,%rdi
cmp    %rdx,%r11
je     13d0 <strip_with_chars+0x2a0>
nopl   0x0(%rax,%rax,1)
cmp    (%rbx,%rdi,1),%cl
cmove  %ebp,%esi
add    $0x1,%rdi
cmp    %rdi,%rdx
jne    1540 <strip_with_chars+0x410>
jmp    13d0 <strip_with_chars+0x2a0>
pxor   %xmm3,%xmm3
xor    %edi,%edi
pxor   %xmm4,%xmm4
test   $0x1,%r10b
jne    14b1 <strip_with_chars+0x381>
jmp    1506 <strip_with_chars+0x3d6>
movslq %r8d,%rax
add    %rax,%r14
jmp    1575 <strip_with_chars+0x445>
xor    %r14d,%r14d
sub    %r15d,%r14d
lea    0x2(%r14),%edi
mov    $0x1,%esi
call   1050 <calloc@plt>
test   %rax,%rax
je     15a2 <strip_with_chars+0x472>
mov    %rax,%rbp
add    $0x1,%r14d
mov    %rax,%rdi
mov    %r15,%rsi
mov    %r14d,%edx
call   1030 <strncpy@plt>
jmp    15a4 <strip_with_chars+0x474>
xor    %ebp,%ebp
mov    %rbp,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i8* @strip_with_chars(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
store i8* null, i8** %6
store i8* null, i8** %7
store i8* null, i8** %8
store i32 0, i32* %11
store i32 0, i32* %12
store i32 0, i32* %13
%14 = load i8*, i8** %4
%15 = icmp eq i8* %14, null
br i1 %15, label %19, label %16
16: ; preds = %2
%17 = load i8*, i8** %5
%18 = icmp eq i8* %17, null
br i1 %18, label %19, label %20
19: ; preds = %16, %2
br label %139
20: ; preds = %16
%21 = load i8*, i8** %4
%22 = call i32 @strlen(i8* %21)
store i32 %22, i32* %12
%23 = load i8*, i8** %5
%24 = call i32 @strlen(i8* %23)
store i32 %24, i32* %13
%25 = load i32, i32* %12
%26 = icmp eq i32 %25, 0
br i1 %26, label %30, label %27
27: ; preds = %20
%28 = load i32, i32* %13
%29 = icmp eq i32 %28, 0
br i1 %29, label %30, label %31
30: ; preds = %27, %20
br label %139
31: ; preds = %27
store i32 0, i32* %9
br label %32
32: ; preds = %69, %31
%33 = load i32, i32* %9
%34 = load i32, i32* %12
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %72
36: ; preds = %32
store i32 0, i32* %10
br label %37
37: ; preds = %57, %36
%38 = load i32, i32* %10
%39 = load i32, i32* %13
%40 = icmp slt i32 %38, %39
br i1 %40, label %41, label %60
41: ; preds = %37
%42 = load i8*, i8** %4
%43 = load i32, i32* %9
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = load i8*, i8** %5
%49 = load i32, i32* %10
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %48, i64 %50
%52 = load i8, i8* %51
%53 = sext i8 %52 to i32
%54 = icmp eq i32 %47, %53
br i1 %54, label %55, label %56
55: ; preds = %41
store i32 1, i32* %11
br label %56
56: ; preds = %55, %41
br label %57
57: ; preds = %56
%58 = load i32, i32* %10
%59 = add nsw i32 %58, 1
store i32 %59, i32* %10
br label %37
60: ; preds = %37
%61 = load i32, i32* %11
%62 = icmp ne i32 %61, 0
br i1 %62, label %68, label %63
63: ; preds = %60
%64 = load i8*, i8** %4
%65 = load i32, i32* %9
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds i8, i8* %64, i64 %66
store i8* %67, i8** %7
br label %72
68: ; preds = %60
store i32 0, i32* %11
br label %69
69: ; preds = %68
%70 = load i32, i32* %9
%71 = add nsw i32 %70, 1
store i32 %71, i32* %9
br label %32
72: ; preds = %63, %32
store i32 0, i32* %11
%73 = load i32, i32* %12
%74 = sub nsw i32 %73, 1
store i32 %74, i32* %9
br label %75
75: ; preds = %111, %72
%76 = load i32, i32* %9
%77 = icmp sge i32 %76, 0
br i1 %77, label %78, label %114
78: ; preds = %75
store i32 0, i32* %10
br label %79
79: ; preds = %99, %78
%80 = load i32, i32* %10
%81 = load i32, i32* %13
%82 = icmp slt i32 %80, %81
br i1 %82, label %83, label %102
83: ; preds = %79
%84 = load i8*, i8** %4
%85 = load i32, i32* %9
%86 = sext i32 %85 to i64
%87 = getelementptr inbounds i8, i8* %84, i64 %86
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = load i8*, i8** %5
%91 = load i32, i32* %10
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i8, i8* %90, i64 %92
%94 = load i8, i8* %93
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %89, %95
br i1 %96, label %97, label %98
97: ; preds = %83
store i32 1, i32* %11
br label %98
98: ; preds = %97, %83
br label %99
99: ; preds = %98
%100 = load i32, i32* %10
%101 = add nsw i32 %100, 1
store i32 %101, i32* %10
br label %79
102: ; preds = %79
%103 = load i32, i32* %11
%104 = icmp ne i32 %103, 0
br i1 %104, label %110, label %105
105: ; preds = %102
%106 = load i8*, i8** %4
%107 = load i32, i32* %9
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %106, i64 %108
store i8* %109, i8** %8
br label %114
110: ; preds = %102
store i32 0, i32* %11
br label %111
111: ; preds = %110
%112 = load i32, i32* %9
%113 = add nsw i32 %112, -1
store i32 %113, i32* %9
br label %75
114: ; preds = %105, %75
%115 = load i8*, i8** %8
%116 = load i8*, i8** %7
%117 = ptrtoint i8* %115 to i64
%118 = ptrtoint i8* %116 to i64
%119 = sub i64 %117, %118
%120 = add nsw i64 %119, 2
%121 = trunc i64 %120 to i32
%122 = call i64 @calloc(i32 %121, i32 1)
%123 = inttoptr i64 %122 to i8*
store i8* %123, i8** %6
%124 = load i8*, i8** %6
%125 = icmp eq i8* %124, null
br i1 %125, label %126, label %127
126: ; preds = %114
br label %139
127: ; preds = %114
%128 = load i8*, i8** %6
%129 = load i8*, i8** %7
%130 = load i8*, i8** %8
%131 = load i8*, i8** %7
%132 = ptrtoint i8* %130 to i64
%133 = ptrtoint i8* %131 to i64
%134 = sub i64 %132, %133
%135 = add nsw i64 %134, 1
%136 = trunc i64 %135 to i32
%137 = call i32 @strncpy(i8* %128, i8* %129, i32 %136)
%138 = load i8*, i8** %6
store i8* %138, i8** %3
br label %141
139: ; preds = %126, %30, %19
%140 = load i8*, i8** %6
store i8* %140, i8** %3
br label %141
141: ; preds = %139, %127
%142 = load i8*, i8** %3
ret i8* %142
}

LLVM IR (-O2):
define i8* @strip_with_chars(i8* %0, i8* %1) {
%3 = icmp eq i8* %0, null
%4 = icmp eq i8* %1, null
%5 = or i1 %3, %4
br i1 %5, label %231, label %6
6: ; preds = %2
%7 = tail call i32 @strlen(i8* %0)
%8 = tail call i32 @strlen(i8* %1)
%9 = icmp eq i32 %7, 0
%10 = icmp eq i32 %8, 0
%11 = select i1 %9, i1 true, i1 %10
br i1 %11, label %231, label %12
12: ; preds = %6
%13 = icmp sgt i32 %7, 0
br i1 %13, label %14, label %115
14: ; preds = %12
%15 = icmp sgt i32 %8, 0
%16 = zext i32 %7 to i64
%17 = zext i32 %8 to i64
%18 = and i64 %17, 4294967288
%19 = add nsw i64 %18, -8
%20 = lshr exact i64 %19, 3
%21 = add nuw nsw i64 %20, 1
%22 = icmp ult i32 %8, 8
%23 = and i64 %17, 4294967288
%24 = and i64 %21, 1
%25 = icmp eq i64 %19, 0
%26 = and i64 %21, 4611686018427387902
%27 = icmp eq i64 %24, 0
%28 = icmp eq i64 %23, %17
br label %29
29: ; preds = %14, %112
%30 = phi i64 [ 0, %14 ], [ %113, %112 ]
br i1 %15, label %31, label %109
31: ; preds = %29
%32 = getelementptr inbounds i8, i8* %0, i64 %30
%33 = load i8, i8* %32
br i1 %22, label %94, label %34
34: ; preds = %31
%35 = insertelement <4 x i8> poison, i8 %33, i64 0
%36 = shufflevector <4 x i8> %35, <4 x i8> poison, <4 x i32> zeroinitializer
%37 = insertelement <4 x i8> poison, i8 %33, i64 0
%38 = shufflevector <4 x i8> %37, <4 x i8> poison, <4 x i32> zeroinitializer
br i1 %25, label %68, label %39
39: ; preds = %34, %39
%40 = phi i64 [ %65, %39 ], [ 0, %34 ]
%41 = phi <4 x i32> [ %62, %39 ], [ zeroinitializer, %34 ]
%42 = phi <4 x i32> [ %64, %39 ], [ zeroinitializer, %34 ]
%43 = phi i64 [ %66, %39 ], [ 0, %34 ]
%44 = getelementptr inbounds i8, i8* %1, i64 %40
%45 = bitcast i8* %44 to <4 x i8>*
%46 = load <4 x i8>, <4 x i8>* %45
%47 = getelementptr inbounds i8, i8* %44, i64 4
%48 = bitcast i8* %47 to <4 x i8>*
%49 = load <4 x i8>, <4 x i8>* %48
%50 = icmp eq <4 x i8> %36, %46
%51 = icmp eq <4 x i8> %38, %49
%52 = or i64 %40, 8
%53 = getelementptr inbounds i8, i8* %1, i64 %52
%54 = bitcast i8* %53 to <4 x i8>*
%55 = load <4 x i8>, <4 x i8>* %54
%56 = getelementptr inbounds i8, i8* %53, i64 4
%57 = bitcast i8* %56 to <4 x i8>*
%58 = load <4 x i8>, <4 x i8>* %57
%59 = icmp eq <4 x i8> %36, %55
%60 = icmp eq <4 x i8> %38, %58
%61 = select <4 x i1> %59, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %50
%62 = select <4 x i1> %61, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %41
%63 = select <4 x i1> %60, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %51
%64 = select <4 x i1> %63, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %42
%65 = add nuw i64 %40, 16
%66 = add i64 %43, 2
%67 = icmp eq i64 %66, %26
br i1 %67, label %68, label %39
68: ; preds = %39, %34
%69 = phi <4 x i32> [ undef, %34 ], [ %62, %39 ]
%70 = phi <4 x i32> [ undef, %34 ], [ %64, %39 ]
%71 = phi i64 [ 0, %34 ], [ %65, %39 ]
%72 = phi <4 x i32> [ zeroinitializer, %34 ], [ %62, %39 ]
%73 = phi <4 x i32> [ zeroinitializer, %34 ], [ %64, %39 ]
br i1 %27, label %85, label %74
74: ; preds = %68
%75 = getelementptr inbounds i8, i8* %1, i64 %71
%76 = bitcast i8* %75 to <4 x i8>*
%77 = load <4 x i8>, <4 x i8>* %76
%78 = getelementptr inbounds i8, i8* %75, i64 4
%79 = bitcast i8* %78 to <4 x i8>*
%80 = load <4 x i8>, <4 x i8>* %79
%81 = icmp eq <4 x i8> %36, %77
%82 = icmp eq <4 x i8> %38, %80
%83 = select <4 x i1> %81, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %72
%84 = select <4 x i1> %82, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %73
br label %85
85: ; preds = %68, %74
%86 = phi <4 x i32> [ %69, %68 ], [ %83, %74 ]
%87 = phi <4 x i32> [ %70, %68 ], [ %84, %74 ]
%88 = icmp eq <4 x i32> %86, zeroinitializer
%89 = select <4 x i1> %88, <4 x i32> %87, <4 x i32> %86
%90 = icmp ne <4 x i32> %89, zeroinitializer
%91 = bitcast <4 x i1> %90 to i4
%92 = icmp ne i4 %91, 0
%93 = zext i1 %92 to i32
br i1 %28, label %106, label %94
94: ; preds = %31, %85
%95 = phi i64 [ 0, %31 ], [ %23, %85 ]
%96 = phi i32 [ 0, %31 ], [ %93, %85 ]
br label %97
97: ; preds = %94, %97
%98 = phi i64 [ %104, %97 ], [ %95, %94 ]
%99 = phi i32 [ %103, %97 ], [ %96, %94 ]
%100 = getelementptr inbounds i8, i8* %1, i64 %98
%101 = load i8, i8* %100
%102 = icmp eq i8 %33, %101
%103 = select i1 %102, i32 1, i32 %99
%104 = add nuw nsw i64 %98, 1
%105 = icmp eq i64 %104, %17
br i1 %105, label %106, label %97
106: ; preds = %97, %85
%107 = phi i32 [ %93, %85 ], [ %103, %97 ]
%108 = icmp eq i32 %107, 0
br i1 %108, label %109, label %112
109: ; preds = %29, %106
%110 = and i64 %30, 4294967295
%111 = getelementptr inbounds i8, i8* %0, i64 %110
br label %115
112: ; preds = %106
%113 = add nuw nsw i64 %30, 1
%114 = icmp eq i64 %113, %16
br i1 %114, label %115, label %29
115: ; preds = %112, %12, %109
%116 = phi i8* [ %111, %109 ], [ null, %12 ], [ null, %112 ]
%117 = icmp sgt i32 %8, 0
%118 = sext i32 %7 to i64
%119 = zext i32 %8 to i64
%120 = and i64 %119, 4294967288
%121 = add nsw i64 %120, -8
%122 = lshr exact i64 %121, 3
%123 = add nuw nsw i64 %122, 1
%124 = icmp ult i32 %8, 8
%125 = and i64 %119, 4294967288
%126 = and i64 %123, 1
%127 = icmp eq i64 %121, 0
%128 = and i64 %123, 4611686018427387902
%129 = icmp eq i64 %126, 0
%130 = icmp eq i64 %125, %119
br label %131
131: ; preds = %211, %115
%132 = phi i64 [ %133, %211 ], [ %118, %115 ]
%133 = add nsw i64 %132, -1
%134 = icmp sgt i64 %132, 0
br i1 %134, label %135, label %219
135: ; preds = %131
br i1 %117, label %136, label %214
136: ; preds = %135
%137 = getelementptr inbounds i8, i8* %0, i64 %133
%138 = load i8, i8* %137
br i1 %124, label %199, label %139
139: ; preds = %136
%140 = insertelement <4 x i8> poison, i8 %138, i64 0
%141 = shufflevector <4 x i8> %140, <4 x i8> poison, <4 x i32> zeroinitializer
%142 = insertelement <4 x i8> poison, i8 %138, i64 0
%143 = shufflevector <4 x i8> %142, <4 x i8> poison, <4 x i32> zeroinitializer
br i1 %127, label %173, label %144
144: ; preds = %139, %144
%145 = phi i64 [ %170, %144 ], [ 0, %139 ]
%146 = phi <4 x i32> [ %167, %144 ], [ zeroinitializer, %139 ]
%147 = phi <4 x i32> [ %169, %144 ], [ zeroinitializer, %139 ]
%148 = phi i64 [ %171, %144 ], [ 0, %139 ]
%149 = getelementptr inbounds i8, i8* %1, i64 %145
%150 = bitcast i8* %149 to <4 x i8>*
%151 = load <4 x i8>, <4 x i8>* %150
%152 = getelementptr inbounds i8, i8* %149, i64 4
%153 = bitcast i8* %152 to <4 x i8>*
%154 = load <4 x i8>, <4 x i8>* %153
%155 = icmp eq <4 x i8> %141, %151
%156 = icmp eq <4 x i8> %143, %154
%157 = or i64 %145, 8
%158 = getelementptr inbounds i8, i8* %1, i64 %157
%159 = bitcast i8* %158 to <4 x i8>*
%160 = load <4 x i8>, <4 x i8>* %159
%161 = getelementptr inbounds i8, i8* %158, i64 4
%162 = bitcast i8* %161 to <4 x i8>*
%163 = load <4 x i8>, <4 x i8>* %162
%164 = icmp eq <4 x i8> %141, %160
%165 = icmp eq <4 x i8> %143, %163
%166 = select <4 x i1> %164, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %155
%167 = select <4 x i1> %166, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %146
%168 = select <4 x i1> %165, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %156
%169 = select <4 x i1> %168, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %147
%170 = add nuw i64 %145, 16
%171 = add i64 %148, 2
%172 = icmp eq i64 %171, %128
br i1 %172, label %173, label %144
173: ; preds = %144, %139
%174 = phi <4 x i32> [ undef, %139 ], [ %167, %144 ]
%175 = phi <4 x i32> [ undef, %139 ], [ %169, %144 ]
%176 = phi i64 [ 0, %139 ], [ %170, %144 ]
%177 = phi <4 x i32> [ zeroinitializer, %139 ], [ %167, %144 ]
%178 = phi <4 x i32> [ zeroinitializer, %139 ], [ %169, %144 ]
br i1 %129, label %190, label %179
179: ; preds = %173
%180 = getelementptr inbounds i8, i8* %1, i64 %176
%181 = bitcast i8* %180 to <4 x i8>*
%182 = load <4 x i8>, <4 x i8>* %181
%183 = getelementptr inbounds i8, i8* %180, i64 4
%184 = bitcast i8* %183 to <4 x i8>*
%185 = load <4 x i8>, <4 x i8>* %184
%186 = icmp eq <4 x i8> %141, %182
%187 = icmp eq <4 x i8> %143, %185
%188 = select <4 x i1> %186, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %177
%189 = select <4 x i1> %187, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %178
br label %190
190: ; preds = %173, %179
%191 = phi <4 x i32> [ %174, %173 ], [ %188, %179 ]
%192 = phi <4 x i32> [ %175, %173 ], [ %189, %179 ]
%193 = icmp eq <4 x i32> %191, zeroinitializer
%194 = select <4 x i1> %193, <4 x i32> %192, <4 x i32> %191
%195 = icmp ne <4 x i32> %194, zeroinitializer
%196 = bitcast <4 x i1> %195 to i4
%197 = icmp ne i4 %196, 0
%198 = zext i1 %197 to i32
br i1 %130, label %211, label %199
199: ; preds = %136, %190
%200 = phi i64 [ 0, %136 ], [ %125, %190 ]
%201 = phi i32 [ 0, %136 ], [ %198, %190 ]
br label %202
202: ; preds = %199, %202
%203 = phi i64 [ %209, %202 ], [ %200, %199 ]
%204 = phi i32 [ %208, %202 ], [ %201, %199 ]
%205 = getelementptr inbounds i8, i8* %1, i64 %203
%206 = load i8, i8* %205
%207 = icmp eq i8 %138, %206
%208 = select i1 %207, i32 1, i32 %204
%209 = add nuw nsw i64 %203, 1
%210 = icmp eq i64 %209, %119
br i1 %210, label %211, label %202
211: ; preds = %202, %190
%212 = phi i32 [ %198, %190 ], [ %208, %202 ]
%213 = icmp eq i32 %212, 0
br i1 %213, label %214, label %131
214: ; preds = %135, %211
%215 = shl i64 %133, 32
%216 = ashr exact i64 %215, 32
%217 = getelementptr inbounds i8, i8* %0, i64 %216
%218 = ptrtoint i8* %217 to i64
br label %219
219: ; preds = %131, %214
%220 = phi i64 [ %218, %214 ], [ 0, %131 ]
%221 = ptrtoint i8* %116 to i64
%222 = sub i64 %220, %221
%223 = trunc i64 %222 to i32
%224 = add i32 %223, 2
%225 = tail call i64 @calloc(i32 %224, i32 1)
%226 = inttoptr i64 %225 to i8*
%227 = icmp eq i64 %225, 0
br i1 %227, label %231, label %228
228: ; preds = %219
%229 = add i32 %223, 1
%230 = tail call i32 @strncpy(i8* %226, i8* %116, i32 %229)
br label %231
231: ; preds = %2, %6, %219, %228
%232 = phi i8* [ %226, %228 ], [ null, %219 ], [ null, %6 ], [ null, %2 ]
ret i8* %232
}