Skip deadInsts in SimpleTransformForHLDXIR to prevent AV (#1129)

This commit is contained in:
Tex Riddell 2018-03-12 12:59:32 -07:00 коммит произвёл GitHub
Родитель dcaad9e14c
Коммит 9beafa70b4
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 10 добавлений и 7 удалений

Просмотреть файл

@ -27,6 +27,7 @@
#include "clang/Lex/HLSLMacroExpander.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
@ -3536,8 +3537,8 @@ static bool SimplifyBitCastGEP(GEPOperator *GEP, llvm::Type *FromTy, llvm::Type
}
return false;
}
static void SimplifyBitCast(BitCastOperator *BC, std::vector<Instruction *> &deadInsts) {
typedef SmallPtrSet<Instruction *, 4> SmallInstSet;
static void SimplifyBitCast(BitCastOperator *BC, SmallInstSet &deadInsts) {
Value *Ptr = BC->getOperand(0);
llvm::Type *FromTy = Ptr->getType();
llvm::Type *ToTy = BC->getType();
@ -3567,18 +3568,18 @@ static void SimplifyBitCast(BitCastOperator *BC, std::vector<Instruction *> &dea
if (LoadInst *LI = dyn_cast<LoadInst>(U)) {
if (SimplifyBitCastLoad(LI, FromTy, ToTy, Ptr)) {
LI->dropAllReferences();
deadInsts.emplace_back(LI);
deadInsts.insert(LI);
}
} else if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
if (SimplifyBitCastStore(SI, FromTy, ToTy, Ptr)) {
SI->dropAllReferences();
deadInsts.emplace_back(SI);
deadInsts.insert(SI);
}
} else if (GEPOperator *GEP = dyn_cast<GEPOperator>(U)) {
if (SimplifyBitCastGEP(GEP, FromTy, ToTy, Ptr))
if (Instruction *I = dyn_cast<Instruction>(GEP)) {
I->dropAllReferences();
deadInsts.emplace_back(I);
deadInsts.insert(I);
}
} else if (CallInst *CI = dyn_cast<CallInst>(U)) {
// Skip function call.
@ -3826,7 +3827,7 @@ static Value * TryEvalIntrinsic(CallInst *CI, IntrinsicOp intriOp) {
}
static void SimpleTransformForHLDXIR(Instruction *I,
std::vector<Instruction *> &deadInsts) {
SmallInstSet &deadInsts) {
unsigned opcode = I->getOpcode();
switch (opcode) {
@ -3883,11 +3884,13 @@ static void SimpleTransformForHLDXIR(Instruction *I,
// Do simple transform to make later lower pass easier.
static void SimpleTransformForHLDXIR(llvm::Module *pM) {
std::vector<Instruction *> deadInsts;
SmallInstSet deadInsts;
for (Function &F : pM->functions()) {
for (BasicBlock &BB : F.getBasicBlockList()) {
for (BasicBlock::iterator Iter = BB.begin(); Iter != BB.end(); ) {
Instruction *I = (Iter++);
if (deadInsts.count(I))
continue; // Skip dead instructions
SimpleTransformForHLDXIR(I, deadInsts);
}
}