int getFirstDayOfYear(int year) {
  int currentDay = 7;
  while (year > 1994) {
    if (year == 1997 || ((year - 1 - 1996) % 4 == 0)) {
      currentDay += 366;
    } else
      currentDay += 365;
    year--;
  }
  currentDay = currentDay % 7;
  if (currentDay == 0)
    currentDay = 7;
  return currentDay;
}


x86 assembly (clang, -O0):
<getFirstDayOfYear>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x7,-0x8(%rbp)
cmpl   $0x7ca,-0x4(%rbp)
jle    116d <getFirstDayOfYear+0x6d>
cmpl   $0x7cd,-0x4(%rbp)
je     1144 <getFirstDayOfYear+0x44>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
sub    $0x7cc,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1154 <getFirstDayOfYear+0x54>
mov    -0x8(%rbp),%eax
add    $0x16e,%eax
mov    %eax,-0x8(%rbp)
jmp    115f <getFirstDayOfYear+0x5f>
mov    -0x8(%rbp),%eax
add    $0x16d,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4(%rbp)
jmp    110e <getFirstDayOfYear+0xe>
mov    -0x8(%rbp),%eax
mov    $0x7,%ecx
cltd
idiv   %ecx
mov    %edx,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    118c <getFirstDayOfYear+0x8c>
movl   $0x7,-0x8(%rbp)
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<getFirstDayOfYear>:
mov    $0x7,%ecx
mov    $0x7,%esi
cmp    $0x7cb,%edi
jl     123d <getFirstDayOfYear+0x13d>
xor    %edx,%edx
mov    %edi,%eax
sub    $0x7cb,%eax
cmovb  %edx,%eax
add    $0x1,%eax
mov    $0x7,%esi
cmp    $0x8,%eax
jb     120a <getFirstDayOfYear+0x10a>
mov    %eax,%edx
and    $0xfffffff8,%edx
movd   %edi,%xmm0
sub    %edx,%edi
pshufd $0x0,%xmm0,%xmm3
paddd  0xeb5(%rip),%xmm3
pxor   %xmm8,%xmm8
movdqa 0xeb8(%rip),%xmm1
movdqa 0xebf(%rip),%xmm9
movdqa 0xec6(%rip),%xmm10
pcmpeqd %xmm11,%xmm11
movdqa 0xec8(%rip),%xmm12
movdqa 0xed0(%rip),%xmm2
movdqa 0xed7(%rip),%xmm13
mov    %edx,%esi
pxor   %xmm6,%xmm6
nop
movdqa %xmm3,%xmm7
pcmpeqd %xmm9,%xmm7
movdqa %xmm3,%xmm4
pcmpeqd %xmm10,%xmm4
movdqa %xmm3,%xmm5
paddd  %xmm11,%xmm5
pand   %xmm12,%xmm5
pcmpeqd %xmm8,%xmm5
psrld  $0x1f,%xmm5
movdqa %xmm7,%xmm0
pandn  %xmm5,%xmm0
psubd  %xmm7,%xmm0
movdqa %xmm4,%xmm7
pandn  %xmm5,%xmm7
psubd  %xmm4,%xmm7
paddd  %xmm2,%xmm1
paddd  %xmm0,%xmm1
paddd  %xmm2,%xmm6
paddd  %xmm7,%xmm6
paddd  %xmm13,%xmm3
add    $0xfffffff8,%esi
jne    1190 <getFirstDayOfYear+0x90>
paddd  %xmm1,%xmm6
pshufd $0xee,%xmm6,%xmm0
paddd  %xmm6,%xmm0
pshufd $0x55,%xmm0,%xmm1
paddd  %xmm0,%xmm1
movd   %xmm1,%esi
cmp    %edx,%eax
je     123d <getFirstDayOfYear+0x13d>
add    $0x3,%edi
nopl   (%rax)
cmp    $0x7d0,%edi
sete   %al
test   $0x3,%dil
sete   %dl
or     %al,%dl
movzbl %dl,%eax
add    %eax,%esi
add    $0x16d,%esi
lea    -0x1(%rdi),%eax
add    $0xfffffffd,%edi
cmp    $0x7cb,%edi
mov    %eax,%edi
ja     1210 <getFirstDayOfYear+0x110>
movslq %esi,%rdx
imul   $0xffffffff92492493,%rdx,%rax
shr    $0x20,%rax
add    %edx,%eax
mov    %eax,%esi
shr    $0x1f,%esi
sar    $0x2,%eax
add    %esi,%eax
lea    0x0(,%rax,8),%esi
sub    %esi,%eax
add    %edx,%eax
cmove  %ecx,%eax
ret

LLVM IR (-O0):
define i32 @getFirstDayOfYear(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 7, i32* %3
br label %4
4: ; preds = %22, %1
%5 = load i32, i32* %2
%6 = icmp sgt i32 %5, 1994
br i1 %6, label %7, label %25
7: ; preds = %4
%8 = load i32, i32* %2
%9 = icmp eq i32 %8, 1997
br i1 %9, label %16, label %10
10: ; preds = %7
%11 = load i32, i32* %2
%12 = sub nsw i32 %11, 1
%13 = sub nsw i32 %12, 1996
%14 = srem i32 %13, 4
%15 = icmp eq i32 %14, 0
br i1 %15, label %16, label %19
16: ; preds = %10, %7
%17 = load i32, i32* %3
%18 = add nsw i32 %17, 366
store i32 %18, i32* %3
br label %22
19: ; preds = %10
%20 = load i32, i32* %3
%21 = add nsw i32 %20, 365
store i32 %21, i32* %3
br label %22
22: ; preds = %19, %16
%23 = load i32, i32* %2
%24 = add nsw i32 %23, -1
store i32 %24, i32* %2
br label %4
25: ; preds = %4
%26 = load i32, i32* %3
%27 = srem i32 %26, 7
store i32 %27, i32* %3
%28 = load i32, i32* %3
%29 = icmp eq i32 %28, 0
br i1 %29, label %30, label %31
30: ; preds = %25
store i32 7, i32* %3
br label %31
31: ; preds = %30, %25
%32 = load i32, i32* %3
ret i32 %32
}

LLVM IR (-O2):
define i32 @getFirstDayOfYear(i32 %0) {
%2 = icmp sgt i32 %0, 1994
br i1 %2, label %3, label %55
3: ; preds = %1
%4 = add i32 %0, 1
%5 = call i32 @llvm.umin.i32(i32 %0, i32 1995)
%6 = sub i32 %4, %5
%7 = icmp ult i32 %6, 8
br i1 %7, label %40, label %8
8: ; preds = %3
%9 = and i32 %6, -8
%10 = sub i32 %0, %9
%11 = insertelement <4 x i32> poison, i32 %0, i64 0
%12 = shufflevector <4 x i32> %11, <4 x i32> poison, <4 x i32> zeroinitializer
%13 = add <4 x i32> %12, <i32 0, i32 -1, i32 -2, i32 -3>
br label %14
14: ; preds = %14, %8
%15 = phi i32 [ 0, %8 ], [ %33, %14 ]
%16 = phi <4 x i32> [ <i32 7, i32 0, i32 0, i32 0>, %8 ], [ %31, %14 ]
%17 = phi <4 x i32> [ zeroinitializer, %8 ], [ %32, %14 ]
%18 = phi <4 x i32> [ %13, %8 ], [ %34, %14 ]
%19 = icmp eq <4 x i32> %18, <i32 1997, i32 1997, i32 1997, i32 1997>
%20 = icmp eq <4 x i32> %18, <i32 2001, i32 2001, i32 2001, i32 2001>
%21 = add nuw <4 x i32> %18, <i32 3, i32 3, i32 3, i32 3>
%22 = add <4 x i32> %18, <i32 3, i32 3, i32 3, i32 3>
%23 = and <4 x i32> %21, <i32 3, i32 3, i32 3, i32 3>
%24 = and <4 x i32> %22, <i32 3, i32 3, i32 3, i32 3>
%25 = icmp eq <4 x i32> %23, zeroinitializer
%26 = icmp eq <4 x i32> %24, zeroinitializer
%27 = select <4 x i1> %19, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %25
%28 = select <4 x i1> %20, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %26
%29 = select <4 x i1> %27, <4 x i32> <i32 366, i32 366, i32 366, i32 366>, <4 x i32> <i32 365, i32 365, i32 365, i32 365>
%30 = select <4 x i1> %28, <4 x i32> <i32 366, i32 366, i32 366, i32 366>, <4 x i32> <i32 365, i32 365, i32 365, i32 365>
%31 = add <4 x i32> %16, %29
%32 = add <4 x i32> %17, %30
%33 = add nuw i32 %15, 8
%34 = add <4 x i32> %18, <i32 -8, i32 -8, i32 -8, i32 -8>
%35 = icmp eq i32 %33, %9
br i1 %35, label %36, label %14
36: ; preds = %14
%37 = add <4 x i32> %32, %31
%38 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %37)
%39 = icmp eq i32 %6, %9
br i1 %39, label %55, label %40
40: ; preds = %3, %36
%41 = phi i32 [ 7, %3 ], [ %38, %36 ]
%42 = phi i32 [ %0, %3 ], [ %10, %36 ]
br label %43
43: ; preds = %40, %43
%44 = phi i32 [ %52, %43 ], [ %41, %40 ]
%45 = phi i32 [ %53, %43 ], [ %42, %40 ]
%46 = icmp eq i32 %45, 1997
%47 = add nuw i32 %45, 3
%48 = and i32 %47, 3
%49 = icmp eq i32 %48, 0
%50 = select i1 %46, i1 true, i1 %49
%51 = select i1 %50, i32 366, i32 365
%52 = add nuw nsw i32 %44, %51
%53 = add nsw i32 %45, -1
%54 = icmp ugt i32 %45, 1995
br i1 %54, label %43, label %55
55: ; preds = %43, %36, %1
%56 = phi i32 [ 7, %1 ], [ %38, %36 ], [ %52, %43 ]
%57 = srem i32 %56, 7
%58 = icmp eq i32 %57, 0
%59 = select i1 %58, i32 7, i32 %57
ret i32 %59
}