void substitute_variable(float A[6][10 + 1], int var, float val) {
  int i;
  for (i = 0; i < 6; i++) {
    if (A[i][var] != 0) {
      A[i][10] -= (A[i][var] * val);
      A[i][var] = 0;
    }
  }
}


x86 assembly (clang, -O0):
<substitute_variable>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x6,-0x14(%rbp)
jge    11ca <substitute_variable+0xca>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0xc(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1150 <substitute_variable+0x50>
jp     1150 <substitute_variable+0x50>
jmp    11b7 <substitute_variable+0xb7>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0xc(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  -0x10(%rbp),%xmm2
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movss  0x28(%rax),%xmm1
movd   %xmm0,%ecx
xor    $0x80000000,%ecx
movd   %ecx,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,0x28(%rax)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
imul   $0x2c,%rcx,%rcx
add    %rcx,%rax
movslq -0xc(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
jmp    11bc <substitute_variable+0xbc>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1117 <substitute_variable+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<substitute_variable>:
movslq %esi,%rax
movss  (%rdi,%rax,4),%xmm2
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm2
jne    1112 <substitute_variable+0x12>
jnp    112b <substitute_variable+0x2b>
movss  0x28(%rdi),%xmm3
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm3
movss  %xmm3,0x28(%rdi)
movl   $0x0,(%rdi,%rax,4)
movss  0x2c(%rdi,%rax,4),%xmm2
ucomiss %xmm1,%xmm2
jne    1138 <substitute_variable+0x38>
jnp    1152 <substitute_variable+0x52>
movss  0x54(%rdi),%xmm1
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm1
movss  %xmm1,0x54(%rdi)
movl   $0x0,0x2c(%rdi,%rax,4)
movss  0x58(%rdi,%rax,4),%xmm2
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm2
jne    1162 <substitute_variable+0x62>
jnp    1182 <substitute_variable+0x82>
movss  0x80(%rdi),%xmm3
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm3
movss  %xmm3,0x80(%rdi)
movl   $0x0,0x58(%rdi,%rax,4)
movss  0x84(%rdi,%rax,4),%xmm2
ucomiss %xmm1,%xmm2
jne    1192 <substitute_variable+0x92>
jnp    11b5 <substitute_variable+0xb5>
movss  0xac(%rdi),%xmm1
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm1
movss  %xmm1,0xac(%rdi)
movl   $0x0,0x84(%rdi,%rax,4)
movss  0xb0(%rdi,%rax,4),%xmm2
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm2
jne    11c8 <substitute_variable+0xc8>
jnp    11eb <substitute_variable+0xeb>
movss  0xd8(%rdi),%xmm3
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm3
movss  %xmm3,0xd8(%rdi)
movl   $0x0,0xb0(%rdi,%rax,4)
movss  0xdc(%rdi,%rax,4),%xmm2
ucomiss %xmm1,%xmm2
jne    11fb <substitute_variable+0xfb>
jnp    121e <substitute_variable+0x11e>
movss  0x104(%rdi),%xmm1
mulss  %xmm0,%xmm2
subss  %xmm2,%xmm1
movss  %xmm1,0x104(%rdi)
movl   $0x0,0xdc(%rdi,%rax,4)
ret

LLVM IR (-O0):
define void @substitute_variable([11 x float]* %0, i32 %1, float %2) {
%4 = alloca [11 x float]*
%5 = alloca i32
%6 = alloca float
%7 = alloca i32
store [11 x float]* %0, [11 x float]** %4
store i32 %1, i32* %5
store float %2, float* %6
store i32 0, i32* %7
br label %8
8: ; preds = %47, %3
%9 = load i32, i32* %7
%10 = icmp slt i32 %9, 6
br i1 %10, label %11, label %50
11: ; preds = %8
%12 = load [11 x float]*, [11 x float]** %4
%13 = load i32, i32* %7
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds [11 x float], [11 x float]* %12, i64 %14
%16 = load i32, i32* %5
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [11 x float], [11 x float]* %15, i64 0, i64 %17
%19 = load float, float* %18
%20 = fcmp une float %19, 0.000000e+00
br i1 %20, label %21, label %46
21: ; preds = %11
%22 = load [11 x float]*, [11 x float]** %4
%23 = load i32, i32* %7
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [11 x float], [11 x float]* %22, i64 %24
%26 = load i32, i32* %5
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [11 x float], [11 x float]* %25, i64 0, i64 %27
%29 = load float, float* %28
%30 = load float, float* %6
%31 = load [11 x float]*, [11 x float]** %4
%32 = load i32, i32* %7
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds [11 x float], [11 x float]* %31, i64 %33
%35 = getelementptr inbounds [11 x float], [11 x float]* %34, i64 0, i64 10
%36 = load float, float* %35
%37 = fneg float %29
%38 = call float @llvm.fmuladd.f32(float %37, float %30, float %36)
store float %38, float* %35
%39 = load [11 x float]*, [11 x float]** %4
%40 = load i32, i32* %7
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [11 x float], [11 x float]* %39, i64 %41
%43 = load i32, i32* %5
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [11 x float], [11 x float]* %42, i64 0, i64 %44
store float 0.000000e+00, float* %45
br label %46
46: ; preds = %21, %11
br label %47
47: ; preds = %46
%48 = load i32, i32* %7
%49 = add nsw i32 %48, 1
store i32 %49, i32* %7
br label %8
50: ; preds = %8
ret void
}

LLVM IR (-O2):
define void @substitute_variable([11 x float]* nocapture %0, i32 %1, float %2) {
%4 = sext i32 %1 to i64
%5 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 0, i64 %4
%6 = load float, float* %5
%7 = fcmp une float %6, 0.000000e+00
br i1 %7, label %8, label %13
8: ; preds = %3
%9 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 0, i64 10
%10 = load float, float* %9
%11 = fneg float %6
%12 = tail call float @llvm.fmuladd.f32(float %11, float %2, float %10)
store float %12, float* %9
store float 0.000000e+00, float* %5
br label %13
13: ; preds = %3, %8
%14 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 1, i64 %4
%15 = load float, float* %14
%16 = fcmp une float %15, 0.000000e+00
br i1 %16, label %17, label %22
17: ; preds = %13
%18 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 1, i64 10
%19 = load float, float* %18
%20 = fneg float %15
%21 = tail call float @llvm.fmuladd.f32(float %20, float %2, float %19)
store float %21, float* %18
store float 0.000000e+00, float* %14
br label %22
22: ; preds = %17, %13
%23 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 2, i64 %4
%24 = load float, float* %23
%25 = fcmp une float %24, 0.000000e+00
br i1 %25, label %26, label %31
26: ; preds = %22
%27 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 2, i64 10
%28 = load float, float* %27
%29 = fneg float %24
%30 = tail call float @llvm.fmuladd.f32(float %29, float %2, float %28)
store float %30, float* %27
store float 0.000000e+00, float* %23
br label %31
31: ; preds = %26, %22
%32 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 3, i64 %4
%33 = load float, float* %32
%34 = fcmp une float %33, 0.000000e+00
br i1 %34, label %35, label %40
35: ; preds = %31
%36 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 3, i64 10
%37 = load float, float* %36
%38 = fneg float %33
%39 = tail call float @llvm.fmuladd.f32(float %38, float %2, float %37)
store float %39, float* %36
store float 0.000000e+00, float* %32
br label %40
40: ; preds = %35, %31
%41 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 4, i64 %4
%42 = load float, float* %41
%43 = fcmp une float %42, 0.000000e+00
br i1 %43, label %44, label %49
44: ; preds = %40
%45 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 4, i64 10
%46 = load float, float* %45
%47 = fneg float %42
%48 = tail call float @llvm.fmuladd.f32(float %47, float %2, float %46)
store float %48, float* %45
store float 0.000000e+00, float* %41
br label %49
49: ; preds = %44, %40
%50 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 5, i64 %4
%51 = load float, float* %50
%52 = fcmp une float %51, 0.000000e+00
br i1 %52, label %53, label %58
53: ; preds = %49
%54 = getelementptr inbounds [11 x float], [11 x float]* %0, i64 5, i64 10
%55 = load float, float* %54
%56 = fneg float %51
%57 = tail call float @llvm.fmuladd.f32(float %56, float %2, float %55)
store float %57, float* %54
store float 0.000000e+00, float* %50
br label %58
58: ; preds = %53, %49
ret void
}