int main(int argc, const char *argv[]) {
  struct my_struct {
    int a;
    float b;
    int c;
    struct {
      int e;
      float f;
      double g;
      struct {
        float i;
      } h;
      int j;
    } d;
  } x, y;
  x.a = 1;
  x.b = 1.3;
  x.c = 12;
  x.d.e = 100;
  x.d.f = 1.45;
  x.d.g = 45.85;
  x.d.h.i = 148963;
  x.d.j = 1578;
  y.a = x.a;
  y.b = x.b;
  y.c = x.c;
  y.d.e = x.d.e;
  y.d.f = x.d.f;
  y.d.g = x.d.g;
  y.d.h.i = x.d.h.i;
  y.d.j = x.d.j;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x1,-0x38(%rbp)
movss  0xee7(%rip),%xmm0
movss  %xmm0,-0x34(%rbp)
movl   $0xc,-0x30(%rbp)
movl   $0x64,-0x28(%rbp)
movss  0xec8(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
movsd  0xec7(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movss  0xeaa(%rip),%xmm0
movss  %xmm0,-0x18(%rbp)
movl   $0x62a,-0x14(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x60(%rbp)
movss  -0x34(%rbp),%xmm0
movss  %xmm0,-0x5c(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x50(%rbp)
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x3c(%rbp)
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
xor    %eax,%eax
ret

LLVM IR (-O0):
%struct.my_struct = type { i32, float, i32, %struct.anon }
%struct.anon = type { i32, float, double, %struct.anon.0, i32 }
%struct.anon.0 = type { float }
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca %struct.my_struct
%7 = alloca %struct.my_struct
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%8 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 0
store i32 1, i32* %8
%9 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 1
store float 0x3FF4CCCCC0000000, float* %9
%10 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 2
store i32 12, i32* %10
%11 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%12 = getelementptr inbounds %struct.anon, %struct.anon* %11, i32 0, i32 0
store i32 100, i32* %12
%13 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%14 = getelementptr inbounds %struct.anon, %struct.anon* %13, i32 0, i32 1
store float 0x3FF7333340000000, float* %14
%15 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%16 = getelementptr inbounds %struct.anon, %struct.anon* %15, i32 0, i32 2
store double 4.585000e+01, double* %16
%17 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%18 = getelementptr inbounds %struct.anon, %struct.anon* %17, i32 0, i32 3
%19 = getelementptr inbounds %struct.anon.0, %struct.anon.0* %18, i32 0, i32 0
store float 1.489630e+05, float* %19
%20 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%21 = getelementptr inbounds %struct.anon, %struct.anon* %20, i32 0, i32 4
store i32 1578, i32* %21
%22 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 0
%23 = load i32, i32* %22
%24 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 0
store i32 %23, i32* %24
%25 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 1
%26 = load float, float* %25
%27 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 1
store float %26, float* %27
%28 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 2
%29 = load i32, i32* %28
%30 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 2
store i32 %29, i32* %30
%31 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%32 = getelementptr inbounds %struct.anon, %struct.anon* %31, i32 0, i32 0
%33 = load i32, i32* %32
%34 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 3
%35 = getelementptr inbounds %struct.anon, %struct.anon* %34, i32 0, i32 0
store i32 %33, i32* %35
%36 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%37 = getelementptr inbounds %struct.anon, %struct.anon* %36, i32 0, i32 1
%38 = load float, float* %37
%39 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 3
%40 = getelementptr inbounds %struct.anon, %struct.anon* %39, i32 0, i32 1
store float %38, float* %40
%41 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%42 = getelementptr inbounds %struct.anon, %struct.anon* %41, i32 0, i32 2
%43 = load double, double* %42
%44 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 3
%45 = getelementptr inbounds %struct.anon, %struct.anon* %44, i32 0, i32 2
store double %43, double* %45
%46 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%47 = getelementptr inbounds %struct.anon, %struct.anon* %46, i32 0, i32 3
%48 = getelementptr inbounds %struct.anon.0, %struct.anon.0* %47, i32 0, i32 0
%49 = load float, float* %48
%50 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 3
%51 = getelementptr inbounds %struct.anon, %struct.anon* %50, i32 0, i32 3
%52 = getelementptr inbounds %struct.anon.0, %struct.anon.0* %51, i32 0, i32 0
store float %49, float* %52
%53 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %6, i32 0, i32 3
%54 = getelementptr inbounds %struct.anon, %struct.anon* %53, i32 0, i32 4
%55 = load i32, i32* %54
%56 = getelementptr inbounds %struct.my_struct, %struct.my_struct* %7, i32 0, i32 3
%57 = getelementptr inbounds %struct.anon, %struct.anon* %56, i32 0, i32 4
store i32 %55, i32* %57
ret i32 0
}

LLVM IR (-O2):
define i32 @main(i32 %0, i8** nocapture readnone %1) {
ret i32 0
}