OSDN Git Service

[PM/AA] Fix *numerous* serious bugs in GlobalsModRef found by
authorChandler Carruth <chandlerc@gmail.com>
Wed, 15 Jul 2015 08:53:29 +0000 (08:53 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 15 Jul 2015 08:53:29 +0000 (08:53 +0000)
commit7d51923226a143084b6555a2db275f9c99025acc
tree3da37b0c2c66007db97b874949193808237d27cd
parenta01809966911a7614e877c0a7e08a5ab507e2f60
[PM/AA] Fix *numerous* serious bugs in GlobalsModRef found by
inspection.

While we want to handle calls specially in this code because they should
have been modeled by the call graph analysis that precedes it, we should
*not* be re-implementing the predicates for whether an instruction reads
or writes memory. Those are well defined already. Notably, at least the
following issues seem to be clearly missed before:
- Ordered atomic loads can "write" to memory by causing writes from other
  threads to become visible. Similarly for ordered atomic stores.
- AtomicRMW instructions quite obviously both read and write to memory.
- AtomicCmpXchg instructions also read and write to memory.
- Fences read and write to memory.
- Invokes of intrinsics or memory allocation functions.

I don't have any test cases, and I suspect this has never really come up
in the real world. But there is no reason why it wouldn't, and it makes
the code simpler to do this the right way.

While here, I've tried to make the loops significantly simpler as well
and added helpful comments as to what is going on.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242281 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/IPA/GlobalsModRef.cpp