void rmsub_stride(float *A, float *B, float *C, int rows, int cols, int p,
                  int sA, int sB, int sC) {
  int i, j, u, v, w;
  if (rows + cols + p <= 192) {
    for (i = 0; i < rows; ++i) {
      u = i * sC;
      v = i * sA;
      w = i * sB;
      for (j = 0; j < cols; j++) {
        C[j + u] = A[j + v] - B[j + w];
      }
    }
  } else {
    rows /= 2;
    cols /= 2;
    p /= 2;
    rmsub_stride(A, B, C, rows, cols, p, sA, sB, sC);
    rmsub_stride(A + cols, B + cols, C + cols, rows, cols, p, sA, sB, sC);
    rmsub_stride(A + rows * sB, B + rows * sC, C + rows * sC, rows, cols, p, sA,
                 sB, sC);
    rmsub_stride(A + rows * sB + cols, B + rows * sC + cols,
                 C + rows * sC + cols, rows, cols, p, sA, sB, sC);
  }
}


x86 assembly (clang, -O0):
<rmsub_stride>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x20(%rbp),%eax
add    -0x24(%rbp),%eax
cmp    $0xc0,%eax
jg     11ec <rmsub_stride+0xdc>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11e7 <rmsub_stride+0xd7>
mov    -0x28(%rbp),%eax
imul   0x20(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
imul   0x10(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%eax
imul   0x18(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11d4 <rmsub_stride+0xc4>
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
subss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1184 <rmsub_stride+0x74>
jmp    11d9 <rmsub_stride+0xc9>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1153 <rmsub_stride+0x43>
jmp    1388 <rmsub_stride+0x278>
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x20(%rbp)
mov    -0x24(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
mov    -0x1c(%rbp),%ecx
mov    -0x20(%rbp),%r8d
mov    -0x24(%rbp),%r9d
mov    0x10(%rbp),%r11d
mov    0x18(%rbp),%r10d
mov    0x20(%rbp),%eax
mov    %r11d,(%rsp)
mov    %r10d,0x8(%rsp)
mov    %eax,0x10(%rsp)
call   1030 <rmsub_stride@plt>
mov    -0x8(%rbp),%rdi
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x10(%rbp),%rsi
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
mov    -0x18(%rbp),%rdx
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdx
mov    -0x1c(%rbp),%ecx
mov    -0x20(%rbp),%r8d
mov    -0x24(%rbp),%r9d
mov    0x10(%rbp),%r11d
mov    0x18(%rbp),%r10d
mov    0x20(%rbp),%eax
mov    %r11d,(%rsp)
mov    %r10d,0x8(%rsp)
mov    %eax,0x10(%rsp)
call   1030 <rmsub_stride@plt>
mov    -0x8(%rbp),%rdi
mov    -0x1c(%rbp),%eax
imul   0x18(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x10(%rbp),%rsi
mov    -0x1c(%rbp),%eax
imul   0x20(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rsi
mov    -0x18(%rbp),%rdx
mov    -0x1c(%rbp),%eax
imul   0x20(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdx
mov    -0x1c(%rbp),%ecx
mov    -0x20(%rbp),%r8d
mov    -0x24(%rbp),%r9d
mov    0x10(%rbp),%r11d
mov    0x18(%rbp),%r10d
mov    0x20(%rbp),%eax
mov    %r11d,(%rsp)
mov    %r10d,0x8(%rsp)
mov    %eax,0x10(%rsp)
call   1030 <rmsub_stride@plt>
mov    -0x8(%rbp),%rdi
mov    -0x1c(%rbp),%eax
imul   0x18(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x10(%rbp),%rsi
mov    -0x1c(%rbp),%eax
imul   0x20(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rsi
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rsi
mov    -0x18(%rbp),%rdx
mov    -0x1c(%rbp),%eax
imul   0x20(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdx
movslq -0x20(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdx
mov    -0x1c(%rbp),%ecx
mov    -0x20(%rbp),%r8d
mov    -0x24(%rbp),%r9d
mov    0x10(%rbp),%r11d
mov    0x18(%rbp),%r10d
mov    0x20(%rbp),%eax
mov    %r11d,(%rsp)
mov    %r10d,0x8(%rsp)
mov    %eax,0x10(%rsp)
call   1030 <rmsub_stride@plt>
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rmsub_stride>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xb8,%rsp
mov    %rsi,0x10(%rsp)
mov    %rdi,0x8(%rsp)
mov    0x100(%rsp),%r14d
mov    0xf8(%rsp),%r10d
mov    0xf0(%rsp),%r15d
lea    (%r8,%rcx,1),%eax
add    %r9d,%eax
cmp    $0xc1,%eax
jge    115b <rmsub_stride+0x4b>
mov    %ecx,%ebx
mov    %r8d,%r13d
jmp    12a7 <rmsub_stride+0x197>
mov    %r9d,%ebp
xchg   %ax,%ax
mov    %ecx,%ebx
shr    $0x1f,%ebx
add    %ecx,%ebx
sar    %ebx
mov    %r8d,%r13d
shr    $0x1f,%r13d
add    %r8d,%r13d
sar    %r13d
shr    $0x1f,%ebp
add    %r9d,%ebp
sar    %ebp
sub    $0x8,%rsp
mov    0x10(%rsp),%r12
mov    %r12,%rdi
mov    0x18(%rsp),%rsi
mov    %rdx,0x20(%rsp)
mov    %ebx,%ecx
mov    %r13d,%r8d
mov    %ebp,%r9d
push   %r14
push   %r10
push   %r15
mov    %rsi,%r15
call   1030 <rmsub_stride@plt>
add    $0x20,%rsp
movslq %r13d,%r14
lea    (%r12,%r14,4),%rdi
lea    (%r15,%r14,4),%rsi
mov    0x18(%rsp),%rax
lea    (%rax,%r14,4),%rdx
sub    $0x8,%rsp
mov    %ebx,%ecx
mov    %r14d,%r8d
mov    %ebp,%r9d
mov    0x108(%rsp),%eax
push   %rax
mov    0x108(%rsp),%eax
push   %rax
mov    0x108(%rsp),%eax
push   %rax
call   1030 <rmsub_stride@plt>
add    $0x20,%rsp
mov    %ebx,%eax
mov    0xf8(%rsp),%ecx
imul   %ecx,%eax
cltq
lea    (%r12,%rax,4),%rdi
mov    %rdi,0x8(%rsp)
mov    %ebx,%eax
mov    0x100(%rsp),%ecx
imul   %ecx,%eax
cltq
lea    (%r15,%rax,4),%rsi
mov    %rsi,0x10(%rsp)
mov    0x18(%rsp),%rcx
lea    (%rcx,%rax,4),%r12
sub    $0x8,%rsp
mov    %r12,%rdx
mov    %ebx,%ecx
mov    %r14d,%r8d
mov    %ebp,%r9d
mov    0x108(%rsp),%eax
push   %rax
mov    0x108(%rsp),%eax
push   %rax
mov    0x108(%rsp),%eax
push   %rax
call   1030 <rmsub_stride@plt>
mov    0x118(%rsp),%r10d
mov    0x110(%rsp),%r15d
add    $0x20,%rsp
mov    0x8(%rsp),%rax
lea    (%rax,%r14,4),%rax
mov    %rax,0x8(%rsp)
mov    0x10(%rsp),%rax
lea    (%rax,%r14,4),%rax
mov    %rax,0x10(%rsp)
lea    (%r12,%r14,4),%rdx
lea    (%r14,%rbx,1),%eax
mov    0x100(%rsp),%r14d
add    %ebp,%eax
mov    %ebp,%r9d
mov    %r13d,%r8d
mov    %ebx,%ecx
cmp    $0xc1,%eax
jge    1160 <rmsub_stride+0x50>
mov    %rdx,0x18(%rsp)
test   %ebx,%ebx
jle    15cc <rmsub_stride+0x4bc>
movslq %r14d,%rdx
movslq %r15d,%rax
movslq %r10d,%rsi
mov    %ebx,%ecx
mov    %rcx,0xb0(%rsp)
mov    %r13d,%ebx
mov    %ebx,%ecx
and    $0xfffffffc,%ecx
mov    %rcx,0x50(%rsp)
add    $0xfffffffffffffffc,%rcx
mov    %rcx,0x48(%rsp)
mov    %rcx,%rbp
shr    $0x2,%rbp
add    $0x1,%rbp
mov    %rbp,%rcx
mov    %rbp,0x40(%rsp)
and    $0xfffffffffffffffe,%rbp
mov    %rbp,0x38(%rsp)
mov    %rbx,%rcx
neg    %rcx
mov    %rcx,0x58(%rsp)
mov    0x8(%rsp),%r12
lea    0x10(%r12),%rbp
mov    %rax,0x88(%rsp)
lea    0x0(,%rax,4),%rax
mov    %rax,0xa8(%rsp)
mov    0x10(%rsp),%r15
lea    0x10(%r15),%rcx
mov    %rsi,0x80(%rsp)
lea    0x0(,%rsi,4),%rax
mov    %rax,0xa0(%rsp)
mov    0x18(%rsp),%rax
lea    0x10(%rax),%r8
mov    %rdx,0x90(%rsp)
lea    0x0(,%rdx,4),%rdx
mov    %rdx,0x98(%rsp)
lea    0x4(%rax),%r11
xor    %r14d,%r14d
jmp    13bc <rmsub_stride+0x2ac>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%r14
mov    0xa8(%rsp),%rax
add    %rax,%rbp
mov    0xa0(%rsp),%rsi
add    %rsi,%rcx
mov    0x98(%rsp),%rdx
add    %rdx,%r8
add    %rdx,%r11
add    %rsi,%r15
add    %rax,%r12
cmp    0xb0(%rsp),%r14
je     15cc <rmsub_stride+0x4bc>
test   %r13d,%r13d
jle    1380 <rmsub_stride+0x270>
mov    %r14,%rax
imul   0x90(%rsp),%rax
mov    %r14,%rdi
imul   0x88(%rsp),%rdi
mov    %r14,%rdx
imul   0x80(%rsp),%rdx
cmp    $0x4,%r13d
mov    %rax,0x30(%rsp)
mov    %rdx,0x20(%rsp)
jae    1400 <rmsub_stride+0x2f0>
xor    %r9d,%r9d
jmp    1530 <rmsub_stride+0x420>
nopl   (%rax)
lea    (%rax,%rbx,1),%r9
lea    (%rdi,%rbx,1),%rsi
mov    %rsi,0x60(%rsp)
lea    (%rdx,%rbx,1),%rsi
mov    %rsi,0x68(%rsp)
mov    0x18(%rsp),%r10
lea    (%r10,%rax,4),%rax
mov    %rax,0x70(%rsp)
lea    (%r10,%r9,4),%r10
mov    %rdi,%r9
mov    0x8(%rsp),%rdi
mov    0x10(%rsp),%rsi
mov    %r9,0x28(%rsp)
lea    (%rdi,%r9,4),%rax
mov    %rax,0x78(%rsp)
mov    0x60(%rsp),%rax
lea    (%rdi,%rax,4),%r9
lea    (%rsi,%rdx,4),%rdx
mov    0x68(%rsp),%rax
lea    (%rsi,%rax,4),%rdi
mov    0x70(%rsp),%rax
cmp    %r9,%rax
setb   %sil
cmp    %r10,0x78(%rsp)
setb   %r9b
cmp    %rdi,%rax
setb   %al
cmp    %r10,%rdx
setb   %dl
test   %r9b,%sil
jne    1523 <rmsub_stride+0x413>
mov    $0x0,%r9d
and    %dl,%al
mov    0x28(%rsp),%rdi
jne    1530 <rmsub_stride+0x420>
cmpq   $0x0,0x48(%rsp)
je     15b5 <rmsub_stride+0x4a5>
mov    0x38(%rsp),%rdx
xor    %eax,%eax
mov    0x20(%rsp),%r9
xchg   %ax,%ax
movups -0x10(%rbp,%rax,4),%xmm0
movups -0x10(%rcx,%rax,4),%xmm1
subps  %xmm1,%xmm0
movups %xmm0,-0x10(%r8,%rax,4)
movups 0x0(%rbp,%rax,4),%xmm0
movups (%rcx,%rax,4),%xmm1
subps  %xmm1,%xmm0
movups %xmm0,(%r8,%rax,4)
add    $0x8,%rax
add    $0xfffffffffffffffe,%rdx
jne    14b0 <rmsub_stride+0x3a0>
testb  $0x1,0x40(%rsp)
je     1510 <rmsub_stride+0x400>
lea    (%rax,%rdi,1),%rdx
mov    0x8(%rsp),%rsi
movups (%rsi,%rdx,4),%xmm0
lea    (%rax,%r9,1),%rdx
mov    0x10(%rsp),%rsi
movups (%rsi,%rdx,4),%xmm1
subps  %xmm1,%xmm0
add    0x30(%rsp),%rax
mov    0x18(%rsp),%rdx
movups %xmm0,(%rdx,%rax,4)
mov    0x50(%rsp),%rax
mov    %rax,%r9
cmp    %rbx,%rax
je     1380 <rmsub_stride+0x270>
jmp    1530 <rmsub_stride+0x420>
xor    %r9d,%r9d
mov    0x28(%rsp),%rdi
nopl   0x0(%rax,%rax,1)
mov    %r9,%rax
test   $0x1,%bl
je     1570 <rmsub_stride+0x460>
add    %r9,%rdi
mov    0x8(%rsp),%rax
movss  (%rax,%rdi,4),%xmm0
mov    0x20(%rsp),%rdx
add    %r9,%rdx
mov    0x10(%rsp),%rax
subss  (%rax,%rdx,4),%xmm0
mov    0x30(%rsp),%rdx
add    %r9,%rdx
mov    0x18(%rsp),%rax
movss  %xmm0,(%rax,%rdx,4)
mov    %r9,%rax
or     $0x1,%rax
not    %r9
cmp    0x58(%rsp),%r9
je     1380 <rmsub_stride+0x270>
xchg   %ax,%ax
movss  (%r12,%rax,4),%xmm0
subss  (%r15,%rax,4),%xmm0
movss  %xmm0,-0x4(%r11,%rax,4)
movss  0x4(%r12,%rax,4),%xmm0
subss  0x4(%r15,%rax,4),%xmm0
movss  %xmm0,(%r11,%rax,4)
add    $0x2,%rax
cmp    %rax,%rbx
jne    1580 <rmsub_stride+0x470>
jmp    1380 <rmsub_stride+0x270>
xor    %eax,%eax
mov    0x20(%rsp),%r9
testb  $0x1,0x40(%rsp)
jne    14e5 <rmsub_stride+0x3d5>
jmp    1510 <rmsub_stride+0x400>
add    $0xb8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @rmsub_stride(float* %0, float* %1, float* %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8) {
%10 = add nsw i32 %4, %3
%11 = add nsw i32 %10, %5
%12 = icmp slt i32 %11, 193
br i1 %12, label %13, label %158
13: ; preds = %158, %9
%14 = phi float* [ %0, %9 ], [ %179, %158 ]
%15 = phi float* [ %1, %9 ], [ %180, %158 ]
%16 = phi float* [ %2, %9 ], [ %181, %158 ]
%17 = phi i32 [ %3, %9 ], [ %165, %158 ]
%18 = phi i32 [ %4, %9 ], [ %166, %158 ]
%19 = icmp sgt i32 %17, 0
br i1 %19, label %20, label %185
20: ; preds = %13
%21 = icmp sgt i32 %18, 0
%22 = sext i32 %8 to i64
%23 = sext i32 %6 to i64
%24 = sext i32 %7 to i64
%25 = zext i32 %17 to i64
%26 = zext i32 %18 to i64
%27 = and i64 %26, 4294967292
%28 = add nsw i64 %27, -4
%29 = lshr exact i64 %28, 2
%30 = add nuw nsw i64 %29, 1
%31 = icmp ult i32 %18, 4
%32 = and i64 %26, 4294967292
%33 = and i64 %30, 1
%34 = icmp eq i64 %28, 0
%35 = and i64 %30, 9223372036854775806
%36 = icmp eq i64 %33, 0
%37 = icmp eq i64 %32, %26
%38 = and i64 %26, 1
%39 = icmp eq i64 %38, 0
%40 = sub nsw i64 0, %26
br label %41
41: ; preds = %20, %155
%42 = phi i64 [ 0, %20 ], [ %156, %155 ]
%43 = mul i64 %42, %22
%44 = getelementptr float, float* %16, i64 %43
%45 = add i64 %43, %26
%46 = getelementptr float, float* %16, i64 %45
%47 = mul i64 %42, %23
%48 = getelementptr float, float* %14, i64 %47
%49 = add i64 %47, %26
%50 = getelementptr float, float* %14, i64 %49
%51 = mul i64 %42, %24
%52 = getelementptr float, float* %15, i64 %51
%53 = add i64 %51, %26
%54 = getelementptr float, float* %15, i64 %53
%55 = mul nsw i64 %42, %22
%56 = mul nsw i64 %42, %23
%57 = mul nsw i64 %42, %24
br i1 %21, label %58, label %155
58: ; preds = %41
br i1 %31, label %115, label %59
59: ; preds = %58
%60 = icmp ult float* %44, %50
%61 = icmp ult float* %48, %46
%62 = and i1 %60, %61
%63 = icmp ult float* %44, %54
%64 = icmp ult float* %52, %46
%65 = and i1 %63, %64
%66 = or i1 %62, %65
br i1 %66, label %115, label %67
67: ; preds = %59
br i1 %34, label %99, label %68
68: ; preds = %67, %68
%69 = phi i64 [ %96, %68 ], [ 0, %67 ]
%70 = phi i64 [ %97, %68 ], [ 0, %67 ]
%71 = add nsw i64 %69, %56
%72 = getelementptr inbounds float, float* %14, i64 %71
%73 = bitcast float* %72 to <4 x float>*
%74 = load <4 x float>, <4 x float>* %73
%75 = add nsw i64 %69, %57
%76 = getelementptr inbounds float, float* %15, i64 %75
%77 = bitcast float* %76 to <4 x float>*
%78 = load <4 x float>, <4 x float>* %77
%79 = fsub <4 x float> %74, %78
%80 = add nsw i64 %69, %55
%81 = getelementptr inbounds float, float* %16, i64 %80
%82 = bitcast float* %81 to <4 x float>*
store <4 x float> %79, <4 x float>* %82
%83 = or i64 %69, 4
%84 = add nsw i64 %83, %56
%85 = getelementptr inbounds float, float* %14, i64 %84
%86 = bitcast float* %85 to <4 x float>*
%87 = load <4 x float>, <4 x float>* %86
%88 = add nsw i64 %83, %57
%89 = getelementptr inbounds float, float* %15, i64 %88
%90 = bitcast float* %89 to <4 x float>*
%91 = load <4 x float>, <4 x float>* %90
%92 = fsub <4 x float> %87, %91
%93 = add nsw i64 %83, %55
%94 = getelementptr inbounds float, float* %16, i64 %93
%95 = bitcast float* %94 to <4 x float>*
store <4 x float> %92, <4 x float>* %95
%96 = add nuw i64 %69, 8
%97 = add i64 %70, 2
%98 = icmp eq i64 %97, %35
br i1 %98, label %99, label %68
99: ; preds = %68, %67
%100 = phi i64 [ 0, %67 ], [ %96, %68 ]
br i1 %36, label %114, label %101
101: ; preds = %99
%102 = add nsw i64 %100, %56
%103 = getelementptr inbounds float, float* %14, i64 %102
%104 = bitcast float* %103 to <4 x float>*
%105 = load <4 x float>, <4 x float>* %104
%106 = add nsw i64 %100, %57
%107 = getelementptr inbounds float, float* %15, i64 %106
%108 = bitcast float* %107 to <4 x float>*
%109 = load <4 x float>, <4 x float>* %108
%110 = fsub <4 x float> %105, %109
%111 = add nsw i64 %100, %55
%112 = getelementptr inbounds float, float* %16, i64 %111
%113 = bitcast float* %112 to <4 x float>*
store <4 x float> %110, <4 x float>* %113
br label %114
114: ; preds = %99, %101
br i1 %37, label %155, label %115
115: ; preds = %59, %58, %114
%116 = phi i64 [ 0, %59 ], [ 0, %58 ], [ %32, %114 ]
%117 = xor i64 %116, -1
br i1 %39, label %129, label %118
118: ; preds = %115
%119 = add nsw i64 %116, %56
%120 = getelementptr inbounds float, float* %14, i64 %119
%121 = load float, float* %120
%122 = add nsw i64 %116, %57
%123 = getelementptr inbounds float, float* %15, i64 %122
%124 = load float, float* %123
%125 = fsub float %121, %124
%126 = add nsw i64 %116, %55
%127 = getelementptr inbounds float, float* %16, i64 %126
store float %125, float* %127
%128 = or i64 %116, 1
br label %129
129: ; preds = %118, %115
%130 = phi i64 [ %116, %115 ], [ %128, %118 ]
%131 = icmp eq i64 %117, %40
br i1 %131, label %155, label %132
132: ; preds = %129, %132
%133 = phi i64 [ %153, %132 ], [ %130, %129 ]
%134 = add nsw i64 %133, %56
%135 = getelementptr inbounds float, float* %14, i64 %134
%136 = load float, float* %135
%137 = add nsw i64 %133, %57
%138 = getelementptr inbounds float, float* %15, i64 %137
%139 = load float, float* %138
%140 = fsub float %136, %139
%141 = add nsw i64 %133, %55
%142 = getelementptr inbounds float, float* %16, i64 %141
store float %140, float* %142
%143 = add nuw nsw i64 %133, 1
%144 = add nsw i64 %143, %56
%145 = getelementptr inbounds float, float* %14, i64 %144
%146 = load float, float* %145
%147 = add nsw i64 %143, %57
%148 = getelementptr inbounds float, float* %15, i64 %147
%149 = load float, float* %148
%150 = fsub float %146, %149
%151 = add nsw i64 %143, %55
%152 = getelementptr inbounds float, float* %16, i64 %151
store float %150, float* %152
%153 = add nuw nsw i64 %133, 2
%154 = icmp eq i64 %153, %26
br i1 %154, label %155, label %132
155: ; preds = %129, %132, %114, %41
%156 = add nuw nsw i64 %42, 1
%157 = icmp eq i64 %156, %25
br i1 %157, label %185, label %41
158: ; preds = %9, %158
%159 = phi i32 [ %167, %158 ], [ %5, %9 ]
%160 = phi i32 [ %166, %158 ], [ %4, %9 ]
%161 = phi i32 [ %165, %158 ], [ %3, %9 ]
%162 = phi float* [ %181, %158 ], [ %2, %9 ]
%163 = phi float* [ %180, %158 ], [ %1, %9 ]
%164 = phi float* [ %179, %158 ], [ %0, %9 ]
%165 = sdiv i32 %161, 2
%166 = sdiv i32 %160, 2
%167 = sdiv i32 %159, 2
tail call void @rmsub_stride(float* %164, float* %163, float* %162, i32 %165, i32 %166, i32 %167, i32 %6, i32 %7, i32 %8)
%168 = sext i32 %166 to i64
%169 = getelementptr inbounds float, float* %164, i64 %168
%170 = getelementptr inbounds float, float* %163, i64 %168
%171 = getelementptr inbounds float, float* %162, i64 %168
tail call void @rmsub_stride(float* %169, float* %170, float* %171, i32 %165, i32 %166, i32 %167, i32 %6, i32 %7, i32 %8)
%172 = mul nsw i32 %165, %7
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds float, float* %164, i64 %173
%175 = mul nsw i32 %165, %8
%176 = sext i32 %175 to i64
%177 = getelementptr inbounds float, float* %163, i64 %176
%178 = getelementptr inbounds float, float* %162, i64 %176
tail call void @rmsub_stride(float* %174, float* %177, float* %178, i32 %165, i32 %166, i32 %167, i32 %6, i32 %7, i32 %8)
%179 = getelementptr inbounds float, float* %174, i64 %168
%180 = getelementptr inbounds float, float* %177, i64 %168
%181 = getelementptr inbounds float, float* %178, i64 %168
%182 = add nsw i32 %166, %165
%183 = add nsw i32 %182, %167
%184 = icmp slt i32 %183, 193
br i1 %184, label %13, label %158
185: ; preds = %155, %13
ret void
}