[llvm] r340914 - [NFC] Factor out guard utility methods into a separate file

Max Kazantsev via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 29 03:51:59 PDT 2018


Author: mkazantsev
Date: Wed Aug 29 03:51:59 2018
New Revision: 340914

URL: http://llvm.org/viewvc/llvm-project?rev=340914&view=rev
Log:
[NFC] Factor out guard utility methods into a separate file

This patch creates file GuardUtils which will contain logic for work with guards
that can be shared across different passes.

Differential Revision: https://reviews.llvm.org/D51151
Reviewed By: fedor.sergeev

Added:
    llvm/trunk/include/llvm/Transforms/Utils/GuardUtils.h
    llvm/trunk/lib/Transforms/Utils/GuardUtils.cpp
Modified:
    llvm/trunk/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp
    llvm/trunk/lib/Transforms/Utils/CMakeLists.txt

Added: llvm/trunk/include/llvm/Transforms/Utils/GuardUtils.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/GuardUtils.h?rev=340914&view=auto
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/GuardUtils.h (added)
+++ llvm/trunk/include/llvm/Transforms/Utils/GuardUtils.h Wed Aug 29 03:51:59 2018
@@ -0,0 +1,30 @@
+//===-- GuardUtils.h - Utils for work with guards ---------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// Utils that are used to perform transformations related to guards and their
+// conditions.
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_UTILS_GUARDUTILS_H
+#define LLVM_TRANSFORMS_UTILS_GUARDUTILS_H
+
+namespace llvm {
+
+class CallInst;
+class Function;
+
+/// Splits control flow at point of \p Guard, replacing it with explicit branch
+/// by the condition of guard's first argument. The taken branch then goes to
+/// the block that contains  \p Guard's successors, and the non-taken branch
+/// goes to a newly-created deopt block that contains a sole call of the
+/// deoptimize function \p DeoptIntrinsic.
+void makeGuardControlFlowExplicit(Function *DeoptIntrinsic, CallInst *Guard);
+
+} // llvm
+
+#endif // LLVM_TRANSFORMS_UTILS_GUARDUTILS_H

Modified: llvm/trunk/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp?rev=340914&r1=340913&r2=340914&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp Wed Aug 29 03:51:59 2018
@@ -17,23 +17,16 @@
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Function.h"
-#include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/InstIterator.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/Intrinsics.h"
-#include "llvm/IR/MDBuilder.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Pass.h"
 #include "llvm/Transforms/Scalar.h"
-#include "llvm/Transforms/Utils/BasicBlockUtils.h"
+#include "llvm/Transforms/Utils/GuardUtils.h"
 
 using namespace llvm;
 
-static cl::opt<uint32_t> PredicatePassBranchWeight(
-    "guards-predicate-pass-branch-weight", cl::Hidden, cl::init(1 << 20),
-    cl::desc("The probability of a guard failing is assumed to be the "
-             "reciprocal of this value (default = 1 << 20)"));
-
 namespace {
 struct LowerGuardIntrinsicLegacyPass : public FunctionPass {
   static char ID;
@@ -46,45 +39,6 @@ struct LowerGuardIntrinsicLegacyPass : p
 };
 }
 
-static void MakeGuardControlFlowExplicit(Function *DeoptIntrinsic,
-                                         CallInst *CI) {
-  OperandBundleDef DeoptOB(*CI->getOperandBundle(LLVMContext::OB_deopt));
-  SmallVector<Value *, 4> Args(std::next(CI->arg_begin()), CI->arg_end());
-
-  auto *CheckBB = CI->getParent();
-  auto *DeoptBlockTerm =
-      SplitBlockAndInsertIfThen(CI->getArgOperand(0), CI, true);
-
-  auto *CheckBI = cast<BranchInst>(CheckBB->getTerminator());
-
-  // SplitBlockAndInsertIfThen inserts control flow that branches to
-  // DeoptBlockTerm if the condition is true.  We want the opposite.
-  CheckBI->swapSuccessors();
-
-  CheckBI->getSuccessor(0)->setName("guarded");
-  CheckBI->getSuccessor(1)->setName("deopt");
-
-  if (auto *MD = CI->getMetadata(LLVMContext::MD_make_implicit))
-    CheckBI->setMetadata(LLVMContext::MD_make_implicit, MD);
-
-  MDBuilder MDB(CI->getContext());
-  CheckBI->setMetadata(LLVMContext::MD_prof,
-                       MDB.createBranchWeights(PredicatePassBranchWeight, 1));
-
-  IRBuilder<> B(DeoptBlockTerm);
-  auto *DeoptCall = B.CreateCall(DeoptIntrinsic, Args, {DeoptOB}, "");
-
-  if (DeoptIntrinsic->getReturnType()->isVoidTy()) {
-    B.CreateRetVoid();
-  } else {
-    DeoptCall->setName("deoptcall");
-    B.CreateRet(DeoptCall);
-  }
-
-  DeoptCall->setCallingConv(CI->getCallingConv());
-  DeoptBlockTerm->eraseFromParent();
-}
-
 static bool lowerGuardIntrinsic(Function &F) {
   // Check if we can cheaply rule out the possibility of not having any work to
   // do.
@@ -108,7 +62,7 @@ static bool lowerGuardIntrinsic(Function
   DeoptIntrinsic->setCallingConv(GuardDecl->getCallingConv());
 
   for (auto *CI : ToLower) {
-    MakeGuardControlFlowExplicit(DeoptIntrinsic, CI);
+    makeGuardControlFlowExplicit(DeoptIntrinsic, CI);
     CI->eraseFromParent();
   }
 

Modified: llvm/trunk/lib/Transforms/Utils/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CMakeLists.txt?rev=340914&r1=340913&r2=340914&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/CMakeLists.txt (original)
+++ llvm/trunk/lib/Transforms/Utils/CMakeLists.txt Wed Aug 29 03:51:59 2018
@@ -18,6 +18,7 @@ add_llvm_library(LLVMTransformUtils
   FunctionComparator.cpp
   FunctionImportUtils.cpp
   GlobalStatus.cpp
+  GuardUtils.cpp
   InlineFunction.cpp
   ImportedFunctionsInliningStatistics.cpp
   InstructionNamer.cpp

Added: llvm/trunk/lib/Transforms/Utils/GuardUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/GuardUtils.cpp?rev=340914&view=auto
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/GuardUtils.cpp (added)
+++ llvm/trunk/lib/Transforms/Utils/GuardUtils.cpp Wed Aug 29 03:51:59 2018
@@ -0,0 +1,64 @@
+//===-- GuardUtils.cpp - Utils for work with guards -------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// Utils that are used to perform transformations related to guards and their
+// conditions.
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Utils/GuardUtils.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/IRBuilder.h"
+#include "llvm/IR/MDBuilder.h"
+#include "llvm/Transforms/Utils/BasicBlockUtils.h"
+
+using namespace llvm;
+
+static cl::opt<uint32_t> PredicatePassBranchWeight(
+    "guards-predicate-pass-branch-weight", cl::Hidden, cl::init(1 << 20),
+    cl::desc("The probability of a guard failing is assumed to be the "
+             "reciprocal of this value (default = 1 << 20)"));
+
+void llvm::makeGuardControlFlowExplicit(Function *DeoptIntrinsic,
+                                        CallInst *Guard) {
+  OperandBundleDef DeoptOB(*Guard->getOperandBundle(LLVMContext::OB_deopt));
+  SmallVector<Value *, 4> Args(std::next(Guard->arg_begin()), Guard->arg_end());
+
+  auto *CheckBB = Guard->getParent();
+  auto *DeoptBlockTerm =
+      SplitBlockAndInsertIfThen(Guard->getArgOperand(0), Guard, true);
+
+  auto *CheckBI = cast<BranchInst>(CheckBB->getTerminator());
+
+  // SplitBlockAndInsertIfThen inserts control flow that branches to
+  // DeoptBlockTerm if the condition is true.  We want the opposite.
+  CheckBI->swapSuccessors();
+
+  CheckBI->getSuccessor(0)->setName("guarded");
+  CheckBI->getSuccessor(1)->setName("deopt");
+
+  if (auto *MD = Guard->getMetadata(LLVMContext::MD_make_implicit))
+    CheckBI->setMetadata(LLVMContext::MD_make_implicit, MD);
+
+  MDBuilder MDB(Guard->getContext());
+  CheckBI->setMetadata(LLVMContext::MD_prof,
+                       MDB.createBranchWeights(PredicatePassBranchWeight, 1));
+
+  IRBuilder<> B(DeoptBlockTerm);
+  auto *DeoptCall = B.CreateCall(DeoptIntrinsic, Args, {DeoptOB}, "");
+
+  if (DeoptIntrinsic->getReturnType()->isVoidTy()) {
+    B.CreateRetVoid();
+  } else {
+    DeoptCall->setName("deoptcall");
+    B.CreateRet(DeoptCall);
+  }
+
+  DeoptCall->setCallingConv(Guard->getCallingConv());
+  DeoptBlockTerm->eraseFromParent();
+}




More information about the llvm-commits mailing list