[llvm] 4e413e1 - [InstCombine] Temporarily do not drop volatile stores before unreachable
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 10 07:22:20 PDT 2020
> On Sep 10, 2020, at 10:18, Nikita Popov via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Nikita Popov
> Date: 2020-09-10T16:16:44+02:00
> New Revision: 4e413e16216d0c94ada2171f3c59e0a85f4fa4b6
>
> URL: https://github.com/llvm/llvm-project/commit/4e413e16216d0c94ada2171f3c59e0a85f4fa4b6
> DIFF: https://github.com/llvm/llvm-project/commit/4e413e16216d0c94ada2171f3c59e0a85f4fa4b6.diff
>
> LOG: [InstCombine] Temporarily do not drop volatile stores before unreachable
>
> See discussion in D87149. Dropping volatile stores here is legal
> per LLVM semantics, but causes issues for real code and may result
> in a change to LLVM volatile semantics. Temporarily treat volatile
> stores as "not guaranteed to transfer execution" in just this place,
> until this issue has been resolved.
>
> Added:
>
>
> Modified:
> llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
> llvm/test/Transforms/InstCombine/volatile_store.ll
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
> index 0ca256860c59..63ba7eb85c66 100644
> --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
> +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
> @@ -2805,6 +2805,14 @@ Instruction *InstCombinerImpl::visitUnreachableInst(UnreachableInst &I) {
> Instruction *Prev = I.getPrevNonDebugInstruction();
> if (Prev && !Prev->isEHPad() &&
> isGuaranteedToTransferExecutionToSuccessor(Prev)) {
> + // Temporarily disable removal of volatile stores preceding unreachable,
> + // pending a potential LangRef change permitting volatile stores to trap.
> + // TODO: Either remove this code, or properly integrate the check into
> + // isGuaranteedToTransferExecutionToSuccessor().
> + if (auto *SI = dyn_cast<StoreInst>(Prev))
> + if (SI->isVolatile())
> + return nullptr;
This misses atomics and volatile memcpy/memset and co. I think there’s a helper somewhere to check all of them
More information about the llvm-commits
mailing list