#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 */
bool checkStraightLine(int **coordinates, int coordinatesSize,
                       int *coordinatesColSize) {
  float k = (coordinates[1][1] - coordinates[0][1]) /
            (coordinates[1][0] - coordinates[0][0]);
  float b = coordinates[0][1] - k * coordinates[0][0];
  for (int i = 2; i < coordinatesSize; i++) {
    if ((k * coordinates[i][0] + b) != coordinates[i][1])
      return false;
  }
  return true;
}


x86 assembly (clang, -O0):
<checkStraightLine>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x4(%rax),%eax
mov    -0x10(%rbp),%rcx
mov    (%rcx),%rcx
sub    0x4(%rcx),%eax
mov    -0x10(%rbp),%rcx
mov    0x8(%rcx),%rcx
mov    (%rcx),%ecx
mov    -0x10(%rbp),%rdx
mov    (%rdx),%rdx
sub    (%rdx),%ecx
cltd
idiv   %ecx
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
cvtsi2ssl 0x4(%rax),%xmm1
movss  -0x24(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
cvtsi2ssl (%rax),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11f2 <checkStraightLine+0xf2>
movss  -0x24(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cvtsi2ssl (%rax),%xmm2
movss  -0x28(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cvtsi2ssl 0x4(%rax),%xmm1
ucomiss %xmm1,%xmm0
jne    11d3 <checkStraightLine+0xd3>
jp     11d3 <checkStraightLine+0xd3>
jmp    11df <checkStraightLine+0xdf>
movl   $0x0,-0x4(%rbp)
jmp    11f9 <checkStraightLine+0xf9>
jmp    11e4 <checkStraightLine+0xe4>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1180 <checkStraightLine+0x80>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<checkStraightLine>:
mov    (%rdi),%rdx
mov    0x8(%rdi),%rax
mov    (%rax),%ecx
mov    0x4(%rax),%eax
mov    (%rdx),%r8d
mov    0x4(%rdx),%r9d
sub    %r9d,%eax
sub    %r8d,%ecx
cltd
idiv   %ecx
mov    %eax,%edx
mov    $0x1,%eax
cmp    $0x3,%esi
jl     115f <checkStraightLine+0x5f>
cvtsi2ss %edx,%xmm0
cvtsi2ss %r9d,%xmm1
cvtsi2ss %r8d,%xmm2
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm1
mov    0x10(%rdi),%rax
xorps  %xmm2,%xmm2
cvtsi2ssl (%rax),%xmm2
mulss  %xmm0,%xmm2
cvtsi2ssl 0x4(%rax),%xmm3
addss  %xmm1,%xmm2
xor    %eax,%eax
ucomiss %xmm3,%xmm2
jne    115f <checkStraightLine+0x5f>
jnp    1160 <checkStraightLine+0x60>
ret
mov    %esi,%ecx
mov    $0x3,%eax
nopw   0x0(%rax,%rax,1)
mov    %rax,%rdx
cmp    %rax,%rcx
je     119e <checkStraightLine+0x9e>
mov    (%rdi,%rdx,8),%rax
xorps  %xmm2,%xmm2
cvtsi2ssl (%rax),%xmm2
mulss  %xmm0,%xmm2
xorps  %xmm3,%xmm3
cvtsi2ssl 0x4(%rax),%xmm3
addss  %xmm1,%xmm2
lea    0x1(%rdx),%rax
ucomiss %xmm3,%xmm2
jne    119e <checkStraightLine+0x9e>
jnp    1170 <checkStraightLine+0x70>
xor    %eax,%eax
cmp    %rcx,%rdx
setae  %al
ret

LLVM IR (-O0):
define i32 @checkStraightLine(i32** %0, i32 %1, i32* %2) {
%4 = alloca i32
%5 = alloca i32**
%6 = alloca i32
%7 = alloca i32*
%8 = alloca float
%9 = alloca float
%10 = alloca i32
store i32** %0, i32*** %5
store i32 %1, i32* %6
store i32* %2, i32** %7
%11 = load i32**, i32*** %5
%12 = getelementptr inbounds i32*, i32** %11, i64 1
%13 = load i32*, i32** %12
%14 = getelementptr inbounds i32, i32* %13, i64 1
%15 = load i32, i32* %14
%16 = load i32**, i32*** %5
%17 = getelementptr inbounds i32*, i32** %16, i64 0
%18 = load i32*, i32** %17
%19 = getelementptr inbounds i32, i32* %18, i64 1
%20 = load i32, i32* %19
%21 = sub nsw i32 %15, %20
%22 = load i32**, i32*** %5
%23 = getelementptr inbounds i32*, i32** %22, i64 1
%24 = load i32*, i32** %23
%25 = getelementptr inbounds i32, i32* %24, i64 0
%26 = load i32, i32* %25
%27 = load i32**, i32*** %5
%28 = getelementptr inbounds i32*, i32** %27, i64 0
%29 = load i32*, i32** %28
%30 = getelementptr inbounds i32, i32* %29, i64 0
%31 = load i32, i32* %30
%32 = sub nsw i32 %26, %31
%33 = sdiv i32 %21, %32
%34 = sitofp i32 %33 to float
store float %34, float* %8
%35 = load i32**, i32*** %5
%36 = getelementptr inbounds i32*, i32** %35, i64 0
%37 = load i32*, i32** %36
%38 = getelementptr inbounds i32, i32* %37, i64 1
%39 = load i32, i32* %38
%40 = sitofp i32 %39 to float
%41 = load float, float* %8
%42 = load i32**, i32*** %5
%43 = getelementptr inbounds i32*, i32** %42, i64 0
%44 = load i32*, i32** %43
%45 = getelementptr inbounds i32, i32* %44, i64 0
%46 = load i32, i32* %45
%47 = sitofp i32 %46 to float
%48 = fneg float %41
%49 = call float @llvm.fmuladd.f32(float %48, float %47, float %40)
store float %49, float* %9
store i32 2, i32* %10
br label %50
50: ; preds = %77, %3
%51 = load i32, i32* %10
%52 = load i32, i32* %6
%53 = icmp slt i32 %51, %52
br i1 %53, label %54, label %80
54: ; preds = %50
%55 = load float, float* %8
%56 = load i32**, i32*** %5
%57 = load i32, i32* %10
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i32*, i32** %56, i64 %58
%60 = load i32*, i32** %59
%61 = getelementptr inbounds i32, i32* %60, i64 0
%62 = load i32, i32* %61
%63 = sitofp i32 %62 to float
%64 = load float, float* %9
%65 = call float @llvm.fmuladd.f32(float %55, float %63, float %64)
%66 = load i32**, i32*** %5
%67 = load i32, i32* %10
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i32*, i32** %66, i64 %68
%70 = load i32*, i32** %69
%71 = getelementptr inbounds i32, i32* %70, i64 1
%72 = load i32, i32* %71
%73 = sitofp i32 %72 to float
%74 = fcmp une float %65, %73
br i1 %74, label %75, label %76
75: ; preds = %54
store i32 0, i32* %4
br label %81
76: ; preds = %54
br label %77
77: ; preds = %76
%78 = load i32, i32* %10
%79 = add nsw i32 %78, 1
store i32 %79, i32* %10
br label %50
80: ; preds = %50
store i32 1, i32* %4
br label %81
81: ; preds = %80, %75
%82 = load i32, i32* %4
ret i32 %82
}

LLVM IR (-O2):
define i32 @checkStraightLine(i32** nocapture %0, i32 %1, i32* nocapture readnone %2) {
%4 = getelementptr inbounds i32*, i32** %0, i64 1
%5 = load i32*, i32** %4
%6 = getelementptr inbounds i32, i32* %5, i64 1
%7 = load i32, i32* %6
%8 = load i32*, i32** %0
%9 = getelementptr inbounds i32, i32* %8, i64 1
%10 = load i32, i32* %9
%11 = sub nsw i32 %7, %10
%12 = load i32, i32* %5
%13 = load i32, i32* %8
%14 = sub nsw i32 %12, %13
%15 = sdiv i32 %11, %14
%16 = sitofp i32 %15 to float
%17 = sitofp i32 %10 to float
%18 = sitofp i32 %13 to float
%19 = fneg float %16
%20 = tail call float @llvm.fmuladd.f32(float %19, float %18, float %17)
%21 = icmp sgt i32 %1, 2
br i1 %21, label %22, label %51
22: ; preds = %3
%23 = zext i32 %1 to i64
%24 = zext i32 %1 to i64
%25 = getelementptr inbounds i32*, i32** %0, i64 2
%26 = load i32*, i32** %25
%27 = load i32, i32* %26
%28 = sitofp i32 %27 to float
%29 = tail call float @llvm.fmuladd.f32(float %16, float %28, float %20)
%30 = getelementptr inbounds i32, i32* %26, i64 1
%31 = load i32, i32* %30
%32 = sitofp i32 %31 to float
%33 = fcmp une float %29, %32
br i1 %33, label %51, label %34
34: ; preds = %22, %37
%35 = phi i64 [ %47, %37 ], [ 3, %22 ]
%36 = icmp eq i64 %35, %24
br i1 %36, label %48, label %37
37: ; preds = %34
%38 = getelementptr inbounds i32*, i32** %0, i64 %35
%39 = load i32*, i32** %38
%40 = load i32, i32* %39
%41 = sitofp i32 %40 to float
%42 = tail call float @llvm.fmuladd.f32(float %16, float %41, float %20)
%43 = getelementptr inbounds i32, i32* %39, i64 1
%44 = load i32, i32* %43
%45 = sitofp i32 %44 to float
%46 = fcmp une float %42, %45
%47 = add nuw nsw i64 %35, 1
br i1 %46, label %48, label %34
48: ; preds = %34, %37
%49 = icmp uge i64 %35, %23
%50 = zext i1 %49 to i32
br label %51
51: ; preds = %48, %22, %3
%52 = phi i32 [ 1, %3 ], [ 0, %22 ], [ %50, %48 ]
ret i32 %52
}