#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 */
int /*<<< orphan*/ free_mem(char *);
char *new_str(char *);
int strlen(char *);
char *strstr(char *, char *);
int contains_word(char *str, char *str2) {
  int i, len, len2, found = 0;
  char *s;
  if (!str2 || !*str2 || !str || !*str)
    return 0;
  str = new_str(str);
  len = strlen(str);
  len2 = strlen(str2);
  for (i = 0; i < len; i++) {
    if (str[i] >= 'a' && str[i] <= 'z')
      str[i] -= 'a' - 'A';
  }
  for (s = str; (s = strstr(s, str2)); s++) {
    if ((s == str || s[-1] < 'A' || s[-1] > 'Z') &&
        (s[len2] < 'A' || s[len2] > 'Z')) {
      found = 1;
      break;
    }
  }
  free_mem(str);
  return found;
}


x86 assembly (clang, -O0):
<contains_word>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x28(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1187 <contains_word+0x47>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1187 <contains_word+0x47>
cmpq   $0x0,-0x10(%rbp)
je     1187 <contains_word+0x47>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1193 <contains_word+0x53>
movl   $0x0,-0x4(%rbp)
jmp    12c8 <contains_word+0x188>
mov    -0x10(%rbp),%rdi
call   1040 <new_str@plt>
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x20(%rbp)
mov    -0x18(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    121a <contains_word+0xda>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1207 <contains_word+0xc7>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     1207 <contains_word+0xc7>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
sub    $0x20,%edx
mov    %dl,(%rax,%rcx,1)
jmp    120c <contains_word+0xcc>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11bf <contains_word+0x7f>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1060 <strstr@plt>
mov    %rax,-0x30(%rbp)
cmp    $0x0,%rax
je     12b9 <contains_word+0x179>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
je     126d <contains_word+0x12d>
mov    -0x30(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x41,%eax
jl     126d <contains_word+0x12d>
mov    -0x30(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x5a,%eax
jle    12a3 <contains_word+0x163>
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1297 <contains_word+0x157>
mov    -0x30(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jle    12a3 <contains_word+0x163>
movl   $0x1,-0x28(%rbp)
jmp    12b9 <contains_word+0x179>
jmp    12a8 <contains_word+0x168>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1222 <contains_word+0xe2>
mov    -0x10(%rbp),%rdi
call   1050 <free_mem@plt>
mov    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<contains_word>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
xor    %r12d,%r12d
test   %rsi,%rsi
je     1391 <contains_word+0x251>
test   %rdi,%rdi
je     1391 <contains_word+0x251>
mov    %rsi,%r14
cmpb   $0x0,(%rsi)
je     1391 <contains_word+0x251>
cmpb   $0x0,(%rdi)
je     1391 <contains_word+0x251>
call   1040 <new_str@plt>
mov    %rax,%rbx
mov    %rax,%rdi
call   1030 <strlen@plt>
mov    %eax,%ebp
mov    %r14,%rdi
call   1030 <strlen@plt>
mov    %eax,%r15d
test   %ebp,%ebp
jle    1314 <contains_word+0x1d4>
mov    %ebp,%eax
cmp    $0x8,%ebp
jae    11a5 <contains_word+0x65>
xor    %ecx,%ecx
jmp    1339 <contains_word+0x1f9>
mov    %eax,%ecx
and    $0xfffffff8,%ecx
xor    %edx,%edx
movdqa 0xe4c(%rip),%xmm0
movdqa 0xe54(%rip),%xmm1
pcmpeqd %xmm2,%xmm2
jmp    11dd <contains_word+0x9d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x8,%rdx
cmp    %rdx,%rcx
je     130f <contains_word+0x1cf>
movq   (%rbx,%rdx,1),%xmm3
movdqa %xmm3,%xmm4
paddb  %xmm0,%xmm4
movdqa %xmm4,%xmm5
pmaxub %xmm1,%xmm5
pcmpeqb %xmm4,%xmm5
movd   %xmm5,%esi
not    %sil
test   $0x1,%sil
je     120f <contains_word+0xcf>
movd   %xmm3,%esi
add    $0xe0,%sil
mov    %sil,(%rbx,%rdx,1)
movdqa %xmm5,%xmm4
pxor   %xmm2,%xmm4
movdqa %xmm4,%xmm6
pslld  $0x8,%xmm6
movd   %xmm6,%esi
shr    $0x10,%esi
test   $0x1,%sil
je     123d <contains_word+0xfd>
movd   %xmm3,%esi
shr    $0x8,%esi
add    $0xe0,%sil
mov    %sil,0x1(%rbx,%rdx,1)
pshuflw $0x55,%xmm5,%xmm6
pxor   %xmm2,%xmm6
pextrw $0x2,%xmm6,%esi
test   $0x1,%sil
je     1261 <contains_word+0x121>
movd   %xmm3,%esi
shr    $0x10,%esi
add    $0xe0,%sil
mov    %sil,0x2(%rbx,%rdx,1)
movdqa %xmm4,%xmm6
psllq  $0x18,%xmm6
pextrw $0x3,%xmm6,%esi
test   $0x1,%sil
je     1285 <contains_word+0x145>
movd   %xmm3,%esi
shr    $0x18,%esi
add    $0xe0,%sil
mov    %sil,0x3(%rbx,%rdx,1)
pshufd $0x55,%xmm5,%xmm5
pxor   %xmm2,%xmm5
pextrw $0x4,%xmm5,%esi
test   $0x1,%sil
je     12a7 <contains_word+0x167>
pextrw $0x2,%xmm3,%esi
add    $0xe0,%sil
mov    %sil,0x4(%rbx,%rdx,1)
movdqa %xmm4,%xmm5
pslldq $0x5,%xmm5
pextrw $0x5,%xmm5,%esi
test   $0x1,%sil
je     12cc <contains_word+0x18c>
pextrw $0x2,%xmm3,%esi
shr    $0x8,%esi
add    $0xe0,%sil
mov    %sil,0x5(%rbx,%rdx,1)
pextrw $0x3,%xmm4,%esi
test   $0x1,%sil
je     12e5 <contains_word+0x1a5>
pextrw $0x3,%xmm3,%esi
add    $0xe0,%sil
mov    %sil,0x6(%rbx,%rdx,1)
pslldq $0x7,%xmm4
pextrw $0x7,%xmm4,%esi
test   $0x1,%sil
je     11d0 <contains_word+0x90>
pextrw $0x3,%xmm3,%esi
shr    $0x8,%esi
add    $0xe0,%sil
mov    %sil,0x7(%rbx,%rdx,1)
jmp    11d0 <contains_word+0x90>
cmp    %rax,%rcx
jne    1339 <contains_word+0x1f9>
mov    %rbx,%rdi
mov    %r14,%rsi
call   1060 <strstr@plt>
xor    %r12d,%r12d
test   %rax,%rax
je     1389 <contains_word+0x249>
movslq %r15d,%rbp
jmp    1370 <contains_word+0x230>
nopl   0x0(%rax)
add    $0x1,%rcx
cmp    %rcx,%rax
je     1314 <contains_word+0x1d4>
movzbl (%rbx,%rcx,1),%edx
lea    -0x61(%rdx),%esi
cmp    $0x19,%sil
ja     1330 <contains_word+0x1f0>
add    $0xe0,%dl
mov    %dl,(%rbx,%rcx,1)
jmp    1330 <contains_word+0x1f0>
xchg   %ax,%ax
movzbl (%rax,%rbp,1),%ecx
add    $0xa5,%cl
cmp    $0xe6,%cl
jb     1383 <contains_word+0x243>
add    $0x1,%rax
mov    %rax,%rdi
mov    %r14,%rsi
call   1060 <strstr@plt>
test   %rax,%rax
je     1389 <contains_word+0x249>
cmp    %rbx,%rax
je     1350 <contains_word+0x210>
movzbl -0x1(%rax),%ecx
add    $0xa5,%cl
cmp    $0xe5,%cl
jbe    1350 <contains_word+0x210>
jmp    135c <contains_word+0x21c>
mov    $0x1,%r12d
mov    %rbx,%rdi
call   1050 <free_mem@plt>
mov    %r12d,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

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