mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[SimplifyCFG] Teach mergeConditionalStoreToAddress() to preserve DomTree
This commit is contained in:
parent
78add592bc
commit
e0ffb58a76
@ -3238,12 +3238,10 @@ static Value *ensureValueAvailableInSuccessor(Value *V, BasicBlock *BB,
|
||||
return PHI;
|
||||
}
|
||||
|
||||
static bool mergeConditionalStoreToAddress(BasicBlock *PTB, BasicBlock *PFB,
|
||||
BasicBlock *QTB, BasicBlock *QFB,
|
||||
BasicBlock *PostBB, Value *Address,
|
||||
bool InvertPCond, bool InvertQCond,
|
||||
const DataLayout &DL,
|
||||
const TargetTransformInfo &TTI) {
|
||||
static bool mergeConditionalStoreToAddress(
|
||||
BasicBlock *PTB, BasicBlock *PFB, BasicBlock *QTB, BasicBlock *QFB,
|
||||
BasicBlock *PostBB, Value *Address, bool InvertPCond, bool InvertQCond,
|
||||
DomTreeUpdater *DTU, const DataLayout &DL, const TargetTransformInfo &TTI) {
|
||||
// For every pointer, there must be exactly two stores, one coming from
|
||||
// PTB or PFB, and the other from QTB or QFB. We don't support more than one
|
||||
// store (to any address) in PTB,PFB or QTB,QFB.
|
||||
@ -3332,8 +3330,9 @@ static bool mergeConditionalStoreToAddress(BasicBlock *PTB, BasicBlock *PFB,
|
||||
// If QTB does not exist, then QFB's only predecessor has a conditional
|
||||
// branch to QFB and PostBB.
|
||||
BasicBlock *TruePred = QTB ? QTB : QFB->getSinglePredecessor();
|
||||
BasicBlock *NewBB = SplitBlockPredecessors(PostBB, { QFB, TruePred},
|
||||
"condstore.split");
|
||||
BasicBlock *NewBB =
|
||||
SplitBlockPredecessors(PostBB, {QFB, TruePred}, "condstore.split",
|
||||
DTU ? &DTU->getDomTree() : nullptr);
|
||||
if (!NewBB)
|
||||
return false;
|
||||
PostBB = NewBB;
|
||||
@ -3362,8 +3361,9 @@ static bool mergeConditionalStoreToAddress(BasicBlock *PTB, BasicBlock *PFB,
|
||||
QPred = QB.CreateNot(QPred);
|
||||
Value *CombinedPred = QB.CreateOr(PPred, QPred);
|
||||
|
||||
auto *T =
|
||||
SplitBlockAndInsertIfThen(CombinedPred, &*QB.GetInsertPoint(), false);
|
||||
auto *T = SplitBlockAndInsertIfThen(
|
||||
CombinedPred, &*QB.GetInsertPoint(), /*Unreachable=*/false,
|
||||
/*BranchWeights=*/nullptr, DTU ? &DTU->getDomTree() : nullptr);
|
||||
QB.SetInsertPoint(T);
|
||||
StoreInst *SI = cast<StoreInst>(QB.CreateStore(QPHI, Address));
|
||||
AAMDNodes AAMD;
|
||||
@ -3383,7 +3383,7 @@ static bool mergeConditionalStoreToAddress(BasicBlock *PTB, BasicBlock *PFB,
|
||||
}
|
||||
|
||||
static bool mergeConditionalStores(BranchInst *PBI, BranchInst *QBI,
|
||||
const DataLayout &DL,
|
||||
DomTreeUpdater *DTU, const DataLayout &DL,
|
||||
const TargetTransformInfo &TTI) {
|
||||
// The intention here is to find diamonds or triangles (see below) where each
|
||||
// conditional block contains a store to the same address. Both of these
|
||||
@ -3485,12 +3485,12 @@ static bool mergeConditionalStores(BranchInst *PBI, BranchInst *QBI,
|
||||
|
||||
bool Changed = false;
|
||||
for (auto *Address : CommonAddresses)
|
||||
Changed |= mergeConditionalStoreToAddress(
|
||||
PTB, PFB, QTB, QFB, PostBB, Address, InvertPCond, InvertQCond, DL, TTI);
|
||||
Changed |=
|
||||
mergeConditionalStoreToAddress(PTB, PFB, QTB, QFB, PostBB, Address,
|
||||
InvertPCond, InvertQCond, DTU, DL, TTI);
|
||||
return Changed;
|
||||
}
|
||||
|
||||
|
||||
/// If the previous block ended with a widenable branch, determine if reusing
|
||||
/// the target block is profitable and legal. This will have the effect of
|
||||
/// "widening" PBI, but doesn't require us to reason about hosting safety.
|
||||
@ -3536,6 +3536,7 @@ static bool tryWidenCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI) {
|
||||
/// that PBI and BI are both conditional branches, and BI is in one of the
|
||||
/// successor blocks of PBI - PBI branches to BI.
|
||||
static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI,
|
||||
DomTreeUpdater *DTU,
|
||||
const DataLayout &DL,
|
||||
const TargetTransformInfo &TTI) {
|
||||
assert(PBI->isConditional() && BI->isConditional());
|
||||
@ -3599,7 +3600,7 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI,
|
||||
// If both branches are conditional and both contain stores to the same
|
||||
// address, remove the stores from the conditionals and create a conditional
|
||||
// merged store at the end.
|
||||
if (MergeCondStores && mergeConditionalStores(PBI, BI, DL, TTI))
|
||||
if (MergeCondStores && mergeConditionalStores(PBI, BI, DTU, DL, TTI))
|
||||
return true;
|
||||
|
||||
// If this is a conditional branch in an empty block, and if any
|
||||
@ -6347,7 +6348,7 @@ bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) {
|
||||
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
||||
if (BranchInst *PBI = dyn_cast<BranchInst>((*PI)->getTerminator()))
|
||||
if (PBI != BI && PBI->isConditional())
|
||||
if (SimplifyCondBranchToCondBranch(PBI, BI, DL, TTI))
|
||||
if (SimplifyCondBranchToCondBranch(PBI, BI, DTU, DL, TTI))
|
||||
return requestResimplify();
|
||||
|
||||
// Look for diamond patterns.
|
||||
@ -6355,7 +6356,7 @@ bool SimplifyCFGOpt::simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder) {
|
||||
if (BasicBlock *PrevBB = allPredecessorsComeFromSameSource(BB))
|
||||
if (BranchInst *PBI = dyn_cast<BranchInst>(PrevBB->getTerminator()))
|
||||
if (PBI != BI && PBI->isConditional())
|
||||
if (mergeConditionalStores(PBI, BI, DL, TTI))
|
||||
if (mergeConditionalStores(PBI, BI, DTU, DL, TTI))
|
||||
return requestResimplify();
|
||||
|
||||
return false;
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -S < %s -simplifycfg -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=1 | FileCheck %s
|
||||
; RUN: opt -S < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=1 | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||
target triple = "armv7--linux-gnueabihf"
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -simplifycfg -instcombine < %s -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=2 -S | FileCheck %s
|
||||
; RUN: opt -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -instcombine < %s -simplifycfg-merge-cond-stores=true -simplifycfg-merge-cond-stores-aggressively=false -phi-node-folding-threshold=2 -S | FileCheck %s
|
||||
|
||||
; This test should succeed and end up if-converted.
|
||||
define void @test_simple(i32* %p, i32 %a, i32 %b) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -simplifycfg -S < %s | FileCheck %s
|
||||
; RUN: opt -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s
|
||||
|
||||
%struct.Counters = type { i64, i64, i64, [8 x i8] }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user