| //===- LowerWidenableCondition.cpp - Lower the guard intrinsic ---------------===// |
| // |
| // 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 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/InitializePasses.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(); |
| } |