[SPIRV] Wrong element type inferred for long-vector transcendental ops under SPV_EXT_long_vector
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
In the most recent long vector testing on spir-v I noticed the following failures:
https://github.com/llvm/offload-test-suite/actions/runs/34271613241/job/102214360823?pr=1463
```
Failed Tests (30):
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/acos.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/asin.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/atan.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/atan2.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/ceil.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/cos.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/cosh.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/degrees.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/exp.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/exp2.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/f16tof32.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/f32tof16.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/floor.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/fma.long-vector.64.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/lerp.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/log.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/log10.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/log2.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/max.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/min.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/pow.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/radians.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/rcp.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/round.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/sin.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/sinh.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/sqrt.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/tan.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/tanh.long-vector.32.test
OffloadTest-clang-vk :: Feature/HLSLLib/long-vector/trunc.long-vector.32.test
```
The SPIRV validator reveals the issue:
```
# .---command stderr------------
# | error: line 235: GLSL.std.450 Cos: expected Result Type to be a 16 or 32-bit scalar or vector float type
# | %210 = OpExtInst %v4uint %211 Cos %208
# |
# | clang-dxc: error: spirv-val command failed with exit code 1 (use -v to see invocation)
# `-----------------------------
```
Looking at the SPIR-V we can see why
```spirv
%5 = OpTypeFloat 32
%6 = OpTypeInt 32 0
%15 = OpTypeVector %6 4
%389 = OpExtInstImport "GLSL.std.450" %388 = OpExtInst %15 %389 Cosh %384
%390 = OpExtInst %15 %389 Cosh %385
%391 = OpExtInst %15 %389 Cosh %386
%392 = OpExtInst %15 %389 Cosh %387
```
%15 should have been a float vector. It looks like long vectors is exposing a bug in the postLegalizer where we are picking the wrong base element type for our vectors
https://hlsl.godbolt.org/z/KMnxfv8z6
Contributor guide
Assessment
This issue has not been assessed yet.