#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 */
unsigned int umin(unsigned int, unsigned int);
unsigned canonical(unsigned conf0) {
  unsigned minconf = conf0;
  int r;
  for (r = 0; r <= 7; ++r) {
    conf0 = ((((((conf0) >> (2 * (6))) & 3)) << 16) |
             (((((conf0) >> (2 * (3))) & 3)) << 14) |
             (((((conf0) >> (2 * (0))) & 3)) << 12) |
             (((((conf0) >> (2 * (7))) & 3)) << 10) |
             (((((conf0) >> (2 * (4))) & 3)) << 8) |
             (((((conf0) >> (2 * (1))) & 3)) << 6) |
             (((((conf0) >> (2 * (8))) & 3)) << 4) |
             (((((conf0) >> (2 * (5))) & 3)) << 2) |
             ((((conf0) >> (2 * (2))) & 3)));
    if (r == 3)
      conf0 = ((((((conf0) >> (2 * (6))) & 3)) << 16) |
               (((((conf0) >> (2 * (7))) & 3)) << 14) |
               (((((conf0) >> (2 * (8))) & 3)) << 12) |
               (((((conf0) >> (2 * (3))) & 3)) << 10) |
               (((((conf0) >> (2 * (4))) & 3)) << 8) |
               (((((conf0) >> (2 * (5))) & 3)) << 6) |
               (((((conf0) >> (2 * (0))) & 3)) << 4) |
               (((((conf0) >> (2 * (1))) & 3)) << 2) |
               ((((conf0) >> (2 * (2))) & 3)));
    minconf = umin(minconf, conf0);
  }
  return minconf;
}


x86 assembly (clang, -O0):
<canonical>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0x7,-0xc(%rbp)
jg     1250 <canonical+0x140>
mov    -0x4(%rbp),%eax
shr    $0xc,%eax
and    $0x3,%eax
shl    $0x10,%eax
mov    -0x4(%rbp),%ecx
shr    $0x6,%ecx
and    $0x3,%ecx
shl    $0xe,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x0,%ecx
and    $0x3,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0xe,%ecx
and    $0x3,%ecx
shl    $0xa,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x8,%ecx
and    $0x3,%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x2,%ecx
and    $0x3,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x10,%ecx
and    $0x3,%ecx
shl    $0x4,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0xa,%ecx
and    $0x3,%ecx
shl    $0x2,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x4,%ecx
and    $0x3,%ecx
or     %ecx,%eax
mov    %eax,-0x4(%rbp)
cmpl   $0x3,-0xc(%rbp)
jne    1234 <canonical+0x124>
mov    -0x4(%rbp),%eax
shr    $0xc,%eax
and    $0x3,%eax
shl    $0x10,%eax
mov    -0x4(%rbp),%ecx
shr    $0xe,%ecx
and    $0x3,%ecx
shl    $0xe,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x10,%ecx
and    $0x3,%ecx
shl    $0xc,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x6,%ecx
and    $0x3,%ecx
shl    $0xa,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x8,%ecx
and    $0x3,%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0xa,%ecx
and    $0x3,%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x0,%ecx
and    $0x3,%ecx
shl    $0x4,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x2,%ecx
and    $0x3,%ecx
shl    $0x2,%ecx
or     %ecx,%eax
mov    -0x4(%rbp),%ecx
shr    $0x4,%ecx
and    $0x3,%ecx
or     %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%edi
mov    -0x4(%rbp),%esi
call   1030 <umin@plt>
mov    %eax,-0x8(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1128 <canonical+0x18>
mov    -0x8(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<canonical>:
push   %rbp
push   %r14
push   %rbx
mov    %edi,%eax
mov    $0x8,%r14d
mov    %edi,%ecx
mov    %edi,%ebx
jmp    1145 <canonical+0x35>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %eax,%edi
mov    %ebx,%esi
call   1030 <umin@plt>
mov    %ebx,%ecx
add    $0xffffffff,%r14d
je     11f1 <canonical+0xe1>
mov    %ecx,%ebp
shl    $0x4,%ebp
mov    %ebp,%r9d
and    $0x30000,%r9d
mov    %ecx,%esi
shl    $0x8,%esi
and    $0xc000,%esi
mov    %ecx,%r8d
and    $0x3,%r8d
mov    %r8d,%edi
shl    $0xc,%edi
shr    $0x4,%ebx
mov    %ebx,%r10d
and    $0xc00,%r10d
mov    %ecx,%edx
and    $0x300,%edx
or     %esi,%edx
and    $0xc0,%ebp
lea    (%rdx,%r9,1),%esi
or     %edi,%esi
or     %r10d,%esi
or     %ebp,%esi
mov    %ecx,%ebp
shr    $0xc,%ebp
and    $0x30,%ebp
or     %esi,%ebp
shr    $0x8,%ecx
and    $0xc,%ecx
or     %ebp,%ecx
and    $0x3,%ebx
or     %ecx,%ebx
cmp    $0x5,%r14d
jne    1130 <canonical+0x20>
shl    $0x10,%r8d
shr    $0x4,%r9d
shl    $0x4,%esi
and    $0xc00,%esi
shr    $0x4,%r10d
or     %r9d,%r10d
shl    $0x4,%ebx
and    $0x30,%ebx
and    $0xc,%ecx
shr    $0x4,%ebp
and    $0x3,%ebp
or     %r8d,%edx
or     %r10d,%edx
or     %esi,%edx
or     %ecx,%edx
or     %ebp,%edx
or     %ebx,%edx
mov    %edx,%ebx
jmp    1130 <canonical+0x20>
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @canonical(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %2
%5 = load i32, i32* %2
store i32 %5, i32* %3
store i32 0, i32* %4
br label %6
6: ; preds = %103, %1
%7 = load i32, i32* %4
%8 = icmp sle i32 %7, 7
br i1 %8, label %9, label %106
9: ; preds = %6
%10 = load i32, i32* %2
%11 = lshr i32 %10, 12
%12 = and i32 %11, 3
%13 = shl i32 %12, 16
%14 = load i32, i32* %2
%15 = lshr i32 %14, 6
%16 = and i32 %15, 3
%17 = shl i32 %16, 14
%18 = or i32 %13, %17
%19 = load i32, i32* %2
%20 = lshr i32 %19, 0
%21 = and i32 %20, 3
%22 = shl i32 %21, 12
%23 = or i32 %18, %22
%24 = load i32, i32* %2
%25 = lshr i32 %24, 14
%26 = and i32 %25, 3
%27 = shl i32 %26, 10
%28 = or i32 %23, %27
%29 = load i32, i32* %2
%30 = lshr i32 %29, 8
%31 = and i32 %30, 3
%32 = shl i32 %31, 8
%33 = or i32 %28, %32
%34 = load i32, i32* %2
%35 = lshr i32 %34, 2
%36 = and i32 %35, 3
%37 = shl i32 %36, 6
%38 = or i32 %33, %37
%39 = load i32, i32* %2
%40 = lshr i32 %39, 16
%41 = and i32 %40, 3
%42 = shl i32 %41, 4
%43 = or i32 %38, %42
%44 = load i32, i32* %2
%45 = lshr i32 %44, 10
%46 = and i32 %45, 3
%47 = shl i32 %46, 2
%48 = or i32 %43, %47
%49 = load i32, i32* %2
%50 = lshr i32 %49, 4
%51 = and i32 %50, 3
%52 = or i32 %48, %51
store i32 %52, i32* %2
%53 = load i32, i32* %4
%54 = icmp eq i32 %53, 3
br i1 %54, label %55, label %99
55: ; preds = %9
%56 = load i32, i32* %2
%57 = lshr i32 %56, 12
%58 = and i32 %57, 3
%59 = shl i32 %58, 16
%60 = load i32, i32* %2
%61 = lshr i32 %60, 14
%62 = and i32 %61, 3
%63 = shl i32 %62, 14
%64 = or i32 %59, %63
%65 = load i32, i32* %2
%66 = lshr i32 %65, 16
%67 = and i32 %66, 3
%68 = shl i32 %67, 12
%69 = or i32 %64, %68
%70 = load i32, i32* %2
%71 = lshr i32 %70, 6
%72 = and i32 %71, 3
%73 = shl i32 %72, 10
%74 = or i32 %69, %73
%75 = load i32, i32* %2
%76 = lshr i32 %75, 8
%77 = and i32 %76, 3
%78 = shl i32 %77, 8
%79 = or i32 %74, %78
%80 = load i32, i32* %2
%81 = lshr i32 %80, 10
%82 = and i32 %81, 3
%83 = shl i32 %82, 6
%84 = or i32 %79, %83
%85 = load i32, i32* %2
%86 = lshr i32 %85, 0
%87 = and i32 %86, 3
%88 = shl i32 %87, 4
%89 = or i32 %84, %88
%90 = load i32, i32* %2
%91 = lshr i32 %90, 2
%92 = and i32 %91, 3
%93 = shl i32 %92, 2
%94 = or i32 %89, %93
%95 = load i32, i32* %2
%96 = lshr i32 %95, 4
%97 = and i32 %96, 3
%98 = or i32 %94, %97
store i32 %98, i32* %2
br label %99
99: ; preds = %55, %9
%100 = load i32, i32* %3
%101 = load i32, i32* %2
%102 = call i32 @umin(i32 %100, i32 %101)
store i32 %102, i32* %3
br label %103
103: ; preds = %99
%104 = load i32, i32* %4
%105 = add nsw i32 %104, 1
store i32 %105, i32* %4
br label %6
106: ; preds = %6
%107 = load i32, i32* %3
ret i32 %107
}

LLVM IR (-O2):
define i32 @canonical(i32 %0) {
br label %2
2: ; preds = %1, %49
%3 = phi i32 [ 0, %1 ], [ %52, %49 ]
%4 = phi i32 [ %0, %1 ], [ %51, %49 ]
%5 = phi i32 [ %0, %1 ], [ %50, %49 ]
%6 = shl i32 %5, 4
%7 = and i32 %6, 196608
%8 = shl i32 %5, 8
%9 = and i32 %8, 49152
%10 = shl i32 %5, 12
%11 = and i32 %10, 12288
%12 = lshr i32 %5, 4
%13 = and i32 %12, 3072
%14 = and i32 %5, 768
%15 = and i32 %6, 192
%16 = or i32 %9, %14
%17 = or i32 %16, %7
%18 = or i32 %17, %11
%19 = or i32 %18, %13
%20 = or i32 %19, %15
%21 = lshr i32 %5, 12
%22 = and i32 %21, 48
%23 = or i32 %20, %22
%24 = lshr i32 %5, 8
%25 = and i32 %24, 12
%26 = or i32 %23, %25
%27 = and i32 %12, 3
%28 = or i32 %26, %27
%29 = icmp eq i32 %3, 3
br i1 %29, label %30, label %49
30: ; preds = %2
%31 = shl i32 %5, 16
%32 = and i32 %31, 196608
%33 = lshr exact i32 %7, 4
%34 = shl nuw nsw i32 %20, 4
%35 = and i32 %34, 3072
%36 = lshr exact i32 %13, 4
%37 = shl i32 %28, 4
%38 = and i32 %37, 48
%39 = and i32 %26, 12
%40 = lshr i32 %23, 4
%41 = and i32 %40, 3
%42 = or i32 %16, %32
%43 = or i32 %42, %33
%44 = or i32 %43, %36
%45 = or i32 %44, %35
%46 = or i32 %45, %39
%47 = or i32 %46, %41
%48 = or i32 %47, %38
br label %49
49: ; preds = %30, %2
%50 = phi i32 [ %48, %30 ], [ %28, %2 ]
%51 = tail call i32 @umin(i32 %4, i32 %50)
%52 = add nuw nsw i32 %3, 1
%53 = icmp eq i32 %52, 8
br i1 %53, label %54, label %2
54: ; preds = %49
ret i32 %51
}