Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions lib/SPIRV/SPIRVReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1085,6 +1085,37 @@ Value *SPIRVToLLVM::transConvertInst(SPIRVValue *BV, Function *F,
case OpFConvert:
CO = IsExt ? Instruction::FPExt : Instruction::FPTrunc;
break;
case OpBitcast:
CO = Instruction::BitCast;
Comment thread
bashbaug marked this conversation as resolved.
if (Src->getType()->isPointerTy() && !Dst->isPointerTy()) {
if (auto *DstVecTy = dyn_cast<FixedVectorType>(Dst)) {
unsigned TotalBitWidth =
DstVecTy->getElementType()->getIntegerBitWidth() *
DstVecTy->getNumElements();
auto *IntTy = Type::getIntNTy(BB->getContext(), TotalBitWidth);
if (BB) {
Src = CastInst::CreatePointerCast(Src, IntTy, "", BB);
} else {
Src = ConstantExpr::getPointerCast(dyn_cast<Constant>(Src), IntTy);
}
} else {
CO = Instruction::PtrToInt;
}
} else if (!Src->getType()->isPointerTy() && Dst->isPointerTy()) {
if (auto *SrcVecTy = dyn_cast<FixedVectorType>(Src->getType())) {
unsigned TotalBitWidth =
SrcVecTy->getElementType()->getIntegerBitWidth() *
SrcVecTy->getNumElements();
auto *IntTy = Type::getIntNTy(BB->getContext(), TotalBitWidth);
if (BB) {
Src = CastInst::Create(Instruction::BitCast, Src, IntTy, "", BB);
} else {
Src = ConstantExpr::getBitCast(dyn_cast<Constant>(Src), IntTy);
}
}
CO = Instruction::IntToPtr;
}
break;
default:
CO = static_cast<CastInst::CastOps>(OpCodeMap::rmap(BC->getOpCode()));
}
Expand Down
31 changes: 31 additions & 0 deletions test/OpBitcast_ptr_scalar.spvasm
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
; Check support of OpBitcast with pointer operands
; Converts to scalar integers, which is supported by all SPIR-V versions

; REQUIRES: spirv-as
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
; RUN: spirv-val %t.spv
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
; RUN: llvm-dis %t.rev.bc
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
OpCapability Addresses
OpCapability Kernel
OpCapability Int64
OpMemoryModel Physical64 OpenCL
OpEntryPoint Kernel %kernel "test"
%uint = OpTypeInt 32 0
%ulong = OpTypeInt 64 0
%void = OpTypeVoid
%pptr_int = OpTypePointer Function %uint
%kernel_sig = OpTypeFunction %void
%kernel = OpFunction %void None %kernel_sig
%entry = OpLabel
%srcptr = OpVariable %pptr_int Function
%dstint = OpBitcast %ulong %srcptr
%dstptr = OpBitcast %pptr_int %dstint
OpReturn
OpFunctionEnd


; CHECK-LLVM: [[SRCPTR:%[a-z0-9.]+]] = alloca i32, align 4
; CHECK-LLVM: [[DSTINT:%[a-z0-9.]+]] = ptrtoint ptr [[SRCPTR]] to i64
; CHECK-LLVM: [[DSTPTR:%[a-z0-9.]+]] = inttoptr i64 [[DSTINT]] to ptr
34 changes: 34 additions & 0 deletions test/OpBitcast_ptr_vector.spvasm
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
; Check support of OpBitcast with pointer operands
; Converts to vectors of integers, which is supported by SPIR-V 1.5

; REQUIRES: spirv-as
; RUN: spirv-as --target-env spv1.5 -o %t.spv %s
; RUN: spirv-val %t.spv
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
; RUN: llvm-dis %t.rev.bc
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
OpCapability Addresses
OpCapability Kernel
OpCapability Int64
OpMemoryModel Physical64 OpenCL
OpEntryPoint Kernel %kernel "test"
%uint = OpTypeInt 32 0
%ulong = OpTypeInt 64 0
Comment thread
svenvh marked this conversation as resolved.
Outdated
%uint2 = OpTypeVector %uint 2
%void = OpTypeVoid
%pptr_int = OpTypePointer Function %uint
%kernel_sig = OpTypeFunction %void
%kernel = OpFunction %void None %kernel_sig
%entry = OpLabel
%srcptr = OpVariable %pptr_int Function
%dstint2 = OpBitcast %uint2 %srcptr
%dstptr = OpBitcast %pptr_int %dstint2
OpReturn
OpFunctionEnd


; CHECK-LLVM: [[SRCPTR:%[a-z0-9.]+]] = alloca i32, align 4
; CHECK-LLVM: [[TMPLONG0:%[a-z0-9.]+]] = ptrtoint ptr [[SRCPTR]] to i64
; CHECK-LLVM: [[DSTINT2:%[a-z0-9.]+]] = bitcast i64 [[TMPLONG0]] to <2 x i32>
; CHECK-LLVM: [[TMPLONG1:%[a-z0-9.]+]] = bitcast <2 x i32> [[DSTINT2]] to i64
; CHECK-LLVM: [[DSTPTR:%[a-z0-9.]+]] = inttoptr i64 [[TMPLONG1]] to ptr