[Mlir-commits] [mlir] f0d43a2 - [mlir][LLVMIR] Fold ExtractValueOp coming from InsertValueOp

Nicolas Vasilache llvmlistbot at llvm.org
Wed Jun 23 03:05:25 PDT 2021


Author: Nicolas Vasilache
Date: 2021-06-23T10:04:24Z
New Revision: f0d43a29e30da8f2758e17e1c242917288ab9a0b

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

LOG: [mlir][LLVMIR] Fold ExtractValueOp coming from InsertValueOp

Differential Revision: https://reviews.llvm.org/D104769

Added: 
    mlir/test/Dialect/LLVMIR/canonicalize.mlir

Modified: 
    mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
    mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index e1a32e6d6f153..f714126ce9209 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -534,6 +534,7 @@ def LLVM_ExtractValueOp : LLVM_Op<"extractvalue", [NoSideEffect]> {
   let builders = [LLVM_OneResultOpBuilder];
   let parser = [{ return parseExtractValueOp(parser, result); }];
   let printer = [{ printExtractValueOp(p, *this); }];
+  let hasFolder = 1;
 }
 def LLVM_InsertElementOp : LLVM_Op<"insertelement", [NoSideEffect]> {
   let arguments = (ins LLVM_AnyVector:$vector, LLVM_PrimitiveType:$value,

diff  --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
index 512a0ab898e2d..95f3460960649 100644
--- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
@@ -1050,6 +1050,16 @@ static ParseResult parseExtractValueOp(OpAsmParser &parser,
   return success();
 }
 
+OpFoldResult LLVM::ExtractValueOp::fold(ArrayRef<Attribute> operands) {
+  auto insertValueOp = container().getDefiningOp<InsertValueOp>();
+  while (insertValueOp) {
+    if (position() == insertValueOp.position())
+      return insertValueOp.value();
+    insertValueOp = insertValueOp.container().getDefiningOp<InsertValueOp>();
+  }
+  return {};
+}
+
 //===----------------------------------------------------------------------===//
 // Printing/parsing for LLVM::InsertElementOp.
 //===----------------------------------------------------------------------===//

diff  --git a/mlir/test/Dialect/LLVMIR/canonicalize.mlir b/mlir/test/Dialect/LLVMIR/canonicalize.mlir
new file mode 100644
index 0000000000000..a19587318eb22
--- /dev/null
+++ b/mlir/test/Dialect/LLVMIR/canonicalize.mlir
@@ -0,0 +1,23 @@
+// RUN: mlir-opt -canonicalize %s -split-input-file | FileCheck %s
+
+// CHECK-LABEL: fold_extractvalue
+llvm.func @fold_extractvalue() -> i32 {
+  //  CHECK-DAG: %[[C0:.*]] = constant 0 : i32
+  %c0 = constant 0 : i32
+  //  CHECK-DAG: %[[C1:.*]] = constant 1 : i32
+  %c1 = constant 1 : i32
+
+  %0 = llvm.mlir.undef : !llvm.struct<(i32, i32)>
+
+  // CHECK-NOT: insertvalue
+  %1 = llvm.insertvalue %c0, %0[0] : !llvm.struct<(i32, i32)>
+  %2 = llvm.insertvalue %c1, %1[1] : !llvm.struct<(i32, i32)>
+
+  // CHECK-NOT: extractvalue
+  %3 = llvm.extractvalue %2[0] : !llvm.struct<(i32, i32)>
+  %4 = llvm.extractvalue %2[1] : !llvm.struct<(i32, i32)>
+
+  //     CHECK: llvm.add %[[C0]], %[[C1]]
+  %5 = llvm.add %3, %4 : i32
+  llvm.return %5 : i32
+}


        


More information about the Mlir-commits mailing list