diff options
author | Zhengyang Liu <liuz@cs.utah.edu> | 2020-11-24 14:55:24 -0700 |
---|---|---|
committer | Zhengyang Liu <liuz@cs.utah.edu> | 2020-11-25 17:33:51 -0700 |
commit | 75f50e15bf8fff6fba1d4678adedd33ef6a945e5 (patch) | |
tree | b9793ec3e05ba630c0354c13aa443a688f5a21e3 /llvm/lib/IR/Constants.cpp | |
parent | 3fb0879867d7039cb61ffb6287ac17ac949adfa9 (diff) | |
download | llvm-75f50e15bf8fff6fba1d4678adedd33ef6a945e5.zip llvm-75f50e15bf8fff6fba1d4678adedd33ef6a945e5.tar.gz llvm-75f50e15bf8fff6fba1d4678adedd33ef6a945e5.tar.bz2 |
Adding PoisonValue for representing poison value explicitly in IR
Define ConstantData::PoisonValue.
Add support for poison value to LLLexer/LLParser/BitcodeReader/BitcodeWriter.
Add support for poison value to llvm-c interface.
Add support for poison value to OCaml binding.
Add m_Poison in PatternMatch.
Differential Revision: https://reviews.llvm.org/D71126
Diffstat (limited to 'llvm/lib/IR/Constants.cpp')
-rw-r--r-- | llvm/lib/IR/Constants.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index b87fc24..f731021 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -1090,6 +1090,32 @@ unsigned UndefValue::getNumElements() const { } //===----------------------------------------------------------------------===// +// PoisonValue Implementation +//===----------------------------------------------------------------------===// + +PoisonValue *PoisonValue::getSequentialElement() const { + if (ArrayType *ATy = dyn_cast<ArrayType>(getType())) + return PoisonValue::get(ATy->getElementType()); + return PoisonValue::get(cast<VectorType>(getType())->getElementType()); +} + +PoisonValue *PoisonValue::getStructElement(unsigned Elt) const { + return PoisonValue::get(getType()->getStructElementType(Elt)); +} + +PoisonValue *PoisonValue::getElementValue(Constant *C) const { + if (isa<ArrayType>(getType()) || isa<VectorType>(getType())) + return getSequentialElement(); + return getStructElement(cast<ConstantInt>(C)->getZExtValue()); +} + +PoisonValue *PoisonValue::getElementValue(unsigned Idx) const { + if (isa<ArrayType>(getType()) || isa<VectorType>(getType())) + return getSequentialElement(); + return getStructElement(Idx); +} + +//===----------------------------------------------------------------------===// // ConstantXXX Classes //===----------------------------------------------------------------------===// @@ -1699,6 +1725,20 @@ void UndefValue::destroyConstantImpl() { getContext().pImpl->UVConstants.erase(getType()); } +PoisonValue *PoisonValue::get(Type *Ty) { + std::unique_ptr<PoisonValue> &Entry = Ty->getContext().pImpl->PVConstants[Ty]; + if (!Entry) + Entry.reset(new PoisonValue(Ty)); + + return Entry.get(); +} + +/// Remove the constant from the constant table. +void PoisonValue::destroyConstantImpl() { + // Free the constant and any dangling references to it. + getContext().pImpl->PVConstants.erase(getType()); +} + BlockAddress *BlockAddress::get(BasicBlock *BB) { assert(BB->getParent() && "Block must have a parent"); return get(BB->getParent(), BB); |