void FuncAnalysisState::startFunctionAnalysis(FuncOp funcOp) {
analyzedFuncOps[funcOp] = FuncOpAnalysisState::InProgress;
auto createdEquiv = equivalentFuncArgs.try_emplace(funcOp, IndexMapping());
- auto createdAliasingOperands =
- aliasingFuncArgs.try_emplace(funcOp, IndexToIndexListMapping());
auto createdAliasingResults =
aliasingReturnVals.try_emplace(funcOp, IndexToIndexListMapping());
auto createdRead = readBbArgs.try_emplace(funcOp, BbArgIndexSet());
auto createdWritten = writtenBbArgs.try_emplace(funcOp, BbArgIndexSet());
(void)createdEquiv;
- (void)createdAliasingOperands;
(void)createdAliasingResults;
(void)createdRead;
(void)createdWritten;
#ifndef NDEBUG
assert(createdEquiv.second && "equivalence info exists already");
- assert(createdAliasingOperands.second && "aliasing info exists already");
assert(createdAliasingResults.second && "aliasing info exists already");
assert(createdRead.second && "bbarg access info exists already");
assert(createdWritten.second && "bbarg access info exists already");
return result;
}
- SmallVector<OpOperand *>
- getAliasingOpOperand(Operation *op, OpResult opResult,
- const AnalysisState &state) const {
- func::CallOp callOp = cast<func::CallOp>(op);
- FuncOp funcOp = getCalledFunction(callOp);
- assert(funcOp && "expected CallOp to a FuncOp");
- if (getFuncOpAnalysisState(state, funcOp) != FuncOpAnalysisState::Analyzed)
- // FuncOp not analyzed yet. Any OpOperand may be aliasing.
- return detail::unknownGetAliasingOpOperand(opResult);
-
- // Get aliasing bbArgs from state.
- const FuncAnalysisState &funcState = getFuncAnalysisState(state);
- auto aliasingFuncArgs = funcState.aliasingFuncArgs.lookup(funcOp).lookup(
- opResult.getResultNumber());
- SmallVector<OpOperand *> result;
- for (int64_t bbArgIdx : aliasingFuncArgs)
- result.push_back(&callOp->getOpOperand(bbArgIdx));
- return result;
- }
-
BufferRelation bufferRelation(Operation *op, OpResult opResult,
const AnalysisState &state) const {
func::CallOp callOp = cast<func::CallOp>(op);
continue;
int64_t returnIdx = resultIt.index();
int64_t bbArgIdx = inputIt.index();
- funcState.aliasingFuncArgs[funcOp][returnIdx].push_back(bbArgIdx);
funcState.aliasingReturnVals[funcOp][bbArgIdx].push_back(returnIdx);
}
}
if (state.getOptions().testAnalysisOnly)
annotateEquivalentReturnBbArg(returnVal, bbArg);
}
- if (state.areAliasingBufferizedValues(returnVal.get(), bbArg)) {
- funcState.aliasingFuncArgs[funcOp][returnIdx].push_back(bbArgIdx);
+ if (state.areAliasingBufferizedValues(returnVal.get(), bbArg))
funcState.aliasingReturnVals[funcOp][bbArgIdx].push_back(returnIdx);
- }
}
return success();