#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 */
scalar_t__ malloc(int);
float **reserva(int puntos_x, int puntos_y) {
  float **matriz;
  int i;
  int j;
  matriz = (float **)malloc(puntos_x * sizeof(float *));
  for (i = 0; i < puntos_x; i++) {
    matriz[i] = (float *)malloc(puntos_y * sizeof(float));
  }
  int i2;
  for (i2 = 0; i2 < puntos_x; i2++) {
    for (j = 0; j < puntos_y; j++) {
      matriz[i2][j] = 1.0;
    }
  }
  return matriz;
}


x86 assembly (clang, -O0):
<reserva>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
movslq -0x4(%rbp),%rax
shl    $0x3,%rax
mov    %eax,%edi
call   1030 <malloc@plt>
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1170 <reserva+0x60>
movslq -0x8(%rbp),%rax
shl    $0x2,%rax
mov    %eax,%edi
call   1030 <malloc@plt>
mov    %rax,%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1138 <reserva+0x28>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11d4 <reserva+0xc4>
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11c1 <reserva+0xb1>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movss  0xe52(%rip),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    118a <reserva+0x7a>
jmp    11c6 <reserva+0xb6>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1177 <reserva+0x67>
mov    -0x10(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<reserva>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %esi,%r14d
mov    %edi,%r15d
lea    0x0(,%r15,8),%edi
call   1030 <malloc@plt>
mov    %rax,%r12
test   %r15d,%r15d
jle    12a5 <reserva+0x195>
lea    0x0(,%r14,4),%ebp
mov    %r15d,%r13d
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
mov    %ebp,%edi
call   1030 <malloc@plt>
mov    %rax,(%r12,%rbx,8)
add    $0x1,%rbx
cmp    %rbx,%r13
jne    1150 <reserva+0x40>
test   %r15d,%r15d
jle    12a5 <reserva+0x195>
mov    %r14d,%eax
mov    %eax,%r11d
and    $0xfffffff8,%r11d
lea    -0x8(%r11),%r8
mov    %r8,%r9
shr    $0x3,%r9
add    $0x1,%r9
mov    %r9d,%r10d
and    $0x7,%r10d
and    $0xfffffffffffffff8,%r9
mov    %r10,%rdi
shl    $0x5,%rdi
xor    %ebp,%ebp
movaps 0xe5f(%rip),%xmm0
jmp    11bd <reserva+0xad>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rbp
cmp    %r13,%rbp
je     12a5 <reserva+0x195>
test   %r14d,%r14d
jle    11b0 <reserva+0xa0>
mov    (%r12,%rbp,8),%rdx
cmp    $0x8,%r14d
jae    11e0 <reserva+0xd0>
xor    %ecx,%ecx
jmp    1290 <reserva+0x180>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    $0x38,%r8
jae    11ea <reserva+0xda>
xor    %esi,%esi
jmp    1261 <reserva+0x151>
mov    %r9,%rcx
xor    %esi,%esi
nop
movups %xmm0,(%rdx,%rsi,4)
movups %xmm0,0x10(%rdx,%rsi,4)
movups %xmm0,0x20(%rdx,%rsi,4)
movups %xmm0,0x30(%rdx,%rsi,4)
movups %xmm0,0x40(%rdx,%rsi,4)
movups %xmm0,0x50(%rdx,%rsi,4)
movups %xmm0,0x60(%rdx,%rsi,4)
movups %xmm0,0x70(%rdx,%rsi,4)
movups %xmm0,0x80(%rdx,%rsi,4)
movups %xmm0,0x90(%rdx,%rsi,4)
movups %xmm0,0xa0(%rdx,%rsi,4)
movups %xmm0,0xb0(%rdx,%rsi,4)
movups %xmm0,0xc0(%rdx,%rsi,4)
movups %xmm0,0xd0(%rdx,%rsi,4)
movups %xmm0,0xe0(%rdx,%rsi,4)
movups %xmm0,0xf0(%rdx,%rsi,4)
add    $0x40,%rsi
add    $0xfffffffffffffff8,%rcx
jne    11f0 <reserva+0xe0>
test   %r10,%r10
je     1282 <reserva+0x172>
lea    (%rdx,%rsi,4),%rcx
add    $0x10,%rcx
xor    %esi,%esi
movups %xmm0,-0x10(%rcx,%rsi,1)
movups %xmm0,(%rcx,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%rdi
jne    1270 <reserva+0x160>
mov    %r11,%rcx
cmp    %rax,%r11
je     11b0 <reserva+0xa0>
xchg   %ax,%ax
movl   $0x3f800000,(%rdx,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1290 <reserva+0x180>
jmp    11b0 <reserva+0xa0>
mov    %r12,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define float** @reserva(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca float**
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%9 = load i32, i32* %3
%10 = sext i32 %9 to i64
%11 = mul i64 %10, 8
%12 = trunc i64 %11 to i32
%13 = call i64 @malloc(i32 %12)
%14 = inttoptr i64 %13 to float**
store float** %14, float*** %5
store i32 0, i32* %6
br label %15
15: ; preds = %30, %2
%16 = load i32, i32* %6
%17 = load i32, i32* %3
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %33
19: ; preds = %15
%20 = load i32, i32* %4
%21 = sext i32 %20 to i64
%22 = mul i64 %21, 4
%23 = trunc i64 %22 to i32
%24 = call i64 @malloc(i32 %23)
%25 = inttoptr i64 %24 to float*
%26 = load float**, float*** %5
%27 = load i32, i32* %6
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds float*, float** %26, i64 %28
store float* %25, float** %29
br label %30
30: ; preds = %19
%31 = load i32, i32* %6
%32 = add nsw i32 %31, 1
store i32 %32, i32* %6
br label %15
33: ; preds = %15
store i32 0, i32* %8
br label %34
34: ; preds = %56, %33
%35 = load i32, i32* %8
%36 = load i32, i32* %3
%37 = icmp slt i32 %35, %36
br i1 %37, label %38, label %59
38: ; preds = %34
store i32 0, i32* %7
br label %39
39: ; preds = %52, %38
%40 = load i32, i32* %7
%41 = load i32, i32* %4
%42 = icmp slt i32 %40, %41
br i1 %42, label %43, label %55
43: ; preds = %39
%44 = load float**, float*** %5
%45 = load i32, i32* %8
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds float*, float** %44, i64 %46
%48 = load float*, float** %47
%49 = load i32, i32* %7
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds float, float* %48, i64 %50
store float 1.000000e+00, float* %51
br label %52
52: ; preds = %43
%53 = load i32, i32* %7
%54 = add nsw i32 %53, 1
store i32 %54, i32* %7
br label %39
55: ; preds = %39
br label %56
56: ; preds = %55
%57 = load i32, i32* %8
%58 = add nsw i32 %57, 1
store i32 %58, i32* %8
br label %34
59: ; preds = %34
%60 = load float**, float*** %5
ret float** %60
}

LLVM IR (-O2):
define float** @reserva(i32 %0, i32 %1) {
%3 = shl i32 %0, 3
%4 = tail call i64 @malloc(i32 %3)
%5 = inttoptr i64 %4 to float**
%6 = icmp sgt i32 %0, 0
br i1 %6, label %7, label %107
7: ; preds = %2
%8 = shl i32 %1, 2
%9 = zext i32 %0 to i64
br label %26
10: ; preds = %26
br i1 %6, label %11, label %107
11: ; preds = %10
%12 = icmp sgt i32 %1, 0
%13 = zext i32 %0 to i64
%14 = zext i32 %1 to i64
%15 = and i64 %14, 4294967288
%16 = add nsw i64 %15, -8
%17 = lshr exact i64 %16, 3
%18 = add nuw nsw i64 %17, 1
%19 = icmp ult i32 %1, 8
%20 = and i64 %14, 4294967288
%21 = and i64 %18, 7
%22 = icmp ult i64 %16, 56
%23 = and i64 %18, 4611686018427387896
%24 = icmp eq i64 %21, 0
%25 = icmp eq i64 %20, %14
br label %33
26: ; preds = %7, %26
%27 = phi i64 [ 0, %7 ], [ %31, %26 ]
%28 = tail call i64 @malloc(i32 %8)
%29 = inttoptr i64 %28 to float*
%30 = getelementptr inbounds float*, float** %5, i64 %27
store float* %29, float** %30
%31 = add nuw nsw i64 %27, 1
%32 = icmp eq i64 %31, %9
br i1 %32, label %10, label %26
33: ; preds = %11, %104
%34 = phi i64 [ 0, %11 ], [ %105, %104 ]
br i1 %12, label %35, label %104
35: ; preds = %33
%36 = getelementptr inbounds float*, float** %5, i64 %34
%37 = load float*, float** %36
br i1 %19, label %97, label %38
38: ; preds = %35
br i1 %22, label %84, label %39
39: ; preds = %38, %39
%40 = phi i64 [ %81, %39 ], [ 0, %38 ]
%41 = phi i64 [ %82, %39 ], [ 0, %38 ]
%42 = getelementptr inbounds float, float* %37, i64 %40
%43 = bitcast float* %42 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %43
%44 = getelementptr inbounds float, float* %42, i64 4
%45 = bitcast float* %44 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %45
%46 = or i64 %40, 8
%47 = getelementptr inbounds float, float* %37, i64 %46
%48 = bitcast float* %47 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %48
%49 = getelementptr inbounds float, float* %47, i64 4
%50 = bitcast float* %49 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %50
%51 = or i64 %40, 16
%52 = getelementptr inbounds float, float* %37, i64 %51
%53 = bitcast float* %52 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %53
%54 = getelementptr inbounds float, float* %52, i64 4
%55 = bitcast float* %54 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %55
%56 = or i64 %40, 24
%57 = getelementptr inbounds float, float* %37, i64 %56
%58 = bitcast float* %57 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %58
%59 = getelementptr inbounds float, float* %57, i64 4
%60 = bitcast float* %59 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %60
%61 = or i64 %40, 32
%62 = getelementptr inbounds float, float* %37, i64 %61
%63 = bitcast float* %62 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %63
%64 = getelementptr inbounds float, float* %62, i64 4
%65 = bitcast float* %64 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %65
%66 = or i64 %40, 40
%67 = getelementptr inbounds float, float* %37, i64 %66
%68 = bitcast float* %67 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %68
%69 = getelementptr inbounds float, float* %67, i64 4
%70 = bitcast float* %69 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %70
%71 = or i64 %40, 48
%72 = getelementptr inbounds float, float* %37, i64 %71
%73 = bitcast float* %72 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %73
%74 = getelementptr inbounds float, float* %72, i64 4
%75 = bitcast float* %74 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %75
%76 = or i64 %40, 56
%77 = getelementptr inbounds float, float* %37, i64 %76
%78 = bitcast float* %77 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %78
%79 = getelementptr inbounds float, float* %77, i64 4
%80 = bitcast float* %79 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %80
%81 = add nuw i64 %40, 64
%82 = add nuw i64 %41, 8
%83 = icmp eq i64 %82, %23
br i1 %83, label %84, label %39
84: ; preds = %39, %38
%85 = phi i64 [ 0, %38 ], [ %81, %39 ]
br i1 %24, label %96, label %86
86: ; preds = %84, %86
%87 = phi i64 [ %93, %86 ], [ %85, %84 ]
%88 = phi i64 [ %94, %86 ], [ 0, %84 ]
%89 = getelementptr inbounds float, float* %37, i64 %87
%90 = bitcast float* %89 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %90
%91 = getelementptr inbounds float, float* %89, i64 4
%92 = bitcast float* %91 to <4 x float>*
store <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float>* %92
%93 = add nuw i64 %87, 8
%94 = add i64 %88, 1
%95 = icmp eq i64 %94, %21
br i1 %95, label %96, label %86
96: ; preds = %86, %84
br i1 %25, label %104, label %97
97: ; preds = %35, %96
%98 = phi i64 [ 0, %35 ], [ %20, %96 ]
br label %99
99: ; preds = %97, %99
%100 = phi i64 [ %102, %99 ], [ %98, %97 ]
%101 = getelementptr inbounds float, float* %37, i64 %100
store float 1.000000e+00, float* %101
%102 = add nuw nsw i64 %100, 1
%103 = icmp eq i64 %102, %14
br i1 %103, label %104, label %99
104: ; preds = %99, %96, %33
%105 = add nuw nsw i64 %34, 1
%106 = icmp eq i64 %105, %13
br i1 %106, label %107, label %33
107: ; preds = %104, %2, %10
ret float** %5
}