diff options
author | Serguei Katkov <serguei.katkov@azul.com> | 2020-08-14 12:00:09 +0700 |
---|---|---|
committer | Serguei Katkov <serguei.katkov@azul.com> | 2020-08-22 01:36:22 +0700 |
commit | 9e362bb0eb52732cd9224d02bb7ce613bb47c1fc (patch) | |
tree | 32dbf6e2b9d00e8e8d9c8444cc83a2ead835f997 /llvm/lib/IR/Instructions.cpp | |
parent | cf6adecd6a8718ee2737ca55e4cd938364b984cc (diff) | |
download | llvm-9e362bb0eb52732cd9224d02bb7ce613bb47c1fc.zip llvm-9e362bb0eb52732cd9224d02bb7ce613bb47c1fc.tar.gz llvm-9e362bb0eb52732cd9224d02bb7ce613bb47c1fc.tar.bz2 |
[InstCombine] Remove unused entries in gc-live bundle of statepoint
If some of gc live value are not used in gc.relocate we can remove them
from gc-live bundle of statepoint instruction.
Also the CL removes duplicated Values in gc-live bundle.
Reviewers: reames, dantrushin
Reviewed By: dantrushin
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D85959
Diffstat (limited to 'llvm/lib/IR/Instructions.cpp')
-rw-r--r-- | llvm/lib/IR/Instructions.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 7a3fbc36..763b1f5 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -515,6 +515,18 @@ CallInst *CallInst::Create(CallInst *CI, ArrayRef<OperandBundleDef> OpB, return NewCI; } +CallInst *CallInst::CreateWithReplacedBundle(CallInst *CI, OperandBundleDef OpB, + Instruction *InsertPt) { + SmallVector<OperandBundleDef, 2> OpDefs; + for (unsigned i = 0, e = CI->getNumOperandBundles(); i < e; ++i) { + auto ChildOB = CI->getOperandBundleAt(i); + if (ChildOB.getTagName() != OpB.getTag()) + OpDefs.emplace_back(ChildOB); + } + OpDefs.emplace_back(OpB); + return CallInst::Create(CI, OpDefs, InsertPt); +} + // Update profile weight for call instruction by scaling it using the ratio // of S/T. The meaning of "branch_weights" meta data for call instruction is // transfered to represent call count. @@ -826,6 +838,18 @@ InvokeInst *InvokeInst::Create(InvokeInst *II, ArrayRef<OperandBundleDef> OpB, return NewII; } +InvokeInst *InvokeInst::CreateWithReplacedBundle(InvokeInst *II, + OperandBundleDef OpB, + Instruction *InsertPt) { + SmallVector<OperandBundleDef, 2> OpDefs; + for (unsigned i = 0, e = II->getNumOperandBundles(); i < e; ++i) { + auto ChildOB = II->getOperandBundleAt(i); + if (ChildOB.getTagName() != OpB.getTag()) + OpDefs.emplace_back(ChildOB); + } + OpDefs.emplace_back(OpB); + return InvokeInst::Create(II, OpDefs, InsertPt); +} LandingPadInst *InvokeInst::getLandingPadInst() const { return cast<LandingPadInst>(getUnwindDest()->getFirstNonPHI()); |