Skip to content

Commit 7258a81

Browse files
aeubanksLukacma
authored andcommitted
Revert "[InstCombinePHI] Enhance PHI CSE to remove redundant phis" (llvm#164520)
Reverts llvm#163453 Causes crashes, see llvm#163453 (comment)
1 parent d198d87 commit 7258a81

File tree

2 files changed

+1
-334
lines changed

2 files changed

+1
-334
lines changed

llvm/lib/Analysis/InstructionSimplify.cpp

Lines changed: 1 addition & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -4866,89 +4866,6 @@ static Value *simplifySelectWithFCmp(Value *Cond, Value *T, Value *F,
48664866
return nullptr;
48674867
}
48684868

4869-
/// Look for the following pattern and simplify %to_fold to %identicalPhi.
4870-
/// Here %phi, %to_fold and %phi.next perform the same functionality as
4871-
/// %identicalPhi and hence the select instruction %to_fold can be folded
4872-
/// into %identicalPhi.
4873-
///
4874-
/// BB1:
4875-
/// %identicalPhi = phi [ X, %BB0 ], [ %identicalPhi.next, %BB1 ]
4876-
/// %phi = phi [ X, %BB0 ], [ %phi.next, %BB1 ]
4877-
/// ...
4878-
/// %identicalPhi.next = select %cmp, %val, %identicalPhi
4879-
/// (or select %cmp, %identicalPhi, %val)
4880-
/// %to_fold = select %cmp2, %identicalPhi, %phi
4881-
/// %phi.next = select %cmp, %val, %to_fold
4882-
/// (or select %cmp, %to_fold, %val)
4883-
///
4884-
/// Prove that %phi and %identicalPhi are the same by induction:
4885-
///
4886-
/// Base case: Both %phi and %identicalPhi are equal on entry to the loop.
4887-
/// Inductive case:
4888-
/// Suppose %phi and %identicalPhi are equal at iteration i.
4889-
/// We look at their values at iteration i+1 which are %phi.next and
4890-
/// %identicalPhi.next. They would have become different only when %cmp is
4891-
/// false and the corresponding values %to_fold and %identicalPhi differ
4892-
/// (similar reason for the other "or" case in the bracket).
4893-
///
4894-
/// The only condition when %to_fold and %identicalPh could differ is when %cmp2
4895-
/// is false and %to_fold is %phi, which contradicts our inductive hypothesis
4896-
/// that %phi and %identicalPhi are equal. Thus %phi and %identicalPhi are
4897-
/// always equal at iteration i+1.
4898-
bool isSimplifierIdenticalPHI(PHINode &PN, PHINode &IdenticalPN) {
4899-
if (PN.getParent() != IdenticalPN.getParent())
4900-
return false;
4901-
if (PN.getNumIncomingValues() != 2)
4902-
return false;
4903-
4904-
// Check that only the backedge incoming value is different.
4905-
unsigned DiffVals = 0;
4906-
BasicBlock *DiffValBB = nullptr;
4907-
for (unsigned i = 0; i < 2; i++) {
4908-
BasicBlock *PredBB = PN.getIncomingBlock(i);
4909-
if (PN.getIncomingValueForBlock(PredBB) !=
4910-
IdenticalPN.getIncomingValueForBlock(PredBB)) {
4911-
DiffVals++;
4912-
DiffValBB = PredBB;
4913-
}
4914-
}
4915-
if (DiffVals != 1)
4916-
return false;
4917-
// Now check that the backedge incoming values are two select
4918-
// instructions with the same condition. Either their true
4919-
// values are the same, or their false values are the same.
4920-
auto *SI = dyn_cast<SelectInst>(PN.getIncomingValueForBlock(DiffValBB));
4921-
auto *IdenticalSI =
4922-
dyn_cast<SelectInst>(IdenticalPN.getIncomingValueForBlock(DiffValBB));
4923-
if (!SI || !IdenticalSI)
4924-
return false;
4925-
if (SI->getCondition() != IdenticalSI->getCondition())
4926-
return false;
4927-
4928-
SelectInst *SIOtherVal = nullptr;
4929-
Value *IdenticalSIOtherVal = nullptr;
4930-
if (SI->getTrueValue() == IdenticalSI->getTrueValue()) {
4931-
SIOtherVal = dyn_cast<SelectInst>(SI->getFalseValue());
4932-
IdenticalSIOtherVal = IdenticalSI->getFalseValue();
4933-
} else if (SI->getFalseValue() == IdenticalSI->getFalseValue()) {
4934-
SIOtherVal = dyn_cast<SelectInst>(SI->getTrueValue());
4935-
IdenticalSIOtherVal = IdenticalSI->getTrueValue();
4936-
} else {
4937-
return false;
4938-
}
4939-
4940-
// Now check that the other values in select, i.e., %to_fold and
4941-
// %identicalPhi, are essentially the same value.
4942-
if (!SIOtherVal || IdenticalSIOtherVal != &IdenticalPN)
4943-
return false;
4944-
if (!(SIOtherVal->getTrueValue() == &IdenticalPN &&
4945-
SIOtherVal->getFalseValue() == &PN) &&
4946-
!(SIOtherVal->getTrueValue() == &PN &&
4947-
SIOtherVal->getFalseValue() == &IdenticalPN))
4948-
return false;
4949-
return true;
4950-
}
4951-
49524869
/// Given operands for a SelectInst, see if we can fold the result.
49534870
/// If not, this returns null.
49544871
static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
@@ -5124,14 +5041,7 @@ static Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
51245041
std::optional<bool> Imp = isImpliedByDomCondition(Cond, Q.CxtI, Q.DL);
51255042
if (Imp)
51265043
return *Imp ? TrueVal : FalseVal;
5127-
// Look for same PHIs in the true and false values.
5128-
if (auto *TruePHI = dyn_cast<PHINode>(TrueVal))
5129-
if (auto *FalsePHI = dyn_cast<PHINode>(FalseVal)) {
5130-
if (isSimplifierIdenticalPHI(*TruePHI, *FalsePHI))
5131-
return FalseVal;
5132-
if (isSimplifierIdenticalPHI(*FalsePHI, *TruePHI))
5133-
return TrueVal;
5134-
}
5044+
51355045
return nullptr;
51365046
}
51375047

llvm/test/Transforms/InstCombine/select_with_identical_phi.ll

Lines changed: 0 additions & 243 deletions
This file was deleted.

0 commit comments

Comments
 (0)