// RUN: clspv %target %s -o %t.spv -hack-phis
// RUN: spirv-dis -o %t2.spvasm %t.spv
// RUN: FileCheck %s < %t2.spvasm
// RUN: spirv-val --target-env vulkan1.0 %t.spv

// TODO variant with 64-bit addresses?
typedef struct { int arr[2]; } S1;
typedef struct { S1 s1; int a; S1 s2; } S2;

__attribute__((noinline))
S2 make_s2(int n) {
  S2 s2;
  s2.s1.arr[0] = n;
  s2.s1.arr[1] = n+1;
  s2.a = n+2;
  s2.s2.arr[0] = n+3;
  s2.s2.arr[1] = n+4;
  return s2;
}

__attribute__((noinline))
S2 choose(int n) {
  if (n > 0) return make_s2(n - 5);
  return make_s2(n + 10);
}

kernel void foo(global S2 *data, int n) {
  *data = choose(n);
}

// CHECK-DAG: [[_uint:%[0-9a-zA-Z_]+]] = OpTypeInt 32 0
// CHECK-DAG: [[_uint_2:%[0-9a-zA-Z_]+]] = OpConstant [[_uint]] 2
// CHECK-DAG: [[__arr_uint_uint_2:%[0-9a-zA-Z_]+]] = OpTypeArray [[_uint]] [[_uint_2]]
// CHECK-DAG: [[__struct_4:%[0-9a-zA-Z_]+]] = OpTypeStruct [[__arr_uint_uint_2]]
// CHECK-DAG: [[__struct_5:%[0-9a-zA-Z_]+]] = OpTypeStruct [[__struct_4]] [[_uint]] [[__struct_4]]
// CHECK-NOT: OpPhi [[__struct_5]]
// CHECK-NOT: OpPhi [[__struct_4]]
// CHECK: [[_61:%[0-9a-zA-Z_]+]] = OpPhi [[__arr_uint_uint_2]]
// CHECK: [[_62:%[0-9a-zA-Z_]+]] = OpPhi [[_uint]]
// CHECK: [[_63:%[0-9a-zA-Z_]+]] = OpPhi [[__arr_uint_uint_2]]
// CHECK: [[_66:%[0-9a-zA-Z_]+]] = OpCompositeConstruct [[__struct_4]] [[_63]]
// CHECK: [[_67:%[0-9a-zA-Z_]+]] = OpCompositeConstruct [[__struct_4]] [[_61]]
// CHECK: [[_65:%[0-9a-zA-Z_]+]] = OpCompositeConstruct [[__struct_5]] [[_67]] [[_62]] [[_66]]
// CHECK: [[_68:%[0-9a-zA-Z_]+]] = OpCompositeExtract [[__struct_4]] [[_65]] 0
// CHECK: [[_69:%[0-9a-zA-Z_]+]] = OpCompositeExtract [[__arr_uint_uint_2]] [[_68]] 0
// CHECK: [[_70:%[0-9a-zA-Z_]+]] = OpCompositeExtract [[_uint]] [[_65]] 1
// CHECK: [[_71:%[0-9a-zA-Z_]+]] = OpCompositeExtract [[__struct_4]] [[_65]] 2
// CHECK: [[_72:%[0-9a-zA-Z_]+]] = OpCompositeExtract [[__arr_uint_uint_2]] [[_71]] 0
// CHECK: OpSelectionMerge [[_73:%[0-9a-zA-Z_]+]] None
// CHECK: [[_73]] = OpLabel
// CHECK-NOT: OpPhi [[__struct_5]]
// CHECK-NOT: OpPhi [[__struct_4]]
// CHECK: [[_74:%[0-9a-zA-Z_]+]] = OpPhi [[__arr_uint_uint_2]] [[_69]]
// CHECK: [[_75:%[0-9a-zA-Z_]+]] = OpPhi [[_uint]] [[_70]]
// CHECK: [[_76:%[0-9a-zA-Z_]+]] = OpPhi [[__arr_uint_uint_2]] [[_72]]
// CHECK: [[_78:%[0-9a-zA-Z_]+]] = OpCompositeConstruct [[__struct_4]] [[_76]]
// CHECK: [[_79:%[0-9a-zA-Z_]+]] = OpCompositeConstruct [[__struct_4]] [[_74]]
// CHECK: [[_77:%[0-9a-zA-Z_]+]] = OpCompositeConstruct [[__struct_5]] [[_79]] [[_75]] [[_78]]
