<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">