#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*/ abort();
int main1() {
  int i;
  float a[20];
  float b[20] = {0,  3,  6,  9,  12, 15, 18, 21, 24, 27,
                 30, 33, 36, 39, 42, 45, 48, 51, 54, 57};
  float c[20] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
                 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
  for (i = 0; i < 20; i++) {
    a[i] = b[i] * c[i];
  }
  for (i = 0; i < 20; i++) {
    if (a[i] != b[i] * c[i])
      abort();
  }
  return 0;
}


x86 assembly (clang, -O0):
<main1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x100,%rsp
lea    -0xb0(%rbp),%rdi
lea    0xec7(%rip),%rsi
mov    $0x50,%edx
call   1040 <memcpy@plt>
lea    -0x100(%rbp),%rdi
lea    0xeff(%rip),%rsi
mov    $0x50,%edx
call   1040 <memcpy@plt>
movl   $0x0,-0x4(%rbp)
cmpl   $0x14,-0x4(%rbp)
jge    119e <main1+0x7e>
movslq -0x4(%rbp),%rax
movss  -0xb0(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
mulss  -0x100(%rbp,%rax,4),%xmm0
ff ff
movslq -0x4(%rbp),%rax
movss  %xmm0,-0x60(%rbp,%rax,4)
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1162 <main1+0x42>
movl   $0x0,-0x4(%rbp)
cmpl   $0x14,-0x4(%rbp)
jge    1201 <main1+0xe1>
movslq -0x4(%rbp),%rax
movss  -0x60(%rbp,%rax,4),%xmm0
movslq -0x4(%rbp),%rax
movss  -0xb0(%rbp,%rax,4),%xmm1
ff ff
movslq -0x4(%rbp),%rax
mulss  -0x100(%rbp,%rax,4),%xmm1
ff ff
ucomiss %xmm1,%xmm0
jne    11e7 <main1+0xc7>
jp     11e7 <main1+0xc7>
jmp    11ee <main1+0xce>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    11f3 <main1+0xd3>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11a5 <main1+0x85>
xor    %eax,%eax
add    $0x100,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main1>:
sub    $0x58,%rsp
movaps 0xee5(%rip),%xmm0
movaps %xmm0,(%rsp)
movaps 0xeea(%rip),%xmm0
movaps %xmm0,0x10(%rsp)
movaps 0xeee(%rip),%xmm0
movaps %xmm0,0x20(%rsp)
movaps 0xef2(%rip),%xmm0
movaps %xmm0,0x30(%rsp)
movaps 0xef6(%rip),%xmm0
movaps %xmm0,0x40(%rsp)
mov    $0x1,%eax
lea    0xef5(%rip),%rcx
lea    0xf3e(%rip),%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movss  -0x4(%rsp,%rax,4),%xmm0
movss  -0x4(%rcx,%rax,4),%xmm1
mulss  -0x4(%rdx,%rax,4),%xmm1
ucomiss %xmm1,%xmm0
jne    11b0 <main1+0xa0>
jp     11b0 <main1+0xa0>
movss  (%rsp,%rax,4),%xmm0
movss  (%rcx,%rax,4),%xmm1
mulss  (%rdx,%rax,4),%xmm1
ucomiss %xmm1,%xmm0
jne    11b0 <main1+0xa0>
jp     11b0 <main1+0xa0>
add    $0x2,%rax
cmp    $0x15,%rax
jne    1170 <main1+0x60>
xor    %eax,%eax
add    $0x58,%rsp
ret
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
@__const.main1.b = [20 x float] [float 0.000000e+00, float 3.000000e+00, float 6.000000e+00, float 9.000000e+00, float 1.200000e+01, float 1.500000e+01, float 1.800000e+01, float 2.100000e+01, float 2.400000e+01, float 2.700000e+01, float 3.000000e+01, float 3.300000e+01, float 3.600000e+01, float 3.900000e+01, float 4.200000e+01, float 4.500000e+01, float 4.800000e+01, float 5.100000e+01, float 5.400000e+01, float 5.700000e+01]
@__const.main1.c = [20 x float] [float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, float 8.000000e+00, float 9.000000e+00, float 1.000000e+01, float 1.100000e+01, float 1.200000e+01, float 1.300000e+01, float 1.400000e+01, float 1.500000e+01, float 1.600000e+01, float 1.700000e+01, float 1.800000e+01, float 1.900000e+01]
define i32 @main1() {
%1 = alloca i32
%2 = alloca [20 x float]
%3 = alloca [20 x float]
%4 = alloca [20 x float]
%5 = bitcast [20 x float]* %3 to i8*
%6 = bitcast [20 x float]* %4 to i8*
store i32 0, i32* %1
br label %7
7: ; preds = %23, %0
%8 = load i32, i32* %1
%9 = icmp slt i32 %8, 20
br i1 %9, label %10, label %26
10: ; preds = %7
%11 = load i32, i32* %1
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds [20 x float], [20 x float]* %3, i64 0, i64 %12
%14 = load float, float* %13
%15 = load i32, i32* %1
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds [20 x float], [20 x float]* %4, i64 0, i64 %16
%18 = load float, float* %17
%19 = fmul float %14, %18
%20 = load i32, i32* %1
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds [20 x float], [20 x float]* %2, i64 0, i64 %21
store float %19, float* %22
br label %23
23: ; preds = %10
%24 = load i32, i32* %1
%25 = add nsw i32 %24, 1
store i32 %25, i32* %1
br label %7
26: ; preds = %7
store i32 0, i32* %1
br label %27
27: ; preds = %48, %26
%28 = load i32, i32* %1
%29 = icmp slt i32 %28, 20
br i1 %29, label %30, label %51
30: ; preds = %27
%31 = load i32, i32* %1
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds [20 x float], [20 x float]* %2, i64 0, i64 %32
%34 = load float, float* %33
%35 = load i32, i32* %1
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds [20 x float], [20 x float]* %3, i64 0, i64 %36
%38 = load float, float* %37
%39 = load i32, i32* %1
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [20 x float], [20 x float]* %4, i64 0, i64 %40
%42 = load float, float* %41
%43 = fmul float %38, %42
%44 = fcmp une float %34, %43
br i1 %44, label %45, label %47
45: ; preds = %30
%46 = call i32 (...) @abort()
unreachable
47: ; preds = %30
br label %48
48: ; preds = %47
%49 = load i32, i32* %1
%50 = add nsw i32 %49, 1
store i32 %50, i32* %1
br label %27
51: ; preds = %27
ret i32 0
}

LLVM IR (-O2):
@__const.main1.b = [20 x float] [float 0.000000e+00, float 3.000000e+00, float 6.000000e+00, float 9.000000e+00, float 1.200000e+01, float 1.500000e+01, float 1.800000e+01, float 2.100000e+01, float 2.400000e+01, float 2.700000e+01, float 3.000000e+01, float 3.300000e+01, float 3.600000e+01, float 3.900000e+01, float 4.200000e+01, float 4.500000e+01, float 4.800000e+01, float 5.100000e+01, float 5.400000e+01, float 5.700000e+01]
@__const.main1.c = [20 x float] [float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, float 8.000000e+00, float 9.000000e+00, float 1.000000e+01, float 1.100000e+01, float 1.200000e+01, float 1.300000e+01, float 1.400000e+01, float 1.500000e+01, float 1.600000e+01, float 1.700000e+01, float 1.800000e+01, float 1.900000e+01]
define i32 @main1() {
%1 = alloca [20 x float]
%2 = bitcast [20 x float]* %1 to i8*
%3 = bitcast [20 x float]* %1 to <4 x float>*
store <4 x float> <float 0.000000e+00, float 3.000000e+00, float 1.200000e+01, float 2.700000e+01>, <4 x float>* %3
%4 = getelementptr inbounds [20 x float], [20 x float]* %1, i64 0, i64 4
%5 = bitcast float* %4 to <4 x float>*
store <4 x float> <float 4.800000e+01, float 7.500000e+01, float 1.080000e+02, float 1.470000e+02>, <4 x float>* %5
%6 = getelementptr inbounds [20 x float], [20 x float]* %1, i64 0, i64 8
%7 = bitcast float* %6 to <4 x float>*
store <4 x float> <float 1.920000e+02, float 2.430000e+02, float 3.000000e+02, float 3.630000e+02>, <4 x float>* %7
%8 = getelementptr inbounds [20 x float], [20 x float]* %1, i64 0, i64 12
%9 = bitcast float* %8 to <4 x float>*
store <4 x float> <float 4.320000e+02, float 5.070000e+02, float 5.880000e+02, float 6.750000e+02>, <4 x float>* %9
%10 = getelementptr inbounds [20 x float], [20 x float]* %1, i64 0, i64 16
%11 = bitcast float* %10 to <4 x float>*
store <4 x float> <float 7.680000e+02, float 8.670000e+02, float 9.720000e+02, float 1.083000e+03>, <4 x float>* %11
br label %25
12: ; preds = %25
%13 = or i64 %26, 1
%14 = getelementptr inbounds [20 x float], [20 x float]* %1, i64 0, i64 %13
%15 = load float, float* %14
%16 = getelementptr inbounds [20 x float], [20 x float]* @__const.main1.b, i64 0, i64 %13
%17 = load float, float* %16
%18 = getelementptr inbounds [20 x float], [20 x float]* @__const.main1.c, i64 0, i64 %13
%19 = load float, float* %18
%20 = fmul float %17, %19
%21 = fcmp une float %15, %20
br i1 %21, label %35, label %22
22: ; preds = %12
%23 = add nuw nsw i64 %26, 2
%24 = icmp eq i64 %23, 20
br i1 %24, label %37, label %25
25: ; preds = %22, %0
%26 = phi i64 [ 0, %0 ], [ %23, %22 ]
%27 = getelementptr inbounds [20 x float], [20 x float]* %1, i64 0, i64 %26
%28 = load float, float* %27
%29 = getelementptr inbounds [20 x float], [20 x float]* @__const.main1.b, i64 0, i64 %26
%30 = load float, float* %29
%31 = getelementptr inbounds [20 x float], [20 x float]* @__const.main1.c, i64 0, i64 %26
%32 = load float, float* %31
%33 = fmul float %30, %32
%34 = fcmp une float %28, %33
br i1 %34, label %35, label %12
35: ; preds = %12, %25
%36 = tail call i32 (...) @abort()
unreachable
37: ; preds = %22
ret i32 0
}