mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +00:00
[PHITransAddr] Don't translate unreachable values
Unreachable values may use themselves in strange ways due to their dominance property. Attempting to translate through them can lead to infinite recursion, crashing LLVM. Instead, claim that we weren't able to translate the value. This fixes PR23096. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238702 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -315,21 +315,26 @@ Value *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
|
||||
|
||||
|
||||
/// PHITranslateValue - PHI translate the current address up the CFG from
|
||||
/// CurBB to Pred, updating our state to reflect any needed changes. If the
|
||||
/// dominator tree DT is non-null, the translated value must dominate
|
||||
/// CurBB to Pred, updating our state to reflect any needed changes. If
|
||||
/// 'MustDominate' is true, the translated value must dominate
|
||||
/// PredBB. This returns true on failure and sets Addr to null.
|
||||
bool PHITransAddr::PHITranslateValue(BasicBlock *CurBB, BasicBlock *PredBB,
|
||||
const DominatorTree *DT) {
|
||||
const DominatorTree *DT,
|
||||
bool MustDominate) {
|
||||
assert(DT || !MustDominate);
|
||||
assert(Verify() && "Invalid PHITransAddr!");
|
||||
Addr = PHITranslateSubExpr(Addr, CurBB, PredBB, DT);
|
||||
if (DT && DT->isReachableFromEntry(PredBB))
|
||||
Addr =
|
||||
PHITranslateSubExpr(Addr, CurBB, PredBB, MustDominate ? DT : nullptr);
|
||||
else
|
||||
Addr = nullptr;
|
||||
assert(Verify() && "Invalid PHITransAddr!");
|
||||
|
||||
if (DT) {
|
||||
if (MustDominate)
|
||||
// Make sure the value is live in the predecessor.
|
||||
if (Instruction *Inst = dyn_cast_or_null<Instruction>(Addr))
|
||||
if (!DT->dominates(Inst->getParent(), PredBB))
|
||||
Addr = nullptr;
|
||||
}
|
||||
|
||||
return Addr == nullptr;
|
||||
}
|
||||
@ -372,7 +377,7 @@ InsertPHITranslatedSubExpr(Value *InVal, BasicBlock *CurBB,
|
||||
// See if we have a version of this value already available and dominating
|
||||
// PredBB. If so, there is no need to insert a new instance of it.
|
||||
PHITransAddr Tmp(InVal, DL, AC);
|
||||
if (!Tmp.PHITranslateValue(CurBB, PredBB, &DT))
|
||||
if (!Tmp.PHITranslateValue(CurBB, PredBB, &DT, /*MustDominate=*/true))
|
||||
return Tmp.getAddr();
|
||||
|
||||
// If we don't have an available version of this value, it must be an
|
||||
|
Reference in New Issue
Block a user