#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__ exists(char *, char);
int get_len(char *);
float get_closeless(char *a, char *b) {
  float closeness = 0;
  int i, j;
  int a_len = get_len(a), b_len = get_len(b);
  if (a_len == b_len)
    closeness += 1;
  for (i = 0; i < a_len || i < b_len; i++)
    if (i < a_len && i < b_len) {
      if (a[i] == b[i])
        closeness += 2;
      else {
        if (exists(b, a[i]) && exists(a, b[i]))
          closeness += 0.5;
      }
    } else {
      if (i < a_len) {
        if (exists(b, a[i])) {
          closeness += 0.5;
        }
      } else if (exists(a, b[i])) {
        closeness += 0.5;
      }
    }
  return closeness;
}


x86 assembly (clang, -O0):
<get_closeless>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <get_len@plt>
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <get_len@plt>
mov    %eax,-0x24(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jne    116e <get_closeless+0x4e>
movss  0xe9c(%rip),%xmm0
addss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%ecx
mov    $0x1,%al
cmp    -0x20(%rbp),%ecx
mov    %al,-0x25(%rbp)
jl     1192 <get_closeless+0x72>
mov    -0x18(%rbp),%eax
cmp    -0x24(%rbp),%eax
setl   %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    11a2 <get_closeless+0x82>
jmp    12ff <get_closeless+0x1df>
mov    -0x18(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1257 <get_closeless+0x137>
mov    -0x18(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1257 <get_closeless+0x137>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x18(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    11f1 <get_closeless+0xd1>
movss  0xe22(%rip),%xmm0
addss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    1252 <get_closeless+0x132>
mov    -0x10(%rbp),%rdi
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
call   1040 <exists@plt>
cmp    $0x0,%rax
je     124d <get_closeless+0x12d>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
call   1040 <exists@plt>
cmp    $0x0,%rax
je     124d <get_closeless+0x12d>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdc8(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    1252 <get_closeless+0x132>
jmp    12ec <get_closeless+0x1cc>
mov    -0x18(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    12a5 <get_closeless+0x185>
mov    -0x10(%rbp),%rdi
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
call   1040 <exists@plt>
cmp    $0x0,%rax
je     12a0 <get_closeless+0x180>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd75(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12e7 <get_closeless+0x1c7>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
call   1040 <exists@plt>
cmp    $0x0,%rax
je     12e2 <get_closeless+0x1c2>
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd33(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    12e7 <get_closeless+0x1c7>
jmp    12ec <get_closeless+0x1cc>
jmp    12f1 <get_closeless+0x1d1>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1175 <get_closeless+0x55>
movss  -0x14(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_closeless>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%r12
mov    %rdi,%r14
call   1030 <get_len@plt>
mov    %eax,%r15d
mov    %r12,%rdi
call   1030 <get_len@plt>
mov    %eax,%ebp
cmp    %eax,%r15d
je     114e <get_closeless+0x2e>
xorps  %xmm0,%xmm0
jmp    1156 <get_closeless+0x36>
movss  0xeaa(%rip),%xmm0
test   %ebp,%ebp
setg   %al
test   %r15d,%r15d
setg   %cl
jg     116b <get_closeless+0x4b>
test   %ebp,%ebp
jle    121d <get_closeless+0xfd>
xor    %ebx,%ebx
nopl   (%rax)
test   $0x1,%cl
je     1190 <get_closeless+0x70>
test   $0x1,%al
je     1190 <get_closeless+0x70>
movzbl (%r14,%rbx,1),%eax
cmp    (%r12,%rbx,1),%al
jne    11b0 <get_closeless+0x90>
addss  0xe7c(%rip),%xmm0
jmp    1200 <get_closeless+0xe0>
xchg   %ax,%ax
movss  %xmm0,0xc(%rsp)
test   $0x1,%cl
je     11c6 <get_closeless+0xa6>
movsbl (%r14,%rbx,1),%esi
mov    %r12,%rdi
jmp    11ce <get_closeless+0xae>
cs nopw 0x0(%rax,%rax,1)
nop
movss  %xmm0,0xc(%rsp)
movsbl %al,%esi
mov    %r12,%rdi
call   1040 <exists@plt>
test   %rax,%rax
je     11ee <get_closeless+0xce>
movsbl (%r12,%rbx,1),%esi
mov    %r14,%rdi
call   1040 <exists@plt>
movss  0xc(%rsp),%xmm0
movaps %xmm0,%xmm1
addss  0xe20(%rip),%xmm1
test   %rax,%rax
je     1200 <get_closeless+0xe0>
movaps %xmm1,%xmm0
jmp    1200 <get_closeless+0xe0>
movss  0xc(%rsp),%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rbx
cmp    %ebx,%ebp
setg   %al
cmp    %ebx,%r15d
setg   %cl
jg     1170 <get_closeless+0x50>
cmp    %ebx,%ebp
jg     1170 <get_closeless+0x50>
add    $0x10,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define float @get_closeless(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca float
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
store float 0.000000e+00, float* %5
%10 = load i8*, i8** %3
%11 = call i32 @get_len(i8* %10)
store i32 %11, i32* %8
%12 = load i8*, i8** %4
%13 = call i32 @get_len(i8* %12)
store i32 %13, i32* %9
%14 = load i32, i32* %8
%15 = load i32, i32* %9
%16 = icmp eq i32 %14, %15
br i1 %16, label %17, label %20
17: ; preds = %2
%18 = load float, float* %5
%19 = fadd float %18, 1.000000e+00
store float %19, float* %5
br label %20
20: ; preds = %17, %2
store i32 0, i32* %6
br label %21
21: ; preds = %117, %20
%22 = load i32, i32* %6
%23 = load i32, i32* %8
%24 = icmp slt i32 %22, %23
br i1 %24, label %29, label %25
25: ; preds = %21
%26 = load i32, i32* %6
%27 = load i32, i32* %9
%28 = icmp slt i32 %26, %27
br label %29
29: ; preds = %25, %21
%30 = phi i1 [ true, %21 ], [ %28, %25 ]
br i1 %30, label %31, label %120
31: ; preds = %29
%32 = load i32, i32* %6
%33 = load i32, i32* %8
%34 = icmp slt i32 %32, %33
br i1 %34, label %35, label %81
35: ; preds = %31
%36 = load i32, i32* %6
%37 = load i32, i32* %9
%38 = icmp slt i32 %36, %37
br i1 %38, label %39, label %81
39: ; preds = %35
%40 = load i8*, i8** %3
%41 = load i32, i32* %6
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = load i8*, i8** %4
%47 = load i32, i32* %6
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %46, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %45, %51
br i1 %52, label %53, label %56
53: ; preds = %39
%54 = load float, float* %5
%55 = fadd float %54, 2.000000e+00
store float %55, float* %5
br label %80
56: ; preds = %39
%57 = load i8*, i8** %4
%58 = load i8*, i8** %3
%59 = load i32, i32* %6
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i8, i8* %58, i64 %60
%62 = load i8, i8* %61
%63 = call i64 @exists(i8* %57, i8 signext %62)
%64 = icmp ne i64 %63, 0
br i1 %64, label %65, label %79
65: ; preds = %56
%66 = load i8*, i8** %3
%67 = load i8*, i8** %4
%68 = load i32, i32* %6
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds i8, i8* %67, i64 %69
%71 = load i8, i8* %70
%72 = call i64 @exists(i8* %66, i8 signext %71)
%73 = icmp ne i64 %72, 0
br i1 %73, label %74, label %79
74: ; preds = %65
%75 = load float, float* %5
%76 = fpext float %75 to double
%77 = fadd double %76, 5.000000e-01
%78 = fptrunc double %77 to float
store float %78, float* %5
br label %79
79: ; preds = %74, %65, %56
br label %80
80: ; preds = %79, %53
br label %116
81: ; preds = %35, %31
%82 = load i32, i32* %6
%83 = load i32, i32* %8
%84 = icmp slt i32 %82, %83
br i1 %84, label %85, label %100
85: ; preds = %81
%86 = load i8*, i8** %4
%87 = load i8*, i8** %3
%88 = load i32, i32* %6
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i8, i8* %87, i64 %89
%91 = load i8, i8* %90
%92 = call i64 @exists(i8* %86, i8 signext %91)
%93 = icmp ne i64 %92, 0
br i1 %93, label %94, label %99
94: ; preds = %85
%95 = load float, float* %5
%96 = fpext float %95 to double
%97 = fadd double %96, 5.000000e-01
%98 = fptrunc double %97 to float
store float %98, float* %5
br label %99
99: ; preds = %94, %85
br label %115
100: ; preds = %81
%101 = load i8*, i8** %3
%102 = load i8*, i8** %4
%103 = load i32, i32* %6
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds i8, i8* %102, i64 %104
%106 = load i8, i8* %105
%107 = call i64 @exists(i8* %101, i8 signext %106)
%108 = icmp ne i64 %107, 0
br i1 %108, label %109, label %114
109: ; preds = %100
%110 = load float, float* %5
%111 = fpext float %110 to double
%112 = fadd double %111, 5.000000e-01
%113 = fptrunc double %112 to float
store float %113, float* %5
br label %114
114: ; preds = %109, %100
br label %115
115: ; preds = %114, %99
br label %116
116: ; preds = %115, %80
br label %117
117: ; preds = %116
%118 = load i32, i32* %6
%119 = add nsw i32 %118, 1
store i32 %119, i32* %6
br label %21
120: ; preds = %29
%121 = load float, float* %5
ret float %121
}

LLVM IR (-O2):
define float @get_closeless(i8* %0, i8* %1) {
%3 = tail call i32 @get_len(i8* %0)
%4 = tail call i32 @get_len(i8* %1)
%5 = icmp eq i32 %3, %4
%6 = select i1 %5, float 1.000000e+00, float 0.000000e+00
%7 = icmp sgt i32 %3, 0
%8 = icmp sgt i32 %4, 0
%9 = select i1 %7, i1 true, i1 %8
br i1 %9, label %10, label %55
10: ; preds = %2, %48
%11 = phi i64 [ %50, %48 ], [ 0, %2 ]
%12 = phi i1 [ %53, %48 ], [ %8, %2 ]
%13 = phi i1 [ %52, %48 ], [ %7, %2 ]
%14 = phi float [ %49, %48 ], [ %6, %2 ]
%15 = select i1 %13, i1 %12, i1 false
br i1 %15, label %16, label %33
16: ; preds = %10
%17 = getelementptr inbounds i8, i8* %0, i64 %11
%18 = load i8, i8* %17
%19 = getelementptr inbounds i8, i8* %1, i64 %11
%20 = load i8, i8* %19
%21 = icmp eq i8 %18, %20
br i1 %21, label %22, label %24
22: ; preds = %16
%23 = fadd float %14, 2.000000e+00
br label %48
24: ; preds = %16
%25 = tail call i64 @exists(i8* %1, i8 signext %18)
%26 = icmp eq i64 %25, 0
br i1 %26, label %48, label %27
27: ; preds = %24
%28 = load i8, i8* %19
%29 = tail call i64 @exists(i8* %0, i8 signext %28)
%30 = icmp eq i64 %29, 0
%31 = fadd float %14, 5.000000e-01
%32 = select i1 %30, float %14, float %31
br label %48
33: ; preds = %10
br i1 %13, label %34, label %41
34: ; preds = %33
%35 = getelementptr inbounds i8, i8* %0, i64 %11
%36 = load i8, i8* %35
%37 = tail call i64 @exists(i8* %1, i8 signext %36)
%38 = icmp eq i64 %37, 0
%39 = fadd float %14, 5.000000e-01
%40 = select i1 %38, float %14, float %39
br label %48
41: ; preds = %33
%42 = getelementptr inbounds i8, i8* %1, i64 %11
%43 = load i8, i8* %42
%44 = tail call i64 @exists(i8* %0, i8 signext %43)
%45 = icmp eq i64 %44, 0
%46 = fadd float %14, 5.000000e-01
%47 = select i1 %45, float %14, float %46
br label %48
48: ; preds = %41, %34, %27, %24, %22
%49 = phi float [ %23, %22 ], [ %14, %24 ], [ %32, %27 ], [ %40, %34 ], [ %47, %41 ]
%50 = add nuw i64 %11, 1
%51 = trunc i64 %50 to i32
%52 = icmp sgt i32 %3, %51
%53 = icmp sgt i32 %4, %51
%54 = select i1 %52, i1 true, i1 %53
br i1 %54, label %10, label %55
55: ; preds = %48, %2
%56 = phi float [ %6, %2 ], [ %49, %48 ]
ret float %56
}