<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/151344>151344</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
SPIR-V: Verification errors with struct-returning IR
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
maleadt
</td>
</tr>
</table>
<pre>
The following two reproducers fail to compile with `llc` because of IR verification errors during compilation, presumably caused by internal SPIR-V passes. Both files compile fine when using the SPIRV-LLVM-Translator.
---
```llvm
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
target triple = "spirv64-unknown-unknown-unknown"
define fastcc { i1, i64 } @foobar(i1 %cond, { i1, i64 } %a, { i1, i64 } %b) {
top:
%val = select i1 %cond, { i1, i64 } %a, { i1, i64 } %b
ret { i1, i64 } %val
}
```
Using the translator:
```
❯ llvm-as reduced1.ll -o - | llvm-spirv -o - | spirv-dis
; SPIR-V
; Version: 1.0
; Generator: Khronos LLVM/SPIR-V Translator; 14
; Bound: 12
; Schema: 0
OpCapability Addresses
OpCapability Linkage
OpCapability Kernel
OpCapability Int64
%1 = OpExtInstImport "OpenCL.std"
OpMemoryModel Physical64 OpenCL
OpSource Unknown 0
OpName %foobar "foobar"
OpName %cond "cond"
OpName %a "a"
OpName %b "b"
OpName %top "top"
OpName %val "val"
OpDecorate %foobar LinkageAttributes "foobar" Export
%ulong = OpTypeInt 64 0
%bool = OpTypeBool
%_struct_2 = OpTypeStruct %bool %ulong
%5 = OpTypeFunction %_struct_2 %bool %_struct_2 %_struct_2
%foobar = OpFunction %_struct_2 None %5
%cond = OpFunctionParameter %bool
%a = OpFunctionParameter %_struct_2
%b = OpFunctionParameter %_struct_2
%top = OpLabel
%val = OpSelect %_struct_2 %cond %a %b
OpReturnValue %val
OpFunctionEnd
```
Using the LLVM back-end:
```
❯ llc reduced1.ll
Select values must have same type as select instruction!
%val = select i1 %cond, i32 %a, i32 %b
Function return type does not match operand type of return inst!
ret { i1, i64 } %val
i32in function foobar
LLVM ERROR: Broken function found, compilation aborted!
```
---
```llvm
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"
target triple = "spirv64-unknown-unknown-unknown"
define fastcc { i1, i64 } @foobar(i1 %cond, { i1, i64 } %input) {
top:
br i1 %cond, label %ret, label %L59.1
ret:
%val = phi { i1, i64 } [ zeroinitializer, %L59.1 ], [ %input, %top ]
ret { i1, i64 } %val
L59.1:
br label %ret
}
```
```
❯ llvm-as reduced2.ll -o - | llvm-spirv -o - | spirv-dis
; SPIR-V
; Version: 1.0
; Generator: Khronos LLVM/SPIR-V Translator; 14
; Bound: 14
; Schema: 0
OpCapability Addresses
OpCapability Linkage
OpCapability Kernel
OpCapability Int64
%1 = OpExtInstImport "OpenCL.std"
OpMemoryModel Physical64 OpenCL
OpSource Unknown 0
OpName %foobar "foobar"
OpName %cond "cond"
OpName %input "input"
OpName %top "top"
OpName %ret "ret"
OpName %L59_1 "L59.1"
OpName %val "val"
OpDecorate %foobar LinkageAttributes "foobar" Export
%ulong = OpTypeInt 64 0
%bool = OpTypeBool
%_struct_2 = OpTypeStruct %bool %ulong
%5 = OpTypeFunction %_struct_2 %bool %_struct_2
%12 = OpConstantNull %_struct_2
%foobar = OpFunction %_struct_2 None %5
%cond = OpFunctionParameter %bool
%input = OpFunctionParameter %_struct_2
%top = OpLabel
OpBranchConditional %cond %ret %L59_1
%ret = OpLabel
%val = OpPhi %_struct_2 %12 %L59_1 %input %top
OpReturnValue %val
%L59_1 = OpLabel
OpBranch %ret
OpFunctionEnd
```
```
❯ llc reduced2.ll
PHI node operands are not the same type as the result!
%val = phi { i1, i64 } [ %1, %L59.1 ], [ %input, %top ]
Function return type does not match operand type of return inst!
ret { i1, i64 } %val
i32in function foobar
```
---
Reproduced on latest master.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWF1v2zgW_TX0y4UMifqw_eAHO05mg0mbwO3ktaCka4tbmhRIyhnPr1-QkvwVJ06wg1ks0KCAJfLw8vDyXPJUzBi-lohTks5JuhiwxlZKTzdMICvtIFflbvq9QlgpIdQLl2uwLwo01lqVTYHawIpxAVZBoTY1Fwgv3FZAslCIgmQh5FiwxiCoFdwvYYuar3jBLFcSUGulDZSNdnHb8b6H0BuoNZpmw3KxAx-ghHwHXFrUkgn49nS_DJ6hZsagGcJc2QpWXKDZ01hxifBSoYTGeNoV-lHPwcPD85fgu2bSCGaVHpJwRsJZEATtA8nC9p8Q2w0JZ5bpNVoomWWC7VRjgcQLIJRiwLOExLMsCbZRRuJZlAVb6lpiGmxj2j0k4w4z8Rg6DrbRxHXS1OHTrH9MI9eaRjTYRqGP436C3yJC6YGH1bwW2HMwNdfbLAka-VOqF3n-244k4axEn48VM7YogIzmwCOXZZ4lQEYLIEm4UipnmtAxj4DQtFCydIgLWJqyN3tyQieuxxFWNYnd5OA6tkx40gYFFhb-y0lcUI32cveWCbfq0eJ4N9s8_LHXgt0LoCV5jr2lZLIgsztwMgiYAY1O8GU0FAICBQGQ0U3b6Tfh0OZfg5IbFyaed1rtXp5RG6fweAbRMOwaf0OJuqMCv1daSWXAyZTQu07p34_oziFKupFz1cjSB6P9bEWFG-aaQp-lk7_H-obVLOeC2x3MylKjq58ruAcuf7I1XkH9jlqiuAK6lzZLTjCEppHXxWN9-6e9l8beb2qlrRP3Y43y5mFobNnq-FXkL7hRevdFlSjgqdoZXjCRJdCOuzTgm2p0gfBHWx2XM_SVbdDRauvB8egr4yKHHu6k7MCtpN-FModjV0C5A-VXQFbVDuYq7X2grz5KXWVcBi6wUJrZ45V3-z6zVvO8sWhOcgG3f7p92sciNG2EkutuM7_varyXFrLkOMtuXUqJI8xcKdEfET-M1U1hf9Cj_m--6TCwm-VcQ-nRkLtGFv5-OQ15iHDSuH_pQx5tvQ95OdxXJX2u0pPFtSI4GfbENNugRd0zOKfO3hvwit0-jZ8d1avFj3pg-UmtHp3Pj_W39oQ-T1QncK_e7gQ-09ASbaPlMxMNHo7hV6ie8a0s3zuf3fEHOSt-BuhPuPeP6OLkeL7-R8JZt8yto2tg0xgLFdsiGFcydlcjMLO_rWSbCe9Nog9daTym-0use3ZJ26tJ-2S1E5UKDUhlYcNsUYGqUTNZtn1q1UMdiX72K3efm5FLWPWTdVUbznxWb5fLx6W7IeZa_cQTWNOSP_JiwHKlLZbtzGfb9cs0fcI0cVk39qI9yvWZeISrT9eg0Z68P6STYdSyc12v7VVd8Uuzp3P4C7XiklvOBP8LtafZBQSSLvx7Oj8ierM_M9LFhwxXOGvpHVZ1so43LNmHXBf9uOu6Uvb_nCNLfjmy_xdH5hXvsJ30_x7T5euFUl_D7wIf0skPV_-0rZ9fVu7zVu44ilNwP_GNksYyab824vKAf8zuHWT2Nxq3_abPNZNFdaNkyV1Ur5G9ZWuF2MrsNLLvuW4Jn9ytcrYFET2W7r6EHNlPmsNDmI-s8XCdvAK8ay2vWkd_x5Bw9vSve5CqxN6HGWAavT1zvvTEHroGjaYR9oItfPsqdtn79P37P3aObzm_Zf8psAQlQTCLxrExFvVwUE7jchJP2ACn0SiNx-MsG6eDalpmNExzOhmnecKKScHKImYFKzEMy8koLgZ8SkOahqM4jJIkSdJhNCqycjwKWY7jtJjkJAlxw7gYOi8wVHo94MY0OI3SKE6SgTcexn_UpFTiC_hed2Cmi4GeegORN2tDklBwY80hjOVW4LRzCPHM2YNXXyz9J862FoI2xe5_LffLQaPFtLK2Ns4D0TtC79bcVk0-LNSG0DtvjtufoNbq31hYQu88NUPoXcd9O6X_CQAA__8lwBZ8">