[Mlir-commits] [mlir] 6d81a14 - [MLIR][LLVM] Fold extract of extract (#125980)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Feb 5 23:05:38 PST 2025


Author: William Moses
Date: 2025-02-06T01:05:34-06:00
New Revision: 6d81a148737712bd525fe7acb6e2f9434fda380c

URL: https://github.com/llvm/llvm-project/commit/6d81a148737712bd525fe7acb6e2f9434fda380c
DIFF: https://github.com/llvm/llvm-project/commit/6d81a148737712bd525fe7acb6e2f9434fda380c.diff

LOG: [MLIR][LLVM] Fold extract of extract (#125980)

Co-authored-by: Ivan R. Ivanov <ivanov.i.aa at m.titech.ac.jp>

Added: 
    

Modified: 
    mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
    mlir/test/Dialect/LLVMIR/canonicalize.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 1d1d4a1daf13bd..2c93b6ed08cf8b 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, 4> 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 15f960167cb5f3..c509cd82227c29 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


        


More information about the Mlir-commits mailing list