Skip to content

Commit

Permalink
Fix #663: update the parallel loop metadata for LLVM 8.0 format
Browse files Browse the repository at this point in the history
  • Loading branch information
franz committed Mar 26, 2019
1 parent 44100cf commit c09611c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 14 deletions.
20 changes: 13 additions & 7 deletions lib/llvmopencl/ParallelRegion.cc
Expand Up @@ -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);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion lib/llvmopencl/ParallelRegion.h
Expand Up @@ -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);

Expand Down
21 changes: 15 additions & 6 deletions lib/llvmopencl/WorkitemLoops.cc
Expand Up @@ -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"
Expand Down Expand Up @@ -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<Metadata*>());
#else

MDNode *Dummy = MDNode::getTemporary(C, ArrayRef<Metadata*>()).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
Expand All @@ -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);
Expand Down

0 comments on commit c09611c

Please sign in to comment.