[Mlir-commits] [mlir] [MLIR][LLVM] Fold extract of constant (PR #127927)

William Moses llvmlistbot at llvm.org
Wed Feb 19 17:05:01 PST 2025


https://github.com/wsmoses created https://github.com/llvm/llvm-project/pull/127927

None

>From aa08e66b00ab95c33b3a0a6edbfd0be043aecd59 Mon Sep 17 00:00:00 2001
From: "William S. Moses" <gh at wsmoses.com>
Date: Wed, 19 Feb 2025 20:04:17 -0500
Subject: [PATCH] [MLIR][LLVM] Fold extract of constant

---
 mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 13 +++++++++++++
 mlir/test/Dialect/LLVMIR/canonicalize.mlir | 20 ++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index bfcba40555a7c..23fbe38467b6a 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1932,6 +1932,19 @@ OpFoldResult LLVM::ExtractValueOp::fold(FoldAdaptor adaptor) {
     getContainerMutable().set(extractValueOp.getContainer());
     return getResult();
   }
+
+  {
+    DenseElementsAttr constval;
+    matchPattern(getContainer().getOperand(), m_Constant(&constval));
+    if (constval && constval.getElementType() == getType()) {
+      if (constval.isSplat()) {
+        return constval.getSplatValue();
+      } else if (getPosition().size() == 1) {
+        return constval.getValues()[getPosition()[0]];
+      }
+    }
+  }
+
   auto insertValueOp = getContainer().getDefiningOp<InsertValueOp>();
   OpFoldResult result = {};
   while (insertValueOp) {
diff --git a/mlir/test/Dialect/LLVMIR/canonicalize.mlir b/mlir/test/Dialect/LLVMIR/canonicalize.mlir
index c509cd82227c2..055cb38c65337 100644
--- a/mlir/test/Dialect/LLVMIR/canonicalize.mlir
+++ b/mlir/test/Dialect/LLVMIR/canonicalize.mlir
@@ -94,6 +94,26 @@ llvm.func @fold_extract_extractvalue(%arr: !llvm.struct<(i64, array<1 x ptr<1>>)
   llvm.return %b : !llvm.ptr<1>
 }
 
+// -----
+// CHECK-LABEL: fold_extract_const
+// CHECK-NOT: extractvalue
+// CHECK: llvm.mlir.constant(-5.0)
+llvm.func @fold_extract_const() -> f64 {
+  %a = llvm.mlir.constant(dense<[-8.900000e+01, 5.000000e-01]> : tensor<2xf64>) : !llvm.array<2 x f64>
+  %b = llvm.extractvalue %a[1] : !llvm.array<2 x f64>
+  llvm.return %b : f64
+}
+
+// -----
+// CHECK-LABEL: fold_extract_splat
+// CHECK-NOT: extractvalue
+// CHECK: llvm.mlir.constant(-8.9)
+llvm.func @fold_extract_const() -> f64 {
+  %a = llvm.mlir.constant(dense<[-8.900000e+01> : tensor<2xf64>) : !llvm.array<2 x f64>
+  %b = llvm.extractvalue %a[1] : !llvm.array<2 x f64>
+  llvm.return %b : f64
+}
+
 // -----
 
 // CHECK-LABEL: fold_bitcast



More information about the Mlir-commits mailing list