<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/121562>121562</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Wrong immediate generated by SPIR-V backend
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jdnk
</td>
</tr>
</table>
<pre>
The SPIR-V backend generates `-1` instead of `0xFFFFFFFF` in `OpVectorShuffle` instruction.
Original C source:
```c
#include <stdint.h>
typedef union {
uint32_t bits;
float value;
} fp32bits;
float fp16mul(float *restrict s, uint16_t a, uint16_t b) {
const fp32bits af = {.bits = (a << 16)};
const fp32bits bf = {.bits = (b << 16)};
return af.value * bf.value;
}
```
`clang -S -emit-llvm -O3 repr_minus_one.c -o repr_minus_one.ll` generates:
```llvm
; ModuleID = 'repr_minus_one.c'
source_filename = "repr_minus_one.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) uwtable
define dso_local float @fp16mul(ptr noalias nocapture noundef readnone %s, i16 noundef zeroext %a, i16 noundef zeroext %b) local_unnamed_addr #0 {
entry:
%0 = insertelement <2 x i16> poison, i16 %a, i64 0
%1 = insertelement <2 x i16> %0, i16 %b, i64 1
%2 = zext <2 x i16> %1 to <2 x i32>
%3 = shl nuw <2 x i32> %2, <i32 16, i32 16>
%4 = bitcast <2 x i32> %3 to <2 x float>
%shift = shufflevector <2 x float> %4, <2 x float> poison, <2 x i32> <i32 1, i32 poison>
%5 = fmul <2 x float> %shift, %4
%mul = extractelement <2 x float> %5, i64 0
ret float %mul
}
attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.6 (https://github.com/llvm/llvm-project.git e21dc4bd5474d04b8e62d7331362edcc5648d7e5)"}
```
`llc -mtriple=spirv64 repr_minus_one.ll -o repr_minus_one.spt` generates:
```spirv
OpCapability Kernel
OpCapability Addresses
OpCapability Int8
OpCapability Int16
OpCapability Linkage
OpCapability Int64
%1 = OpExtInstImport "OpenCL.std"
OpMemoryModel Physical64 OpenCL
OpSource OpenCL_CPP 100000
OpName %16 "s"
OpName %17 "a"
OpName %18 "b"
OpName %19 "fp16mul"
OpName %25 "shift"
OpName %27 "mul"
OpDecorate %16 FuncParamAttr NoAlias
OpDecorate %17 FuncParamAttr Zext
OpDecorate %18 FuncParamAttr Zext
OpDecorate %19 LinkageAttributes "fp16mul" Export
%2 = OpTypeInt 8 0
%3 = OpTypeInt 16 0
%4 = OpTypeFloat 32
%5 = OpTypePointer Function %2
%6 = OpTypeFunction %4 %5 %3 %3
%7 = OpTypeVector %4 2
%8 = OpTypeInt 32 0
%9 = OpTypeVector %8 2
%10 = OpTypeVector %3 2
%11 = OpTypeInt 64 0
%12 = OpUndef %10
%13 = OpConstant %8 16
%14 = OpConstantComposite %9 %13 %13
%15 = OpUndef %7
%19 = OpFunction %4 Pure %6 ; -- Begin function fp16mul
%16 = OpFunctionParameter %5
%17 = OpFunctionParameter %3
%18 = OpFunctionParameter %3
%28 = OpLabel
%20 = OpCompositeInsert %10 %17 %12 0
%21 = OpCompositeInsert %10 %18 %20 1
%22 = OpUConvert %9 %21
%23 = OpShiftLeftLogical %9 %22 %14
%24 = OpBitcast %7 %23
%25 = OpVectorShuffle %7 %24 %15 1 -1 ;;; <-- here
%26 = OpFMul %7 %25 %24
%27 = OpCompositeExtract %4 %26 0
OpReturnValue %27
OpFunctionEnd
; -- End function
```
Towards the end, you can see `%25 = OpVectorShuffle %7 %24 %15 1 -1`, but [the specification](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html) states that the Components literal of the OpVectorShuffle instruction must be an unsigned integer. I believe the constant 0xFFFFFFFF is supposed to be there instead of the -1.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysWN1u4zoOfhr1RnBgyT9xLnKRJi1QbOe0OJ2dBfYmkG060aksGZLcJvP0C8k_cdx2BgOsUTSy-fEjJVIUbWYMP0iANUpuUbK7Ya09Kr3-p5SvN7kqz-vvR8Avzw9_Bz9wzopXkCU-gATNLBiM0jAgKA0xl8YCK7Gq3LPwdN9fncw9e2p-QGGVfjm2VSVgUNJtYbmSCxRuULh50vzAJRN4i41qdQEo2nQSlIbdX-FuaMRlIdoSMIq2xpZc2sURRXcd1p4bKKHCreRKYrS8ReEG45ZLG9G9xTm3BkX-YSUUs_iNiRa6J2i5w1UT0QsGhZsOVTUkrVuBaNbdI7rRYKzmhcUG0a03QNK9xezqLkd0NTpRKGnsaAGzCqNo56QLf-9vaMbctFC0xSRFdIWWu97duXr-uXr-ubpn0GBbLTGrFn7WbhY472_GJZiu97j8hWDygIMXHEDNbSDEW42DpwhraPS-5rI1eyVhUeBAzZ8J4cI9ps3HoDoydx_d4m-qbAU87PrJLOf0iC5RuOmyY19xAZLV0IPpRzB1-cD0ASwumWWCnVVrBzgENYo2EDR0GaJoE1H_z92S61s3SmP_L-DjgNAMRRtCs6DKwn4k_aN0UE_j4MXBpn5YzRsxunzK0n0aB618lepdBoLL9hQcZNup9Ity30q_TfDGWu3WD9etsY1WBw3GYKkqDYCl0lC02riROcsCS9XKdy5L_M6F6CNfQ630GdFMKgkuNdt3y3IBKNyUUHEJuDRqL1TBRL89UBxecr-xGkvFBGfObMEa22rwhtyO08BKx4sRTfye4CQdhT9BKzi5jZOwX8j8fvH29610wS33rCw1RjQK-30E0upzl0VOI_RryaUBbUFADdJFeEvxydlA0R1uFDdKDkZHB9IYh35XIJqQ35I4SxOKfKAgAwX1FD_9POaaBFs1PnWpcTdoRV7LHAWW7fs1xJM6Myja8oj6_bzF_ejCEHuGnNuCGfuRIZqY9hGdqJojr2zvgK_Lb75Iz-HeSu_I1fPLws7M9g4P_va4i-HEG63qVnxmy7vlWZ3dXqXD7jCcrGbFPEhT9eQ6uhrskMqe5VLkwg2zVvO89YeZT7Cunv7_95fb6zWXgYADE0G3zME7L-3R7fRohygNEaUOJlVgNWsaLg9BzSYAq1voMcay4jVotLIdU95WFejA8J8wwrMe29WdoGjaUXTK0iCNr-UVMLeZzQhC9Lao1RuiWzc6Zd2gOhndjer61A2MgXFAu9EpWw7srYQr2_4c4IUXD2FAlLgzYFH76r-oBDsMxxlxe56SsEsHQvpf2v9GPUdPwMsuJyaa8dRKOJGNGepuKX0vjkzvhxXsEzce6clMM7toPj9s8SO8gZgo0lGRzhSXU8W7XyhGXysORfsztfh6-ojS7uh-A23cGUJWC7JwJSw7Wtv405jeI3p_4PbY5otC1Yje-xO5-3FZ9g8UdnHgFgMlZRHnZRIv4zKM8wxSWi6jiEQphbIokjTOyiUkrvGg9KteQogCB3V3EKJoZxqu39L4Y9vwSS9hGvubZsKzuY3_1GxZw3IuuD3jf4GWIHw96K4r6aYs3U4H8xXgQdrsFzKSfiV85PKVHeCDPw_SpvFEaTyCnpq7k32Qxj7UjdKuZtGnBuT2cWFs2XUF-Kn55svMN1WCwM_Hs-EFE2mMO-SVLy--Veol--3zMyahuzqev3z3RBN_plHT84_Ko3jpxOxLcebE-ejd-Hzlno_dw-fKNPGmu5L_BcSb_4RjB4VyadBPwfVJz0yz2vVJ-C-1cX3K1wrLmcJ_4WS_RmdfoGew1RDyzfRomSwCvju5wF7Hnvax_35u4EFanPVn1wiIZgCSzhHxBHHvj7uIXiOSCeJZcWlBX1pL32tcwdMp4QQW91zeKZpEfRu2nMB_9G2EA89Ys9lEIjqfyOpTomxO1NfyOS76gCMzi2NjcIEMy_9v34168hliWP-tewVj0nYuXe17B4tnsK2qG2V4lxurgcn9nykmcw-WM8CwKteReHbtt4_V9HLvDEGAb-HAJa4GhSEFr3nTGa9PcHCp4Tupa_DyV-D5lLI_ANMB_MhymLlIw3FR-8V88G36kAR9eXJRnEWNkt9qZr0FMtMcM2Kr5Fuvsuo4Z8ghM15cBXuEyj6qgyvHFw3apcZMb0iV26Fx91vIEc6AQ2pcfUC5wOM-fwgOiA999-ca4yDAR9Aw4xsj_q0VF5qkI5thl_MFvOu677EO0Os69NT87fvgH_3XhcS_rk-S4E6WE_jvrj6R72Q5pvHHhuK7eme6NNgeAYMsXUd0Vi0umMQGADvcn62i19jivLUYJbeO1jRQ8IoXzHuQ7D40TxoO3Fh9XrwetZLKLJQ-IHrffTlD9N4RGETvW8krDiXpZT8WR1sL95pgrP-iZo_M-on4BZcgrcGCW9BMYFV5yXwKk89o_rUF54CZxK30X_ZK7Or8AfQCP-AcBIc38DTFUMguX-swN9i0TaMMlO6lMfdIDdPPe041IIubch2Vq2jFbmBNllGyCiOSJDfHNSmjJCmSmMQJQMlISLMki9OQFGlI6Sq84Wsa0iQkYUQIWZFkActlSlYrmqRVWtA4QXEINeNi4Rt6pQ833JgW1oSSJKU3whUI479XUirhHXupawyS3Y1e-441bw8GxaHgxpoLjeVWwPo_WskD5nUNJXdn9tBJljg_z7503rRarP-sSUb03vvjYt07_Lam_wsAAP__YO8H3A">