diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-02-21 20:14:29 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-02-21 20:14:29 +0000 |
commit | ec6f7fed54cdcc0e2588f912626314c0a58b24d7 (patch) | |
tree | dc28a89bbb70376c2f76b5c66e578a663839f029 /llvm/lib/Transforms/Utils/IntegerDivision.cpp | |
parent | 820cf20a986f06d7fb1f055ae44748529f896d94 (diff) | |
download | llvm-ec6f7fed54cdcc0e2588f912626314c0a58b24d7.zip llvm-ec6f7fed54cdcc0e2588f912626314c0a58b24d7.tar.gz llvm-ec6f7fed54cdcc0e2588f912626314c0a58b24d7.tar.bz2 |
TransformUtils: Avoid getNodePtrUnchecked() in integer division, NFC
Stop relying on `getNodePtrUnchecked()` being useful on invalid
iterators. This function is documented to be for internal use only, and
the pointer type will eventually have to change to remove UB from
ilist_iterator. Instead, check the iterator before it has been
invalidated.
llvm-svn: 261497
Diffstat (limited to 'llvm/lib/Transforms/Utils/IntegerDivision.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/IntegerDivision.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/IntegerDivision.cpp b/llvm/lib/Transforms/Utils/IntegerDivision.cpp index 5687afa..5a90dcb 100644 --- a/llvm/lib/Transforms/Utils/IntegerDivision.cpp +++ b/llvm/lib/Transforms/Utils/IntegerDivision.cpp @@ -390,6 +390,8 @@ bool llvm::expandRemainder(BinaryOperator *Rem) { Value *Remainder = generateSignedRemainderCode(Rem->getOperand(0), Rem->getOperand(1), Builder); + // Check whether this is the insert point while Rem is still valid. + bool IsInsertPoint = Rem->getIterator() == Builder.GetInsertPoint(); Rem->replaceAllUsesWith(Remainder); Rem->dropAllReferences(); Rem->eraseFromParent(); @@ -397,7 +399,7 @@ bool llvm::expandRemainder(BinaryOperator *Rem) { // If we didn't actually generate an urem instruction, we're done // This happens for example if the input were constant. In this case the // Builder insertion point was unchanged - if (Rem == Builder.GetInsertPoint().getNodePtrUnchecked()) + if (IsInsertPoint) return true; BinaryOperator *BO = dyn_cast<BinaryOperator>(Builder.GetInsertPoint()); @@ -446,6 +448,9 @@ bool llvm::expandDivision(BinaryOperator *Div) { // Lower the code to unsigned division, and reset Div to point to the udiv. Value *Quotient = generateSignedDivisionCode(Div->getOperand(0), Div->getOperand(1), Builder); + + // Check whether this is the insert point while Div is still valid. + bool IsInsertPoint = Div->getIterator() == Builder.GetInsertPoint(); Div->replaceAllUsesWith(Quotient); Div->dropAllReferences(); Div->eraseFromParent(); @@ -453,7 +458,7 @@ bool llvm::expandDivision(BinaryOperator *Div) { // If we didn't actually generate an udiv instruction, we're done // This happens for example if the input were constant. In this case the // Builder insertion point was unchanged - if (Div == Builder.GetInsertPoint().getNodePtrUnchecked()) + if (IsInsertPoint) return true; BinaryOperator *BO = dyn_cast<BinaryOperator>(Builder.GetInsertPoint()); |