diff options
author | Evan Cheng <evan.cheng@apple.com> | 2010-05-29 00:06:36 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2010-05-29 00:06:36 +0000 |
commit | 82e0a1a1a81ad54452823a8eb1e8d743cf38f098 (patch) | |
tree | 05ad6626bc63c88491a72b876be059a20af5c91a /lib/CodeGen/MachineLICM.cpp | |
parent | 7c9a6e328407d681414aa66f3e80f92c3d35ad5c (diff) | |
download | llvm-82e0a1a1a81ad54452823a8eb1e8d743cf38f098.tar.gz llvm-82e0a1a1a81ad54452823a8eb1e8d743cf38f098.tar.bz2 llvm-82e0a1a1a81ad54452823a8eb1e8d743cf38f098.tar.xz |
Doh. Machine LICM is re-initializing the CSE map over and over. Patch by Anna Zaks. rdar://8037934.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105065 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineLICM.cpp')
-rw-r--r-- | lib/CodeGen/MachineLICM.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/CodeGen/MachineLICM.cpp b/lib/CodeGen/MachineLICM.cpp index 61206173e6..d9623ab45c 100644 --- a/lib/CodeGen/MachineLICM.cpp +++ b/lib/CodeGen/MachineLICM.cpp @@ -62,6 +62,7 @@ namespace { // State that is updated as we process loops bool Changed; // True if a loop is changed. + bool FirstInLoop; // True if it's the first LICM in the loop. MachineLoop *CurLoop; // The current loop we are working on. MachineBasicBlock *CurPreheader; // The preheader for CurLoop. @@ -207,7 +208,7 @@ bool MachineLICM::runOnMachineFunction(MachineFunction &MF) { else DEBUG(dbgs() << "******** Post-regalloc Machine LICM ********\n"); - Changed = false; + Changed = FirstInLoop = false; TM = &MF.getTarget(); TII = TM->getInstrInfo(); TRI = TM->getRegisterInfo(); @@ -244,6 +245,7 @@ bool MachineLICM::runOnMachineFunction(MachineFunction &MF) { // CSEMap is initialized for loop header when the first instruction is // being hoisted. MachineDomTreeNode *N = DT->getNode(CurLoop->getHeader()); + FirstInLoop = true; HoistRegion(N); CSEMap.clear(); } @@ -776,7 +778,10 @@ void MachineLICM::Hoist(MachineInstr *MI) { // If this is the first instruction being hoisted to the preheader, // initialize the CSE map with potential common expressions. - InitCSEMap(CurPreheader); + if (FirstInLoop) { + InitCSEMap(CurPreheader); + FirstInLoop = false; + } // Look for opportunity to CSE the hoisted instruction. unsigned Opcode = MI->getOpcode(); |