a pointer array may be initialized to null or even not initialized. under this cases, simply give bti_private to the pointer.
Signed-off-by: Ruiling Song <ruiling.s...@intel.com> --- backend/src/llvm/llvm_gen_backend.cpp | 41 ++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index 41cb783..2200fa9 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -984,6 +984,12 @@ namespace gbe if (baseIter != pointerBaseMap.end()) { return baseIter->second; } + + if (isa<ConstantPointerNull>(ptr)) { + PointerType *ty = PointerType::get(ptr->getType(), 0); + return ConstantPointerNull::get(ty); + } + typedef std::map<Value *, unsigned>::iterator BtiIter; // for pointers that already assigned a bti, it is the base pointer, BtiIter found = BtiMap.find(ptr); @@ -1003,6 +1009,13 @@ namespace gbe } PtrOrigMapIter iter = pointerOrigMap.find(ptr); + + // we may not find the ptr, as it may be uninitialized + if (iter == pointerOrigMap.end()) { + PointerType *ty = PointerType::get(ptr->getType(), 0); + return ConstantPointerNull::get(ty); + } + SmallVector<Value *, 4> &pointers = (*iter).second; if (isSingleBti(ptr)) { Value *base = getPointerBase(pointers[0]); @@ -1057,7 +1070,7 @@ namespace gbe return basePhi; } else { ptr->dump(); - GBE_ASSERT(0 && "Unhandled instruction in getBtiRegister\n"); + GBE_ASSERT(0 && "Unhandled instruction in getPointerBase\n"); return ptr; } } @@ -1082,15 +1095,24 @@ namespace gbe if (valueIter != BtiValueMap.end()) return valueIter->second; + if (isa<ConstantPointerNull>(Val)) { + return ConstantInt::get(Type::getInt32Ty(Val->getContext()), BTI_PRIVATE); + } + + PtrOrigMapIter iter = pointerOrigMap.find(Val); + // the pointer may access an uninitialized pointer, + // in this case, we will not find it in pointerOrigMap + if (iter == pointerOrigMap.end()) + return ConstantInt::get(Type::getInt32Ty(Val->getContext()), BTI_PRIVATE); + if (found != BtiMap.end()) { // the Val already got assigned an BTI, return it - Value *bti = ConstantInt::get(IntegerType::get(Val->getContext(), 32), found->second); + Value *bti = ConstantInt::get(IntegerType::get(Val->getContext(), 32), + found->second); BtiValueMap.insert(std::make_pair(Val, bti)); return bti; } else { if (isSingleBti(Val)) { - PtrOrigMapIter iter = pointerOrigMap.find(Val); - GBE_ASSERT(iter != pointerOrigMap.end()); Value * bti = getBtiRegister((*iter).second[0]); BtiValueMap.insert(std::make_pair(Val, bti)); return bti; @@ -1099,12 +1121,11 @@ namespace gbe SelectInst *si = dyn_cast<SelectInst>(Val); IRBuilder<> Builder(si->getParent()); - PtrOrigMapIter iter = pointerOrigMap.find(Val); - GBE_ASSERT(iter != pointerOrigMap.end()); Value *trueVal = getBtiRegister((*iter).second[0]); Value *falseVal = getBtiRegister((*iter).second[1]); Builder.SetInsertPoint(si); - Value *bti = Builder.CreateSelect(si->getCondition(), trueVal, falseVal); + Value *bti = Builder.CreateSelect(si->getCondition(), + trueVal, falseVal); BtiValueMap.insert(std::make_pair(Val, bti)); return bti; } else if (isa<PHINode>(Val)) { @@ -1112,9 +1133,9 @@ namespace gbe IRBuilder<> Builder(phi->getParent()); Builder.SetInsertPoint(phi); - PHINode *btiPhi = Builder.CreatePHI(IntegerType::get(Val->getContext(), 32), phi->getNumIncomingValues()); - PtrOrigMapIter iter = pointerOrigMap.find(Val); - GBE_ASSERT(iter != pointerOrigMap.end()); + PHINode *btiPhi = Builder.CreatePHI( + IntegerType::get(Val->getContext(), 32), + phi->getNumIncomingValues()); SmallVector<Value *, 4> &pointers = (*iter).second; unsigned srcNum = pointers.size(); for (unsigned x = 0; x < srcNum; x++) { -- 2.4.1 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet