diff --git a/flang/include/flang/Optimizer/CodeGen/TypeConverter.h b/flang/include/flang/Optimizer/CodeGen/TypeConverter.h --- a/flang/include/flang/Optimizer/CodeGen/TypeConverter.h +++ b/flang/include/flang/Optimizer/CodeGen/TypeConverter.h @@ -14,12 +14,12 @@ #define FORTRAN_OPTIMIZER_CODEGEN_TYPECONVERTER_H #include "flang/Optimizer/Builder/Todo.h" // remove when TODO's are done -#include "flang/Optimizer/CodeGen/TBAABuilder.h" #include "flang/Optimizer/CodeGen/Target.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/Dialect/Support/FIRContext.h" #include "flang/Optimizer/Dialect/Support/KindMapping.h" #include "mlir/Conversion/LLVMCommon/TypeConverter.h" +#include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "llvm/Support/Debug.h" // Position of the different values in a `fir.box`. @@ -45,7 +45,7 @@ /// This converts FIR types to LLVM types (for now) class LLVMTypeConverter : public mlir::LLVMTypeConverter { public: - LLVMTypeConverter(mlir::ModuleOp module, bool applyTBAA); + LLVMTypeConverter(mlir::ModuleOp module); // i32 is used here because LLVM wants i32 constants when indexing into struct // types. Indexing into other aggregate types is more flexible. @@ -138,15 +138,9 @@ KindMapping &getKindMap() { return kindMapping; } - // Relay TBAA tag attachment to TBAABuilder. - void attachTBAATag(mlir::LLVM::AliasAnalysisOpInterface op, - mlir::Type baseFIRType, mlir::Type accessFIRType, - mlir::LLVM::GEPOp gep); - private: KindMapping kindMapping; std::unique_ptr specifics; - TBAABuilder tbaaBuilder; }; } // namespace fir diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -14,6 +14,7 @@ #include "CGOps.h" #include "flang/ISO_Fortran_binding.h" +#include "flang/Optimizer/CodeGen/TBAABuilder.h" #include "flang/Optimizer/Dialect/FIRAttr.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" @@ -118,8 +119,10 @@ class FIROpConversion : public mlir::ConvertOpToLLVMPattern { public: explicit FIROpConversion(fir::LLVMTypeConverter &lowering, + fir::TBAABuilder *tbaaBuilder, const fir::FIRToLLVMPassOptions &options) - : mlir::ConvertOpToLLVMPattern(lowering), options(options) {} + : mlir::ConvertOpToLLVMPattern(lowering), + tbaaBuilder(tbaaBuilder), options(options) {} protected: mlir::Type convertType(mlir::Type ty) const { @@ -366,9 +369,11 @@ void attachTBAATag(mlir::LLVM::AliasAnalysisOpInterface op, mlir::Type baseFIRType, mlir::Type accessFIRType, mlir::LLVM::GEPOp gep) const { - lowerTy().attachTBAATag(op, baseFIRType, accessFIRType, gep); + tbaaBuilder->attachTBAATag(op, baseFIRType, accessFIRType, gep); } + fir::TBAABuilder *const tbaaBuilder; + const fir::FIRToLLVMPassOptions &options; }; @@ -3611,8 +3616,9 @@ template struct MustBeDeadConversion : public FIROpConversion { explicit MustBeDeadConversion(fir::LLVMTypeConverter &lowering, + fir::TBAABuilder *tbaaBuilder, const fir::FIRToLLVMPassOptions &options) - : FIROpConversion(lowering, options) {} + : FIROpConversion(lowering, tbaaBuilder, options) {} using OpAdaptor = typename FromOp::Adaptor; mlir::LogicalResult @@ -3746,8 +3752,8 @@ return signalPassFailure(); auto *context = getModule().getContext(); - fir::LLVMTypeConverter typeConverter{getModule(), - options.applyTBAA || applyTBAA}; + fir::TBAABuilder tbaaBuilder(context, options.applyTBAA || applyTBAA); + fir::LLVMTypeConverter typeConverter{getModule()}; mlir::RewritePatternSet pattern(context); pattern.insert< AbsentOpConversion, AddcOpConversion, AddrOfOpConversion, @@ -3771,8 +3777,8 @@ SubcOpConversion, TypeDescOpConversion, UnboxCharOpConversion, UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion, UnrealizedConversionCastOpConversion, XArrayCoorOpConversion, - XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(typeConverter, - options); + XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>( + typeConverter, &tbaaBuilder, options); mlir::populateFuncToLLVMConversionPatterns(typeConverter, pattern); mlir::populateOpenMPToLLVMConversionPatterns(typeConverter, pattern); mlir::arith::populateArithToLLVMConversionPatterns(typeConverter, pattern); diff --git a/flang/lib/Optimizer/CodeGen/TypeConverter.cpp b/flang/lib/Optimizer/CodeGen/TypeConverter.cpp --- a/flang/lib/Optimizer/CodeGen/TypeConverter.cpp +++ b/flang/lib/Optimizer/CodeGen/TypeConverter.cpp @@ -15,7 +15,6 @@ #include "flang/Optimizer/CodeGen/TypeConverter.h" #include "DescriptorModel.h" #include "flang/Optimizer/Builder/Todo.h" // remove when TODO's are done -#include "flang/Optimizer/CodeGen/TBAABuilder.h" #include "flang/Optimizer/CodeGen/Target.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/Dialect/Support/FIRContext.h" @@ -25,7 +24,7 @@ namespace fir { -LLVMTypeConverter::LLVMTypeConverter(mlir::ModuleOp module, bool applyTBAA) +LLVMTypeConverter::LLVMTypeConverter(mlir::ModuleOp module) : mlir::LLVMTypeConverter(module.getContext(), [&] { mlir::LowerToLLVMOptions options( @@ -36,8 +35,7 @@ kindMapping(getKindMapping(module)), specifics(CodeGenSpecifics::get(module.getContext(), getTargetTriple(module), - getKindMapping(module))), - tbaaBuilder(module->getContext(), applyTBAA) { + getKindMapping(module))) { LLVM_DEBUG(llvm::dbgs() << "FIR type converter\n"); // Each conversion should return a value of type mlir::Type. @@ -333,12 +331,4 @@ mlir::IntegerType::get(&getContext(), 8)); } -// Relay TBAA tag attachment to TBAABuilder. -void LLVMTypeConverter::attachTBAATag(mlir::LLVM::AliasAnalysisOpInterface op, - mlir::Type baseFIRType, - mlir::Type accessFIRType, - mlir::LLVM::GEPOp gep) { - tbaaBuilder.attachTBAATag(op, baseFIRType, accessFIRType, gep); -} - } // namespace fir