[Mlir-commits] [mlir] [mlir] Migrate users to explicitly discardable/inherent attribute APIs (PR #217233)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Aug 19 01:03:33 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir-linalg

Author: Mehdi Amini (joker-eph)

<details>
<summary>Changes</summary>

Start to require explicit handling of discardable attributes. Use operation-specific accessors for attributes stored as properties.

This is both more efficient (no need to materialize the combine dictionnary) and a step in the direction of deprecating these combined APIs.

Assisted-by: Codex

---

Patch is 500.58 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/217233.diff


300 Files Affected:

- (modified) mlir/examples/toy/Ch2/mlir/Dialect.cpp (+4-2) 
- (modified) mlir/examples/toy/Ch3/mlir/Dialect.cpp (+4-2) 
- (modified) mlir/examples/toy/Ch4/mlir/Dialect.cpp (+6-4) 
- (modified) mlir/examples/toy/Ch5/mlir/Dialect.cpp (+6-4) 
- (modified) mlir/examples/toy/Ch6/mlir/Dialect.cpp (+6-4) 
- (modified) mlir/examples/toy/Ch7/mlir/Dialect.cpp (+6-4) 
- (modified) mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h (+13-4) 
- (modified) mlir/include/mlir/Conversion/LLVMCommon/Pattern.h (+3-2) 
- (modified) mlir/include/mlir/Conversion/LLVMCommon/VectorPattern.h (+5-2) 
- (modified) mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEOps.td (+2-2) 
- (modified) mlir/include/mlir/Dialect/Async/IR/AsyncOps.td (+2-2) 
- (modified) mlir/include/mlir/Dialect/EmitC/IR/EmitC.td (+2-2) 
- (modified) mlir/include/mlir/Dialect/Func/IR/FuncOps.td (+2-2) 
- (modified) mlir/include/mlir/Dialect/GPU/IR/GPUOps.td (+4-2) 
- (modified) mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td (+12-5) 
- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMInterfaces.td (+11) 
- (modified) mlir/include/mlir/Dialect/LLVMIR/NVVMOps.td (+2-1) 
- (modified) mlir/include/mlir/Dialect/OpenACC/OpenACC.h (+3-2) 
- (modified) mlir/include/mlir/Dialect/OpenACCMPCommon/Interfaces/AtomicInterfaces.td (+6-3) 
- (modified) mlir/include/mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td (+26-19) 
- (modified) mlir/include/mlir/Dialect/Shard/Transforms/Simplify.h (+4-1) 
- (modified) mlir/include/mlir/Dialect/Tosa/Utils/ConversionUtils.h (+4-4) 
- (modified) mlir/include/mlir/IR/Matchers.h (+11-2) 
- (modified) mlir/include/mlir/IR/Operation.h (+84-16) 
- (modified) mlir/include/mlir/IR/SymbolInterfaces.td (+4-3) 
- (modified) mlir/include/mlir/Target/SMTLIB/Namespace.h (+3-2) 
- (modified) mlir/lib/Analysis/CallGraph.cpp (+10-3) 
- (modified) mlir/lib/Analysis/DataFlow/ConstantPropagationAnalysis.cpp (+6-2) 
- (modified) mlir/lib/Bytecode/Writer/BytecodeWriter.cpp (+7-4) 
- (modified) mlir/lib/Bytecode/Writer/IRNumbering.cpp (+9-3) 
- (modified) mlir/lib/CAPI/Dialect/Linalg.cpp (+4-1) 
- (modified) mlir/lib/CAPI/IR/IR.cpp (+5-3) 
- (modified) mlir/lib/Conversion/AMDGPUToROCDL/AMDGPUToROCDL.cpp (+3-3) 
- (modified) mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp (+4-4) 
- (modified) mlir/lib/Conversion/ArithToSPIRV/ArithToSPIRV.cpp (+7-5) 
- (modified) mlir/lib/Conversion/ComplexToLLVM/ComplexToLLVM.cpp (+2-2) 
- (modified) mlir/lib/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.cpp (+2-2) 
- (modified) mlir/lib/Conversion/FuncToEmitC/FuncToEmitC.cpp (+16-5) 
- (modified) mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp (+25-19) 
- (modified) mlir/lib/Conversion/FuncToSPIRV/FuncToSPIRV.cpp (+8-4) 
- (modified) mlir/lib/Conversion/GPUCommon/GPUOpsLowering.cpp (+8-6) 
- (modified) mlir/lib/Conversion/GPUCommon/IndexIntrinsicsOpLowering.h (+1-1) 
- (modified) mlir/lib/Conversion/GPUToNVVM/LowerGpuOpsToNVVMOps.cpp (+2-2) 
- (modified) mlir/lib/Conversion/GPUToROCDL/LowerGpuOpsToROCDLOps.cpp (+6-5) 
- (modified) mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRV.cpp (+33-8) 
- (modified) mlir/lib/Conversion/GPUToSPIRV/GPUToSPIRVPass.cpp (+2-2) 
- (modified) mlir/lib/Conversion/LLVMCommon/LowerFunctionDiscardablesToLLVM.cpp (+2-1) 
- (modified) mlir/lib/Conversion/LLVMCommon/Pattern.cpp (+1-1) 
- (modified) mlir/lib/Conversion/LinalgToStandard/LinalgToStandard.cpp (+2-2) 
- (modified) mlir/lib/Conversion/MathToFuncs/MathToFuncs.cpp (+3-3) 
- (modified) mlir/lib/Conversion/MathToLibm/MathToLibm.cpp (+2-2) 
- (modified) mlir/lib/Conversion/MathToXeVM/MathToXeVM.cpp (+2-1) 
- (modified) mlir/lib/Conversion/MemRefToSPIRV/MapMemRefStorageClassPass.cpp (+3-3) 
- (modified) mlir/lib/Conversion/NVGPUToNVVM/NVGPUToNVVM.cpp (+2-2) 
- (modified) mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp (+9-2) 
- (modified) mlir/lib/Conversion/RaiseWasm/RaiseWasmMLIR.cpp (+4-4) 
- (modified) mlir/lib/Conversion/SCFToControlFlow/SCFToControlFlow.cpp (+2-2) 
- (modified) mlir/lib/Conversion/SCFToGPU/SCFToGPU.cpp (+10-9) 
- (modified) mlir/lib/Conversion/SCFToSPIRV/SCFToSPIRV.cpp (+6-5) 
- (modified) mlir/lib/Conversion/SPIRVToLLVM/ConvertLaunchFuncToLLVMCalls.cpp (+6-23) 
- (modified) mlir/lib/Conversion/SPIRVToLLVM/SPIRVToLLVM.cpp (+25-12) 
- (modified) mlir/lib/Conversion/TosaToLinalg/TosaToLinalg.cpp (+7-6) 
- (modified) mlir/lib/Conversion/TosaToLinalg/TosaToLinalgNamed.cpp (+3-3) 
- (modified) mlir/lib/Conversion/TosaToSPIRVTosa/TosaToSPIRVTosa.cpp (+2-2) 
- (modified) mlir/lib/Conversion/TosaToSPIRVTosa/TosaToSPIRVTosaConstants.cpp (+3-2) 
- (modified) mlir/lib/Conversion/TosaToSPIRVTosa/TosaToSPIRVTosaPass.cpp (+2-2) 
- (modified) mlir/lib/Conversion/VectorToArmSME/VectorToArmSME.cpp (+3-3) 
- (modified) mlir/lib/Conversion/VectorToSCF/VectorToSCF.cpp (+5-5) 
- (modified) mlir/lib/Conversion/XeGPUToXeVM/XeGPUToXeVM.cpp (+2-2) 
- (modified) mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp (+20-9) 
- (modified) mlir/lib/Dialect/AMDGPU/Transforms/EmulateAtomics.cpp (+2-1) 
- (modified) mlir/lib/Dialect/AMDGPU/Transforms/MaskedloadToLoad.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Affine/Analysis/Utils.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Affine/IR/AffineOps.cpp (+47-53) 
- (modified) mlir/lib/Dialect/Affine/Transforms/PipelineDataTransfer.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Affine/Transforms/SimplifyAffineStructures.cpp (+7-2) 
- (modified) mlir/lib/Dialect/Affine/Transforms/SuperVectorize.cpp (+5-3) 
- (modified) mlir/lib/Dialect/Affine/Utils/Utils.cpp (+9-10) 
- (modified) mlir/lib/Dialect/Arith/IR/ArithOps.cpp (+9-4) 
- (modified) mlir/lib/Dialect/Arith/Transforms/EmulateUnsupportedFloats.cpp (+5-3) 
- (modified) mlir/lib/Dialect/Arith/Transforms/IntRangeOptimizations.cpp (+3-2) 
- (modified) mlir/lib/Dialect/Arith/Transforms/UnsignedWhenEquivalent.cpp (+3-2) 
- (modified) mlir/lib/Dialect/ArmSME/Transforms/EnableArmStreaming.cpp (+3-3) 
- (modified) mlir/lib/Dialect/ArmSVE/Transforms/LegalizeVectorStorage.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Async/IR/Async.cpp (+4-3) 
- (modified) mlir/lib/Dialect/Async/Transforms/AsyncToAsyncRuntime.cpp (+7-4) 
- (modified) mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp (+5-2) 
- (modified) mlir/lib/Dialect/Bufferization/Transforms/FuncBufferizableOpInterfaceImpl.cpp (+4-2) 
- (modified) mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp (+15-11) 
- (modified) mlir/lib/Dialect/Bufferization/Transforms/OneShotModuleBufferize.cpp (+3-3) 
- (modified) mlir/lib/Dialect/Bufferization/Transforms/OwnershipBasedBufferDeallocation.cpp (+6-6) 
- (modified) mlir/lib/Dialect/DLTI/DLTI.cpp (+1-1) 
- (modified) mlir/lib/Dialect/DLTI/Traits.cpp (+2-2) 
- (modified) mlir/lib/Dialect/EmitC/IR/EmitC.cpp (+5-4) 
- (modified) mlir/lib/Dialect/EmitC/Transforms/MLGOAddReflectionMap.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Func/IR/FuncOps.cpp (+4-4) 
- (modified) mlir/lib/Dialect/Func/Transforms/DuplicateFunctionElimination.cpp (+2-1) 
- (modified) mlir/lib/Dialect/GPU/IR/GPUDialect.cpp (+26-18) 
- (modified) mlir/lib/Dialect/GPU/IR/InferIntRangeInterfaceImpls.cpp (+3-1) 
- (modified) mlir/lib/Dialect/GPU/Transforms/EliminateBarriers.cpp (+1-1) 
- (modified) mlir/lib/Dialect/GPU/Transforms/KernelOutlining.cpp (+5-3) 
- (modified) mlir/lib/Dialect/GPU/Transforms/ParallelLoopMapper.cpp (+4-3) 
- (modified) mlir/lib/Dialect/IRDL/IRDLLoading.cpp (+2-2) 
- (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp (+2-2) 
- (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp (+21-14) 
- (modified) mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp (+20-11) 
- (modified) mlir/lib/Dialect/LLVMIR/Transforms/InlinerInterfaceImpl.cpp (+1-1) 
- (modified) mlir/lib/Dialect/LLVMIR/Transforms/RequestCWrappers.cpp (+3-2) 
- (modified) mlir/lib/Dialect/Linalg/IR/LinalgInterfaces.cpp (+4-4) 
- (modified) mlir/lib/Dialect/Linalg/IR/LinalgOps.cpp (+39-26) 
- (modified) mlir/lib/Dialect/Linalg/TransformOps/LinalgTransformOps.cpp (+11-4) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/BufferizableOpInterfaceImpl.cpp (+12-5) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/ElementwiseToLinalg.cpp (+5-4) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/EraseUnusedOperandsAndResults.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/FoldIntoElementwise.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/SimplifyDepthwiseConv.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/TilingInterfaceImpl.cpp (+17-9) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp (+10-8) 
- (modified) mlir/lib/Dialect/Math/Transforms/PolynomialApproximation.cpp (+2-2) 
- (modified) mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp (+8-6) 
- (modified) mlir/lib/Dialect/MemRef/Transforms/AllocationOpInterfaceImpl.cpp (+6-5) 
- (modified) mlir/lib/Dialect/MemRef/Transforms/MultiBuffer.cpp (+3-2) 
- (modified) mlir/lib/Dialect/MemRef/Transforms/NormalizeMemRefs.cpp (+2-1) 
- (modified) mlir/lib/Dialect/NVGPU/IR/NVGPUDialect.cpp (+2-3) 
- (modified) mlir/lib/Dialect/NVGPU/Transforms/MmaSyncTF32Transform.cpp (+1-1) 
- (modified) mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp (+1-1) 
- (modified) mlir/lib/Dialect/OpenACC/IR/OpenACCCG.cpp (+12-6) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCBindRoutine.cpp (+4-4) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCCGToGPU.cpp (+6-4) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCComputeLowering.cpp (+1-1) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCDeclareGPUModuleInsertion.cpp (+12-9) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCEmitRemarksData.cpp (+1-1) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCEmitRemarksLoop.cpp (+1-1) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCImplicitData.cpp (+2-2) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCImplicitDeclare.cpp (+5-4) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCImplicitRoutine.cpp (+2-2) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCRecipeMaterialization.cpp (+9-7) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCRoutineLowering.cpp (+9-7) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCRoutineToGPUFunc.cpp (+10-6) 
- (modified) mlir/lib/Dialect/OpenACC/Utils/OpenACCUtils.cpp (+9-7) 
- (modified) mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp (+15-10) 
- (modified) mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsGPU.cpp (+2-2) 
- (modified) mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsLoop.cpp (+5-3) 
- (modified) mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp (+14-10) 
- (modified) mlir/lib/Dialect/OpenMP/Utils/Utils.cpp (+4-4) 
- (modified) mlir/lib/Dialect/PDLInterp/IR/PDLInterp.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Quant/Transforms/NormalizeQuantTypes.cpp (+2-1) 
- (modified) mlir/lib/Dialect/SCF/IR/SCF.cpp (+29-20) 
- (modified) mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp (+2-1) 
- (modified) mlir/lib/Dialect/SCF/Transforms/ForToWhile.cpp (+3-2) 
- (modified) mlir/lib/Dialect/SCF/Transforms/ForallToParallel.cpp (+1-1) 
- (modified) mlir/lib/Dialect/SCF/Transforms/LoopSpecialization.cpp (+9-7) 
- (modified) mlir/lib/Dialect/SCF/Transforms/StructuralTypeConversions.cpp (+2-2) 
- (modified) mlir/lib/Dialect/SMT/IR/SMTOps.cpp (+8-4) 
- (modified) mlir/lib/Dialect/SPIRV/IR/AtomicOps.cpp (+1-5) 
- (modified) mlir/lib/Dialect/SPIRV/IR/ControlFlowOps.cpp (+2-2) 
- (modified) mlir/lib/Dialect/SPIRV/IR/DotProductOps.cpp (+5-9) 
- (modified) mlir/lib/Dialect/SPIRV/IR/GroupOps.cpp (+1-5) 
- (modified) mlir/lib/Dialect/SPIRV/IR/MemoryOps.cpp (+17-16) 
- (modified) mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.cpp (+5-4) 
- (modified) mlir/lib/Dialect/SPIRV/IR/SPIRVOps.cpp (+18-12) 
- (modified) mlir/lib/Dialect/SPIRV/IR/TargetAndABI.cpp (+2-2) 
- (modified) mlir/lib/Dialect/SPIRV/Linking/ModuleCombiner/ModuleCombiner.cpp (+5-4) 
- (modified) mlir/lib/Dialect/SPIRV/Transforms/DecorateCompositeTypeLayoutPass.cpp (+4-7) 
- (modified) mlir/lib/Dialect/SPIRV/Transforms/LowerABIAttributesPass.cpp (+7-5) 
- (modified) mlir/lib/Dialect/SPIRV/Transforms/SPIRVConversion.cpp (+17-9) 
- (modified) mlir/lib/Dialect/SPIRV/Transforms/UnifyAliasedResourcePass.cpp (+6-4) 
- (modified) mlir/lib/Dialect/SPIRV/Transforms/UpdateVCEPass.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Shape/IR/Shape.cpp (+12-8) 
- (modified) mlir/lib/Dialect/SparseTensor/IR/SparseTensorDialect.cpp (+1-1) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/SparseAssembler.cpp (+5-4) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/SparseGPUCodegen.cpp (+4-3) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/SparseReinterpretMap.cpp (+2-2) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/SparseVectorization.cpp (+5-4) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/Sparsification.cpp (+2-2) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/Utils/CodegenUtils.cpp (+2-2) 
- (modified) mlir/lib/Dialect/SparseTensor/Transforms/Utils/LoopEmitter.h (+2-1) 
- (modified) mlir/lib/Dialect/Tensor/Transforms/ScalarizeFunctionResult.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Tosa/IR/TargetEnv.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Tosa/IR/TosaOps.cpp (+12-9) 
- (modified) mlir/lib/Dialect/Tosa/Transforms/TosaAttachTarget.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Tosa/Transforms/TosaConvertIntegerTypeToSignless.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Tosa/Transforms/TosaNarrowTypes.cpp (+4-2) 
- (modified) mlir/lib/Dialect/Tosa/Transforms/TosaReduceTransposes.cpp (+7-7) 
- (modified) mlir/lib/Dialect/Tosa/Transforms/TosaValidation.cpp (+5-1) 
- (modified) mlir/lib/Dialect/Tosa/Utils/ConversionUtils.cpp (+1-2) 
- (modified) mlir/lib/Dialect/Transform/IR/TransformDialect.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Transform/IR/TransformOps.cpp (+5-6) 
- (modified) mlir/lib/Dialect/Transform/Interfaces/TransformInterfaces.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Transform/Transforms/InterpreterPass.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Transform/Transforms/TransformInterpreterUtils.cpp (+2-2) 
- (modified) mlir/lib/Dialect/Utils/StructuredOpsUtils.cpp (+5-3) 
- (modified) mlir/lib/Dialect/Vector/IR/VectorOps.cpp (+18-12) 
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorDistribute.cpp (+2-1) 
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorDropLeadUnitDim.cpp (+13-7) 
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorLinearize.cpp (+6-2) 
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorTransferSplitRewritePatterns.cpp (+5-3) 
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorTransforms.cpp (+12-8) 
- (modified) mlir/lib/Dialect/Vector/Transforms/VectorUnroll.cpp (+4-2) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPUBlocking.cpp (+11-9) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPULayoutImpl.cpp (+5-5) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPUPropagateLayout.cpp (+6-4) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPUSgToLaneDistribute.cpp (+8-5) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPUUnroll.cpp (+14-16) 
- (modified) mlir/lib/Dialect/XeGPU/Transforms/XeGPUWgToSgDistribute.cpp (+3-2) 
- (modified) mlir/lib/Dialect/XeGPU/Utils/XeGPUUtils.cpp (+15-12) 
- (modified) mlir/lib/IR/AsmPrinter.cpp (+9-4) 
- (modified) mlir/lib/IR/AttrTypeSubElements.cpp (+11-2) 
- (modified) mlir/lib/IR/BuiltinAttributes.cpp (+3-4) 
- (modified) mlir/lib/IR/BuiltinDialect.cpp (+7-4) 
- (modified) mlir/lib/IR/Operation.cpp (+6-1) 
- (modified) mlir/lib/IR/OperationSupport.cpp (+7-1) 
- (modified) mlir/lib/IR/PatternMatch.cpp (+3-1) 
- (modified) mlir/lib/IR/SymbolTable.cpp (+59-25) 
- (modified) mlir/lib/Interfaces/FunctionImplementation.cpp (+12-6) 
- (modified) mlir/lib/Interfaces/Utils/MemorySlotUtils.cpp (+2-1) 
- (modified) mlir/lib/Pass/IRPrinting.cpp (+4-7) 
- (modified) mlir/lib/Rewrite/ByteCode.cpp (+8-2) 
- (modified) mlir/lib/Target/Cpp/TranslateToCpp.cpp (+4-2) 
- (modified) mlir/lib/Target/LLVM/XeVM/Target.cpp (+2-1) 
- (modified) mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.cpp (+1-1) 
- (modified) mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp (+1-1) 
- (modified) mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp (+2-3) 
- (modified) mlir/lib/Target/LLVMIR/Dialect/ROCDL/ROCDLToLLVMIRTranslation.cpp (+4-4) 
- (modified) mlir/lib/Target/LLVMIR/ModuleImport.cpp (+15-12) 
- (modified) mlir/lib/Target/LLVMIR/ModuleTranslation.cpp (+7-5) 
- (modified) mlir/lib/Target/LLVMIR/Transforms/TargetToDataLayout.cpp (+5-4) 
- (modified) mlir/lib/Target/LLVMIR/Transforms/TargetToTargetFeatures.cpp (+3-2) 
- (modified) mlir/lib/Target/SPIRV/Deserialization/Deserializer.cpp (+18-15) 
- (modified) mlir/lib/Target/SPIRV/Serialization/SerializeOps.cpp (+18-26) 
- (modified) mlir/lib/Target/SPIRV/Serialization/Serializer.cpp (+4-11) 
- (modified) mlir/lib/Target/Wasm/TranslateFromWasm.cpp (+5-1) 
- (modified) mlir/lib/Transforms/Utils/DialectConversion.cpp (+10-7) 
- (modified) mlir/lib/Transforms/ViewOpGraph.cpp (+7-3) 
- (modified) mlir/python/mlir/dialects/gpu/__init__.py (+3-7) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestDeadCodeAnalysis.cpp (+1-1) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestDenseBackwardDataFlowAnalysis.cpp (+7-6) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestDenseDataFlowAnalysis.h (+1-1) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestDenseForwardDataFlowAnalysis.cpp (+3-2) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestIntegerDivisibilityAnalysis.cpp (+3-2) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestLivenessAnalysis.cpp (+1-1) 
- (modified) mlir/test/lib/Analysis/DataFlow/TestSparseBackwardDataFlowAnalysis.cpp (+3-3) 
- (modified) mlir/test/lib/Analysis/TestAliasAnalysis.cpp (+3-2) 
- (modified) mlir/test/lib/Analysis/TestDataFlowFramework.cpp (+8-7) 
- (modified) mlir/test/lib/Analysis/TestSlice.cpp (+2-2) 
- (modified) mlir/test/lib/Analysis/TestTopologicalSort.cpp (+4-4) 
- (modified) mlir/test/lib/Dialect/Bufferization/TestTensorLikeAndBufferLike.cpp (+1-1) 
- (modified) mlir/test/lib/Dialect/DLTI/TestDataLayoutQuery.cpp (+1-1) 
- (modified) mlir/test/lib/Dialect/LLVM/TestPatterns.cpp (+3-2) 
- (modified) mlir/test/lib/Dialect/OpenACC/TestOpenACCSupport.cpp (+4-3) 
- (modified) mlir/test/lib/Dialect/OpenACC/TestPointerLikeTypeInterface.cpp (+10-8) 
- (modified) mlir/test/lib/Dialect/OpenACC/TestRecipePopulate.cpp (+1-1) 
- (modified) mlir/test/lib/Dialect/SCF/TestLoopUnrolling.cpp (+1-1) 
- (modified) mlir/test/lib/Dialect/SCF/TestParallelLoopUnrolling.cpp (+1-1) 
- (modified) mlir/test/lib/Dialect/SCF/TestSCFUtils.cpp (+14-11) 
- (modified) mlir/test/lib/Dialect/SPIRV/TestAvailability.cpp (+3-2) 
- (modified) mlir/test/lib/Dialect/SPIRV/TestEntryPointAbi.cpp (+7-7) 
- (modified) mlir/test/lib/Dialect/Shape/TestShapeFunctions.cpp (+1-1) 
- (modified) mlir/test/lib/Dialect/Tensor/TestTensorTransforms.cpp (+3-3) 
- (modified) mlir/test/lib/Dialect/Test/TestDialect.cpp (+4-2) 
- (modified) mlir/test/lib/Dialect/Test/TestDialectInterfaces.cpp (+3-2) 
- (modified) mlir/test/lib/Dialect/Test/TestOpDefs.cpp (+21-8) 
- (modified) mlir/test/lib/Dialect/Test/TestOps.td (+14-9) 
- (modified) mlir/test/lib/Dialect/Test/TestOpsSyntax.cpp (+2-1) 
- (modified) mlir/test/lib/Dialect/Test/TestPatterns.cpp (+45-38) 
- (modified) mlir/test/lib/Dialect/Transform/TestTransformDialectExtension.cpp (+7-6) 
- (modified) mlir/test/lib/Dialect/XeGPU/TestXeGPUTransforms.cpp (+3-2) 
- (modified) mlir/test/lib/IR/TestAffineWalk.cpp (+1-1) 
- (modified) mlir/test/lib/IR/TestBuiltinAttributeInterfaces.cpp (+4-1) 
- (modified) mlir/test/lib/IR/TestBuiltinDistinctAttributes.cpp (+5-3) 
- (modified) mlir/test/lib/IR/TestDiagnostics.cpp (+2-1) 
- (modified) mlir/test/lib/IR/TestDiagnosticsMetadata.cpp (+2-1) 
- (modified) mlir/test/lib/IR/TestDominance.cpp (+3-2) 
- (modified) mlir/test/lib/IR/TestFunc.cpp (+8-5) 
- (modified) mlir/test/lib/IR/TestOperationEquals.cpp (+3-3) 
- (modified) mlir/test/lib/IR/TestPrintNesting.cpp (+4-3) 
- (modified) mlir/test/lib/IR/TestSymbolUses.cpp (+2-1) 
- (modified) mlir/test/lib/IR/TestVisitors.cpp (+4-4) 
- (modified) mlir/test/lib/IR/TestVisitorsGeneric.cpp (+11-9) 
- (modified) mlir/test/lib/Transforms/TestControlFlowSink.cpp (+2-2) 
- (modified) mlir/test/mlir-linalg-ods-gen/test-linalg-ods-yaml-gen.yaml (+1-1) 
- (modified) mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-yaml-gen.cpp (+5-3) 
- (modified) mlir/tools/mlir-tblgen/DialectGen.cpp (+5-5) 


``````````diff
diff --git a/mlir/examples/toy/Ch2/mlir/Dialect.cpp b/mlir/examples/toy/Ch2/mlir/Dialect.cpp
index 489f348c8be52..41c451e94d322 100644
--- a/mlir/examples/toy/Ch2/mlir/Dialect.cpp
+++ b/mlir/examples/toy/Ch2/mlir/Dialect.cpp
@@ -84,7 +84,7 @@ static mlir::ParseResult parseBinaryOp(mlir::OpAsmParser &parser,
 /// forms depending on if all of the types match.
 static void printBinaryOp(mlir::OpAsmPrinter &printer, mlir::Operation *op) {
   printer << " " << op->getOperands();
-  printer.printOptionalAttrDict(op->getAttrs());
+  printer.printOptionalAttrDict(op->getDiscardableAttrDictionary().getValue());
   printer << " : ";
 
   // If all of the types are the same, print the type directly.
@@ -135,7 +135,9 @@ mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser,
 /// strings, attributes, operands, types, etc.
 void ConstantOp::print(mlir::OpAsmPrinter &printer) {
   printer << " ";
-  printer.printOptionalAttrDict((*this)->getAttrs(), /*elidedAttrs=*/{"value"});
+  printer.printOptionalAttrDict(
+      (*this)->getDiscardableAttrDictionary().getValue(),
+      /*elidedAttrs=*/{"value"});
   printer << getValue();
 }
 
diff --git a/mlir/examples/toy/Ch3/mlir/Dialect.cpp b/mlir/examples/toy/Ch3/mlir/Dialect.cpp
index 708855f18cf45..bfd4480db5702 100644
--- a/mlir/examples/toy/Ch3/mlir/Dialect.cpp
+++ b/mlir/examples/toy/Ch3/mlir/Dialect.cpp
@@ -84,7 +84,7 @@ static mlir::ParseResult parseBinaryOp(mlir::OpAsmParser &parser,
 /// forms depending on if all of the types match.
 static void printBinaryOp(mlir::OpAsmPrinter &printer, mlir::Operation *op) {
   printer << " " << op->getOperands();
-  printer.printOptionalAttrDict(op->getAttrs());
+  printer.printOptionalAttrDict(op->getDiscardableAttrDictionary().getValue());
   printer << " : ";
 
   // If all of the types are the same, print the type directly.
@@ -135,7 +135,9 @@ mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser,
 /// strings, attributes, operands, types, etc.
 void ConstantOp::print(mlir::OpAsmPrinter &printer) {
   printer << " ";
-  printer.printOptionalAttrDict((*this)->getAttrs(), /*elidedAttrs=*/{"value"});
+  printer.printOptionalAttrDict(
+      (*this)->getDiscardableAttrDictionary().getValue(),
+      /*elidedAttrs=*/{"value"});
   printer << getValue();
 }
 
diff --git a/mlir/examples/toy/Ch4/mlir/Dialect.cpp b/mlir/examples/toy/Ch4/mlir/Dialect.cpp
index 1e5e67296a753..298491ad3476e 100644
--- a/mlir/examples/toy/Ch4/mlir/Dialect.cpp
+++ b/mlir/examples/toy/Ch4/mlir/Dialect.cpp
@@ -146,7 +146,7 @@ static mlir::ParseResult parseBinaryOp(mlir::OpAsmParser &parser,
 /// forms depending on if all of the types match.
 static void printBinaryOp(mlir::OpAsmPrinter &printer, mlir::Operation *op) {
   printer << " " << op->getOperands();
-  printer.printOptionalAttrDict(op->getAttrs());
+  printer.printOptionalAttrDict(op->getDiscardableAttrDictionary().getValue());
   printer << " : ";
 
   // If all of the types are the same, print the type directly.
@@ -197,7 +197,9 @@ mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser,
 /// strings, attributes, operands, types, etc.
 void ConstantOp::print(mlir::OpAsmPrinter &printer) {
   printer << " ";
-  printer.printOptionalAttrDict((*this)->getAttrs(), /*elidedAttrs=*/{"value"});
+  printer.printOptionalAttrDict(
+      (*this)->getDiscardableAttrDictionary().getValue(),
+      /*elidedAttrs=*/{"value"});
   printer << getValue();
 }
 
@@ -328,13 +330,13 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
 /// Return the callee of the generic call operation, this is required by the
 /// call interface.
 CallInterfaceCallable GenericCallOp::getCallableForCallee() {
-  return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+  return getCalleeAttr();
 }
 
 /// Set the callee for the generic call operation, this is required by the call
 /// interface.
 void GenericCallOp::setCalleeFromCallable(CallInterfaceCallable callee) {
-  (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+  setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
 }
 
 /// Get the argument operands to the called function, this is required by the
diff --git a/mlir/examples/toy/Ch5/mlir/Dialect.cpp b/mlir/examples/toy/Ch5/mlir/Dialect.cpp
index 69fb69fd6e7ba..0f9c24eba0cc7 100644
--- a/mlir/examples/toy/Ch5/mlir/Dialect.cpp
+++ b/mlir/examples/toy/Ch5/mlir/Dialect.cpp
@@ -146,7 +146,7 @@ static mlir::ParseResult parseBinaryOp(mlir::OpAsmParser &parser,
 /// forms depending on if all of the types match.
 static void printBinaryOp(mlir::OpAsmPrinter &printer, mlir::Operation *op) {
   printer << " " << op->getOperands();
-  printer.printOptionalAttrDict(op->getAttrs());
+  printer.printOptionalAttrDict(op->getDiscardableAttrDictionary().getValue());
   printer << " : ";
 
   // If all of the types are the same, print the type directly.
@@ -197,7 +197,9 @@ mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser,
 /// strings, attributes, operands, types, etc.
 void ConstantOp::print(mlir::OpAsmPrinter &printer) {
   printer << " ";
-  printer.printOptionalAttrDict((*this)->getAttrs(), /*elidedAttrs=*/{"value"});
+  printer.printOptionalAttrDict(
+      (*this)->getDiscardableAttrDictionary().getValue(),
+      /*elidedAttrs=*/{"value"});
   printer << getValue();
 }
 
@@ -328,13 +330,13 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
 /// Return the callee of the generic call operation, this is required by the
 /// call interface.
 CallInterfaceCallable GenericCallOp::getCallableForCallee() {
-  return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+  return getCalleeAttr();
 }
 
 /// Set the callee for the generic call operation, this is required by the call
 /// interface.
 void GenericCallOp::setCalleeFromCallable(CallInterfaceCallable callee) {
-  (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+  setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
 }
 
 /// Get the argument operands to the called function, this is required by the
diff --git a/mlir/examples/toy/Ch6/mlir/Dialect.cpp b/mlir/examples/toy/Ch6/mlir/Dialect.cpp
index 69fb69fd6e7ba..0f9c24eba0cc7 100644
--- a/mlir/examples/toy/Ch6/mlir/Dialect.cpp
+++ b/mlir/examples/toy/Ch6/mlir/Dialect.cpp
@@ -146,7 +146,7 @@ static mlir::ParseResult parseBinaryOp(mlir::OpAsmParser &parser,
 /// forms depending on if all of the types match.
 static void printBinaryOp(mlir::OpAsmPrinter &printer, mlir::Operation *op) {
   printer << " " << op->getOperands();
-  printer.printOptionalAttrDict(op->getAttrs());
+  printer.printOptionalAttrDict(op->getDiscardableAttrDictionary().getValue());
   printer << " : ";
 
   // If all of the types are the same, print the type directly.
@@ -197,7 +197,9 @@ mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser,
 /// strings, attributes, operands, types, etc.
 void ConstantOp::print(mlir::OpAsmPrinter &printer) {
   printer << " ";
-  printer.printOptionalAttrDict((*this)->getAttrs(), /*elidedAttrs=*/{"value"});
+  printer.printOptionalAttrDict(
+      (*this)->getDiscardableAttrDictionary().getValue(),
+      /*elidedAttrs=*/{"value"});
   printer << getValue();
 }
 
@@ -328,13 +330,13 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
 /// Return the callee of the generic call operation, this is required by the
 /// call interface.
 CallInterfaceCallable GenericCallOp::getCallableForCallee() {
-  return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+  return getCalleeAttr();
 }
 
 /// Set the callee for the generic call operation, this is required by the call
 /// interface.
 void GenericCallOp::setCalleeFromCallable(CallInterfaceCallable callee) {
-  (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+  setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
 }
 
 /// Get the argument operands to the called function, this is required by the
diff --git a/mlir/examples/toy/Ch7/mlir/Dialect.cpp b/mlir/examples/toy/Ch7/mlir/Dialect.cpp
index 4d2f063afd0fb..db0364307af94 100644
--- a/mlir/examples/toy/Ch7/mlir/Dialect.cpp
+++ b/mlir/examples/toy/Ch7/mlir/Dialect.cpp
@@ -138,7 +138,7 @@ static mlir::ParseResult parseBinaryOp(mlir::OpAsmParser &parser,
 /// forms depending on if all of the types match.
 static void printBinaryOp(mlir::OpAsmPrinter &printer, mlir::Operation *op) {
   printer << " " << op->getOperands();
-  printer.printOptionalAttrDict(op->getAttrs());
+  printer.printOptionalAttrDict(op->getDiscardableAttrDictionary().getValue());
   printer << " : ";
 
   // If all of the types are the same, print the type directly.
@@ -189,7 +189,9 @@ mlir::ParseResult ConstantOp::parse(mlir::OpAsmParser &parser,
 /// strings, attributes, operands, types, etc.
 void ConstantOp::print(mlir::OpAsmPrinter &printer) {
   printer << " ";
-  printer.printOptionalAttrDict((*this)->getAttrs(), /*elidedAttrs=*/{"value"});
+  printer.printOptionalAttrDict(
+      (*this)->getDiscardableAttrDictionary().getValue(),
+      /*elidedAttrs=*/{"value"});
   printer << getValue();
 }
 
@@ -361,13 +363,13 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
 /// Return the callee of the generic call operation, this is required by the
 /// call interface.
 CallInterfaceCallable GenericCallOp::getCallableForCallee() {
-  return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+  return getCalleeAttr();
 }
 
 /// Set the callee for the generic call operation, this is required by the call
 /// interface.
 void GenericCallOp::setCalleeFromCallable(CallInterfaceCallable callee) {
-  (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+  setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
 }
 
 /// Get the argument operands to the called function, this is required by the
diff --git a/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h b/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
index feb74c86e349f..497ab3b7152da 100644
--- a/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
+++ b/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
@@ -18,6 +18,15 @@
 
 namespace mlir {
 namespace arith {
+
+template <typename SourceOp>
+static NamedAttrList getAttrsWithProperties(SourceOp srcOp) {
+  NamedAttrList attrs(srcOp->getDiscardableAttrDictionary());
+  if (auto properties =
+          dyn_cast_or_null<DictionaryAttr>(srcOp->getPropertiesAsAttribute()))
+    attrs.append(properties.getValue());
+  return attrs;
+}
 /// Maps arithmetic fastmath enum values to LLVM enum values.
 LLVM::FastmathFlags
 convertArithFastMathFlagsToLLVM(arith::FastMathFlags arithFMF);
@@ -53,7 +62,7 @@ class AttrConvertFastMathToLLVM {
 public:
   AttrConvertFastMathToLLVM(SourceOp srcOp) {
     // Copy the source attributes.
-    convertedAttr = NamedAttrList{srcOp->getAttrs()};
+    convertedAttr = getAttrsWithProperties(srcOp);
     // Get the name of the arith fastmath attribute.
     StringRef arithFMFAttrName = SourceOp::getFastMathAttrName();
     // Remove the source fastmath attribute.
@@ -82,7 +91,7 @@ class AttrConvertOverflowToLLVM {
     using IntegerOverflowFlagsAttr = LLVM::IntegerOverflowFlagsAttr;
 
     // Copy the source attributes.
-    convertedAttr = NamedAttrList{srcOp->getAttrs()};
+    convertedAttr = getAttrsWithProperties(srcOp);
     // Get the name of the arith overflow attribute.
     StringRef arithAttrName = SourceOp::getIntegerOverflowAttrName();
     // Remove the source overflow attribute from the set that will be present
@@ -118,7 +127,7 @@ template <typename SourceOp, typename TargetOp>
 class AttrConvertNonNegToLLVM {
 public:
   AttrConvertNonNegToLLVM(SourceOp srcOp) {
-    convertedAttr = NamedAttrList{srcOp->getAttrs()};
+    convertedAttr = getAttrsWithProperties(srcOp);
     if (!convertedAttr.erase("nonNeg"))
       return;
     MLIRContext *ctx = srcOp.getOperation()->getContext();
@@ -144,7 +153,7 @@ class AttrConverterConstrainedFPToLLVM {
 public:
   AttrConverterConstrainedFPToLLVM(SourceOp srcOp) {
     // Copy the source attributes.
-    convertedAttr = NamedAttrList{srcOp->getAttrs()};
+    convertedAttr = getAttrsWithProperties(srcOp);
 
     if constexpr (TargetOp::template hasTrait<
                       LLVM::RoundingModeOpInterface::Trait>()) {
diff --git a/mlir/include/mlir/Conversion/LLVMCommon/Pattern.h b/mlir/include/mlir/Conversion/LLVMCommon/Pattern.h
index 2f468458addd3..b50aeb1e274b3 100644
--- a/mlir/include/mlir/Conversion/LLVMCommon/Pattern.h
+++ b/mlir/include/mlir/Conversion/LLVMCommon/Pattern.h
@@ -338,8 +338,9 @@ class OneToOneConvertToLLVMPattern : public ConvertOpToLLVMPattern<SourceOp> {
   matchAndRewrite(SourceOp op, typename SourceOp::Adaptor adaptor,
                   ConversionPatternRewriter &rewriter) const override {
     return LLVM::detail::oneToOneRewrite(
-        op, TargetOp::getOperationName(), adaptor.getOperands(), op->getAttrs(),
-        /*propertiesAttr=*/Attribute{}, *this->getTypeConverter(), rewriter);
+        op, TargetOp::getOperationName(), adaptor.getOperands(),
+        op->getDiscardableAttrDictionary().getValue(),
+        op->getPropertiesAsAttribute(), *this->getTypeConverter(), rewriter);
   }
 };
 
diff --git a/mlir/include/mlir/Conversion/LLVMCommon/VectorPattern.h b/mlir/include/mlir/Conversion/LLVMCommon/VectorPattern.h
index 65988a2466318..fdc787d84383e 100644
--- a/mlir/include/mlir/Conversion/LLVMCommon/VectorPattern.h
+++ b/mlir/include/mlir/Conversion/LLVMCommon/VectorPattern.h
@@ -70,13 +70,16 @@ LogicalResult vectorOneToOneRewrite(Operation *op, StringRef targetOp,
 template <typename SourceOp, typename TargetOp>
 class AttrConvertPassThrough {
 public:
-  AttrConvertPassThrough(SourceOp srcOp) : srcAttrs(srcOp->getAttrs()) {}
+  AttrConvertPassThrough(SourceOp srcOp)
+      : srcAttrs(srcOp->getDiscardableAttrDictionary().getValue()),
+        propertiesAttr(srcOp->getPropertiesAsAttribute()) {}
 
   ArrayRef<NamedAttribute> getAttrs() const { return srcAttrs; }
-  Attribute getPropAttr() const { return {}; }
+  Attribute getPropAttr() const { return propertiesAttr; }
 
 private:
   ArrayRef<NamedAttribute> srcAttrs;
+  Attribute propertiesAttr;
 };
 
 /// Basic lowering implementation to rewrite Ops with just one result to the
diff --git a/mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEOps.td b/mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEOps.td
index 264c3969a1152..22ed496a9f48f 100644
--- a/mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEOps.td
+++ b/mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEOps.td
@@ -63,7 +63,7 @@ def ArmSMETileOpInterface : OpInterface<"ArmSMETileOpInterface"> {
         if (!tileId)
           return;
         ::mlir::Operation* op = this->getOperation();
-        op->setAttr("tile_id", tileId);
+        op->setDiscardableAttr("tile_id", tileId);
       }]
     >,
     InterfaceMethod<
@@ -77,7 +77,7 @@ def ArmSMETileOpInterface : OpInterface<"ArmSMETileOpInterface"> {
       /*methodBody=*/[{}],
       /*defaultImpl=*/ [{
         ::mlir::Operation* op = this->getOperation();
-        return op->getAttrOfType<mlir::IntegerAttr>("tile_id");
+        return op->getDiscardableAttrOfType<mlir::IntegerAttr>("tile_id");
       }]
     >,
     InterfaceMethod<
diff --git a/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td b/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
index 722370b8f3e29..0368bb55ca271 100644
--- a/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
+++ b/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
@@ -261,12 +261,12 @@ def Async_CallOp : Async_Op<"call",
 
     /// Return the callee of this operation.
     CallInterfaceCallable getCallableForCallee() {
-      return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+      return getCalleeAttr();
     }
 
     /// Set the callee for this operation.
     void setCalleeFromCallable(CallInterfaceCallable callee) {
-      (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+      setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
     }
   }];
 
diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
index 49412d1dfb01c..0e7ea45d6d091 100644
--- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
+++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td
@@ -794,12 +794,12 @@ def EmitC_CallOp : EmitC_Op<"call",
 
     /// Return the callee of this operation.
     CallInterfaceCallable getCallableForCallee() {
-      return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+      return getCalleeAttr();
     }
 
     /// Set the callee for this operation.
     void setCalleeFromCallable(CallInterfaceCallable callee) {
-      (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+      setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
     }
 
     bool hasSideEffects() {
diff --git a/mlir/include/mlir/Dialect/Func/IR/FuncOps.td b/mlir/include/mlir/Dialect/Func/IR/FuncOps.td
index a31b860276099..f86dac3a772f1 100644
--- a/mlir/include/mlir/Dialect/Func/IR/FuncOps.td
+++ b/mlir/include/mlir/Dialect/Func/IR/FuncOps.td
@@ -110,12 +110,12 @@ def CallOp : Func_Op<"call",
 
     /// Return the callee of this operation.
     CallInterfaceCallable getCallableForCallee() {
-      return (*this)->getAttrOfType<SymbolRefAttr>("callee");
+      return getCalleeAttr();
     }
 
     /// Set the callee for this operation.
     void setCalleeFromCallable(CallInterfaceCallable callee) {
-      (*this)->setAttr("callee", cast<SymbolRefAttr>(callee));
+      setCalleeAttr(cast<FlatSymbolRefAttr>(cast<SymbolRefAttr>(callee)));
     }
   }];
 
diff --git a/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td b/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td
index de145960692ad..7dbce7bed893a 100644
--- a/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td
+++ b/mlir/include/mlir/Dialect/GPU/IR/GPUOps.td
@@ -419,7 +419,9 @@ def GPU_GPUFuncOp : GPU_Op<"func", [
     attribution.
   }];
 
-  let arguments = (ins TypeAttrOf<FunctionType>:$function_type,
+  let arguments = (ins SymbolNameAttr:$sym_name,
+                       OptionalAttr<StrAttr>:$sym_visibility,
+                       TypeAttrOf<FunctionType>:$function_type,
                        OptionalAttr<DictArrayAttr>:$arg_attrs,
                        OptionalAttr<DictArrayAttr>:$res_attrs,
                        OptionalAttr<DictArrayAttr>:$workgroup_attrib_attrs,
@@ -447,7 +449,7 @@ def GPU_GPUFuncOp : GPU_Op<"func", [
     bool isKernel() {
       if (getKernel())
         return true;
-      return (*this)->getAttrOfType<UnitAttr>(
+      return (*this)->getDiscardableAttrOfType<UnitAttr>(
           GPUDialect::getKernelFuncAttrName()) != nullptr;
     }
 
diff --git a/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td b/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td
index 2834ae160595d..b631ec169f943 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td
@@ -157,11 +157,18 @@ def BasicPtxBuilderOpInterface : OpInterface<"BasicPtxBuilderInterface"> {
            for (auto val : op->getOperands()) 
             asmValues.push_back({val, mlir::NVVM::PTXRegisterMod::Read});
            
-           // Step 3. Add attributes
-           for (auto attr : op->getAttrs()) {
-            if (auto intAttr = dyn_cast<mlir::IntegerAttr>(attr.getValue())) {
-             ::mlir::Value val = makeConstantI32(rewriter, intAttr.getInt());
-             asmValues.push_back({val, mlir::NVVM::PTXRegisterMod::Read});
+           // Step 3. Add inherent attributes.
+           auto properties = llvm::dyn_cast_or_null<mlir::DictionaryAttr>(
+               op->getPropertiesAsAttribute());
+           if (properties) {
+             for (auto attr : properties) {
+               if (auto intAttr =
+                       dyn_cast<mlir::IntegerAttr>(attr.getValue())) {
+                 ::mlir::Value val =
+                     makeConstantI32(rewriter, intAttr.getInt());
+                 asmValues.push_back(
+                     {val, mlir::NVVM::PTXRegisterMod::Read});
+               }
              }
            }
            return false; // No manual mapping needed
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMInterfaces.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMInterfaces.td
index c59b38c416956..66a1fe0ce251a 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMInterfaces.td
+++ b/mlir/include/mlir/D...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/217233


More information about the Mlir-commits mailing list