diff --git a/flang/include/flang/Optimizer/Analysis/AliasAnalysis.h b/flang/include/flang/Optimizer/Analysis/AliasAnalysis.h index 8cb6e92e41d97..9a70b7fbfad2b 100644 --- a/flang/include/flang/Optimizer/Analysis/AliasAnalysis.h +++ b/flang/include/flang/Optimizer/Analysis/AliasAnalysis.h @@ -153,20 +153,11 @@ struct AliasAnalysis { /// Return true, if Target or Pointer attribute is set. bool isTargetOrPointer() const; - /// Return true, if the memory source's `valueType` is a reference type - /// to an object of derived type that contains a component with POINTER - /// attribute. - bool isRecordWithPointerComponent() const; - bool isDummyArgument() const; bool isData() const; bool isBoxData() const; mlir::Type getType() const; - - /// Return true, if `ty` is a reference type to a boxed - /// POINTER object or a raw fir::PointerType. - static bool isPointerReference(mlir::Type ty); }; friend llvm::raw_ostream &operator<<(llvm::raw_ostream &os, @@ -183,6 +174,15 @@ struct AliasAnalysis { /// will stop at [hl]fir.declare if it represents a dummy /// argument declaration (i.e. it has the dummy_scope operand). Source getSource(mlir::Value, bool getInstantiationPoint = false); + +private: + /// Return true, if `ty` is a reference type to an object of derived type + /// that contains a component with POINTER attribute. + static bool isRecordWithPointerComponent(mlir::Type ty); + + /// Return true, if `ty` is a reference type to a boxed + /// POINTER object or a raw fir::PointerType. + static bool isPointerReference(mlir::Type ty); }; inline bool operator==(const AliasAnalysis::Source::SourceOrigin &lhs, diff --git a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp index 2084962fde729..e88da5a8ebae1 100644 --- a/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp +++ b/flang/lib/Optimizer/Analysis/AliasAnalysis.cpp @@ -60,7 +60,15 @@ void AliasAnalysis::Source::print(llvm::raw_ostream &os) const { attributes.Dump(os, EnumToString); } -bool AliasAnalysis::Source::isPointerReference(mlir::Type ty) { +bool AliasAnalysis::isRecordWithPointerComponent(mlir::Type ty) { + auto eleTy = fir::dyn_cast_ptrEleTy(ty); + if (!eleTy) + return false; + // TO DO: Look for pointer components + return mlir::isa(eleTy); +} + +bool AliasAnalysis::isPointerReference(mlir::Type ty) { auto eleTy = fir::dyn_cast_ptrEleTy(ty); if (!eleTy) return false; @@ -86,15 +94,7 @@ bool AliasAnalysis::Source::isBoxData() const { origin.isData; } -bool AliasAnalysis::Source::isRecordWithPointerComponent() const { - auto eleTy = fir::dyn_cast_ptrEleTy(valueType); - if (!eleTy) - return false; - // TO DO: Look for pointer components - return mlir::isa(eleTy); -} - -AliasResult AliasAnalysis::alias(Value lhs, Value rhs) { +AliasResult AliasAnalysis::alias(mlir::Value lhs, mlir::Value rhs) { // TODO: alias() has to be aware of the function scopes. // After MLIR inlining, the current implementation may // not recognize non-aliasing entities. @@ -111,6 +111,7 @@ AliasResult AliasAnalysis::alias(Value lhs, Value rhs) { // it aliases with everything if (lhsSrc.kind >= SourceKind::Indirect || rhsSrc.kind >= SourceKind::Indirect) { + LLVM_DEBUG(llvm::dbgs() << " aliasing because of indirect access\n"); return AliasResult::MayAlias; } @@ -169,10 +170,12 @@ AliasResult AliasAnalysis::alias(Value lhs, Value rhs) { // Box for POINTER component inside an object of a derived type // may alias box of a POINTER object, as well as boxes for POINTER // components inside two objects of derived types may alias. - if ((src1->isRecordWithPointerComponent() && src2->isTargetOrPointer()) || - (src2->isRecordWithPointerComponent() && src1->isTargetOrPointer()) || - (src1->isRecordWithPointerComponent() && - src2->isRecordWithPointerComponent())) { + if ((isRecordWithPointerComponent(src1->valueType) && + src2->isTargetOrPointer()) || + (isRecordWithPointerComponent(src2->valueType) && + src1->isTargetOrPointer()) || + (isRecordWithPointerComponent(src1->valueType) && + isRecordWithPointerComponent(src2->valueType))) { LLVM_DEBUG(llvm::dbgs() << " aliasing because of pointer components\n"); return AliasResult::MayAlias; } @@ -310,7 +313,7 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v, // TODO: Take followBoxData into account when setting the pointer // attribute - if (Source::isPointerReference(ty)) + if (isPointerReference(ty)) attributes.set(Attribute::Pointer); global = llvm::cast(op).getSymbol(); breakFromLoop = true; @@ -387,7 +390,7 @@ AliasAnalysis::Source AliasAnalysis::getSource(mlir::Value v, if (fir::valueHasFirAttribute(v, fir::getTargetAttrName())) attributes.set(Attribute::Target); - if (Source::isPointerReference(ty)) + if (isPointerReference(ty)) attributes.set(Attribute::Pointer); } diff --git a/flang/test/Analysis/AliasAnalysis/alias-analysis-9.fir b/flang/test/Analysis/AliasAnalysis/ptr-component.fir similarity index 100% rename from flang/test/Analysis/AliasAnalysis/alias-analysis-9.fir rename to flang/test/Analysis/AliasAnalysis/ptr-component.fir