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.
// 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;
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:
BBInfo &BBI = BBAnalysis[BB->getNumber()];
switch (BBI.Kind) {
case ICEarlyExit:
+ case ICEarlyExitFalse:
case ICTriangle:
case ICDiamond:
Candidates.push_back(&BBI);
/// 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()];
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;