#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 */
int /*<<< orphan*/ rd_1dim(int *, int, int /*<<< orphan*/);
int /*<<< orphan*/ rd_5dim_slice(int *, int, int, int, int, int, int, int, int,
                                 int, int, int, int, int, int, int);
void rd_6dim_slice(int *array, int dim1, int dim2, int dim3, int dim4, int dim5,
                   int dim6, int shift1, int shift2, int shift3, int shift4,
                   int shift5, int shift6, int post1, int post2, int post3,
                   int post4, int post5, int post6) {
  int i;
  int delta_pre = shift1 + shift2 + shift3 + shift4 + shift5 + shift6;
  int delta_post = post1 + post2 + post3 + post4 + post5 + post6;
  if (delta_pre + delta_post == 0) {
    rd_1dim(array, dim1 * dim2 * dim3 * dim4 * dim5 * dim6, 0);
    return;
  }
  for (i = shift1; i < dim1 - post1; i++)
    rd_5dim_slice(array + (i * dim2 * dim3 * dim4 * dim5 * dim6), dim2, dim3,
                  dim4, dim5, dim6, shift2, shift3, shift4, shift5, shift6,
                  post2, post3, post4, post5, post6);
  return;
}


x86 assembly (clang, -O0):
<rd_6dim_slice>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
mov    0x70(%rbp),%eax
mov    0x68(%rbp),%eax
mov    0x60(%rbp),%eax
mov    0x58(%rbp),%eax
mov    0x50(%rbp),%eax
mov    0x48(%rbp),%eax
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x30(%rbp)
mov    %esi,-0x34(%rbp)
mov    %edx,-0x38(%rbp)
mov    %ecx,-0x3c(%rbp)
mov    %r8d,-0x40(%rbp)
mov    %r9d,-0x44(%rbp)
mov    0x18(%rbp),%eax
add    0x20(%rbp),%eax
add    0x28(%rbp),%eax
add    0x30(%rbp),%eax
add    0x38(%rbp),%eax
add    0x40(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    0x48(%rbp),%eax
add    0x50(%rbp),%eax
add    0x58(%rbp),%eax
add    0x60(%rbp),%eax
add    0x68(%rbp),%eax
add    0x70(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x4c(%rbp),%eax
add    -0x50(%rbp),%eax
cmp    $0x0,%eax
jne    11d0 <rd_6dim_slice+0xb0>
mov    -0x30(%rbp),%rdi
mov    -0x34(%rbp),%esi
imul   -0x38(%rbp),%esi
imul   -0x3c(%rbp),%esi
imul   -0x40(%rbp),%esi
imul   -0x44(%rbp),%esi
imul   0x10(%rbp),%esi
xor    %edx,%edx
call   1040 <rd_1dim@plt>
jmp    1297 <rd_6dim_slice+0x177>
mov    0x18(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
mov    -0x34(%rbp),%ecx
sub    0x48(%rbp),%ecx
cmp    %ecx,%eax
jge    1292 <rd_6dim_slice+0x172>
mov    -0x30(%rbp),%rdi
mov    -0x48(%rbp),%eax
imul   -0x38(%rbp),%eax
imul   -0x3c(%rbp),%eax
imul   -0x40(%rbp),%eax
imul   -0x44(%rbp),%eax
imul   0x10(%rbp),%eax
cltq
shl    $0x2,%rax
add    %rax,%rdi
mov    -0x38(%rbp),%esi
mov    -0x3c(%rbp),%edx
mov    -0x40(%rbp),%ecx
mov    -0x44(%rbp),%r8d
mov    0x10(%rbp),%r9d
mov    0x20(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    0x28(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    0x30(%rbp),%r13d
mov    0x38(%rbp),%r12d
mov    0x40(%rbp),%r15d
mov    0x50(%rbp),%r14d
mov    0x58(%rbp),%ebx
mov    0x60(%rbp),%r11d
mov    0x68(%rbp),%r10d
mov    0x70(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x5c(%rbp),%eax
mov    %eax,(%rsp)
mov    -0x58(%rbp),%eax
mov    %eax,0x8(%rsp)
mov    -0x54(%rbp),%eax
mov    %r13d,0x10(%rsp)
mov    %r12d,0x18(%rsp)
mov    %r15d,0x20(%rsp)
mov    %r14d,0x28(%rsp)
mov    %ebx,0x30(%rsp)
mov    %r11d,0x38(%rsp)
mov    %r10d,0x40(%rsp)
mov    %eax,0x48(%rsp)
call   1030 <rd_5dim_slice@plt>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    11d6 <rd_6dim_slice+0xb6>
jmp    1297 <rd_6dim_slice+0x177>
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

x86 assembly (clang, -O2):
<rd_6dim_slice>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %ecx,%r14d
mov    %edx,0x8(%rsp)
mov    %esi,%ebx
mov    0xf8(%rsp),%eax
mov    0xf0(%rsp),%esi
mov    0xe0(%rsp),%ebp
mov    0xd8(%rsp),%r15d
mov    0xd0(%rsp),%r11d
mov    0xc8(%rsp),%edx
mov    0xc0(%rsp),%ecx
mov    0xb8(%rsp),%r13d
mov    %rcx,0x28(%rsp)
add    %r13d,%ecx
mov    %rdx,0x30(%rsp)
add    %edx,%ecx
add    %r11d,%ecx
add    %r15d,%ecx
add    %ebp,%ecx
mov    0xe8(%rsp),%edx
mov    %rsi,%r12
mov    %rdx,0x10(%rsp)
add    %esi,%edx
mov    %rax,%rsi
add    %eax,%edx
mov    0x100(%rsp),%eax
mov    %rax,0x70(%rsp)
add    %eax,%edx
mov    0x108(%rsp),%eax
mov    %rax,0x60(%rsp)
add    %eax,%edx
mov    0x110(%rsp),%eax
mov    %rax,0x68(%rsp)
add    %eax,%edx
mov    0xb0(%rsp),%r10d
mov    %r10d,0xc(%rsp)
add    %ecx,%edx
jne    120a <rd_6dim_slice+0xea>
imul   0x8(%rsp),%r14d
imul   %ebx,%r14d
imul   %r8d,%r14d
imul   %r9d,%r14d
imul   0xc(%rsp),%r14d
mov    %r14d,%esi
xor    %edx,%edx
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1040 <rd_1dim@plt>
sub    0x10(%rsp),%ebx
cmp    %r13d,%ebx
mov    0x30(%rsp),%rax
mov    0x28(%rsp),%r10
jle    1310 <rd_6dim_slice+0x1f0>
mov    %ebx,%ecx
movslq %r13d,%rbx
movslq %ecx,%rcx
mov    %rcx,0x38(%rsp)
mov    0xc(%rsp),%ecx
imul   %ecx,%r13d
imul   %r9d,%r13d
imul   %r8d,%r13d
imul   %r14d,%r13d
mov    0x8(%rsp),%edx
imul   %edx,%r13d
imul   %r9d,%ecx
imul   %r8d,%ecx
imul   %r14d,%ecx
imul   %edx,%ecx
mov    %ecx,0x1c(%rsp)
mov    %r8d,0x24(%rsp)
mov    %r9d,0x20(%rsp)
mov    %rdi,0x58(%rsp)
mov    %rsi,0x50(%rsp)
mov    %r11,0x48(%rsp)
mov    %rbp,0x40(%rsp)
nopl   0x0(%rax,%rax,1)
mov    %rbx,0x10(%rsp)
mov    %rsi,%rbx
movslq %r13d,%r13
mov    0x58(%rsp),%rcx
lea    (%rcx,%r13,4),%rdi
mov    0x8(%rsp),%esi
mov    %r14d,%edx
mov    %r8d,%ecx
mov    %r9d,%r8d
mov    0xc(%rsp),%r9d
push   0x68(%rsp)
push   0x68(%rsp)
push   0x80(%rsp)
push   %rbx
push   %r12
push   %rbp
push   %r15
push   %r11
push   %rax
push   %r10
mov    %rax,%rbp
mov    %r10,%rbx
call   1030 <rd_5dim_slice@plt>
mov    %rbx,%r10
mov    0x60(%rsp),%rbx
mov    %rbp,%rax
mov    0x98(%rsp),%r11
mov    0x90(%rsp),%rbp
mov    0xa0(%rsp),%rsi
mov    0x74(%rsp),%r8d
mov    0x70(%rsp),%r9d
add    $0x50,%rsp
add    $0x1,%rbx
add    0x1c(%rsp),%r13d
cmp    0x38(%rsp),%rbx
jl     1280 <rd_6dim_slice+0x160>
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @rd_6dim_slice(i32* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14, i32 %15, i32 %16, i32 %17, i32 %18) {
%20 = alloca i32*
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
%31 = alloca i32
%32 = alloca i32
%33 = alloca i32
%34 = alloca i32
%35 = alloca i32
%36 = alloca i32
%37 = alloca i32
%38 = alloca i32
%39 = alloca i32
%40 = alloca i32
%41 = alloca i32
store i32* %0, i32** %20
store i32 %1, i32* %21
store i32 %2, i32* %22
store i32 %3, i32* %23
store i32 %4, i32* %24
store i32 %5, i32* %25
store i32 %6, i32* %26
store i32 %7, i32* %27
store i32 %8, i32* %28
store i32 %9, i32* %29
store i32 %10, i32* %30
store i32 %11, i32* %31
store i32 %12, i32* %32
store i32 %13, i32* %33
store i32 %14, i32* %34
store i32 %15, i32* %35
store i32 %16, i32* %36
store i32 %17, i32* %37
store i32 %18, i32* %38
%42 = load i32, i32* %27
%43 = load i32, i32* %28
%44 = add nsw i32 %42, %43
%45 = load i32, i32* %29
%46 = add nsw i32 %44, %45
%47 = load i32, i32* %30
%48 = add nsw i32 %46, %47
%49 = load i32, i32* %31
%50 = add nsw i32 %48, %49
%51 = load i32, i32* %32
%52 = add nsw i32 %50, %51
store i32 %52, i32* %40
%53 = load i32, i32* %33
%54 = load i32, i32* %34
%55 = add nsw i32 %53, %54
%56 = load i32, i32* %35
%57 = add nsw i32 %55, %56
%58 = load i32, i32* %36
%59 = add nsw i32 %57, %58
%60 = load i32, i32* %37
%61 = add nsw i32 %59, %60
%62 = load i32, i32* %38
%63 = add nsw i32 %61, %62
store i32 %63, i32* %41
%64 = load i32, i32* %40
%65 = load i32, i32* %41
%66 = add nsw i32 %64, %65
%67 = icmp eq i32 %66, 0
br i1 %67, label %68, label %82
68: ; preds = %19
%69 = load i32*, i32** %20
%70 = load i32, i32* %21
%71 = load i32, i32* %22
%72 = mul nsw i32 %70, %71
%73 = load i32, i32* %23
%74 = mul nsw i32 %72, %73
%75 = load i32, i32* %24
%76 = mul nsw i32 %74, %75
%77 = load i32, i32* %25
%78 = mul nsw i32 %76, %77
%79 = load i32, i32* %26
%80 = mul nsw i32 %78, %79
%81 = call i32 @rd_1dim(i32* %69, i32 %80, i32 0)
br label %125
82: ; preds = %19
%83 = load i32, i32* %27
store i32 %83, i32* %39
br label %84
84: ; preds = %121, %82
%85 = load i32, i32* %39
%86 = load i32, i32* %21
%87 = load i32, i32* %33
%88 = sub nsw i32 %86, %87
%89 = icmp slt i32 %85, %88
br i1 %89, label %90, label %124
90: ; preds = %84
%91 = load i32*, i32** %20
%92 = load i32, i32* %39
%93 = load i32, i32* %22
%94 = mul nsw i32 %92, %93
%95 = load i32, i32* %23
%96 = mul nsw i32 %94, %95
%97 = load i32, i32* %24
%98 = mul nsw i32 %96, %97
%99 = load i32, i32* %25
%100 = mul nsw i32 %98, %99
%101 = load i32, i32* %26
%102 = mul nsw i32 %100, %101
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i32, i32* %91, i64 %103
%105 = load i32, i32* %22
%106 = load i32, i32* %23
%107 = load i32, i32* %24
%108 = load i32, i32* %25
%109 = load i32, i32* %26
%110 = load i32, i32* %28
%111 = load i32, i32* %29
%112 = load i32, i32* %30
%113 = load i32, i32* %31
%114 = load i32, i32* %32
%115 = load i32, i32* %34
%116 = load i32, i32* %35
%117 = load i32, i32* %36
%118 = load i32, i32* %37
%119 = load i32, i32* %38
%120 = call i32 @rd_5dim_slice(i32* %104, i32 %105, i32 %106, i32 %107, i32 %108, i32 %109, i32 %110, i32 %111, i32 %112, i32 %113, i32 %114, i32 %115, i32 %116, i32 %117, i32 %118, i32 %119)
br label %121
121: ; preds = %90
%122 = load i32, i32* %39
%123 = add nsw i32 %122, 1
store i32 %123, i32* %39
br label %84
124: ; preds = %84
br label %125
125: ; preds = %124, %68
ret void
}

LLVM IR (-O2):
define void @rd_6dim_slice(i32* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14, i32 %15, i32 %16, i32 %17, i32 %18) {
%20 = add nsw i32 %8, %7
%21 = add nsw i32 %20, %9
%22 = add nsw i32 %21, %10
%23 = add nsw i32 %22, %11
%24 = add nsw i32 %23, %12
%25 = add nsw i32 %13, %14
%26 = add nsw i32 %25, %15
%27 = add nsw i32 %26, %16
%28 = add nsw i32 %27, %17
%29 = add nsw i32 %28, %18
%30 = sub i32 0, %29
%31 = icmp eq i32 %24, %30
br i1 %31, label %42, label %32
32: ; preds = %19
%33 = sub nsw i32 %1, %13
%34 = icmp sgt i32 %33, %7
br i1 %34, label %35, label %58
35: ; preds = %32
%36 = mul i32 %3, %2
%37 = mul i32 %36, %4
%38 = mul i32 %37, %5
%39 = mul i32 %38, %6
%40 = sext i32 %7 to i64
%41 = sext i32 %33 to i64
br label %49
42: ; preds = %19
%43 = mul i32 %3, %2
%44 = mul i32 %43, %1
%45 = mul i32 %44, %4
%46 = mul i32 %45, %5
%47 = mul i32 %46, %6
%48 = tail call i32 @rd_1dim(i32* %0, i32 %47, i32 0)
br label %58
49: ; preds = %35, %49
%50 = phi i64 [ %40, %35 ], [ %56, %49 ]
%51 = trunc i64 %50 to i32
%52 = mul i32 %39, %51
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i32, i32* %0, i64 %53
%55 = tail call i32 @rd_5dim_slice(i32* %54, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %14, i32 %15, i32 %16, i32 %17, i32 %18)
%56 = add nsw i64 %50, 1
%57 = icmp slt i64 %56, %41
br i1 %57, label %49, label %58
58: ; preds = %49, %32, %42
ret void
}