Lines Matching defs:opOperand
214 for (OpOperand &opOperand : op->getOpOperands()) {
215 Type operandType = opOperand.get().getType();
218 if (state.isInPlace(opOperand))
223 AliasingValueList aliasingValues = state.getAliasingValues(opOperand);
226 !state.bufferizesToMemoryWrite(opOperand) &&
239 if (!state.canOmitTensorCopy(opOperand))
243 outOfPlaceOpOperands.push_back(&opOperand);
244 if (!state.canOmitTensorCopy(opOperand))
245 copiedOpOperands.insert(&opOperand);
251 for (OpOperand *opOperand : outOfPlaceOpOperands) {
253 rewriter, op->getLoc(), opOperand->get(), state.getOptions(),
254 copiedOpOperands.contains(opOperand));
257 rewriter.modifyOpInPlace(op, [&]() { opOperand->set(*copy); });
399 /// Determine which Values will alias with `opOperand` if the op is bufferized
401 AliasingValueList AnalysisState::getAliasingValues(OpOperand &opOperand) const {
403 getOptions().dynCastBufferizableOp(opOperand.getOwner()))
404 return bufferizableOp.getAliasingValues(opOperand, *this);
407 return detail::unknownGetAliasingValues(opOperand);
410 /// Return true if `opOperand` bufferizes to a memory read. Return `true` if the
412 bool AnalysisState::bufferizesToMemoryRead(OpOperand &opOperand) const {
414 getOptions().dynCastBufferizableOp(opOperand.getOwner()))
415 return bufferizableOp.bufferizesToMemoryRead(opOperand, *this);
422 /// Return true if `opOperand` bufferizes to a memory write. Return
424 bool AnalysisState::bufferizesToMemoryWrite(OpOperand &opOperand) const {
426 getOptions().dynCastBufferizableOp(opOperand.getOwner()))
427 return bufferizableOp.bufferizesToMemoryWrite(opOperand, *this);
434 /// Return true if `opOperand` does neither read nor write but bufferizes to an
436 bool AnalysisState::bufferizesToAliasOnly(OpOperand &opOperand) const {
438 getOptions().dynCastBufferizableOp(opOperand.getOwner()))
439 return bufferizableOp.bufferizesToAliasOnly(opOperand, *this);
483 // Starting from `opOperand`, follow the use-def chain in reverse, always
489 OpOperand *opOperand, llvm::function_ref<bool(Value)> condition,
494 workingSet.insert(opOperand->get());
497 visitedOpOperands->insert(opOperand);
542 if (config.followInPlaceOnly && !isInPlace(*a.opOperand)) {
551 a.opOperand->get().getType() != value.getType() &&
560 workingSet.insert(a.opOperand->get());
562 visitedOpOperands->insert(a.opOperand);
571 AnalysisState::findDefinitions(OpOperand *opOperand) const {
575 opOperand, [&](Value v) { return this->bufferizesToMemoryWrite(v); },
589 bool AnalysisState::canOmitTensorCopy(OpOperand &opOperand) const {
591 if (hasUndefinedContents(&opOperand))
596 if (bufferizesToMemoryWrite(opOperand) && !bufferizesToMemoryRead(opOperand))
600 AliasingValueList aliases = getAliasingValues(opOperand);
601 if (!bufferizesToMemoryRead(opOperand) &&
610 bool AnalysisState::isInPlace(OpOperand &opOperand) const {
612 if (isa<ToMemrefOp>(opOperand.getOwner()))
617 return !bufferizesToMemoryWrite(opOperand);
632 bool AnalysisState::hasUndefinedContents(OpOperand *opOperand) const {
857 return state.bufferizesToMemoryWrite(*alias.opOperand);
900 .findValueInReverseUseDefChain(alias.opOperand,
914 for (OpOperand &opOperand : op->getOpOperands()) {
915 if (!llvm::isa<TensorType>(opOperand.get().getType()))
917 AliasingValueList aliasingValues = state.getAliasingValues(opOperand);
920 result.emplace_back(&opOperand, it.relation, it.isDefinite);
943 Value equivalentOperand = aliases.getAliases().front().opOperand->get();
986 bufferization::detail::unknownGetAliasingValues(OpOperand &opOperand) {
992 for (OpResult result : opOperand.getOwner()->getOpResults())
995 for (Region ®ion : opOperand.getOwner()->getRegions())