#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*/ printf(char *, ...);
int /*<<< orphan*/ strcpy(char *, char *);
int main(int argc, char *argv[]) {
  char input[15], inpst[12], outst[12], state = 'P';
  int i = 0, j;
  char *str = argv[1];
  strcpy(input, "abcabcabcabc");
  strcpy(inpst, "PPPQQQRRRSSS");
  strcpy(outst, "QPPQRPQPSQPP");
  printf("\nInput string is:%s \n", str);
  while (*str != '\0') {
    for (j = 0; j < 12; j++) {
      if (inpst[j] == state && input[j] == *str) {
        state = outst[j];
        break;
      }
    }
    if (j == 12) {
      state = 'F';
      break;
    }
    str++;
  }
  if (state == 'S')
    printf("\nValid String \n");
  else
    printf("\nInvalid String \n");
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movb   $0x50,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x48(%rbp)
lea    -0x1f(%rbp),%rdi
lea    0xea8(%rip),%rsi
call   1030 <strcpy@plt>
lea    -0x2b(%rbp),%rdi
lea    0xea5(%rip),%rsi
call   1030 <strcpy@plt>
lea    -0x37(%rbp),%rdi
lea    0xea2(%rip),%rsi
call   1030 <strcpy@plt>
mov    -0x48(%rbp),%rsi
lea    0xe9f(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1224 <main+0x104>
movl   $0x0,-0x40(%rbp)
cmpl   $0xc,-0x40(%rbp)
jge    1200 <main+0xe0>
movslq -0x40(%rbp),%rax
movsbl -0x2b(%rbp,%rax,1),%eax
movsbl -0x38(%rbp),%ecx
cmp    %ecx,%eax
jne    11ed <main+0xcd>
movslq -0x40(%rbp),%rax
movsbl -0x1f(%rbp,%rax,1),%eax
mov    -0x48(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    11ed <main+0xcd>
movslq -0x40(%rbp),%rax
mov    -0x37(%rbp,%rax,1),%al
mov    %al,-0x38(%rbp)
jmp    1200 <main+0xe0>
jmp    11f2 <main+0xd2>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    11a6 <main+0x86>
cmpl   $0xc,-0x40(%rbp)
jne    1213 <main+0xf3>
movb   $0x46,-0x38(%rbp)
jmp    1224 <main+0x104>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    118f <main+0x6f>
movsbl -0x38(%rbp),%eax
cmp    $0x53,%eax
jne    1244 <main+0x124>
lea    0xe05(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1252 <main+0x132>
lea    0xe02(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    0x8(%rsi),%rbx
lea    0xeb7(%rip),%rsi
lea    0x1d(%rsp),%rdi
call   1030 <strcpy@plt>
lea    0xeb3(%rip),%rsi
lea    0x11(%rsp),%rdi
call   1030 <strcpy@plt>
lea    0xeaf(%rip),%rsi
lea    0x2c(%rsp),%rdi
call   1030 <strcpy@plt>
lea    0xeab(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1050 <printf@plt>
mov    (%rbx),%cl
test   %cl,%cl
je     1350 <main+0x220>
mov    0x11(%rsp),%al
mov    0x12(%rsp),%r10b
mov    0x1d(%rsp),%r15b
mov    0x1e(%rsp),%sil
mov    0x13(%rsp),%dil
mov    0x1f(%rsp),%r8b
mov    0x14(%rsp),%r9b
mov    0x20(%rsp),%r11b
mov    0x15(%rsp),%bpl
mov    0x21(%rsp),%r14b
mov    0x16(%rsp),%dl
mov    %dl,0x10(%rsp)
mov    0x22(%rsp),%dl
mov    %dl,0xf(%rsp)
mov    0x17(%rsp),%dl
mov    %dl,0xe(%rsp)
mov    0x23(%rsp),%dl
mov    %dl,0xd(%rsp)
mov    0x18(%rsp),%dl
mov    %dl,0xc(%rsp)
mov    0x24(%rsp),%dl
mov    %dl,0xb(%rsp)
mov    0x19(%rsp),%dl
mov    %dl,0xa(%rsp)
add    $0x1,%rbx
mov    0x25(%rsp),%dl
mov    %dl,0x9(%rsp)
mov    0x1a(%rsp),%dl
mov    %dl,0x8(%rsp)
mov    0x26(%rsp),%dl
mov    %dl,0x7(%rsp)
mov    0x1b(%rsp),%dl
mov    %dl,0x6(%rsp)
mov    0x27(%rsp),%dl
mov    %dl,0x5(%rsp)
mov    0x1c(%rsp),%dl
mov    %dl,0x3(%rsp)
mov    0x28(%rsp),%dl
mov    %dl,0x4(%rsp)
mov    $0x50,%r13b
jmp    1258 <main+0x128>
nopw   0x0(%rax,%rax,1)
xor    %r12d,%r12d
movzbl 0x2c(%rsp,%r12,1),%r13d
movzbl (%rbx),%ecx
add    $0x1,%rbx
test   %cl,%cl
je     1341 <main+0x211>
cmp    %r13b,%al
jne    1262 <main+0x132>
cmp    %cl,%r15b
je     1240 <main+0x110>
cmp    %r13b,%r10b
jne    1272 <main+0x142>
mov    $0x1,%r12d
cmp    %cl,%sil
je     1243 <main+0x113>
cmp    %r13b,%dil
jne    1282 <main+0x152>
mov    $0x2,%r12d
cmp    %cl,%r8b
je     1243 <main+0x113>
cmp    %r13b,%r9b
jne    1292 <main+0x162>
mov    $0x3,%r12d
cmp    %cl,%r11b
je     1243 <main+0x113>
cmp    %r13b,%bpl
jne    12a2 <main+0x172>
mov    $0x4,%r12d
cmp    %cl,%r14b
je     1243 <main+0x113>
cmp    %r13b,0x10(%rsp)
jne    12b5 <main+0x185>
mov    $0x5,%r12d
cmp    %cl,0xf(%rsp)
je     1243 <main+0x113>
cmp    %r13b,0xe(%rsp)
jne    12cc <main+0x19c>
mov    $0x6,%r12d
cmp    %cl,0xd(%rsp)
je     1243 <main+0x113>
cmp    %r13b,0xc(%rsp)
jne    12e3 <main+0x1b3>
mov    $0x7,%r12d
cmp    %cl,0xb(%rsp)
je     1243 <main+0x113>
cmp    %r13b,0xa(%rsp)
jne    12fa <main+0x1ca>
mov    $0x8,%r12d
cmp    %cl,0x9(%rsp)
je     1243 <main+0x113>
cmp    %r13b,0x8(%rsp)
jne    1311 <main+0x1e1>
mov    $0x9,%r12d
cmp    %cl,0x7(%rsp)
je     1243 <main+0x113>
cmp    %r13b,0x6(%rsp)
jne    1328 <main+0x1f8>
mov    $0xa,%r12d
cmp    %cl,0x5(%rsp)
je     1243 <main+0x113>
cmp    %r13b,0x3(%rsp)
jne    1350 <main+0x220>
mov    $0xb,%r12d
cmp    %cl,0x4(%rsp)
je     1243 <main+0x113>
jmp    1350 <main+0x220>
cmp    $0x53,%r13b
jne    1350 <main+0x220>
lea    0xd00(%rip),%rdi
jmp    1357 <main+0x227>
lea    0xce6(%rip),%rdi
call   1040 <puts@plt>
xor    %eax,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [13 x i8] c"abcabcabcabc\00"
@.str.1 = [13 x i8] c"PPPQQQRRRSSS\00"
@.str.2 = [13 x i8] c"QPPQRPQPSQPP\00"
@.str.3 = [22 x i8] c"\0AInput string is:%s \0A\00"
@.str.4 = [16 x i8] c"\0AValid String \0A\00"
@.str.5 = [18 x i8] c"\0AInvalid String \0A\00"
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca [15 x i8]
%7 = alloca [12 x i8]
%8 = alloca [12 x i8]
%9 = alloca i8
%10 = alloca i32
%11 = alloca i32
%12 = alloca i8*
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
store i8 80, i8* %9
store i32 0, i32* %10
%13 = load i8**, i8*** %5
%14 = getelementptr inbounds i8*, i8** %13, i64 1
%15 = load i8*, i8** %14
store i8* %15, i8** %12
%16 = getelementptr inbounds [15 x i8], [15 x i8]* %6, i64 0, i64 0
%17 = call i32 @strcpy(i8* %16, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i64 0, i64 0))
%18 = getelementptr inbounds [12 x i8], [12 x i8]* %7, i64 0, i64 0
%19 = call i32 @strcpy(i8* %18, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i64 0, i64 0))
%20 = getelementptr inbounds [12 x i8], [12 x i8]* %8, i64 0, i64 0
%21 = call i32 @strcpy(i8* %20, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i64 0, i64 0))
%22 = load i8*, i8** %12
%23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.3, i64 0, i64 0), i8* %22)
br label %24
24: ; preds = %65, %2
%25 = load i8*, i8** %12
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = icmp ne i32 %27, 0
br i1 %28, label %29, label %68
29: ; preds = %24
store i32 0, i32* %11
br label %30
30: ; preds = %58, %29
%31 = load i32, i32* %11
%32 = icmp slt i32 %31, 12
br i1 %32, label %33, label %61
33: ; preds = %30
%34 = load i32, i32* %11
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds [12 x i8], [12 x i8]* %7, i64 0, i64 %35
%37 = load i8, i8* %36
%38 = sext i8 %37 to i32
%39 = load i8, i8* %9
%40 = sext i8 %39 to i32
%41 = icmp eq i32 %38, %40
br i1 %41, label %42, label %57
42: ; preds = %33
%43 = load i32, i32* %11
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [15 x i8], [15 x i8]* %6, i64 0, i64 %44
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = load i8*, i8** %12
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = icmp eq i32 %47, %50
br i1 %51, label %52, label %57
52: ; preds = %42
%53 = load i32, i32* %11
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [12 x i8], [12 x i8]* %8, i64 0, i64 %54
%56 = load i8, i8* %55
store i8 %56, i8* %9
br label %61
57: ; preds = %42, %33
br label %58
58: ; preds = %57
%59 = load i32, i32* %11
%60 = add nsw i32 %59, 1
store i32 %60, i32* %11
br label %30
61: ; preds = %52, %30
%62 = load i32, i32* %11
%63 = icmp eq i32 %62, 12
br i1 %63, label %64, label %65
64: ; preds = %61
store i8 70, i8* %9
br label %68
65: ; preds = %61
%66 = load i8*, i8** %12
%67 = getelementptr inbounds i8, i8* %66, i32 1
store i8* %67, i8** %12
br label %24
68: ; preds = %64, %24
%69 = load i8, i8* %9
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 83
br i1 %71, label %72, label %74
72: ; preds = %68
%73 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0))
br label %76
74: ; preds = %68
%75 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.5, i64 0, i64 0))
br label %76
76: ; preds = %74, %72
ret i32 0
}

LLVM IR (-O2):
@.str = [13 x i8] c"abcabcabcabc\00"
@.str.1 = [13 x i8] c"PPPQQQRRRSSS\00"
@.str.2 = [13 x i8] c"QPPQRPQPSQPP\00"
@.str.3 = [22 x i8] c"\0AInput string is:%s \0A\00"
@str = [17 x i8] c"\0AInvalid String \00"
@str.6 = [15 x i8] c"\0AValid String \00"
define i32 @main(i32 %0, i8** nocapture %1) {
%3 = alloca [15 x i8]
%4 = alloca [12 x i8]
%5 = alloca [12 x i8]
%6 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 0
%7 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 0
%8 = getelementptr inbounds [12 x i8], [12 x i8]* %5, i64 0, i64 0
%9 = getelementptr inbounds i8*, i8** %1, i64 1
%10 = load i8*, i8** %9
%11 = call i32 @strcpy(i8* %6, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i64 0, i64 0))
%12 = call i32 @strcpy(i8* %7, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i64 0, i64 0))
%13 = call i32 @strcpy(i8* %8, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2, i64 0, i64 0))
%14 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([22 x i8], [22 x i8]* @.str.3, i64 0, i64 0), i8* %10)
%15 = load i8, i8* %10
%16 = icmp eq i8 %15, 0
br i1 %16, label %124, label %17
17: ; preds = %2
%18 = load i8, i8* %7
%19 = load i8, i8* %6
%20 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 1
%21 = load i8, i8* %20
%22 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 1
%23 = load i8, i8* %22
%24 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 2
%25 = load i8, i8* %24
%26 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 2
%27 = load i8, i8* %26
%28 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 3
%29 = load i8, i8* %28
%30 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 3
%31 = load i8, i8* %30
%32 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 4
%33 = load i8, i8* %32
%34 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 4
%35 = load i8, i8* %34
%36 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 5
%37 = load i8, i8* %36
%38 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 5
%39 = load i8, i8* %38
%40 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 6
%41 = load i8, i8* %40
%42 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 6
%43 = load i8, i8* %42
%44 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 7
%45 = load i8, i8* %44
%46 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 7
%47 = load i8, i8* %46
%48 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 8
%49 = load i8, i8* %48
%50 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 8
%51 = load i8, i8* %50
%52 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 9
%53 = load i8, i8* %52
%54 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 9
%55 = load i8, i8* %54
%56 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 10
%57 = load i8, i8* %56
%58 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 10
%59 = load i8, i8* %58
%60 = getelementptr inbounds [12 x i8], [12 x i8]* %4, i64 0, i64 11
%61 = load i8, i8* %60
%62 = getelementptr inbounds [15 x i8], [15 x i8]* %3, i64 0, i64 11
%63 = load i8, i8* %62
br label %64
64: ; preds = %17, %115
%65 = phi i8 [ %120, %115 ], [ %15, %17 ]
%66 = phi i8* [ %119, %115 ], [ %10, %17 ]
%67 = phi i8 [ %118, %115 ], [ 80, %17 ]
%68 = icmp eq i8 %18, %67
%69 = icmp eq i8 %19, %65
%70 = select i1 %68, i1 %69, i1 false
br i1 %70, label %115, label %71
71: ; preds = %64
%72 = icmp eq i8 %21, %67
%73 = icmp eq i8 %23, %65
%74 = select i1 %72, i1 %73, i1 false
br i1 %74, label %115, label %75
75: ; preds = %71
%76 = icmp eq i8 %25, %67
%77 = icmp eq i8 %27, %65
%78 = select i1 %76, i1 %77, i1 false
br i1 %78, label %115, label %79
79: ; preds = %75
%80 = icmp eq i8 %29, %67
%81 = icmp eq i8 %31, %65
%82 = select i1 %80, i1 %81, i1 false
br i1 %82, label %115, label %83
83: ; preds = %79
%84 = icmp eq i8 %33, %67
%85 = icmp eq i8 %35, %65
%86 = select i1 %84, i1 %85, i1 false
br i1 %86, label %115, label %87
87: ; preds = %83
%88 = icmp eq i8 %37, %67
%89 = icmp eq i8 %39, %65
%90 = select i1 %88, i1 %89, i1 false
br i1 %90, label %115, label %91
91: ; preds = %87
%92 = icmp eq i8 %41, %67
%93 = icmp eq i8 %43, %65
%94 = select i1 %92, i1 %93, i1 false
br i1 %94, label %115, label %95
95: ; preds = %91
%96 = icmp eq i8 %45, %67
%97 = icmp eq i8 %47, %65
%98 = select i1 %96, i1 %97, i1 false
br i1 %98, label %115, label %99
99: ; preds = %95
%100 = icmp eq i8 %49, %67
%101 = icmp eq i8 %51, %65
%102 = select i1 %100, i1 %101, i1 false
br i1 %102, label %115, label %103
103: ; preds = %99
%104 = icmp eq i8 %53, %67
%105 = icmp eq i8 %55, %65
%106 = select i1 %104, i1 %105, i1 false
br i1 %106, label %115, label %107
107: ; preds = %103
%108 = icmp eq i8 %57, %67
%109 = icmp eq i8 %59, %65
%110 = select i1 %108, i1 %109, i1 false
br i1 %110, label %115, label %111
111: ; preds = %107
%112 = icmp eq i8 %61, %67
%113 = icmp eq i8 %63, %65
%114 = select i1 %112, i1 %113, i1 false
br i1 %114, label %115, label %124
115: ; preds = %111, %107, %103, %99, %95, %91, %87, %83, %79, %75, %71, %64
%116 = phi i64 [ 0, %64 ], [ 1, %71 ], [ 2, %75 ], [ 3, %79 ], [ 4, %83 ], [ 5, %87 ], [ 6, %91 ], [ 7, %95 ], [ 8, %99 ], [ 9, %103 ], [ 10, %107 ], [ 11, %111 ]
%117 = getelementptr inbounds [12 x i8], [12 x i8]* %5, i64 0, i64 %116
%118 = load i8, i8* %117
%119 = getelementptr inbounds i8, i8* %66, i64 1
%120 = load i8, i8* %119
%121 = icmp eq i8 %120, 0
br i1 %121, label %122, label %64
122: ; preds = %115
%123 = icmp eq i8 %118, 83
br i1 %123, label %125, label %124
124: ; preds = %111, %2, %122
br label %125
125: ; preds = %122, %124
%126 = phi i8* [ getelementptr inbounds ([17 x i8], [17 x i8]* @str, i64 0, i64 0), %124 ], [ getelementptr inbounds ([15 x i8], [15 x i8]* @str.6, i64 0, i64 0), %122 ]
%127 = call i32 @puts(i8* dereferenceable(1) %126)
ret i32 0
}