diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 3dbd605..4d168ce 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -4362,3 +4362,21 @@ bool llvm::inferAttributesFromOthers(Function &F) { return Changed; } + +void OverflowTracking::mergeFlags(Instruction &I) { + if (isa<OverflowingBinaryOperator>(&I)) { + HasNUW &= I.hasNoUnsignedWrap(); + HasNSW &= I.hasNoSignedWrap(); + } +} + +void OverflowTracking::applyFlags(Instruction &I) { + I.clearSubclassOptionalData(); + if (I.getOpcode() == Instruction::Add || + (I.getOpcode() == Instruction::Mul && AllKnownNonZero)) { + if (HasNUW) + I.setHasNoUnsignedWrap(); + if (HasNSW && (AllKnownNonNegative || HasNUW)) + I.setHasNoSignedWrap(); + } +} |