diff options
author | Nikita Popov <npopov@redhat.com> | 2022-10-26 11:55:46 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2022-12-06 11:48:50 +0100 |
commit | 0b20c3034c9cef2c0fdbfdfba1d4dfa0761a014f (patch) | |
tree | b3eb79658764bbad1defd36877e26fda32faf4d7 /llvm/lib/Transforms/Utils/Local.cpp | |
parent | eaea4608e645e36962541f8fe03a8afc1139ed2a (diff) | |
download | llvm-0b20c3034c9cef2c0fdbfdfba1d4dfa0761a014f.zip llvm-0b20c3034c9cef2c0fdbfdfba1d4dfa0761a014f.tar.gz llvm-0b20c3034c9cef2c0fdbfdfba1d4dfa0761a014f.tar.bz2 |
[IR] Don't assume readnone/readonly intrinsics are willreturn
This removes our "temporary" hack to assume that readnone/readonly
intrinsics are also willreturn. An explicit willreturn annotation,
usually via default intrinsic attributes, is now required.
Differential Revision: https://reviews.llvm.org/D137630
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 819ad08..8be5b4b 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -58,6 +58,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" +#include "llvm/IR/IntrinsicsWebAssembly.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/MDBuilder.h" #include "llvm/IR/Metadata.h" @@ -444,8 +445,24 @@ bool llvm::wouldInstructionBeTriviallyDead(Instruction *I, if (isRemovableAlloc(CB, TLI)) return true; - if (!I->willReturn()) - return false; + if (!I->willReturn()) { + auto *II = dyn_cast<IntrinsicInst>(I); + if (!II) + return false; + + // TODO: These intrinsics are not safe to remove, because this may remove + // a well-defined trap. + switch (II->getIntrinsicID()) { + case Intrinsic::wasm_trunc_signed: + case Intrinsic::wasm_trunc_unsigned: + case Intrinsic::ptrauth_auth: + case Intrinsic::ptrauth_resign: + case Intrinsic::ptrauth_sign: + return true; + default: + return false; + } + } if (!I->mayHaveSideEffects()) return true; |