int integerBreak(int n) {
  int ret = 1;
  if (n <= 3)
    ret = n - 1;
  else {
    while (n > 4) {
      ret *= 3;
      n -= 3;
    }
    ret *= n;
  }
  return ret;
}


x86 assembly (clang, -O0):
<integerBreak>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x1,-0x8(%rbp)
cmpl   $0x3,-0x4(%rbp)
jg     1126 <integerBreak+0x26>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1154 <integerBreak+0x54>
jmp    112b <integerBreak+0x2b>
cmpl   $0x4,-0x4(%rbp)
jle    114a <integerBreak+0x4a>
imul   $0x3,-0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x4(%rbp)
jmp    112b <integerBreak+0x2b>
mov    -0x4(%rbp),%eax
imul   -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<integerBreak>:
cmp    $0x4,%edi
jge    110b <integerBreak+0xb>
add    $0xffffffff,%edi
mov    %edi,%eax
ret
mov    $0x4,%eax
je     123e <integerBreak+0x13e>
mov    $0x2,%eax
sub    %edi,%eax
cmp    $0xfffffffc,%eax
mov    $0xfffffffb,%edx
cmovae %eax,%edx
add    %edi,%edx
mov    $0x1,%eax
cmp    $0x15,%edx
jb     1230 <integerBreak+0x130>
mov    $0xaaaaaaab,%ecx
imul   %rdx,%rcx
shr    $0x21,%rcx
add    $0x1,%ecx
mov    %ecx,%r8d
and    $0x7ffffff8,%r8d
lea    -0x8(%r8),%edx
mov    %edx,%esi
shr    $0x3,%esi
add    $0x1,%esi
mov    %esi,%eax
and    $0x7,%eax
cmp    $0x38,%edx
jae    1176 <integerBreak+0x76>
movdqa 0xe90(%rip),%xmm0
movdqa %xmm0,%xmm1
jmp    11cb <integerBreak+0xcb>
and    $0xfffffff8,%esi
movdqa 0xe7f(%rip),%xmm0
movdqa 0xe87(%rip),%xmm2
movdqa %xmm0,%xmm1
nopl   (%rax)
pshufd $0xf5,%xmm0,%xmm3
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm0
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm2,%xmm3
pshufd $0xe8,%xmm3,%xmm3
punpckldq %xmm3,%xmm1
add    $0xfffffff8,%esi
jne    1190 <integerBreak+0x90>
lea    (%r8,%r8,2),%esi
test   %eax,%eax
je     11fd <integerBreak+0xfd>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqa %xmm0,%xmm2
paddd  %xmm0,%xmm2
paddd  %xmm2,%xmm0
movdqa %xmm1,%xmm2
paddd  %xmm1,%xmm2
paddd  %xmm2,%xmm1
add    $0xffffffff,%eax
jne    11e0 <integerBreak+0xe0>
sub    %esi,%edi
pshufd $0xf5,%xmm0,%xmm2
pshufd $0xf5,%xmm1,%xmm3
pmuludq %xmm2,%xmm3
pmuludq %xmm0,%xmm1
pshufd $0xee,%xmm1,%xmm0
pmuludq %xmm1,%xmm0
pshufd $0xaa,%xmm3,%xmm1
pmuludq %xmm3,%xmm1
pmuludq %xmm0,%xmm1
movd   %xmm1,%eax
cmp    %r8d,%ecx
je     123b <integerBreak+0x13b>
lea    (%rax,%rax,2),%eax
add    $0xfffffffd,%edi
cmp    $0x4,%edi
ja     1230 <integerBreak+0x130>
imul   %edi,%eax
ret

LLVM IR (-O0):
define i32 @integerBreak(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 1, i32* %3
%4 = load i32, i32* %2
%5 = icmp sle i32 %4, 3
br i1 %5, label %6, label %9
6: ; preds = %1
%7 = load i32, i32* %2
%8 = sub nsw i32 %7, 1
store i32 %8, i32* %3
br label %22
9: ; preds = %1
br label %10
10: ; preds = %13, %9
%11 = load i32, i32* %2
%12 = icmp sgt i32 %11, 4
br i1 %12, label %13, label %18
13: ; preds = %10
%14 = load i32, i32* %3
%15 = mul nsw i32 %14, 3
store i32 %15, i32* %3
%16 = load i32, i32* %2
%17 = sub nsw i32 %16, 3
store i32 %17, i32* %2
br label %10
18: ; preds = %10
%19 = load i32, i32* %2
%20 = load i32, i32* %3
%21 = mul nsw i32 %20, %19
store i32 %21, i32* %3
br label %22
22: ; preds = %18, %6
%23 = load i32, i32* %3
ret i32 %23
}

LLVM IR (-O2):
define i32 @integerBreak(i32 %0) {
%2 = icmp slt i32 %0, 4
br i1 %2, label %54, label %3
3: ; preds = %1
%4 = icmp eq i32 %0, 4
br i1 %4, label %66, label %5
5: ; preds = %3
%6 = sub i32 2, %0
%7 = call i32 @llvm.umax.i32(i32 %6, i32 -5)
%8 = add i32 %7, %0
%9 = udiv i32 %8, 3
%10 = add nuw nsw i32 %9, 1
%11 = icmp ult i32 %8, 21
br i1 %11, label %51, label %12
12: ; preds = %5
%13 = and i32 %10, 2147483640
%14 = mul i32 %13, -3
%15 = add i32 %14, %0
%16 = add nsw i32 %13, -8
%17 = lshr exact i32 %16, 3
%18 = add nuw nsw i32 %17, 1
%19 = and i32 %18, 7
%20 = icmp ult i32 %16, 56
br i1 %20, label %31, label %21
21: ; preds = %12
%22 = and i32 %18, 1073741816
br label %23
23: ; preds = %23, %21
%24 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %21 ], [ %27, %23 ]
%25 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %21 ], [ %28, %23 ]
%26 = phi i32 [ 0, %21 ], [ %29, %23 ]
%27 = mul <4 x i32> %24, <i32 6561, i32 6561, i32 6561, i32 6561>
%28 = mul <4 x i32> %25, <i32 6561, i32 6561, i32 6561, i32 6561>
%29 = add nuw i32 %26, 8
%30 = icmp eq i32 %29, %22
br i1 %30, label %31, label %23
31: ; preds = %23, %12
%32 = phi <4 x i32> [ undef, %12 ], [ %27, %23 ]
%33 = phi <4 x i32> [ undef, %12 ], [ %28, %23 ]
%34 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %12 ], [ %27, %23 ]
%35 = phi <4 x i32> [ <i32 1, i32 1, i32 1, i32 1>, %12 ], [ %28, %23 ]
%36 = icmp eq i32 %19, 0
br i1 %36, label %45, label %37
37: ; preds = %31, %37
%38 = phi <4 x i32> [ %41, %37 ], [ %34, %31 ]
%39 = phi <4 x i32> [ %42, %37 ], [ %35, %31 ]
%40 = phi i32 [ %43, %37 ], [ 0, %31 ]
%41 = mul <4 x i32> %38, <i32 3, i32 3, i32 3, i32 3>
%42 = mul <4 x i32> %39, <i32 3, i32 3, i32 3, i32 3>
%43 = add i32 %40, 1
%44 = icmp eq i32 %43, %19
br i1 %44, label %45, label %37
45: ; preds = %37, %31
%46 = phi <4 x i32> [ %32, %31 ], [ %41, %37 ]
%47 = phi <4 x i32> [ %33, %31 ], [ %42, %37 ]
%48 = mul <4 x i32> %47, %46
%49 = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %48)
%50 = icmp eq i32 %10, %13
br i1 %50, label %62, label %51
51: ; preds = %5, %45
%52 = phi i32 [ 1, %5 ], [ %49, %45 ]
%53 = phi i32 [ %0, %5 ], [ %15, %45 ]
br label %56
54: ; preds = %1
%55 = add nsw i32 %0, -1
br label %66
56: ; preds = %51, %56
%57 = phi i32 [ %59, %56 ], [ %52, %51 ]
%58 = phi i32 [ %60, %56 ], [ %53, %51 ]
%59 = mul nsw i32 %57, 3
%60 = add nsw i32 %58, -3
%61 = icmp ugt i32 %60, 4
br i1 %61, label %56, label %62
62: ; preds = %56, %45
%63 = phi i32 [ %49, %45 ], [ %59, %56 ]
%64 = phi i32 [ %15, %45 ], [ %60, %56 ]
%65 = mul nsw i32 %63, %64
br label %66
66: ; preds = %3, %62, %54
%67 = phi i32 [ %55, %54 ], [ %65, %62 ], [ 4, %3 ]
ret i32 %67
}