forked from OSchip/llvm-project
CodeGen: Avoid getNodePtrUnchecked() where we need a Value, NFC
`ilist_iterator<NodeTy>::getNodePtrUnchecked()` is documented as being for internal use only, but CodeGenPrepare was using it anyway. This code relies on pulling out the `Value*` pointer even after the lifetime of the iterator is over. But having this pointer available in ilist_iterator depends on UB in the first place. Instead, safely pull out the `Value*` when the iterator is alive and stop using the internal-only API. There should be no functionality change here. llvm-svn: 261493
This commit is contained in:
parent
1b936c0f59
commit
7b269642d2
|
@ -1773,13 +1773,14 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, bool& ModifiedDT) {
|
|||
// Substituting this can cause recursive simplifications, which can
|
||||
// invalidate our iterator. Use a WeakVH to hold onto it in case this
|
||||
// happens.
|
||||
WeakVH IterHandle(&*CurInstIterator);
|
||||
Value *CurValue = &*CurInstIterator;
|
||||
WeakVH IterHandle(CurValue);
|
||||
|
||||
replaceAndRecursivelySimplify(CI, RetVal, TLInfo, nullptr);
|
||||
|
||||
// If the iterator instruction was recursively deleted, start over at the
|
||||
// start of the block.
|
||||
if (IterHandle != CurInstIterator.getNodePtrUnchecked()) {
|
||||
if (IterHandle != CurValue) {
|
||||
CurInstIterator = BB->begin();
|
||||
SunkAddrs.clear();
|
||||
}
|
||||
|
@ -3945,12 +3946,13 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
|||
if (Repl->use_empty()) {
|
||||
// This can cause recursive deletion, which can invalidate our iterator.
|
||||
// Use a WeakVH to hold onto it in case this happens.
|
||||
WeakVH IterHandle(&*CurInstIterator);
|
||||
Value *CurValue = &*CurInstIterator;
|
||||
WeakVH IterHandle(CurValue);
|
||||
BasicBlock *BB = CurInstIterator->getParent();
|
||||
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Repl, TLInfo);
|
||||
|
||||
if (IterHandle != CurInstIterator.getNodePtrUnchecked()) {
|
||||
if (IterHandle != CurValue) {
|
||||
// If the iterator instruction was recursively deleted, start over at the
|
||||
// start of the block.
|
||||
CurInstIterator = BB->begin();
|
||||
|
|
Loading…
Reference in New Issue