42
42
#include " llvm/ADT/SmallPtrSet.h"
43
43
#include " llvm/ADT/SmallVector.h"
44
44
#include " llvm/ADT/Statistic.h"
45
+ #include " llvm/Analysis/DomTreeUpdater.h"
45
46
#include " llvm/Analysis/GlobalsModRef.h"
46
47
#include " llvm/IR/BasicBlock.h"
47
48
#include " llvm/IR/CFG.h"
@@ -228,14 +229,17 @@ class ModelledPHI {
228
229
ModelledPHI () = default ;
229
230
230
231
ModelledPHI (const PHINode *PN, DominatorTree *DT) : DT(DT) {
231
- // BasicBlock comes first so we sort by basic block pointer order, then by value pointer order.
232
+ // BasicBlock comes first so we sort by basic block pointer order,
233
+ // then by value pointer order. No need to call `verifyModelledPHI`
234
+ // As the Values and Blocks are populated in DFSOrder already.
232
235
using OpsType = std::pair<BasicBlock *, Value *>;
233
236
SmallVector<OpsType, 4 > Ops;
234
237
for (unsigned I = 0 , E = PN->getNumIncomingValues (); I != E; ++I)
235
238
Ops.push_back ({PN->getIncomingBlock (I), PN->getIncomingValue (I)});
236
239
237
240
auto DFSOrder = [DT](OpsType O1, OpsType O2) {
238
- return DT->getNode (O1.first ) < DT->getNode (O2.first );
241
+ return DT->getNode (O1.first )->getDFSNumIn () <
242
+ DT->getNode (O2.first )->getDFSNumIn ();
239
243
};
240
244
// Sort by DFSNumber to have a deterministic order.
241
245
llvm::sort (Ops, DFSOrder);
@@ -244,7 +248,6 @@ class ModelledPHI {
244
248
Blocks.push_back (P.first );
245
249
Values.push_back (P.second );
246
250
}
247
- verifyModelledPHI ();
248
251
}
249
252
250
253
// / Create a dummy ModelledPHI that will compare unequal to any other ModelledPHI
@@ -260,13 +263,16 @@ class ModelledPHI {
260
263
assert (Values.size () > 1 && Blocks.size () > 1 &&
261
264
" Modelling PHI with less than 2 values" );
262
265
auto DFSOrder = [this ](const BasicBlock *BB1, const BasicBlock *BB2) {
263
- return this -> DT ->getNode (BB1) < this -> DT ->getNode (BB2);
266
+ return DT->getNode (BB1)-> getDFSNumIn () < DT->getNode (BB2)-> getDFSNumIn ( );
264
267
};
265
268
assert (llvm::is_sorted (Blocks, DFSOrder));
266
269
int C = 0 ;
267
270
llvm::for_each (Values, [&C, this ](const Value *V) {
268
- const Instruction *I = cast<Instruction>(V);
269
- assert (I->getParent () == this ->Blocks [C++]);
271
+ if (!isa<UndefValue>(V)) {
272
+ const Instruction *I = cast<Instruction>(V);
273
+ assert (I->getParent () == this ->Blocks [C]);
274
+ }
275
+ C++;
270
276
});
271
277
}
272
278
// / Create a PHI from an array of incoming values and incoming blocks.
@@ -280,13 +286,13 @@ class ModelledPHI {
280
286
}
281
287
282
288
// / Create a PHI from [I[OpNum] for I in Insts].
289
+ // / TODO: Figure out a way to verifyModelledPHI in this constructor.
283
290
ModelledPHI (ArrayRef<Instruction *> Insts, unsigned OpNum,
284
291
SmallSetVector<BasicBlock *, 4 > &B, DominatorTree *DT)
285
292
: DT(DT) {
286
293
llvm::copy (B, std::back_inserter (Blocks));
287
294
for (auto *I : Insts)
288
295
Values.push_back (I->getOperand (OpNum));
289
- verifyModelledPHI ();
290
296
}
291
297
292
298
// / Restrict the PHI's contents down to only \c NewBlocks.
@@ -795,6 +801,9 @@ unsigned GVNSink::sinkBB(BasicBlock *BBEnd) {
795
801
BBEnd->printAsOperand (dbgs ()); dbgs () << " \n " );
796
802
SmallVector<BasicBlock *, 4 > Preds;
797
803
for (auto *B : predecessors (BBEnd)) {
804
+ // Bailout on malformed CFG where BasicBlock has no predecessor(PR42346).
805
+ if (!DT->getNode (B))
806
+ return 0 ;
798
807
auto *T = B->getTerminator ();
799
808
if (isa<BranchInst>(T) || isa<SwitchInst>(T))
800
809
Preds.push_back (B);
@@ -804,7 +813,7 @@ unsigned GVNSink::sinkBB(BasicBlock *BBEnd) {
804
813
if (Preds.size () < 2 )
805
814
return 0 ;
806
815
auto DFSOrder = [this ](const BasicBlock *BB1, const BasicBlock *BB2) {
807
- return this -> DT ->getNode (BB1) < this -> DT ->getNode (BB2);
816
+ return DT->getNode (BB1)-> getDFSNumIn () < DT->getNode (BB2)-> getDFSNumIn ( );
808
817
};
809
818
// Sort by DFSNumber to have a deterministic order.
810
819
llvm::sort (Preds, DFSOrder);
@@ -844,11 +853,12 @@ unsigned GVNSink::sinkBB(BasicBlock *BBEnd) {
844
853
auto C = Candidates.front ();
845
854
846
855
LLVM_DEBUG (dbgs () << " -- Sinking: " << C << " \n " );
856
+ DomTreeUpdater DTU (DT, DomTreeUpdater::UpdateStrategy::Eager);
847
857
BasicBlock *InsertBB = BBEnd;
848
858
if (C.Blocks .size () < NumOrigPreds) {
849
859
LLVM_DEBUG (dbgs () << " -- Splitting edge to " ;
850
860
BBEnd->printAsOperand (dbgs ()); dbgs () << " \n " );
851
- InsertBB = SplitBlockPredecessors (BBEnd, C.Blocks , " .gvnsink.split" );
861
+ InsertBB = SplitBlockPredecessors (BBEnd, C.Blocks , " .gvnsink.split" , &DTU );
852
862
if (!InsertBB) {
853
863
LLVM_DEBUG (dbgs () << " -- FAILED to split edge!\n " );
854
864
// Edge couldn't be split.
@@ -921,10 +931,11 @@ void GVNSink::sinkLastInstruction(ArrayRef<BasicBlock *> Blocks,
921
931
PreservedAnalyses GVNSinkPass::run (Function &F, FunctionAnalysisManager &AM) {
922
932
auto &DT = AM.getResult <DominatorTreeAnalysis>(F);
923
933
GVNSink G (&DT);
934
+ DT.updateDFSNumbers ();
924
935
if (!G.run (F))
925
936
return PreservedAnalyses::all ();
926
937
927
- // PHI nodes get inserted which haven't been added to the Dominator Tree.
928
- // FIXME: Update DominatorTree to account for sunk instructions.
929
- return PreservedAnalyses::none () ;
938
+ PreservedAnalyses PA;
939
+ PA. preserve <DominatorTreeAnalysis>();
940
+ return PA ;
930
941
}
0 commit comments