Skip to content

Commit 7f0c81a

Browse files
vmaksimopvelesko
authored andcommitted
[Backport to 18][SPIR-V 1.4] Allow OpCopyMemorySized to have Memory Operands for both Source and Target (KhronosGroup#2473)
This change addresses p.4 of KhronosGroup#2460. No changes for OpCopyMemory as we currently don't use it in translation.
1 parent 1289c92 commit 7f0c81a

File tree

2 files changed

+12
-25
lines changed

2 files changed

+12
-25
lines changed

lib/SPIRV/SPIRVReader.cpp

+9-22
Original file line numberDiff line numberDiff line change
@@ -1889,33 +1889,20 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
18891889
MaybeAlign Align(BC->getAlignment());
18901890
MaybeAlign SrcAlign =
18911891
BC->getSrcAlignment() ? MaybeAlign(BC->getSrcAlignment()) : Align;
1892-
Type *EltTy =
1893-
transType(BC->getSource()->getType()->getPointerElementType());
1894-
uint64_t Size = M->getDataLayout().getTypeStoreSize(EltTy).getFixedValue();
1892+
llvm::Value *Size = transValue(BC->getSize(), F, BB);
18951893
bool IsVolatile = BC->SPIRVMemoryAccess::isVolatile();
18961894
IRBuilder<> Builder(BB);
18971895

1898-
llvm::Value *Src = transValue(BC->getSource(), F, BB);
1899-
CallInst *CI =
1900-
Builder.CreateMemCpy(Dst, Align, Src, SrcAlign, Size, IsVolatile);
1901-
if (isFuncNoUnwind())
1902-
CI->getFunction()->addFnAttr(Attribute::NoUnwind);
1903-
return mapValue(BV, CI);
1904-
}
1896+
// A ptr.annotation may have been generated for the destination variable.
1897+
replaceOperandWithAnnotationIntrinsicCallResult(F, Dst);
19051898

1906-
case OpCopyMemorySized: {
1907-
SPIRVCopyMemorySized *BC = static_cast<SPIRVCopyMemorySized *>(BV);
1908-
llvm::Value *Dst = transValue(BC->getTarget(), F, BB);
1909-
MaybeAlign Align(BC->getAlignment());
1910-
MaybeAlign SrcAlign =
1911-
BC->getSrcAlignment() ? MaybeAlign(BC->getSrcAlignment()) : Align;
1912-
llvm::Value *Size = transValue(BC->getSize(), F, BB);
1913-
bool IsVolatile = BC->SPIRVMemoryAccess::isVolatile();
1914-
IRBuilder<> Builder(BB);
1899+
if (!CI) {
1900+
llvm::Value *Src = transValue(BC->getSource(), F, BB);
19151901

1916-
llvm::Value *Src = transValue(BC->getSource(), F, BB);
1917-
CallInst *CI =
1918-
Builder.CreateMemCpy(Dst, Align, Src, SrcAlign, Size, IsVolatile);
1902+
// A ptr.annotation may have been generated for the source variable.
1903+
replaceOperandWithAnnotationIntrinsicCallResult(F, Src);
1904+
CI = Builder.CreateMemCpy(Dst, Align, Src, SrcAlign, Size, IsVolatile);
1905+
}
19191906
if (isFuncNoUnwind())
19201907
CI->getFunction()->addFnAttr(Attribute::NoUnwind);
19211908
return mapValue(BV, CI);

lib/SPIRV/libSPIRV/SPIRVInstruction.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -2189,10 +2189,10 @@ class SPIRVCopyMemorySized : public SPIRVInstruction, public SPIRVMemoryAccess {
21892189
updateModuleVersion();
21902190
}
21912191

2192-
VersionNumber getRequiredSPIRVVersion() const override {
2192+
SPIRVWord getRequiredSPIRVVersion() const override {
21932193
if (getSrcAlignment())
2194-
return VersionNumber::SPIRV_1_4;
2195-
return VersionNumber::SPIRV_1_0;
2194+
return static_cast<SPIRVWord>(VersionNumber::SPIRV_1_4);
2195+
return static_cast<SPIRVWord>(VersionNumber::SPIRV_1_0);
21962196
}
21972197

21982198
SPIRVValue *getSource() { return getValue(Source); }

0 commit comments

Comments
 (0)