#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 */
typedef int /*<<< orphan*/ attr_t;

/* Variables and functions */
int A_BLINK;
int A_REVERSE;
int COLOR_PAIR(int);
int /*<<< orphan*/ addch(int);
int /*<<< orphan*/ attr_get(int /*<<< orphan*/ *, short *,
                            int /*<<< orphan*/ *);
int /*<<< orphan*/ attr_set(int /*<<< orphan*/, short, int /*<<< orphan*/ *);
int /*<<< orphan*/ attron(int);
int /*<<< orphan*/ turn_off_attributes();
void print(int rows, int cols, char m[rows][cols]) {
  int i, j, c, num;
  for (i = 0; i < rows; i++, addch('\n')) {
    for (j = 0; (c = m[i][j]) != '\0'; j++) {
      if (c != "\1"[0] && c != "\2"[0] && c != "\3"[0]) {
        if (c == '\x1B' && m[i][++j] == '[') {
          num = 0;
          while ((c = m[i][++j]) != 'm' && c != ';') {
            num *= 10;
            num += m[i][j] - '0';
          }
          if (c == ';')
            while (m[i][++j] != 'm')
              ;
          if (num == 0)
            turn_off_attributes();
          else if (num == 5)
            attron(A_BLINK | A_REVERSE);
          else
            attron(COLOR_PAIR(num));
        } else {
          if (c == '*') {
            attr_t at;
            short pair;
            attr_get(&at, &pair, NULL);
            turn_off_attributes();
            addch('*');
            attr_set(at, pair, NULL);
          } else
            addch(c);
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<print>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    -0x8(%rbp),%eax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13c8 <print+0x268>
movl   $0x0,-0x18(%rbp)
mov    -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   %rdx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x1c(%rbp)
cmp    $0x0,%eax
je     13ab <print+0x24b>
mov    -0x1c(%rbp),%eax
movsbl 0xe3c(%rip),%ecx
cmp    %ecx,%eax
je     1398 <print+0x238>
mov    -0x1c(%rbp),%eax
movsbl 0xe2c(%rip),%ecx
cmp    %ecx,%eax
je     1398 <print+0x238>
mov    -0x1c(%rbp),%eax
movsbl 0xe1c(%rip),%ecx
cmp    %ecx,%eax
je     1398 <print+0x238>
cmpl   $0x1b,-0x1c(%rbp)
jne    1345 <print+0x1e5>
mov    -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   %rdx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5b,%eax
jne    1345 <print+0x1e5>
movl   $0x0,-0x20(%rbp)
mov    -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   %rdx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
mov    %ecx,-0x1c(%rbp)
xor    %eax,%eax
cmp    $0x6d,%ecx
mov    %al,-0x31(%rbp)
je     126b <print+0x10b>
cmpl   $0x3b,-0x1c(%rbp)
setne  %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    127b <print+0x11b>
jmp    12ab <print+0x14b>
mov    -0x30(%rbp),%rdx
imul   $0xa,-0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   %rdx,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    122d <print+0xcd>
cmpl   $0x3b,-0x1c(%rbp)
jne    12f0 <print+0x190>
jmp    12ba <print+0x15a>
mov    -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   %rdx,%rcx
add    %rcx,%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6d,%eax
je     12eb <print+0x18b>
jmp    12ba <print+0x15a>
jmp    12f0 <print+0x190>
cmpl   $0x0,-0x20(%rbp)
jne    1306 <print+0x1a6>
mov    $0x0,%al
call   1040 <turn_off_attributes@plt>
jmp    1340 <print+0x1e0>
cmpl   $0x5,-0x20(%rbp)
jne    132c <print+0x1cc>
mov    0x2cd1(%rip),%rax
mov    (%rax),%edi
mov    0x2cb8(%rip),%rax
or     (%rax),%edi
call   1060 <attron@plt>
jmp    133b <print+0x1db>
mov    -0x20(%rbp),%edi
call   1070 <COLOR_PAIR@plt>
mov    %eax,%edi
call   1060 <attron@plt>
jmp    1340 <print+0x1e0>
jmp    1393 <print+0x233>
cmpl   $0x2a,-0x1c(%rbp)
jne    1386 <print+0x226>
lea    -0x24(%rbp),%rdi
lea    -0x26(%rbp),%rsi
xor    %eax,%eax
mov    %eax,%edx
call   1050 <attr_get@plt>
mov    $0x0,%al
call   1040 <turn_off_attributes@plt>
mov    $0x2a,%edi
call   1080 <addch@plt>
mov    -0x24(%rbp),%edi
xor    %eax,%eax
mov    %eax,%edx
movswl -0x26(%rbp),%esi
call   1030 <attr_set@plt>
jmp    138e <print+0x22e>
mov    -0x1c(%rbp),%edi
call   1080 <addch@plt>
jmp    1393 <print+0x233>
jmp    1398 <print+0x238>
jmp    139d <print+0x23d>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1193 <print+0x33>
jmp    13b0 <print+0x250>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    $0xa,%edi
call   1080 <addch@plt>
jmp    1180 <print+0x20>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<print>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rdx,0x8(%rsp)
test   %edi,%edi
jle    12fd <print+0x19d>
mov    %esi,%eax
movabs $0x100000000,%rbx
mov    %edi,%ecx
mov    %rcx,0x10(%rsp)
lea    0xe6b(%rip),%rbp
lea    0x2(%rsp),%r13
mov    0x8(%rsp),%r14
xor    %r12d,%r12d
mov    %rax,0x18(%rsp)
jmp    11d6 <print+0x76>
nopl   0x0(%rax)
mov    0x20(%rsp),%r12
add    $0x1,%r12
mov    $0xa,%edi
call   1080 <addch@plt>
mov    0x18(%rsp),%rax
add    %rax,%r14
cmp    0x10(%rsp),%r12
je     12fd <print+0x19d>
mov    %r12,0x20(%rsp)
imul   %rax,%r12
add    0x8(%rsp),%r12
xor    %r15d,%r15d
jmp    11fc <print+0x9c>
nopl   0x0(%rax)
movsbl %al,%edi
call   1080 <addch@plt>
add    $0x1,%r15d
movslq %r15d,%rcx
movzbl (%r12,%rcx,1),%eax
cmp    $0x2a,%rax
ja     11f0 <print+0x90>
movslq 0x0(%rbp,%rax,4),%rdx
add    %rbp,%rdx
jmp    *%rdx
lea    0x1(%rcx),%r15
cmpb   $0x5b,0x1(%r12,%rcx,1)
jne    11f0 <print+0x90>
lea    0x1(%r15),%rcx
shl    $0x20,%r15
add    %rbx,%r15
xor    %edi,%edi
mov    %r15,%rax
mov    %rcx,%r15
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl (%r14,%r15,1),%ecx
cmp    $0x6d,%ecx
je     12af <print+0x14f>
cmp    $0x3b,%cl
je     129a <print+0x13a>
lea    (%rdi,%rdi,4),%edx
lea    (%rcx,%rdx,2),%edi
add    $0xffffffd0,%edi
add    $0x1,%r15
add    %rbx,%rax
jmp    1240 <print+0xe0>
lea    0x4(%rsp),%rdi
mov    %r13,%rsi
xor    %edx,%edx
call   1050 <attr_get@plt>
xor    %eax,%eax
call   1040 <turn_off_attributes@plt>
mov    $0x2a,%edi
call   1080 <addch@plt>
mov    0x4(%rsp),%edi
movswl 0x2(%rsp),%esi
xor    %edx,%edx
call   1030 <attr_set@plt>
add    $0x1,%r15d
jmp    11fc <print+0x9c>
sar    $0x20,%rax
xchg   %ax,%ax
lea    0x1(%rax),%r15
cmpb   $0x6d,0x1(%r14,%rax,1)
mov    %r15,%rax
jne    12a0 <print+0x140>
cmp    $0x5,%edi
je     12c8 <print+0x168>
test   %edi,%edi
jne    12e8 <print+0x188>
xor    %eax,%eax
call   1040 <turn_off_attributes@plt>
add    $0x1,%r15d
jmp    11fc <print+0x9c>
mov    0x2d09(%rip),%rax
mov    (%rax),%edi
mov    0x2d10(%rip),%rax
or     (%rax),%edi
call   1060 <attron@plt>
add    $0x1,%r15d
jmp    11fc <print+0x9c>
call   1070 <COLOR_PAIR@plt>
mov    %eax,%edi
call   1060 <attron@plt>
add    $0x1,%r15d
jmp    11fc <print+0x9c>
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [2 x i8] c"\01\00"
@.str.1 = [2 x i8] c"\02\00"
@.str.2 = [2 x i8] c"\03\00"
@A_BLINK = global i32 0
@A_REVERSE = global i32 0
define void @print(i32 %0, i32 %1, i8* %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i16
store i32 %0, i32* %4
store i32 %1, i32* %5
store i8* %2, i8** %6
%13 = load i32, i32* %4
%14 = zext i32 %13 to i64
%15 = load i32, i32* %5
%16 = zext i32 %15 to i64
store i32 0, i32* %7
br label %17
17: ; preds = %158, %3
%18 = load i32, i32* %7
%19 = load i32, i32* %4
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %162
21: ; preds = %17
store i32 0, i32* %8
br label %22
22: ; preds = %154, %21
%23 = load i8*, i8** %6
%24 = load i32, i32* %7
%25 = sext i32 %24 to i64
%26 = mul nsw i64 %25, %16
%27 = getelementptr inbounds i8, i8* %23, i64 %26
%28 = load i32, i32* %8
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %27, i64 %29
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
store i32 %32, i32* %9
%33 = icmp ne i32 %32, 0
br i1 %33, label %34, label %157
34: ; preds = %22
%35 = load i32, i32* %9
%36 = load i8, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0)
%37 = sext i8 %36 to i32
%38 = icmp ne i32 %35, %37
br i1 %38, label %39, label %153
39: ; preds = %34
%40 = load i32, i32* %9
%41 = load i8, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0)
%42 = sext i8 %41 to i32
%43 = icmp ne i32 %40, %42
br i1 %43, label %44, label %153
44: ; preds = %39
%45 = load i32, i32* %9
%46 = load i8, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0)
%47 = sext i8 %46 to i32
%48 = icmp ne i32 %45, %47
br i1 %48, label %49, label %153
49: ; preds = %44
%50 = load i32, i32* %9
%51 = icmp eq i32 %50, 27
br i1 %51, label %52, label %138
52: ; preds = %49
%53 = load i8*, i8** %6
%54 = load i32, i32* %7
%55 = sext i32 %54 to i64
%56 = mul nsw i64 %55, %16
%57 = getelementptr inbounds i8, i8* %53, i64 %56
%58 = load i32, i32* %8
%59 = add nsw i32 %58, 1
store i32 %59, i32* %8
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i8, i8* %57, i64 %60
%62 = load i8, i8* %61
%63 = sext i8 %62 to i32
%64 = icmp eq i32 %63, 91
br i1 %64, label %65, label %138
65: ; preds = %52
store i32 0, i32* %10
br label %66
66: ; preds = %84, %65
%67 = load i8*, i8** %6
%68 = load i32, i32* %7
%69 = sext i32 %68 to i64
%70 = mul nsw i64 %69, %16
%71 = getelementptr inbounds i8, i8* %67, i64 %70
%72 = load i32, i32* %8
%73 = add nsw i32 %72, 1
store i32 %73, i32* %8
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8, i8* %71, i64 %74
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
store i32 %77, i32* %9
%78 = icmp ne i32 %77, 109
br i1 %78, label %79, label %82
79: ; preds = %66
%80 = load i32, i32* %9
%81 = icmp ne i32 %80, 59
br label %82
82: ; preds = %79, %66
%83 = phi i1 [ false, %66 ], [ %81, %79 ]
br i1 %83, label %84, label %100
84: ; preds = %82
%85 = load i32, i32* %10
%86 = mul nsw i32 %85, 10
store i32 %86, i32* %10
%87 = load i8*, i8** %6
%88 = load i32, i32* %7
%89 = sext i32 %88 to i64
%90 = mul nsw i64 %89, %16
%91 = getelementptr inbounds i8, i8* %87, i64 %90
%92 = load i32, i32* %8
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %91, i64 %93
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = sub nsw i32 %96, 48
%98 = load i32, i32* %10
%99 = add nsw i32 %98, %97
store i32 %99, i32* %10
br label %66
100: ; preds = %82
%101 = load i32, i32* %9
%102 = icmp eq i32 %101, 59
br i1 %102, label %103, label %119
103: ; preds = %100
br label %104
104: ; preds = %117, %103
%105 = load i8*, i8** %6
%106 = load i32, i32* %7
%107 = sext i32 %106 to i64
%108 = mul nsw i64 %107, %16
%109 = getelementptr inbounds i8, i8* %105, i64 %108
%110 = load i32, i32* %8
%111 = add nsw i32 %110, 1
store i32 %111, i32* %8
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds i8, i8* %109, i64 %112
%114 = load i8, i8* %113
%115 = sext i8 %114 to i32
%116 = icmp ne i32 %115, 109
br i1 %116, label %117, label %118
117: ; preds = %104
br label %104
118: ; preds = %104
br label %119
119: ; preds = %118, %100
%120 = load i32, i32* %10
%121 = icmp eq i32 %120, 0
br i1 %121, label %122, label %124
122: ; preds = %119
%123 = call i32 (...) @turn_off_attributes()
br label %137
124: ; preds = %119
%125 = load i32, i32* %10
%126 = icmp eq i32 %125, 5
br i1 %126, label %127, label %132
127: ; preds = %124
%128 = load i32, i32* @A_BLINK
%129 = load i32, i32* @A_REVERSE
%130 = or i32 %128, %129
%131 = call i32 @attron(i32 %130)
br label %136
132: ; preds = %124
%133 = load i32, i32* %10
%134 = call i32 @COLOR_PAIR(i32 %133)
%135 = call i32 @attron(i32 %134)
br label %136
136: ; preds = %132, %127
br label %137
137: ; preds = %136, %122
br label %152
138: ; preds = %52, %49
%139 = load i32, i32* %9
%140 = icmp eq i32 %139, 42
br i1 %140, label %141, label %148
141: ; preds = %138
%142 = call i32 @attr_get(i32* %11, i16* %12, i32* null)
%143 = call i32 (...) @turn_off_attributes()
%144 = call i32 @addch(i32 42)
%145 = load i32, i32* %11
%146 = load i16, i16* %12
%147 = call i32 @attr_set(i32 %145, i16 signext %146, i32* null)
br label %151
148: ; preds = %138
%149 = load i32, i32* %9
%150 = call i32 @addch(i32 %149)
br label %151
151: ; preds = %148, %141
br label %152
152: ; preds = %151, %137
br label %153
153: ; preds = %152, %44, %39, %34
br label %154
154: ; preds = %153
%155 = load i32, i32* %8
%156 = add nsw i32 %155, 1
store i32 %156, i32* %8
br label %22
157: ; preds = %22
br label %158
158: ; preds = %157
%159 = load i32, i32* %7
%160 = add nsw i32 %159, 1
store i32 %160, i32* %7
%161 = call i32 @addch(i32 10)
br label %17
162: ; preds = %17
ret void
}

LLVM IR (-O2):
@A_BLINK = global i32 0
@A_REVERSE = global i32 0
define void @print(i32 %0, i32 %1, i8* nocapture %2) {
%4 = alloca i32
%5 = alloca i16
%6 = zext i32 %1 to i64
%7 = icmp sgt i32 %0, 0
br i1 %7, label %8, label %78
8: ; preds = %3
%9 = bitcast i32* %4 to i8*
%10 = bitcast i16* %5 to i8*
%11 = zext i32 %0 to i64
br label %12
12: ; preds = %8, %74
%13 = phi i64 [ 0, %8 ], [ %75, %74 ]
%14 = mul nuw nsw i64 %13, %6
%15 = getelementptr inbounds i8, i8* %2, i64 %14
br label %16
16: ; preds = %12, %71
%17 = phi i32 [ %73, %71 ], [ 0, %12 ]
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %15, i64 %18
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
switch i8 %20, label %68 [
i8 0, label %74
i8 1, label %71
i8 2, label %71
i8 3, label %71
i8 27, label %22
i8 42, label %61
]
22: ; preds = %16
%23 = add nsw i32 %17, 1
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %15, i64 %24
%26 = load i8, i8* %25
%27 = icmp eq i8 %26, 91
br i1 %27, label %28, label %68
28: ; preds = %22, %37
%29 = phi i64 [ %31, %37 ], [ %24, %22 ]
%30 = phi i32 [ %41, %37 ], [ 0, %22 ]
%31 = add i64 %29, 1
%32 = getelementptr inbounds i8, i8* %15, i64 %31
%33 = load i8, i8* %32
switch i8 %33, label %37 [
i8 59, label %34
i8 109, label %48
]
34: ; preds = %28
%35 = shl i64 %31, 32
%36 = ashr exact i64 %35, 32
br label %42
37: ; preds = %28
%38 = sext i8 %33 to i32
%39 = mul nsw i32 %30, 10
%40 = add i32 %39, -48
%41 = add i32 %40, %38
br label %28
42: ; preds = %34, %42
%43 = phi i64 [ %36, %34 ], [ %44, %42 ]
%44 = add nsw i64 %43, 1
%45 = getelementptr inbounds i8, i8* %15, i64 %44
%46 = load i8, i8* %45
%47 = icmp eq i8 %46, 109
br i1 %47, label %48, label %42
48: ; preds = %28, %42
%49 = phi i64 [ %44, %42 ], [ %31, %28 ]
%50 = trunc i64 %49 to i32
switch i32 %30, label %58 [
i32 0, label %51
i32 5, label %53
]
51: ; preds = %48
%52 = call i32 (...) @turn_off_attributes()
br label %71
53: ; preds = %48
%54 = load i32, i32* @A_BLINK
%55 = load i32, i32* @A_REVERSE
%56 = or i32 %55, %54
%57 = call i32 @attron(i32 %56)
br label %71
58: ; preds = %48
%59 = call i32 @COLOR_PAIR(i32 %30)
%60 = call i32 @attron(i32 %59)
br label %71
61: ; preds = %16
%62 = call i32 @attr_get(i32* %4, i16* %5, i32* null)
%63 = call i32 (...) @turn_off_attributes()
%64 = call i32 @addch(i32 42)
%65 = load i32, i32* %4
%66 = load i16, i16* %5
%67 = call i32 @attr_set(i32 %65, i16 signext %66, i32* null)
br label %71
68: ; preds = %16, %22
%69 = phi i32 [ %23, %22 ], [ %17, %16 ]
%70 = call i32 @addch(i32 %21)
br label %71
71: ; preds = %16, %16, %16, %61, %68, %51, %58, %53
%72 = phi i32 [ %50, %51 ], [ %50, %53 ], [ %50, %58 ], [ %17, %61 ], [ %69, %68 ], [ %17, %16 ], [ %17, %16 ], [ %17, %16 ]
%73 = add nsw i32 %72, 1
br label %16
74: ; preds = %16
%75 = add nuw nsw i64 %13, 1
%76 = call i32 @addch(i32 10)
%77 = icmp eq i64 %75, %11
br i1 %77, label %78, label %12
78: ; preds = %74, %3
ret void
}