From c09611c5443fcc91fcc7452175017e2402c116c8 Mon Sep 17 00:00:00 2001 From: Michal Babej Date: Fri, 8 Mar 2019 10:02:56 +0200 Subject: [PATCH] Fix #663: update the parallel loop metadata for LLVM 8.0 format --- lib/llvmopencl/ParallelRegion.cc | 20 +++++++++++++------- lib/llvmopencl/ParallelRegion.h | 2 +- lib/llvmopencl/WorkitemLoops.cc | 21 +++++++++++++++------ 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/lib/llvmopencl/ParallelRegion.cc b/lib/llvmopencl/ParallelRegion.cc index 067c61d21e..b2d1fee306 100644 --- a/lib/llvmopencl/ParallelRegion.cc +++ b/lib/llvmopencl/ParallelRegion.cc @@ -471,20 +471,26 @@ ParallelRegion::Verify() * !1 { metadata !1 } * !2 { metadata !2 } */ -void -ParallelRegion::AddParallelLoopMetadata(llvm::MDNode *identifier) { +#ifdef LLVM_OLDER_THAN_8_0 +#define PARALLEL_MD_NAME "llvm.mem.parallel_loop_access" +#else +#define PARALLEL_MD_NAME "llvm.access.group" +#endif + +void ParallelRegion::AddParallelLoopMetadata(llvm::MDNode *Identifier) { for (iterator i = begin(), e = end(); i != e; ++i) { BasicBlock* bb = *i; for (BasicBlock::iterator ii = bb->begin(), ee = bb->end(); ii != ee; ii++) { + if (ii->mayReadOrWriteMemory()) { - MDNode *newMD = MDNode::get(bb->getContext(), identifier); - MDNode *oldMD = ii->getMetadata("llvm.mem.parallel_loop_access"); - if (oldMD != NULL) { - newMD = llvm::MDNode::concatenate(oldMD, newMD); + MDNode *NewMD = MDNode::get(bb->getContext(), Identifier); + MDNode *OldMD = ii->getMetadata(PARALLEL_MD_NAME); + if (OldMD != nullptr) { + NewMD = llvm::MDNode::concatenate(OldMD, NewMD); } - ii->setMetadata("llvm.mem.parallel_loop_access", newMD); + ii->setMetadata(PARALLEL_MD_NAME, NewMD); } } } diff --git a/lib/llvmopencl/ParallelRegion.h b/lib/llvmopencl/ParallelRegion.h index f9bdae4a68..e3af931991 100644 --- a/lib/llvmopencl/ParallelRegion.h +++ b/lib/llvmopencl/ParallelRegion.h @@ -79,7 +79,7 @@ class Kernel; std::size_t y = 0, std::size_t z = 0); - void AddParallelLoopMetadata(llvm::MDNode *identifier); + void AddParallelLoopMetadata(llvm::MDNode *Identifier); bool HasBlock(llvm::BasicBlock *bb); diff --git a/lib/llvmopencl/WorkitemLoops.cc b/lib/llvmopencl/WorkitemLoops.cc index abcc3a8bf9..dd27305447 100644 --- a/lib/llvmopencl/WorkitemLoops.cc +++ b/lib/llvmopencl/WorkitemLoops.cc @@ -34,6 +34,7 @@ #include "llvm/Analysis/LoopInfo.h" #include "llvm/Support/CommandLine.h" #include "llvm/IR/IRBuilder.h" +#include "llvm/IR/MDBuilder.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" @@ -298,13 +299,18 @@ WorkitemLoops::CreateLoopAround /* This creation of the identifier metadata is copied from LLVM's MDBuilder::createAnonymousTBAARoot(). */ -#ifdef LLVM_OLDER_THAN_3_7 - MDNode *Dummy = MDNode::getTemporary(C, ArrayRef()); -#else + MDNode *Dummy = MDNode::getTemporary(C, ArrayRef()).release(); +#ifdef LLVM_OLDER_THAN_8_0 + MDNode *Root = MDNode::get(C, Dummy); +#else + MDNode *AccessGroupMD = MDNode::getDistinct(C, {}); + MDNode *ParallelAccessMD = MDNode::get( + C, {MDString::get(C, "llvm.loop.parallel_accesses"), AccessGroupMD}); + + MDNode *Root = MDNode::get(C, {Dummy, ParallelAccessMD}); #endif - MDNode *Root = MDNode::get(C, Dummy); // At this point we have // !0 = metadata !{} <- dummy // !1 = metadata !{metadata !0} <- root @@ -313,10 +319,13 @@ WorkitemLoops::CreateLoopAround MDNode::deleteTemporary(Dummy); // We now have // !1 = metadata !{metadata !1} <- self-referential root - loopBranch->setMetadata("llvm.loop", Root); - region.AddParallelLoopMetadata(Root); +#ifdef LLVM_OLDER_THAN_8_0 + region.AddParallelLoopMetadata(Root); +#else + region.AddParallelLoopMetadata(AccessGroupMD); +#endif builder.SetInsertPoint(loopEndBB); builder.CreateBr(oldExit);