003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/lib/Transforms/Scalar
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
lib
/
Transforms
/
Scalar
/
📁
..
📄
ADCE.cpp
(24.71 KB)
📄
AlignmentFromAssumptions.cpp
(15.9 KB)
📄
BDCE.cpp
(7.42 KB)
📄
CallSiteSplitting.cpp
(21.43 KB)
📄
ConstantHoisting.cpp
(38.95 KB)
📄
ConstantProp.cpp
(4.13 KB)
📄
CorrelatedValuePropagation.cpp
(32.36 KB)
📄
DCE.cpp
(6.84 KB)
📄
DeadStoreElimination.cpp
(91.51 KB)
📄
DivRemPairs.cpp
(15.01 KB)
📄
EarlyCSE.cpp
(57.05 KB)
📄
FlattenCFGPass.cpp
(2.74 KB)
📄
Float2Int.cpp
(18.19 KB)
📄
GVN.cpp
(100.11 KB)
📄
GVNHoist.cpp
(44.85 KB)
📄
GVNSink.cpp
(29.97 KB)
📄
GuardWidening.cpp
(32.36 KB)
📄
IVUsersPrinter.cpp
(839 B)
📄
IndVarSimplify.cpp
(113.49 KB)
📄
InductiveRangeCheckElimination.cpp
(72.96 KB)
📄
InferAddressSpaces.cpp
(44.22 KB)
📄
InstSimplifyPass.cpp
(5.39 KB)
📄
JumpThreading.cpp
(115.06 KB)
📄
LICM.cpp
(92.71 KB)
📄
LoopAccessAnalysisPrinter.cpp
(977 B)
📄
LoopDataPrefetch.cpp
(14.54 KB)
📄
LoopDeletion.cpp
(11.37 KB)
📄
LoopDistribute.cpp
(40.25 KB)
📄
LoopFuse.cpp
(68.6 KB)
📄
LoopIdiomRecognize.cpp
(69.09 KB)
📄
LoopInstSimplify.cpp
(9.38 KB)
📄
LoopInterchange.cpp
(60.65 KB)
📄
LoopLoadElimination.cpp
(26.71 KB)
📄
LoopPassManager.cpp
(4.02 KB)
📄
LoopPredication.cpp
(49.21 KB)
📄
LoopRerollPass.cpp
(58.54 KB)
📄
LoopRotation.cpp
(4.79 KB)
📄
LoopSimplifyCFG.cpp
(28.59 KB)
📄
LoopSink.cpp
(14.93 KB)
📄
LoopStrengthReduce.cpp
(216.88 KB)
📄
LoopUnrollAndJamPass.cpp
(21.07 KB)
📄
LoopUnrollPass.cpp
(60.73 KB)
📄
LoopUnswitch.cpp
(64.17 KB)
📄
LoopVersioningLICM.cpp
(23.65 KB)
📄
LowerAtomic.cpp
(5.12 KB)
📄
LowerConstantIntrinsics.cpp
(5.8 KB)
📄
LowerExpectIntrinsic.cpp
(15 KB)
📄
LowerGuardIntrinsic.cpp
(2.82 KB)
📄
LowerMatrixIntrinsics.cpp
(73.36 KB)
📄
LowerWidenableCondition.cpp
(2.75 KB)
📄
MakeGuardsExplicit.cpp
(3.83 KB)
📄
MemCpyOptimizer.cpp
(52.16 KB)
📄
MergeICmps.cpp
(35.61 KB)
📄
MergedLoadStoreMotion.cpp
(15.18 KB)
📄
NaryReassociate.cpp
(19.86 KB)
📄
NewGVN.cpp
(170.95 KB)
📄
PartiallyInlineLibCalls.cpp
(6.22 KB)
📄
PlaceSafepoints.cpp
(27.5 KB)
📄
Reassociate.cpp
(95.61 KB)
📄
Reg2Mem.cpp
(4.34 KB)
📄
RewriteStatepointsForGC.cpp
(116.35 KB)
📄
SCCP.cpp
(76.12 KB)
📄
SROA.cpp
(183.83 KB)
📄
Scalar.cpp
(10.08 KB)
📄
Scalarizer.cpp
(32.93 KB)
📄
SeparateConstOffsetFromGEP.cpp
(52.99 KB)
📄
SimpleLoopUnswitch.cpp
(124.57 KB)
📄
SimplifyCFGPass.cpp
(12.31 KB)
📄
Sink.cpp
(10.81 KB)
📄
SpeculateAroundPHIs.cpp
(35.69 KB)
📄
SpeculativeExecution.cpp
(11.54 KB)
📄
StraightLineStrengthReduce.cpp
(28.92 KB)
📄
StructurizeCFG.cpp
(32.49 KB)
📄
TailRecursionElimination.cpp
(34.9 KB)
📄
WarnMissedTransforms.cpp
(6.14 KB)
Editing: LowerConstantIntrinsics.cpp
//===- LowerConstantIntrinsics.cpp - Lower constant intrinsic calls -------===// // // 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 all remaining 'objectsize' 'is.constant' intrinsic calls // and provides constant propagation and basic CFG cleanup on the result. // //===----------------------------------------------------------------------===// #include "llvm/Transforms/Scalar/LowerConstantIntrinsics.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/IR/BasicBlock.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/PatternMatch.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/Support/Debug.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils/Local.h" using namespace llvm; using namespace llvm::PatternMatch; #define DEBUG_TYPE "lower-is-constant-intrinsic" STATISTIC(IsConstantIntrinsicsHandled, "Number of 'is.constant' intrinsic calls handled"); STATISTIC(ObjectSizeIntrinsicsHandled, "Number of 'objectsize' intrinsic calls handled"); static Value *lowerIsConstantIntrinsic(IntrinsicInst *II) { Value *Op = II->getOperand(0); return isa<Constant>(Op) ? ConstantInt::getTrue(II->getType()) : ConstantInt::getFalse(II->getType()); } static bool replaceConditionalBranchesOnConstant(Instruction *II, Value *NewValue) { bool HasDeadBlocks = false; SmallSetVector<Instruction *, 8> Worklist; replaceAndRecursivelySimplify(II, NewValue, nullptr, nullptr, nullptr, &Worklist); for (auto I : Worklist) { BranchInst *BI = dyn_cast<BranchInst>(I); if (!BI) continue; if (BI->isUnconditional()) continue; BasicBlock *Target, *Other; if (match(BI->getOperand(0), m_Zero())) { Target = BI->getSuccessor(1); Other = BI->getSuccessor(0); } else if (match(BI->getOperand(0), m_One())) { Target = BI->getSuccessor(0); Other = BI->getSuccessor(1); } else { Target = nullptr; Other = nullptr; } if (Target && Target != Other) { BasicBlock *Source = BI->getParent(); Other->removePredecessor(Source); BI->eraseFromParent(); BranchInst::Create(Target, Source); if (pred_begin(Other) == pred_end(Other)) HasDeadBlocks = true; } } return HasDeadBlocks; } static bool lowerConstantIntrinsics(Function &F, const TargetLibraryInfo *TLI) { bool HasDeadBlocks = false; const auto &DL = F.getParent()->getDataLayout(); SmallVector<WeakTrackingVH, 8> Worklist; ReversePostOrderTraversal<Function *> RPOT(&F); for (BasicBlock *BB : RPOT) { for (Instruction &I: *BB) { IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I); if (!II) continue; switch (II->getIntrinsicID()) { default: break; case Intrinsic::is_constant: case Intrinsic::objectsize: Worklist.push_back(WeakTrackingVH(&I)); break; } } } for (WeakTrackingVH &VH: Worklist) { // Items on the worklist can be mutated by earlier recursive replaces. // This can remove the intrinsic as dead (VH == null), but also replace // the intrinsic in place. if (!VH) continue; IntrinsicInst *II = dyn_cast<IntrinsicInst>(&*VH); if (!II) continue; Value *NewValue; switch (II->getIntrinsicID()) { default: continue; case Intrinsic::is_constant: NewValue = lowerIsConstantIntrinsic(II); IsConstantIntrinsicsHandled++; break; case Intrinsic::objectsize: NewValue = lowerObjectSizeCall(II, DL, TLI, true); ObjectSizeIntrinsicsHandled++; break; } HasDeadBlocks |= replaceConditionalBranchesOnConstant(II, NewValue); } if (HasDeadBlocks) removeUnreachableBlocks(F); return !Worklist.empty(); } PreservedAnalyses LowerConstantIntrinsicsPass::run(Function &F, FunctionAnalysisManager &AM) { if (lowerConstantIntrinsics(F, AM.getCachedResult<TargetLibraryAnalysis>(F))) { PreservedAnalyses PA; PA.preserve<GlobalsAA>(); return PA; } return PreservedAnalyses::all(); } namespace { /// Legacy pass for lowering is.constant intrinsics out of the IR. /// /// When this pass is run over a function it converts is.constant intrinsics /// into 'true' or 'false'. This complements the normal constant folding /// to 'true' as part of Instruction Simplify passes. class LowerConstantIntrinsics : public FunctionPass { public: static char ID; LowerConstantIntrinsics() : FunctionPass(ID) { initializeLowerConstantIntrinsicsPass(*PassRegistry::getPassRegistry()); } bool runOnFunction(Function &F) override { auto *TLIP = getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>(); const TargetLibraryInfo *TLI = TLIP ? &TLIP->getTLI(F) : nullptr; return lowerConstantIntrinsics(F, TLI); } void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addPreserved<GlobalsAAWrapperPass>(); } }; } // namespace char LowerConstantIntrinsics::ID = 0; INITIALIZE_PASS(LowerConstantIntrinsics, "lower-constant-intrinsics", "Lower constant intrinsics", false, false) FunctionPass *llvm::createLowerConstantIntrinsicsPass() { return new LowerConstantIntrinsics(); }
Upload File
Create Folder