diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-03-20 11:40:34 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-06-04 11:58:51 +0000 |
| commit | 4b6eb0e63c698094db5506763df44cc83c19f643 (patch) | |
| tree | f1d30b8c10bc6db323b91538745ae8ab8b593910 /contrib/llvm-project/llvm/lib/IR/Operator.cpp | |
| parent | 76886853f03395abb680824bcc74e98f83bd477a (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/IR/Operator.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/IR/Operator.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/contrib/llvm-project/llvm/lib/IR/Operator.cpp b/contrib/llvm-project/llvm/lib/IR/Operator.cpp index 272c260d0111..cf309ffd6212 100644 --- a/contrib/llvm-project/llvm/lib/IR/Operator.cpp +++ b/contrib/llvm-project/llvm/lib/IR/Operator.cpp @@ -19,6 +19,31 @@ #include "ConstantsContext.h" namespace llvm { +bool Operator::hasPoisonGeneratingFlags() const { + switch (getOpcode()) { + case Instruction::Add: + case Instruction::Sub: + case Instruction::Mul: + case Instruction::Shl: { + auto *OBO = cast<OverflowingBinaryOperator>(this); + return OBO->hasNoUnsignedWrap() || OBO->hasNoSignedWrap(); + } + case Instruction::UDiv: + case Instruction::SDiv: + case Instruction::AShr: + case Instruction::LShr: + return cast<PossiblyExactOperator>(this)->isExact(); + case Instruction::GetElementPtr: { + auto *GEP = cast<GEPOperator>(this); + // Note: inrange exists on constexpr only + return GEP->isInBounds() || GEP->getInRangeIndex() != None; + } + default: + return false; + } + // TODO: FastMathFlags! (On instructions, but not constexpr) +} + Type *GEPOperator::getSourceElementType() const { if (auto *I = dyn_cast<GetElementPtrInst>(this)) return I->getSourceElementType(); @@ -194,7 +219,7 @@ bool GEPOperator::collectOffset( APInt(BitWidth, DL.getTypeAllocSize(GTI.getIndexedType())); // Insert an initial offset of 0 for V iff none exists already, then // increment the offset by IndexedSize. - if (!IndexedSize.isNullValue()) { + if (!IndexedSize.isZero()) { VariableOffsets.insert({V, APInt(BitWidth, 0)}); VariableOffsets[V] += IndexedSize; } |
