Skip to content

Commit 4f637b0

Browse files
committed
Revert "Implement SPV_INTEL_memory_access_aliasing extension" until CPU RT upd
This reverts commit 300ac16.
1 parent 399e311 commit 4f637b0

20 files changed

+11
-834
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,3 @@ EXT(SPV_INTEL_fpga_cluster_attributes)
3535
EXT(SPV_INTEL_loop_fuse)
3636
EXT(SPV_INTEL_long_constant_composite)
3737
EXT(SPV_INTEL_optnone)
38-
EXT(SPV_INTEL_memory_access_aliasing)

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 0 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
#include "SPIRVInstruction.h"
4646
#include "SPIRVInternal.h"
4747
#include "SPIRVMDBuilder.h"
48-
#include "SPIRVMemAliasingINTEL.h"
4948
#include "SPIRVModule.h"
5049
#include "SPIRVToLLVMDbgTran.h"
5150
#include "SPIRVType.h"
@@ -65,7 +64,6 @@
6564
#include "llvm/IR/Instructions.h"
6665
#include "llvm/IR/IntrinsicInst.h"
6766
#include "llvm/IR/LegacyPassManager.h"
68-
#include "llvm/IR/MDBuilder.h"
6967
#include "llvm/IR/Metadata.h"
7068
#include "llvm/IR/Module.h"
7169
#include "llvm/IR/Type.h"
@@ -1460,58 +1458,6 @@ static void replaceOperandWithAnnotationIntrinsicCallResult(Value *&V) {
14601458
}
14611459
}
14621460

1463-
// Translate aliasing memory access masks for SPIRVLoad and SPIRVStore
1464-
// instructions. These masks are mapped on alias.scope and noalias
1465-
// metadata in LLVM. Translation of optional string operand isn't yet supported
1466-
// in the translator.
1467-
template <typename SPIRVInstType>
1468-
void SPIRVToLLVM::transAliasingMemAccess(SPIRVInstType *BI, Instruction *I) {
1469-
static_assert(std::is_same<SPIRVInstType, SPIRVStore>::value ||
1470-
std::is_same<SPIRVInstType, SPIRVLoad>::value,
1471-
"Only stores and loads can be aliased by memory access mask");
1472-
bool IsAliasScope = BI->SPIRVMemoryAccess::isAliasScope();
1473-
bool IsNoAlias = BI->SPIRVMemoryAccess::isNoAlias();
1474-
if (!(IsAliasScope || IsNoAlias))
1475-
return;
1476-
uint32_t AliasMDKind = IsAliasScope ? LLVMContext::MD_alias_scope
1477-
: LLVMContext::MD_noalias;
1478-
SPIRVId AliasListId = BI->SPIRVMemoryAccess::getAliasing();
1479-
addMemAliasMetadata(I, AliasListId, AliasMDKind);
1480-
}
1481-
1482-
// Create and apply alias.scope/noalias metadata
1483-
void SPIRVToLLVM::addMemAliasMetadata(Instruction *I, SPIRVId AliasListId,
1484-
uint32_t AliasMDKind) {
1485-
SPIRVAliasScopeListDeclINTEL *AliasList =
1486-
BM->get<SPIRVAliasScopeListDeclINTEL>(AliasListId);
1487-
std::vector<SPIRVId> AliasScopeIds = AliasList->getArguments();
1488-
MDBuilder MDB(*Context);
1489-
SmallVector<Metadata *, 4> MDScopes;
1490-
for (const auto ScopeId : AliasScopeIds) {
1491-
SPIRVAliasScopeDeclINTEL *AliasScope =
1492-
BM->get<SPIRVAliasScopeDeclINTEL>(ScopeId);
1493-
std::vector<SPIRVId> AliasDomainIds = AliasScope->getArguments();
1494-
// Currently we expect exactly one argument for aliasing scope
1495-
// instruction.
1496-
// TODO: add translation of string scope and domain operand.
1497-
assert(AliasDomainIds.size() == 1 &&
1498-
"AliasScopeDeclINTEL must have exactly one argument");
1499-
SPIRVId AliasDomainId = AliasDomainIds[0];
1500-
// Create and store unique domain and scope metadata
1501-
MDAliasDomainMap.emplace(AliasDomainId,
1502-
MDB.createAnonymousAliasScopeDomain());
1503-
MDAliasScopeMap.emplace(ScopeId, MDB.createAnonymousAliasScope(
1504-
MDAliasDomainMap[AliasDomainId]));
1505-
MDScopes.emplace_back(MDAliasScopeMap[ScopeId]);
1506-
}
1507-
// Create and store unique alias.scope/noalias metadata
1508-
MDAliasListMap.emplace(
1509-
AliasListId,
1510-
MDNode::concatenate(I->getMetadata(LLVMContext::MD_alias_scope),
1511-
MDNode::get(*Context, MDScopes)));
1512-
I->setMetadata(AliasMDKind, MDAliasListMap[AliasListId]);
1513-
}
1514-
15151461
/// For instructions, this function assumes they are created in order
15161462
/// and appended to the given basic block. An instruction may use a
15171463
/// instruction from another BB which has not been translated. Such
@@ -1909,7 +1855,6 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
19091855
SI = new StoreInst(Src, Dst, isVolatile, Align(AlignValue), BB);
19101856
if (BS->SPIRVMemoryAccess::isNonTemporal())
19111857
transNonTemporalMetadata(SI);
1912-
transAliasingMemAccess<SPIRVStore>(BS, SI);
19131858
return mapValue(BV, SI);
19141859
}
19151860

@@ -1932,7 +1877,6 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
19321877
}
19331878
if (BL->SPIRVMemoryAccess::isNonTemporal())
19341879
transNonTemporalMetadata(LI);
1935-
transAliasingMemAccess<SPIRVLoad>(BL, LI);
19361880
return mapValue(BV, LI);
19371881
}
19381882

@@ -3754,32 +3698,6 @@ void SPIRVToLLVM::transIntelFPGADecorations(SPIRVValue *BV, Value *V) {
37543698
}
37553699
}
37563700

3757-
// Translate aliasing decorations applied to instructions. These decorations
3758-
// are mapped on alias.scope and noalias metadata in LLVM. Translation of
3759-
// optional string operand isn't yet supported in the translator.
3760-
void SPIRVToLLVM::transMemAliasingINTELDecorations(SPIRVValue *BV, Value *V) {
3761-
if (!BV->isInst())
3762-
return;
3763-
Instruction *Inst = dyn_cast<Instruction>(V);
3764-
if (!Inst)
3765-
return;
3766-
std::vector<SPIRVId> AliasListIds;
3767-
uint32_t AliasMDKind;
3768-
if (BV->hasDecorateId(internal::DecorationAliasScopeINTEL)) {
3769-
AliasMDKind = LLVMContext::MD_alias_scope;
3770-
AliasListIds =
3771-
BV->getDecorationIdLiterals(internal::DecorationAliasScopeINTEL);
3772-
} else if (BV->hasDecorateId(internal::DecorationNoAliasINTEL)) {
3773-
AliasMDKind = LLVMContext::MD_noalias;
3774-
AliasListIds =
3775-
BV->getDecorationIdLiterals(internal::DecorationNoAliasINTEL);
3776-
} else
3777-
return;
3778-
assert(AliasListIds.size() == 1 &&
3779-
"Memory aliasing decorations must have one argument");
3780-
addMemAliasMetadata(Inst, AliasListIds[0], AliasMDKind);
3781-
}
3782-
37833701
// Having UserSemantic decoration on Function is against the spec, but we allow
37843702
// this for various purposes (like prototyping new features when we need to
37853703
// attach some information on function and propagate that through SPIR-V and
@@ -3831,7 +3749,6 @@ bool SPIRVToLLVM::transDecoration(SPIRVValue *BV, Value *V) {
38313749
return false;
38323750

38333751
transIntelFPGADecorations(BV, V);
3834-
transMemAliasingINTELDecorations(BV, V);
38353752

38363753
DbgTran->transDbgInfo(BV, V);
38373754
return true;

llvm-spirv/lib/SPIRV/SPIRVReader.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ class SPIRVToLLVM {
115115
CallInst *transArbFloatInst(SPIRVInstruction *BI, BasicBlock *BB,
116116
bool IsBinaryInst = false);
117117
bool transNonTemporalMetadata(Instruction *I);
118-
template <typename SPIRVInstType>
119-
void transAliasingMemAccess(SPIRVInstType *BI, Instruction *I);
120-
void addMemAliasMetadata(Instruction *I, SPIRVId AliasListId,
121-
uint32_t AliasMDKind);
122118
void transSourceLanguage();
123119
bool transSourceExtension();
124120
void transGeneratorMD();
@@ -177,7 +173,6 @@ class SPIRVToLLVM {
177173
typedef DenseMap<SPIRVValue *, Value *> SPIRVBlockToLLVMStructMap;
178174
typedef DenseMap<SPIRVFunction *, Function *> SPIRVToLLVMFunctionMap;
179175
typedef DenseMap<GlobalVariable *, SPIRVBuiltinVariableKind> BuiltinVarMap;
180-
typedef std::unordered_map<SPIRVId, MDNode *> SPIRVToLLVMMDAliasInstMap;
181176

182177
// A SPIRV value may be translated to a load instruction of a placeholder
183178
// global variable. This map records load instruction of these placeholders
@@ -205,12 +200,6 @@ class SPIRVToLLVM {
205200
// metadata SPIR-V instruction in SPIR-V representation of this basic block.
206201
SPIRVToLLVMLoopMetadataMap FuncLoopMetadataMap;
207202

208-
// These storages are used to prevent duplication of alias.scope/noalias
209-
// metadata
210-
SPIRVToLLVMMDAliasInstMap MDAliasDomainMap;
211-
SPIRVToLLVMMDAliasInstMap MDAliasScopeMap;
212-
SPIRVToLLVMMDAliasInstMap MDAliasListMap;
213-
214203
Type *mapType(SPIRVType *BT, Type *T);
215204

216205
// If a value is mapped twice, the existing mapped value is a placeholder,
@@ -283,7 +272,6 @@ class SPIRVToLLVM {
283272
void createCXXStructor(const char *ListName,
284273
SmallVectorImpl<Function *> &Funcs);
285274
void transIntelFPGADecorations(SPIRVValue *BV, Value *V);
286-
void transMemAliasingINTELDecorations(SPIRVValue *BV, Value *V);
287275
}; // class SPIRVToLLVM
288276

289277
} // namespace SPIRV

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 1 addition & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
#include "SPIRVInternal.h"
5151
#include "SPIRVLLVMUtil.h"
5252
#include "SPIRVMDWalker.h"
53-
#include "SPIRVMemAliasingINTEL.h"
5453
#include "SPIRVModule.h"
5554
#include "SPIRVType.h"
5655
#include "SPIRVUtil.h"
@@ -1229,46 +1228,6 @@ SPIRVValue *LLVMToSPIRV::transAtomicLoad(LoadInst *LD, SPIRVBasicBlock *BB) {
12291228
BB, transType(LD->getType())));
12301229
}
12311230

1232-
// Aliasing list MD contains several scope MD nodes whithin it. Each scope MD
1233-
// has a selfreference and an extra MD node for aliasing domain and also it
1234-
// can contain an optional string operand. Domain MD contains a self-reference
1235-
// with an optional string operand. Here we unfold the list, creating SPIR-V
1236-
// aliasing instructions.
1237-
// TODO: add support for an optional string operand.
1238-
SPIRVEntry *addMemAliasingINTELInstructions(SPIRVModule *M,
1239-
MDNode *AliasingListMD) {
1240-
assert(AliasingListMD->getNumOperands() > 0 &&
1241-
"Aliasing list MD must have at least one operand");
1242-
std::vector<SPIRVId> ListId;
1243-
for (const MDOperand &MDListOp : AliasingListMD->operands()) {
1244-
if (MDNode *ScopeMD = dyn_cast<MDNode>(MDListOp)) {
1245-
assert(ScopeMD->getNumOperands() > 1 &&
1246-
"Aliasing scope MD must have at least two operands");
1247-
MDNode *DomainMD = cast<MDNode>(ScopeMD->getOperand(1));
1248-
auto *Domain =
1249-
M->getOrAddAliasDomainDeclINTELInst(std::vector<SPIRVId>(), DomainMD);
1250-
auto *Scope =
1251-
M->getOrAddAliasScopeDeclINTELInst({Domain->getId()}, ScopeMD);
1252-
ListId.push_back(Scope->getId());
1253-
}
1254-
}
1255-
return M->getOrAddAliasScopeListDeclINTELInst(ListId, AliasingListMD);
1256-
}
1257-
1258-
1259-
// Translate alias.scope/noalias metadata attached to store and load
1260-
// instructions.
1261-
void transAliasingMemAccess(SPIRVModule *BM, MDNode *AliasingListMD,
1262-
std::vector<uint32_t> &MemoryAccess,
1263-
SPIRVWord MemAccessMask) {
1264-
if (!BM->isAllowedToUseExtension(
1265-
ExtensionID::SPV_INTEL_memory_access_aliasing))
1266-
return;
1267-
MemoryAccess[0] |= MemAccessMask;
1268-
auto *MemAliasList = addMemAliasingINTELInstructions(BM, AliasingListMD);
1269-
MemoryAccess.push_back(MemAliasList->getId());
1270-
}
1271-
12721231
/// An instruction may use an instruction from another BB which has not been
12731232
/// translated. SPIRVForward should be created as place holder for these
12741233
/// instructions and replaced later by the real instructions.
@@ -1421,8 +1380,6 @@ SPIRVValue *LLVMToSPIRV::transValueWithoutDecoration(Value *V,
14211380
if (ST->isAtomic())
14221381
return transAtomicStore(ST, BB);
14231382

1424-
// Keep this vector to store MemoryAccess operands for both Alignment and
1425-
// Aliasing information.
14261383
std::vector<SPIRVWord> MemoryAccess(1, 0);
14271384
if (ST->isVolatile())
14281385
MemoryAccess[0] |= MemoryAccessVolatileMask;
@@ -1432,13 +1389,6 @@ SPIRVValue *LLVMToSPIRV::transValueWithoutDecoration(Value *V,
14321389
}
14331390
if (ST->getMetadata(LLVMContext::MD_nontemporal))
14341391
MemoryAccess[0] |= MemoryAccessNontemporalMask;
1435-
if (MDNode *AliasingListMD = ST->getMetadata(LLVMContext::MD_alias_scope))
1436-
transAliasingMemAccess(BM, AliasingListMD, MemoryAccess,
1437-
internal::MemoryAccessAliasScopeINTELMask);
1438-
else if (MDNode *AliasingListMD =
1439-
ST->getMetadata(LLVMContext::MD_noalias))
1440-
transAliasingMemAccess(BM, AliasingListMD, MemoryAccess,
1441-
internal::MemoryAccessNoAliasINTELMask);
14421392
if (MemoryAccess.front() == 0)
14431393
MemoryAccess.clear();
14441394

@@ -1453,9 +1403,7 @@ SPIRVValue *LLVMToSPIRV::transValueWithoutDecoration(Value *V,
14531403
if (LD->isAtomic())
14541404
return transAtomicLoad(LD, BB);
14551405

1456-
// Keep this vector to store MemoryAccess operands for both Alignment and
1457-
// Aliasing information.
1458-
std::vector<uint32_t> MemoryAccess(1, 0);
1406+
std::vector<SPIRVWord> MemoryAccess(1, 0);
14591407
if (LD->isVolatile())
14601408
MemoryAccess[0] |= MemoryAccessVolatileMask;
14611409
if (LD->getAlignment()) {
@@ -1464,13 +1412,6 @@ SPIRVValue *LLVMToSPIRV::transValueWithoutDecoration(Value *V,
14641412
}
14651413
if (LD->getMetadata(LLVMContext::MD_nontemporal))
14661414
MemoryAccess[0] |= MemoryAccessNontemporalMask;
1467-
if (MDNode *AliasingListMD = LD->getMetadata(LLVMContext::MD_alias_scope))
1468-
transAliasingMemAccess(BM, AliasingListMD, MemoryAccess,
1469-
internal::MemoryAccessAliasScopeINTELMask);
1470-
else if (MDNode *AliasingListMD =
1471-
LD->getMetadata(LLVMContext::MD_noalias))
1472-
transAliasingMemAccess(BM, AliasingListMD, MemoryAccess,
1473-
internal::MemoryAccessNoAliasINTELMask);
14741415
if (MemoryAccess.front() == 0)
14751416
MemoryAccess.clear();
14761417
return mapValue(V, BM->addLoadInst(transValue(LD->getPointerOperand(), BB),
@@ -1848,7 +1789,6 @@ bool LLVMToSPIRV::transDecoration(Value *V, SPIRVValue *BV) {
18481789
BV->setFPFastMathMode(M);
18491790
}
18501791
}
1851-
transMemAliasingINTELDecorations(V, BV);
18521792

18531793
return true;
18541794
}
@@ -1865,35 +1805,6 @@ bool LLVMToSPIRV::transAlign(Value *V, SPIRVValue *BV) {
18651805
return true;
18661806
}
18671807

1868-
// Apply aliasing decorations to instructions annotated with aliasing metadata.
1869-
// Do it for any instruction but loads and stores.
1870-
void LLVMToSPIRV::transMemAliasingINTELDecorations(Value *V, SPIRVValue *BV) {
1871-
if (!BM->isAllowedToUseExtension(
1872-
ExtensionID::SPV_INTEL_memory_access_aliasing))
1873-
return;
1874-
// Loads and Stores are handled during memory access mask addition
1875-
if (isa<StoreInst>(V) || isa<LoadInst>(V))
1876-
return;
1877-
1878-
Instruction *Inst = dyn_cast<Instruction>(V);
1879-
if (!Inst)
1880-
return;
1881-
1882-
if (MDNode *AliasingListMD =
1883-
Inst->getMetadata(LLVMContext::MD_alias_scope)) {
1884-
auto *MemAliasList =
1885-
addMemAliasingINTELInstructions(BM, AliasingListMD);
1886-
BV->addDecorate(new SPIRVDecorateId(
1887-
internal::DecorationAliasScopeINTEL, BV, MemAliasList->getId()));
1888-
} else if (MDNode *AliasingListMD =
1889-
Inst->getMetadata(LLVMContext::MD_noalias)) {
1890-
auto *MemAliasList =
1891-
addMemAliasingINTELInstructions(BM, AliasingListMD);
1892-
BV->addDecorate(new SPIRVDecorateId(
1893-
internal::DecorationNoAliasINTEL, BV, MemAliasList->getId()));
1894-
}
1895-
}
1896-
18971808
/// Do this after source language is set.
18981809
bool LLVMToSPIRV::transBuiltinSet() {
18991810
SPIRVId EISId;

llvm-spirv/lib/SPIRV/SPIRVWriter.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ class LLVMToSPIRV : public ModulePass {
112112
SPIRVValue *transAsmINTEL(InlineAsm *Asm);
113113
SPIRVValue *transAsmCallINTEL(CallInst *Call, SPIRVBasicBlock *BB);
114114
bool transDecoration(Value *V, SPIRVValue *BV);
115-
void transMemAliasingINTELDecorations(Value *V, SPIRVValue *BV);
116115
SPIRVWord transFunctionControlMask(Function *);
117116
SPIRVFunction *transFunctionDecl(Function *F);
118117
void transVectorComputeMetadata(Function *F);

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVDecorate.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ SPIRVDecorateGeneric::SPIRVDecorateGeneric(Op OC, SPIRVWord WC,
8080
validate();
8181
updateModuleVersion();
8282
}
83-
8483
SPIRVDecorateGeneric::SPIRVDecorateGeneric(Op OC)
8584
: SPIRVAnnotationGeneric(OC), Dec(DecorationRelaxedPrecision),
8685
Owner(nullptr) {}
@@ -152,22 +151,6 @@ void SPIRVDecorate::decode(std::istream &I) {
152151
getOrCreateTarget()->addDecorate(this);
153152
}
154153

155-
void SPIRVDecorateId::encode(spv_ostream &O) const {
156-
SPIRVEncoder Encoder = getEncoder(O);
157-
Encoder << Target << Dec << Literals;
158-
}
159-
160-
void SPIRVDecorateId::setWordCount(SPIRVWord Count) {
161-
WordCount = Count;
162-
Literals.resize(WordCount - FixedWC);
163-
}
164-
165-
void SPIRVDecorateId::decode(std::istream &I) {
166-
SPIRVDecoder Decoder = getDecoder(I);
167-
Decoder >> Target >> Dec >> Literals;
168-
getOrCreateTarget()->addDecorate(this);
169-
}
170-
171154
void SPIRVMemberDecorate::encode(spv_ostream &O) const {
172155
SPIRVEncoder Encoder = getEncoder(O);
173156
Encoder << Target << MemberNumber << Dec;

0 commit comments

Comments
 (0)