diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils')
| -rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/UnifyLoopExits.cpp | 6 | 
4 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 46f2903..a03cf6e 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -3416,7 +3416,11 @@ DIExpression *llvm::getExpressionForConstant(DIBuilder &DIB, const Constant &C,    // Create integer constant expression.    auto createIntegerExpression = [&DIB](const Constant &CV) -> DIExpression * {      const APInt &API = cast<ConstantInt>(&CV)->getValue(); -    std::optional<int64_t> InitIntOpt = API.trySExtValue(); +    std::optional<int64_t> InitIntOpt; +    if (API.getBitWidth() == 1) +      InitIntOpt = API.tryZExtValue(); +    else +      InitIntOpt = API.trySExtValue();      return InitIntOpt ? DIB.createConstantValueExpression(                              static_cast<uint64_t>(*InitIntOpt))                        : nullptr; diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 8be471b..6e60b94 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -992,9 +992,12 @@ BranchProbability llvm::getBranchProbability(BranchInst *B,    uint64_t Weight0, Weight1;    if (!extractBranchWeights(*B, Weight0, Weight1))      return BranchProbability::getUnknown(); +  uint64_t Denominator = Weight0 + Weight1; +  if (Denominator == 0) +    return BranchProbability::getUnknown();    if (!ForFirstTarget)      std::swap(Weight0, Weight1); -  return BranchProbability::getBranchProbability(Weight0, Weight0 + Weight1); +  return BranchProbability::getBranchProbability(Weight0, Denominator);  }  bool llvm::setBranchProbability(BranchInst *B, BranchProbability P, diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 6addcfa..cbc604e 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -5956,7 +5956,7 @@ bool SimplifyCFGOpt::turnSwitchRangeIntoICmp(SwitchInst *SI,    }    // Update weight for the newly-created conditional branch. -  if (hasBranchWeightMD(*SI)) { +  if (hasBranchWeightMD(*SI) && NewBI->isConditional()) {      SmallVector<uint64_t, 8> Weights;      getBranchWeights(SI, Weights);      if (Weights.size() == 1 + SI->getNumCases()) { diff --git a/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp b/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp index 94c5c170..e86ab13 100644 --- a/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp +++ b/llvm/lib/Transforms/Utils/UnifyLoopExits.cpp @@ -158,6 +158,7 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {    SmallVector<BasicBlock *, 8> CallBrTargetBlocksToFix;    // Redirect exiting edges through a control flow hub.    ControlFlowHub CHub; +  bool Changed = false;    for (unsigned I = 0; I < ExitingBlocks.size(); ++I) {      BasicBlock *BB = ExitingBlocks[I]; @@ -182,6 +183,10 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {          bool UpdatedLI = false;          BasicBlock *NewSucc =              SplitCallBrEdge(BB, Succ, J, &DTU, nullptr, &LI, &UpdatedLI); +        // SplitCallBrEdge modifies the CFG because it creates an intermediate +        // block. So we need to set the changed flag no matter what the +        // ControlFlowHub is going to do later. +        Changed = true;          // Even if CallBr and Succ do not have a common parent loop, we need to          // add the new target block to the parent loop of the current loop.          if (!UpdatedLI) @@ -207,6 +212,7 @@ static bool unifyLoopExits(DominatorTree &DT, LoopInfo &LI, Loop *L) {    bool ChangedCFG;    std::tie(LoopExitBlock, ChangedCFG) = CHub.finalize(        &DTU, GuardBlocks, "loop.exit", MaxBooleansInControlFlowHub.getValue()); +  ChangedCFG |= Changed;    if (!ChangedCFG)      return false;  | 
