// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -emit-ir | %FileCheck %s

// REQUIRES: CPU=x86_64

// Generated from
// var x : Int32 = 2
// public func f() -> Int32 { return x }
// with swiftc -O -parse-as-library -emit-sil

import Builtin
import Swift

struct S {
  var m : Int32
}

public struct S2 {
  public var i, j : Int32
  var s : S
}

// CHECK: %Ts5Int32V = type <{ i32 }>
// CHECK: %T18static_initializer2S2V = type <{ %Ts5Int32V, %Ts5Int32V, %T18static_initializer1SV }>
// CHECK: %T18static_initializer1SV = type <{ %Ts5Int32V }>
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems0c = type { [1 x i64], %T18static_initializer16TestArrayStorageC_tailelems0 }
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems0 = type <{ %swift.refcounted, %Ts5Int32V, [4 x i8], %Ts5Int64V, %Ts5Int64V }>
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems1c = type { [2 x i64], %T18static_initializer16TestArrayStorageC_tailelems1 }
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems1 = type <{ %swift.refcounted, %Ts5Int32V, [12 x i8], %Ts7Float80V }>
// CHECK: %T18static_initializer16TestArrayStorageC_tailelems3 = type <{ %swift.refcounted, %Ts5Int32V, [1 x i8], [1 x i8] }>

sil_global @$S2ch1xSiv : $Int32 = {
  %1 = integer_literal $Builtin.Int32, 2
  %initval = struct $Int32 (%1 : $Builtin.Int32)
}
// CHECK: @"$S2ch1xSiv" = {{(protected )?}}global %Ts5Int32V <{ i32 2 }>, align 4

sil_global @$S6nested1xAA2S2Vv : $S2 = {
  %1 = integer_literal $Builtin.Int32, 2
  %2 = struct $Int32 (%1 : $Builtin.Int32)
  %3 = integer_literal $Builtin.Int32, 3
  %4 = struct $Int32 (%3 : $Builtin.Int32)
  %5 = integer_literal $Builtin.Int32, 4
  %6 = struct $Int32 (%5 : $Builtin.Int32)
  %7 = struct $S (%6 : $Int32)
  %initval = struct $S2 (%2 : $Int32, %4 : $Int32, %7 : $S)
}
// CHECK: @"$S6nested1xAA2S2Vv" = {{(protected )?}}global %T18static_initializer2S2V <{ %Ts5Int32V <{ i32 2 }>, %Ts5Int32V <{ i32 3 }>, %T18static_initializer1SV <{ %Ts5Int32V <{ i32 4 }> }> }>, align 4

final class TestArrayStorage {
  @sil_stored var count: Int32
  init()
}

sil_vtable TestArrayStorage { }

struct TestArray {
  var storage : TestArrayStorage
}

sil_global @static_array : $TestArrayStorage = {
  %0 = integer_literal $Builtin.Int32, 2
  %1 = integer_literal $Builtin.Int64, 10
  %2 = integer_literal $Builtin.Int64, 20
  %3 = struct $Int32 (%0 : $Builtin.Int32)
  %4 = struct $Int64 (%1 : $Builtin.Int64)
  %5 = struct $Int64 (%2 : $Builtin.Int64)
  %initval = object $TestArrayStorage (%3 : $Int32, [tail_elems] %4 : $Int64, %5 : $Int64)
}
// CHECK: @static_array = {{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems0c { [1 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems0 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [4 x i8] undef, %Ts5Int64V <{ i64 10 }>, %Ts5Int64V <{ i64 20 }> }> }, align 8

sil_global @static_aligned_array : $TestArrayStorage = {
  %0 = integer_literal $Builtin.Int32, 2
  %1 = float_literal $Builtin.FPIEEE80, 0x3FFE8000000000000000
  %3 = struct $Int32 (%0 : $Builtin.Int32)
  %4 = struct $Float80 (%1 : $Builtin.FPIEEE80)
  %initval = object $TestArrayStorage (%3 : $Int32, [tail_elems] %4 : $Float80)
}
// CHECK: @static_aligned_array = {{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems1c { [2 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems1 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [12 x i8] undef, %Ts7Float80V <{ x86_fp80 0xK3FFE8000000000000000 }> }> }, align 16

final class ClassWithEmptyField {
  @sil_stored var x: Int32
  @sil_stored var y: ()
  init()
}

sil_vtable ClassWithEmptyField { }

sil_global @static_class_with_empty_field : $ClassWithEmptyField = {
  %0 = integer_literal $Builtin.Int32, 2
  %3 = struct $Int32 (%0 : $Builtin.Int32)
  %5 = tuple ()
  %initval = object $ClassWithEmptyField (%3 : $Int32, %5 : $())
}
// CHECK: @static_class_with_empty_field = {{(protected )?}}global %T18static_initializer19ClassWithEmptyFieldC_tailelems2c { [1 x i64] zeroinitializer, %T18static_initializer19ClassWithEmptyFieldC_tailelems2 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }> }> }, align 8

struct Empty { }

sil_global @static_array_with_empty_element : $TestArrayStorage = {
  %0 = struct $Empty ()                           // users: %7, %7
  %1 = integer_literal $Builtin.Int32, 2
  %2 = struct $Int32 (%1 : $Builtin.Int32)
  %initval = object $TestArrayStorage (%2 : $Int32, [tail_elems] %0 : $Empty, %0 : $Empty)
}
// CHECK: @static_array_with_empty_element = {{(protected )?}}global %T18static_initializer16TestArrayStorageC_tailelems3c { [1 x i64] zeroinitializer, %T18static_initializer16TestArrayStorageC_tailelems3 <{ %swift.refcounted zeroinitializer, %Ts5Int32V <{ i32 2 }>, [1 x i8] undef, [1 x i8] undef }> }, align 8

// CHECK-LABEL: define{{( protected)?}} swiftcc i8* @_TF2cha1xSi() {{.*}} {
// CHECK-NEXT: entry:
// CHECK-NEXT: ret i8* bitcast (%Ts5Int32V* @"$S2ch1xSiv" to i8*)
sil [global_init] @_TF2cha1xSi : $@convention(thin) () -> Builtin.RawPointer {
bb0:
  %0 = global_addr @$S2ch1xSiv : $*Int32
  %1 = address_to_pointer %0 : $*Int32 to $Builtin.RawPointer
  return %1 : $Builtin.RawPointer
}

// CHECK-LABEL: define{{( protected)?}} swiftcc i32 @"$S2ch1fSiyF"() {{.*}} {
// CHECK-NEXT: entry:
// CHECK-NEXT: load i32, i32* getelementptr inbounds (%Ts5Int32V, %Ts5Int32V* @"$S2ch1xSiv", i32 0, i32 0)
// CHECK-NEXT: ret
sil @$S2ch1fSiyF : $@convention(thin) () -> Int32 {
bb0:
  %0 = global_addr @$S2ch1xSiv : $*Int32
  %1 = load %0 : $*Int32
  return %1 : $Int32
}

// CHECK-LABEL: define{{( protected)?}} swiftcc i8* @_TF6nesteda1xVS_2S2() {{.*}} {
// CHECK-NEXT: entry:
// CHECK-NEXT: ret i8* bitcast (%T18static_initializer2S2V* @"$S6nested1xAA2S2Vv" to i8*)
sil [global_init] @_TF6nesteda1xVS_2S2 : $@convention(thin) () -> Builtin.RawPointer {
bb0:
  %0 = global_addr @$S6nested1xAA2S2Vv : $*S2
  %1 = address_to_pointer %0 : $*S2 to $Builtin.RawPointer
  return %1 : $Builtin.RawPointer
}

// CHECK-LABEL: define{{( protected)?}} swiftcc { i64, i32 } @"$S6nested1fAA2S2VyF"() {{.*}} {
// CHECK-NEXT: entry:
// CHECK: load i32, i32* getelementptr inbounds (%T18static_initializer2S2V, %T18static_initializer2S2V* @"$S6nested1xAA2S2Vv", i32 0, i32 0, i32 0)
// CHECK-NEXT: load i32, i32* getelementptr inbounds (%T18static_initializer2S2V, %T18static_initializer2S2V* @"$S6nested1xAA2S2Vv", i32 0, i32 1, i32 0)
// CHECK-NEXT: load i32, i32* getelementptr inbounds (%T18static_initializer2S2V, %T18static_initializer2S2V* @"$S6nested1xAA2S2Vv", i32 0, i32 2, i32 0, i32 0)
sil @$S6nested1fAA2S2VyF : $@convention(thin) () -> S2 {
bb0:
  %0 = global_addr @$S6nested1xAA2S2Vv : $*S2
  %1 = load %0 : $*S2
  return %1 : $S2
}

// CHECK-LABEL: define{{( protected)?}} swiftcc %T18static_initializer16TestArrayStorageC* @return_static_array() {{.*}} {
sil @return_static_array : $@convention(thin) () -> TestArray {
bb0:
  // CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$S18static_initializer16TestArrayStorageCMa"(i64 0)
  // CHECK: [[MD:%[0-9]+]] = extractvalue %swift.metadata_response [[TMP]], 0
  // CHECK: [[O:%[0-9a-z]+]] = call %swift.refcounted* @swift_initStaticObject(%swift.type* [[MD]], %swift.refcounted* getelementptr inbounds (%T18static_initializer16TestArrayStorageC_tailelems0c, %T18static_initializer16TestArrayStorageC_tailelems0c* @static_array, i32 0, i32 1, i32 0))
  // CHECK: [[R:%[0-9]+]] = bitcast %swift.refcounted* [[O]] to %T18static_initializer16TestArrayStorageC_tailelems0*
  // CHECK: [[R2:%[0-9]+]] = bitcast %T18static_initializer16TestArrayStorageC_tailelems0* [[R]] to %T18static_initializer16TestArrayStorageC*
  // CHECK: ret %T18static_initializer16TestArrayStorageC* [[R2]]
  %0 = global_value @static_array : $TestArrayStorage
  %1 = struct $TestArray (%0 : $TestArrayStorage)
  return %1 : $TestArray
}

