@@ -51,14 +51,22 @@ static bool hasGlobalOpTargetAttr(mlir::Value v, fir::AddrOfOp op) {
5151 v, fir::GlobalOp::getTargetAttrName (globalOpName));
5252}
5353
54- static mlir::Value getOriginalDef (mlir::Value v) {
54+ static mlir::Value
55+ getOriginalDef (mlir::Value v,
56+ fir::AliasAnalysis::Source::Attributes &attributes,
57+ bool &isCapturedInInternalProcedure) {
5558 mlir::Operation *defOp;
5659 bool breakFromLoop = false ;
5760 while (!breakFromLoop && (defOp = v.getDefiningOp ())) {
5861 llvm::TypeSwitch<Operation *>(defOp)
5962 .Case <fir::ConvertOp>([&](fir::ConvertOp op) { v = op.getValue (); })
60- .Case <fir::DeclareOp, hlfir::DeclareOp>(
61- [&](auto op) { v = op.getMemref (); })
63+ .Case <fir::DeclareOp, hlfir::DeclareOp>([&](auto op) {
64+ v = op.getMemref ();
65+ auto varIf = llvm::cast<fir::FortranVariableOpInterface>(defOp);
66+ attributes |= getAttrsFromVariable (varIf);
67+ isCapturedInInternalProcedure |=
68+ varIf.isCapturedInInternalProcedure ();
69+ })
6270 .Default ([&](auto op) { breakFromLoop = true ; });
6371 }
6472 return v;
@@ -600,7 +608,8 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v,
600608 if (mlir::isa<fir::PointerType>(boxTy.getEleTy ()))
601609 attributes.set (Attribute::Pointer);
602610
603- auto def = getOriginalDef (op.getMemref ());
611+ auto def = getOriginalDef (op.getMemref (), attributes,
612+ isCapturedInInternalProcedure);
604613 if (auto addrOfOp = def.template getDefiningOp <fir::AddrOfOp>()) {
605614 global = addrOfOp.getSymbol ();
606615
@@ -609,13 +618,13 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v,
609618
610619 type = SourceKind::Global;
611620 }
612-
613- // TODO: Add support to fir.alloca and fir.allocmem
614- // if (auto allocOp = def.template getDefiningOp<fir::AllocaOp>()) {
615- // ...
616- // }
617-
618- if (isDummyArgument (def)) {
621+ // TODO: Add support to fir.allocmem
622+ else if ( auto allocOp =
623+ def.template getDefiningOp <fir::AllocaOp>()) {
624+ v = def;
625+ defOp = v. getDefiningOp ();
626+ type = SourceKind::Allocate;
627+ } else if (isDummyArgument (def)) {
619628 defOp = nullptr ;
620629 v = def;
621630 }
0 commit comments