53 std::map<size_t, AtomicUseInfo<Base>> atomicInfo_;
54 std::map<OperationNode<Base>*, std::set<size_t> > indeps_;
62 inline const std::map<size_t, AtomicUseInfo<Base>>& findAtomicsUsage() {
63 if (!atomicInfo_.empty()) {
67 size_t m = fun_.Range();
68 size_t n = fun_.Domain();
70 std::vector<CG<Base> > x(
n);
74 assert(x.size() == 0 || (x[0].getOperationNode()->getHandlerPosition() == 0 && x[x.size() - 1].getOperationNode()->getHandlerPosition() == x.size() - 1));
76 std::vector<CG<Base> >
dep = fun_.Forward(0, x);
78 for (
size_t i = 0;
i < m;
i++) {
79 findAtomicsUsage(
dep[
i].getOperationNode());
83 for (
auto& pair: atomicInfo_) {
84 size_t id = pair.first;
96 return std::set<size_t>();
99 if (
op == CGOpCode::Inv) {
106 if (handler_.isVisited(*node)) {
108 return indeps_.at(node);
111 handler_.markVisited(*node);
115 for (
size_t a = 0;
a <
args.size();
a++) {
116 std::set<size_t>
aindeps = findAtomicsUsage(
args[
a].getOperation());
121 if (
op == CGOpCode::AtomicForward) {
122 CPPADCG_ASSERT_UNKNOWN(node->
getInfo().size() > 1);
123 CPPADCG_ASSERT_UNKNOWN(node->
getArguments().size() > 1);
124 size_t id = node->
getInfo()[0];
128 CPPADCG_ASSERT_UNKNOWN(
p == 0);
134 CPPADCG_ASSERT_UNKNOWN(
tx !=
nullptr &&
tx->getOperationType() == CGOpCode::ArrayCreation);
135 CPPADCG_ASSERT_UNKNOWN(
ty !=
nullptr &&
ty->getOperationType() == CGOpCode::ArrayCreation);
137 auto&
info = atomicInfo_[
id];
139 info.sizes.insert(std::pair<size_t, size_t>(
tx->getArguments().size(),
140 ty->getArguments().size()));