1 //===-- IR/Statepoint.cpp -- gc.statepoint utilities ---  -----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/IR/Function.h"
14 #include "llvm/IR/Constant.h"
15 #include "llvm/IR/Constants.h"
16 #include "llvm/IR/Statepoint.h"
17 #include "llvm/Support/CommandLine.h"
18 
19 using namespace std;
20 using namespace llvm;
21 
isStatepoint(const ImmutableCallSite & CS)22 bool llvm::isStatepoint(const ImmutableCallSite &CS) {
23   if (!CS.getInstruction()) {
24     // This is not a call site
25     return false;
26   }
27 
28   const Function *F = CS.getCalledFunction();
29   return (F && F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint);
30 }
isStatepoint(const Value * inst)31 bool llvm::isStatepoint(const Value *inst) {
32   if (isa<InvokeInst>(inst) || isa<CallInst>(inst)) {
33     ImmutableCallSite CS(inst);
34     return isStatepoint(CS);
35   }
36   return false;
37 }
isStatepoint(const Value & inst)38 bool llvm::isStatepoint(const Value &inst) {
39   return isStatepoint(&inst);
40 }
41 
isGCRelocate(const ImmutableCallSite & CS)42 bool llvm::isGCRelocate(const ImmutableCallSite &CS) {
43   if (!CS.getInstruction()) {
44     // This is not a call site
45     return false;
46   }
47 
48   return isGCRelocate(CS.getInstruction());
49 }
isGCRelocate(const Value * inst)50 bool llvm::isGCRelocate(const Value *inst) {
51   if (const CallInst *call = dyn_cast<CallInst>(inst)) {
52     if (const Function *F = call->getCalledFunction()) {
53       return F->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
54     }
55   }
56   return false;
57 }
58 
isGCResult(const ImmutableCallSite & CS)59 bool llvm::isGCResult(const ImmutableCallSite &CS) {
60   if (!CS.getInstruction()) {
61     // This is not a call site
62     return false;
63   }
64 
65   return isGCResult(CS.getInstruction());
66 }
isGCResult(const Value * inst)67 bool llvm::isGCResult(const Value *inst) {
68   if (const CallInst *call = dyn_cast<CallInst>(inst)) {
69     if (Function *F = call->getCalledFunction()) {
70       return (F->getIntrinsicID() == Intrinsic::experimental_gc_result_int ||
71               F->getIntrinsicID() == Intrinsic::experimental_gc_result_float ||
72               F->getIntrinsicID() == Intrinsic::experimental_gc_result_ptr ||
73               F->getIntrinsicID() == Intrinsic::experimental_gc_result);
74     }
75   }
76   return false;
77 }
78