aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib
diff options
context:
space:
mode:
authorVictor Perez <victor.perez@codeplay.com>2024-03-26 11:02:50 +0100
committerGitHub <noreply@github.com>2024-03-26 11:02:50 +0100
commit77cbc9bf601861ed92e36f7833422e31c22dd159 (patch)
tree605ed061b6c1ceac5b0c50fd6528a8f62090f257 /mlir/lib
parent256343a0e919bc09f65a8ee26751b561fa2dbfc1 (diff)
downloadllvm-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.cpp21
-rw-r--r--mlir/lib/Target/LLVMIR/ModuleTranslation.cpp10
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);