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