diff options
author | Evan Cheng <evan.cheng@apple.com> | 2012-01-07 03:02:36 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2012-01-07 03:02:36 +0000 |
commit | 977679d6034791fd48a344e5b990503ba50fc242 (patch) | |
tree | a53e7c18e92d71fe32a7df3f76f4231433bc08eb /lib/CodeGen/BranchFolding.cpp | |
parent | ccec74738d0fc34f4bc2ac6909324e62705f1c38 (diff) |
Added a late machine instruction copy propagation pass. This catches
opportunities that only present themselves after late optimizations
such as tail duplication .e.g.
## BB#1:
movl %eax, %ecx
movl %ecx, %eax
ret
The register allocator also leaves some of them around (due to false
dep between copies from phi-elimination, etc.)
This required some changes in codegen passes. Post-ra scheduler and the
pseudo-instruction expansion passes have been moved after branch folding
and tail merging. They were before branch folding before because it did
not always update block livein's. That's fixed now. The pass change makes
independently since we want to properly schedule instructions after
branch folding / tail duplication.
rdar://10428165
rdar://10640363
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147716 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/BranchFolding.cpp')
-rw-r--r-- | lib/CodeGen/BranchFolding.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp index 89894c37ee..29e8545030 100644 --- a/lib/CodeGen/BranchFolding.cpp +++ b/lib/CodeGen/BranchFolding.cpp @@ -180,7 +180,7 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF, TRI = tri; MMI = mmi; - RS = TRI->requiresRegisterScavenging(MF) ? new RegScavenger() : NULL; + RS = new RegScavenger(); // Fix CFG. The later algorithms expect it to be right. bool MadeChange = false; @@ -368,16 +368,14 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1, void BranchFolder::MaintainLiveIns(MachineBasicBlock *CurMBB, MachineBasicBlock *NewMBB) { - if (RS) { - RS->enterBasicBlock(CurMBB); - if (!CurMBB->empty()) - RS->forward(prior(CurMBB->end())); - BitVector RegsLiveAtExit(TRI->getNumRegs()); - RS->getRegsUsed(RegsLiveAtExit, false); - for (unsigned int i = 0, e = TRI->getNumRegs(); i != e; i++) - if (RegsLiveAtExit[i]) - NewMBB->addLiveIn(i); - } + RS->enterBasicBlock(CurMBB); + if (!CurMBB->empty()) + RS->forward(prior(CurMBB->end())); + BitVector RegsLiveAtExit(TRI->getNumRegs()); + RS->getRegsUsed(RegsLiveAtExit, false); + for (unsigned int i = 0, e = TRI->getNumRegs(); i != e; i++) + if (RegsLiveAtExit[i]) + NewMBB->addLiveIn(i); } /// ReplaceTailWithBranchTo - Delete the instruction OldInst and everything |