[CodeGen] Emit parallel_loop_access for each loop in the loop stack.

Summary:
Emit !llvm.mem.parallel_loop_access metadata for memory accesses even if the parallel loop is not the top on the loop stack.

Fixes llvm.org/PR37558.

Reviewers: ABataev, hfinkel, amusman, tyler.nowicki

Reviewed By: hfinkel

Subscribers: Meinersbur, hfinkel, cfe-commits

Differential Revision: https://reviews.llvm.org/D48808

llvm-svn: 338810
diff --git a/clang/lib/CodeGen/CGLoopInfo.cpp b/clang/lib/CodeGen/CGLoopInfo.cpp
index 09089bf..8f9a9b9 100644
--- a/clang/lib/CodeGen/CGLoopInfo.cpp
+++ b/clang/lib/CodeGen/CGLoopInfo.cpp
@@ -344,6 +344,17 @@
     return;
   }
 
-  if (L.getAttributes().IsParallel && I->mayReadOrWriteMemory())
-    I->setMetadata("llvm.mem.parallel_loop_access", L.getLoopID());
+  if (I->mayReadOrWriteMemory()) {
+    SmallVector<Metadata *, 2> ParallelLoopIDs;
+    for (const LoopInfo &AL : Active)
+      if (AL.getAttributes().IsParallel)
+        ParallelLoopIDs.push_back(AL.getLoopID());
+
+    MDNode *ParallelMD = nullptr;
+    if (ParallelLoopIDs.size() == 1)
+      ParallelMD = cast<MDNode>(ParallelLoopIDs[0]);
+    else if (ParallelLoopIDs.size() >= 2)
+      ParallelMD = MDNode::get(I->getContext(), ParallelLoopIDs);
+    I->setMetadata("llvm.mem.parallel_loop_access", ParallelMD);
+  }
 }