[all-commits] [llvm/llvm-project] 53a51a: Revert "[MemCpyOpt] Make capture check during call...
Hans via All-commits
all-commits at lists.llvm.org
Tue Jan 18 08:42:41 PST 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 53a51acc361a6b20b23b032226b0a7b124465cf7
https://github.com/llvm/llvm-project/commit/53a51acc361a6b20b23b032226b0a7b124465cf7
Author: Hans Wennborg <hans at chromium.org>
Date: 2022-01-18 (Tue, 18 Jan 2022)
Changed paths:
M llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
M llvm/test/Transforms/MemCpyOpt/callslot.ll
M llvm/test/Transforms/MemCpyOpt/capturing-func.ll
Log Message:
-----------
Revert "[MemCpyOpt] Make capture check during call slot optimization more precise"
This casued a miscompile due to call slot optimization replacing a call
argument without considering the call's !noalias metadata, see discussion on
the code review.
> Call slot optimization is currently supposed to be prevented if
> the call can capture the source pointer. Due to an implementation
> bug, this check currently doesn't trigger if a bitcast of the source
> pointer is passed instead. I'm somewhat afraid of the fallout of
> fixing this bug (due to heavy reliance on call slot optimization
> in rust), so I'd like to strengthen the capture reasoning a bit first.
>
> In particular, I believe that the capture is fine as long as a)
> the call itself cannot depend on the pointer identity, because
> neither dest has been captured before/at nor src before the
> call and b) there is no potential use of the captured pointer
> before the lifetime of the source alloca ends, either due to
> lifetime.end or a return from a function. At that point the
> potentially captured pointer becomes dangling.
>
> Differential Revision: https://reviews.llvm.org/D115615
Also reverting the dependent commit:
> [MemCpyOpt] Look through pointer casts when checking capture
>
> The user scanning loop above looks through pointer casts, so we
> also need to strip pointer casts in the capture check. Previously
> the source was incorrectly considered not captured if a bitcast
> was passed to the call.
This reverts commit 487a34ed9d7d24a7b1fb388c8856c784a459b22b
and 00e6869463ae6023d0d48f30de8511d6d748b14f.
More information about the All-commits
mailing list