double fixup(double *d) {
  if (*d < 0) {
    while (*d < 0)
      *d += 360;
  } else {
    while (*d > 360)
      *d -= 360;
  }
  return (*d);
}


x86 assembly (clang, -O0):
<fixup>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    114d <fixup+0x4d>
jmp    111e <fixup+0x1e>
mov    -0x8(%rbp),%rax
xorps  %xmm0,%xmm0
ucomisd (%rax),%xmm0
jbe    1148 <fixup+0x48>
mov    -0x8(%rbp),%rax
movsd  0xec5(%rip),%xmm0
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
jmp    111e <fixup+0x1e>
jmp    118e <fixup+0x8e>
jmp    1152 <fixup+0x52>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xe9e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1189 <fixup+0x89>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  0xe84(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
jmp    1152 <fixup+0x52>
jmp    118e <fixup+0x8e>
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<fixup>:
movsd  (%rdi),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    112c <fixup+0x2c>
movsd  0xeea(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
addsd  %xmm2,%xmm0
ucomisd %xmm0,%xmm1
ja     1120 <fixup+0x20>
jmp    115a <fixup+0x5a>
ucomisd 0xecc(%rip),%xmm0
jbe    115e <fixup+0x5e>
movsd  0xeca(%rip),%xmm1
movsd  0xeba(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
addsd  %xmm1,%xmm0
ucomisd %xmm2,%xmm0
ja     1150 <fixup+0x50>
movsd  %xmm0,(%rdi)
ret

LLVM IR (-O0):
define double @fixup(double* %0) {
%2 = alloca double*
store double* %0, double** %2
%3 = load double*, double** %2
%4 = load double, double* %3
%5 = fcmp olt double %4, 0.000000e+00
br i1 %5, label %6, label %16
6: ; preds = %1
br label %7
7: ; preds = %11, %6
%8 = load double*, double** %2
%9 = load double, double* %8
%10 = fcmp olt double %9, 0.000000e+00
br i1 %10, label %11, label %15
11: ; preds = %7
%12 = load double*, double** %2
%13 = load double, double* %12
%14 = fadd double %13, 3.600000e+02
store double %14, double* %12
br label %7
15: ; preds = %7
br label %26
16: ; preds = %1
br label %17
17: ; preds = %21, %16
%18 = load double*, double** %2
%19 = load double, double* %18
%20 = fcmp ogt double %19, 3.600000e+02
br i1 %20, label %21, label %25
21: ; preds = %17
%22 = load double*, double** %2
%23 = load double, double* %22
%24 = fsub double %23, 3.600000e+02
store double %24, double* %22
br label %17
25: ; preds = %17
br label %26
26: ; preds = %25, %15
%27 = load double*, double** %2
%28 = load double, double* %27
ret double %28
}

LLVM IR (-O2):
define double @fixup(double* nocapture %0) {
%2 = load double, double* %0
%3 = fcmp olt double %2, 0.000000e+00
br i1 %3, label %6, label %4
4: ; preds = %1
%5 = fcmp ogt double %2, 3.600000e+02
br i1 %5, label %10, label %16
6: ; preds = %1, %6
%7 = phi double [ %8, %6 ], [ %2, %1 ]
%8 = fadd double %7, 3.600000e+02
%9 = fcmp olt double %8, 0.000000e+00
br i1 %9, label %6, label %14
10: ; preds = %4, %10
%11 = phi double [ %12, %10 ], [ %2, %4 ]
%12 = fadd double %11, -3.600000e+02
%13 = fcmp ogt double %12, 3.600000e+02
br i1 %13, label %10, label %14
14: ; preds = %10, %6
%15 = phi double [ %8, %6 ], [ %12, %10 ]
store double %15, double* %0
br label %16
16: ; preds = %14, %4
%17 = phi double [ %2, %4 ], [ %15, %14 ]
ret double %17
}