#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*/ changetoDnsFormat(unsigned char *, unsigned char *);
int /*<<< orphan*/ strcat(unsigned char *, char *);
int strlen(unsigned char *);
void changeIPtoDnsFormat(unsigned char *dns, unsigned char *hostip) {
  int i, iplen, j, prevDot, counter;
  unsigned char revip[100];
  iplen = strlen(hostip);
  prevDot = iplen;
  counter = 0;
  for (i = iplen - 1; i >= 0; --i) {
    if (i == 0) {
      for (j = i; j < prevDot; ++j) {
        revip[counter++] = hostip[j];
      }
    } else if (hostip[i] == '.') {
      for (j = i + 1; j < prevDot; ++j) {
        revip[counter++] = hostip[j];
      }
      revip[counter++] = '.';
      prevDot = i;
    }
  }
  revip[i] = '\0';
  strcat(revip, ".in-addr.arpa.");
  changetoDnsFormat(dns, revip);
}


x86 assembly (clang, -O0):
<changeIPtoDnsFormat>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x18(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jl     1247 <changeIPtoDnsFormat+0x117>
cmpl   $0x0,-0x14(%rbp)
jne    11bd <changeIPtoDnsFormat+0x8d>
mov    -0x14(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11b8 <changeIPtoDnsFormat+0x88>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x24(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x24(%rbp)
cltq
mov    %cl,-0x90(%rbp,%rax,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    117f <changeIPtoDnsFormat+0x4f>
jmp    1234 <changeIPtoDnsFormat+0x104>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    122f <changeIPtoDnsFormat+0xff>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1214 <changeIPtoDnsFormat+0xe4>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x24(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x24(%rbp)
cltq
mov    %cl,-0x90(%rbp,%rax,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11db <changeIPtoDnsFormat+0xab>
mov    -0x24(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x24(%rbp)
cltq
movb   $0x2e,-0x90(%rbp,%rax,1)
2e
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    1234 <changeIPtoDnsFormat+0x104>
jmp    1239 <changeIPtoDnsFormat+0x109>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1165 <changeIPtoDnsFormat+0x35>
movslq -0x14(%rbp),%rax
movb   $0x0,-0x90(%rbp,%rax,1)
lea    -0x90(%rbp),%rdi
lea    0xd9f(%rip),%rsi
call   1050 <strcat@plt>
mov    -0x8(%rbp),%rdi
lea    -0x90(%rbp),%rsi
call   1040 <changetoDnsFormat@plt>
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<changeIPtoDnsFormat>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xb8,%rsp
mov    %rdi,%rbp
mov    %rsi,0x8(%rsp)
mov    %rsi,%rdi
call   1030 <strlen@plt>
lea    -0x1(%rax),%edx
test   %eax,%eax
jle    139c <changeIPtoDnsFormat+0x25c>
mov    %rbp,0x30(%rsp)
mov    %eax,%ecx
mov    %eax,%esi
not    %eax
mov    %rax,0x40(%rsp)
mov    %edx,%edx
lea    0x1(%rsi),%r15
mov    %rsi,%r13
neg    %r13
xor    %ebp,%ebp
mov    %r15,0x38(%rsp)
mov    %rsi,%r14
xor    %r12d,%r12d
mov    0x8(%rsp),%r8
mov    %rsi,0x20(%rsp)
jmp    11d7 <changeIPtoDnsFormat+0x97>
mov    0x10(%rsp),%rdx
mov    0x18(%rsp),%rdi
nopl   0x0(%rax,%rax,1)
movslq %r12d,%rax
add    $0x1,%r12d
movb   $0x2e,0x50(%rsp,%rax,1)
mov    %edi,%ecx
add    $0xffffffffffffffff,%r14
add    $0x1,%rbp
add    $0xffffffffffffffff,%r15
add    $0x1,%r13
cmp    %rsi,%rbp
je     1392 <changeIPtoDnsFormat+0x252>
mov    %rdx,%rdi
sub    $0x1,%rdx
jae    1220 <changeIPtoDnsFormat+0xe0>
test   %ecx,%ecx
jle    11be <changeIPtoDnsFormat+0x7e>
movslq %r12d,%rax
lea    (%rsp,%rax,1),%rdi
add    $0x50,%rdi
mov    %rdx,0x10(%rsp)
mov    %ecx,%edx
mov    %r8,%rsi
mov    %ecx,%ebx
call   1040 <memcpy@plt>
mov    %ebx,%ecx
mov    0x10(%rsp),%rdx
mov    0x20(%rsp),%rsi
mov    0x8(%rsp),%r8
add    %ebx,%r12d
jmp    11be <changeIPtoDnsFormat+0x7e>
cs nopw 0x0(%rax,%rax,1)
cmpb   $0x2e,(%r8,%rdi,1)
jne    11be <changeIPtoDnsFormat+0x7e>
cmp    %r14d,%ecx
jle    11b0 <changeIPtoDnsFormat+0x70>
mov    %rdi,0x18(%rsp)
mov    %rdx,0x10(%rsp)
mov    0x38(%rsp),%rbx
sub    %rbp,%rbx
mov    %rbp,%rax
sub    %rsi,%rax
mov    %rax,0x48(%rsp)
sub    %rbp,%rsi
add    %r8,%rsi
mov    0x40(%rsp),%rax
lea    (%rax,%rbp,1),%edx
movslq %r12d,%r12
lea    (%rsp,%r12,1),%rdi
add    $0x50,%rdi
add    %ecx,%edx
add    $0x1,%rdx
mov    %ecx,0x2c(%rsp)
call   1040 <memcpy@plt>
movslq 0x2c(%rsp),%rax
cmp    %rax,%rbx
cmovle %rax,%rbx
add    0x48(%rsp),%rbx
cmp    $0x4,%rbx
jae    129a <changeIPtoDnsFormat+0x15a>
mov    %r14,%rcx
mov    0x8(%rsp),%r8
mov    0x20(%rsp),%rsi
jmp    1371 <changeIPtoDnsFormat+0x231>
mov    %rbx,%rcx
and    $0xfffffffffffffffc,%rcx
movq   %r12,%xmm0
lea    -0x4(%rcx),%rsi
mov    %rsi,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
pxor   %xmm1,%xmm1
cmp    $0x1c,%rsi
jae    12ca <changeIPtoDnsFormat+0x18a>
mov    0x8(%rsp),%r8
pcmpeqd %xmm2,%xmm2
jmp    130e <changeIPtoDnsFormat+0x1ce>
cmp    %rax,%r15
mov    %rax,%rsi
cmovg  %r15,%rsi
add    %r13,%rsi
and    $0xfffffffffffffffc,%rsi
add    $0xfffffffffffffffc,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
and    $0xfffffffffffffff8,%rsi
pxor   %xmm1,%xmm1
mov    0x8(%rsp),%r8
pcmpeqd %xmm2,%xmm2
movdqa 0xd00(%rip),%xmm3
paddq  %xmm3,%xmm0
paddq  %xmm3,%xmm1
add    $0xfffffffffffffff8,%rsi
jne    1300 <changeIPtoDnsFormat+0x1c0>
test   $0x7,%dl
je     134e <changeIPtoDnsFormat+0x20e>
cmp    %rax,%r15
mov    %rax,%rdx
cmovg  %r15,%rdx
add    %r13d,%edx
and    $0x1c,%dl
add    $0xfc,%dl
shr    $0x2,%dl
add    $0x1,%dl
movzbl %dl,%edx
and    $0x7,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
psubq  %xmm2,%xmm0
psubq  %xmm2,%xmm1
add    $0xffffffffffffffff,%rdx
jne    1340 <changeIPtoDnsFormat+0x200>
paddq  %xmm1,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddq  %xmm0,%xmm1
movq   %xmm1,%r12
cmp    %rcx,%rbx
mov    0x20(%rsp),%rsi
je     11a1 <changeIPtoDnsFormat+0x61>
add    %r14,%rcx
mov    0x10(%rsp),%rdx
mov    0x18(%rsp),%rdi
nopl   0x0(%rax,%rax,1)
add    $0x1,%r12
add    $0x1,%rcx
cmp    %rax,%rcx
jl     1380 <changeIPtoDnsFormat+0x240>
jmp    11b0 <changeIPtoDnsFormat+0x70>
mov    $0xffffffff,%edx
mov    0x30(%rsp),%rbp
movslq %edx,%rax
movb   $0x0,0x50(%rsp,%rax,1)
lea    0xc65(%rip),%rsi
lea    0x50(%rsp),%rbx
mov    %rbx,%rdi
call   1060 <strcat@plt>
mov    %rbp,%rdi
mov    %rbx,%rsi
call   1050 <changetoDnsFormat@plt>
add    $0xb8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [15 x i8] c".in-addr.arpa.\00"
define void @changeIPtoDnsFormat(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca [100 x i8]
store i8* %0, i8** %3
store i8* %1, i8** %4
%11 = load i8*, i8** %4
%12 = call i32 @strlen(i8* %11)
store i32 %12, i32* %6
%13 = load i32, i32* %6
store i32 %13, i32* %8
store i32 0, i32* %9
%14 = load i32, i32* %6
%15 = sub nsw i32 %14, 1
store i32 %15, i32* %5
br label %16
16: ; preds = %78, %2
%17 = load i32, i32* %5
%18 = icmp sge i32 %17, 0
br i1 %18, label %19, label %81
19: ; preds = %16
%20 = load i32, i32* %5
%21 = icmp eq i32 %20, 0
br i1 %21, label %22, label %42
22: ; preds = %19
%23 = load i32, i32* %5
store i32 %23, i32* %7
br label %24
24: ; preds = %38, %22
%25 = load i32, i32* %7
%26 = load i32, i32* %8
%27 = icmp slt i32 %25, %26
br i1 %27, label %28, label %41
28: ; preds = %24
%29 = load i8*, i8** %4
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds i8, i8* %29, i64 %31
%33 = load i8, i8* %32
%34 = load i32, i32* %9
%35 = add nsw i32 %34, 1
store i32 %35, i32* %9
%36 = sext i32 %34 to i64
%37 = getelementptr inbounds [100 x i8], [100 x i8]* %10, i64 0, i64 %36
store i8 %33, i8* %37
br label %38
38: ; preds = %28
%39 = load i32, i32* %7
%40 = add nsw i32 %39, 1
store i32 %40, i32* %7
br label %24
41: ; preds = %24
br label %77
42: ; preds = %19
%43 = load i8*, i8** %4
%44 = load i32, i32* %5
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %43, i64 %45
%47 = load i8, i8* %46
%48 = zext i8 %47 to i32
%49 = icmp eq i32 %48, 46
br i1 %49, label %50, label %76
50: ; preds = %42
%51 = load i32, i32* %5
%52 = add nsw i32 %51, 1
store i32 %52, i32* %7
br label %53
53: ; preds = %67, %50
%54 = load i32, i32* %7
%55 = load i32, i32* %8
%56 = icmp slt i32 %54, %55
br i1 %56, label %57, label %70
57: ; preds = %53
%58 = load i8*, i8** %4
%59 = load i32, i32* %7
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i8, i8* %58, i64 %60
%62 = load i8, i8* %61
%63 = load i32, i32* %9
%64 = add nsw i32 %63, 1
store i32 %64, i32* %9
%65 = sext i32 %63 to i64
%66 = getelementptr inbounds [100 x i8], [100 x i8]* %10, i64 0, i64 %65
store i8 %62, i8* %66
br label %67
67: ; preds = %57
%68 = load i32, i32* %7
%69 = add nsw i32 %68, 1
store i32 %69, i32* %7
br label %53
70: ; preds = %53
%71 = load i32, i32* %9
%72 = add nsw i32 %71, 1
store i32 %72, i32* %9
%73 = sext i32 %71 to i64
%74 = getelementptr inbounds [100 x i8], [100 x i8]* %10, i64 0, i64 %73
store i8 46, i8* %74
%75 = load i32, i32* %5
store i32 %75, i32* %8
br label %76
76: ; preds = %70, %42
br label %77
77: ; preds = %76, %41
br label %78
78: ; preds = %77
%79 = load i32, i32* %5
%80 = add nsw i32 %79, -1
store i32 %80, i32* %5
br label %16
81: ; preds = %16
%82 = load i32, i32* %5
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds [100 x i8], [100 x i8]* %10, i64 0, i64 %83
store i8 0, i8* %84
%85 = getelementptr inbounds [100 x i8], [100 x i8]* %10, i64 0, i64 0
%86 = call i32 @strcat(i8* %85, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0))
%87 = load i8*, i8** %3
%88 = getelementptr inbounds [100 x i8], [100 x i8]* %10, i64 0, i64 0
%89 = call i32 @changetoDnsFormat(i8* %87, i8* %88)
ret void
}

LLVM IR (-O2):
@.str = [15 x i8] c".in-addr.arpa.\00"
define void @changeIPtoDnsFormat(i8* %0, i8* %1) {
%3 = alloca [100 x i8]
%4 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 0
%5 = tail call i32 @strlen(i8* %1)
%6 = add i32 %5, -1
%7 = icmp sgt i32 %5, 0
br i1 %7, label %8, label %115
8: ; preds = %2
%9 = zext i32 %5 to i64
%10 = xor i32 %5, -1
%11 = zext i32 %6 to i64
%12 = zext i32 %5 to i64
%13 = add nuw nsw i64 %9, 1
br label %14
14: ; preds = %8, %109
%15 = phi i64 [ %11, %8 ], [ %112, %109 ]
%16 = phi i64 [ %9, %8 ], [ %23, %109 ]
%17 = phi i64 [ 0, %8 ], [ %113, %109 ]
%18 = phi i32 [ 0, %8 ], [ %111, %109 ]
%19 = phi i32 [ %5, %8 ], [ %110, %109 ]
%20 = sub nsw i64 %13, %17
%21 = sub nsw i64 %17, %9
%22 = trunc i64 %16 to i32
%23 = add nsw i64 %16, -1
%24 = sub nsw i64 %9, %17
%25 = getelementptr i8, i8* %1, i64 %24
%26 = trunc i64 %17 to i32
%27 = add i32 %26, %10
%28 = icmp eq i64 %15, 0
br i1 %28, label %29, label %36
29: ; preds = %14
%30 = icmp sgt i32 %19, 0
br i1 %30, label %31, label %109
31: ; preds = %29
%32 = sext i32 %18 to i64
%33 = getelementptr [100 x i8], [100 x i8]* %3, i64 0, i64 %32
%34 = zext i32 %19 to i64
%35 = add i32 %18, %19
br label %109
36: ; preds = %14
%37 = getelementptr inbounds i8, i8* %1, i64 %15
%38 = load i8, i8* %37
%39 = icmp eq i8 %38, 46
br i1 %39, label %40, label %109
40: ; preds = %36
%41 = icmp sgt i32 %19, %22
br i1 %41, label %42, label %103
42: ; preds = %40
%43 = sext i32 %18 to i64
%44 = getelementptr [100 x i8], [100 x i8]* %3, i64 0, i64 %43
%45 = add i32 %19, %27
%46 = zext i32 %45 to i64
%47 = add nuw nsw i64 %46, 1
%48 = sext i32 %19 to i64
%49 = call i64 @llvm.smax.i64(i64 %20, i64 %48)
%50 = add i64 %49, %21
%51 = icmp ult i64 %50, 4
br i1 %51, label %91, label %52
52: ; preds = %42
%53 = and i64 %50, -4
%54 = add i64 %16, %53
%55 = insertelement <2 x i64> <i64 poison, i64 0>, i64 %43, i64 0
%56 = add i64 %53, -4
%57 = lshr exact i64 %56, 2
%58 = add nuw nsw i64 %57, 1
%59 = and i64 %58, 7
%60 = icmp ult i64 %56, 28
br i1 %60, label %71, label %61
61: ; preds = %52
%62 = and i64 %58, 9223372036854775800
br label %63
63: ; preds = %63, %61
%64 = phi <2 x i64> [ %55, %61 ], [ %67, %63 ]
%65 = phi <2 x i64> [ zeroinitializer, %61 ], [ %68, %63 ]
%66 = phi i64 [ 0, %61 ], [ %69, %63 ]
%67 = add <2 x i64> %64, <i64 8, i64 8>
%68 = add <2 x i64> %65, <i64 8, i64 8>
%69 = add i64 %66, 8
%70 = icmp eq i64 %69, %62
br i1 %70, label %71, label %63
71: ; preds = %63, %52
%72 = phi <2 x i64> [ undef, %52 ], [ %67, %63 ]
%73 = phi <2 x i64> [ undef, %52 ], [ %68, %63 ]
%74 = phi <2 x i64> [ %55, %52 ], [ %67, %63 ]
%75 = phi <2 x i64> [ zeroinitializer, %52 ], [ %68, %63 ]
%76 = icmp eq i64 %59, 0
br i1 %76, label %85, label %77
77: ; preds = %71, %77
%78 = phi <2 x i64> [ %81, %77 ], [ %74, %71 ]
%79 = phi <2 x i64> [ %82, %77 ], [ %75, %71 ]
%80 = phi i64 [ %83, %77 ], [ 0, %71 ]
%81 = add <2 x i64> %78, <i64 1, i64 1>
%82 = add <2 x i64> %79, <i64 1, i64 1>
%83 = add i64 %80, 1
%84 = icmp eq i64 %83, %59
br i1 %84, label %85, label %77
85: ; preds = %77, %71
%86 = phi <2 x i64> [ %72, %71 ], [ %81, %77 ]
%87 = phi <2 x i64> [ %73, %71 ], [ %82, %77 ]
%88 = add <2 x i64> %87, %86
%89 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %88)
%90 = icmp eq i64 %50, %53
br i1 %90, label %100, label %91
91: ; preds = %42, %85
%92 = phi i64 [ %16, %42 ], [ %54, %85 ]
%93 = phi i64 [ %43, %42 ], [ %89, %85 ]
br label %94
94: ; preds = %91, %94
%95 = phi i64 [ %98, %94 ], [ %92, %91 ]
%96 = phi i64 [ %97, %94 ], [ %93, %91 ]
%97 = add nsw i64 %96, 1
%98 = add nsw i64 %95, 1
%99 = icmp slt i64 %98, %48
br i1 %99, label %94, label %100
100: ; preds = %94, %85
%101 = phi i64 [ %89, %85 ], [ %97, %94 ]
%102 = trunc i64 %101 to i32
br label %103
103: ; preds = %100, %40
%104 = phi i32 [ %18, %40 ], [ %102, %100 ]
%105 = add nsw i32 %104, 1
%106 = sext i32 %104 to i64
%107 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 %106
store i8 46, i8* %107
%108 = trunc i64 %15 to i32
br label %109
109: ; preds = %31, %29, %103, %36
%110 = phi i32 [ %108, %103 ], [ %19, %36 ], [ %19, %29 ], [ %19, %31 ]
%111 = phi i32 [ %105, %103 ], [ %18, %36 ], [ %18, %29 ], [ %35, %31 ]
%112 = add nsw i64 %15, -1
%113 = add nuw nsw i64 %17, 1
%114 = icmp eq i64 %113, %12
br i1 %114, label %115, label %14
115: ; preds = %109, %2
%116 = phi i32 [ %6, %2 ], [ -1, %109 ]
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds [100 x i8], [100 x i8]* %3, i64 0, i64 %117
store i8 0, i8* %118
%119 = call i32 @strcat(i8* %4, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0))
%120 = call i32 @changetoDnsFormat(i8* %0, i8* %4)
ret void
}