diff --git a/llvm/lib/SYCLLowerIR/LowerESIMD.cpp b/llvm/lib/SYCLLowerIR/LowerESIMD.cpp index c8b34111ac589..e571700fd07ea 100644 --- a/llvm/lib/SYCLLowerIR/LowerESIMD.cpp +++ b/llvm/lib/SYCLLowerIR/LowerESIMD.cpp @@ -1239,10 +1239,11 @@ PreservedAnalyses SYCLLowerESIMDPass::run(Function &F, if (auto CastOp = dyn_cast(&I)) { llvm::Type *DstTy = CastOp->getDestTy(); auto CastOpcode = CastOp->getOpcode(); - if ((CastOpcode == llvm::Instruction::FPToUI && - DstTy->getScalarType()->getPrimitiveSizeInBits() <= 32) || - (CastOpcode == llvm::Instruction::FPToSI && - DstTy->getScalarType()->getPrimitiveSizeInBits() < 32)) { + if (isa(DstTy) && + ((CastOpcode == llvm::Instruction::FPToUI && + DstTy->getScalarType()->getPrimitiveSizeInBits() <= 32) || + (CastOpcode == llvm::Instruction::FPToSI && + DstTy->getScalarType()->getPrimitiveSizeInBits() < 32))) { IRBuilder<> Builder(&I); llvm::Value *Src = CastOp->getOperand(0); auto TmpTy = llvm::FixedVectorType::get( diff --git a/llvm/test/SYCLLowerIR/scalar_fptoui.ll b/llvm/test/SYCLLowerIR/scalar_fptoui.ll new file mode 100644 index 0000000000000..a17270c711206 --- /dev/null +++ b/llvm/test/SYCLLowerIR/scalar_fptoui.ll @@ -0,0 +1,17 @@ +; This is a regression test for LowerESIMD crashing on a scalar fptoui +; instruction. +; +; RUN: opt < %s -LowerESIMD -S | FileCheck %s + +target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64" +target triple = "spir64-unknown-unknown-sycldevice" + +; Function Attrs: convergent norecurse +define dso_local spir_func i32 @foo(float %x) !sycl_explicit_simd !1 { + %y = fptoui float %x to i32 +; check that the scalar float to unsigned int conversion is left intact +; CHECK: %y = fptoui float %x to i32 + ret i32 %y +} + +!1 = !{i32 0, i32 0}