#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();
__attribute__((no)) int main1() {
  union {
    unsigned char a[128] __attribute__((__aligned__(16)));
    unsigned char b[128] __attribute__((__aligned__(16)));
  } s;
  int i;
  for (i = 0; i < 128; i++) {
    s.b[i] = i;
  }
  for (i = 0; i < 128; i++) {
    s.a[i] = s.b[i] + 1;
  }
  for (i = 0; i < 128; i++) {
    if (s.a[i] != i + 1)
      abort();
  }
  return 0;
}


x86 assembly (clang, -O0):
<main1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
movl   $0x0,-0x84(%rbp)
cmpl   $0x80,-0x84(%rbp)
jge    115c <main1+0x4c>
mov    -0x84(%rbp),%eax
mov    %al,%cl
movslq -0x84(%rbp),%rax
mov    %cl,-0x80(%rbp,%rax,1)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1125 <main1+0x15>
movl   $0x0,-0x84(%rbp)
cmpl   $0x80,-0x84(%rbp)
jge    11a6 <main1+0x96>
movslq -0x84(%rbp),%rax
movzbl -0x80(%rbp,%rax,1),%eax
add    $0x1,%eax
mov    %al,%cl
movslq -0x84(%rbp),%rax
mov    %cl,-0x80(%rbp,%rax,1)
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    1166 <main1+0x56>
movl   $0x0,-0x84(%rbp)
cmpl   $0x80,-0x84(%rbp)
jge    11fd <main1+0xed>
movslq -0x84(%rbp),%rax
movzbl -0x80(%rbp,%rax,1),%eax
mov    -0x84(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
je     11e4 <main1+0xd4>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    11e9 <main1+0xd9>
mov    -0x84(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x84(%rbp)
jmp    11b0 <main1+0xa0>
xor    %eax,%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main1>:
sub    $0x88,%rsp
movaps 0xee2(%rip),%xmm0
movaps 0xeeb(%rip),%xmm1
movaps %xmm0,(%rsp)
movaps %xmm1,0x10(%rsp)
movaps 0xeeb(%rip),%xmm0
movaps 0xef4(%rip),%xmm1
movaps %xmm0,0x20(%rsp)
movaps %xmm1,0x30(%rsp)
movaps 0xef3(%rip),%xmm0
movaps 0xefc(%rip),%xmm1
movaps %xmm0,0x40(%rsp)
movaps %xmm1,0x50(%rsp)
movaps 0xefb(%rip),%xmm0
movaps 0xf04(%rip),%xmm1
movaps %xmm0,0x60(%rsp)
movaps %xmm1,0x70(%rsp)
mov    $0x2,%eax
nopl   0x0(%rax,%rax,1)
movzbl -0x2(%rsp,%rax,1),%ecx
lea    -0x1(%rax),%rdx
cmp    %rcx,%rdx
jne    11b4 <main1+0xa4>
movzbl -0x1(%rsp,%rax,1),%ecx
cmp    %rcx,%rax
jne    11b4 <main1+0xa4>
cmp    $0x80,%rax
je     11bb <main1+0xab>
movzbl (%rsp,%rax,1),%ecx
lea    0x3(%rax),%rdx
add    $0x1,%rax
cmp    %rcx,%rax
mov    %rdx,%rax
je     1180 <main1+0x70>
xor    %eax,%eax
call   1030 <abort@plt>
xor    %eax,%eax
add    $0x88,%rsp
ret

LLVM IR (-O0):
%union.anon = type { [128 x i8] }
define i32 @main1() {
%1 = alloca %union.anon
%2 = alloca i32
store i32 0, i32* %2
br label %3
3: ; preds = %13, %0
%4 = load i32, i32* %2
%5 = icmp slt i32 %4, 128
br i1 %5, label %6, label %16
6: ; preds = %3
%7 = load i32, i32* %2
%8 = trunc i32 %7 to i8
%9 = bitcast %union.anon* %1 to [128 x i8]*
%10 = load i32, i32* %2
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds [128 x i8], [128 x i8]* %9, i64 0, i64 %11
store i8 %8, i8* %12
br label %13
13: ; preds = %6
%14 = load i32, i32* %2
%15 = add nsw i32 %14, 1
store i32 %15, i32* %2
br label %3
16: ; preds = %3
store i32 0, i32* %2
br label %17
17: ; preds = %33, %16
%18 = load i32, i32* %2
%19 = icmp slt i32 %18, 128
br i1 %19, label %20, label %36
20: ; preds = %17
%21 = bitcast %union.anon* %1 to [128 x i8]*
%22 = load i32, i32* %2
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [128 x i8], [128 x i8]* %21, i64 0, i64 %23
%25 = load i8, i8* %24
%26 = zext i8 %25 to i32
%27 = add nsw i32 %26, 1
%28 = trunc i32 %27 to i8
%29 = bitcast %union.anon* %1 to [128 x i8]*
%30 = load i32, i32* %2
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [128 x i8], [128 x i8]* %29, i64 0, i64 %31
store i8 %28, i8* %32
br label %33
33: ; preds = %20
%34 = load i32, i32* %2
%35 = add nsw i32 %34, 1
store i32 %35, i32* %2
br label %17
36: ; preds = %17
store i32 0, i32* %2
br label %37
37: ; preds = %53, %36
%38 = load i32, i32* %2
%39 = icmp slt i32 %38, 128
br i1 %39, label %40, label %56
40: ; preds = %37
%41 = bitcast %union.anon* %1 to [128 x i8]*
%42 = load i32, i32* %2
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds [128 x i8], [128 x i8]* %41, i64 0, i64 %43
%45 = load i8, i8* %44
%46 = zext i8 %45 to i32
%47 = load i32, i32* %2
%48 = add nsw i32 %47, 1
%49 = icmp ne i32 %46, %48
br i1 %49, label %50, label %52
50: ; preds = %40
%51 = call i32 (...) @abort()
unreachable
52: ; preds = %40
br label %53
53: ; preds = %52
%54 = load i32, i32* %2
%55 = add nsw i32 %54, 1
store i32 %55, i32* %2
br label %37
56: ; preds = %37
ret i32 0
}

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