void checkLeftImpact(float ballY, float *ballX, float LEFT_IMPACT_X,
                     float *ballDeltaY, float *ballDeltaX, int BALL_DIAMETER,
                     float leftPadY, int PAD_HEIGHT, float MAX_BALL_Y_SPEED) {
  float ballImpactY =
      ballY + (LEFT_IMPACT_X - *ballX) * (*ballDeltaY / *ballDeltaX);
  if (ballImpactY + BALL_DIAMETER - 1 >= leftPadY &&
      ballImpactY <= leftPadY + PAD_HEIGHT - 1 &&
      *ballX - *ballDeltaX >= LEFT_IMPACT_X) {
    float impactSection = (ballImpactY - (leftPadY - BALL_DIAMETER + 1)) * 8 /
                          (PAD_HEIGHT + BALL_DIAMETER);
    if (impactSection <= 1) {
      *ballDeltaY = -MAX_BALL_Y_SPEED;
    } else if (impactSection <= 2) {
      *ballDeltaY = -MAX_BALL_Y_SPEED * 3 / 4;
    } else if (impactSection <= 3) {
      *ballDeltaY = -MAX_BALL_Y_SPEED * 2 / 4;
    } else if (impactSection <= 4) {
      *ballDeltaY = -MAX_BALL_Y_SPEED / 4;
    } else if (impactSection <= 5) {
      *ballDeltaY = MAX_BALL_Y_SPEED / 4;
    } else if (impactSection <= 6) {
      *ballDeltaY = MAX_BALL_Y_SPEED * 2 / 4;
    } else if (impactSection <= 7) {
      *ballDeltaY = MAX_BALL_Y_SPEED * 3 / 4;
    } else if (impactSection <= 8) {
      *ballDeltaY = MAX_BALL_Y_SPEED;
    }
    *ballX = LEFT_IMPACT_X + (LEFT_IMPACT_X - *ballX);
    if (-*ballDeltaX * 1.05 < 1) {
      *ballDeltaX *= 1.05;
    }
    *ballDeltaX *= -1.0;
  }
  return;
}


x86 assembly (clang, -O0):
<checkLeftImpact>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %ecx,-0x2c(%rbp)
movss  %xmm2,-0x30(%rbp)
mov    %r8d,-0x34(%rbp)
movss  %xmm3,-0x38(%rbp)
movss  -0x4(%rbp),%xmm1
movss  -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
subss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm2
mov    -0x28(%rbp),%rax
divss  (%rax),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x3c(%rbp),%xmm0
cvtsi2ssl -0x2c(%rbp),%xmm1
addss  %xmm1,%xmm0
movss  0xe90(%rip),%xmm1
subss  %xmm1,%xmm0
ucomiss -0x30(%rbp),%xmm0
jb     1479 <checkLeftImpact+0x379>
movss  -0x3c(%rbp),%xmm1
movss  -0x30(%rbp),%xmm0
cvtsi2ssl -0x34(%rbp),%xmm2
addss  %xmm2,%xmm0
movss  0xe67(%rip),%xmm2
subss  %xmm2,%xmm0
ucomiss %xmm1,%xmm0
jb     1479 <checkLeftImpact+0x379>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x28(%rbp),%rax
subss  (%rax),%xmm0
ucomiss -0x14(%rbp),%xmm0
jb     1479 <checkLeftImpact+0x379>
movss  -0x3c(%rbp),%xmm0
movss  -0x30(%rbp),%xmm1
cvtsi2ssl -0x2c(%rbp),%xmm2
subss  %xmm2,%xmm1
movss  0xe25(%rip),%xmm2
addss  %xmm2,%xmm1
subss  %xmm1,%xmm0
movss  0xe19(%rip),%xmm1
mulss  %xmm1,%xmm0
mov    -0x34(%rbp),%eax
add    -0x2c(%rbp),%eax
cvtsi2ss %eax,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  0xdf6(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     1233 <checkLeftImpact+0x133>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13e4 <checkLeftImpact+0x2e4>
movss  0xdcd(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     127c <checkLeftImpact+0x17c>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xdad(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  0xda5(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13df <checkLeftImpact+0x2df>
movss  0xd88(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     12c5 <checkLeftImpact+0x1c5>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xd60(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  0xd5c(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13da <checkLeftImpact+0x2da>
movss  0xd43(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     1302 <checkLeftImpact+0x202>
movss  -0x38(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  0xd1f(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13d5 <checkLeftImpact+0x2d5>
movss  0xd0a(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     1332 <checkLeftImpact+0x232>
movss  -0x38(%rbp),%xmm0
movss  0xcef(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13d0 <checkLeftImpact+0x2d0>
movss  0xcde(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     136a <checkLeftImpact+0x26a>
movss  0xcbc(%rip),%xmm0
mulss  -0x38(%rbp),%xmm0
movss  0xcb7(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13cb <checkLeftImpact+0x2cb>
movss  0xcaa(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     13a2 <checkLeftImpact+0x2a2>
movss  0xc88(%rip),%xmm0
mulss  -0x38(%rbp),%xmm0
movss  0xc7f(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13c6 <checkLeftImpact+0x2c6>
movss  0xc5a(%rip),%xmm0
ucomiss -0x40(%rbp),%xmm0
jb     13c1 <checkLeftImpact+0x2c1>
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
jmp    13c6 <checkLeftImpact+0x2c6>
jmp    13cb <checkLeftImpact+0x2cb>
jmp    13d0 <checkLeftImpact+0x2d0>
jmp    13d5 <checkLeftImpact+0x2d5>
jmp    13da <checkLeftImpact+0x2da>
jmp    13df <checkLeftImpact+0x2df>
jmp    13e4 <checkLeftImpact+0x2e4>
movss  -0x14(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
mov    -0x10(%rbp),%rax
subss  (%rax),%xmm1
addss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xc05(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xbf1(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1459 <checkLeftImpact+0x359>
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbdb(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xbc3(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkLeftImpact>:
movss  (%rdi),%xmm5
movaps %xmm1,%xmm7
subss  %xmm5,%xmm7
movss  (%rsi),%xmm4
movss  (%rdx),%xmm6
divss  %xmm6,%xmm4
mulss  %xmm7,%xmm4
addss  %xmm0,%xmm4
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
movaps %xmm4,%xmm7
addss  %xmm0,%xmm7
addss  0xecb(%rip),%xmm7
ucomiss %xmm2,%xmm7
jb     127c <checkLeftImpact+0x17c>
xorps  %xmm7,%xmm7
cvtsi2ss %r8d,%xmm7
addss  %xmm2,%xmm7
addss  0xeae(%rip),%xmm7
ucomiss %xmm4,%xmm7
jb     127c <checkLeftImpact+0x17c>
subss  %xmm6,%xmm5
ucomiss %xmm1,%xmm5
jb     127c <checkLeftImpact+0x17c>
subss  %xmm0,%xmm2
movss  0xe90(%rip),%xmm0
addss  %xmm0,%xmm2
subss  %xmm2,%xmm4
mulss  0xe84(%rip),%xmm4
add    %ecx,%r8d
xorps  %xmm2,%xmm2
cvtsi2ss %r8d,%xmm2
divss  %xmm2,%xmm4
ucomiss %xmm4,%xmm0
jae    1201 <checkLeftImpact+0x101>
movss  0xe6c(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    120a <checkLeftImpact+0x10a>
movss  0xe6b(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    1214 <checkLeftImpact+0x114>
movss  0xe66(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    127d <checkLeftImpact+0x17d>
movss  0xe5d(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    121c <checkLeftImpact+0x11c>
movss  0xe54(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    1287 <checkLeftImpact+0x187>
movss  0xe47(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    128d <checkLeftImpact+0x18d>
movss  0xe0e(%rip),%xmm0
ucomiss %xmm4,%xmm0
jae    1224 <checkLeftImpact+0x124>
jmp    1228 <checkLeftImpact+0x128>
xorps  0xe38(%rip),%xmm3
jmp    1224 <checkLeftImpact+0x124>
mulss  0xdfe(%rip),%xmm3
jmp    121c <checkLeftImpact+0x11c>
mulss  0xe00(%rip),%xmm3
mulss  0xdf0(%rip),%xmm3
movss  %xmm3,(%rsi)
movaps %xmm1,%xmm0
subss  (%rdi),%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rdi)
movss  (%rdx),%xmm1
movaps 0xdfe(%rip),%xmm0
movaps %xmm1,%xmm2
xorps  %xmm0,%xmm2
xorps  %xmm3,%xmm3
cvtss2sd %xmm2,%xmm3
movsd  0xdf9(%rip),%xmm2
mulsd  %xmm2,%xmm3
movsd  0xdf5(%rip),%xmm4
ucomisd %xmm3,%xmm4
jbe    1275 <checkLeftImpact+0x175>
cvtss2sd %xmm1,%xmm1
mulsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
xorps  %xmm0,%xmm1
movss  %xmm1,(%rdx)
ret
mulss  0xd9f(%rip),%xmm3
jmp    1224 <checkLeftImpact+0x124>
addss  %xmm3,%xmm3
jmp    121c <checkLeftImpact+0x11c>
mulss  0xd83(%rip),%xmm3
jmp    121c <checkLeftImpact+0x11c>

LLVM IR (-O0):
define void @checkLeftImpact(float %0, float* %1, float %2, float* %3, float* %4, i32 %5, float %6, i32 %7, float %8) {
%10 = alloca float
%11 = alloca float*
%12 = alloca float
%13 = alloca float*
%14 = alloca float*
%15 = alloca i32
%16 = alloca float
%17 = alloca i32
%18 = alloca float
%19 = alloca float
%20 = alloca float
store float %0, float* %10
store float* %1, float** %11
store float %2, float* %12
store float* %3, float** %13
store float* %4, float** %14
store i32 %5, i32* %15
store float %6, float* %16
store i32 %7, i32* %17
store float %8, float* %18
%21 = load float, float* %10
%22 = load float, float* %12
%23 = load float*, float** %11
%24 = load float, float* %23
%25 = fsub float %22, %24
%26 = load float*, float** %13
%27 = load float, float* %26
%28 = load float*, float** %14
%29 = load float, float* %28
%30 = fdiv float %27, %29
%31 = call float @llvm.fmuladd.f32(float %25, float %30, float %21)
store float %31, float* %19
%32 = load float, float* %19
%33 = load i32, i32* %15
%34 = sitofp i32 %33 to float
%35 = fadd float %32, %34
%36 = fsub float %35, 1.000000e+00
%37 = load float, float* %16
%38 = fcmp oge float %36, %37
br i1 %38, label %39, label %163
39: ; preds = %9
%40 = load float, float* %19
%41 = load float, float* %16
%42 = load i32, i32* %17
%43 = sitofp i32 %42 to float
%44 = fadd float %41, %43
%45 = fsub float %44, 1.000000e+00
%46 = fcmp ole float %40, %45
br i1 %46, label %47, label %163
47: ; preds = %39
%48 = load float*, float** %11
%49 = load float, float* %48
%50 = load float*, float** %14
%51 = load float, float* %50
%52 = fsub float %49, %51
%53 = load float, float* %12
%54 = fcmp oge float %52, %53
br i1 %54, label %55, label %163
55: ; preds = %47
%56 = load float, float* %19
%57 = load float, float* %16
%58 = load i32, i32* %15
%59 = sitofp i32 %58 to float
%60 = fsub float %57, %59
%61 = fadd float %60, 1.000000e+00
%62 = fsub float %56, %61
%63 = fmul float %62, 8.000000e+00
%64 = load i32, i32* %17
%65 = load i32, i32* %15
%66 = add nsw i32 %64, %65
%67 = sitofp i32 %66 to float
%68 = fdiv float %63, %67
store float %68, float* %20
%69 = load float, float* %20
%70 = fcmp ole float %69, 1.000000e+00
br i1 %70, label %71, label %75
71: ; preds = %55
%72 = load float, float* %18
%73 = fneg float %72
%74 = load float*, float** %13
store float %73, float* %74
br label %137
75: ; preds = %55
%76 = load float, float* %20
%77 = fcmp ole float %76, 2.000000e+00
br i1 %77, label %78, label %84
78: ; preds = %75
%79 = load float, float* %18
%80 = fneg float %79
%81 = fmul float %80, 3.000000e+00
%82 = fdiv float %81, 4.000000e+00
%83 = load float*, float** %13
store float %82, float* %83
br label %136
84: ; preds = %75
%85 = load float, float* %20
%86 = fcmp ole float %85, 3.000000e+00
br i1 %86, label %87, label %93
87: ; preds = %84
%88 = load float, float* %18
%89 = fneg float %88
%90 = fmul float %89, 2.000000e+00
%91 = fdiv float %90, 4.000000e+00
%92 = load float*, float** %13
store float %91, float* %92
br label %135
93: ; preds = %84
%94 = load float, float* %20
%95 = fcmp ole float %94, 4.000000e+00
br i1 %95, label %96, label %101
96: ; preds = %93
%97 = load float, float* %18
%98 = fneg float %97
%99 = fdiv float %98, 4.000000e+00
%100 = load float*, float** %13
store float %99, float* %100
br label %134
101: ; preds = %93
%102 = load float, float* %20
%103 = fcmp ole float %102, 5.000000e+00
br i1 %103, label %104, label %108
104: ; preds = %101
%105 = load float, float* %18
%106 = fdiv float %105, 4.000000e+00
%107 = load float*, float** %13
store float %106, float* %107
br label %133
108: ; preds = %101
%109 = load float, float* %20
%110 = fcmp ole float %109, 6.000000e+00
br i1 %110, label %111, label %116
111: ; preds = %108
%112 = load float, float* %18
%113 = fmul float %112, 2.000000e+00
%114 = fdiv float %113, 4.000000e+00
%115 = load float*, float** %13
store float %114, float* %115
br label %132
116: ; preds = %108
%117 = load float, float* %20
%118 = fcmp ole float %117, 7.000000e+00
br i1 %118, label %119, label %124
119: ; preds = %116
%120 = load float, float* %18
%121 = fmul float %120, 3.000000e+00
%122 = fdiv float %121, 4.000000e+00
%123 = load float*, float** %13
store float %122, float* %123
br label %131
124: ; preds = %116
%125 = load float, float* %20
%126 = fcmp ole float %125, 8.000000e+00
br i1 %126, label %127, label %130
127: ; preds = %124
%128 = load float, float* %18
%129 = load float*, float** %13
store float %128, float* %129
br label %130
130: ; preds = %127, %124
br label %131
131: ; preds = %130, %119
br label %132
132: ; preds = %131, %111
br label %133
133: ; preds = %132, %104
br label %134
134: ; preds = %133, %96
br label %135
135: ; preds = %134, %87
br label %136
136: ; preds = %135, %78
br label %137
137: ; preds = %136, %71
%138 = load float, float* %12
%139 = load float, float* %12
%140 = load float*, float** %11
%141 = load float, float* %140
%142 = fsub float %139, %141
%143 = fadd float %138, %142
%144 = load float*, float** %11
store float %143, float* %144
%145 = load float*, float** %14
%146 = load float, float* %145
%147 = fneg float %146
%148 = fpext float %147 to double
%149 = fmul double %148, 1.050000e+00
%150 = fcmp olt double %149, 1.000000e+00
br i1 %150, label %151, label %157
151: ; preds = %137
%152 = load float*, float** %14
%153 = load float, float* %152
%154 = fpext float %153 to double
%155 = fmul double %154, 1.050000e+00
%156 = fptrunc double %155 to float
store float %156, float* %152
br label %157
157: ; preds = %151, %137
%158 = load float*, float** %14
%159 = load float, float* %158
%160 = fpext float %159 to double
%161 = fmul double %160, -1.000000e+00
%162 = fptrunc double %161 to float
store float %162, float* %158
br label %163
163: ; preds = %157, %47, %39, %9
ret void
}

LLVM IR (-O2):
define void @checkLeftImpact(float %0, float* nocapture %1, float %2, float* nocapture %3, float* nocapture %4, i32 %5, float %6, i32 %7, float %8) {
%10 = load float, float* %1
%11 = fsub float %2, %10
%12 = load float, float* %3
%13 = load float, float* %4
%14 = fdiv float %12, %13
%15 = tail call float @llvm.fmuladd.f32(float %11, float %14, float %0)
%16 = sitofp i32 %5 to float
%17 = fadd float %15, %16
%18 = fadd float %17, -1.000000e+00
%19 = fcmp ult float %18, %6
br i1 %19, label %85, label %20
20: ; preds = %9
%21 = sitofp i32 %7 to float
%22 = fadd float %21, %6
%23 = fadd float %22, -1.000000e+00
%24 = fcmp ugt float %15, %23
%25 = fsub float %10, %13
%26 = fcmp ult float %25, %2
%27 = select i1 %24, i1 true, i1 %26
br i1 %27, label %85, label %28
28: ; preds = %20
%29 = fsub float %6, %16
%30 = fadd float %29, 1.000000e+00
%31 = fsub float %15, %30
%32 = fmul float %31, 8.000000e+00
%33 = add nsw i32 %7, %5
%34 = sitofp i32 %33 to float
%35 = fdiv float %32, %34
%36 = fcmp ugt float %35, 1.000000e+00
br i1 %36, label %39, label %37
37: ; preds = %28
%38 = fneg float %8
br label %69
39: ; preds = %28
%40 = fcmp ugt float %35, 2.000000e+00
br i1 %40, label %44, label %41
41: ; preds = %39
%42 = fmul float %8, -3.000000e+00
%43 = fmul float %42, 2.500000e-01
br label %69
44: ; preds = %39
%45 = fcmp ugt float %35, 3.000000e+00
br i1 %45, label %49, label %46
46: ; preds = %44
%47 = fmul float %8, -2.000000e+00
%48 = fmul float %47, 2.500000e-01
br label %69
49: ; preds = %44
%50 = fcmp ugt float %35, 4.000000e+00
br i1 %50, label %53, label %51
51: ; preds = %49
%52 = fmul float %8, -2.500000e-01
br label %69
53: ; preds = %49
%54 = fcmp ugt float %35, 5.000000e+00
br i1 %54, label %57, label %55
55: ; preds = %53
%56 = fmul float %8, 2.500000e-01
br label %69
57: ; preds = %53
%58 = fcmp ugt float %35, 6.000000e+00
br i1 %58, label %62, label %59
59: ; preds = %57
%60 = fmul float %8, 2.000000e+00
%61 = fmul float %60, 2.500000e-01
br label %69
62: ; preds = %57
%63 = fcmp ugt float %35, 7.000000e+00
br i1 %63, label %67, label %64
64: ; preds = %62
%65 = fmul float %8, 3.000000e+00
%66 = fmul float %65, 2.500000e-01
br label %69
67: ; preds = %62
%68 = fcmp ugt float %35, 8.000000e+00
br i1 %68, label %71, label %69
69: ; preds = %67, %37, %46, %55, %64, %59, %51, %41
%70 = phi float [ %43, %41 ], [ %52, %51 ], [ %61, %59 ], [ %66, %64 ], [ %56, %55 ], [ %48, %46 ], [ %38, %37 ], [ %8, %67 ]
store float %70, float* %3
br label %71
71: ; preds = %69, %67
%72 = load float, float* %1
%73 = fsub float %2, %72
%74 = fadd float %73, %2
store float %74, float* %1
%75 = load float, float* %4
%76 = fneg float %75
%77 = fpext float %76 to double
%78 = fmul double %77, 1.050000e+00
%79 = fcmp olt double %78, 1.000000e+00
%80 = fpext float %75 to double
%81 = fmul double %80, 1.050000e+00
%82 = fptrunc double %81 to float
%83 = select i1 %79, float %82, float %75
%84 = fneg float %83
store float %84, float* %4
br label %85
85: ; preds = %71, %20, %9
ret void
}