[llvm-dev] Hoisting in the presence of volatile loads.
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Wed Dec 20 21:17:26 PST 2017
On 12/20/2017 03:49 PM, Alina Sbirlea via llvm-dev wrote:
> +Philip to get his input too.
> I've talked with George offline, and here's a summary:
>
> In D16875 <https://reviews.llvm.org/D16875>, the decision made was:
> "The LLVM spec is ambiguous about whether we can hoist a non-volatile
> load above a volatile load when the loads alias. It's probably best
> not to exploit this ambiguity at the moment by unconditionally
> allowing the motion of nonvolatile loads above volatile loads (and
> vice versa)"
> So the testcase: test/Analysis/MemorySSA/volatile-clobber.ll, is
> checking that a volatile load is the defining access of a load with
> which it may alias.
>
> Snippet:
> ; Ensuring that we don't automatically hoist nonvolatile loads around
> volatile
> ; loads
> ; CHECK-LABEL define void @volatile_only
> define void @volatile_only(i32* %arg1, i32* %arg2) {
> [...]
> ; MayAlias
> ; CHECK: 2 = MemoryDef(1)
> ; CHECK-NEXT: load volatile i32, i32* %arg1
> load volatile i32, i32* %arg1
> ; CHECK: MemoryUse(2)
> ; CHECK-NEXT: load i32, i32* %arg2
> load i32, i32* %arg2
> ret void
> }
>
> The testcase: test/Transforms/LICM/volatile-alias.ll checks the
> opposite, that we *do* hoist the non-volatile load. This is currently
> ensured by the AliasSetTracker.
>
>
> The conclusion I'm drawing is that right now AliasSetTracker and
> MemorySSA have different behaviors and replacing one with the either
> will naturally lead to different outcomes.
> So, how can I make progress here?
>
>
> I think it's reasonable in D40375 <https://reviews.llvm.org/D40375> to
> have pointerInvalidatedByLoopWithMSSA only check if the defining
> access is within the current loop or liveOnEntry, and rely on
> MemorySSA to either consider a volatile load a clobbering access or
> not. So, right now the LICM/volatile-alias.ll testcase will behave
> differently with MemorySSA enabled.
>
> A separate decision, is whether to update getLoadReorderability in
> MemorySSA to remove the restriction that loads should not alias. That
> would give the same behavior as the AliasSetTracker.
> George's recollection is that the reason MemorySSA didn't reorder
> aggressively is because it was untested at the time. Now that
> MemorySSA is used more widely, it may be a good time to revisit the
> initial decision?
I think that this is the right way to approach this: we should change
MemorySSA to be less conservative in this regard. LLVM's language
reference is pretty explicit about reordering volatile and non-volatile
operations:
> The optimizers must not change the number of volatile operations or
> change their order of execution relative to other volatile operations.
> The optimizers/may/change the order of volatile operations relative to
> non-volatile operations. This is not Java’s “volatile” and has no
> cross-thread synchronization behavior.
I see no reason to prevent this kind of reordering, even if the volatile
and non-volatile accesses might alias.
-Hal
>
> Thoughts?
>
>
> Thanks,
> Alina
>
>
> On Wed, Dec 20, 2017 at 11:50 AM, Krzysztof Parzyszek
> <kparzysz at codeaurora.org <mailto:kparzysz at codeaurora.org>> wrote:
>
> On 12/20/2017 1:37 PM, Sanjoy Das wrote:>
>
> Fwiw, I was under the impression that regular loads could *not* be
> reordered with volatile loads since we could have e.g.:
>
> int *normal = &global_variable;
> volatile int* ptr = 0;
> int k = *ptr; // segfaults, and the signal handler writes
> to *normal
> int value = *normal;
>
> and that we'd have to treat volatile loads and stores
> essentially as
> calls to unknown functions.
>
>
> For this to work, "normal" should be volatile as well.
>
> -Krzysztof
>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171220/e3a0552c/attachment-0001.html>
More information about the llvm-dev
mailing list