diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-08-07 18:02:19 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-08-07 18:02:19 +0000 |
commit | 84ef6ba44394f983d985b02e328cbb2dd779e4b0 (patch) | |
tree | 812ee61ad1b74460235e7a09aafd4d7f8da79249 /lib/CodeGen/EarlyIfConversion.cpp | |
parent | 3f5d1a2396915ebff20ce4f5d668ee5c839d1d91 (diff) | |
download | external_llvm-84ef6ba44394f983d985b02e328cbb2dd779e4b0.zip external_llvm-84ef6ba44394f983d985b02e328cbb2dd779e4b0.tar.gz external_llvm-84ef6ba44394f983d985b02e328cbb2dd779e4b0.tar.bz2 |
Add trace accessor methods, implement primitive if-conversion heuristic.
Compare the critical paths of the two traces through an if-conversion
candidate. If the difference is larger than the branch brediction
penalty, reject the if-conversion. If would never pay.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161433 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/EarlyIfConversion.cpp')
-rw-r--r-- | lib/CodeGen/EarlyIfConversion.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/lib/CodeGen/EarlyIfConversion.cpp b/lib/CodeGen/EarlyIfConversion.cpp index e49b9d3..8adaa6d 100644 --- a/lib/CodeGen/EarlyIfConversion.cpp +++ b/lib/CodeGen/EarlyIfConversion.cpp @@ -601,10 +601,24 @@ void EarlyIfConverter::invalidateTraces() { bool EarlyIfConverter::shouldConvertIf() { if (!MinInstr) MinInstr = Traces->getEnsemble(MachineTraceMetrics::TS_MinInstrCount); - DEBUG({ - dbgs() << MinInstr->getTrace(IfConv.Head); - MinInstr->print(dbgs()); - }); + + // MCSchedModel doesn't yet provide a misprediction penalty. + unsigned MispredictPenalty = 10; + + // Compare the critical path through TBB and FBB. If the difference is + // greater than the branch misprediction penalty, it would never pay to + // if-convert. The triangle/diamond topology guarantees that these traces + // have the same head and tail, so they can be compared. + MachineTraceMetrics::Trace TBBTrace = MinInstr->getTrace(IfConv.TBB); + MachineTraceMetrics::Trace FBBTrace = MinInstr->getTrace(IfConv.FBB); + DEBUG(dbgs() << "TBB: " << TBBTrace << "FBB: " << FBBTrace); + unsigned TBBCrit = TBBTrace.getCriticalPath(); + unsigned FBBCrit = FBBTrace.getCriticalPath(); + unsigned ExtraCrit = TBBCrit > FBBCrit ? TBBCrit-FBBCrit : FBBCrit-TBBCrit; + if (ExtraCrit >= MispredictPenalty) { + DEBUG(dbgs() << "Critical path difference too large.\n"); + return false; + } return true; } |