diff options
author | Jun Bum Lim <junbuml@codeaurora.org> | 2017-02-02 15:12:34 +0000 |
---|---|---|
committer | Jun Bum Lim <junbuml@codeaurora.org> | 2017-02-02 15:12:34 +0000 |
commit | 180bc5a02170cf5cc943555c718b246380817a55 (patch) | |
tree | 439c0f41707efeb5aefd310aa27655b07e87fa53 /llvm/lib/Transforms | |
parent | ea89913839df777260e3b4cb69fa7ce5629a118f (diff) | |
download | bcm5719-llvm-180bc5a02170cf5cc943555c718b246380817a55.tar.gz bcm5719-llvm-180bc5a02170cf5cc943555c718b246380817a55.zip |
[JumpThread] Enhance finding partial redundant loads by continuing scanning single predecessor
Summary: While scanning predecessors to find an available loaded value, if the predecessor has a single predecessor, we can continue scanning through the single predecessor.
Reviewers: mcrosier, rengolin, reames, davidxl, haicheng
Reviewed By: rengolin
Subscribers: zzheng, llvm-commits
Differential Revision: https://reviews.llvm.org/D29200
llvm-svn: 293896
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/JumpThreading.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index e8e40330665..c463b1aaca6 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -982,10 +982,25 @@ bool JumpThreadingPass::SimplifyPartiallyRedundantLoad(LoadInst *LI) { // Scan the predecessor to see if the value is available in the pred. BBIt = PredBB->end(); - Value *PredAvailable = FindAvailableLoadedValue(LI, PredBB, BBIt, - DefMaxInstsToScan, - nullptr, - &IsLoadCSE); + unsigned NumScanedInst = 0; + Value *PredAvailable = + FindAvailableLoadedValue(LI, PredBB, BBIt, DefMaxInstsToScan, nullptr, + &IsLoadCSE, &NumScanedInst); + + // If PredBB has a single predecessor, continue scanning through the single + // precessor. + BasicBlock *SinglePredBB = PredBB; + while (!PredAvailable && SinglePredBB && BBIt == SinglePredBB->begin() && + NumScanedInst < DefMaxInstsToScan) { + SinglePredBB = SinglePredBB->getSinglePredecessor(); + if (SinglePredBB) { + BBIt = SinglePredBB->end(); + PredAvailable = FindAvailableLoadedValue( + LI, SinglePredBB, BBIt, (DefMaxInstsToScan - NumScanedInst), + nullptr, &IsLoadCSE, &NumScanedInst); + } + } + if (!PredAvailable) { OneUnavailablePred = PredBB; continue; |