diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 17f4b39..e367b01 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -96,8 +96,9 @@ using namespace PatternMatch; cl::opt<bool> llvm::RequireAndPreserveDomTree( "simplifycfg-require-and-preserve-domtree", cl::Hidden, - cl::desc("Temorary development switch used to gradually uplift SimplifyCFG " - "into preserving DomTree,")); + cl::desc( + "Temporary development switch used to gradually uplift SimplifyCFG " + "into preserving DomTree,")); // Chosen as 2 so as to be cheap, but still to have enough power to fold // a select, so the "clamp" idiom (of a min followed by a max) will be caught. @@ -126,7 +127,7 @@ static cl::opt<bool> HoistLoadsStoresWithCondFaulting( static cl::opt<unsigned> HoistLoadsStoresWithCondFaultingThreshold( "hoist-loads-stores-with-cond-faulting-threshold", cl::Hidden, cl::init(6), - cl::desc("Control the maximal conditonal load/store that we are willing " + cl::desc("Control the maximal conditional load/store that we are willing " "to speculatively execute to eliminate conditional branch " "(default = 6)")); @@ -2153,12 +2154,9 @@ bool SimplifyCFGOpt::hoistSuccIdenticalTerminatorToSwitchOrIf( SelectInst *&SI = InsertedSelects[std::make_pair(BB1V, BB2V)]; if (!SI) { // Propagate fast-math-flags from phi node to its replacement select. - IRBuilder<>::FastMathFlagGuard FMFGuard(Builder); - if (isa<FPMathOperator>(PN)) - Builder.setFastMathFlags(PN.getFastMathFlags()); - - SI = cast<SelectInst>(Builder.CreateSelect( + SI = cast<SelectInst>(Builder.CreateSelectFMF( BI->getCondition(), BB1V, BB2V, + isa<FPMathOperator>(PN) ? &PN : nullptr, BB1V->getName() + "." + BB2V->getName(), BI)); } @@ -3898,16 +3896,14 @@ static bool foldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI, IRBuilder<NoFolder> Builder(DomBI); // Propagate fast-math-flags from phi nodes to replacement selects. - IRBuilder<>::FastMathFlagGuard FMFGuard(Builder); while (PHINode *PN = dyn_cast<PHINode>(BB->begin())) { - if (isa<FPMathOperator>(PN)) - Builder.setFastMathFlags(PN->getFastMathFlags()); - // Change the PHI node into a select instruction. Value *TrueVal = PN->getIncomingValueForBlock(IfTrue); Value *FalseVal = PN->getIncomingValueForBlock(IfFalse); - Value *Sel = Builder.CreateSelect(IfCond, TrueVal, FalseVal, "", DomBI); + Value *Sel = Builder.CreateSelectFMF(IfCond, TrueVal, FalseVal, + isa<FPMathOperator>(PN) ? PN : nullptr, + "", DomBI); PN->replaceAllUsesWith(Sel); Sel->takeName(PN); PN->eraseFromParent(); @@ -6531,8 +6527,8 @@ SwitchLookupTable::SwitchLookupTable( uint64_t Idx = (CaseVal->getValue() - Offset->getValue()).getLimitedValue(); TableContents[Idx] = CaseRes; - if (CaseRes != SingleValue) - SingleValue = nullptr; + if (SingleValue && !isa<PoisonValue>(CaseRes) && CaseRes != SingleValue) + SingleValue = isa<PoisonValue>(SingleValue) ? CaseRes : nullptr; } // Fill in any holes in the table with the default result. @@ -6545,7 +6541,10 @@ SwitchLookupTable::SwitchLookupTable( TableContents[I] = DefaultValue; } - if (DefaultValue != SingleValue) + // If the default value is poison, all the holes are poison. + bool DefaultValueIsPoison = isa<PoisonValue>(DefaultValue); + + if (DefaultValue != SingleValue && !DefaultValueIsPoison) SingleValue = nullptr; } @@ -6569,6 +6568,16 @@ SwitchLookupTable::SwitchLookupTable( // Check if there is the same distance between two consecutive values. for (uint64_t I = 0; I < TableSize; ++I) { ConstantInt *ConstVal = dyn_cast<ConstantInt>(TableContents[I]); + + if (!ConstVal && isa<PoisonValue>(TableContents[I])) { + // This is an poison, so it's (probably) a lookup table hole. + // To prevent any regressions from before we switched to using poison as + // the default value, holes will fall back to using the first value. + // This can be removed once we add proper handling for poisons in lookup + // tables. + ConstVal = dyn_cast<ConstantInt>(Values[0].second); + } + if (!ConstVal) { // This is an undef. We could deal with it, but undefs in lookup tables // are very seldom. It's probably not worth the additional complexity. @@ -7003,8 +7012,8 @@ static bool switchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, // If the table has holes but the default destination doesn't produce any // constant results, the lookup table entries corresponding to the holes will - // contain undefined values. - bool AllHolesAreUndefined = TableHasHoles && !HasDefaultResults; + // contain poison. + bool AllHolesArePoison = TableHasHoles && !HasDefaultResults; // If the default destination doesn't produce a constant result but is still // reachable, and the lookup table has holes, we need to use a mask to @@ -7012,7 +7021,7 @@ static bool switchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, // to the default case. // The mask is unnecessary if the table has holes but the default destination // is unreachable, as in that case the holes must also be unreachable. - bool NeedMask = AllHolesAreUndefined && DefaultIsReachable; + bool NeedMask = AllHolesArePoison && DefaultIsReachable; if (NeedMask) { // As an extra penalty for the validity test we require more cases. if (SI->getNumCases() < 4) // FIXME: Find best threshold value (benchmark). @@ -7157,9 +7166,11 @@ static bool switchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder, for (PHINode *PHI : PHIs) { const ResultListTy &ResultList = ResultLists[PHI]; + Type *ResultType = ResultList.begin()->second->getType(); + // Use any value to fill the lookup table holes. Constant *DV = - AllHolesAreUndefined ? ResultLists[PHI][0].second : DefaultResults[PHI]; + AllHolesArePoison ? PoisonValue::get(ResultType) : DefaultResults[PHI]; StringRef FuncName = Fn->getName(); SwitchLookupTable Table(Mod, TableSize, TableIndexOffset, ResultList, DV, DL, FuncName); |