[Mlir-commits] [mlir] [MLIR][LLVM] Fold extract of extract (PR #125980)
William Moses
llvmlistbot at llvm.org
Wed Feb 5 18:19:33 PST 2025
https://github.com/wsmoses updated https://github.com/llvm/llvm-project/pull/125980
>From e20b3fd079fc5e0aeec8d3bd9dd49eec1f99e419 Mon Sep 17 00:00:00 2001
From: "William S. Moses" <gh at wsmoses.com>
Date: Wed, 5 Feb 2025 20:07:27 -0600
Subject: [PATCH 1/2] [MLIR][LLVM] Fold extract of extract
---
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 7 +++++++
mlir/test/Dialect/LLVMIR/canonicalize.mlir | 10 ++++++++++
2 files changed, 17 insertions(+)
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index a6e996f3fb810db..6d51042efcebdfb 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1898,6 +1898,13 @@ static Type getInsertExtractValueElementType(Type llvmType,
}
OpFoldResult LLVM::ExtractValueOp::fold(FoldAdaptor adaptor) {
+ if (auto extractValueOp = getContainer().getDefiningOp<ExtractValueOp>()) {
+ SmallVector<int64_t, 1> newPos(extractValueOp.getPosition());
+ newPos.append(getPosition().begin(), getPosition().end());
+ setPosition(newPos);
+ getContainerMutable().set(extractValueOp.getContainer());
+ return getResult();
+ }
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 15f960167cb5f32..c509cd82227c295 100644
--- a/mlir/test/Dialect/LLVMIR/canonicalize.mlir
+++ b/mlir/test/Dialect/LLVMIR/canonicalize.mlir
@@ -84,6 +84,16 @@ llvm.func @fold_unrelated_extractvalue(%arr: !llvm.array<4 x f32>) -> f32 {
llvm.return %3 : f32
}
+// -----
+// CHECK-LABEL: fold_extract_extractvalue
+llvm.func @fold_extract_extractvalue(%arr: !llvm.struct<(i64, array<1 x ptr<1>>)>) -> !llvm.ptr<1> {
+ // CHECK: llvm.extractvalue %{{.*}}[1, 0]
+ // CHECK-NOT: extractvalue
+ %a = llvm.extractvalue %arr[1] : !llvm.struct<(i64, array<1 x ptr<1>>)>
+ %b = llvm.extractvalue %a[0] : !llvm.array<1 x ptr<1>>
+ llvm.return %b : !llvm.ptr<1>
+}
+
// -----
// CHECK-LABEL: fold_bitcast
>From dfa13d320fa3e316c88971980c6793a6a4618b08 Mon Sep 17 00:00:00 2001
From: William Moses <gh at wsmoses.com>
Date: Wed, 5 Feb 2025 20:19:25 -0600
Subject: [PATCH 2/2] Update mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
Co-authored-by: Ivan R. Ivanov <ivanov.i.aa at m.titech.ac.jp>
---
mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 6d51042efcebdfb..5da58ad9c3a18b7 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1899,7 +1899,7 @@ static Type getInsertExtractValueElementType(Type llvmType,
OpFoldResult LLVM::ExtractValueOp::fold(FoldAdaptor adaptor) {
if (auto extractValueOp = getContainer().getDefiningOp<ExtractValueOp>()) {
- SmallVector<int64_t, 1> newPos(extractValueOp.getPosition());
+ SmallVector<int64_t, 4> newPos(extractValueOp.getPosition());
newPos.append(getPosition().begin(), getPosition().end());
setPosition(newPos);
getContainerMutable().set(extractValueOp.getContainer());
More information about the Mlir-commits
mailing list