OLD | NEW |
1 //===- CodeGenPrepare.cpp - Prepare a function for code generation --------===// | 1 //===- CodeGenPrepare.cpp - Prepare a function for code generation --------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This pass munges the code in the input function to better prepare it for | 10 // This pass munges the code in the input function to better prepare it for |
11 // SelectionDAG-based code generation. This works around limitations in it's | 11 // SelectionDAG-based code generation. This works around limitations in it's |
12 // basic-block-at-a-time approach. It should eventually be removed. | 12 // basic-block-at-a-time approach. It should eventually be removed. |
13 // | 13 // |
14 //===----------------------------------------------------------------------===// | 14 //===----------------------------------------------------------------------===// |
15 | 15 |
16 #define DEBUG_TYPE "codegenprepare" | 16 #define DEBUG_TYPE "codegenprepare" |
17 #include "llvm/Transforms/Scalar.h" | 17 #include "llvm/Transforms/Scalar.h" |
18 #include "llvm/ADT/DenseMap.h" | 18 #include "llvm/ADT/DenseMap.h" |
19 #include "llvm/ADT/SmallSet.h" | 19 #include "llvm/ADT/SmallSet.h" |
20 #include "llvm/ADT/Statistic.h" | 20 #include "llvm/ADT/Statistic.h" |
21 #include "llvm/ADT/ValueMap.h" | |
22 #include "llvm/Analysis/DominatorInternals.h" | 21 #include "llvm/Analysis/DominatorInternals.h" |
23 #include "llvm/Analysis/Dominators.h" | 22 #include "llvm/Analysis/Dominators.h" |
24 #include "llvm/Analysis/InstructionSimplify.h" | 23 #include "llvm/Analysis/InstructionSimplify.h" |
25 #include "llvm/Analysis/ProfileInfo.h" | 24 #include "llvm/Analysis/ProfileInfo.h" |
26 #include "llvm/Assembly/Writer.h" | 25 #include "llvm/Assembly/Writer.h" |
27 #include "llvm/IR/Constants.h" | 26 #include "llvm/IR/Constants.h" |
28 #include "llvm/IR/DataLayout.h" | 27 #include "llvm/IR/DataLayout.h" |
29 #include "llvm/IR/DerivedTypes.h" | 28 #include "llvm/IR/DerivedTypes.h" |
30 #include "llvm/IR/Function.h" | 29 #include "llvm/IR/Function.h" |
31 #include "llvm/IR/IRBuilder.h" | 30 #include "llvm/IR/IRBuilder.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 ProfileInfo *PFI; | 81 ProfileInfo *PFI; |
83 | 82 |
84 /// CurInstIterator - As we scan instructions optimizing them, this is the | 83 /// CurInstIterator - As we scan instructions optimizing them, this is the |
85 /// next instruction to optimize. Xforms that can invalidate this should | 84 /// next instruction to optimize. Xforms that can invalidate this should |
86 /// update it. | 85 /// update it. |
87 BasicBlock::iterator CurInstIterator; | 86 BasicBlock::iterator CurInstIterator; |
88 | 87 |
89 /// Keeps track of non-local addresses that have been sunk into a block. | 88 /// Keeps track of non-local addresses that have been sunk into a block. |
90 /// This allows us to avoid inserting duplicate code for blocks with | 89 /// This allows us to avoid inserting duplicate code for blocks with |
91 /// multiple load/stores of the same address. | 90 /// multiple load/stores of the same address. |
92 ValueMap<Value*, Value*> SunkAddrs; | 91 DenseMap<Value*, Value*> SunkAddrs; |
93 | 92 |
94 /// ModifiedDT - If CFG is modified in anyway, dominator tree may need to | 93 /// ModifiedDT - If CFG is modified in anyway, dominator tree may need to |
95 /// be updated. | 94 /// be updated. |
96 bool ModifiedDT; | 95 bool ModifiedDT; |
97 | 96 |
98 /// OptSize - True if optimizing for size. | 97 /// OptSize - True if optimizing for size. |
99 bool OptSize; | 98 bool OptSize; |
100 | 99 |
101 public: | 100 public: |
102 static char ID; // Pass identification, replacement for typeid | 101 static char ID; // Pass identification, replacement for typeid |
(...skipping 1544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1647 WeakVH IterHandle(CurInstIterator); | 1646 WeakVH IterHandle(CurInstIterator); |
1648 BasicBlock *BB = CurInstIterator->getParent(); | 1647 BasicBlock *BB = CurInstIterator->getParent(); |
1649 | 1648 |
1650 RecursivelyDeleteTriviallyDeadInstructions(Repl, TLInfo); | 1649 RecursivelyDeleteTriviallyDeadInstructions(Repl, TLInfo); |
1651 | 1650 |
1652 if (IterHandle != CurInstIterator) { | 1651 if (IterHandle != CurInstIterator) { |
1653 // If the iterator instruction was recursively deleted, start over at the | 1652 // If the iterator instruction was recursively deleted, start over at the |
1654 // start of the block. | 1653 // start of the block. |
1655 CurInstIterator = BB->begin(); | 1654 CurInstIterator = BB->begin(); |
1656 SunkAddrs.clear(); | 1655 SunkAddrs.clear(); |
| 1656 } else { |
| 1657 // This address is now available for reassignment, so erase the table |
| 1658 // entry; we don't want to match some completely different instruction. |
| 1659 SunkAddrs[Addr] = 0; |
1657 } | 1660 } |
1658 } | 1661 } |
1659 ++NumMemoryInsts; | 1662 ++NumMemoryInsts; |
1660 return true; | 1663 return true; |
1661 } | 1664 } |
1662 | 1665 |
1663 /// OptimizeInlineAsmInst - If there are any memory operands, use | 1666 /// OptimizeInlineAsmInst - If there are any memory operands, use |
1664 /// OptimizeMemoryInst to sink their address computing into the block when | 1667 /// OptimizeMemoryInst to sink their address computing into the block when |
1665 /// possible / profitable. | 1668 /// possible / profitable. |
1666 bool CodeGenPrepare::OptimizeInlineAsmInst(CallInst *CS) { | 1669 bool CodeGenPrepare::OptimizeInlineAsmInst(CallInst *CS) { |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2000 DVI->insertBefore(VI->getParent()->getFirstInsertionPt()); | 2003 DVI->insertBefore(VI->getParent()->getFirstInsertionPt()); |
2001 else | 2004 else |
2002 DVI->insertAfter(VI); | 2005 DVI->insertAfter(VI); |
2003 MadeChange = true; | 2006 MadeChange = true; |
2004 ++NumDbgValueMoved; | 2007 ++NumDbgValueMoved; |
2005 } | 2008 } |
2006 } | 2009 } |
2007 } | 2010 } |
2008 return MadeChange; | 2011 return MadeChange; |
2009 } | 2012 } |
OLD | NEW |