blob: 728599786becb9fa9bff5c409a0df2324804c17c [file] [log] [blame]
// RUN: clspv %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
typedef struct { int arr[2]; } S1;
typedef struct { S1 s1; int a; S1 s2; } S2;
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;
}
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]]