118 std::map<const IR::Expression *, const SetOfLocations *> rw;
123 void postorder(
const IR::Operation_Binary *expression)
override {
124 auto left = ::get(rw, expression->left);
125 auto right = ::get(rw, expression->right);
128 rw.emplace(expression, left->join(right));
131 void postorder(
const IR::PathExpression *expression)
override {
135 rw.emplace(expression, locs);
138 void postorder(
const IR::Operation_Unary *expression)
override {
139 auto e = ::get(rw, expression->expr);
141 rw.emplace(expression, e);
144 void postorder(
const IR::Member *expression)
override {
145 auto e = ::get(rw, expression->expr);
147 auto result = e->append(expression->member);
148 rw.emplace(expression, result);
151 void postorder(
const IR::ArrayIndex *expression)
override {
152 auto e = ::get(rw, expression->left);
155 if (expression->right->is<IR::Constant>()) {
156 int index = expression->right->to<IR::Constant>()->asInt();
157 result = e->
append(Util::toString(index));
159 auto index = ::get(rw, expression->right);
160 result = e->
append(
"*")->join(index);
162 rw.emplace(expression, result);
165 void postorder(
const IR::Literal *expression)
override {
169 void postorder(
const IR::InvalidHeader *expression)
override {
173 void postorder(
const IR::InvalidHeaderUnion *expression)
override {
177 void postorder(
const IR::HeaderStackExpression *expression)
override {
181 void postorder(
const IR::TypeNameExpression *expression)
override {
185 void postorder(
const IR::Operation_Ternary *expression)
override {
186 auto e0 = ::get(rw, expression->e0);
187 auto e1 = ::get(rw, expression->e1);
188 auto e2 = ::get(rw, expression->e2);
192 rw.emplace(expression, e0->join(e1)->join(e2));
195 void postorder(
const IR::Slice *expression)
override {
196 auto e = ::get(rw, expression->e0);
198 rw.emplace(expression, e);
201 void postorder(
const IR::MethodCallExpression *expression)
override {
202 auto e = ::get(rw, expression->method);
203 for (
auto a : *expression->arguments) {
204 auto s = ::get(rw, a->expression);
208 rw.emplace(expression, e);
211 void postorder(
const IR::ConstructorCallExpression *expression)
override {
213 for (
auto e : *expression->arguments) {
214 auto s = ::get(rw, e->expression);
216 result = result->join(s);
218 rw.emplace(expression, result);
221 void postorder(
const IR::StructExpression *expression)
override {
223 for (
auto e : expression->components) {
224 auto s = ::get(rw, e->expression);
226 result = result->join(s);
228 rw.emplace(expression, result);
231 void postorder(
const IR::ListExpression *expression)
override {
233 for (
auto e : expression->components) {
234 auto s = ::get(rw, e);
236 result = result->join(s);
238 rw.emplace(expression, result);
242 expression->apply(*
this);
243 auto result = ::get(rw, expression);
245 LOG3(
"SetOfLocations(" << expression <<
")=" << result);
249 bool mayAlias(
const IR::Expression *left,
const IR::Expression *right) {
250 auto llocs = get(left);
251 auto rlocs = get(right);
254 LOG3(
"Checking overlap between " << llocs <<
" and " << rlocs);
255 return llocs->overlaps(rlocs);