summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2008-06-11 19:18:20 +0000
committerEvan Cheng <evan.cheng@apple.com>2008-06-11 19:18:20 +0000
commit933c743042a55eae07b8c4554d0a227e4376a680 (patch)
treedbbd52e121819259b9f9853bc88fc310389e2a8f /llvm/lib/Transforms/Utils
parentf3c2902ead028a1afbf460387c3e5cdcfca6ab92 (diff)
downloadbcm5719-llvm-933c743042a55eae07b8c4554d0a227e4376a680.tar.gz
bcm5719-llvm-933c743042a55eae07b8c4554d0a227e4376a680.zip
For now, avoid generating FP select instructions in order to speculatively execute integer arithmetic instructions. FP selects are more likely to be expensive (even compared to branch on fcmp). This is not a wonderful solution but I rather err on the side of conservative.
This fixes the heapsort performance regressions. llvm-svn: 52224
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyCFG.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index c72806b9e2f..605855d1769 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -965,6 +965,12 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
if (BB1->size() != 2)
return false;
+ // Be conservative for now. FP select instruction can often be expensive.
+ Value *BrCond = BI->getCondition();
+ if (isa<Instruction>(BrCond) &&
+ cast<Instruction>(BrCond)->getOpcode() == Instruction::FCmp)
+ return false;
+
// If BB1 is actually on the false edge of the conditional branch, remember
// to swap the select operands later.
bool Invert = false;
@@ -1029,8 +1035,7 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
BasicBlock::iterator InsertPos = BI;
if (InsertPos != BIParent->begin())
--InsertPos;
- if (InsertPos->getOpcode() == Instruction::ICmp ||
- InsertPos->getOpcode() == Instruction::FCmp)
+ if (InsertPos == BrCond)
BIParent->getInstList().splice(InsertPos, BB1->getInstList(), I);
else
BIParent->getInstList().splice(BI, BB1->getInstList(), I);
@@ -1039,10 +1044,10 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
// false value is the previously determined FalseV.
SelectInst *SI;
if (Invert)
- SI = SelectInst::Create(BI->getCondition(), FalseV, I,
+ SI = SelectInst::Create(BrCond, FalseV, I,
FalseV->getName() + "." + I->getName(), BI);
else
- SI = SelectInst::Create(BI->getCondition(), I, FalseV,
+ SI = SelectInst::Create(BrCond, I, FalseV,
I->getName() + "." + FalseV->getName(), BI);
// Make the PHI node use the select for all incoming values for "then" and
OpenPOWER on IntegriCloud