diff options
author | Dan Gohman <gohman@apple.com> | 2009-10-30 23:15:21 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-10-30 23:15:21 +0000 |
commit | 14af0e5b2284045a70c71231a4258862e911219d (patch) | |
tree | 3bc6efe871062f5adf985818ee63f42f8fa4099b | |
parent | 13f60e83d6add4d7159c322a7ccc1c36c26a115b (diff) | |
download | external_llvm-14af0e5b2284045a70c71231a4258862e911219d.zip external_llvm-14af0e5b2284045a70c71231a4258862e911219d.tar.gz external_llvm-14af0e5b2284045a70c71231a4258862e911219d.tar.bz2 |
Optimize around the fact that pred_iterator is slow: instead of sorting
PHI operands by the predecessor order, sort them by the order used by the
first PHI in the block. This is still suffucient to expose duplicates.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85634 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index e1741a0..672ed0a 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -10981,22 +10981,24 @@ Instruction *InstCombiner::visitPHINode(PHINode &PN) { } } - // Sort the PHI node operands to match the pred iterator order. This will - // help identical PHIs be eliminated by other passes. Other passes shouldn't - // depend on this for correctness however. - unsigned i = 0; - for (pred_iterator PI = pred_begin(PN.getParent()), - PE = pred_end(PN.getParent()); PI != PE; ++PI, ++i) - if (PN.getIncomingBlock(i) != *PI) { - unsigned j = PN.getBasicBlockIndex(*PI); - Value *VA = PN.getIncomingValue(i); + // If there are multiple PHIs, sort their operands so that they all list + // the blocks in the same order. This will help identical PHIs be eliminated + // by other passes. Other passes shouldn't depend on this for correctness + // however. + PHINode *FirstPN = cast<PHINode>(PN.getParent()->begin()); + if (&PN != FirstPN) + for (unsigned i = 0, e = FirstPN->getNumIncomingValues(); i != e; ++i) { BasicBlock *BBA = PN.getIncomingBlock(i); - Value *VB = PN.getIncomingValue(j); - BasicBlock *BBB = PN.getIncomingBlock(j); - PN.setIncomingBlock(i, BBB); - PN.setIncomingValue(i, VB); - PN.setIncomingBlock(j, BBA); - PN.setIncomingValue(j, VA); + BasicBlock *BBB = FirstPN->getIncomingBlock(i); + if (BBA != BBB) { + Value *VA = PN.getIncomingValue(i); + unsigned j = FirstPN->getBasicBlockIndex(BBA); + Value *VB = PN.getIncomingValue(j); + PN.setIncomingBlock(i, BBB); + PN.setIncomingValue(i, VB); + PN.setIncomingBlock(j, BBA); + PN.setIncomingValue(j, VA); + } } return 0; |