Skip to content

Commit 1a1bf17

Browse files
authored
Generate load and store for OpCopyLogical (#2825)
fixes #2768 Generate an LLVM memcpy for OpCopyLogical, rather than a call to an OpCopyLogical function.
1 parent 69f65ef commit 1a1bf17

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2178,7 +2178,22 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
21782178
}
21792179
case OpCopyLogical: {
21802180
SPIRVCopyLogical *CL = static_cast<SPIRVCopyLogical *>(BV);
2181-
return mapValue(BV, transSPIRVBuiltinFromInst(CL, BB));
2181+
2182+
auto *SrcTy = transType(CL->getOperand()->getType());
2183+
auto *DstTy = transType(CL->getType());
2184+
2185+
assert(M->getDataLayout().getTypeStoreSize(SrcTy).getFixedValue() ==
2186+
M->getDataLayout().getTypeStoreSize(DstTy).getFixedValue() &&
2187+
"Size mismatch in OpCopyLogical");
2188+
2189+
IRBuilder<> Builder(BB);
2190+
2191+
auto *SrcAI = Builder.CreateAlloca(SrcTy);
2192+
Builder.CreateAlignedStore(transValue(CL->getOperand(), F, BB), SrcAI,
2193+
SrcAI->getAlign());
2194+
2195+
auto *LI = Builder.CreateAlignedLoad(DstTy, SrcAI, SrcAI->getAlign());
2196+
return mapValue(BV, LI);
21822197
}
21832198

21842199
case OpAccessChain:

test/OpCopyLogical.spvasm

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@
2222
OpReturn
2323
OpFunctionEnd
2424

25-
; CHECK-LLVM: @_Z19__spirv_CopyLogical12structtype.0(ptr sret(%structtype) %[[#]], %structtype.0 zeroinitializer)
25+
; CHECK-LLVM: [[ALLOCA:%[a-z0-9.]+]] = alloca [[SRC_TYPE:%[a-z0-9.]+]], align 8
26+
; CHECK-LLVM: store [[SRC_TYPE]] zeroinitializer, ptr [[ALLOCA]], align 8
27+
; CHECK-LLVM: [[DST:%[a-z0-9.]+]] = load [[DST_TYPE:%[a-z0-9.]+]], ptr [[ALLOCA]], align 8

0 commit comments

Comments
 (0)