Skip to content

Commit 47d4e65

Browse files
MrSidimsvladimirlaz
authored andcommitted
Tolerate more inputs during alias.scope/noalias MD translation (intel#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]> Original commit: KhronosGroup/SPIRV-LLVM-Translator@2c61561
1 parent 2a5a5bb commit 47d4e65

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,14 +1239,16 @@ SPIRVValue *LLVMToSPIRVBase::transAtomicLoad(LoadInst *LD,
12391239
// TODO: add support for an optional string operand.
12401240
SPIRVEntry *addMemAliasingINTELInstructions(SPIRVModule *M,
12411241
MDNode *AliasingListMD) {
1242-
assert(AliasingListMD->getNumOperands() > 0 &&
1243-
"Aliasing list MD must have at least one operand");
1242+
if (AliasingListMD->getNumOperands() == 0)
1243+
return nullptr;
12441244
std::vector<SPIRVId> ListId;
12451245
for (const MDOperand &MDListOp : AliasingListMD->operands()) {
12461246
if (MDNode *ScopeMD = dyn_cast<MDNode>(MDListOp)) {
1247-
assert(ScopeMD->getNumOperands() > 1 &&
1248-
"Aliasing scope MD must have at least two operands");
1249-
MDNode *DomainMD = cast<MDNode>(ScopeMD->getOperand(1));
1247+
if (ScopeMD->getNumOperands() < 2)
1248+
return nullptr;
1249+
MDNode *DomainMD = dyn_cast<MDNode>(ScopeMD->getOperand(1));
1250+
if (!DomainMD)
1251+
return nullptr;
12501252
auto *Domain =
12511253
M->getOrAddAliasDomainDeclINTELInst(std::vector<SPIRVId>(), DomainMD);
12521254
auto *Scope =
@@ -1268,6 +1270,8 @@ void transAliasingMemAccess(SPIRVModule *BM, MDNode *AliasingListMD,
12681270
return;
12691271
MemoryAccess[0] |= MemAccessMask;
12701272
auto *MemAliasList = addMemAliasingINTELInstructions(BM, AliasingListMD);
1273+
if (!MemAliasList)
1274+
return;
12711275
MemoryAccess.push_back(MemAliasList->getId());
12721276
}
12731277

@@ -1885,12 +1889,16 @@ void LLVMToSPIRV::transMemAliasingINTELDecorations(Value *V, SPIRVValue *BV) {
18851889
Inst->getMetadata(LLVMContext::MD_alias_scope)) {
18861890
auto *MemAliasList =
18871891
addMemAliasingINTELInstructions(BM, AliasingListMD);
1892+
if (!MemAliasList)
1893+
return;
18881894
BV->addDecorate(new SPIRVDecorateId(
18891895
internal::DecorationAliasScopeINTEL, BV, MemAliasList->getId()));
18901896
} else if (MDNode *AliasingListMD =
18911897
Inst->getMetadata(LLVMContext::MD_noalias)) {
18921898
auto *MemAliasList =
18931899
addMemAliasingINTELInstructions(BM, AliasingListMD);
1900+
if (!MemAliasList)
1901+
return;
18941902
BV->addDecorate(new SPIRVDecorateId(
18951903
internal::DecorationNoAliasINTEL, BV, MemAliasList->getId()));
18961904
}

0 commit comments

Comments
 (0)