31 for (
auto &
Func : M.functions()) {
32 std::string DemangledName = llvm::demangle(
Func.
getName().str());
33 StringRef StrRef{DemangledName};
34 if (StrRef.contains(
"proteus::shared_array")) {
36 while (!
Func.user_empty()) {
37 User *Usr = *
Func.user_begin();
38 if (!isa<CallBase>(Usr))
41 CallBase *CB = cast<CallBase>(Usr);
42 assert(CB->arg_size() == 2 &&
"Expected 2 arguments: N and sizeof");
45 if (!getConstantValue(CB->getArgOperand(0), N, M.getDataLayout()))
47 if (!getConstantValue(CB->getArgOperand(1), Sizeof,
52 ArrayType::get(Type::getInt8Ty(M.getContext()), N * Sizeof);
53 constexpr unsigned SharedMemAddrSpace = 3;
54 GlobalVariable *SharedMemGV =
new GlobalVariable(
55 M, AType,
false, GlobalValue::InternalLinkage,
56 UndefValue::get(AType),
".proteus.shared",
nullptr,
57 llvm::GlobalValue::NotThreadLocal, SharedMemAddrSpace,
false);
60 SharedMemGV->setAlignment(Align{16});
62 auto TraceOut = [](StringRef DemangledName,
63 GlobalVariable *SharedMemGV) {
65 raw_svector_ostream OS(S);
66 OS <<
"[SharedArray] " <<
"Replace CB " << DemangledName <<
" with "
67 << *SharedMemGV <<
"\n";
73 << TraceOut(DemangledName, SharedMemGV));
77 CB->replaceAllUsesWith(ConstantExpr::getAddrSpaceCast(
78 SharedMemGV, CB->getFunctionType()->getReturnType()));
79 CB->eraseFromParent();
82#if PROTEUS_ENABLE_DEBUG
83 if (verifyModule(M, &errs()))