#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 */
double cos(double);
double sin(double);
void MRot(double **MTurn, int i, int j, int N, double alpha) {
  int k1;
  int k2;
  for (k1 = 1; k1 <= N; k1++)
    for (k2 = 1; k2 <= N; k2++)
      if (k1 == i && k2 == i)
        MTurn[k1][k2] = cos(alpha);
      else if (k1 == j && k2 == j)
        MTurn[k1][k2] = cos(alpha);
      else if (k1 == i && k2 == j)
        MTurn[k1][k2] = sin(alpha);
      else if (k1 == j && k2 == i)
        MTurn[k1][k2] = -sin(alpha);
      else
        MTurn[k1][k2] = ((k1 == k2) ? 1.0 : 0.0);
}


x86 assembly (clang, -O0):
<MRot>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     12e3 <MRot+0x1c3>
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     12d0 <MRot+0x1b0>
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    119c <MRot+0x7c>
mov    -0x28(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    119c <MRot+0x7c>
movsd  -0x20(%rbp),%xmm0
call   1040 <cos@plt>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12bd <MRot+0x19d>
mov    -0x24(%rbp),%eax
cmp    -0x10(%rbp),%eax
jne    11d8 <MRot+0xb8>
mov    -0x28(%rbp),%eax
cmp    -0x10(%rbp),%eax
jne    11d8 <MRot+0xb8>
movsd  -0x20(%rbp),%xmm0
call   1040 <cos@plt>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12b8 <MRot+0x198>
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    1214 <MRot+0xf4>
mov    -0x28(%rbp),%eax
cmp    -0x10(%rbp),%eax
jne    1214 <MRot+0xf4>
movsd  -0x20(%rbp),%xmm0
call   1030 <sin@plt>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12b3 <MRot+0x193>
mov    -0x24(%rbp),%eax
cmp    -0x10(%rbp),%eax
jne    1267 <MRot+0x147>
mov    -0x28(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    1267 <MRot+0x147>
movsd  -0x20(%rbp),%xmm0
call   1030 <sin@plt>
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12ae <MRot+0x18e>
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
movsd  0xd8b(%rip),%xmm0
xorps  %xmm1,%xmm1
movsd  %xmm1,-0x38(%rbp)
cmp    %ecx,%eax
movsd  %xmm0,-0x30(%rbp)
je     1294 <MRot+0x174>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    12b3 <MRot+0x193>
jmp    12b8 <MRot+0x198>
jmp    12bd <MRot+0x19d>
jmp    12c2 <MRot+0x1a2>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1154 <MRot+0x34>
jmp    12d5 <MRot+0x1b5>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1141 <MRot+0x21>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<MRot>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
movsd  %xmm0,0x8(%rsp)
test   %ecx,%ecx
jle    1223 <MRot+0x103>
mov    %ecx,%r15d
mov    %rdi,%r14
mov    %edx,%r12d
mov    %esi,%r13d
add    $0x1,%r15d
mov    $0x1,%ebx
xor    %eax,%eax
mov    %rax,0x10(%rsp)
jmp    1173 <MRot+0x53>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rbx
addq   $0xffffffffffffffff,0x10(%rsp)
cmp    %r15,%rbx
je     1223 <MRot+0x103>
mov    $0x1,%ebp
jmp    11a0 <MRot+0x80>
nopw   0x0(%rax,%rax,1)
movsd  0x8(%rsp),%xmm0
call   1040 <cos@plt>
mov    %r12,%rax
mov    (%r14,%rbx,8),%rcx
movsd  %xmm0,(%rcx,%rax,8)
add    $0x1,%rbp
cmp    %rbp,%r15
je     1160 <MRot+0x40>
cmp    %r13,%rbx
jne    11c0 <MRot+0xa0>
cmp    %rbp,%r13
jne    11c0 <MRot+0xa0>
movsd  0x8(%rsp),%xmm0
call   1040 <cos@plt>
mov    %r13,%rax
jmp    118e <MRot+0x6e>
nopw   0x0(%rax,%rax,1)
cmp    %r12,%rbx
jne    11ca <MRot+0xaa>
cmp    %rbp,%r12
je     1180 <MRot+0x60>
cmp    %r13,%rbx
jne    11e4 <MRot+0xc4>
cmp    %rbp,%r12
jne    11e4 <MRot+0xc4>
movsd  0x8(%rsp),%xmm0
call   1030 <sin@plt>
mov    %r12,%rax
jmp    118e <MRot+0x6e>
cmp    %r12,%rbx
jne    1202 <MRot+0xe2>
cmp    %rbp,%r13
jne    1202 <MRot+0xe2>
movsd  0x8(%rsp),%xmm0
call   1030 <sin@plt>
xorps  0xe10(%rip),%xmm0
jmp    11b5 <MRot+0x95>
mov    0x10(%rsp),%rax
add    %rbp,%rax
movsd  0xdee(%rip),%xmm0
cmp    $0x1,%rax
je     121b <MRot+0xfb>
xorps  %xmm0,%xmm0
mov    %rbp,%rax
jmp    118e <MRot+0x6e>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @MRot(double** nocapture %0, i32 %1, i32 %2, i32 %3, double %4) {
%6 = icmp slt i32 %3, 1
br i1 %6, label %50, label %7
7: ; preds = %5
%8 = zext i32 %2 to i64
%9 = zext i32 %1 to i64
%10 = add nuw i32 %3, 1
%11 = zext i32 %10 to i64
br label %12
12: ; preds = %47, %7
%13 = phi i64 [ 1, %7 ], [ %48, %47 ]
%14 = icmp eq i64 %13, %9
%15 = icmp eq i64 %13, %8
%16 = getelementptr inbounds double*, double** %0, i64 %13
br label %17
17: ; preds = %12, %40
%18 = phi i64 [ 1, %12 ], [ %45, %40 ]
%19 = icmp eq i64 %18, %9
%20 = select i1 %14, i1 %19, i1 false
br i1 %20, label %21, label %23
21: ; preds = %17
%22 = tail call double @cos(double %4)
br label %40
23: ; preds = %17
%24 = icmp eq i64 %18, %8
%25 = select i1 %15, i1 %24, i1 false
br i1 %25, label %26, label %28
26: ; preds = %23
%27 = tail call double @cos(double %4)
br label %40
28: ; preds = %23
%29 = select i1 %14, i1 %24, i1 false
br i1 %29, label %30, label %32
30: ; preds = %28
%31 = tail call double @sin(double %4)
br label %40
32: ; preds = %28
%33 = select i1 %15, i1 %19, i1 false
br i1 %33, label %34, label %37
34: ; preds = %32
%35 = tail call double @sin(double %4)
%36 = fneg double %35
br label %40
37: ; preds = %32
%38 = icmp eq i64 %13, %18
%39 = select i1 %38, double 1.000000e+00, double 0.000000e+00
br label %40
40: ; preds = %21, %30, %37, %34, %26
%41 = phi i64 [ %9, %21 ], [ %8, %30 ], [ %18, %37 ], [ %9, %34 ], [ %8, %26 ]
%42 = phi double [ %22, %21 ], [ %31, %30 ], [ %39, %37 ], [ %36, %34 ], [ %27, %26 ]
%43 = load double*, double** %16
%44 = getelementptr inbounds double, double* %43, i64 %41
store double %42, double* %44
%45 = add nuw nsw i64 %18, 1
%46 = icmp eq i64 %45, %11
br i1 %46, label %47, label %17
47: ; preds = %40
%48 = add nuw nsw i64 %13, 1
%49 = icmp eq i64 %48, %11
br i1 %49, label %50, label %12
50: ; preds = %47, %5
ret void
}