[LICM] Disallow sinking of unordered atomic loads into loops

Description

[LICM] Disallow sinking of unordered atomic loads into loops

Sinking of unordered atomic load into loop must be disallowed because it turns
a single load into multiple loads. The relevant section of the documentation
is: http://llvm.org/docs/Atomics.html#unordered, specifically the Notes for
Optimizers section. Here is the full text of this section:

Notes for optimizers
In terms of the optimizer, this prohibits any transformation that
transforms a single load into multiple loads
, transforms a store into
multiple stores, narrows a store, or stores a value which would not be
stored otherwise. Some examples of unsafe optimizations are narrowing
an assignment into a bitfield, rematerializing a load, and turning loads
and stores into a memcpy call. Reordering unordered operations is safe,
though, and optimizers should take advantage of that because unordered
operations are common in languages that need them.

Patch by Daniil Suchkov!

Reviewed By: reames
Differential Revision: https://reviews.llvm.org/D38392

Details

Committed
mkazantsevOct 11 2017, 12:26 AM
Reviewer
reames
Differential Revision
D38392: Disallow sinking of unordered atomic loads into loops
Parents
rL315437: [IRCE] Do not process empty safe ranges
Branches
Unknown
Tags
Unknown