Skip to content

Commit 2c61561

Browse files
authored
Tolerate more inputs during alias.scope/noalias MD translation (#994)
According to https://llvm.org/docs/LangRef.html aliasing metadata must have following layout: List { MD Node Scope1, (other scopes) ... } Scope1 { MD Node Scope1, MD Node Domain1, (optional MD String) } ... (other scopes) Domain1 { MD Node Domain1, (optional MD String) } ... (other domains) and this pattern is actually being checked in LLVM's ScopedNoAliasAA.cpp. But in a harsh reality LLVM opt have bugs, which can result in this pattern violation. So lets be more tolerant to the input IR module. Signed-off-by: Dmitry Sidorov <[email protected]>
1 parent f653af3 commit 2c61561

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,14 +1222,16 @@ SPIRVValue *LLVMToSPIRVBase::transAtomicLoad(LoadInst *LD,
12221222
// TODO: add support for an optional string operand.
12231223
SPIRVEntry *addMemAliasingINTELInstructions(SPIRVModule *M,
12241224
MDNode *AliasingListMD) {
1225-
assert(AliasingListMD->getNumOperands() > 0 &&
1226-
"Aliasing list MD must have at least one operand");
1225+
if (AliasingListMD->getNumOperands() == 0)
1226+
return nullptr;
12271227
std::vector<SPIRVId> ListId;
12281228
for (const MDOperand &MDListOp : AliasingListMD->operands()) {
12291229
if (MDNode *ScopeMD = dyn_cast<MDNode>(MDListOp)) {
1230-
assert(ScopeMD->getNumOperands() > 1 &&
1231-
"Aliasing scope MD must have at least two operands");
1232-
MDNode *DomainMD = cast<MDNode>(ScopeMD->getOperand(1));
1230+
if (ScopeMD->getNumOperands() < 2)
1231+
return nullptr;
1232+
MDNode *DomainMD = dyn_cast<MDNode>(ScopeMD->getOperand(1));
1233+
if (!DomainMD)
1234+
return nullptr;
12331235
auto *Domain =
12341236
M->getOrAddAliasDomainDeclINTELInst(std::vector<SPIRVId>(), DomainMD);
12351237
auto *Scope =
@@ -1251,6 +1253,8 @@ void transAliasingMemAccess(SPIRVModule *BM, MDNode *AliasingListMD,
12511253
return;
12521254
MemoryAccess[0] |= MemAccessMask;
12531255
auto *MemAliasList = addMemAliasingINTELInstructions(BM, AliasingListMD);
1256+
if (!MemAliasList)
1257+
return;
12541258
MemoryAccess.push_back(MemAliasList->getId());
12551259
}
12561260

@@ -1869,12 +1873,16 @@ void LLVMToSPIRVBase::transMemAliasingINTELDecorations(Value *V,
18691873
Inst->getMetadata(LLVMContext::MD_alias_scope)) {
18701874
auto *MemAliasList =
18711875
addMemAliasingINTELInstructions(BM, AliasingListMD);
1876+
if (!MemAliasList)
1877+
return;
18721878
BV->addDecorate(new SPIRVDecorateId(
18731879
internal::DecorationAliasScopeINTEL, BV, MemAliasList->getId()));
18741880
} else if (MDNode *AliasingListMD =
18751881
Inst->getMetadata(LLVMContext::MD_noalias)) {
18761882
auto *MemAliasList =
18771883
addMemAliasingINTELInstructions(BM, AliasingListMD);
1884+
if (!MemAliasList)
1885+
return;
18781886
BV->addDecorate(new SPIRVDecorateId(
18791887
internal::DecorationNoAliasINTEL, BV, MemAliasList->getId()));
18801888
}

0 commit comments

Comments
 (0)