void render_line_2D_BLA(float *mat, int wy, int wx, int x1, int y1, int x2,
                        int y2, float val) {
  int x, y;
  int dx, dy;
  int xinc, yinc;
  int balance;
  if (x2 >= x1) {
    dx = x2 - x1;
    xinc = 1;
  } else {
    dx = x1 - x2;
    xinc = -1;
  }
  if (y2 >= y1) {
    dy = y2 - y1;
    yinc = 1;
  } else {
    dy = y1 - y2;
    yinc = -1;
  }
  x = x1;
  y = y1;
  if (dx >= dy) {
    dy <<= 1;
    balance = dy - dx;
    dx <<= 1;
    while (x != x2) {
      mat[y * wx + x] += val;
      if (balance >= 0) {
        y = y + yinc;
        balance = balance - dx;
      }
      balance = balance + dy;
      x = x + xinc;
    }
    mat[y * wx + x] += val;
  } else {
    dx <<= 1;
    balance = dx - dy;
    dy <<= 1;
    while (y != y2) {
      mat[y * wx + x] += val;
      if (balance >= 0) {
        x = x + xinc;
        balance = balance - dy;
      }
      balance = balance + dx;
      y = y + yinc;
    }
    mat[y * wx + x] += val;
  }
}


x86 assembly (clang, -O0):
<render_line_2D_BLA>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
movss  %xmm0,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1142 <render_line_2D_BLA+0x42>
mov    -0x1c(%rbp),%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x1,-0x34(%rbp)
jmp    1152 <render_line_2D_BLA+0x52>
mov    -0x14(%rbp),%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0xffffffff,-0x34(%rbp)
mov    0x10(%rbp),%eax
cmp    -0x18(%rbp),%eax
jl     1173 <render_line_2D_BLA+0x73>
mov    0x10(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x1,-0x38(%rbp)
jmp    1183 <render_line_2D_BLA+0x83>
mov    -0x18(%rbp),%eax
sub    0x10(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0xffffffff,-0x38(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     123a <render_line_2D_BLA+0x13a>
mov    -0x30(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     1215 <render_line_2D_BLA+0x115>
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
cmpl   $0x0,-0x3c(%rbp)
jl     11fe <render_line_2D_BLA+0xfe>
mov    -0x28(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x3c(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x24(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11b6 <render_line_2D_BLA+0xb6>
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    12d4 <render_line_2D_BLA+0x1d4>
mov    -0x2c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
sub    -0x30(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
cmp    0x10(%rbp),%eax
je     12b4 <render_line_2D_BLA+0x1b4>
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
cmpl   $0x0,-0x3c(%rbp)
jl     129d <render_line_2D_BLA+0x19d>
mov    -0x24(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x3c(%rbp),%eax
sub    -0x30(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x28(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1255 <render_line_2D_BLA+0x155>
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<render_line_2D_BLA>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    0x30(%rsp),%r10d
mov    %r10d,%eax
sub    %r8d,%eax
neg    %eax
xor    %r11d,%r11d
mov    %r10d,%esi
sub    %r8d,%esi
setge  %r11b
cmovl  %eax,%esi
mov    %r9d,%ebx
sub    %ecx,%ebx
neg    %ebx
xor    %ebp,%ebp
mov    %r9d,%r12d
sub    %ecx,%r12d
cmovl  %ebx,%r12d
setge  %bpl
lea    -0x1(%rbp,%rbp,1),%r14d
add    %r11d,%r11d
add    $0xffffffff,%r11d
cmp    %esi,%r12d
jge    11c0 <render_line_2D_BLA+0xc0>
cmp    %r10d,%r8d
je     11bb <render_line_2D_BLA+0xbb>
add    %r12d,%r12d
lea    (%rsi,%rsi,1),%r9d
neg    %r9d
mov    %r12d,%ebp
sub    %esi,%ebp
mov    %r8d,%esi
imul   %edx,%esi
movslq %esi,%rsi
mov    %r11d,%ebx
imul   %edx,%ebx
movslq %ebx,%r15
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movslq %ecx,%rcx
lea    (%rsi,%rcx,1),%rbx
movss  (%rdi,%rbx,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rdi,%rbx,4)
test   %ebp,%ebp
mov    $0x0,%ebx
cmovns %r14d,%ebx
mov    $0x0,%eax
cmovns %r9d,%eax
add    %ebx,%ecx
add    %r12d,%ebp
add    %eax,%ebp
add    %r11d,%r8d
add    %r15,%rsi
cmp    %r8d,%r10d
jne    1180 <render_line_2D_BLA+0x80>
mov    %r10d,%r8d
jmp    1224 <render_line_2D_BLA+0x124>
mov    %r9d,%r10d
cmp    %r9d,%ecx
je     1221 <render_line_2D_BLA+0x121>
add    %esi,%esi
lea    (%r12,%r12,1),%r9d
neg    %r9d
mov    %esi,%ebx
sub    %r12d,%ebx
movslq %ecx,%rax
movslq %r14d,%r14
nopl   0x0(%rax)
mov    %r8d,%ecx
mov    %r8d,%ebp
imul   %edx,%ebp
movslq %ebp,%rbp
add    %rax,%rbp
movss  (%rdi,%rbp,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rdi,%rbp,4)
test   %ebx,%ebx
mov    $0x0,%r8d
cmovns %r11d,%r8d
mov    $0x0,%ebp
cmovns %r9d,%ebp
add    %ecx,%r8d
add    %esi,%ebx
add    %ebp,%ebx
add    %r14,%rax
cmp    %eax,%r10d
jne    11e0 <render_line_2D_BLA+0xe0>
mov    %r10d,%ecx
imul   %edx,%r8d
add    %ecx,%r8d
movslq %r8d,%rax
addss  (%rdi,%rax,4),%xmm0
movss  %xmm0,(%rdi,%rax,4)
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @render_line_2D_BLA(float* nocapture %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, float %7) {
%9 = icmp slt i32 %5, %3
%10 = sub nsw i32 %5, %3
%11 = sub nsw i32 %3, %5
%12 = select i1 %9, i32 %11, i32 %10
%13 = select i1 %9, i32 -1, i32 1
%14 = icmp slt i32 %6, %4
%15 = sub nsw i32 %6, %4
%16 = sub nsw i32 %4, %6
%17 = select i1 %14, i32 %16, i32 %15
%18 = select i1 %14, i32 -1, i32 1
%19 = icmp slt i32 %12, %17
br i1 %19, label %44, label %20
20: ; preds = %8
%21 = shl i32 %17, 1
%22 = mul i32 %12, -2
%23 = icmp eq i32 %3, %5
br i1 %23, label %68, label %24
24: ; preds = %20
%25 = sub nsw i32 %21, %12
br label %26
26: ; preds = %24, %26
%27 = phi i32 [ %41, %26 ], [ %25, %24 ]
%28 = phi i32 [ %38, %26 ], [ %4, %24 ]
%29 = phi i32 [ %42, %26 ], [ %3, %24 ]
%30 = mul nsw i32 %28, %2
%31 = add nsw i32 %30, %29
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds float, float* %0, i64 %32
%34 = load float, float* %33
%35 = fadd float %34, %7
store float %35, float* %33
%36 = icmp sgt i32 %27, -1
%37 = select i1 %36, i32 %18, i32 0
%38 = add nsw i32 %37, %28
%39 = select i1 %36, i32 %22, i32 0
%40 = add i32 %27, %21
%41 = add i32 %40, %39
%42 = add nsw i32 %29, %13
%43 = icmp eq i32 %42, %5
br i1 %43, label %68, label %26
44: ; preds = %8
%45 = shl i32 %12, 1
%46 = mul i32 %17, -2
%47 = icmp eq i32 %4, %6
br i1 %47, label %68, label %48
48: ; preds = %44
%49 = sub nsw i32 %45, %17
br label %50
50: ; preds = %48, %50
%51 = phi i32 [ %65, %50 ], [ %49, %48 ]
%52 = phi i32 [ %66, %50 ], [ %4, %48 ]
%53 = phi i32 [ %62, %50 ], [ %3, %48 ]
%54 = mul nsw i32 %52, %2
%55 = add nsw i32 %54, %53
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds float, float* %0, i64 %56
%58 = load float, float* %57
%59 = fadd float %58, %7
store float %59, float* %57
%60 = icmp sgt i32 %51, -1
%61 = select i1 %60, i32 %13, i32 0
%62 = add nsw i32 %61, %53
%63 = select i1 %60, i32 %46, i32 0
%64 = add i32 %51, %45
%65 = add i32 %64, %63
%66 = add nsw i32 %52, %18
%67 = icmp eq i32 %66, %6
br i1 %67, label %68, label %50
68: ; preds = %26, %50, %44, %20
%69 = phi i32 [ %4, %20 ], [ %6, %44 ], [ %6, %50 ], [ %38, %26 ]
%70 = phi i32 [ %5, %20 ], [ %3, %44 ], [ %62, %50 ], [ %5, %26 ]
%71 = mul nsw i32 %69, %2
%72 = add nsw i32 %71, %70
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds float, float* %0, i64 %73
%75 = load float, float* %74
%76 = fadd float %75, %7
store float %76, float* %74
ret void
}