diff options
| author | Petr Hosek <phosek@chromium.org> | 2019-09-10 06:25:13 +0000 | 
|---|---|---|
| committer | Petr Hosek <phosek@chromium.org> | 2019-09-10 06:25:13 +0000 | 
| commit | 7d1757aba808db3d42362176862fe4e60bf3840d (patch) | |
| tree | 3f807fbdabbcb05e68bff2e2f65acb9651543c4d /llvm/lib/Transforms/Utils | |
| parent | 0e533ca4bb82fee0b1c25853129a2f5f80dbf97b (diff) | |
| download | bcm5719-llvm-7d1757aba808db3d42362176862fe4e60bf3840d.tar.gz bcm5719-llvm-7d1757aba808db3d42362176862fe4e60bf3840d.zip  | |
Revert "clang-misexpect: Profile Guided Validation of Performance Annotations in LLVM"
This reverts commit r371484: this broke sanitizer-x86_64-linux-fast bot.
llvm-svn: 371488
Diffstat (limited to 'llvm/lib/Transforms/Utils')
| -rw-r--r-- | llvm/lib/Transforms/Utils/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/MisExpect.cpp | 177 | 
2 files changed, 0 insertions, 178 deletions
diff --git a/llvm/lib/Transforms/Utils/CMakeLists.txt b/llvm/lib/Transforms/Utils/CMakeLists.txt index 115f543a8ec..c232aa6223c 100644 --- a/llvm/lib/Transforms/Utils/CMakeLists.txt +++ b/llvm/lib/Transforms/Utils/CMakeLists.txt @@ -40,7 +40,6 @@ add_llvm_library(LLVMTransformUtils    LowerSwitch.cpp    Mem2Reg.cpp    MetaRenamer.cpp -  MisExpect.cpp    ModuleUtils.cpp    NameAnonGlobals.cpp    PredicateInfo.cpp diff --git a/llvm/lib/Transforms/Utils/MisExpect.cpp b/llvm/lib/Transforms/Utils/MisExpect.cpp deleted file mode 100644 index 26d3402bd27..00000000000 --- a/llvm/lib/Transforms/Utils/MisExpect.cpp +++ /dev/null @@ -1,177 +0,0 @@ -//===--- MisExpect.cpp - Check the use of llvm.expect with PGO data -------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This contains code to emit warnings for potentially incorrect usage of the -// llvm.expect intrinsic. This utility extracts the threshold values from -// metadata associated with the instrumented Branch or Switch instruction. The -// threshold values are then used to determine if a warning should be emmited. -// -// MisExpect metadata is generated when llvm.expect intrinsics are lowered see -// LowerExpectIntrinsic.cpp -// -//===----------------------------------------------------------------------===// - -#include "llvm/Transforms/Utils/MisExpect.h" -#include "llvm/ADT/Twine.h" -#include "llvm/Analysis/OptimizationRemarkEmitter.h" -#include "llvm/IR/Constants.h" -#include "llvm/IR/DiagnosticInfo.h" -#include "llvm/IR/Instruction.h" -#include "llvm/IR/Instructions.h" -#include "llvm/IR/LLVMContext.h" -#include "llvm/Support/BranchProbability.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/FormatVariadic.h" -#include <cstdint> -#include <functional> -#include <numeric> - -#define DEBUG_TYPE "misexpect" - -using namespace llvm; -using namespace misexpect; - -namespace llvm { - -// Command line option to enable/disable the warning when profile data suggests -// a mismatch with the use of the llvm.expect intrinsic -static cl::opt<bool> PGOWarnMisExpect( -    "pgo-warn-misexpect", cl::init(false), cl::Hidden, -    cl::desc("Use this option to turn on/off " -             "warnings about incorrect usage of llvm.expect intrinsics.")); - -} // namespace llvm - -namespace { - -Instruction *getOprndOrInst(Instruction *I) { -  assert(I != nullptr && "MisExpect target Instruction cannot be nullptr"); -  Instruction *Ret = nullptr; -  if (auto *B = dyn_cast<BranchInst>(I)) { -    Ret = dyn_cast<Instruction>(B->getCondition()); -  } -  // TODO: Find a way to resolve condition location for switches -  // Using the condition of the switch seems to often resolve to an earlier -  // point in the program, i.e. the calculation of the switch condition, rather -  // than the switches location in the source code. Thus, we should use the -  // instruction to get source code locations rather than the condition to -  // improve diagnostic output, such as the caret. If the same problem exists -  // for branch instructions, then we should remove this function and directly -  // use the instruction -  // -  // else if (auto S = dyn_cast<SwitchInst>(I)) { -  // Ret = I; -  //} -  return Ret ? Ret : I; -} - -void emitMisexpectDiagnostic(Instruction *I, LLVMContext &Ctx, -                             uint64_t ProfCount, uint64_t TotalCount) { -  double PercentageCorrect = (double)ProfCount / TotalCount; -  auto PerString = -      formatv("{0:P} ({1} / {2})", PercentageCorrect, ProfCount, TotalCount); -  auto RemStr = formatv( -      "Potential performance regression from use of the llvm.expect intrinsic: " -      "Annotation was correct on {0} of profiled executions.", -      PerString); -  Twine Msg(PerString); -  Instruction *Cond = getOprndOrInst(I); -  if (PGOWarnMisExpect) -    Ctx.diagnose(DiagnosticInfoMisExpect(Cond, Msg)); -  OptimizationRemarkEmitter ORE(I->getParent()->getParent()); -  ORE.emit(OptimizationRemark(DEBUG_TYPE, "misexpect", Cond) << RemStr.str()); -} - -} // namespace - -namespace llvm { -namespace misexpect { - -void verifyMisExpect(Instruction *I, const SmallVector<uint32_t, 4> &Weights, -                     LLVMContext &Ctx) { -  if (auto *MisExpectData = I->getMetadata(LLVMContext::MD_misexpect)) { -    auto *MisExpectDataName = dyn_cast<MDString>(MisExpectData->getOperand(0)); -    if (MisExpectDataName && -        MisExpectDataName->getString().equals("misexpect")) { -      LLVM_DEBUG(llvm::dbgs() << "------------------\n"); -      LLVM_DEBUG(llvm::dbgs() -                 << "Function: " << I->getFunction()->getName() << "\n"); -      LLVM_DEBUG(llvm::dbgs() << "Instruction: " << *I << ":\n"); -      LLVM_DEBUG(for (int Idx = 0, Size = Weights.size(); Idx < Size; ++Idx) { -        llvm::dbgs() << "Weights[" << Idx << "] = " << Weights[Idx] << "\n"; -      }); - -      // extract values from misexpect metadata -      const auto *IndexCint = -          mdconst::dyn_extract<ConstantInt>(MisExpectData->getOperand(1)); -      const auto *LikelyCInt = -          mdconst::dyn_extract<ConstantInt>(MisExpectData->getOperand(2)); -      const auto *UnlikelyCInt = -          mdconst::dyn_extract<ConstantInt>(MisExpectData->getOperand(3)); - -      if (!IndexCint || !LikelyCInt || !UnlikelyCInt) -        return; - -      const uint64_t Index = IndexCint->getZExtValue(); -      const uint64_t LikelyBranchWeight = LikelyCInt->getZExtValue(); -      const uint64_t UnlikelyBranchWeight = UnlikelyCInt->getZExtValue(); -      const uint64_t ProfileCount = Weights[Index]; -      const uint64_t CaseTotal = std::accumulate( -          Weights.begin(), Weights.end(), (uint64_t)0, std::plus<uint64_t>()); -      const uint64_t NumUnlikelyTargets = Weights.size() - 1; - -      const uint64_t TotalBranchWeight = -          LikelyBranchWeight + (UnlikelyBranchWeight * NumUnlikelyTargets); - -      const llvm::BranchProbability LikelyThreshold(LikelyBranchWeight, -                                                    TotalBranchWeight); -      uint64_t ScaledThreshold = LikelyThreshold.scale(CaseTotal); - -      LLVM_DEBUG(llvm::dbgs() -                 << "Unlikely Targets: " << NumUnlikelyTargets << ":\n"); -      LLVM_DEBUG(llvm::dbgs() << "Profile Count: " << ProfileCount << ":\n"); -      LLVM_DEBUG(llvm::dbgs() -                 << "Scaled Threshold: " << ScaledThreshold << ":\n"); -      LLVM_DEBUG(llvm::dbgs() << "------------------\n"); -      if (ProfileCount < ScaledThreshold) -        emitMisexpectDiagnostic(I, Ctx, ProfileCount, CaseTotal); -    } -  } -} - -void checkFrontendInstrumentation(Instruction &I) { -  if (auto *MD = I.getMetadata(LLVMContext::MD_prof)) { -    unsigned NOps = MD->getNumOperands(); - -    // Only emit misexpect diagnostics if at least 2 branch weights are present. -    // Less than 2 branch weights means that the profiling metadata is: -    //    1) incorrect/corrupted -    //    2) not branch weight metadata -    //    3) completely deterministic -    // In these cases we should not emit any diagnostic related to misexpect. -    if (NOps < 3) -      return; - -    // Operand 0 is a string tag "branch_weights" -    if (MDString *Tag = cast<MDString>(MD->getOperand(0))) { -      if (Tag->getString().equals("branch_weights")) { -        SmallVector<uint32_t, 4> RealWeights(NOps - 1); -        for (unsigned i = 1; i < NOps; i++) { -          ConstantInt *Value = -              mdconst::dyn_extract<ConstantInt>(MD->getOperand(i)); -          RealWeights[i - 1] = Value->getZExtValue(); -        } -        verifyMisExpect(&I, RealWeights, I.getContext()); -      } -    } -  } -} - -} // namespace misexpect -} // namespace llvm -#undef DEBUG_TYPE  | 

