disp_wall_char(row, col) int row, col;
{
  int graph_type;
  static int col_off[] = {0, 1, 0, -1};
  static int row_off[] = {-1, 0, 1, 0};
  int i, j;
  graph_type = 0;
  for (i = 0; i < 4; i++) {
    if ((row + row_off[i] >= 0) && (col + col_off[i] >= 0) &&
        (row + row_off[i] < 23) && (col + col_off[i] < 80)) {
      if (is_wall(row + row_off[i], col + col_off[i]) == 0) {
        graph_type = graph_type | (unsigned int)(1 << i);
      }
    }
  }
  switch (graph_type) {
  case 0:
  case 2:
  case 8:
  case 10:
    display_horiz_line();
    break;
  case 1:
  case 4:
  case 5:
    display_vert_line();
    break;
  case 9:
    display_upper_left_angle();
    break;
  case 3:
    display_upper_right_angle();
    break;
  case 6:
    display_lower_right_angle();
    break;
  case 12:
    display_lower_left_angle();
    break;
  case 13:
    display_vert_and_left_line();
    break;
  case 11:
    display_hor_and_upper_vert_line();
    break;
  case 7:
    display_vert_and_right_line();
    break;
  case 14:
    display_hor_and_bottom_vert_line();
    break;
  case 15:
    display_hor_and_vert_line();
    break;
  default:
    printf("?");
    break;
  }
}


x86 assembly (clang, -O0):
<disp_wall_char>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x4,-0x14(%rbp)
jge    12bc <disp_wall_char+0xec>
mov    -0x8(%rbp),%eax
movslq -0x14(%rbp),%rdx
lea    0x2e9c(%rip),%rcx
add    (%rcx,%rdx,4),%eax
cmp    $0x0,%eax
jl     12a9 <disp_wall_char+0xd9>
mov    -0xc(%rbp),%eax
movslq -0x14(%rbp),%rdx
lea    0x2e72(%rip),%rcx
add    (%rcx,%rdx,4),%eax
cmp    $0x0,%eax
jl     12a9 <disp_wall_char+0xd9>
mov    -0x8(%rbp),%eax
movslq -0x14(%rbp),%rdx
lea    0x2e68(%rip),%rcx
add    (%rcx,%rdx,4),%eax
cmp    $0x17,%eax
jge    12a9 <disp_wall_char+0xd9>
mov    -0xc(%rbp),%eax
movslq -0x14(%rbp),%rdx
lea    0x2e3e(%rip),%rcx
add    (%rcx,%rdx,4),%eax
cmp    $0x50,%eax
jge    12a9 <disp_wall_char+0xd9>
mov    -0x8(%rbp),%edi
movslq -0x14(%rbp),%rcx
lea    0x2e34(%rip),%rax
add    (%rax,%rcx,4),%edi
mov    -0xc(%rbp),%esi
movslq -0x14(%rbp),%rcx
lea    0x2e13(%rip),%rax
add    (%rax,%rcx,4),%esi
mov    $0x0,%al
call   10a0 <is_wall@plt>
cmp    $0x0,%eax
jne    12a4 <disp_wall_char+0xd4>
mov    -0x10(%rbp),%eax
mov    -0x14(%rbp),%ecx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
mov    %eax,-0x10(%rbp)
jmp    12a9 <disp_wall_char+0xd9>
jmp    12ae <disp_wall_char+0xde>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11ec <disp_wall_char+0x1c>
mov    -0x10(%rbp),%eax
mov    %rax,-0x20(%rbp)
sub    $0xf,%rax
ja     1365 <disp_wall_char+0x195>
mov    -0x20(%rbp),%rax
lea    0xd28(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    $0x0,%al
call   1060 <display_horiz_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   1070 <display_vert_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   10b0 <display_upper_left_angle@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   1050 <display_upper_right_angle@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   10c0 <display_lower_right_angle@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   1090 <display_lower_left_angle@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   1040 <display_vert_and_left_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   10d0 <display_hor_and_upper_vert_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   10e0 <display_vert_and_right_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   10f0 <display_hor_and_bottom_vert_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
mov    $0x0,%al
call   1080 <display_hor_and_vert_line@plt>
jmp    1373 <disp_wall_char+0x1a3>
lea    0xcd4(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<disp_wall_char>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %esi,%ebx
mov    %edi,%r14d
xor    %r15d,%r15d
test   %edi,%edi
jle    1209 <disp_wall_char+0x39>
cmp    $0x4f,%ebx
jg     1212 <disp_wall_char+0x42>
test   %ebx,%ebx
js     1212 <disp_wall_char+0x42>
lea    -0x1(%r14),%edi
cmp    $0x16,%edi
ja     1212 <disp_wall_char+0x42>
mov    %ebx,%esi
xor    %eax,%eax
call   10a0 <is_wall@plt>
xor    %r15d,%r15d
test   %eax,%eax
sete   %r15b
jmp    1212 <disp_wall_char+0x42>
test   %r14d,%r14d
js     12ab <disp_wall_char+0xdb>
lea    0x1(%rbx),%esi
cmp    $0x4f,%esi
ja     1237 <disp_wall_char+0x67>
cmp    $0x16,%r14d
ja     1237 <disp_wall_char+0x67>
mov    %r14d,%edi
xor    %eax,%eax
call   10a0 <is_wall@plt>
lea    0x2(%r15),%ecx
test   %eax,%eax
cmovne %r15d,%ecx
mov    %ecx,%r15d
lea    0x1(%r14),%edi
mov    $0x1,%bpl
cmp    $0x4f,%ebx
jg     125d <disp_wall_char+0x8d>
test   %ebx,%ebx
js     125d <disp_wall_char+0x8d>
cmp    $0x16,%edi
ja     125d <disp_wall_char+0x8d>
mov    %ebx,%esi
xor    %eax,%eax
call   10a0 <is_wall@plt>
test   %eax,%eax
jne    125d <disp_wall_char+0x8d>
or     $0x4,%r15d
test   %bpl,%bpl
je     1289 <disp_wall_char+0xb9>
add    $0xffffffff,%ebx
cmp    $0x4f,%ebx
ja     1289 <disp_wall_char+0xb9>
cmp    $0x16,%r14d
ja     1289 <disp_wall_char+0xb9>
mov    %r14d,%edi
mov    %ebx,%esi
xor    %eax,%eax
call   10a0 <is_wall@plt>
lea    0x8(%r15),%ecx
test   %eax,%eax
cmovne %r15d,%ecx
mov    %ecx,%r15d
cmp    $0xf,%r15d
ja     12c3 <disp_wall_char+0xf3>
mov    %r15d,%eax
lea    0xd67(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
xor    %eax,%eax
call   1070 <display_vert_line@plt>
jmp    12b8 <disp_wall_char+0xe8>
cmp    $0xffffffff,%r14d
je     1320 <disp_wall_char+0x150>
xor    %eax,%eax
call   1060 <display_horiz_line@plt>
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x3f,%edi
call   1030 <putchar@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   1050 <display_upper_right_angle@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   10c0 <display_lower_right_angle@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   10e0 <display_vert_and_right_line@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   10b0 <display_upper_left_angle@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   10d0 <display_hor_and_upper_vert_line@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   1090 <display_lower_left_angle@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   1040 <display_vert_and_left_line@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   10f0 <display_hor_and_bottom_vert_line@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %eax,%eax
call   1080 <display_hor_and_vert_line@plt>
jmp    12b8 <disp_wall_char+0xe8>
xor    %edi,%edi
xor    %r15d,%r15d
xor    %ebp,%ebp
cmp    $0x4f,%ebx
jle    1243 <disp_wall_char+0x73>
jmp    125d <disp_wall_char+0x8d>

LLVM IR (-O0):
@disp_wall_char.col_off = internal global [4 x i32] [i32 0, i32 1, i32 0, i32 -1]
@disp_wall_char.row_off = internal global [4 x i32] [i32 -1, i32 0, i32 1, i32 0]
@.str = [2 x i8] c"?\00"
define i32 @disp_wall_char(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
store i32 0, i32* %6
store i32 0, i32* %7
br label %9
9: ; preds = %66, %2
%10 = load i32, i32* %7
%11 = icmp slt i32 %10, 4
br i1 %11, label %12, label %69
12: ; preds = %9
%13 = load i32, i32* %4
%14 = load i32, i32* %7
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds [4 x i32], [4 x i32]* @disp_wall_char.row_off, i64 0, i64 %15
%17 = load i32, i32* %16
%18 = add nsw i32 %13, %17
%19 = icmp sge i32 %18, 0
br i1 %19, label %20, label %65
20: ; preds = %12
%21 = load i32, i32* %5
%22 = load i32, i32* %7
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [4 x i32], [4 x i32]* @disp_wall_char.col_off, i64 0, i64 %23
%25 = load i32, i32* %24
%26 = add nsw i32 %21, %25
%27 = icmp sge i32 %26, 0
br i1 %27, label %28, label %65
28: ; preds = %20
%29 = load i32, i32* %4
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [4 x i32], [4 x i32]* @disp_wall_char.row_off, i64 0, i64 %31
%33 = load i32, i32* %32
%34 = add nsw i32 %29, %33
%35 = icmp slt i32 %34, 23
br i1 %35, label %36, label %65
36: ; preds = %28
%37 = load i32, i32* %5
%38 = load i32, i32* %7
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds [4 x i32], [4 x i32]* @disp_wall_char.col_off, i64 0, i64 %39
%41 = load i32, i32* %40
%42 = add nsw i32 %37, %41
%43 = icmp slt i32 %42, 80
br i1 %43, label %44, label %65
44: ; preds = %36
%45 = load i32, i32* %4
%46 = load i32, i32* %7
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds [4 x i32], [4 x i32]* @disp_wall_char.row_off, i64 0, i64 %47
%49 = load i32, i32* %48
%50 = add nsw i32 %45, %49
%51 = load i32, i32* %5
%52 = load i32, i32* %7
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds [4 x i32], [4 x i32]* @disp_wall_char.col_off, i64 0, i64 %53
%55 = load i32, i32* %54
%56 = add nsw i32 %51, %55
%57 = call i32 (i32, i32, ...) bitcast (i32 (...)* @is_wall to i32 (i32, i32, ...)*)(i32 %50, i32 %56)
%58 = icmp eq i32 %57, 0
br i1 %58, label %59, label %64
59: ; preds = %44
%60 = load i32, i32* %6
%61 = load i32, i32* %7
%62 = shl i32 1, %61
%63 = or i32 %60, %62
store i32 %63, i32* %6
br label %64
64: ; preds = %59, %44
br label %65
65: ; preds = %64, %36, %28, %20, %12
br label %66
66: ; preds = %65
%67 = load i32, i32* %7
%68 = add nsw i32 %67, 1
store i32 %68, i32* %7
br label %9
69: ; preds = %9
%70 = load i32, i32* %6
switch i32 %70, label %93 [
i32 0, label %71
i32 2, label %71
i32 8, label %71
i32 10, label %71
i32 1, label %73
i32 4, label %73
i32 5, label %73
i32 9, label %75
i32 3, label %77
i32 6, label %79
i32 12, label %81
i32 13, label %83
i32 11, label %85
i32 7, label %87
i32 14, label %89
i32 15, label %91
]
71: ; preds = %69, %69, %69, %69
%72 = call i32 (...) @display_horiz_line()
br label %95
73: ; preds = %69, %69, %69
%74 = call i32 (...) @display_vert_line()
br label %95
75: ; preds = %69
%76 = call i32 (...) @display_upper_left_angle()
br label %95
77: ; preds = %69
%78 = call i32 (...) @display_upper_right_angle()
br label %95
79: ; preds = %69
%80 = call i32 (...) @display_lower_right_angle()
br label %95
81: ; preds = %69
%82 = call i32 (...) @display_lower_left_angle()
br label %95
83: ; preds = %69
%84 = call i32 (...) @display_vert_and_left_line()
br label %95
85: ; preds = %69
%86 = call i32 (...) @display_hor_and_upper_vert_line()
br label %95
87: ; preds = %69
%88 = call i32 (...) @display_vert_and_right_line()
br label %95
89: ; preds = %69
%90 = call i32 (...) @display_hor_and_bottom_vert_line()
br label %95
91: ; preds = %69
%92 = call i32 (...) @display_hor_and_vert_line()
br label %95
93: ; preds = %69
%94 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
br label %95
95: ; preds = %93, %91, %89, %87, %85, %83, %81, %79, %77, %75, %73, %71
%96 = load i32, i32* %3
ret i32 %96
}

LLVM IR (-O2):
define i32 @disp_wall_char(i32 %0, i32 %1) {
%3 = add nsw i32 %0, -1
%4 = icmp sgt i32 %0, 0
br i1 %4, label %5, label %15
5: ; preds = %2
%6 = icmp sgt i32 %1, -1
%7 = icmp ult i32 %3, 23
%8 = select i1 %6, i1 %7, i1 false
%9 = icmp slt i32 %1, 80
%10 = and i1 %9, %8
br i1 %10, label %11, label %17
11: ; preds = %5
%12 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @is_wall to i32 (i32, i32, ...)*)(i32 %3, i32 %1)
%13 = icmp eq i32 %12, 0
%14 = zext i1 %13 to i32
br label %17
15: ; preds = %2
%16 = icmp sgt i32 %0, -1
br i1 %16, label %17, label %32
17: ; preds = %11, %5, %15
%18 = phi i32 [ 0, %15 ], [ 0, %5 ], [ %14, %11 ]
%19 = icmp ult i32 %0, 23
%20 = add i32 %1, 1
%21 = icmp ult i32 %20, 80
%22 = and i1 %21, %19
br i1 %22, label %23, label %29
23: ; preds = %17
%24 = add nsw i32 %1, 1
%25 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @is_wall to i32 (i32, i32, ...)*)(i32 %0, i32 %24)
%26 = icmp eq i32 %25, 0
%27 = or i32 %18, 2
%28 = select i1 %26, i32 %27, i32 %18
br label %29
29: ; preds = %23, %17
%30 = phi i32 [ %18, %17 ], [ %28, %23 ]
%31 = add nuw nsw i32 %0, 1
br label %34
32: ; preds = %15
%33 = icmp eq i32 %0, -1
br i1 %33, label %34, label %63
34: ; preds = %29, %32
%35 = phi i32 [ %31, %29 ], [ 0, %32 ]
%36 = phi i32 [ %30, %29 ], [ 0, %32 ]
%37 = phi i1 [ true, %29 ], [ false, %32 ]
%38 = icmp sgt i32 %1, -1
%39 = icmp ult i32 %35, 23
%40 = select i1 %38, i1 %39, i1 false
%41 = icmp slt i32 %1, 80
%42 = and i1 %41, %40
br i1 %42, label %43, label %48
43: ; preds = %34
%44 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @is_wall to i32 (i32, i32, ...)*)(i32 %35, i32 %1)
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %48
46: ; preds = %43
%47 = or i32 %36, 4
br i1 %37, label %49, label %61
48: ; preds = %43, %34
br i1 %37, label %49, label %61
49: ; preds = %46, %48
%50 = phi i32 [ %47, %46 ], [ %36, %48 ]
%51 = icmp ult i32 %0, 23
%52 = add i32 %1, -1
%53 = icmp ult i32 %52, 80
%54 = and i1 %53, %51
br i1 %54, label %55, label %61
55: ; preds = %49
%56 = add nsw i32 %1, -1
%57 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @is_wall to i32 (i32, i32, ...)*)(i32 %0, i32 %56)
%58 = icmp eq i32 %57, 0
%59 = or i32 %50, 8
%60 = select i1 %58, i32 %59, i32 %50
br label %61
61: ; preds = %55, %46, %49, %48
%62 = phi i32 [ %50, %49 ], [ %36, %48 ], [ %47, %46 ], [ %60, %55 ]
switch i32 %62, label %85 [
i32 0, label %63
i32 2, label %63
i32 8, label %63
i32 10, label %63
i32 1, label %65
i32 4, label %65
i32 5, label %65
i32 9, label %67
i32 3, label %69
i32 6, label %71
i32 12, label %73
i32 13, label %75
i32 11, label %77
i32 7, label %79
i32 14, label %81
i32 15, label %83
]
63: ; preds = %32, %61, %61, %61, %61
%64 = tail call i32 (...) @display_horiz_line()
br label %87
65: ; preds = %61, %61, %61
%66 = tail call i32 (...) @display_vert_line()
br label %87
67: ; preds = %61
%68 = tail call i32 (...) @display_upper_left_angle()
br label %87
69: ; preds = %61
%70 = tail call i32 (...) @display_upper_right_angle()
br label %87
71: ; preds = %61
%72 = tail call i32 (...) @display_lower_right_angle()
br label %87
73: ; preds = %61
%74 = tail call i32 (...) @display_lower_left_angle()
br label %87
75: ; preds = %61
%76 = tail call i32 (...) @display_vert_and_left_line()
br label %87
77: ; preds = %61
%78 = tail call i32 (...) @display_hor_and_upper_vert_line()
br label %87
79: ; preds = %61
%80 = tail call i32 (...) @display_vert_and_right_line()
br label %87
81: ; preds = %61
%82 = tail call i32 (...) @display_hor_and_bottom_vert_line()
br label %87
83: ; preds = %61
%84 = tail call i32 (...) @display_hor_and_vert_line()
br label %87
85: ; preds = %61
%86 = tail call i32 @putchar(i32 63)
br label %87
87: ; preds = %85, %83, %81, %79, %77, %75, %73, %71, %69, %67, %65, %63
ret i32 undef
}