If -pass-remarks=loop-vectorize, atomic ops will be seen by
analyzeInterleaving(), even though canVectorizeMemory() == false. This
is because we are requesting extra analysis instead of bailing out.
In such a case, we end up with a Group in both Load- and StoreGroups,
and then we'll try to access freed memory when traversing LoadGroups after having had released the Group when iterating over StoreGroups.
The fix is to include mayWriteToMemory() when validating that two
instructions are the same kind of memory operation.
The root-cause of this problem is the fact that Interleaved Access Analysis is invoked as part of legality check ---- most likely because the original developer did not want to pass one extra arg to CostModel, etc., decided to keep InterleaveInfo in Legality class, and reviewers did not object to it. I'm currently working on a change set to address this architectural problem (i.e., optimization/cost model related work done in legal) by moving interleave access analysis outside of Legality.
Having said that, tightening "same kind of memory operation" check is a good thing to have even after the above mentioned refactoring is done.