blob: d45c1883ef9e6ac62df18bee74af61a70911d71c [file] [log] [blame]
Philip Reames1a1bdb22014-12-02 18:50:36 +00001//===-- 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"
Philip Reames1a1bdb22014-12-02 18:50:36 +000016#include "llvm/IR/Statepoint.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000017#include "llvm/Support/CommandLine.h"
Philip Reames1a1bdb22014-12-02 18:50:36 +000018
19using namespace std;
20using namespace llvm;
21
22bool llvm::isStatepoint(const ImmutableCallSite &CS) {
Igor Laevsky77f118f82015-02-19 11:02:11 +000023 if (!CS.getInstruction()) {
24 // This is not a call site
25 return false;
26 }
27
Philip Reames1a1bdb22014-12-02 18:50:36 +000028 const Function *F = CS.getCalledFunction();
29 return (F && F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint);
30}
Igor Laevsky77f118f82015-02-19 11:02:11 +000031bool llvm::isStatepoint(const Value *inst) {
Philip Reames1a1bdb22014-12-02 18:50:36 +000032 if (isa<InvokeInst>(inst) || isa<CallInst>(inst)) {
33 ImmutableCallSite CS(inst);
34 return isStatepoint(CS);
35 }
36 return false;
37}
Igor Laevsky77f118f82015-02-19 11:02:11 +000038bool llvm::isStatepoint(const Value &inst) {
Philip Reames1a1bdb22014-12-02 18:50:36 +000039 return isStatepoint(&inst);
40}
41
42bool llvm::isGCRelocate(const ImmutableCallSite &CS) {
Igor Laevsky77f118f82015-02-19 11:02:11 +000043 if (!CS.getInstruction()) {
44 // This is not a call site
45 return false;
46 }
47
Philip Reames1a1bdb22014-12-02 18:50:36 +000048 return isGCRelocate(CS.getInstruction());
49}
Igor Laevsky77f118f82015-02-19 11:02:11 +000050bool llvm::isGCRelocate(const Value *inst) {
Philip Reames1a1bdb22014-12-02 18:50:36 +000051 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) {
Igor Laevsky77f118f82015-02-19 11:02:11 +000060 if (!CS.getInstruction()) {
61 // This is not a call site
62 return false;
63 }
64
Philip Reames1a1bdb22014-12-02 18:50:36 +000065 return isGCResult(CS.getInstruction());
66}
Igor Laevsky77f118f82015-02-19 11:02:11 +000067bool llvm::isGCResult(const Value *inst) {
Philip Reameseafafa32014-12-04 17:27:58 +000068 if (const CallInst *call = dyn_cast<CallInst>(inst)) {
Philip Reames1a1bdb22014-12-02 18:50:36 +000069 if (Function *F = call->getCalledFunction()) {
Manuel Jacob4e4f60d2015-12-22 18:44:45 +000070 return F->getIntrinsicID() == Intrinsic::experimental_gc_result;
Philip Reames1a1bdb22014-12-02 18:50:36 +000071 }
72 }
73 return false;
74}