diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-06-01 20:29:21 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-06-01 20:29:21 +0000 |
commit | 4dcf1e8582929d3cb1c5462538ce63779ff913d2 (patch) | |
tree | 961044b8f953ec2ce3e67a47a79f0abb052a1c43 /llvm/lib/CodeGen/IfConversion.cpp | |
parent | 4c89142466aa19a549bd9f62bf94f3a5dccd76f3 (diff) | |
download | bcm5719-llvm-4dcf1e8582929d3cb1c5462538ce63779ff913d2.tar.gz bcm5719-llvm-4dcf1e8582929d3cb1c5462538ce63779ff913d2.zip |
Correctly mark early-exit on the false path.
llvm-svn: 37387
Diffstat (limited to 'llvm/lib/CodeGen/IfConversion.cpp')
-rw-r--r-- | llvm/lib/CodeGen/IfConversion.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp index 77604dd8bcf..9efceb08e56 100644 --- a/llvm/lib/CodeGen/IfConversion.cpp +++ b/llvm/lib/CodeGen/IfConversion.cpp @@ -33,6 +33,7 @@ namespace { ICReAnalyze, // BB must be re-analyzed. ICNotClassfied, // BB data valid, but not classified. ICEarlyExit, // BB is entry of an early-exit sub-CFG. + ICEarlyExitFalse,// Same as ICEarlyExit, but on the false path. ICTriangle, // BB is entry of a triangle sub-CFG. ICDiamond, // BB is entry of a diamond sub-CFG. ICChild, // BB is part of the sub-CFG that'll be predicated. @@ -151,6 +152,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) { // One or more of 'childrean' have been modified, abort! break; case ICEarlyExit: + case ICEarlyExitFalse: DOUT << "Ifcvt (Early exit): BB#" << BBI.BB->getNumber() << "\n"; Change |= IfConvertEarlyExit(BBI); break; @@ -239,7 +241,7 @@ void IfConverter::StructuralAnalysis(MachineBasicBlock *BB) { TrueBBI.Kind = ICChild; } else if (!(TrueBBI.hasEarlyExit && TrueNumPreds <= 1) && (FalseBBI.hasEarlyExit && FalseNumPreds <=1)) { - BBI.Kind = ICEarlyExit; + BBI.Kind = ICEarlyExitFalse; FalseBBI.Kind = ICChild; } else if (TrueBBI.TrueBB && TrueBBI.TrueBB == BBI.FalseBB) { // Triangle: @@ -335,6 +337,7 @@ bool IfConverter::AnalyzeBlocks(MachineFunction &MF, BBInfo &BBI = BBAnalysis[BB->getNumber()]; switch (BBI.Kind) { case ICEarlyExit: + case ICEarlyExitFalse: case ICTriangle: case ICDiamond: Candidates.push_back(&BBI); @@ -406,6 +409,8 @@ static void InsertUncondBranch(MachineBasicBlock *BB, MachineBasicBlock *ToBB, /// IfConvertEarlyExit - If convert a early exit sub-CFG. /// bool IfConverter::IfConvertEarlyExit(BBInfo &BBI) { + bool ReverseCond = BBI.Kind == ICEarlyExitFalse; + BBI.Kind = ICNotClassfied; BBInfo &TrueBBI = BBAnalysis[BBI.TrueBB->getNumber()]; @@ -413,15 +418,11 @@ bool IfConverter::IfConvertEarlyExit(BBInfo &BBI) { BBInfo *CvtBBI = &TrueBBI; BBInfo *NextBBI = &FalseBBI; - bool ReserveCond = false; - if (TrueBBI.Kind != ICChild) { - std::swap(CvtBBI, NextBBI); - ReserveCond = true; - } - std::vector<MachineOperand> NewCond(BBI.BrCond); - if (ReserveCond) + if (ReverseCond) { + std::swap(CvtBBI, NextBBI); TII->ReverseBranchCondition(NewCond); + } FeasibilityAnalysis(*CvtBBI, NewCond); if (!CvtBBI->isPredicable) return false; |