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")) {
37 while (!Func.user_empty()) {
38 User *Usr = *Func.user_begin();
39 if (!isa<CallBase>(Usr))
42 CallBase *CB = cast<CallBase>(Usr);
43 assert(CB->arg_size() == 2 &&
"Expected 2 arguments: N and sizeof");
46 if (!getConstantValue(CB->getArgOperand(0), N, M.getDataLayout()))
48 if (!getConstantValue(CB->getArgOperand(1), Sizeof,
53 ArrayType::get(Type::getInt8Ty(M.getContext()), N * Sizeof);
54 constexpr unsigned SharedMemAddrSpace = 3;
55 GlobalVariable *SharedMemGV =
new GlobalVariable(
56 M, AType,
false, GlobalValue::InternalLinkage,
57 UndefValue::get(AType),
".proteus.shared",
nullptr,
58 llvm::GlobalValue::NotThreadLocal, SharedMemAddrSpace,
false);
61 SharedMemGV->setAlignment(Align{16});
64 <<
"[SharedArray] " <<
"Replace CB " << *CB <<
" with "
65 << *SharedMemGV <<
"\n");
67 CB->replaceAllUsesWith(ConstantExpr::getAddrSpaceCast(
68 SharedMemGV, CB->getFunctionType()->getReturnType()));
69 CB->eraseFromParent();
72#if PROTEUS_ENABLE_DEBUG
73 if (verifyModule(M, &errs()))