diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -23575,8 +23575,10 @@ This intrinsic allows annotation of a pointer to an integer with arbitrary strings. This can be useful for special purpose optimizations that want to look -for these annotations. These have no other defined use; they are ignored by code -generation and optimization. +for these annotations. These have no other defined use; transformations preserve +annotations on a best-effort basis but are allowed to replace the intrinsic with +its first argument without breaking semantics and the intrinsic is completely +dropped during instruction selection. '``llvm.annotation.*``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -23611,10 +23613,12 @@ Semantics: """""""""" -This intrinsic allows annotations to be put on arbitrary expressions -with arbitrary strings. This can be useful for special purpose -optimizations that want to look for these annotations. These have no -other defined use; they are ignored by code generation and optimization. +This intrinsic allows annotations to be put on arbitrary expressions with +arbitrary strings. This can be useful for special purpose optimizations that +want to look for these annotations. These have no other defined use; +transformations preserve annotations on a best-effort basis but are allowed to +replace the intrinsic with its first argument without breaking semantics and the +intrinsic is completely dropped during instruction selection. '``llvm.codeview.annotation``' Intrinsic ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -7365,6 +7365,8 @@ Ops.push_back(II->getArgOperand(1)); return nullptr; case Intrinsic::start_loop_iterations: + case Intrinsic::annotation: + case Intrinsic::ptr_annotation: Ops.push_back(II->getArgOperand(0)); return nullptr; default: @@ -7816,8 +7818,10 @@ return getAddExpr(ClampedX, Y, SCEV::FlagNUW); } case Intrinsic::start_loop_iterations: - // A start_loop_iterations is just equivalent to the first operand for - // SCEV purposes. + case Intrinsic::annotation: + case Intrinsic::ptr_annotation: + // A start_loop_iterations or llvm.annotation or llvm.prt.annotation is + // just eqivalent to the first operand for SCEV purposes. return getSCEV(II->getArgOperand(0)); default: break; diff --git a/llvm/test/Analysis/ScalarEvolution/annotation-intrinsics.ll b/llvm/test/Analysis/ScalarEvolution/annotation-intrinsics.ll --- a/llvm/test/Analysis/ScalarEvolution/annotation-intrinsics.ll +++ b/llvm/test/Analysis/ScalarEvolution/annotation-intrinsics.ll @@ -8,7 +8,7 @@ ; CHECK-LABEL: 'annotation' ; CHECK-NEXT: Classifying expressions for: @annotation ; CHECK-NEXT: %1 = tail call i64 @llvm.annotation.i64(i64 %x, i8* null, i8* null, i32 0) -; CHECK-NEXT: --> %1 U: full-set S: full-set +; CHECK-NEXT: --> %x U: full-set S: full-set ; CHECK-NEXT: Determining loop execution counts for: @annotation ; %1 = tail call i64 @llvm.annotation.i64(i64 %x, i8* null, i8* null, i32 0) @@ -19,7 +19,7 @@ ; CHECK-LABEL: 'ptr_annotation' ; CHECK-NEXT: Classifying expressions for: @ptr_annotation ; CHECK-NEXT: %1 = call i8* @llvm.ptr.annotation.p0i8(i8* %x, i8* null, i8* null, i32 0, i8* null) -; CHECK-NEXT: --> %1 U: full-set S: full-set +; CHECK-NEXT: --> %x U: full-set S: full-set ; CHECK-NEXT: Determining loop execution counts for: @ptr_annotation ; %1 = call i8* @llvm.ptr.annotation.p0i8(i8* %x, i8* null, i8* null, i32 0, i8* null)