diff --git a/llvm/lib/SYCLLowerIR/LowerESIMD.cpp b/llvm/lib/SYCLLowerIR/LowerESIMD.cpp index 2617b80bf52f0..1055192f86b4f 100644 --- a/llvm/lib/SYCLLowerIR/LowerESIMD.cpp +++ b/llvm/lib/SYCLLowerIR/LowerESIMD.cpp @@ -726,7 +726,8 @@ static void translateUnPackMask(CallInst &CI) { llvm::Value *TransCI = Builder.CreateZExt( Arg0, llvm::FixedVectorType::get(llvm::Type::getInt16Ty(Context), N)); TransCI->takeName(&CI); - cast(TransCI)->setDebugLoc(CI.getDebugLoc()); + if (llvm::Instruction *TransCInst = dyn_cast(TransCI)) + TransCInst->setDebugLoc(CI.getDebugLoc()); CI.replaceAllUsesWith(TransCI); } diff --git a/llvm/test/SYCLLowerIR/esimd_lower_crash_zext.ll b/llvm/test/SYCLLowerIR/esimd_lower_crash_zext.ll new file mode 100644 index 0000000000000..70cbbdfe46512 --- /dev/null +++ b/llvm/test/SYCLLowerIR/esimd_lower_crash_zext.ll @@ -0,0 +1,15 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -LowerESIMD -S < %s | FileCheck %s + +; This test checks that there is no crash while lowering +; __esimd_unpack_mask when its argument is an integer constant. + +define spir_func <32 x i16> @_Z3foov() { +; CHECK-LABEL: @_Z3foov( +; CHECK-NEXT: ret <32 x i16> zext (<32 x i1> bitcast (<1 x i32> to <32 x i1>) to <32 x i16>) +; + %call.i.i = call spir_func <32 x i16> @_Z19__esimd_unpack_maskILi32EEN2cl4sycl5INTEL3gpu11vector_typeItXT_EE4typeEj(i32 1717986918) + ret <32 x i16> %call.i.i +} + +declare dso_local spir_func <32 x i16> @_Z19__esimd_unpack_maskILi32EEN2cl4sycl5INTEL3gpu11vector_typeItXT_EE4typeEj(i32)