int move_goes_to(int w, int h, char *grid, int x, int y, int d) {
  int dr;
  dr = -1;
  while (1) {
    if (((x + ((d)&3 ? (((d)&7) > 4 ? -1 : +1) : 0)) < 0 ||
                 (x + ((d)&3 ? (((d)&7) > 4 ? -1 : +1) : 0)) >= (w) ||
                 (y + ((((d) + 6) & 3 ? ((((d) + 6) & 7) > 4 ? -1 : +1) : 0))) <
                     0 ||
                 (y + ((((d) + 6) & 3 ? ((((d) + 6) & 7) > 4 ? -1 : +1)
                                      : 0))) >= (h)
             ? 'w'
             : ((grid)[(y + ((((d) + 6) & 3 ? ((((d) + 6) & 7) > 4 ? -1 : +1)
                                            : 0))) *
                           (w) +
                       (x + ((d)&3 ? (((d)&7) > 4 ? -1 : +1) : 0))])) == 'w') {
      dr = 8;
      break;
    }
    x += ((d)&3 ? (((d)&7) > 4 ? -1 : +1) : 0);
    y += ((((d) + 6) & 3 ? ((((d) + 6) & 7) > 4 ? -1 : +1) : 0));
    if (((x) < 0 || (x) >= (w) || (y) < 0 || (y) >= (h)
             ? 'w'
             : ((grid)[(y) * (w) + (x)])) == 's') {
      dr = 8;
      break;
    }
    if (((x) < 0 || (x) >= (w) || (y) < 0 || (y) >= (h)
             ? 'w'
             : ((grid)[(y) * (w) + (x)])) == 'g') {
      dr = d;
      break;
    }
    if (((x) < 0 || (x) >= (w) || (y) < 0 || (y) >= (h)
             ? 'w'
             : ((grid)[(y) * (w) + (x)])) == 'm')
      return -1;
  }
  assert(dr >= 0);
  return (y * w + x) * (8 + 1) + dr;
}


x86 assembly (clang, -O0):
<move_goes_to>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movl   $0xffffffff,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     116a <move_goes_to+0x5a>
mov    -0x24(%rbp),%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x30(%rbp)
jmp    1174 <move_goes_to+0x64>
xor    %eax,%eax
mov    %eax,-0x30(%rbp)
jmp    1174 <move_goes_to+0x64>
mov    -0x2c(%rbp),%eax
mov    -0x30(%rbp),%ecx
add    %ecx,%eax
cmp    $0x0,%eax
jl     127b <move_goes_to+0x16b>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     11b8 <move_goes_to+0xa8>
mov    -0x24(%rbp),%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x38(%rbp)
jmp    11c2 <move_goes_to+0xb2>
xor    %eax,%eax
mov    %eax,-0x38(%rbp)
jmp    11c2 <move_goes_to+0xb2>
mov    -0x34(%rbp),%eax
mov    -0x38(%rbp),%ecx
add    %ecx,%eax
cmp    -0x8(%rbp),%eax
jge    127b <move_goes_to+0x16b>
mov    -0x20(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x6,%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     120c <move_goes_to+0xfc>
mov    -0x24(%rbp),%edx
add    $0x6,%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x40(%rbp)
jmp    1216 <move_goes_to+0x106>
xor    %eax,%eax
mov    %eax,-0x40(%rbp)
jmp    1216 <move_goes_to+0x106>
mov    -0x3c(%rbp),%eax
mov    -0x40(%rbp),%ecx
add    %ecx,%eax
cmp    $0x0,%eax
jl     127b <move_goes_to+0x16b>
mov    -0x20(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x24(%rbp),%eax
add    $0x6,%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     1260 <move_goes_to+0x150>
mov    -0x24(%rbp),%edx
add    $0x6,%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x48(%rbp)
jmp    126a <move_goes_to+0x15a>
xor    %eax,%eax
mov    %eax,-0x48(%rbp)
jmp    126a <move_goes_to+0x15a>
mov    -0x44(%rbp),%eax
mov    -0x48(%rbp),%ecx
add    %ecx,%eax
cmp    -0xc(%rbp),%eax
jl     1288 <move_goes_to+0x178>
mov    $0x77,%eax
mov    %eax,-0x4c(%rbp)
jmp    133a <move_goes_to+0x22a>
mov    -0x18(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x24(%rbp),%eax
add    $0x6,%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     12c9 <move_goes_to+0x1b9>
mov    -0x24(%rbp),%edx
add    $0x6,%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x5c(%rbp)
jmp    12d3 <move_goes_to+0x1c3>
xor    %eax,%eax
mov    %eax,-0x5c(%rbp)
jmp    12d3 <move_goes_to+0x1c3>
mov    -0x50(%rbp),%eax
mov    -0x5c(%rbp),%ecx
add    %ecx,%eax
imul   -0x8(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x60(%rbp)
mov    -0x24(%rbp),%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     1315 <move_goes_to+0x205>
mov    -0x24(%rbp),%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x68(%rbp)
jmp    131f <move_goes_to+0x20f>
xor    %eax,%eax
mov    %eax,-0x68(%rbp)
jmp    131f <move_goes_to+0x20f>
mov    -0x58(%rbp),%rax
mov    -0x64(%rbp),%ecx
mov    -0x60(%rbp),%edx
mov    -0x68(%rbp),%esi
add    %esi,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    $0x77,%eax
jne    1352 <move_goes_to+0x242>
movl   $0x8,-0x28(%rbp)
jmp    1517 <move_goes_to+0x407>
mov    -0x24(%rbp),%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     137f <move_goes_to+0x26f>
mov    -0x24(%rbp),%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x6c(%rbp)
jmp    1389 <move_goes_to+0x279>
xor    %eax,%eax
mov    %eax,-0x6c(%rbp)
jmp    1389 <move_goes_to+0x279>
mov    -0x6c(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x6,%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     13c5 <move_goes_to+0x2b5>
mov    -0x24(%rbp),%edx
add    $0x6,%edx
and    $0x7,%edx
mov    $0x1,%eax
mov    $0xffffffff,%ecx
cmp    $0x4,%edx
cmovg  %ecx,%eax
mov    %eax,-0x70(%rbp)
jmp    13cf <move_goes_to+0x2bf>
xor    %eax,%eax
mov    %eax,-0x70(%rbp)
jmp    13cf <move_goes_to+0x2bf>
mov    -0x70(%rbp),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jl     1404 <move_goes_to+0x2f4>
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1404 <move_goes_to+0x2f4>
cmpl   $0x0,-0x20(%rbp)
jl     1404 <move_goes_to+0x2f4>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     1411 <move_goes_to+0x301>
mov    $0x77,%eax
mov    %eax,-0x74(%rbp)
jmp    1429 <move_goes_to+0x319>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x8(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x74(%rbp)
mov    -0x74(%rbp),%eax
cmp    $0x73,%eax
jne    1441 <move_goes_to+0x331>
movl   $0x8,-0x28(%rbp)
jmp    1517 <move_goes_to+0x407>
cmpl   $0x0,-0x1c(%rbp)
jl     146d <move_goes_to+0x35d>
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    146d <move_goes_to+0x35d>
cmpl   $0x0,-0x20(%rbp)
jl     146d <move_goes_to+0x35d>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     147a <move_goes_to+0x36a>
mov    $0x77,%eax
mov    %eax,-0x78(%rbp)
jmp    1492 <move_goes_to+0x382>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x8(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x78(%rbp)
mov    -0x78(%rbp),%eax
cmp    $0x67,%eax
jne    14a9 <move_goes_to+0x399>
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1517 <move_goes_to+0x407>
cmpl   $0x0,-0x1c(%rbp)
jl     14d5 <move_goes_to+0x3c5>
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    14d5 <move_goes_to+0x3c5>
cmpl   $0x0,-0x20(%rbp)
jl     14d5 <move_goes_to+0x3c5>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jl     14e2 <move_goes_to+0x3d2>
mov    $0x77,%eax
mov    %eax,-0x7c(%rbp)
jmp    14fa <move_goes_to+0x3ea>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
imul   -0x8(%rbp),%ecx
add    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
cmp    $0x6d,%eax
jne    1512 <move_goes_to+0x402>
movl   $0xffffffff,-0x4(%rbp)
jmp    153d <move_goes_to+0x42d>
jmp    1137 <move_goes_to+0x27>
cmpl   $0x0,-0x28(%rbp)
setge  %al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1030 <assert@plt>
mov    -0x20(%rbp),%eax
imul   -0x8(%rbp),%eax
add    -0x1c(%rbp),%eax
imul   $0x9,%eax,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<move_goes_to>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %r9d,%eax
and    $0x7,%eax
xor    %ebp,%ebp
cmp    $0x5,%eax
setb   %bpl
xor    %r11d,%r11d
test   $0x3,%r9b
lea    -0x1(%rbp,%rbp,1),%rax
cmove  %r11,%rax
lea    0x6(%r9),%r10d
mov    %r10d,%ebp
and    $0x7,%ebp
xor    %ebx,%ebx
cmp    $0x5,%ebp
setb   %bl
test   $0x3,%r10b
lea    -0x1(%rbx,%rbx,1),%r10
cmove  %r11,%r10
mov    %edi,%r14d
movslq %ecx,%rcx
movslq %edi,%r13
movslq %r8d,%rbp
movslq %esi,%r8
lea    (%r10,%rbp,1),%rsi
imul   %r13,%rsi
add    %rcx,%rsi
add    %rdx,%rsi
mov    %r10,%rdi
imul   %r13,%rdi
add    %rax,%rdi
lea    0xe79(%rip),%r11
mov    $0x8,%r12d
nopl   (%rax)
mov    %rcx,%r15
mov    %rbp,%rbx
add    %rax,%rcx
js     11e2 <move_goes_to+0xd2>
cmp    %r13,%rcx
jge    11e2 <move_goes_to+0xd2>
mov    %rbx,%rbp
add    %r10,%rbp
js     11e2 <move_goes_to+0xd2>
cmp    %r8,%rbp
jge    11e2 <move_goes_to+0xd2>
movzbl (%rsi,%rax,1),%edx
add    $0x99,%dl
ror    %dl
add    %rdi,%rsi
cmp    $0x8,%dl
ja     1190 <move_goes_to+0x80>
movzbl %dl,%edx
movslq (%r11,%rdx,4),%rdx
add    %r11,%rdx
jmp    *%rdx
mov    %rcx,%r15
mov    %rbp,%rbx
mov    %r9d,%r12d
jmp    11e2 <move_goes_to+0xd2>
mov    $0xffffffff,%eax
jmp    11fe <move_goes_to+0xee>
mov    %rcx,%r15
mov    %rbp,%rbx
mov    %r12d,%edi
not    %edi
shr    $0x1f,%edi
xor    %eax,%eax
call   1030 <assert@plt>
imul   %r14d,%ebx
add    %r15d,%ebx
lea    (%rbx,%rbx,8),%eax
add    %r12d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @move_goes_to(i32 %0, i32 %1, i8* %2, i32 %3, i32 %4, i32 %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i8*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
store i32 %0, i32* %8
store i32 %1, i32* %9
store i8* %2, i8** %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i32 %5, i32* %13
store i32 -1, i32* %14
br label %15
15: ; preds = %6, %250
%16 = load i32, i32* %11
%17 = load i32, i32* %13
%18 = and i32 %17, 3
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %26
20: ; preds = %15
%21 = load i32, i32* %13
%22 = and i32 %21, 7
%23 = icmp sgt i32 %22, 4
%24 = zext i1 %23 to i64
%25 = select i1 %23, i32 -1, i32 1
br label %27
26: ; preds = %15
br label %27
27: ; preds = %26, %20
%28 = phi i32 [ %25, %20 ], [ 0, %26 ]
%29 = add nsw i32 %16, %28
%30 = icmp slt i32 %29, 0
br i1 %30, label %85, label %31
31: ; preds = %27
%32 = load i32, i32* %11
%33 = load i32, i32* %13
%34 = and i32 %33, 3
%35 = icmp ne i32 %34, 0
br i1 %35, label %36, label %42
36: ; preds = %31
%37 = load i32, i32* %13
%38 = and i32 %37, 7
%39 = icmp sgt i32 %38, 4
%40 = zext i1 %39 to i64
%41 = select i1 %39, i32 -1, i32 1
br label %43
42: ; preds = %31
br label %43
43: ; preds = %42, %36
%44 = phi i32 [ %41, %36 ], [ 0, %42 ]
%45 = add nsw i32 %32, %44
%46 = load i32, i32* %8
%47 = icmp sge i32 %45, %46
br i1 %47, label %85, label %48
48: ; preds = %43
%49 = load i32, i32* %12
%50 = load i32, i32* %13
%51 = add nsw i32 %50, 6
%52 = and i32 %51, 3
%53 = icmp ne i32 %52, 0
br i1 %53, label %54, label %61
54: ; preds = %48
%55 = load i32, i32* %13
%56 = add nsw i32 %55, 6
%57 = and i32 %56, 7
%58 = icmp sgt i32 %57, 4
%59 = zext i1 %58 to i64
%60 = select i1 %58, i32 -1, i32 1
br label %62
61: ; preds = %48
br label %62
62: ; preds = %61, %54
%63 = phi i32 [ %60, %54 ], [ 0, %61 ]
%64 = add nsw i32 %49, %63
%65 = icmp slt i32 %64, 0
br i1 %65, label %85, label %66
66: ; preds = %62
%67 = load i32, i32* %12
%68 = load i32, i32* %13
%69 = add nsw i32 %68, 6
%70 = and i32 %69, 3
%71 = icmp ne i32 %70, 0
br i1 %71, label %72, label %79
72: ; preds = %66
%73 = load i32, i32* %13
%74 = add nsw i32 %73, 6
%75 = and i32 %74, 7
%76 = icmp sgt i32 %75, 4
%77 = zext i1 %76 to i64
%78 = select i1 %76, i32 -1, i32 1
br label %80
79: ; preds = %66
br label %80
80: ; preds = %79, %72
%81 = phi i32 [ %78, %72 ], [ 0, %79 ]
%82 = add nsw i32 %67, %81
%83 = load i32, i32* %9
%84 = icmp sge i32 %82, %83
br i1 %84, label %85, label %86
85: ; preds = %80, %62, %43, %27
br label %125
86: ; preds = %80
%87 = load i8*, i8** %10
%88 = load i32, i32* %12
%89 = load i32, i32* %13
%90 = add nsw i32 %89, 6
%91 = and i32 %90, 3
%92 = icmp ne i32 %91, 0
br i1 %92, label %93, label %100
93: ; preds = %86
%94 = load i32, i32* %13
%95 = add nsw i32 %94, 6
%96 = and i32 %95, 7
%97 = icmp sgt i32 %96, 4
%98 = zext i1 %97 to i64
%99 = select i1 %97, i32 -1, i32 1
br label %101
100: ; preds = %86
br label %101
101: ; preds = %100, %93
%102 = phi i32 [ %99, %93 ], [ 0, %100 ]
%103 = add nsw i32 %88, %102
%104 = load i32, i32* %8
%105 = mul nsw i32 %103, %104
%106 = load i32, i32* %11
%107 = load i32, i32* %13
%108 = and i32 %107, 3
%109 = icmp ne i32 %108, 0
br i1 %109, label %110, label %116
110: ; preds = %101
%111 = load i32, i32* %13
%112 = and i32 %111, 7
%113 = icmp sgt i32 %112, 4
%114 = zext i1 %113 to i64
%115 = select i1 %113, i32 -1, i32 1
br label %117
116: ; preds = %101
br label %117
117: ; preds = %116, %110
%118 = phi i32 [ %115, %110 ], [ 0, %116 ]
%119 = add nsw i32 %106, %118
%120 = add nsw i32 %105, %119
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %87, i64 %121
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
br label %125
125: ; preds = %117, %85
%126 = phi i32 [ 119, %85 ], [ %124, %117 ]
%127 = icmp eq i32 %126, 119
br i1 %127, label %128, label %129
128: ; preds = %125
store i32 8, i32* %14
br label %251
129: ; preds = %125
%130 = load i32, i32* %13
%131 = and i32 %130, 3
%132 = icmp ne i32 %131, 0
br i1 %132, label %133, label %139
133: ; preds = %129
%134 = load i32, i32* %13
%135 = and i32 %134, 7
%136 = icmp sgt i32 %135, 4
%137 = zext i1 %136 to i64
%138 = select i1 %136, i32 -1, i32 1
br label %140
139: ; preds = %129
br label %140
140: ; preds = %139, %133
%141 = phi i32 [ %138, %133 ], [ 0, %139 ]
%142 = load i32, i32* %11
%143 = add nsw i32 %142, %141
store i32 %143, i32* %11
%144 = load i32, i32* %13
%145 = add nsw i32 %144, 6
%146 = and i32 %145, 3
%147 = icmp ne i32 %146, 0
br i1 %147, label %148, label %155
148: ; preds = %140
%149 = load i32, i32* %13
%150 = add nsw i32 %149, 6
%151 = and i32 %150, 7
%152 = icmp sgt i32 %151, 4
%153 = zext i1 %152 to i64
%154 = select i1 %152, i32 -1, i32 1
br label %156
155: ; preds = %140
br label %156
156: ; preds = %155, %148
%157 = phi i32 [ %154, %148 ], [ 0, %155 ]
%158 = load i32, i32* %12
%159 = add nsw i32 %158, %157
store i32 %159, i32* %12
%160 = load i32, i32* %11
%161 = icmp slt i32 %160, 0
br i1 %161, label %173, label %162
162: ; preds = %156
%163 = load i32, i32* %11
%164 = load i32, i32* %8
%165 = icmp sge i32 %163, %164
br i1 %165, label %173, label %166
166: ; preds = %162
%167 = load i32, i32* %12
%168 = icmp slt i32 %167, 0
br i1 %168, label %173, label %169
169: ; preds = %166
%170 = load i32, i32* %12
%171 = load i32, i32* %9
%172 = icmp sge i32 %170, %171
br i1 %172, label %173, label %174
173: ; preds = %169, %166, %162, %156
br label %185
174: ; preds = %169
%175 = load i8*, i8** %10
%176 = load i32, i32* %12
%177 = load i32, i32* %8
%178 = mul nsw i32 %176, %177
%179 = load i32, i32* %11
%180 = add nsw i32 %178, %179
%181 = sext i32 %180 to i64
%182 = getelementptr inbounds i8, i8* %175, i64 %181
%183 = load i8, i8* %182
%184 = sext i8 %183 to i32
br label %185
185: ; preds = %174, %173
%186 = phi i32 [ 119, %173 ], [ %184, %174 ]
%187 = icmp eq i32 %186, 115
br i1 %187, label %188, label %189
188: ; preds = %185
store i32 8, i32* %14
br label %251
189: ; preds = %185
%190 = load i32, i32* %11
%191 = icmp slt i32 %190, 0
br i1 %191, label %203, label %192
192: ; preds = %189
%193 = load i32, i32* %11
%194 = load i32, i32* %8
%195 = icmp sge i32 %193, %194
br i1 %195, label %203, label %196
196: ; preds = %192
%197 = load i32, i32* %12
%198 = icmp slt i32 %197, 0
br i1 %198, label %203, label %199
199: ; preds = %196
%200 = load i32, i32* %12
%201 = load i32, i32* %9
%202 = icmp sge i32 %200, %201
br i1 %202, label %203, label %204
203: ; preds = %199, %196, %192, %189
br label %215
204: ; preds = %199
%205 = load i8*, i8** %10
%206 = load i32, i32* %12
%207 = load i32, i32* %8
%208 = mul nsw i32 %206, %207
%209 = load i32, i32* %11
%210 = add nsw i32 %208, %209
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds i8, i8* %205, i64 %211
%213 = load i8, i8* %212
%214 = sext i8 %213 to i32
br label %215
215: ; preds = %204, %203
%216 = phi i32 [ 119, %203 ], [ %214, %204 ]
%217 = icmp eq i32 %216, 103
br i1 %217, label %218, label %220
218: ; preds = %215
%219 = load i32, i32* %13
store i32 %219, i32* %14
br label %251
220: ; preds = %215
%221 = load i32, i32* %11
%222 = icmp slt i32 %221, 0
br i1 %222, label %234, label %223
223: ; preds = %220
%224 = load i32, i32* %11
%225 = load i32, i32* %8
%226 = icmp sge i32 %224, %225
br i1 %226, label %234, label %227
227: ; preds = %223
%228 = load i32, i32* %12
%229 = icmp slt i32 %228, 0
br i1 %229, label %234, label %230
230: ; preds = %227
%231 = load i32, i32* %12
%232 = load i32, i32* %9
%233 = icmp sge i32 %231, %232
br i1 %233, label %234, label %235
234: ; preds = %230, %227, %223, %220
br label %246
235: ; preds = %230
%236 = load i8*, i8** %10
%237 = load i32, i32* %12
%238 = load i32, i32* %8
%239 = mul nsw i32 %237, %238
%240 = load i32, i32* %11
%241 = add nsw i32 %239, %240
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds i8, i8* %236, i64 %242
%244 = load i8, i8* %243
%245 = sext i8 %244 to i32
br label %246
246: ; preds = %235, %234
%247 = phi i32 [ 119, %234 ], [ %245, %235 ]
%248 = icmp eq i32 %247, 109
br i1 %248, label %249, label %250
249: ; preds = %246
store i32 -1, i32* %7
br label %264
250: ; preds = %246
br label %15
251: ; preds = %218, %188, %128
%252 = load i32, i32* %14
%253 = icmp sge i32 %252, 0
%254 = zext i1 %253 to i32
%255 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %254)
%256 = load i32, i32* %12
%257 = load i32, i32* %8
%258 = mul nsw i32 %256, %257
%259 = load i32, i32* %11
%260 = add nsw i32 %258, %259
%261 = mul nsw i32 %260, 9
%262 = load i32, i32* %14
%263 = add nsw i32 %261, %262
store i32 %263, i32* %7
br label %264
264: ; preds = %251, %249
%265 = load i32, i32* %7
ret i32 %265
}

LLVM IR (-O2):
define i32 @move_goes_to(i32 %0, i32 %1, i8* nocapture %2, i32 %3, i32 %4, i32 %5) {
%7 = and i32 %5, 3
%8 = icmp eq i32 %7, 0
%9 = and i32 %5, 7
%10 = icmp ugt i32 %9, 4
%11 = select i1 %10, i64 -1, i64 1
%12 = select i1 %8, i64 0, i64 %11
%13 = add nsw i32 %5, 6
%14 = and i32 %13, 3
%15 = icmp eq i32 %14, 0
%16 = and i32 %13, 7
%17 = icmp ugt i32 %16, 4
%18 = select i1 %17, i64 -1, i64 1
%19 = select i1 %15, i64 0, i64 %18
%20 = sext i32 %3 to i64
%21 = sext i32 %0 to i64
%22 = sext i32 %4 to i64
%23 = sext i32 %1 to i64
br label %24
24: ; preds = %36, %6
%25 = phi i64 [ %22, %6 ], [ %32, %36 ]
%26 = phi i64 [ %20, %6 ], [ %27, %36 ]
%27 = add i64 %26, %12
%28 = icmp sgt i64 %27, -1
%29 = icmp slt i64 %27, %21
%30 = and i1 %28, %29
br i1 %30, label %31, label %43
31: ; preds = %24
%32 = add i64 %25, %19
%33 = icmp sgt i64 %32, -1
%34 = icmp slt i64 %32, %23
%35 = and i1 %33, %34
br i1 %35, label %36, label %43
36: ; preds = %31
%37 = mul nsw i64 %32, %21
%38 = add nsw i64 %37, %27
%39 = getelementptr inbounds i8, i8* %2, i64 %38
%40 = load i8, i8* %39
%41 = add i8 %40, -103
%42 = call i8 @llvm.fshl.i8(i8 %41, i8 %41, i8 7)
switch i8 %42, label %24 [
i8 8, label %43
i8 6, label %44
i8 0, label %45
i8 3, label %58
]
43: ; preds = %36, %31, %24
br label %45
44: ; preds = %36
br label %45
45: ; preds = %36, %44, %43
%46 = phi i64 [ %26, %43 ], [ %27, %44 ], [ %27, %36 ]
%47 = phi i64 [ %25, %43 ], [ %32, %44 ], [ %32, %36 ]
%48 = phi i32 [ 8, %43 ], [ 8, %44 ], [ %5, %36 ]
%49 = trunc i64 %47 to i32
%50 = trunc i64 %46 to i32
%51 = xor i32 %48, -1
%52 = lshr i32 %51, 31
%53 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %52)
%54 = mul nsw i32 %49, %0
%55 = add nsw i32 %54, %50
%56 = mul nsw i32 %55, 9
%57 = add nsw i32 %56, %48
br label %58
58: ; preds = %36, %45
%59 = phi i32 [ %57, %45 ], [ -1, %36 ]
ret i32 %59
}