mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[Intrinsics] Add a 'NoAlias' intrinsic property; annotate llvm.memcpy
Reviewers: jdoerfert Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D66158 llvm-svn: 368810
This commit is contained in:
parent
6deddc6db8
commit
a9fd1c29b8
@ -63,6 +63,12 @@ class NoCapture<int argNo> : IntrinsicProperty {
|
||||
int ArgNo = argNo;
|
||||
}
|
||||
|
||||
// NoAlias - The specified argument pointer is not aliasing other "noalias" pointer
|
||||
// arguments of the intrinsic wrt. the intrinsic scope.
|
||||
class NoAlias<int argNo> : IntrinsicProperty {
|
||||
int ArgNo = argNo;
|
||||
}
|
||||
|
||||
// Returned - The specified argument is always the return value of the
|
||||
// intrinsic.
|
||||
class Returned<int argNo> : IntrinsicProperty {
|
||||
@ -494,7 +500,7 @@ def int_memcpy : Intrinsic<[],
|
||||
[llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,
|
||||
llvm_i1_ty],
|
||||
[IntrArgMemOnly, IntrWillReturn, NoCapture<0>, NoCapture<1>,
|
||||
WriteOnly<0>, ReadOnly<1>, ImmArg<3>]>;
|
||||
NoAlias<0>, NoAlias<1>, WriteOnly<0>, ReadOnly<1>, ImmArg<3>]>;
|
||||
def int_memmove : Intrinsic<[],
|
||||
[llvm_anyptr_ty, llvm_anyptr_ty, llvm_anyint_ty,
|
||||
llvm_i1_ty],
|
||||
|
@ -28,7 +28,7 @@ define void @test2(i8* %p1, i8* %p2, i8* %p3) {
|
||||
}
|
||||
|
||||
; CHECK: declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1 immarg)
|
||||
; CHECK: declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1 immarg)
|
||||
; CHECK: declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg)
|
||||
; CHECK: declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i1 immarg)
|
||||
declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i32, i1)
|
||||
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly , i8* nocapture readonly, i64, i32, i1)
|
||||
|
@ -9,6 +9,7 @@ declare void @has_noaliases(i32* noalias %p, i32* %q)
|
||||
declare void @one_arg(i32)
|
||||
|
||||
@CG = constant i32 7
|
||||
@CG2 = constant i32 7
|
||||
@E = external global i8
|
||||
|
||||
define i32 @foo() noreturn {
|
||||
@ -78,7 +79,9 @@ define i32 @foo() noreturn {
|
||||
call void (float) bitcast (void (i32)* @one_arg to void (float)*)(float 0.0)
|
||||
|
||||
; CHECK: Write to read-only memory
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG2 to i8*), i64 1, i1 0)
|
||||
; CHECK: Unusual: noalias argument aliases another argument
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* @CG to i8*), i8* bitcast (i32* @CG to i8*), i64 1, i1 0)
|
||||
|
||||
; CHECK: Undefined behavior: Buffer overflow
|
||||
%wider = bitcast i8* %buf to i16*
|
||||
|
@ -141,6 +141,7 @@ struct CodeGenIntrinsic {
|
||||
|
||||
enum ArgAttribute {
|
||||
NoCapture,
|
||||
NoAlias,
|
||||
Returned,
|
||||
ReadOnly,
|
||||
WriteOnly,
|
||||
|
@ -733,6 +733,9 @@ CodeGenIntrinsic::CodeGenIntrinsic(Record *R) {
|
||||
else if (Property->isSubClassOf("NoCapture")) {
|
||||
unsigned ArgNo = Property->getValueAsInt("ArgNo");
|
||||
ArgumentAttributes.push_back(std::make_pair(ArgNo, NoCapture));
|
||||
} else if (Property->isSubClassOf("NoAlias")) {
|
||||
unsigned ArgNo = Property->getValueAsInt("ArgNo");
|
||||
ArgumentAttributes.push_back(std::make_pair(ArgNo, NoAlias));
|
||||
} else if (Property->isSubClassOf("Returned")) {
|
||||
unsigned ArgNo = Property->getValueAsInt("ArgNo");
|
||||
ArgumentAttributes.push_back(std::make_pair(ArgNo, Returned));
|
||||
|
@ -647,6 +647,12 @@ void IntrinsicEmitter::EmitAttributes(const CodeGenIntrinsicTable &Ints,
|
||||
OS << "Attribute::NoCapture";
|
||||
addComma = true;
|
||||
break;
|
||||
case CodeGenIntrinsic::NoAlias:
|
||||
if (addComma)
|
||||
OS << ",";
|
||||
OS << "Attribute::NoAlias";
|
||||
addComma = true;
|
||||
break;
|
||||
case CodeGenIntrinsic::Returned:
|
||||
if (addComma)
|
||||
OS << ",";
|
||||
|
Loading…
Reference in New Issue
Block a user