diff options
author | Victor Perez <victor.perez@codeplay.com> | 2024-03-26 11:02:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-26 11:02:50 +0100 |
commit | 77cbc9bf601861ed92e36f7833422e31c22dd159 (patch) | |
tree | 605ed061b6c1ceac5b0c50fd6528a8f62090f257 /mlir/lib | |
parent | 256343a0e919bc09f65a8ee26751b561fa2dbfc1 (diff) | |
download | llvm-77cbc9bf601861ed92e36f7833422e31c22dd159.zip llvm-77cbc9bf601861ed92e36f7833422e31c22dd159.tar.gz llvm-77cbc9bf601861ed92e36f7833422e31c22dd159.tar.bz2 |
[MLIR][LLVM] Add `llvm.experimental.constrained.fptrunc` operation (#86260)
Add operation mapping to the LLVM
`llvm.experimental.constrained.fptrunc.*` intrinsic.
The new operation implements the new
`LLVM::FPExceptionBehaviorOpInterface` and
`LLVM::RoundingModeOpInterface` interfaces.
---------
Signed-off-by: Victor Perez <victor.perez@codeplay.com>
Diffstat (limited to 'mlir/lib')
-rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleImport.cpp | 21 | ||||
-rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 10 |
2 files changed, 31 insertions, 0 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index d63ea12..6e70d52 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1290,6 +1290,27 @@ DILabelAttr ModuleImport::matchLabelAttr(llvm::Value *value) { return debugImporter->translate(node); } +FPExceptionBehaviorAttr +ModuleImport::matchFPExceptionBehaviorAttr(llvm::Value *value) { + auto *metadata = cast<llvm::MetadataAsValue>(value); + auto *mdstr = cast<llvm::MDString>(metadata->getMetadata()); + std::optional<llvm::fp::ExceptionBehavior> optLLVM = + llvm::convertStrToExceptionBehavior(mdstr->getString()); + assert(optLLVM && "Expecting FP exception behavior"); + return builder.getAttr<FPExceptionBehaviorAttr>( + convertFPExceptionBehaviorFromLLVM(*optLLVM)); +} + +RoundingModeAttr ModuleImport::matchRoundingModeAttr(llvm::Value *value) { + auto *metadata = cast<llvm::MetadataAsValue>(value); + auto *mdstr = cast<llvm::MDString>(metadata->getMetadata()); + std::optional<llvm::RoundingMode> optLLVM = + llvm::convertStrToRoundingMode(mdstr->getString()); + assert(optLLVM && "Expecting rounding mode"); + return builder.getAttr<RoundingModeAttr>( + convertRoundingModeFromLLVM(*optLLVM)); +} + FailureOr<SmallVector<AliasScopeAttr>> ModuleImport::matchAliasScopeAttrs(llvm::Value *value) { auto *nodeAsVal = cast<llvm::MetadataAsValue>(value); diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index f90495d..669b95a 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -1721,6 +1721,16 @@ llvm::Metadata *ModuleTranslation::translateDebugInfo(LLVM::DINodeAttr attr) { return debugTranslation->translate(attr); } +llvm::RoundingMode +ModuleTranslation::translateRoundingMode(LLVM::RoundingMode rounding) { + return convertRoundingModeToLLVM(rounding); +} + +llvm::fp::ExceptionBehavior ModuleTranslation::translateFPExceptionBehavior( + LLVM::FPExceptionBehavior exceptionBehavior) { + return convertFPExceptionBehaviorToLLVM(exceptionBehavior); +} + llvm::NamedMDNode * ModuleTranslation::getOrInsertNamedModuleMetadata(StringRef name) { return llvmModule->getOrInsertNamedMetadata(name); |