Skip to content

Commit

Permalink
[DAG] Change isGCValue detection for statepoint lowering
Browse files Browse the repository at this point in the history
isGCValue should detect whether the deopt value is a GC pointer.
Currently it checks by finding the value in SI.Bases and SI.Ptrs.
However these data structures contain only those values which
have corresponding gc.relocate call. So we can miss GC value if it
does not have gc.relocate call (dead after the call).

Check GC strategy whether pointer is GC one or consider any pointer
to be GC one conservatively.

Reviewers: reames, dantrushin
Reviewed By: reames
Subscribers: hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D77130
  • Loading branch information
Serguei Katkov committed Apr 3, 2020
1 parent fef2dab commit bd1d70b
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
Expand Up @@ -482,8 +482,14 @@ lowerStatepointMetaArgs(SmallVectorImpl<SDValue> &Ops,
const bool LiveInDeopt =
SI.StatepointFlags & (uint64_t)StatepointFlags::DeoptLiveIn;

auto isGCValue =[&](const Value *V) {
return is_contained(SI.Ptrs, V) || is_contained(SI.Bases, V);
auto isGCValue = [&](const Value *V) {
auto *Ty = V->getType();
if (!Ty->isPtrOrPtrVectorTy())
return false;
if (auto *GFI = Builder.GFI)
if (auto IsManaged = GFI->getStrategy().isGCManagedPointer(Ty))
return *IsManaged;
return true; // conservative
};

// Before we actually start lowering (and allocating spill slots for values),
Expand Down

0 comments on commit bd1d70b

Please sign in to comment.