diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2019-01-31 09:10:17 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2019-01-31 09:10:17 +0000 |
commit | f392bc846faf9b77edc3ee98902811e3c23ad524 (patch) | |
tree | 21e67f078678ccd3d349b409b42ed974031954ec /llvm/lib/Transforms/Scalar | |
parent | ae29857d64ccefa22a69bcfee5115df30b762c4a (diff) | |
download | bcm5719-llvm-f392bc846faf9b77edc3ee98902811e3c23ad524.tar.gz bcm5719-llvm-f392bc846faf9b77edc3ee98902811e3c23ad524.zip |
Default lowering for experimental.widenable.condition
Introduces a pass that provides default lowering strategy for the
`experimental.widenable.condition` intrinsic, replacing all its uses with
`i1 true`.
Differential Revision: https://reviews.llvm.org/D56096
Reviewed By: reames
llvm-svn: 352739
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
-rw-r--r-- | llvm/lib/Transforms/Scalar/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/LowerWidenableCondition.cpp | 86 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/Scalar.cpp | 1 |
3 files changed, 88 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/CMakeLists.txt b/llvm/lib/Transforms/Scalar/CMakeLists.txt index e3548ce5cd0..9c33971ce0f 100644 --- a/llvm/lib/Transforms/Scalar/CMakeLists.txt +++ b/llvm/lib/Transforms/Scalar/CMakeLists.txt @@ -45,6 +45,7 @@ add_llvm_library(LLVMScalarOpts LowerAtomic.cpp LowerExpectIntrinsic.cpp LowerGuardIntrinsic.cpp + LowerWidenableCondition.cpp MakeGuardsExplicit.cpp MemCpyOptimizer.cpp MergeICmps.cpp diff --git a/llvm/lib/Transforms/Scalar/LowerWidenableCondition.cpp b/llvm/lib/Transforms/Scalar/LowerWidenableCondition.cpp new file mode 100644 index 00000000000..6a83d062b71 --- /dev/null +++ b/llvm/lib/Transforms/Scalar/LowerWidenableCondition.cpp @@ -0,0 +1,86 @@ +//===- LowerWidenableCondition.cpp - Lower the guard intrinsic ---------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This pass lowers the llvm.widenable.condition intrinsic to default value +// which is i1 true. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Transforms/Scalar/LowerWidenableCondition.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/Analysis/GuardUtils.h" +#include "llvm/IR/BasicBlock.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/InstIterator.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Intrinsics.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/PatternMatch.h" +#include "llvm/Pass.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/GuardUtils.h" + +using namespace llvm; + +namespace { +struct LowerWidenableConditionLegacyPass : public FunctionPass { + static char ID; + LowerWidenableConditionLegacyPass() : FunctionPass(ID) { + initializeLowerWidenableConditionLegacyPassPass( + *PassRegistry::getPassRegistry()); + } + + bool runOnFunction(Function &F) override; +}; +} + +static bool lowerWidenableCondition(Function &F) { + // Check if we can cheaply rule out the possibility of not having any work to + // do. + auto *WCDecl = F.getParent()->getFunction( + Intrinsic::getName(Intrinsic::experimental_widenable_condition)); + if (!WCDecl || WCDecl->use_empty()) + return false; + + using namespace llvm::PatternMatch; + SmallVector<CallInst *, 8> ToLower; + for (auto &I : instructions(F)) + if (match(&I, m_Intrinsic<Intrinsic::experimental_widenable_condition>())) + ToLower.push_back(cast<CallInst>(&I)); + + if (ToLower.empty()) + return false; + + for (auto *CI : ToLower) { + CI->replaceAllUsesWith(ConstantInt::getTrue(CI->getContext())); + CI->eraseFromParent(); + } + return true; +} + +bool LowerWidenableConditionLegacyPass::runOnFunction(Function &F) { + return lowerWidenableCondition(F); +} + +char LowerWidenableConditionLegacyPass::ID = 0; +INITIALIZE_PASS(LowerWidenableConditionLegacyPass, "lower-widenable-condition", + "Lower the widenable condition to default true value", false, + false) + +Pass *llvm::createLowerWidenableConditionPass() { + return new LowerWidenableConditionLegacyPass(); +} + +PreservedAnalyses LowerWidenableConditionPass::run(Function &F, + FunctionAnalysisManager &AM) { + if (lowerWidenableCondition(F)) + return PreservedAnalyses::none(); + + return PreservedAnalyses::all(); +} diff --git a/llvm/lib/Transforms/Scalar/Scalar.cpp b/llvm/lib/Transforms/Scalar/Scalar.cpp index f3577726f98..c91ffda6d98 100644 --- a/llvm/lib/Transforms/Scalar/Scalar.cpp +++ b/llvm/lib/Transforms/Scalar/Scalar.cpp @@ -80,6 +80,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) { initializeLowerAtomicLegacyPassPass(Registry); initializeLowerExpectIntrinsicPass(Registry); initializeLowerGuardIntrinsicLegacyPassPass(Registry); + initializeLowerWidenableConditionLegacyPassPass(Registry); initializeMemCpyOptLegacyPassPass(Registry); initializeMergeICmpsPass(Registry); initializeMergedLoadStoreMotionLegacyPassPass(Registry); |