From: Nikita Popov Date: Mon, 7 Nov 2022 16:22:14 +0000 (+0100) Subject: [PtrAuth] Use default attributes for some ptrauth intrinsics X-Git-Tag: upstream/17.0.6~24548 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce51cae7947e9e30320ac02e48ea954152309f6d;p=platform%2Fupstream%2Fllvm.git [PtrAuth] Use default attributes for some ptrauth intrinsics This uses the default intrinsic attributes (nofree, nosync, nocallback, willreturn) for a subset of the ptrauth intrinsics. Notably, this does not use them for auth and resign, because these intrinsics are specified to trap and as such are not willreturn. As far as I understood, the remaining intrinsics may not trap (or can only trap in cases where behavior is undefined). Differential Revision: https://reviews.llvm.org/D137557 --- diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td index 1d1447c..3a27a2a 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -2097,9 +2097,9 @@ def int_vector_extract : DefaultAttrsIntrinsic<[llvm_anyvector_ty], // Sign an unauthenticated pointer using the specified key and discriminator, // passed in that order. // Returns the first argument, with some known bits replaced with a signature. -def int_ptrauth_sign : Intrinsic<[llvm_i64_ty], - [llvm_i64_ty, llvm_i32_ty, llvm_i64_ty], - [IntrNoMem, ImmArg>]>; +def int_ptrauth_sign : + DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i64_ty], + [IntrNoMem, ImmArg>]>; // Authenticate a signed pointer, using the specified key and discriminator. // Returns the first argument, with the signature bits removed. @@ -2125,15 +2125,14 @@ def int_ptrauth_resign : Intrinsic<[llvm_i64_ty], // The second argument specifies the key. // This behaves like @llvm.ptrauth.auth, but doesn't require the signature to // be valid. -def int_ptrauth_strip : Intrinsic<[llvm_i64_ty], - [llvm_i64_ty, llvm_i32_ty], - [IntrNoMem, ImmArg>]>; +def int_ptrauth_strip : + DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty], + [IntrNoMem, ImmArg>]>; // Blend a small integer discriminator with an address discriminator, producing // a new discriminator value. -def int_ptrauth_blend : Intrinsic<[llvm_i64_ty], - [llvm_i64_ty, llvm_i64_ty], - [IntrNoMem]>; +def int_ptrauth_blend : + DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>; // Compute the signature of a value, using a given discriminator. // This differs from @llvm.ptrauth.sign in that it doesn't embed the computed @@ -2141,9 +2140,8 @@ def int_ptrauth_blend : Intrinsic<[llvm_i64_ty], // That allows it to be used to sign non-pointer data: in that sense, it is // generic. There is no generic @llvm.ptrauth.auth: instead, the signature // can be computed using @llvm.ptrauth.sign_generic, and compared with icmp. -def int_ptrauth_sign_generic : Intrinsic<[llvm_i64_ty], - [llvm_i64_ty, llvm_i64_ty], - [IntrNoMem]>; +def int_ptrauth_sign_generic : + DefaultAttrsIntrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty], [IntrNoMem]>; //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index e022a6f..af75fe1 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -456,7 +456,6 @@ bool llvm::wouldInstructionBeTriviallyDead(Instruction *I, case Intrinsic::wasm_trunc_unsigned: case Intrinsic::ptrauth_auth: case Intrinsic::ptrauth_resign: - case Intrinsic::ptrauth_sign: return true; default: return false;