Statepoint.cpp revision ebe69fe11e48d322045d5949c83283927a0d790b
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
19using namespace std;
20using namespace llvm;
21
22bool 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}
31bool 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}
38bool llvm::isStatepoint(const Value &inst) {
39  return isStatepoint(&inst);
40}
41
42bool 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}
50bool 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
59bool 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}
67bool 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