1; The goal of the test case is to ensure that correct types are applied to PHI's as arguments of other PHI's. 2; Pass criterion is that spirv-val considers output valid. 3 4; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} 5; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s 6 7; CHECK-DAG: OpName %[[#Foo:]] "foo" 8; CHECK-DAG: OpName %[[#FooVal1:]] "val1" 9; CHECK-DAG: OpName %[[#FooVal2:]] "val2" 10; CHECK-DAG: OpName %[[#FooVal3:]] "val3" 11; CHECK-DAG: OpName %[[#Bar:]] "bar" 12; CHECK-DAG: OpName %[[#BarVal1:]] "val1" 13; CHECK-DAG: OpName %[[#BarVal2:]] "val2" 14; CHECK-DAG: OpName %[[#BarVal3:]] "val3" 15 16; CHECK-DAG: %[[#Short:]] = OpTypeInt 16 0 17; CHECK-DAG: %[[#ShortGenPtr:]] = OpTypePointer Generic %[[#Short]] 18; CHECK-DAG: %[[#ShortWrkPtr:]] = OpTypePointer Workgroup %[[#Short]] 19; CHECK-DAG: %[[#G1:]] = OpVariable %[[#ShortWrkPtr]] Workgroup 20 21; CHECK: %[[#Foo:]] = OpFunction %[[#]] None %[[#]] 22; CHECK: %[[#FooArgP:]] = OpFunctionParameter %[[#ShortGenPtr]] 23; CHECK: OpFunctionParameter 24; CHECK: OpFunctionParameter 25; CHECK: OpFunctionParameter 26; CHECK: %[[#FooG1:]] = OpPtrCastToGeneric %[[#ShortGenPtr]] %[[#G1]] 27; CHECK: %[[#FooVal2]] = OpPhi %[[#ShortGenPtr]] %[[#FooArgP]] %[[#]] %[[#FooVal3]] %[[#]] 28; CHECK: %[[#FooVal1]] = OpPhi %[[#ShortGenPtr]] %[[#FooG1]] %[[#]] %[[#FooVal2]] %[[#]] 29; CHECK: %[[#FooVal3]] = OpLoad %[[#ShortGenPtr]] %[[#]] 30 31; CHECK: %[[#Bar:]] = OpFunction %[[#]] None %[[#]] 32; CHECK: %[[#BarArgP:]] = OpFunctionParameter %[[#ShortGenPtr]] 33; CHECK: OpFunctionParameter 34; CHECK: OpFunctionParameter 35; CHECK: OpFunctionParameter 36; CHECK: %[[#BarVal3]] = OpLoad %[[#ShortGenPtr]] %[[#]] 37; CHECK: %[[#BarG1:]] = OpPtrCastToGeneric %[[#ShortGenPtr]] %[[#G1]] 38; CHECK: %[[#BarVal1]] = OpPhi %[[#ShortGenPtr]] %[[#BarG1]] %[[#]] %[[#BarVal2]] %[[#]] 39; CHECK: %[[#BarVal2]] = OpPhi %[[#ShortGenPtr]] %[[#BarArgP]] %[[#]] %[[#BarVal3]] %[[#]] 40 41@G1 = internal addrspace(3) global i16 undef, align 8 42@G2 = internal unnamed_addr addrspace(3) global ptr addrspace(4) undef, align 8 43 44define spir_kernel void @foo(ptr addrspace(4) %p, i1 %f1, i1 %f2, i1 %f3) { 45entry: 46 br label %l1 47 48l1: 49 br i1 %f1, label %l2, label %exit 50 51l2: 52 %val2 = phi ptr addrspace(4) [ %p, %l1 ], [ %val3, %l3 ] 53 %val1 = phi ptr addrspace(4) [ addrspacecast (ptr addrspace(3) @G1 to ptr addrspace(4)), %l1 ], [ %val2, %l3 ] 54 br i1 %f2, label %l3, label %exit 55 56l3: 57 %val3 = load ptr addrspace(4), ptr addrspace(3) @G2, align 8 58 br i1 %f3, label %l2, label %exit 59 60exit: 61 ret void 62} 63 64define spir_kernel void @bar(ptr addrspace(4) %p, i1 %f1, i1 %f2, i1 %f3) { 65entry: 66 %val3 = load ptr addrspace(4), ptr addrspace(3) @G2, align 8 67 br label %l1 68 69l3: 70 br i1 %f3, label %l2, label %exit 71 72l1: 73 br i1 %f1, label %l2, label %exit 74 75l2: 76 %val1 = phi ptr addrspace(4) [ addrspacecast (ptr addrspace(3) @G1 to ptr addrspace(4)), %l1 ], [ %val2, %l3 ] 77 %val2 = phi ptr addrspace(4) [ %p, %l1 ], [ %val3, %l3 ] 78 br i1 %f2, label %l3, label %exit 79 80exit: 81 ret void 82} 83