mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-01 13:37:55 +00:00
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:
parent
c344371854
commit
a62c302ddd
@ -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
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user