add nocapture attribute to llvm.mem* intrinsics and have tblgen

parse them.  tblgen doesn't yet do anything with this info though.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62065 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-01-12 01:12:03 +00:00
parent c344371854
commit a62c302ddd
3 changed files with 29 additions and 16 deletions

View File

@ -51,6 +51,11 @@ def IntrWriteMem : IntrinsicProperty;
// Commutative - This intrinsic is commutative: X op Y == Y op X. // Commutative - This intrinsic is commutative: X op Y == Y op X.
def Commutative : IntrinsicProperty; def Commutative : IntrinsicProperty;
// NoCapture - The specified argument pointer is not captured by the intrinsic.
class NoCapture<int argNo> : IntrinsicProperty {
int ArgNo = argNo;
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Types used by intrinsics. // Types used by intrinsics.
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -199,17 +204,18 @@ def int_stackprotector : Intrinsic<[llvm_void_ty],
//===------------------- Standard C Library Intrinsics --------------------===// //===------------------- Standard C Library Intrinsics --------------------===//
// //
let Properties = [IntrWriteArgMem] in { def int_memcpy : Intrinsic<[llvm_void_ty],
def int_memcpy : Intrinsic<[llvm_void_ty], [llvm_ptr_ty, llvm_ptr_ty, llvm_anyint_ty,
[llvm_ptr_ty, llvm_ptr_ty, llvm_i32_ty],
llvm_anyint_ty, llvm_i32_ty]>; [IntrWriteArgMem, NoCapture<0>, NoCapture<1>]>;
def int_memmove : Intrinsic<[llvm_void_ty], def int_memmove : Intrinsic<[llvm_void_ty],
[llvm_ptr_ty, llvm_ptr_ty, [llvm_ptr_ty, llvm_ptr_ty, llvm_anyint_ty,
llvm_anyint_ty, llvm_i32_ty]>; llvm_i32_ty],
def int_memset : Intrinsic<[llvm_void_ty], [IntrWriteArgMem, NoCapture<0>, NoCapture<1>]>;
[llvm_ptr_ty, llvm_i8_ty, def int_memset : Intrinsic<[llvm_void_ty],
llvm_anyint_ty, llvm_i32_ty]>; [llvm_ptr_ty, llvm_i8_ty, llvm_anyint_ty,
} llvm_i32_ty],
[IntrWriteArgMem, NoCapture<0>]>;
// These functions do not actually read memory, but they are sensitive to the // These functions do not actually read memory, but they are sensitive to the
// rounding mode. This needs to be modelled separately; in the meantime // rounding mode. This needs to be modelled separately; in the meantime

View File

@ -63,14 +63,18 @@ namespace llvm {
NoMem, ReadArgMem, ReadMem, WriteArgMem, WriteMem NoMem, ReadArgMem, ReadMem, WriteArgMem, WriteMem
} ModRef; } ModRef;
// This is set to true if the intrinsic is overloaded by its argument /// This is set to true if the intrinsic is overloaded by its argument
// types. /// types.
bool isOverloaded; bool isOverloaded;
// isCommutative - True if the intrinsic is commutative. /// isCommutative - True if the intrinsic is commutative.
//
bool isCommutative; bool isCommutative;
enum ArgAttribute {
NoCapture
};
std::vector<std::pair<unsigned, ArgAttribute> > ArgumentAttributes;
CodeGenIntrinsic(Record *R); CodeGenIntrinsic(Record *R);
}; };

View File

@ -546,7 +546,10 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) {
ModRef = WriteMem; ModRef = WriteMem;
else if (Property->getName() == "Commutative") else if (Property->getName() == "Commutative")
isCommutative = true; isCommutative = true;
else else if (Property->isSubClassOf("NoCapture")) {
unsigned ArgNo = Property->getValueAsInt("ArgNo");
ArgumentAttributes.push_back(std::make_pair(ArgNo, NoCapture));
} else
assert(0 && "Unknown property!"); assert(0 && "Unknown property!");
} }
} }